Merge remote-tracking branch 'upstream/master' into nav-bar-performance-issue
This commit is contained in:
commit
3301589cb3
@ -219,7 +219,7 @@ check_file() {
|
||||
print_header() {
|
||||
if [ ! $HEADER ]; then
|
||||
echo
|
||||
echo "** Potential problems described below **"
|
||||
echo "# Potential problems described below"
|
||||
HEADER=1
|
||||
fi
|
||||
}
|
||||
@ -1910,10 +1910,10 @@ if [ -n "$HOST" ]; then
|
||||
yq w -i $HTML5_CONFIG public.note.url "$PROTOCOL://$HOST/pad"
|
||||
chown meteor:meteor $HTML5_CONFIG
|
||||
|
||||
if [ -f $KURENTO_CONFIG ]; then
|
||||
yq w -i $KURENTO_CONFIG kurento[0].url "ws://$HOST:8888/kurento"
|
||||
chown bigbluebutton:bigbluebutton $KURENTO_CONFIG
|
||||
fi
|
||||
#if [ -f $KURENTO_CONFIG ]; then
|
||||
# yq w -i $KURENTO_CONFIG kurento[0].url "ws://$HOST:8888/kurento"
|
||||
# chown bigbluebutton:bigbluebutton $KURENTO_CONFIG
|
||||
#fi
|
||||
fi
|
||||
|
||||
echo "Restarting the BigBlueButton $BIGBLUEBUTTON_RELEASE ..."
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
import { check } from 'meteor/check';
|
||||
import { UsersTyping } from '/imports/api/group-chat-msg';
|
||||
import RedisPubSub from '/imports/startup/server/redis';
|
||||
|
||||
export default function startUserTyping(credentials, chatId) {
|
||||
@ -15,13 +14,6 @@ export default function startUserTyping(credentials, chatId) {
|
||||
check(requesterUserId, String);
|
||||
check(chatId, String);
|
||||
|
||||
const userTyping = UsersTyping.findOne({
|
||||
meetingId,
|
||||
userId: requesterUserId,
|
||||
});
|
||||
|
||||
if (userTyping) return;
|
||||
|
||||
const payload = {
|
||||
chatId: chatId || PUBLIC_GROUP_CHAT_ID,
|
||||
};
|
||||
|
@ -14,6 +14,6 @@ export default function stopUserTyping(credentials) {
|
||||
});
|
||||
|
||||
if (userTyping) {
|
||||
stopTyping(meetingId, requesterUserId);
|
||||
stopTyping(meetingId, requesterUserId, true);
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,9 @@ import { check } from 'meteor/check';
|
||||
import Logger from '/imports/startup/server/logger';
|
||||
import Users from '/imports/api/users';
|
||||
import { UsersTyping } from '/imports/api/group-chat-msg';
|
||||
import stopTyping from './stopTyping';
|
||||
|
||||
const TYPING_TIMEOUT = 5000;
|
||||
|
||||
export default function startTyping(meetingId, userId, chatId) {
|
||||
check(meetingId, String);
|
||||
@ -19,12 +22,27 @@ export default function startTyping(meetingId, userId, chatId) {
|
||||
userId,
|
||||
name: user.name,
|
||||
isTypingTo: chatId,
|
||||
time: (new Date()),
|
||||
};
|
||||
|
||||
const typingUser = UsersTyping.findOne(selector, {
|
||||
fields: {
|
||||
time: 1,
|
||||
},
|
||||
});
|
||||
|
||||
if (typingUser) {
|
||||
if (mod.time - typingUser.time <= TYPING_TIMEOUT - 100) return;
|
||||
}
|
||||
|
||||
const cb = (err) => {
|
||||
if (err) {
|
||||
return Logger.error(`Typing indicator update error: ${err}`);
|
||||
}
|
||||
|
||||
Meteor.setTimeout(() => {
|
||||
stopTyping(meetingId, userId);
|
||||
}, TYPING_TIMEOUT);
|
||||
return Logger.debug(`Typing indicator update for userId={${userId}} chatId={${chatId}}`);
|
||||
};
|
||||
|
||||
|
@ -2,15 +2,20 @@ import { check } from 'meteor/check';
|
||||
import Logger from '/imports/startup/server/logger';
|
||||
import { UsersTyping } from '/imports/api/group-chat-msg';
|
||||
|
||||
export default function stopTyping(meetingId, userId) {
|
||||
export default function stopTyping(meetingId, userId, sendMsgInitiated = false) {
|
||||
check(meetingId, String);
|
||||
check(userId, String);
|
||||
check(sendMsgInitiated, Boolean);
|
||||
|
||||
const selector = {
|
||||
meetingId,
|
||||
userId,
|
||||
};
|
||||
|
||||
const user = UsersTyping.findOne(selector);
|
||||
const stillTyping = !sendMsgInitiated && user && (new Date()) - user.time < 3000;
|
||||
if (stillTyping) return;
|
||||
|
||||
const cb = (err) => {
|
||||
if (err) {
|
||||
return Logger.error(`Stop user=${userId} typing indicator error: ${err}`);
|
||||
@ -18,5 +23,5 @@ export default function stopTyping(meetingId, userId) {
|
||||
return Logger.debug(`Stopped typing indicator for user=${userId}`);
|
||||
};
|
||||
|
||||
return UsersTyping.remove(selector, cb);
|
||||
UsersTyping.remove(selector, cb);
|
||||
}
|
||||
|
@ -204,7 +204,7 @@ class ChatAlert extends PureComponent {
|
||||
const reducedMessage = Service
|
||||
.reduceAndMapGroupMessages(pendingNotificationsByChat[chatId].slice(-5)).pop();
|
||||
|
||||
if (!reducedMessage) return null;
|
||||
if (!reducedMessage || !reducedMessage.sender) return null;
|
||||
|
||||
const content = this
|
||||
.createMessage(reducedMessage.sender.name, reducedMessage.content);
|
||||
|
@ -21,18 +21,6 @@ const intlMessages = defineMessages({
|
||||
id: 'app.chat.hideChatLabel',
|
||||
description: 'aria-label for hiding chat button',
|
||||
},
|
||||
singularTyping: {
|
||||
id: 'app.chat.singularTyping',
|
||||
description: 'used to indicate when 1 user is typing',
|
||||
},
|
||||
pluralTyping: {
|
||||
id: 'app.chat.pluralTyping',
|
||||
description: 'used to indicate when multiple user are typing',
|
||||
},
|
||||
severalPeople: {
|
||||
id: 'app.chat.severalPeople',
|
||||
description: 'displayed when 4 or more users are typing',
|
||||
},
|
||||
});
|
||||
const Chat = (props) => {
|
||||
const {
|
||||
@ -46,10 +34,6 @@ const Chat = (props) => {
|
||||
intl,
|
||||
shortcuts,
|
||||
isMeteorConnected,
|
||||
typingUsers,
|
||||
currentUserId,
|
||||
startUserTyping,
|
||||
stopUserTyping,
|
||||
lastReadMessageTime,
|
||||
hasUnreadMessages,
|
||||
scrollPosition,
|
||||
@ -61,47 +45,6 @@ const Chat = (props) => {
|
||||
const HIDE_CHAT_AK = shortcuts.hidePrivateChat;
|
||||
const CLOSE_CHAT_AK = shortcuts.closePrivateChat;
|
||||
|
||||
let names = [];
|
||||
|
||||
names = typingUsers.map((user) => {
|
||||
const currentChatPartner = chatID;
|
||||
const { userId: typingUserId, isTypingTo, name } = user;
|
||||
let userNameTyping = null;
|
||||
userNameTyping = currentUserId !== typingUserId ? name : userNameTyping;
|
||||
const isPrivateMsg = currentChatPartner !== isTypingTo;
|
||||
if (isPrivateMsg) {
|
||||
const isMsgParticipant = typingUserId === currentChatPartner && currentUserId === isTypingTo;
|
||||
userNameTyping = isMsgParticipant ? name : null;
|
||||
}
|
||||
return userNameTyping;
|
||||
}).filter(e => e);
|
||||
|
||||
const renderIsTypingString = () => {
|
||||
if (names) {
|
||||
const { length } = names;
|
||||
const noTypers = length < 1;
|
||||
const singleTyper = length === 1;
|
||||
const multipleTypersShown = length > 1 && length <= 3;
|
||||
if (noTypers) return null;
|
||||
|
||||
if (singleTyper) {
|
||||
if (names[0].length < 20) {
|
||||
return ` ${names[0]} ${intl.formatMessage(intlMessages.singularTyping)}`;
|
||||
}
|
||||
return (` ${names[0].slice(0, 20)}... ${intl.formatMessage(intlMessages.singularTyping)}`);
|
||||
}
|
||||
|
||||
if (multipleTypersShown) {
|
||||
const formattedNames = names.map((name) => {
|
||||
if (name.length < 15) return ` ${name}`;
|
||||
return ` ${name.slice(0, 15)}...`;
|
||||
});
|
||||
return (`${formattedNames} ${intl.formatMessage(intlMessages.pluralTyping)}`);
|
||||
}
|
||||
return (` ${intl.formatMessage(intlMessages.severalPeople)} ${intl.formatMessage(intlMessages.pluralTyping)}`);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div
|
||||
data-test="publicChat"
|
||||
@ -165,9 +108,6 @@ const Chat = (props) => {
|
||||
chatName,
|
||||
minMessageLength,
|
||||
maxMessageLength,
|
||||
renderIsTypingString,
|
||||
startUserTyping,
|
||||
stopUserTyping,
|
||||
}}
|
||||
chatId={chatID}
|
||||
chatTitle={title}
|
||||
|
@ -3,9 +3,6 @@ import { defineMessages, injectIntl } from 'react-intl';
|
||||
import { withTracker } from 'meteor/react-meteor-data';
|
||||
import { Session } from 'meteor/session';
|
||||
import Auth from '/imports/ui/services/auth';
|
||||
import Users from '/imports/api/users';
|
||||
import { UsersTyping } from '/imports/api/group-chat-msg';
|
||||
import { makeCall } from '/imports/ui/services/api';
|
||||
import Chat from './component';
|
||||
import ChatService from './service';
|
||||
|
||||
@ -41,9 +38,10 @@ class ChatContainer extends PureComponent {
|
||||
}
|
||||
|
||||
render() {
|
||||
const { children } = this.props;
|
||||
return (
|
||||
<Chat {...this.props}>
|
||||
{this.props.children}
|
||||
{children}
|
||||
</Chat>
|
||||
);
|
||||
}
|
||||
@ -112,7 +110,7 @@ export default injectIntl(withTracker(({ intl }) => {
|
||||
chatName = receiverUser.name;
|
||||
systemMessageIntl = { 0: receiverUser.name };
|
||||
title = intl.formatMessage(intlMessages.titlePrivate, systemMessageIntl);
|
||||
partnerIsLoggedOut = !receiverUser.connectionStatus === CONNECTION_STATUS;
|
||||
partnerIsLoggedOut = receiverUser.connectionStatus !== CONNECTION_STATUS;
|
||||
|
||||
if (partnerIsLoggedOut) {
|
||||
const time = Date.now();
|
||||
@ -148,28 +146,7 @@ export default injectIntl(withTracker(({ intl }) => {
|
||||
|
||||
const { connected: isMeteorConnected } = Meteor.status();
|
||||
|
||||
const typingUsers = UsersTyping.find({
|
||||
meetingId: Auth.meetingID,
|
||||
$or: [
|
||||
{ isTypingTo: PUBLIC_CHAT_KEY },
|
||||
{ isTypingTo: Auth.userID },
|
||||
],
|
||||
}).fetch();
|
||||
|
||||
const currentUser = Users.findOne({
|
||||
meetingId: Auth.meetingID,
|
||||
userId: Auth.userID,
|
||||
}, {
|
||||
fields: {
|
||||
userId: 1,
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
startUserTyping: chatId => makeCall('startUserTyping', chatId),
|
||||
stopUserTyping: () => makeCall('stopUserTyping'),
|
||||
currentUserId: currentUser ? currentUser.userId : null,
|
||||
typingUsers,
|
||||
chatID,
|
||||
chatName,
|
||||
title,
|
||||
|
@ -4,6 +4,7 @@ import cx from 'classnames';
|
||||
import TextareaAutosize from 'react-autosize-textarea';
|
||||
import browser from 'browser-detect';
|
||||
import PropTypes from 'prop-types';
|
||||
import TypingIndicatorContainer from './typing-indicator/container';
|
||||
import { styles } from './styles.scss';
|
||||
import Button from '../../button/component';
|
||||
|
||||
@ -22,7 +23,6 @@ const propTypes = {
|
||||
connected: PropTypes.bool.isRequired,
|
||||
locked: PropTypes.bool.isRequired,
|
||||
partnerIsLoggedOut: PropTypes.bool.isRequired,
|
||||
renderIsTypingString: PropTypes.func.isRequired,
|
||||
stopUserTyping: PropTypes.func.isRequired,
|
||||
startUserTyping: PropTypes.func.isRequired,
|
||||
};
|
||||
@ -56,10 +56,21 @@ const messages = defineMessages({
|
||||
errorChatLocked: {
|
||||
id: 'app.chat.locked',
|
||||
},
|
||||
singularTyping: {
|
||||
id: 'app.chat.singularTyping',
|
||||
description: 'used to indicate when 1 user is typing',
|
||||
},
|
||||
pluralTyping: {
|
||||
id: 'app.chat.pluralTyping',
|
||||
description: 'used to indicate when multiple user are typing',
|
||||
},
|
||||
severalPeople: {
|
||||
id: 'app.chat.severalPeople',
|
||||
description: 'displayed when 4 or more users are typing',
|
||||
},
|
||||
});
|
||||
|
||||
const CHAT_ENABLED = Meteor.settings.public.chat.enabled;
|
||||
const IS_TYPING_INTERVAL = 2500;
|
||||
|
||||
class MessageForm extends PureComponent {
|
||||
constructor(props) {
|
||||
@ -203,15 +214,8 @@ class MessageForm extends PureComponent {
|
||||
}
|
||||
|
||||
const handleUserTyping = () => {
|
||||
if (error) return;
|
||||
startUserTyping(chatId);
|
||||
setTimeout(() => {
|
||||
const { message: messageState } = this.state;
|
||||
const userStoppedTyping = messageState === '' || message.length === messageState.length;
|
||||
if (userStoppedTyping) {
|
||||
const { stopUserTyping } = this.props;
|
||||
stopUserTyping();
|
||||
}
|
||||
}, IS_TYPING_INTERVAL);
|
||||
};
|
||||
|
||||
this.setState({
|
||||
@ -274,7 +278,6 @@ class MessageForm extends PureComponent {
|
||||
disabled,
|
||||
className,
|
||||
chatAreaId,
|
||||
renderIsTypingString,
|
||||
} = this.props;
|
||||
|
||||
const { hasErrors, error, message } = this.state;
|
||||
@ -314,14 +317,10 @@ class MessageForm extends PureComponent {
|
||||
color="primary"
|
||||
icon="send"
|
||||
onClick={() => {}}
|
||||
data-test="sendMessageButton"
|
||||
/>
|
||||
</div>
|
||||
<div className={error ? styles.error : styles.info}>
|
||||
<span>
|
||||
<span>{error || renderIsTypingString()}</span>
|
||||
{!error && renderIsTypingString() ? <span className={styles.connectingAnimation} /> : null}
|
||||
</span>
|
||||
</div>
|
||||
<TypingIndicatorContainer {...{ error }} />
|
||||
</form>
|
||||
) : null;
|
||||
}
|
||||
|
@ -1,9 +1,11 @@
|
||||
import React, { PureComponent } from 'react';
|
||||
import { withTracker } from 'meteor/react-meteor-data';
|
||||
import { makeCall } from '/imports/ui/services/api';
|
||||
import ChatForm from './component';
|
||||
import ChatService from '../service';
|
||||
|
||||
const CHAT_CONFIG = Meteor.settings.public.chat;
|
||||
|
||||
class ChatContainer extends PureComponent {
|
||||
render() {
|
||||
return (
|
||||
@ -17,7 +19,14 @@ export default withTracker(() => {
|
||||
ChatService.updateScrollPosition(null);
|
||||
return ChatService.sendGroupMessage(message);
|
||||
};
|
||||
|
||||
const startUserTyping = chatId => makeCall('startUserTyping', chatId);
|
||||
|
||||
const stopUserTyping = () => makeCall('stopUserTyping');
|
||||
|
||||
return {
|
||||
startUserTyping,
|
||||
stopUserTyping,
|
||||
UnsentMessagesCollection: ChatService.UnsentMessagesCollection,
|
||||
minMessageLength: CHAT_CONFIG.min_message_length,
|
||||
maxMessageLength: CHAT_CONFIG.max_message_length,
|
||||
|
@ -0,0 +1,111 @@
|
||||
import React, { PureComponent } from 'react';
|
||||
import { defineMessages, injectIntl, intlShape } from 'react-intl';
|
||||
import browser from 'browser-detect';
|
||||
import PropTypes from 'prop-types';
|
||||
import { styles } from '../styles.scss';
|
||||
|
||||
const propTypes = {
|
||||
intl: intlShape.isRequired,
|
||||
currentChatPartner: PropTypes.string.isRequired,
|
||||
currentUserId: PropTypes.string.isRequired,
|
||||
typingUsers: PropTypes.arrayOf(Object).isRequired,
|
||||
};
|
||||
|
||||
const messages = defineMessages({
|
||||
singularTyping: {
|
||||
id: 'app.chat.singularTyping',
|
||||
description: 'used to indicate when 1 user is typing',
|
||||
},
|
||||
pluralTyping: {
|
||||
id: 'app.chat.pluralTyping',
|
||||
description: 'used to indicate when multiple user are typing',
|
||||
},
|
||||
severalPeople: {
|
||||
id: 'app.chat.severalPeople',
|
||||
description: 'displayed when 4 or more users are typing',
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
class TypingIndicator extends PureComponent {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
|
||||
this.BROWSER_RESULTS = browser();
|
||||
|
||||
this.renderIsTypingString = this.renderIsTypingString.bind(this);
|
||||
}
|
||||
|
||||
|
||||
renderIsTypingString() {
|
||||
const {
|
||||
intl, typingUsers, currentUserId, currentChatPartner, indicatorEnabled,
|
||||
} = this.props;
|
||||
|
||||
if (!indicatorEnabled) return null;
|
||||
|
||||
let names = [];
|
||||
|
||||
names = typingUsers.map((user) => {
|
||||
const { userId: typingUserId, isTypingTo, name } = user;
|
||||
let userNameTyping = null;
|
||||
userNameTyping = currentUserId !== typingUserId ? name : userNameTyping;
|
||||
const isPrivateMsg = currentChatPartner !== isTypingTo;
|
||||
if (isPrivateMsg) {
|
||||
const isMsgParticipant = typingUserId === currentChatPartner
|
||||
&& currentUserId === isTypingTo;
|
||||
|
||||
userNameTyping = isMsgParticipant ? name : null;
|
||||
}
|
||||
return userNameTyping;
|
||||
}).filter(e => e);
|
||||
|
||||
if (names) {
|
||||
const { length } = names;
|
||||
const noTypers = length < 1;
|
||||
const singleTyper = length === 1;
|
||||
const multipleTypersShown = length > 1 && length <= 3;
|
||||
if (noTypers) return null;
|
||||
|
||||
if (singleTyper) {
|
||||
if (names[0].length < 20) {
|
||||
return ` ${names[0]} ${intl.formatMessage(messages.singularTyping)}`;
|
||||
}
|
||||
return (` ${names[0].slice(0, 20)}... ${intl.formatMessage(messages.singularTyping)}`);
|
||||
}
|
||||
|
||||
if (multipleTypersShown) {
|
||||
const formattedNames = names.map((name) => {
|
||||
if (name.length < 15) return ` ${name}`;
|
||||
return ` ${name.slice(0, 15)}...`;
|
||||
});
|
||||
return (`${formattedNames} ${intl.formatMessage(messages.pluralTyping)}`);
|
||||
}
|
||||
return (` ${intl.formatMessage(messages.severalPeople)} ${intl.formatMessage(messages.pluralTyping)}`);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
render() {
|
||||
const {
|
||||
error,
|
||||
} = this.props;
|
||||
|
||||
return (
|
||||
<div className={error ? styles.error : styles.info}>
|
||||
<span>
|
||||
<span>{error || this.renderIsTypingString()}</span>
|
||||
{!error && this.renderIsTypingString()
|
||||
? <span className={styles.connectingAnimation} />
|
||||
: null
|
||||
}
|
||||
</span>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
TypingIndicator.propTypes = propTypes;
|
||||
|
||||
export default injectIntl(TypingIndicator);
|
@ -0,0 +1,53 @@
|
||||
import React, { PureComponent } from 'react';
|
||||
import { withTracker } from 'meteor/react-meteor-data';
|
||||
import Auth from '/imports/ui/services/auth';
|
||||
import { UsersTyping } from '/imports/api/group-chat-msg';
|
||||
import Users from '/imports/api/users';
|
||||
import TypingIndicator from './component';
|
||||
|
||||
const CHAT_CONFIG = Meteor.settings.public.chat;
|
||||
const PUBLIC_CHAT_KEY = CHAT_CONFIG.public_id;
|
||||
const TYPING_INDICATOR_ENABLED = CHAT_CONFIG.typingIndicator.enabled;
|
||||
|
||||
class TypingIndicatorContainer extends PureComponent {
|
||||
render() {
|
||||
return (
|
||||
<TypingIndicator {...this.props} />
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default withTracker(() => {
|
||||
const idChatOpen = Session.get('idChatOpen');
|
||||
|
||||
let selector = {
|
||||
meetingId: Auth.meetingID,
|
||||
isTypingTo: PUBLIC_CHAT_KEY,
|
||||
};
|
||||
|
||||
if (idChatOpen !== PUBLIC_CHAT_KEY) {
|
||||
selector = {
|
||||
meetingId: Auth.meetingID,
|
||||
isTypingTo: Auth.userID,
|
||||
userId: idChatOpen,
|
||||
};
|
||||
}
|
||||
|
||||
const typingUsers = UsersTyping.find(selector).fetch();
|
||||
|
||||
const currentUser = Users.findOne({
|
||||
meetingId: Auth.meetingID,
|
||||
userId: Auth.userID,
|
||||
}, {
|
||||
fields: {
|
||||
userId: 1,
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
currentUserId: currentUser ? currentUser.userId : null,
|
||||
typingUsers,
|
||||
currentChatPartner: idChatOpen,
|
||||
indicatorEnabled: TYPING_INDICATOR_ENABLED,
|
||||
};
|
||||
})(TypingIndicatorContainer);
|
@ -11,7 +11,7 @@ const lockContextContainer = component => withTracker(() => {
|
||||
const lockSetting = new LockStruct();
|
||||
const Meeting = Meetings.findOne({ meetingId: Auth.meetingID });
|
||||
const User = Users.findOne({ userId: Auth.userID });
|
||||
const userIsLocked = User.locked && User.role === ROLE_MODERATOR;
|
||||
const userIsLocked = User.locked && User.role !== ROLE_MODERATOR;
|
||||
const lockSettings = Meeting.lockSettingsProps;
|
||||
|
||||
lockSetting.isLocked = userIsLocked;
|
||||
|
@ -123,6 +123,29 @@ class RecordingIndicator extends PureComponent {
|
||||
document.activeElement.blur();
|
||||
};
|
||||
|
||||
const recordingIndicatorIcon = (
|
||||
<span className={styles.recordingIndicatorIcon}>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="100%" version="1" viewBox="0 0 20 20">
|
||||
<g stroke="#FFF" fill="#FFF" strokeLinecap="square">
|
||||
<circle
|
||||
fill="none"
|
||||
strokeWidth="1"
|
||||
r="9"
|
||||
cx="10"
|
||||
cy="10"
|
||||
/>
|
||||
<circle
|
||||
stroke={recording ? '#F00' : '#FFF'}
|
||||
fill={recording ? '#F00' : '#FFF'}
|
||||
r="4"
|
||||
cx="10"
|
||||
cy="10"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
</span>
|
||||
);
|
||||
|
||||
const showButton = amIModerator && allowStartStopRecording;
|
||||
|
||||
const recordMeetingButton = (
|
||||
@ -135,9 +158,7 @@ class RecordingIndicator extends PureComponent {
|
||||
onClick={recordingToggle}
|
||||
onKeyPress={recordingToggle}
|
||||
>
|
||||
<span
|
||||
className={recording ? styles.recordingIndicatorON : styles.recordingIndicatorOFF}
|
||||
/>
|
||||
{recordingIndicatorIcon}
|
||||
|
||||
<div className={styles.presentationTitle}>
|
||||
{recording
|
||||
|
@ -91,56 +91,10 @@
|
||||
display: flex;
|
||||
}
|
||||
|
||||
%recordingIndicator {
|
||||
border: var(--border-size-small) solid var(--color-white) !important;
|
||||
border-radius: 50%;
|
||||
span {
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
padding: 0 !important;
|
||||
.recordingIndicatorIcon {
|
||||
width: var(--font-size-large);
|
||||
height: var(--font-size-large);
|
||||
border-radius: 50%;
|
||||
&:after {
|
||||
content: '';
|
||||
width: calc(var(--font-size-large) / 2);
|
||||
height: calc(var(--font-size-large) / 2);
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
margin-top: calc((var(--font-size-large) / -4));
|
||||
margin-left: calc((var(--font-size-large) / -4));
|
||||
border-radius: 50%;
|
||||
}
|
||||
}
|
||||
|
||||
.recordingIndicatorON {
|
||||
@extend %recordingIndicator;
|
||||
&:after {
|
||||
border: var(--border-size) solid transparent;
|
||||
background-color: var(--color-danger);
|
||||
}
|
||||
}
|
||||
|
||||
.recordingIndicatorOFF {
|
||||
@extend %recordingIndicator;
|
||||
&:after {
|
||||
background-color: var(--color-white);
|
||||
}
|
||||
}
|
||||
|
||||
.isRecordingCircle {
|
||||
border: var(--border-size-small) solid var(--color-white) !important;
|
||||
border-radius: 50%;
|
||||
span {
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
font-size: var(--font-size-base);
|
||||
}
|
||||
|
||||
.recordingIndicator {
|
||||
|
@ -2,7 +2,6 @@ import React from 'react';
|
||||
import { withTracker } from 'meteor/react-meteor-data';
|
||||
import Users from '/imports/api/users/';
|
||||
import Auth from '/imports/ui/services/auth';
|
||||
import mapUser from '/imports/ui/services/user/mapUser';
|
||||
import {
|
||||
isVideoBroadcasting, presenterScreenshareHasEnded, unshareScreen,
|
||||
presenterScreenshareHasStarted,
|
||||
@ -19,9 +18,8 @@ const ScreenshareContainer = (props) => {
|
||||
|
||||
export default withTracker(() => {
|
||||
const user = Users.findOne({ userId: Auth.userID });
|
||||
const MappedUser = mapUser(user);
|
||||
return {
|
||||
isPresenter: MappedUser.isPresenter,
|
||||
isPresenter: user.presenter,
|
||||
unshareScreen,
|
||||
isVideoBroadcasting,
|
||||
presenterScreenshareHasStarted,
|
||||
|
@ -9,10 +9,12 @@ import AnnotationsTextService from '/imports/ui/components/whiteboard/annotation
|
||||
import AnnotationsLocal from '/imports/ui/components/whiteboard/service';
|
||||
import mapUser from '/imports/ui/services/user/mapUser';
|
||||
|
||||
|
||||
const CHAT_CONFIG = Meteor.settings.public.chat;
|
||||
const CHAT_ENABLED = CHAT_CONFIG.enabled;
|
||||
const PUBLIC_GROUP_CHAT_ID = CHAT_CONFIG.public_group_id;
|
||||
const PUBLIC_CHAT_TYPE = CHAT_CONFIG.type_public;
|
||||
const TYPING_INDICATOR_ENABLED = CHAT_CONFIG.typingIndicator.enabled;
|
||||
const SUBSCRIPTIONS = [
|
||||
'users', 'meetings', 'polls', 'presentations', 'slides', 'slide-positions', 'captions',
|
||||
'voiceUsers', 'whiteboard-multi-user', 'screenshare', 'group-chat',
|
||||
@ -54,7 +56,9 @@ export default withTracker(() => {
|
||||
};
|
||||
|
||||
let subscriptionsHandlers = SUBSCRIPTIONS.map((name) => {
|
||||
if (!CHAT_ENABLED && name.indexOf('chat') !== -1) return;
|
||||
if ((!TYPING_INDICATOR_ENABLED && name.indexOf('typing') !== -1)
|
||||
|| (!CHAT_ENABLED && name.indexOf('chat') !== -1)) return;
|
||||
|
||||
return Meteor.subscribe(
|
||||
name,
|
||||
credentials,
|
||||
|
@ -94,9 +94,11 @@ class UserParticipants extends Component {
|
||||
return !isPropsEqual || !isStateEqual;
|
||||
}
|
||||
|
||||
componentDidUpdate() {
|
||||
componentDidUpdate(prevProps, prevState) {
|
||||
const { selectedUser } = this.state;
|
||||
|
||||
if (selectedUser === prevState.selectedUser) return;
|
||||
|
||||
if (selectedUser) {
|
||||
const { firstChild } = selectedUser;
|
||||
if (firstChild) firstChild.focus();
|
||||
|
@ -154,7 +154,6 @@ class UserDropdown extends PureComponent {
|
||||
|
||||
componentDidUpdate() {
|
||||
const { dropdownVisible } = this.props;
|
||||
if (!dropdownVisible) document.activeElement.blur();
|
||||
this.checkDropdownDirection();
|
||||
}
|
||||
|
||||
|
@ -282,21 +282,23 @@ class WhiteboardToolbar extends Component {
|
||||
* 4. Trigger initial animation for the icons
|
||||
*/
|
||||
// 1st case
|
||||
if (colorSelected.value !== prevState.colorSelected.value) {
|
||||
// 1st case b)
|
||||
if (annotationSelected.value !== 'text') {
|
||||
if (this.thicknessListIconRadius && this.thicknessListIconColor) {
|
||||
if (colorSelected.value !== prevState.colorSelected.value) {
|
||||
// 1st case b)
|
||||
if (annotationSelected.value !== 'text') {
|
||||
this.thicknessListIconColor.beginElement();
|
||||
}
|
||||
// 1st case a)
|
||||
this.colorListIconColor.beginElement();
|
||||
// 2nd case
|
||||
} else if (thicknessSelected.value !== prevState.thicknessSelected.value) {
|
||||
this.thicknessListIconRadius.beginElement();
|
||||
// 3rd case
|
||||
} else if (annotationSelected.value !== 'text'
|
||||
&& prevState.annotationSelected.value === 'text') {
|
||||
this.thicknessListIconRadius.beginElement();
|
||||
this.thicknessListIconColor.beginElement();
|
||||
}
|
||||
// 1st case a)
|
||||
this.colorListIconColor.beginElement();
|
||||
// 2nd case
|
||||
} else if (thicknessSelected.value !== prevState.thicknessSelected.value) {
|
||||
this.thicknessListIconRadius.beginElement();
|
||||
// 3rd case
|
||||
} else if (annotationSelected.value !== 'text'
|
||||
&& prevState.annotationSelected.value === 'text') {
|
||||
this.thicknessListIconRadius.beginElement();
|
||||
this.thicknessListIconColor.beginElement();
|
||||
}
|
||||
// 4th case, initial animation is triggered in componentDidMount
|
||||
}
|
||||
|
@ -171,6 +171,8 @@ public:
|
||||
storage_key: UNREAD_CHATS
|
||||
system_messages_keys:
|
||||
chat_clear: PUBLIC_CHAT_CLEAR
|
||||
typingIndicator:
|
||||
enabled: true
|
||||
note:
|
||||
enabled: false
|
||||
url: ETHERPAD_HOST
|
||||
|
@ -3,6 +3,8 @@
|
||||
"app.chat.submitLabel": "Üzenet küldése",
|
||||
"app.chat.errorMinMessageLength": "Az üzenet {0} karakterrel túl rövid",
|
||||
"app.chat.errorMaxMessageLength": "Az üzenet {0} karakterrel túl hosszú",
|
||||
"app.chat.disconnected": "Nem küldhetsz üzenete, mert nem kapcsolódtál",
|
||||
"app.chat.locked": "Nem küldhetsz üzenete, mert a beszélgetés zárolt",
|
||||
"app.chat.inputLabel": "{0}: üzenet érkezett",
|
||||
"app.chat.inputPlaceholder": "Üzenet küldése {0} felhasználónak",
|
||||
"app.chat.titlePublic": "Nyilvános üzenetek",
|
||||
@ -19,6 +21,9 @@
|
||||
"app.chat.offline": "Offline",
|
||||
"app.chat.emptyLogLabel": "Az üzenetek naplója üres",
|
||||
"app.chat.clearPublicChatMessage": "A nyilvános beszélgetés előzményeit csak moderátor törölheti",
|
||||
"app.chat.severalPeople": "Számos ember",
|
||||
"app.chat.pluralTyping": "gépel jelenleg",
|
||||
"app.chat.singularTyping": "gépel jelenleg",
|
||||
"app.captions.label": "Feliratok",
|
||||
"app.captions.menu.close": "Bezárás",
|
||||
"app.captions.menu.start": "Indítás",
|
||||
@ -36,7 +41,11 @@
|
||||
"app.captions.menu.cancelLabel": "Mégsem",
|
||||
"app.captions.pad.hide": "Felirat elrejtése",
|
||||
"app.captions.pad.tip": "Nyomj Esc-et a szerkesztő eszköztárra fokuszálásához",
|
||||
"app.captions.pad.ownership": "Átvétel",
|
||||
"app.captions.pad.ownershipTooltip": "{0} feliratok tulajdonosa leszel",
|
||||
"app.captions.pad.interimResult": "Közbenső eredmények",
|
||||
"app.captions.pad.dictationStart": "Diktálás indítása",
|
||||
"app.captions.pad.dictationStop": "Diktálás befejezése",
|
||||
"app.captions.pad.dictationOnDesc": "Beszédfelismerés bekapcsolása",
|
||||
"app.captions.pad.dictationOffDesc": "Beszédfelismerés kikapcsolása",
|
||||
"app.note.title": "Megosztott jegyzetek",
|
||||
@ -89,6 +98,7 @@
|
||||
"app.userList.userOptions.disablePrivChat": "A privát üzenetek le van tiltva",
|
||||
"app.userList.userOptions.disablePubChat": "A nyilvános üzenetek le van tiltva",
|
||||
"app.userList.userOptions.disableNote": "A megosztott jegyzetek zárolva vannak",
|
||||
"app.userList.userOptions.hideUserList": "A résztvevők nem látják a felhasználók listáját",
|
||||
"app.userList.userOptions.webcamsOnlyForModerator": "Csak a moderátorok láthatják a résztvevők webkaméráját (zárolási beállítások miatt)",
|
||||
"app.userList.content.participants.options.clearedStatus": "Az összes felhasználó állapotát sikeresen törölted",
|
||||
"app.userList.userOptions.enableCam": " A résztvevők webkamerája engedélyezve van",
|
||||
@ -96,11 +106,15 @@
|
||||
"app.userList.userOptions.enablePrivChat": "A privát üzenetek engedélyezve van",
|
||||
"app.userList.userOptions.enablePubChat": "A nyilvános üzenetek engedélyezve van",
|
||||
"app.userList.userOptions.enableNote": "A megosztott jegyzet engedélyezve van",
|
||||
"app.userList.userOptions.showUserList": "A résztvevők látják a felhasználók listáját",
|
||||
"app.userList.userOptions.enableOnlyModeratorWebcam": "A webkamerád engedélyezve van, így a többiek láthatnak",
|
||||
"app.media.label": "Média",
|
||||
"app.media.autoplayAlertDesc": "Hozzáférés engedélyezése",
|
||||
"app.media.screenshare.start": "A képernyőmegosztás elindult",
|
||||
"app.media.screenshare.end": "A képernyőmegosztás befejeződött",
|
||||
"app.media.screenshare.safariNotSupported": "A képernyőmegosztás jelenleg nem működik Safari alatt. Javasoljuk Firefox, illetve Google Chrome használatát.",
|
||||
"app.media.screenshare.autoplayBlockedDesc": "Az előadó képernyőjének megjelenítéséhez az engedélyedre van szükségünk.",
|
||||
"app.media.screenshare.autoplayAllowLabel": "Megosztott képernyő megjelenítése",
|
||||
"app.meeting.ended": "Ez a munkamenet befejeződött",
|
||||
"app.meeting.meetingTimeRemaining": "Az előadásból hátralévő idő: {0}",
|
||||
"app.meeting.meetingTimeHasEnded": "Az idő lejárt. Az előadás hamarosan véget ér",
|
||||
@ -212,6 +226,7 @@
|
||||
"app.downloadPresentationButton.label": "Az eredeti prezentáció letöltése",
|
||||
"app.connectingMessage": "Kapcsolódás ...",
|
||||
"app.waitingMessage": "Szétkapcsolódtunk. {0} másodperc múlva próbálunk újra csatlakozni ...",
|
||||
"app.retryNow": "Most próbáld újra",
|
||||
"app.navBar.settingsDropdown.optionsLabel": "Beállítások",
|
||||
"app.navBar.settingsDropdown.fullscreenLabel": "Teljes képernyő",
|
||||
"app.navBar.settingsDropdown.settingsLabel": "Beállítások",
|
||||
@ -382,6 +397,11 @@
|
||||
"app.audioModal.audioDialTitle": "Csatlakozás telefon használatával",
|
||||
"app.audioDial.audioDialDescription": "Tárcsázás",
|
||||
"app.audioDial.audioDialConfrenceText": "és add meg a megbeszélés PIN számát: ",
|
||||
"app.audioModal.autoplayBlockedDesc": "Hang lejátszásához az engedélyedre van szükségünk.",
|
||||
"app.audioModal.playAudio": "Hang lejátszása",
|
||||
"app.audioModal.playAudio.arialabel" : "Hang lejátszása",
|
||||
"app.audioDial.tipIndicator": "Tipp",
|
||||
"app.audioDial.tipMessage": "Saját magad némításához/hangosításához nyomj '0'-t a telefonon.",
|
||||
"app.audioModal.connecting": "Kapcsolódás",
|
||||
"app.audioModal.connectingEchoTest": "Kapcsolódás a hangteszthez",
|
||||
"app.audioManager.joinedAudio": "Csatlakoztál a beszélgetéshez",
|
||||
@ -455,6 +475,7 @@
|
||||
"app.toast.meetingMuteOn.label": "Az összes felhasználót elnémítottad",
|
||||
"app.toast.meetingMuteOff.label": "A megbeszélés némaságát kikapcsoltad",
|
||||
"app.notification.recordingStart": "Ezt a munkamenetet rögzítjük",
|
||||
"app.notification.recordingStop": "Ezt a munkamenetet nem rögzítjük",
|
||||
"app.notification.recordingPaused": "Ezt a munkamenetet nem rögzítjük tovább",
|
||||
"app.notification.recordingAriaLabel": "Felvétel hossza",
|
||||
"app.shortcut-help.title": "Gyorsbillentyűk",
|
||||
@ -590,6 +611,8 @@
|
||||
"app.videoDock.webcamFocusDesc": "Fókusz a kiválasztott webkamerára",
|
||||
"app.videoDock.webcamUnfocusLabel": "Fókusz elvétele",
|
||||
"app.videoDock.webcamUnfocusDesc": "Fókusz elvétele a kiválasztott webkameráról",
|
||||
"app.videoDock.autoplayBlockedDesc": "Mások webkamerájának a megjelenítéséhez az engedélyedre van szükségünk.",
|
||||
"app.videoDock.autoplayAllowLabel": "Webkamerák megjelenítése",
|
||||
"app.invitation.title": "Meghívás csapatszobába",
|
||||
"app.invitation.confirm": "Meghívás",
|
||||
"app.createBreakoutRoom.title": "Csapatszobák",
|
||||
|
@ -3,7 +3,10 @@
|
||||
"app.chat.submitLabel": "Invia Messaggio",
|
||||
"app.chat.errorMinMessageLength": "Il messaggio di {0} carattere(i) è troppo breve",
|
||||
"app.chat.errorMaxMessageLength": "Il messaggio di {0} carattere(i) è troppo lungo",
|
||||
"app.chat.disconnected": "Sei disconnesso, la chat è disattivata.",
|
||||
"app.chat.locked": "La chat è disabilitata.",
|
||||
"app.chat.inputLabel": "Messaggio di input per la chat {0}",
|
||||
"app.chat.inputPlaceholder": "Invia un messaggio a {0}",
|
||||
"app.chat.titlePublic": "Chat pubblica",
|
||||
"app.chat.titlePrivate": "Chat privata con {0}",
|
||||
"app.chat.partnerDisconnected": "{0} ha lasciato il meeting",
|
||||
@ -18,11 +21,33 @@
|
||||
"app.chat.offline": "Disconnesso",
|
||||
"app.chat.emptyLogLabel": "Il registro chat è vuoto",
|
||||
"app.chat.clearPublicChatMessage": "Il registro della Chat pubblica è stato cancellato da un moderatore",
|
||||
"app.chat.severalPeople": "Alcune persone",
|
||||
"app.chat.pluralTyping": "stanno scrivendo",
|
||||
"app.chat.singularTyping": "sta scrivendo",
|
||||
"app.captions.label": "Sottotitoli",
|
||||
"app.captions.menu.close": "Chiudi",
|
||||
"app.captions.menu.start": "Avvia",
|
||||
"app.captions.menu.ariaStart": "Avvia la scrittura dei sottotitoli",
|
||||
"app.captions.menu.ariaStartDesc": "Apre la finestra di modifica dei sottotitoli e chiude la finestra di dialogo",
|
||||
"app.captions.menu.select": "Seleziona le lingue disponibili",
|
||||
"app.captions.menu.ariaSelect": "Lingua dei sottotitoli",
|
||||
"app.captions.menu.subtitle": "Seleziona una lingua e uno stile per i sottotitoli della sessione",
|
||||
"app.captions.menu.title": "Sottotitoli",
|
||||
"app.captions.menu.fontSize": "Dimensione",
|
||||
"app.captions.menu.fontColor": "Colore",
|
||||
"app.captions.menu.fontFamily": "Carattere",
|
||||
"app.captions.menu.backgroundColor": "Colore di sfondo",
|
||||
"app.captions.menu.previewLabel": "Anteprima",
|
||||
"app.captions.menu.cancelLabel": "Annulla",
|
||||
"app.captions.pad.hide": "Nascondi i sottotitoli",
|
||||
"app.captions.pad.tip": "Premi ESC per utilizzare la barra degli strumenti",
|
||||
"app.captions.pad.ownership": "Ottieni permessi",
|
||||
"app.captions.pad.ownershipTooltip": "Sarai assegnato come proprietario di {0} sottotitoli",
|
||||
"app.captions.pad.interimResult": "Risultati provvisori",
|
||||
"app.captions.pad.dictationStart": "Avvia dettatura",
|
||||
"app.captions.pad.dictationStop": "Interrompi dettatura",
|
||||
"app.captions.pad.dictationOnDesc": "Attiva riconoscimento vocale",
|
||||
"app.captions.pad.dictationOffDesc": "Disattiva riconoscimento vocale",
|
||||
"app.note.title": "Note condivise",
|
||||
"app.note.label": "Note",
|
||||
"app.note.hideNoteLabel": "Nascondi nota",
|
||||
@ -34,6 +59,8 @@
|
||||
"app.userList.participantsTitle": "Partecipanti",
|
||||
"app.userList.messagesTitle": "Messaggi",
|
||||
"app.userList.notesTitle": "Note",
|
||||
"app.userList.notesListItem.unreadContent": "I nuovi contenuti sono disponibili nelle note condivise",
|
||||
"app.userList.captionsTitle": "Sottotitoli",
|
||||
"app.userList.presenter": "Presentatore",
|
||||
"app.userList.you": "Tu",
|
||||
"app.userList.locked": "Bloccato",
|
||||
@ -43,6 +70,7 @@
|
||||
"app.userList.menuTitleContext": "Opzioni disponibili",
|
||||
"app.userList.chatListItem.unreadSingular": "{0} Nuovo Messaggio",
|
||||
"app.userList.chatListItem.unreadPlural": "{0} Nuovi Messaggi",
|
||||
"app.userList.menu.chat.label": "Avvia una chat privata",
|
||||
"app.userList.menu.clearStatus.label": "Cancella stato",
|
||||
"app.userList.menu.removeUser.label": "Rimuovi Utente",
|
||||
"app.userList.menu.muteUserAudio.label": "Silenzia utente",
|
||||
@ -70,11 +98,23 @@
|
||||
"app.userList.userOptions.disablePrivChat": "Le chat private sono disabilitate",
|
||||
"app.userList.userOptions.disablePubChat": "La chat pubblica è disabilitata",
|
||||
"app.userList.userOptions.disableNote": "Ora le note condivise sono bloccate",
|
||||
"app.userList.userOptions.hideUserList": "La lista utenti è ora nascosta agli utenti",
|
||||
"app.userList.userOptions.webcamsOnlyForModerator": "Solo i moderatori possono vedere il video degli spettatori (impostazioni)",
|
||||
"app.userList.content.participants.options.clearedStatus": "Ripristinati tutti gli stati",
|
||||
"app.userList.userOptions.enableCam": "La webcam degli utenti è ora abilitata",
|
||||
"app.userList.userOptions.enableMic": "Il microfono degli utenti è ora abilitato",
|
||||
"app.userList.userOptions.enablePrivChat": "Le chat private sono abilitate",
|
||||
"app.userList.userOptions.enablePubChat": "Le chat pubbliche sono abilitate",
|
||||
"app.userList.userOptions.enableNote": "Le note condivise sono abilitate",
|
||||
"app.userList.userOptions.showUserList": "La lista utenti è ora visibile agli utenti",
|
||||
"app.userList.userOptions.enableOnlyModeratorWebcam": "Puoi attivare la tua webcam adesso, tutti ti vedranno",
|
||||
"app.media.label": "Audio/Video",
|
||||
"app.media.autoplayAlertDesc": "Premetti l'accesso",
|
||||
"app.media.screenshare.start": "Condivisione schermo avviata",
|
||||
"app.media.screenshare.end": "Condivisione schermo terminata",
|
||||
"app.media.screenshare.safariNotSupported": "La condivisione schermo non è attualmente supportata da Safari. Per favore usa Firefox o Google Chrome.",
|
||||
"app.media.screenshare.autoplayBlockedDesc": "Abbiamo bisogno del tuo permesso per mostrarti lo schermo del presentatore",
|
||||
"app.media.screenshare.autoplayAllowLabel": "Visualizza schermo condiviso",
|
||||
"app.meeting.ended": "La sessione è terminata",
|
||||
"app.meeting.meetingTimeRemaining": "Tempo rimanente al termine del meeting: {0}",
|
||||
"app.meeting.meetingTimeHasEnded": "Tempo scaduto. Il meeting terminerà a breve",
|
||||
@ -87,6 +127,8 @@
|
||||
"app.presentation.startSlideContent": "Inizio contenuto slide",
|
||||
"app.presentation.endSlideContent": "Termine contenuto slide",
|
||||
"app.presentation.emptySlideContent": "Nessun contenuto per la slide corrente",
|
||||
"app.presentation.presentationToolbar.noNextSlideDesc": "Fine della presentazione",
|
||||
"app.presentation.presentationToolbar.noPrevSlideDesc": "Avvia presentazione",
|
||||
"app.presentation.presentationToolbar.selectLabel": "Seleziona slide",
|
||||
"app.presentation.presentationToolbar.prevSlideLabel": "Slide precedente",
|
||||
"app.presentation.presentationToolbar.prevSlideDesc": "Spostati alla slide precedente",
|
||||
@ -110,7 +152,9 @@
|
||||
"app.presentation.presentationToolbar.fitToPage": "Adatta alla pagina",
|
||||
"app.presentation.presentationToolbar.goToSlide": "Slide {0}",
|
||||
"app.presentationUploder.title": "Presentazione",
|
||||
"app.presentationUploder.message": "Come presentatore hai la possibilità di caricare documenti di Office o PDF. Si raccomanda di utilizzare i file PDF per i migliori risultati. Assicurarsi che la presentazione sia selezionata utilizzando la casella di controllo sulla destra.",
|
||||
"app.presentationUploder.uploadLabel": "Carica",
|
||||
"app.presentationUploder.confirmLabel": "Conferma",
|
||||
"app.presentationUploder.confirmDesc": "Salva modifiche e avvia presentazione",
|
||||
"app.presentationUploder.dismissLabel": "Annulla",
|
||||
"app.presentationUploder.dismissDesc": "Chiudi la finestra e annulla le modifiche",
|
||||
@ -121,6 +165,7 @@
|
||||
"app.presentationUploder.fileToUpload": "Da caricare...",
|
||||
"app.presentationUploder.currentBadge": "Attuale",
|
||||
"app.presentationUploder.genericError": "Dannazione, qualcosa è andato storto",
|
||||
"app.presentationUploder.rejectedError": "Il file selezionato è stato rifiutato. controllare il tipo di file.",
|
||||
"app.presentationUploder.upload.progress": "Caricamento ({0}%)",
|
||||
"app.presentationUploder.upload.413": "Il file è troppo grande, il numero massimo di 200 pagine è stato raggiunto",
|
||||
"app.presentationUploder.conversion.conversionProcessingSlides": "Elaborazione pagina {0} di {1}",
|
||||
@ -181,6 +226,7 @@
|
||||
"app.downloadPresentationButton.label": "Scarica la presentazione originale",
|
||||
"app.connectingMessage": "Connessione...",
|
||||
"app.waitingMessage": "Disconnesso. Prossimo tentativo in {0} secondi...",
|
||||
"app.retryNow": "Riprova ora",
|
||||
"app.navBar.settingsDropdown.optionsLabel": "Opzioni",
|
||||
"app.navBar.settingsDropdown.fullscreenLabel": "Schermo intero",
|
||||
"app.navBar.settingsDropdown.settingsLabel": "Impostazioni",
|
||||
@ -266,6 +312,7 @@
|
||||
"app.actionsBar.actionsDropdown.presentationLabel": "Gestisci Presentazione",
|
||||
"app.actionsBar.actionsDropdown.initPollLabel": "Crea un sondaggio",
|
||||
"app.actionsBar.actionsDropdown.desktopShareLabel": "Condividi lo schermo",
|
||||
"app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "La condivisione dello schermo è bloccata",
|
||||
"app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Termina condivisione schermo",
|
||||
"app.actionsBar.actionsDropdown.presentationDesc": "Gestisci Presentazione",
|
||||
"app.actionsBar.actionsDropdown.initPollDesc": "Crea un sondaggio",
|
||||
@ -273,8 +320,11 @@
|
||||
"app.actionsBar.actionsDropdown.stopDesktopShareDesc": "Termina condivisione schermo con ",
|
||||
"app.actionsBar.actionsDropdown.pollBtnLabel": "Avvia un sondaggio",
|
||||
"app.actionsBar.actionsDropdown.pollBtnDesc": "Attiva/Disattiva pannello sondaggi",
|
||||
"app.actionsBar.actionsDropdown.saveUserNames": "Salva lista nomi utente",
|
||||
"app.actionsBar.actionsDropdown.createBreakoutRoom": "Crea una stanza breakout",
|
||||
"app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "crea un breakout per dividere il meeting in corso",
|
||||
"app.actionsBar.actionsDropdown.captionsLabel": "Scrivi sottotitoli",
|
||||
"app.actionsBar.actionsDropdown.captionsDesc": "Attiva/Disattiva pannello sottotitoli",
|
||||
"app.actionsBar.actionsDropdown.takePresenter": "Diventa Presentatore",
|
||||
"app.actionsBar.actionsDropdown.takePresenterDesc": "Assegna al tuo utente il ruolo di presentatore",
|
||||
"app.actionsBar.emojiMenu.statusTriggerLabel": "Imposta Stato",
|
||||
@ -299,6 +349,8 @@
|
||||
"app.actionsBar.emojiMenu.thumbsDownLabel": "Contrariato",
|
||||
"app.actionsBar.emojiMenu.thumbsDownDesc": "Cambia il tuo stato in \"contrariato\"",
|
||||
"app.actionsBar.currentStatusDesc": "stato corrente {0}",
|
||||
"app.actionsBar.captions.start": "Avvia riproduzione dei sottotitoli",
|
||||
"app.actionsBar.captions.stop": "Interrompi riproduzione sottotitoli",
|
||||
"app.audioNotification.audioFailedError1001": "Errore 1001: Websocket disconnesso",
|
||||
"app.audioNotification.audioFailedError1002": "Errore 1002: Impossibile stabilire una connessione al WebSocket",
|
||||
"app.audioNotification.audioFailedError1003": "Errore 1003: La versione del browser non è supportata",
|
||||
@ -345,11 +397,17 @@
|
||||
"app.audioModal.audioDialTitle": "Partecipa utilizzando il telefono",
|
||||
"app.audioDial.audioDialDescription": "Componi",
|
||||
"app.audioDial.audioDialConfrenceText": "e inserisci il seguente numero PIN:",
|
||||
"app.audioModal.autoplayBlockedDesc": "Abbiamo bisogno del tuo permesso per riprodurre l'audio",
|
||||
"app.audioModal.playAudio": "Riproduci audio",
|
||||
"app.audioModal.playAudio.arialabel" : "Riproduci audio",
|
||||
"app.audioDial.tipIndicator": "Consiglio",
|
||||
"app.audioDial.tipMessage": "Premi il tasto '0' sul tuo telefono per abilitare o disabilitare il muto",
|
||||
"app.audioModal.connecting": "Connessione in corso",
|
||||
"app.audioModal.connectingEchoTest": "Connessione al test audio",
|
||||
"app.audioManager.joinedAudio": "Stai partecipando al meeting audio",
|
||||
"app.audioManager.joinedEcho": "Stai partecipando al test audio",
|
||||
"app.audioManager.leftAudio": "L'audio del meeting è disattivato",
|
||||
"app.audioManager.reconnectingAudio": "Tentativo di riconnessione dell'audio",
|
||||
"app.audioManager.genericError": "Errore: c'è stato un errore, riprova",
|
||||
"app.audioManager.connectionError": "Errore: Problema di connessione",
|
||||
"app.audioManager.requestTimeout": "Errore: E' scaduto il tempo in attesa della risposta",
|
||||
@ -412,7 +470,12 @@
|
||||
"app.toast.chat.public": "Nuovo messaggio nella chat pubblica",
|
||||
"app.toast.chat.private": "Nuovo messaggio privato",
|
||||
"app.toast.chat.system": "Sistema",
|
||||
"app.toast.clearedEmoji.label": "Reimpostate tutte le emoticons",
|
||||
"app.toast.setEmoji.label": "Lo stato della emoticon è impostato {0}",
|
||||
"app.toast.meetingMuteOn.label": "Tutti gli utenti sono stati messi in muto",
|
||||
"app.toast.meetingMuteOff.label": "E' stato disattivato l'audio del meeting",
|
||||
"app.notification.recordingStart": "La registrazione della sessione è stata avviata",
|
||||
"app.notification.recordingStop": "La sessione non viene registrata",
|
||||
"app.notification.recordingPaused": "La registrazione della sessione è stata interrotta",
|
||||
"app.notification.recordingAriaLabel": "Durata registrazione",
|
||||
"app.shortcut-help.title": "Scorciatoie da tastiera",
|
||||
@ -471,6 +534,9 @@
|
||||
"app.video.notSupportedError": "E' possibile condividere la webcam solo con sorgenti sicure, controllare che il certificato SSL sia valido",
|
||||
"app.video.notReadableError": "Impossibile condividere la webcam. Controlla che la webcam non sia utilizzata da un altro programma",
|
||||
"app.video.mediaFlowTimeout1020": "Errore 1020: Impossibile raggiungere il server media",
|
||||
"app.video.suggestWebcamLock": "Impostare il blocco delle webcam degli utenti?",
|
||||
"app.video.suggestWebcamLockReason": "(questo migliorerà la stabilità del meeting)",
|
||||
"app.video.enable": "Abilita",
|
||||
"app.video.cancel": "Annulla",
|
||||
"app.video.swapCam": "Scambia",
|
||||
"app.video.swapCamDesc": "cambia la webcam",
|
||||
@ -545,6 +611,8 @@
|
||||
"app.videoDock.webcamFocusDesc": "Metti in evidenza la webcam selezionata",
|
||||
"app.videoDock.webcamUnfocusLabel": "Disattiva webcam",
|
||||
"app.videoDock.webcamUnfocusDesc": "Disattiva la webcam selezionata",
|
||||
"app.videoDock.autoplayBlockedDesc": "Abbiamo bisogno del tuo permesso per mostrarti le webcam degli utenti.",
|
||||
"app.videoDock.autoplayAllowLabel": "Visualizza webcam",
|
||||
"app.invitation.title": "Invito alla Stanza Separata",
|
||||
"app.invitation.confirm": "Invita",
|
||||
"app.createBreakoutRoom.title": "Stanze Separate",
|
||||
@ -567,11 +635,14 @@
|
||||
"app.createBreakoutRoom.roomName": "{0} (Stanza - {1})",
|
||||
"app.createBreakoutRoom.doneLabel": "Fatto",
|
||||
"app.createBreakoutRoom.nextLabel": "Prossimo",
|
||||
"app.createBreakoutRoom.minusRoomTime": "Diminuisci la durata della stanza separata",
|
||||
"app.createBreakoutRoom.addRoomTime": "Aumenta la durata della stanza separata",
|
||||
"app.createBreakoutRoom.addParticipantLabel": "+ Aggiungi partecipante",
|
||||
"app.createBreakoutRoom.freeJoin": "Permetti agli utenti di entrare in una Stanza Separata",
|
||||
"app.createBreakoutRoom.leastOneWarnBreakout": "Devi posizionare almeno un utente nella Stanza Separata",
|
||||
"app.createBreakoutRoom.modalDesc": "Completa i passaggi seguenti per creare Stanze nella tua sessione e aggiungere partecipanti ad esse.",
|
||||
"app.createBreakoutRoom.roomTime": "{0} minuti",
|
||||
"app.createBreakoutRoom.numberOfRoomsError": "Il numero di stanze non è valido.",
|
||||
"app.externalVideo.start": "Condividi un nuovo video",
|
||||
"app.externalVideo.title": "Condividi un video da YouTube",
|
||||
"app.externalVideo.input": "Indirizzo video YouTube ",
|
||||
@ -579,12 +650,14 @@
|
||||
"app.externalVideo.urlError": "Questo indirizzo non è un video YouTube valido",
|
||||
"app.externalVideo.close": "Chiudi",
|
||||
"app.network.connection.effective.slow": "Stiamo rilevando problemi di connessione",
|
||||
"app.network.connection.effective.slow.help": "Più informazioni",
|
||||
"app.externalVideo.noteLabel": "Nota: I video condivisi da YouTube non appariranno nella registrazione",
|
||||
"app.actionsBar.actionsDropdown.shareExternalVideo": "Condividi un video da YouTube",
|
||||
"app.actionsBar.actionsDropdown.stopShareExternalVideo": "Interrompi condivisione video da YouTube",
|
||||
"app.iOSWarning.label": "Aggiornare alla versione iOS 12.2 o seguenti",
|
||||
"app.legacy.unsupportedBrowser": "Sembra che tu stia usando un browser non supportato. Per favore utilizza {0} oppure {1} per un supporto completo.",
|
||||
"app.legacy.upgradeBrowser": "Sembra tu stia usando una vecchia versione di un browser supportato. Per favore aggiorna la versione del browser per un supporto completo."
|
||||
"app.legacy.upgradeBrowser": "Sembra tu stia usando una vecchia versione di un browser supportato. Per favore aggiorna la versione del browser per un supporto completo.",
|
||||
"app.legacy.criosBrowser": "Su iPhone/iPad (iOS) utilizzare il browser Safari per il supporto completo."
|
||||
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@ class ChatPage extends Page {
|
||||
|
||||
sendPublicChatMessage(message) {
|
||||
this.publicChatElement.setValue(message);
|
||||
pageObject.pressEnter();
|
||||
this.sendMessageButtonElement.click();
|
||||
}
|
||||
|
||||
// ////////
|
||||
@ -74,6 +74,16 @@ class ChatPage extends Page {
|
||||
copyChat() {
|
||||
this.copyChatButtonElement.click();
|
||||
}
|
||||
|
||||
// ////////
|
||||
|
||||
get sendMessageButtonSelector() {
|
||||
return '[data-test=sendMessageButton]';
|
||||
}
|
||||
|
||||
get sendMessageButtonElement() {
|
||||
return $(this.sendMessageButtonSelector);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = new ChatPage();
|
||||
|
@ -13,7 +13,7 @@ const loginWithoutAudio = function (username) {
|
||||
// login
|
||||
LandingPage.open();
|
||||
browser.setValue(LandingPage.usernameInputSelector, username);
|
||||
LandingPage.joinWithEnterKey();
|
||||
LandingPage.joinWithButtonClick();
|
||||
|
||||
// close audio modal
|
||||
browser.waitForExist(ModalPage.modalCloseSelector, WAIT_TIME);
|
||||
|
@ -11,7 +11,7 @@ const loginWithoutAudio = function (username) {
|
||||
// login
|
||||
LandingPage.open();
|
||||
browser.setValue(LandingPage.usernameInputSelector, username);
|
||||
LandingPage.joinWithEnterKey();
|
||||
LandingPage.joinWithButtonClick();
|
||||
|
||||
// close audio modal
|
||||
browser.waitForExist(ModalPage.modalCloseSelector, WAIT_TIME);
|
||||
|
@ -34,7 +34,7 @@ describe('Settings', () => {
|
||||
LandingPage.open();
|
||||
browser.setValue(LandingPage.usernameInputSelector, 'user');
|
||||
browser.setValue(LandingPage.meetingNameInputSelector, 'Demo Meeting Tests');
|
||||
LandingPage.joinWithEnterKey();
|
||||
LandingPage.joinWithButtonClick();
|
||||
closeAudioModal();
|
||||
});
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user