diff --git a/bigbluebutton-html5/imports/api/users-persistent-data/server/publishers.js b/bigbluebutton-html5/imports/api/users-persistent-data/server/publishers.js index 3a05cb45059f6b5c102d2b7e963c78dab54f593b..b634afd05ce8e989d6a6652e5ac1dbab889db933 100644 --- a/bigbluebutton-html5/imports/api/users-persistent-data/server/publishers.js +++ b/bigbluebutton-html5/imports/api/users-persistent-data/server/publishers.js @@ -16,13 +16,7 @@ function usersPersistentData() { meetingId, }; - const options = { - fields: { - meetingId: false, - }, - }; - - return UsersPersistentData.find(selector, options); + return UsersPersistentData.find(selector); } function publishUsersPersistentData(...args) { diff --git a/bigbluebutton-html5/imports/ui/components/connection-status/modal/component.jsx b/bigbluebutton-html5/imports/ui/components/connection-status/modal/component.jsx index 55e519707f4ab85f0be55e7414895a02f57b1480..d28e14063ae7fb9aea7e341031641c667bc6780b 100644 --- a/bigbluebutton-html5/imports/ui/components/connection-status/modal/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/connection-status/modal/component.jsx @@ -30,6 +30,10 @@ const intlMessages = defineMessages({ id: 'app.connection-status.more', description: 'More about conectivity issues', }, + offline: { + id: 'app.connection-status.offline', + description: 'Offline user', + }, dataSaving: { id: 'app.settings.dataSavingTab.description', description: 'Description of data saving', @@ -107,6 +111,8 @@ class ConnectionStatusComponent extends PureComponent { const itemStyle = {}; itemStyle[styles.even] = (index + 1) % 2 === 0; + const textStyle = {}; + textStyle[styles.offline] = conn.offline; return ( <div key={index} @@ -126,8 +132,9 @@ class ConnectionStatusComponent extends PureComponent { </div> <div className={styles.name}> - <div className={styles.text}> + <div className={cx(styles.text, textStyle)}> {conn.name} + {conn.offline ? ` (${intl.formatMessage(intlMessages.offline)})` : null} </div> </div> <div className={styles.status}> @@ -213,7 +220,8 @@ class ConnectionStatusComponent extends PureComponent { </h2> </div> <div className={styles.description}> - {intl.formatMessage(intlMessages.description)}{' '} + {intl.formatMessage(intlMessages.description)} + {' '} {this.help && ( <a href={this.help} target="_blank" rel="noopener noreferrer"> diff --git a/bigbluebutton-html5/imports/ui/components/connection-status/modal/styles.scss b/bigbluebutton-html5/imports/ui/components/connection-status/modal/styles.scss index 57690552511d604fef0fe17a185538531687098e..5576948d150fe7c5b51e7f31f35fb35806aab4a5 100644 --- a/bigbluebutton-html5/imports/ui/components/connection-status/modal/styles.scss +++ b/bigbluebutton-html5/imports/ui/components/connection-status/modal/styles.scss @@ -109,6 +109,10 @@ overflow: hidden; text-overflow: ellipsis; } + + .offline { + font-style: italic; + } } .status { diff --git a/bigbluebutton-html5/imports/ui/components/connection-status/service.js b/bigbluebutton-html5/imports/ui/components/connection-status/service.js index 979d4042960a740ba526349be56d01fc6039d9d0..c5311b252c229582edab0b05ff547dcc41d9ef05 100644 --- a/bigbluebutton-html5/imports/ui/components/connection-status/service.js +++ b/bigbluebutton-html5/imports/ui/components/connection-status/service.js @@ -1,6 +1,7 @@ import { defineMessages } from 'react-intl'; import ConnectionStatus from '/imports/api/connection-status'; import Users from '/imports/api/users'; +import UsersPersistentData from '/imports/api/users-persistent-data'; import Auth from '/imports/ui/services/auth'; import Settings from '/imports/ui/services/settings'; import Logger from '/imports/startup/client/logger'; @@ -147,7 +148,8 @@ const getMyConnectionStatus = () => { meetingId: Auth.meetingID, userId: Auth.userID, }, - { fields: + { + fields: { level: 1, timestamp: 1, @@ -160,11 +162,12 @@ const getMyConnectionStatus = () => { meetingId: Auth.meetingID, userId: Auth.userID, }, - { fields: + { + fields: { avatar: 1, color: 1, - } + }, }, ); @@ -188,7 +191,7 @@ const getConnectionStatus = () => { const connectionStatus = ConnectionStatus.find( { meetingId: Auth.meetingID }, - ).fetch().map(status => { + ).fetch().map((status) => { const { userId, level, @@ -202,15 +205,17 @@ const getConnectionStatus = () => { }; }); - return Users.find( + return UsersPersistentData.find( { meetingId: Auth.meetingID }, - { fields: + { + fields: { userId: 1, name: 1, role: 1, avatar: 1, color: 1, + loggedOut: 1, }, }, ).fetch().reduce((result, user) => { @@ -220,6 +225,7 @@ const getConnectionStatus = () => { role, avatar, color, + loggedOut, } = user; const status = connectionStatus.find(status => status.userId === userId); @@ -228,6 +234,7 @@ const getConnectionStatus = () => { result.push({ name, avatar, + offline: loggedOut, you: Auth.userID === userId, moderator: role === ROLE_MODERATOR, color, @@ -256,7 +263,7 @@ const stopRoundTripTime = () => { if (roundTripTimeInterval) { clearInterval(roundTripTimeInterval); } -} +}; const isModerator = () => { const user = Users.findOne( @@ -264,7 +271,7 @@ const isModerator = () => { meetingId: Auth.meetingID, userId: Auth.userID, }, - { fields: { role: 1 }}, + { fields: { role: 1 } }, ); if (user && user.role === ROLE_MODERATOR) { @@ -301,9 +308,9 @@ const notification = (level, intl) => { const notified = getNotified(); if (notified) { return null; - } else { - Session.set('connectionStatusNotified', true); } + Session.set('connectionStatusNotified', true); + if (intl) notify(intl.formatMessage(intlMessages.notification), level, 'network'); }; diff --git a/bigbluebutton-html5/public/locales/en.json b/bigbluebutton-html5/public/locales/en.json index 7a6f44b3b2acd75fae30982da44149ac22b0730d..74ec39896b1eb3833084f2c89e633e3e0f9b6228 100755 --- a/bigbluebutton-html5/public/locales/en.json +++ b/bigbluebutton-html5/public/locales/en.json @@ -626,6 +626,7 @@ "app.connection-status.more": "more", "app.connection-status.label": "Connection status", "app.connection-status.notification": "Loss in your connection was detected", + "app.connection-status.offline": "offline", "app.recording.startTitle": "Start recording", "app.recording.stopTitle": "Pause recording", "app.recording.resumeTitle": "Resume recording",