From d82a7362c718ac064782309a9b297f8c85779126 Mon Sep 17 00:00:00 2001 From: Karan Bedi Date: Fri, 2 Feb 2018 16:57:29 +0530 Subject: [PATCH 01/91] [NEW]: Add leave public channel permission --- packages/rocketchat-authorization/server/startup.js | 1 + packages/rocketchat-lib/server/methods/leaveRoom.js | 2 +- packages/rocketchat-ui-sidenav/client/sidebarItem.js | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/rocketchat-authorization/server/startup.js b/packages/rocketchat-authorization/server/startup.js index 10b8846b01e20..a7fc477eb1d11 100644 --- a/packages/rocketchat-authorization/server/startup.js +++ b/packages/rocketchat-authorization/server/startup.js @@ -34,6 +34,7 @@ Meteor.startup(function() { { _id: 'edit-room', roles : ['admin', 'owner', 'moderator'] }, { _id: 'force-delete-message', roles : ['admin', 'owner'] }, { _id: 'join-without-join-code', roles : ['admin', 'bot'] }, + { _id: 'leave-c', roles : ['admin', 'user', 'bot', 'anonymous'] }, { _id: 'manage-assets', roles : ['admin'] }, { _id: 'manage-emoji', roles : ['admin'] }, { _id: 'manage-integrations', roles : ['admin'] }, diff --git a/packages/rocketchat-lib/server/methods/leaveRoom.js b/packages/rocketchat-lib/server/methods/leaveRoom.js index 603e785acdbea..00e8b960a25b0 100644 --- a/packages/rocketchat-lib/server/methods/leaveRoom.js +++ b/packages/rocketchat-lib/server/methods/leaveRoom.js @@ -12,7 +12,7 @@ Meteor.methods({ const room = RocketChat.models.Rooms.findOneById(rid); const user = Meteor.user(); - if (room.t === 'd') { + if (room.t === 'd' || (room.t === 'c' && !RocketChat.authz.hasPermission(user._id, 'leave-c'))) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'leaveRoom' }); } diff --git a/packages/rocketchat-ui-sidenav/client/sidebarItem.js b/packages/rocketchat-ui-sidenav/client/sidebarItem.js index 8eb3b831cce80..c74b1e2c6823a 100644 --- a/packages/rocketchat-ui-sidenav/client/sidebarItem.js +++ b/packages/rocketchat-ui-sidenav/client/sidebarItem.js @@ -84,6 +84,8 @@ Template.sidebarItem.events({ if (!roomData) { return false; } + if (roomData.t === 'c' && !RocketChat.authz.hasAtLeastOnePermission('leave-c')) { return false; } + return !(((roomData.cl != null) && !roomData.cl) || (['d', 'l'].includes(roomData.t))); }; From adb6c3262168a08fc75e375353ebebb323aca4ef Mon Sep 17 00:00:00 2001 From: Karan Bedi Date: Sat, 3 Feb 2018 17:20:08 +0530 Subject: [PATCH 02/91] WIP - Migration for leave-c permission --- server/startup/migrations/v107.js | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 server/startup/migrations/v107.js diff --git a/server/startup/migrations/v107.js b/server/startup/migrations/v107.js new file mode 100644 index 0000000000000..dafd6c63af90d --- /dev/null +++ b/server/startup/migrations/v107.js @@ -0,0 +1,10 @@ +RocketChat.Migrations.add({ + version: 107, + up() { + const roles = RocketChat.models.Roles.find({ + _id: { $ne: 'guest' }, + scope: 'Users' + }).fetch().map((role)=>{ return role._id; }); + RocketChat.models.Permissions.createOrUpdate('leave-c', roles); + } +}); From 651a2b7dcf819795d8bc4af33df9eb4eac045d9d Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Tue, 6 Feb 2018 21:16:34 -0200 Subject: [PATCH 03/91] added enpoint and tests to get custom emoji list --- packages/rocketchat-api/package.js | 1 + .../rocketchat-api/server/v1/emoji-custom.js | 7 ++++++ tests/end-to-end/api/12-emoji-custom.js | 22 +++++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 packages/rocketchat-api/server/v1/emoji-custom.js create mode 100644 tests/end-to-end/api/12-emoji-custom.js diff --git a/packages/rocketchat-api/package.js b/packages/rocketchat-api/package.js index 859ca35ffdf04..e1578ade67175 100644 --- a/packages/rocketchat-api/package.js +++ b/packages/rocketchat-api/package.js @@ -36,6 +36,7 @@ Package.onUse(function(api) { api.addFiles('server/v1/subscriptions.js', 'server'); api.addFiles('server/v1/chat.js', 'server'); api.addFiles('server/v1/commands.js', 'server'); + api.addFiles('server/v1/emoji-custom.js', 'server'); api.addFiles('server/v1/groups.js', 'server'); api.addFiles('server/v1/im.js', 'server'); api.addFiles('server/v1/integrations.js', 'server'); diff --git a/packages/rocketchat-api/server/v1/emoji-custom.js b/packages/rocketchat-api/server/v1/emoji-custom.js new file mode 100644 index 0000000000000..f1ad75e9dd9d5 --- /dev/null +++ b/packages/rocketchat-api/server/v1/emoji-custom.js @@ -0,0 +1,7 @@ +RocketChat.API.v1.addRoute('emoji-custom', { authRequired: true }, { + get() { + const emojis = Meteor.call('listEmojiCustom'); + + return RocketChat.API.v1.success({ emojis }); + } +}); diff --git a/tests/end-to-end/api/12-emoji-custom.js b/tests/end-to-end/api/12-emoji-custom.js new file mode 100644 index 0000000000000..0e73f7688a8b6 --- /dev/null +++ b/tests/end-to-end/api/12-emoji-custom.js @@ -0,0 +1,22 @@ +/* eslint-env mocha */ +/* globals expect */ + +import {getCredentials, api, request, credentials } from '../../data/api-data.js'; + +describe('[EmojiCustom]', function() { + this.retries(0); + + before(done => getCredentials(done)); + + describe('GET', () => { + it('[/emoji-custom]', (done) => { + request.get(api('emoji-custom')) + .set(credentials) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('emojis').and.to.be.a('array'); + }) + .end(done); + }); + }); +}); From 43355331b1136d4ce23c765b41b30258bda4bca7 Mon Sep 17 00:00:00 2001 From: Karan Bedi Date: Fri, 9 Feb 2018 03:29:48 +0530 Subject: [PATCH 04/91] [NEW]: Add leave private chanwnel permission --- packages/rocketchat-authorization/server/startup.js | 1 + packages/rocketchat-lib/server/methods/leaveRoom.js | 2 +- packages/rocketchat-ui-sidenav/client/sidebarItem.js | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/rocketchat-authorization/server/startup.js b/packages/rocketchat-authorization/server/startup.js index a7fc477eb1d11..82bb3ab1a8eb6 100644 --- a/packages/rocketchat-authorization/server/startup.js +++ b/packages/rocketchat-authorization/server/startup.js @@ -35,6 +35,7 @@ Meteor.startup(function() { { _id: 'force-delete-message', roles : ['admin', 'owner'] }, { _id: 'join-without-join-code', roles : ['admin', 'bot'] }, { _id: 'leave-c', roles : ['admin', 'user', 'bot', 'anonymous'] }, + { _id: 'leave-p', roles : ['admin', 'user', 'bot', 'anonymous'] }, { _id: 'manage-assets', roles : ['admin'] }, { _id: 'manage-emoji', roles : ['admin'] }, { _id: 'manage-integrations', roles : ['admin'] }, diff --git a/packages/rocketchat-lib/server/methods/leaveRoom.js b/packages/rocketchat-lib/server/methods/leaveRoom.js index 00e8b960a25b0..dd13f2e67ba04 100644 --- a/packages/rocketchat-lib/server/methods/leaveRoom.js +++ b/packages/rocketchat-lib/server/methods/leaveRoom.js @@ -12,7 +12,7 @@ Meteor.methods({ const room = RocketChat.models.Rooms.findOneById(rid); const user = Meteor.user(); - if (room.t === 'd' || (room.t === 'c' && !RocketChat.authz.hasPermission(user._id, 'leave-c'))) { + if (room.t === 'd' || (room.t === 'c' && !RocketChat.authz.hasPermission(user._id, 'leave-c')) || (room.t === 'p' && !RocketChat.authz.hasPermission(user._id, 'leave-p'))) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'leaveRoom' }); } diff --git a/packages/rocketchat-ui-sidenav/client/sidebarItem.js b/packages/rocketchat-ui-sidenav/client/sidebarItem.js index c74b1e2c6823a..f127e60e3a855 100644 --- a/packages/rocketchat-ui-sidenav/client/sidebarItem.js +++ b/packages/rocketchat-ui-sidenav/client/sidebarItem.js @@ -85,6 +85,7 @@ Template.sidebarItem.events({ if (!roomData) { return false; } if (roomData.t === 'c' && !RocketChat.authz.hasAtLeastOnePermission('leave-c')) { return false; } + if (roomData.t === 'p' && !RocketChat.authz.hasAtLeastOnePermission('leave-p')) { return false; } return !(((roomData.cl != null) && !roomData.cl) || (['d', 'l'].includes(roomData.t))); }; From 15e12a07a9b8e66b0fba20086fb1e9ad6037701d Mon Sep 17 00:00:00 2001 From: Karan Bedi Date: Fri, 9 Feb 2018 03:31:00 +0530 Subject: [PATCH 05/91] Migration for leave-d permission --- server/startup/migrations/v107.js | 1 + 1 file changed, 1 insertion(+) diff --git a/server/startup/migrations/v107.js b/server/startup/migrations/v107.js index dafd6c63af90d..c3fabd5ca6c29 100644 --- a/server/startup/migrations/v107.js +++ b/server/startup/migrations/v107.js @@ -6,5 +6,6 @@ RocketChat.Migrations.add({ scope: 'Users' }).fetch().map((role)=>{ return role._id; }); RocketChat.models.Permissions.createOrUpdate('leave-c', roles); + RocketChat.models.Permissions.createOrUpdate('leave-d', roles); } }); From 197ada834a160dcb6114f885c1c0e064d368b029 Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Mon, 19 Feb 2018 10:42:15 -0300 Subject: [PATCH 06/91] integration oauth with facebook --- packages/rocketchat-lib/package.js | 1 + .../rocketchat-lib/server/oauth/facebook.js | 61 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 packages/rocketchat-lib/server/oauth/facebook.js diff --git a/packages/rocketchat-lib/package.js b/packages/rocketchat-lib/package.js index 606ec70fe7b95..3d284214bec42 100644 --- a/packages/rocketchat-lib/package.js +++ b/packages/rocketchat-lib/package.js @@ -129,6 +129,7 @@ Package.onUse(function(api) { api.addFiles('server/models/Users.js', 'server'); api.addFiles('server/oauth/oauth.js', 'server'); + api.addFiles('server/oauth/facebook.js', 'server'); api.addFiles('server/oauth/google.js', 'server'); api.addFiles('server/oauth/proxy.js', 'server'); diff --git a/packages/rocketchat-lib/server/oauth/facebook.js b/packages/rocketchat-lib/server/oauth/facebook.js new file mode 100644 index 0000000000000..8f3fa5e2beda4 --- /dev/null +++ b/packages/rocketchat-lib/server/oauth/facebook.js @@ -0,0 +1,61 @@ +import _ from 'underscore'; +const crypto = Npm.require('crypto'); +const whitelisted = [ + 'id', + 'email', + 'name', + 'first_name', + 'last_name', + 'link', + 'gender', + 'locale', + 'age_range']; + +const FB_API_VERSION = 'v2.9'; +const FB_URL = 'https://graph.facebook.com'; + +const getIdentity = function(accessToken, fields, secret) { + const hmac = crypto.createHmac('sha256', OAuth.openSecret(secret)); + hmac.update(accessToken); + + try { + return HTTP.get(`${FB_URL}/${FB_API_VERSION}/me`, { + params: { + access_token: accessToken, + appsecret_proof: hmac.digest('hex'), + fields: fields.join(',') + } + }).data; + } catch (err) { + throw _.extend(new Error('Failed to fetch identity from Facebook. ' + err.message), + { response: err.response }); + } +}; + +RocketChat.registerAccessTokenService('facebook', function(options) { + check(options, Match.ObjectIncluding({ + accessToken: String, + secret: String, + expiresIn: Match.Integer + })); + + const identity = options.identity || getIdentity(options.accessToken, whitelisted, options.secret); + + const serviceData = { + accessToken: options.accessToken, + expiresAt: (+new Date) + (1000 * parseInt(options.expiresIn, 10)) + }; + + const fields = _.pick(identity, whitelisted); + _.extend(serviceData, fields); + + return { + serviceData, + options: { + profile: { + name: identity.name + } + } + }; +}); + From 4bdeade4fdd9f2a3b195ed74b736e700ff7924f5 Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Wed, 21 Feb 2018 12:27:31 -0300 Subject: [PATCH 07/91] fix lint problems on facebook oauth integration --- packages/rocketchat-lib/server/oauth/facebook.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/rocketchat-lib/server/oauth/facebook.js b/packages/rocketchat-lib/server/oauth/facebook.js index 8f3fa5e2beda4..3e97982bea209 100644 --- a/packages/rocketchat-lib/server/oauth/facebook.js +++ b/packages/rocketchat-lib/server/oauth/facebook.js @@ -1,4 +1,5 @@ import _ from 'underscore'; +import { OAuth } from 'meteor/oauth'; const crypto = Npm.require('crypto'); const whitelisted = [ 'id', @@ -19,7 +20,7 @@ const getIdentity = function(accessToken, fields, secret) { hmac.update(accessToken); try { - return HTTP.get(`${FB_URL}/${FB_API_VERSION}/me`, { + return HTTP.get(`${ FB_URL }/${ FB_API_VERSION }/me`, { params: { access_token: accessToken, appsecret_proof: hmac.digest('hex'), @@ -27,8 +28,8 @@ const getIdentity = function(accessToken, fields, secret) { } }).data; } catch (err) { - throw _.extend(new Error('Failed to fetch identity from Facebook. ' + err.message), - { response: err.response }); + throw _.extend(new Error(`Failed to fetch identity from Facebook. ${ err.message }`), + {response: err.response}); } }; From a9da4524e8f595c67545972b96cc8a530a6cc1b5 Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Wed, 21 Feb 2018 12:35:11 -0300 Subject: [PATCH 08/91] added oauth twitter integration by rest --- package-lock.json | 10 ++++ package.json | 1 + packages/rocketchat-lib/package.js | 1 + .../rocketchat-lib/server/oauth/twitter.js | 57 +++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 packages/rocketchat-lib/server/oauth/twitter.js diff --git a/package-lock.json b/package-lock.json index 94cd9bb52abda..c095a63dbca41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12550,6 +12550,16 @@ } } }, + "twit": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/twit/-/twit-2.2.9.tgz", + "integrity": "sha1-ZxBXT4FkHaoDeWobS457eNPXVnY=", + "requires": { + "bluebird": "3.5.1", + "mime": "1.6.0", + "request": "2.83.0" + } + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", diff --git a/package.json b/package.json index c3ff7a73ad323..f52cef8dbf98d 100644 --- a/package.json +++ b/package.json @@ -166,6 +166,7 @@ "tar-stream": "^1.5.5", "toastr": "^2.1.4", "twilio": "^2.9.1", + "twit": "^2.2.9", "ua-parser-js": "^0.7.17", "underscore": "^1.8.3", "underscore.string": "^3.3.4", diff --git a/packages/rocketchat-lib/package.js b/packages/rocketchat-lib/package.js index 3d284214bec42..531107963676c 100644 --- a/packages/rocketchat-lib/package.js +++ b/packages/rocketchat-lib/package.js @@ -130,6 +130,7 @@ Package.onUse(function(api) { api.addFiles('server/oauth/oauth.js', 'server'); api.addFiles('server/oauth/facebook.js', 'server'); + api.addFiles('server/oauth/twitter.js', 'server'); api.addFiles('server/oauth/google.js', 'server'); api.addFiles('server/oauth/proxy.js', 'server'); diff --git a/packages/rocketchat-lib/server/oauth/twitter.js b/packages/rocketchat-lib/server/oauth/twitter.js new file mode 100644 index 0000000000000..ac0eeb4978de4 --- /dev/null +++ b/packages/rocketchat-lib/server/oauth/twitter.js @@ -0,0 +1,57 @@ +import Twit from 'twit'; +import _ from 'underscore'; + +const whitelistedFields = [ + 'id', + 'name', + 'description', + 'profile_image_url', + 'profile_image_url_https', + 'lang', + 'email' +]; + +const getIdentity = function(accessToken, appId, appSecret, accessTokenSecret) { + const Twitter = new Twit({ + consumer_key: appId, + consumer_secret: appSecret, + access_token: accessToken, + access_token_secret: accessTokenSecret + }); + const syncTwitter = Meteor.wrapAsync(Twitter.get, Twitter); + try { + return syncTwitter('account/verify_credentials.json?include_email=true'); + } catch (err) { + throw _.extend(new Error(`Failed to fetch identity from Twwiter. ${ err.message }`), + {response: err.response}); + } +}; + +RocketChat.registerAccessTokenService('twitter', function(options) { + check(options, Match.ObjectIncluding({ + accessToken: String, + appSecret: String, + appId: String, + accessTokenSecret: String, + expiresIn: Match.Integer + })); + + const identity = options.identity || getIdentity(options.accessToken, options.appId, options.appSecret, options.accessTokenSecret); + + const serviceData = { + accessToken: options.accessToken, + expiresAt: (+new Date) + (1000 * parseInt(options.expiresIn, 10)) + }; + + const fields = _.pick(identity, whitelistedFields); + _.extend(serviceData, fields); + + return { + serviceData, + options: { + profile: { + name: identity.name + } + } + }; +}); From ddbc8e42eceed2df0d622b16fbe868701cb5aebd Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Wed, 21 Feb 2018 15:39:08 -0300 Subject: [PATCH 09/91] added check identity to fb and twitter --- packages/rocketchat-lib/server/oauth/facebook.js | 3 ++- packages/rocketchat-lib/server/oauth/twitter.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/rocketchat-lib/server/oauth/facebook.js b/packages/rocketchat-lib/server/oauth/facebook.js index 3e97982bea209..20e47b9cfa3d3 100644 --- a/packages/rocketchat-lib/server/oauth/facebook.js +++ b/packages/rocketchat-lib/server/oauth/facebook.js @@ -37,7 +37,8 @@ RocketChat.registerAccessTokenService('facebook', function(options) { check(options, Match.ObjectIncluding({ accessToken: String, secret: String, - expiresIn: Match.Integer + expiresIn: Match.Integer, + identity: Match.Maybe(Object) })); const identity = options.identity || getIdentity(options.accessToken, whitelisted, options.secret); diff --git a/packages/rocketchat-lib/server/oauth/twitter.js b/packages/rocketchat-lib/server/oauth/twitter.js index ac0eeb4978de4..bb0def4839594 100644 --- a/packages/rocketchat-lib/server/oauth/twitter.js +++ b/packages/rocketchat-lib/server/oauth/twitter.js @@ -33,7 +33,8 @@ RocketChat.registerAccessTokenService('twitter', function(options) { appSecret: String, appId: String, accessTokenSecret: String, - expiresIn: Match.Integer + expiresIn: Match.Integer, + identity: Match.Maybe(Object) })); const identity = options.identity || getIdentity(options.accessToken, options.appId, options.appSecret, options.accessTokenSecret); From 16e96ed9d12e40f3a9644b90429a81d2c140647b Mon Sep 17 00:00:00 2001 From: Henrique Magarotto Date: Thu, 22 Feb 2018 15:07:23 -0300 Subject: [PATCH 10/91] Added api to enable external system sends visitor message --- .../imports/server/rest/messages.js | 71 +++++++++++++++++++ packages/rocketchat-livechat/server/api.js | 1 + 2 files changed, 72 insertions(+) create mode 100644 packages/rocketchat-livechat/imports/server/rest/messages.js diff --git a/packages/rocketchat-livechat/imports/server/rest/messages.js b/packages/rocketchat-livechat/imports/server/rest/messages.js new file mode 100644 index 0000000000000..2e45df5469d0e --- /dev/null +++ b/packages/rocketchat-livechat/imports/server/rest/messages.js @@ -0,0 +1,71 @@ +import LivechatVisitors from '../../../server/models/LivechatVisitors'; + +function checkAuthentication(request) { + const receivedToken = request.headers['x-rocketchat-livechat-token']; + const secretToken = RocketChat.settings.get('Livechat_secret_token'); + return receivedToken && receivedToken === secretToken; +} + +RocketChat.API.v1.addRoute('livechat/status/:visitorToken', { + get() { + if (!checkAuthentication(this.request)) { + return RocketChat.API.v1.unauthorized(); + } + + const info = Meteor.call('livechat:getInitialData', this.urlParams.visitorToken); + return RocketChat.API.v1.success(info); + } +}); + +RocketChat.API.v1.addRoute('livechat/messages', { + post() { + if (!checkAuthentication(this.request)) { + return RocketChat.API.v1.unauthorized(); + } + + if (!this.bodyParams.visitor) { + return RocketChat.API.v1.failure('Body param "visitor" is required'); + } + if (!this.bodyParams.visitor.token) { + return RocketChat.API.v1.failure('Body param "visitor.token" is required'); + } + const visitorToken = this.bodyParams.visitor.token; + + let visitor = LivechatVisitors.getVisitorByToken(visitorToken); + let rid; + if (visitor) { + const rooms = RocketChat.models.Rooms.findOpenByVisitorToken(visitorToken).fetch(); + if (rooms && rooms.length > 0) { + rid = rooms[0]._id; + } else { + rid = Random.id(); + } + } else { + rid = Random.id(); + const visitorId = RocketChat.Livechat.registerGuest(this.bodyParams.visitor); + visitor = LivechatVisitors.findOneById(visitorId); + } + + const sentMessages = this.bodyParams.messages.map((message) => { + const sendMessage = { + guest: visitor, + message: { + _id: Random.id(), + rid, + token: visitorToken, + msg: message.msg + } + }; + const sentMessage = RocketChat.Livechat.sendMessage(sendMessage); + return { + username: sentMessage.u.username, + msg: sentMessage.msg, + ts: sentMessage.ts + }; + }); + + return RocketChat.API.v1.success({ + messages: sentMessages + }); + } +}); diff --git a/packages/rocketchat-livechat/server/api.js b/packages/rocketchat-livechat/server/api.js index 2c2b9307a64c6..cd50c284dac7a 100644 --- a/packages/rocketchat-livechat/server/api.js +++ b/packages/rocketchat-livechat/server/api.js @@ -2,3 +2,4 @@ import '../imports/server/rest/departments.js'; import '../imports/server/rest/facebook.js'; import '../imports/server/rest/sms.js'; import '../imports/server/rest/users.js'; +import '../imports/server/rest/messages.js'; From 08d76cc8ade041dbbc0d8fad7bda26b3d77e29f2 Mon Sep 17 00:00:00 2001 From: joe-mcgee Date: Thu, 22 Feb 2018 23:53:07 -0700 Subject: [PATCH 11/91] fixed popovers no scroll if they overflow the window --- .../rocketchat-theme/client/imports/components/popover.css | 7 +++++++ packages/rocketchat-ui/client/views/app/popover.js | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/rocketchat-theme/client/imports/components/popover.css b/packages/rocketchat-theme/client/imports/components/popover.css index 3353ee43fb138..b789463543020 100644 --- a/packages/rocketchat-theme/client/imports/components/popover.css +++ b/packages/rocketchat-theme/client/imports/components/popover.css @@ -65,6 +65,13 @@ } } + &__content-scroll { + + .rc-popover__item { + display:block; + } + } + &__title { flex: 1; diff --git a/packages/rocketchat-ui/client/views/app/popover.js b/packages/rocketchat-ui/client/views/app/popover.js index f53f2452ca560..1a04ec3171cb7 100644 --- a/packages/rocketchat-ui/client/views/app/popover.js +++ b/packages/rocketchat-ui/client/views/app/popover.js @@ -84,6 +84,13 @@ Template.popover.onRendered(function() { }); } + const realTop = Number(popoverContent.style.top.replace('px', '')); + if (realTop + popoverContent.offsetHeight > window.innerHeight) { + popoverContent.style.overflow = 'scroll'; + popoverContent.style.bottom = 0; + popoverContent.className = 'rc-popover__content rc-popover__content-scroll'; + } + if (activeElement) { $(activeElement).addClass('active'); } From 2b231cd9a6c7a8e14a6d28642c101c78a1d66369 Mon Sep 17 00:00:00 2001 From: Sumedh Nimkarde Date: Fri, 23 Feb 2018 19:19:13 +0530 Subject: [PATCH 12/91] feat: Show the user status in the userInfo tab --- packages/rocketchat-ui-flextab/client/tabs/userInfo.html | 4 ++++ packages/rocketchat-ui-flextab/client/tabs/userInfo.js | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/packages/rocketchat-ui-flextab/client/tabs/userInfo.html b/packages/rocketchat-ui-flextab/client/tabs/userInfo.html index 538d89b12a6eb..4a8691bc20904 100644 --- a/packages/rocketchat-ui-flextab/client/tabs/userInfo.html +++ b/packages/rocketchat-ui-flextab/client/tabs/userInfo.html @@ -25,6 +25,10 @@

{{_ "User_Info"}}

{{#if username}}{{/if}} + +
+
{{userStatus}}
+