summaryrefslogtreecommitdiffstats
path: root/webapp/components
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/components')
-rw-r--r--webapp/components/admin_console/configuration_settings.jsx2
-rw-r--r--webapp/components/admin_console/connection_security_dropdown_setting.jsx12
-rw-r--r--webapp/components/admin_console/email_settings.jsx50
-rw-r--r--webapp/components/admin_console/log_settings.jsx18
-rw-r--r--webapp/components/admin_console/webserver_mode_dropdown_setting.jsx12
-rw-r--r--webapp/components/user_settings/email_notification_setting.jsx211
-rw-r--r--webapp/components/user_settings/user_settings_notifications.jsx197
7 files changed, 333 insertions, 169 deletions
diff --git a/webapp/components/admin_console/configuration_settings.jsx b/webapp/components/admin_console/configuration_settings.jsx
index 6a07e31cd..1207f1f79 100644
--- a/webapp/components/admin_console/configuration_settings.jsx
+++ b/webapp/components/admin_console/configuration_settings.jsx
@@ -69,7 +69,7 @@ export default class ConfigurationSettings extends AdminSettings {
helpText={
<FormattedMessage
id='admin.service.siteURLDescription'
- defaultMessage='The URL, including port number and protocol, from which users will access Mattermost. Leave blank to automatically configure based on incoming traffic.'
+ defaultMessage='The URL, including post number and protocol, that users will use to access Mattermost. Leave blank to automatically configure based on incoming traffic.'
/>
}
value={this.state.siteURL}
diff --git a/webapp/components/admin_console/connection_security_dropdown_setting.jsx b/webapp/components/admin_console/connection_security_dropdown_setting.jsx
index b3e9ac31c..09768049e 100644
--- a/webapp/components/admin_console/connection_security_dropdown_setting.jsx
+++ b/webapp/components/admin_console/connection_security_dropdown_setting.jsx
@@ -14,13 +14,13 @@ const CONNECTION_SECURITY_HELP_TEXT = (
>
<tbody>
<tr>
- <td className='help-text'>
+ <td>
<FormattedMessage
id='admin.connectionSecurityNone'
defaultMessage='None'
/>
</td>
- <td className='help-text'>
+ <td>
<FormattedMessage
id='admin.connectionSecurityNoneDescription'
defaultMessage='Mattermost will connect over an unsecure connection.'
@@ -28,13 +28,13 @@ const CONNECTION_SECURITY_HELP_TEXT = (
</td>
</tr>
<tr>
- <td className='help-text'>
+ <td>
<FormattedMessage
id='admin.connectionSecurityTls'
defaultMessage='TLS'
/>
</td>
- <td className='help-text'>
+ <td>
<FormattedMessage
id='admin.connectionSecurityTlsDescription'
defaultMessage='Encrypts the communication between Mattermost and your server.'
@@ -42,13 +42,13 @@ const CONNECTION_SECURITY_HELP_TEXT = (
</td>
</tr>
<tr>
- <td className='help-text'>
+ <td>
<FormattedMessage
id='admin.connectionSecurityStart'
defaultMessage='STARTTLS'
/>
</td>
- <td className='help-text'>
+ <td>
<FormattedMessage
id='admin.connectionSecurityStartDescription'
defaultMessage='Takes an existing insecure connection and attempts to upgrade it to a secure connection using TLS.'
diff --git a/webapp/components/admin_console/email_settings.jsx b/webapp/components/admin_console/email_settings.jsx
index 01f38dc21..b05a3f905 100644
--- a/webapp/components/admin_console/email_settings.jsx
+++ b/webapp/components/admin_console/email_settings.jsx
@@ -32,6 +32,7 @@ export default class EmailSettings extends AdminSettings {
config.EmailSettings.SMTPServer = this.state.smtpServer;
config.EmailSettings.SMTPPort = this.state.smtpPort;
config.EmailSettings.ConnectionSecurity = this.state.connectionSecurity;
+ config.EmailSettings.EnableEmailBatching = this.state.enableEmailBatching;
config.ServiceSettings.EnableSecurityFixAlert = this.state.enableSecurityFixAlert;
return config;
@@ -48,6 +49,7 @@ export default class EmailSettings extends AdminSettings {
smtpServer: config.EmailSettings.SMTPServer,
smtpPort: config.EmailSettings.SMTPPort,
connectionSecurity: config.EmailSettings.ConnectionSecurity,
+ enableEmailBatching: config.EmailSettings.EnableEmailBatching,
enableSecurityFixAlert: config.ServiceSettings.EnableSecurityFixAlert
};
}
@@ -64,6 +66,34 @@ export default class EmailSettings extends AdminSettings {
}
renderSettings() {
+ let enableEmailBatchingDisabledText = null;
+
+ if (this.props.config.ClusterSettings.Enable) {
+ enableEmailBatchingDisabledText = (
+ <span
+ key='admin.email.enableEmailBatching.clusterEnabled'
+ className='help-text'
+ >
+ <FormattedHTMLMessage
+ id='admin.email.enableEmailBatching.clusterEnabled'
+ defaultMessage='Email batching cannot be enabled unless the SiteURL is configured in <b>Configuration > SiteURL</b>.'
+ />
+ </span>
+ );
+ } else if (!this.props.config.ServiceSettings.SiteURL) {
+ enableEmailBatchingDisabledText = (
+ <span
+ key='admin.email.enableEmailBatching.siteURL'
+ className='help-text'
+ >
+ <FormattedHTMLMessage
+ id='admin.email.enableEmailBatching.siteURL'
+ defaultMessage='Email batching cannot be enabled unless the SiteURL is configured in <b>Configuration > SiteURL</b>.'
+ />
+ </span>
+ );
+ }
+
return (
<SettingsGroup>
<BooleanSetting
@@ -83,6 +113,26 @@ export default class EmailSettings extends AdminSettings {
value={this.state.sendEmailNotifications}
onChange={this.handleChange}
/>
+ <BooleanSetting
+ id='enableEmailBatching'
+ label={
+ <FormattedMessage
+ id='admin.email.enableEmailBatchingTitle'
+ defaultMessage='Enable Email Batching: '
+ />
+ }
+ helpText={[
+ <FormattedHTMLMessage
+ key='admin.email.enableEmailBatchingDesc'
+ id='admin.email.enableEmailBatchingDesc'
+ defaultMessage='When true, users can have email notifications for multiple direct messages and mentions combined into a single email, configurable in <b>Account Settings > Notifications</b>.'
+ />,
+ enableEmailBatchingDisabledText
+ ]}
+ value={this.state.enableEmailBatching && !this.props.config.ClusterSettings.Enable && this.props.config.ServiceSettings.SiteURL}
+ onChange={this.handleChange}
+ disabled={!this.state.sendEmailNotifications || this.props.config.ClusterSettings.Enable || !this.props.config.ServiceSettings.SiteURL}
+ />
<TextSetting
id='feedbackName'
label={
diff --git a/webapp/components/admin_console/log_settings.jsx b/webapp/components/admin_console/log_settings.jsx
index efd1bf342..31abca316 100644
--- a/webapp/components/admin_console/log_settings.jsx
+++ b/webapp/components/admin_console/log_settings.jsx
@@ -204,7 +204,8 @@ export default class LogSettings extends AdminSettings {
>
<tbody>
<tr>
- <td className='help-text'>{'%T'}</td><td className='help-text'>
+ <td>{'%T'}</td>
+ <td>
<FormattedMessage
id='admin.log.formatTime'
defaultMessage='Time (15:04:05 MST)'
@@ -212,7 +213,8 @@ export default class LogSettings extends AdminSettings {
</td>
</tr>
<tr>
- <td className='help-text'>{'%D'}</td><td className='help-text'>
+ <td>{'%D'}</td>
+ <td>
<FormattedMessage
id='admin.log.formatDateLong'
defaultMessage='Date (2006/01/02)'
@@ -220,7 +222,8 @@ export default class LogSettings extends AdminSettings {
</td>
</tr>
<tr>
- <td className='help-text'>{'%d'}</td><td className='help-text'>
+ <td>{'%d'}</td>
+ <td>
<FormattedMessage
id='admin.log.formatDateShort'
defaultMessage='Date (01/02/06)'
@@ -228,7 +231,8 @@ export default class LogSettings extends AdminSettings {
</td>
</tr>
<tr>
- <td className='help-text'>{'%L'}</td><td className='help-text'>
+ <td>{'%L'}</td>
+ <td>
<FormattedMessage
id='admin.log.formatLevel'
defaultMessage='Level (DEBG, INFO, EROR)'
@@ -236,7 +240,8 @@ export default class LogSettings extends AdminSettings {
</td>
</tr>
<tr>
- <td className='help-text'>{'%S'}</td><td className='help-text'>
+ <td>{'%S'}</td>
+ <td>
<FormattedMessage
id='admin.log.formatSource'
defaultMessage='Source'
@@ -244,7 +249,8 @@ export default class LogSettings extends AdminSettings {
</td>
</tr>
<tr>
- <td className='help-text'>{'%M'}</td><td className='help-text'>
+ <td>{'%M'}</td>
+ <td>
<FormattedMessage
id='admin.log.formatMessage'
defaultMessage='Message'
diff --git a/webapp/components/admin_console/webserver_mode_dropdown_setting.jsx b/webapp/components/admin_console/webserver_mode_dropdown_setting.jsx
index 9581816f1..1616ced23 100644
--- a/webapp/components/admin_console/webserver_mode_dropdown_setting.jsx
+++ b/webapp/components/admin_console/webserver_mode_dropdown_setting.jsx
@@ -15,13 +15,13 @@ const WEBSERVER_MODE_HELP_TEXT = (
>
<tbody>
<tr>
- <td className='help-text'>
+ <td>
<FormattedMessage
id='admin.webserverModeGzip'
defaultMessage='gzip'
/>
</td>
- <td className='help-text'>
+ <td>
<FormattedMessage
id='admin.webserverModeGzipDescription'
defaultMessage='The Mattermost server will serve static files compressed with gzip.'
@@ -29,13 +29,13 @@ const WEBSERVER_MODE_HELP_TEXT = (
</td>
</tr>
<tr>
- <td className='help-text'>
+ <td>
<FormattedMessage
id='admin.webserverModeUncompressed'
defaultMessage='Uncompressed'
/>
</td>
- <td className='help-text'>
+ <td>
<FormattedMessage
id='admin.webserverModeUncompressedDescription'
defaultMessage='The Mattermost server will serve static files uncompressed.'
@@ -43,13 +43,13 @@ const WEBSERVER_MODE_HELP_TEXT = (
</td>
</tr>
<tr>
- <td className='help-text'>
+ <td>
<FormattedMessage
id='admin.webserverModeDisabled'
defaultMessage='Disabled'
/>
</td>
- <td className='help-text'>
+ <td>
<FormattedMessage
id='admin.webserverModeDisabledDescription'
defaultMessage='The Mattermost server will not serve static files.'
diff --git a/webapp/components/user_settings/email_notification_setting.jsx b/webapp/components/user_settings/email_notification_setting.jsx
new file mode 100644
index 000000000..df5f80c64
--- /dev/null
+++ b/webapp/components/user_settings/email_notification_setting.jsx
@@ -0,0 +1,211 @@
+// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import React from 'react';
+
+import {savePreference} from 'utils/async_client.jsx';
+import PreferenceStore from 'stores/preference_store.jsx';
+import {localizeMessage} from 'utils/utils.jsx';
+
+import {FormattedMessage} from 'react-intl';
+import SettingItemMin from 'components/setting_item_min.jsx';
+import SettingItemMax from 'components/setting_item_max.jsx';
+
+import {Preferences} from 'utils/constants.jsx';
+
+const INTERVAL_IMMEDIATE = 30; // "immediate" is a 30 second interval
+const INTERVAL_FIFTEEN_MINUTES = 15 * 60;
+const INTERVAL_HOUR = 60 * 60;
+
+export default class EmailNotificationSetting extends React.Component {
+ static propTypes = {
+ activeSection: React.PropTypes.string.isRequired,
+ updateSection: React.PropTypes.func.isRequired,
+ enableEmail: React.PropTypes.bool.isRequired,
+ onChange: React.PropTypes.func.isRequired,
+ onSubmit: React.PropTypes.func.isRequired,
+ serverError: React.PropTypes.string.isRequired
+ };
+
+ constructor(props) {
+ super(props);
+
+ this.submit = this.submit.bind(this);
+
+ this.expand = this.expand.bind(this);
+ this.collapse = this.collapse.bind(this);
+
+ this.state = {
+ emailInterval: PreferenceStore.getInt(Preferences.CATEGORY_NOTIFICATIONS, Preferences.EMAIL_INTERVAL, INTERVAL_IMMEDIATE)
+ };
+ }
+
+ handleChange(enableEmail, emailInterval) {
+ this.props.onChange(enableEmail);
+ this.setState({emailInterval});
+ }
+
+ submit() {
+ // until the rest of the notification settings are moved to preferences, we have to do this separately
+ savePreference(Preferences.CATEGORY_NOTIFICATIONS, Preferences.EMAIL_INTERVAL, this.state.emailInterval.toString());
+
+ this.props.onSubmit();
+ }
+
+ expand() {
+ this.props.updateSection('email');
+ }
+
+ collapse() {
+ this.props.updateSection('');
+ }
+
+ render() {
+ if (this.props.activeSection !== 'email') {
+ let description;
+
+ if (this.props.enableEmail === 'true') {
+ switch (this.state.emailInterval) {
+ case INTERVAL_IMMEDIATE:
+ description = (
+ <FormattedMessage
+ id='user.settings.notifications.email.immediately'
+ defaultMessage='Immediately'
+ />
+ );
+ break;
+ case INTERVAL_HOUR:
+ description = (
+ <FormattedMessage
+ id='user.settings.notifications.email.everyHour'
+ defaultMessage='Every hour'
+ />
+ );
+ break;
+ default:
+ description = (
+ <FormattedMessage
+ id='user.settings.notifications.email.everyXMinutes'
+ defaultMessage='Every {count, plural, one {minute} other {{count, number} minutes}}'
+ values={{count: this.state.emailInterval / 60}}
+ />
+ );
+ }
+ } else {
+ description = (
+ <FormattedMessage
+ id='user.settings.notifications.email.never'
+ defaultMessage='Never'
+ />
+ );
+ }
+
+ return (
+ <SettingItemMin
+ title={localizeMessage('user.settings.notifications.emailNotifications', 'Send Email notifications')}
+ describe={description}
+ updateSection={this.expand}
+ />
+ );
+ }
+
+ let batchingOptions = null;
+ let batchingInfo = null;
+ if (window.mm_config.EnableEmailBatching === 'true') {
+ batchingOptions = (
+ <div>
+ <div className='radio'>
+ <label>
+ <input
+ type='radio'
+ name='emailNotifications'
+ checked={this.props.enableEmail === 'true' && this.state.emailInterval === INTERVAL_FIFTEEN_MINUTES}
+ onChange={this.handleChange.bind(this, 'true', INTERVAL_FIFTEEN_MINUTES)}
+ />
+ <FormattedMessage
+ id='user.settings.notifications.email.everyXMinutes'
+ defaultMessage='Every {count} minutes'
+ values={{count: INTERVAL_FIFTEEN_MINUTES / 60}}
+ />
+ </label>
+ </div>
+ <div className='radio'>
+ <label>
+ <input
+ type='radio'
+ name='emailNotifications'
+ checked={this.props.enableEmail === 'true' && this.state.emailInterval === INTERVAL_HOUR}
+ onChange={this.handleChange.bind(this, 'true', INTERVAL_HOUR)}
+ />
+ <FormattedMessage
+ id='user.settings.notifications.everyHour'
+ defaultMessage='Every hour'
+ />
+ </label>
+ </div>
+ </div>
+ );
+
+ batchingInfo = (
+ <FormattedMessage
+ id='user.settings.notifications.emailBatchingInfo'
+ defaultMessage='Notifications are combined into a single email and sent at the maximum frequency selected here.'
+ />
+ );
+ }
+
+ return (
+ <SettingItemMax
+ title={localizeMessage('user.settings.notifications.emailNotifications', 'Send email notifications')}
+ inputs={[
+ <div key='userNotificationEmailOptions'>
+ <div className='radio'>
+ <label>
+ <input
+ type='radio'
+ name='emailNotifications'
+ checked={this.props.enableEmail === 'true' && this.state.emailInterval === INTERVAL_IMMEDIATE}
+ onChange={this.handleChange.bind(this, 'true', INTERVAL_IMMEDIATE)}
+ />
+ <FormattedMessage
+ id='user.settings.notifications.email.immediately'
+ defaultMessage='Immediately'
+ />
+ </label>
+ </div>
+ {batchingOptions}
+ <div className='radio'>
+ <label>
+ <input
+ type='radio'
+ name='emailNotifications'
+ checked={this.props.enableEmail === 'false'}
+ onChange={this.handleChange.bind(this, 'false', INTERVAL_IMMEDIATE)}
+ />
+ <FormattedMessage
+ id='user.settings.notifications.never'
+ defaultMessage='Never'
+ />
+ </label>
+ </div>
+ <br/>
+ <div>
+ <FormattedMessage
+ id='user.settings.notifications.emailInfo'
+ defaultMessage='Email notifications that are sent for mentions and direct messages when you are offline or away from {siteName} for more than 5 minutes.'
+ values={{
+ siteName: global.window.mm_config.SiteName
+ }}
+ />
+ {' '}
+ {batchingInfo}
+ </div>
+ </div>
+ ]}
+ submit={this.submit}
+ server_error={this.props.serverError}
+ updateSection={this.collapse}
+ />
+ );
+ }
+} \ No newline at end of file
diff --git a/webapp/components/user_settings/user_settings_notifications.jsx b/webapp/components/user_settings/user_settings_notifications.jsx
index e0e3bf979..17abfa555 100644
--- a/webapp/components/user_settings/user_settings_notifications.jsx
+++ b/webapp/components/user_settings/user_settings_notifications.jsx
@@ -2,8 +2,8 @@
// See License.txt for license information.
import $ from 'jquery';
-import SettingItemMin from '../setting_item_min.jsx';
-import SettingItemMax from '../setting_item_max.jsx';
+import SettingItemMin from 'components/setting_item_min.jsx';
+import SettingItemMax from 'components/setting_item_max.jsx';
import UserStore from 'stores/user_store.jsx';
@@ -12,7 +12,8 @@ import * as AsyncClient from 'utils/async_client.jsx';
import * as UserAgent from 'utils/user_agent.jsx';
import * as Utils from 'utils/utils.jsx';
-import {intlShape, injectIntl, defineMessages, FormattedMessage} from 'react-intl';
+import EmailNotificationSetting from './email_notification_setting.jsx';
+import {FormattedMessage} from 'react-intl';
function getNotificationsStateFromStores() {
var user = UserStore.getCurrentUser();
@@ -30,9 +31,9 @@ function getNotificationsStateFromStores() {
if (user.notify_props && user.notify_props.comments) {
comments = user.notify_props.comments;
}
- var email = 'true';
+ var enableEmail = 'true';
if (user.notify_props && user.notify_props.email) {
- email = user.notify_props.email;
+ enableEmail = user.notify_props.email;
}
var push = 'mention';
if (user.notify_props && user.notify_props.push) {
@@ -78,7 +79,7 @@ function getNotificationsStateFromStores() {
return {
notifyLevel: desktop,
notifyPushLevel: push,
- enableEmail: email,
+ enableEmail,
soundNeeded,
enableSound: sound,
usernameKey,
@@ -91,36 +92,9 @@ function getNotificationsStateFromStores() {
};
}
-const holders = defineMessages({
- desktop: {
- id: 'user.settings.notifications.desktop',
- defaultMessage: 'Send desktop notifications'
- },
- desktopSounds: {
- id: 'user.settings.notifications.desktopSounds',
- defaultMessage: 'Desktop notification sounds'
- },
- emailNotifications: {
- id: 'user.settings.notifications.emailNotifications',
- defaultMessage: 'Email notifications'
- },
- wordsTrigger: {
- id: 'user.settings.notifications.wordsTrigger',
- defaultMessage: 'Words that trigger mentions'
- },
- comments: {
- id: 'user.settings.notifications.comments',
- defaultMessage: 'Comment threads notifications'
- },
- close: {
- id: 'user.settings.notifications.close',
- defaultMessage: 'Close'
- }
-});
-
import React from 'react';
-class NotificationsTab extends React.Component {
+export default class NotificationsTab extends React.Component {
constructor(props) {
super(props);
@@ -142,6 +116,7 @@ class NotificationsTab extends React.Component {
this.state = getNotificationsStateFromStores();
}
+
handleSubmit() {
var data = {};
data.user_id = this.props.user.id;
@@ -178,31 +153,38 @@ class NotificationsTab extends React.Component {
}
);
}
+
handleCancel(e) {
this.updateState();
this.props.updateSection('');
e.preventDefault();
$('.settings-modal .modal-body').scrollTop(0).perfectScrollbar('update');
}
+
updateSection(section) {
this.updateState();
this.props.updateSection(section);
}
+
updateState() {
const newState = getNotificationsStateFromStores();
if (!Utils.areObjectsEqual(newState, this.state)) {
this.setState(newState);
}
}
+
componentDidMount() {
UserStore.addChangeListener(this.onListenerChange);
}
+
componentWillUnmount() {
UserStore.removeChangeListener(this.onListenerChange);
}
+
onListenerChange() {
this.updateState();
}
+
handleNotifyRadio(notifyLevel) {
this.setState({notifyLevel});
this.refs.wrapper.focus();
@@ -222,22 +204,28 @@ class NotificationsTab extends React.Component {
this.setState({enableEmail});
this.refs.wrapper.focus();
}
+
handleSoundRadio(enableSound) {
this.setState({enableSound});
this.refs.wrapper.focus();
}
+
updateUsernameKey(val) {
this.setState({usernameKey: val});
}
+
updateMentionKey(val) {
this.setState({mentionKey: val});
}
+
updateFirstNameKey(val) {
this.setState({firstNameKey: val});
}
+
updateChannelKey(val) {
this.setState({channelKey: val});
}
+
updateCustomMentionKeys() {
var checked = this.refs.customcheck.checked;
@@ -250,10 +238,12 @@ class NotificationsTab extends React.Component {
this.setState({customKeys: '', customKeysChecked: false});
}
}
+
onCustomChange() {
this.refs.customcheck.checked = true;
this.updateCustomMentionKeys();
}
+
createPushNotificationSection() {
var handleUpdateDesktopSection;
if (this.props.activeSection === 'push') {
@@ -312,8 +302,8 @@ class NotificationsTab extends React.Component {
onChange={this.handlePushRadio.bind(this, 'none')}
/>
<FormattedMessage
- id='user.settings.push_notification.off'
- defaultMessage='Off'
+ id='user.settings.notifications.never'
+ defaultMessage='Never'
/>
</label>
</div>
@@ -346,7 +336,7 @@ class NotificationsTab extends React.Component {
return (
<SettingItemMax
- title={Utils.localizeMessage('user.settings.notifications.push', 'Mobile push notifications')}
+ title={Utils.localizeMessage('user.settings.notifications.push', 'Send mobile push notifications')}
extraInfo={extraInfo}
inputs={inputs}
submit={submit}
@@ -367,8 +357,8 @@ class NotificationsTab extends React.Component {
} else if (this.state.notifyPushLevel === 'none') {
describe = (
<FormattedMessage
- id='user.settings.push_notification.off'
- defaultMessage='Off'
+ id='user.settings.notifications.never'
+ defaultMessage='Never'
/>
);
} else if (global.window.mm_config.SendPushNotifications === 'false') {
@@ -393,14 +383,14 @@ class NotificationsTab extends React.Component {
return (
<SettingItemMin
- title={Utils.localizeMessage('user.settings.notifications.push', 'Mobile push notifications')}
+ title={Utils.localizeMessage('user.settings.notifications.push', 'Send mobile push notifications')}
describe={describe}
updateSection={handleUpdateDesktopSection}
/>
);
}
+
render() {
- const {formatMessage} = this.props.intl;
const serverError = this.state.serverError;
var user = this.props.user;
@@ -479,7 +469,7 @@ class NotificationsTab extends React.Component {
desktopSection = (
<SettingItemMax
- title={formatMessage(holders.desktop)}
+ title={Utils.localizeMessage('user.settings.notifications.desktop', 'Send desktop notifications')}
extraInfo={extraInfo}
inputs={inputs}
submit={this.handleSubmit}
@@ -518,7 +508,7 @@ class NotificationsTab extends React.Component {
desktopSection = (
<SettingItemMin
- title={formatMessage(holders.desktop)}
+ title={Utils.localizeMessage('user.settings.notifications.desktop', 'Send desktop notifications')}
describe={describe}
updateSection={handleUpdateDesktopSection}
/>
@@ -583,7 +573,7 @@ class NotificationsTab extends React.Component {
soundSection = (
<SettingItemMax
- title={formatMessage(holders.desktopSounds)}
+ title={Utils.localizeMessage('user.settings.notifications.desktopSounds', 'Desktop notification sounds')}
extraInfo={extraInfo}
inputs={inputs}
submit={this.handleSubmit}
@@ -622,7 +612,7 @@ class NotificationsTab extends React.Component {
soundSection = (
<SettingItemMin
- title={formatMessage(holders.desktopSounds)}
+ title={Utils.localizeMessage('user.settings.notifications.desktopSounds', 'Desktop notification sounds')}
describe={describe}
updateSection={handleUpdateSoundSection}
disableOpen={!this.state.soundNeeded}
@@ -630,102 +620,6 @@ class NotificationsTab extends React.Component {
);
}
- var emailSection;
- var handleUpdateEmailSection;
- if (this.props.activeSection === 'email') {
- var emailActive = [false, false];
- if (this.state.enableEmail === 'false') {
- emailActive[1] = true;
- } else {
- emailActive[0] = true;
- }
-
- let inputs = [];
-
- inputs.push(
- <div key='userNotificationEmailOptions'>
- <div className='radio'>
- <label>
- <input
- type='radio'
- name='emailNotifications'
- checked={emailActive[0]}
- onChange={this.handleEmailRadio.bind(this, 'true')}
- />
- <FormattedMessage
- id='user.settings.notifications.on'
- defaultMessage='On'
- />
- </label>
- <br/>
- </div>
- <div className='radio'>
- <label>
- <input
- type='radio'
- name='emailNotifications'
- checked={emailActive[1]}
- onChange={this.handleEmailRadio.bind(this, 'false')}
- />
- <FormattedMessage
- id='user.settings.notifications.off'
- defaultMessage='Off'
- />
- </label>
- <br/>
- </div>
- <div><br/>
- <FormattedMessage
- id='user.settings.notifications.emailInfo'
- defaultMessage='Email notifications are sent for mentions and direct messages after you’ve been offline for more than 60 seconds or away from {siteName} for more than 5 minutes.'
- values={{
- siteName: global.window.mm_config.SiteName
- }}
- />
- </div>
- </div>
- );
-
- emailSection = (
- <SettingItemMax
- title={formatMessage(holders.emailNotifications)}
- inputs={inputs}
- submit={this.handleSubmit}
- server_error={serverError}
- updateSection={this.handleCancel}
- />
- );
- } else {
- let describe = '';
- if (this.state.enableEmail === 'false') {
- describe = (
- <FormattedMessage
- id='user.settings.notifications.off'
- defaultMessage='Off'
- />
- );
- } else {
- describe = (
- <FormattedMessage
- id='user.settings.notifications.on'
- defaultMessage='On'
- />
- );
- }
-
- handleUpdateEmailSection = function updateEmailSection() {
- this.props.updateSection('email');
- }.bind(this);
-
- emailSection = (
- <SettingItemMin
- title={formatMessage(holders.emailNotifications)}
- describe={describe}
- updateSection={handleUpdateEmailSection}
- />
- );
- }
-
var keysSection;
var handleUpdateKeysSection;
if (this.props.activeSection === 'keys') {
@@ -859,7 +753,7 @@ class NotificationsTab extends React.Component {
keysSection = (
<SettingItemMax
- title={formatMessage(holders.wordsTrigger)}
+ title={Utils.localizeMessage('user.settings.notifications.wordsTrigger', 'Words that trigger mentions')}
inputs={inputs}
submit={this.handleSubmit}
server_error={serverError}
@@ -910,7 +804,7 @@ class NotificationsTab extends React.Component {
keysSection = (
<SettingItemMin
- title={formatMessage(holders.wordsTrigger)}
+ title={Utils.localizeMessage('user.settings.notifications.wordsTrigger', 'Words that trigger mentions')}
describe={describe}
updateSection={handleUpdateKeysSection}
/>
@@ -991,7 +885,7 @@ class NotificationsTab extends React.Component {
commentsSection = (
<SettingItemMax
- title={formatMessage(holders.comments)}
+ title={Utils.localizeMessage('user.settings.notifications.comments', 'Comment threads notifications')}
extraInfo={extraInfo}
inputs={inputs}
submit={this.handleSubmit}
@@ -1030,7 +924,7 @@ class NotificationsTab extends React.Component {
commentsSection = (
<SettingItemMin
- title={formatMessage(holders.comments)}
+ title={Utils.localizeMessage('user.settings.notifications.comments', 'Comment threads notifications')}
describe={describe}
updateSection={handleUpdateCommentsSection}
/>
@@ -1046,7 +940,6 @@ class NotificationsTab extends React.Component {
type='button'
className='close'
data-dismiss='modal'
- aria-label={formatMessage(holders.close)}
onClick={this.props.closeModal}
>
<span aria-hidden='true'>{'×'}</span>
@@ -1082,7 +975,14 @@ class NotificationsTab extends React.Component {
<div className='divider-light'/>
{soundSection}
<div className='divider-light'/>
- {emailSection}
+ <EmailNotificationSetting
+ activeSection={this.props.activeSection}
+ updateSection={this.props.updateSection}
+ enableEmail={this.state.enableEmail}
+ onChange={this.handleEmailRadio}
+ onSubmit={this.handleSubmit}
+ serverError={this.state.serverError}
+ />
<div className='divider-light'/>
{pushNotificationSection}
<div className='divider-light'/>
@@ -1103,7 +1003,6 @@ NotificationsTab.defaultProps = {
activeTab: ''
};
NotificationsTab.propTypes = {
- intl: intlShape.isRequired,
user: React.PropTypes.object,
updateSection: React.PropTypes.func,
updateTab: React.PropTypes.func,
@@ -1112,5 +1011,3 @@ NotificationsTab.propTypes = {
closeModal: React.PropTypes.func.isRequired,
collapseModal: React.PropTypes.func.isRequired
};
-
-export default injectIntl(NotificationsTab);