From 0e5612a7db9f4205485b0c4bfcd8d2ab35727d01 Mon Sep 17 00:00:00 2001 From: Florian Orben Date: Mon, 26 Oct 2015 22:05:26 +0100 Subject: allow messages to be send on ctrl+enter --- .../user_settings/user_settings_general.jsx | 89 +++++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) (limited to 'web/react/components/user_settings') diff --git a/web/react/components/user_settings/user_settings_general.jsx b/web/react/components/user_settings/user_settings_general.jsx index 1c8ce3c79..6b7f1ad51 100644 --- a/web/react/components/user_settings/user_settings_general.jsx +++ b/web/react/components/user_settings/user_settings_general.jsx @@ -22,6 +22,7 @@ export default class UserSettingsGeneralTab extends React.Component { this.submitEmail = this.submitEmail.bind(this); this.submitUser = this.submitUser.bind(this); this.submitPicture = this.submitPicture.bind(this); + this.submitCtrlSend = this.submitCtrlSend.bind(this); this.updateUsername = this.updateUsername.bind(this); this.updateFirstName = this.updateFirstName.bind(this); @@ -30,6 +31,7 @@ export default class UserSettingsGeneralTab extends React.Component { this.updateEmail = this.updateEmail.bind(this); this.updateConfirmEmail = this.updateConfirmEmail.bind(this); this.updatePicture = this.updatePicture.bind(this); + this.updateCtrlSend = this.updateCtrlSend.bind(this); this.updateSection = this.updateSection.bind(this); this.handleClose = this.handleClose.bind(this); @@ -176,6 +178,13 @@ export default class UserSettingsGeneralTab extends React.Component { }.bind(this) ); } + submitCtrlSend(e) { + e.preventDefault(); + + var user = UserStore.getCurrentUser(); + user.props = this.state.props; + this.submitUser(user, true); + } updateUsername(e) { this.setState({username: e.target.value}); } @@ -194,6 +203,11 @@ export default class UserSettingsGeneralTab extends React.Component { updateConfirmEmail(e) { this.setState({confirmEmail: e.target.value}); } + updateCtrlSend(value) { + let props = this.state.props; + props.ctrlSend = value; + this.setState({props}); + } updatePicture(e) { if (e.target.files && e.target.files[0]) { this.setState({picture: e.target.files[0]}); @@ -228,7 +242,8 @@ export default class UserSettingsGeneralTab extends React.Component { var user = props.user; return {username: user.username, firstName: user.first_name, lastName: user.last_name, nickname: user.nickname, - email: user.email, confirmEmail: '', picture: null, loadingPicture: false, emailChangeInProgress: false}; + email: user.email, confirmEmail: '', picture: null, loadingPicture: false, emailChangeInProgress: false, + props: user.props}; } render() { var user = this.props.user; @@ -570,6 +585,76 @@ export default class UserSettingsGeneralTab extends React.Component { /> ); } + + var miscellaneousSection; + var describeCtrlSend = this.state.props.ctrlSend === 'true' ? 'On' : 'Off'; + if (this.props.activeSection === 'ctrlSend') { + var ctrlSendActive = [false, false]; + if (this.state.props.ctrlSend === 'true') { + ctrlSendActive[0] = true; + } else { + ctrlSendActive[1] = true; + } + + let ctrlSendInputs = []; + ctrlSendInputs.push( +
+
+
+ +
+
+
+ +
+
+

{'If enabled \'Enter\' inserts a new line and ctrl + enter submits the message.'}
+
+
+ ); + + miscellaneousSection = ( + + ); + } else { + miscellaneousSection = ( + + ); + } + return (
@@ -601,6 +686,8 @@ export default class UserSettingsGeneralTab extends React.Component { {emailSection}
{pictureSection} +
+ {miscellaneousSection}
-- cgit v1.2.3-1-g7c22 From f7808d1172f53873b757e6c0f5a360b025b20d2e Mon Sep 17 00:00:00 2001 From: Florian Orben Date: Tue, 27 Oct 2015 23:18:59 +0100 Subject: add new user-setting section 'advanced' and remove ctrl-send setting from general tab --- .../components/user_settings/user_settings.jsx | 12 ++ .../user_settings/user_settings_advanced.jsx | 169 +++++++++++++++++++++ .../user_settings/user_settings_general.jsx | 88 +---------- .../user_settings/user_settings_modal.jsx | 1 + 4 files changed, 183 insertions(+), 87 deletions(-) create mode 100644 web/react/components/user_settings/user_settings_advanced.jsx (limited to 'web/react/components/user_settings') diff --git a/web/react/components/user_settings/user_settings.jsx b/web/react/components/user_settings/user_settings.jsx index 15bf961d6..546e26ca3 100644 --- a/web/react/components/user_settings/user_settings.jsx +++ b/web/react/components/user_settings/user_settings.jsx @@ -10,6 +10,7 @@ var AppearanceTab = require('./user_settings_appearance.jsx'); var DeveloperTab = require('./user_settings_developer.jsx'); var IntegrationsTab = require('./user_settings_integrations.jsx'); var DisplayTab = require('./user_settings_display.jsx'); +var AdvancedTab = require('./user_settings_advanced.jsx'); export default class UserSettings extends React.Component { constructor(props) { @@ -110,6 +111,17 @@ export default class UserSettings extends React.Component { />
); + } else if (this.props.activeTab === 'advanced') { + return ( +
+ +
+ ); } return
; diff --git a/web/react/components/user_settings/user_settings_advanced.jsx b/web/react/components/user_settings/user_settings_advanced.jsx new file mode 100644 index 000000000..910444735 --- /dev/null +++ b/web/react/components/user_settings/user_settings_advanced.jsx @@ -0,0 +1,169 @@ +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +const Client = require('../../utils/client.jsx'); +const SettingItemMin = require('../setting_item_min.jsx'); +const SettingItemMax = require('../setting_item_max.jsx'); +const Constants = require('../../utils/constants.jsx'); +const PreferenceStore = require('../../stores/preference_store.jsx'); + +export default class AdvancedSettingsDisplay extends React.Component { + constructor(props) { + super(props); + + this.updateSection = this.updateSection.bind(this); + this.updateSetting = this.updateSetting.bind(this); + this.handleClose = this.handleClose.bind(this); + this.setupInitialState = this.setupInitialState.bind(this); + + this.state = this.setupInitialState(); + } + + setupInitialState() { + const sendOnCtrlEnter = PreferenceStore.getPreference( + Constants.Preferences.CATEGORY_ADVANCED_SETTINGS, + 'send_on_ctrl_enter', + {value: 'false'} + ).value; + + return { + settings: {send_on_ctrl_enter: sendOnCtrlEnter} + }; + } + + updateSetting(setting, value) { + const settings = this.state.settings; + settings[setting] = value; + this.setState(settings); + } + + handleSubmit(setting) { + const preference = PreferenceStore.setPreference( + Constants.Preferences.CATEGORY_ADVANCED_SETTINGS, + setting, + this.state.settings[setting] + ); + + Client.savePreferences([preference], + () => { + PreferenceStore.emitChange(); + this.updateSection(''); + }, + (err) => { + this.setState({serverError: err.message}); + } + ); + } + + updateSection(section) { + this.props.updateSection(section); + } + + handleClose() { + this.updateSection(''); + } + + componentDidMount() { + $('#user_settings').on('hidden.bs.modal', this.handleClose); + } + + componentWillUnmount() { + $('#user_settings').off('hidden.bs.modal', this.handleClose); + } + + render() { + const serverError = this.state.serverError || null; + let ctrlSendSection; + + if (this.props.activeSection === 'advancedCtrlSend') { + const ctrlSendActive = [ + this.state.settings.send_on_ctrl_enter === 'true', + this.state.settings.send_on_ctrl_enter === 'false' + ]; + + const inputs = [ +
+
+ +
+
+
+ +
+
+

{'If enabled \'Enter\' inserts a new line and \'Ctrl + Enter\' submits the message.'}
+
+ ]; + + ctrlSendSection = ( + this.handleSubmit('send_on_ctrl_enter')} + server_error={serverError} + updateSection={(e) => { + this.updateSection(''); + e.preventDefault(); + }} + /> + ); + } else { + ctrlSendSection = ( + this.props.updateSection('advancedCtrlSend')} + /> + ); + } + + return ( +
+
+ +

+ + {'Advanced Settings'} +

+
+
+

{'Advanced Settings'}

+
+ {ctrlSendSection} +
+
+
+ ); + } +} + +AdvancedSettingsDisplay.propTypes = { + user: React.PropTypes.object, + updateSection: React.PropTypes.func, + updateTab: React.PropTypes.func, + activeSection: React.PropTypes.string +}; diff --git a/web/react/components/user_settings/user_settings_general.jsx b/web/react/components/user_settings/user_settings_general.jsx index 6b7f1ad51..3adac197a 100644 --- a/web/react/components/user_settings/user_settings_general.jsx +++ b/web/react/components/user_settings/user_settings_general.jsx @@ -22,7 +22,6 @@ export default class UserSettingsGeneralTab extends React.Component { this.submitEmail = this.submitEmail.bind(this); this.submitUser = this.submitUser.bind(this); this.submitPicture = this.submitPicture.bind(this); - this.submitCtrlSend = this.submitCtrlSend.bind(this); this.updateUsername = this.updateUsername.bind(this); this.updateFirstName = this.updateFirstName.bind(this); @@ -31,7 +30,6 @@ export default class UserSettingsGeneralTab extends React.Component { this.updateEmail = this.updateEmail.bind(this); this.updateConfirmEmail = this.updateConfirmEmail.bind(this); this.updatePicture = this.updatePicture.bind(this); - this.updateCtrlSend = this.updateCtrlSend.bind(this); this.updateSection = this.updateSection.bind(this); this.handleClose = this.handleClose.bind(this); @@ -178,13 +176,6 @@ export default class UserSettingsGeneralTab extends React.Component { }.bind(this) ); } - submitCtrlSend(e) { - e.preventDefault(); - - var user = UserStore.getCurrentUser(); - user.props = this.state.props; - this.submitUser(user, true); - } updateUsername(e) { this.setState({username: e.target.value}); } @@ -203,11 +194,6 @@ export default class UserSettingsGeneralTab extends React.Component { updateConfirmEmail(e) { this.setState({confirmEmail: e.target.value}); } - updateCtrlSend(value) { - let props = this.state.props; - props.ctrlSend = value; - this.setState({props}); - } updatePicture(e) { if (e.target.files && e.target.files[0]) { this.setState({picture: e.target.files[0]}); @@ -242,8 +228,7 @@ export default class UserSettingsGeneralTab extends React.Component { var user = props.user; return {username: user.username, firstName: user.first_name, lastName: user.last_name, nickname: user.nickname, - email: user.email, confirmEmail: '', picture: null, loadingPicture: false, emailChangeInProgress: false, - props: user.props}; + email: user.email, confirmEmail: '', picture: null, loadingPicture: false, emailChangeInProgress: false}; } render() { var user = this.props.user; @@ -586,75 +571,6 @@ export default class UserSettingsGeneralTab extends React.Component { ); } - var miscellaneousSection; - var describeCtrlSend = this.state.props.ctrlSend === 'true' ? 'On' : 'Off'; - if (this.props.activeSection === 'ctrlSend') { - var ctrlSendActive = [false, false]; - if (this.state.props.ctrlSend === 'true') { - ctrlSendActive[0] = true; - } else { - ctrlSendActive[1] = true; - } - - let ctrlSendInputs = []; - ctrlSendInputs.push( -
-
-
- -
-
-
- -
-
-

{'If enabled \'Enter\' inserts a new line and ctrl + enter submits the message.'}
-
-
- ); - - miscellaneousSection = ( - - ); - } else { - miscellaneousSection = ( - - ); - } - return (
@@ -686,8 +602,6 @@ export default class UserSettingsGeneralTab extends React.Component { {emailSection}
{pictureSection} -
- {miscellaneousSection}
diff --git a/web/react/components/user_settings/user_settings_modal.jsx b/web/react/components/user_settings/user_settings_modal.jsx index 5449ae91e..18dd490e7 100644 --- a/web/react/components/user_settings/user_settings_modal.jsx +++ b/web/react/components/user_settings/user_settings_modal.jsx @@ -43,6 +43,7 @@ export default class UserSettingsModal extends React.Component { tabs.push({name: 'integrations', uiName: 'Integrations', icon: 'glyphicon glyphicon-transfer'}); } tabs.push({name: 'display', uiName: 'Display', icon: 'glyphicon glyphicon-eye-open'}); + tabs.push({name: 'advanced', uiName: 'Advanced', icon: 'glyphicon glyphicon-list-alt'}); return (
Date: Wed, 28 Oct 2015 13:09:39 -0400 Subject: Revert "PLT-395: Add syntax highlighting to Markdown code blocks" --- .../user_settings/code_theme_chooser.jsx | 55 ---------------------- .../user_settings/user_settings_appearance.jsx | 23 +-------- 2 files changed, 1 insertion(+), 77 deletions(-) delete mode 100644 web/react/components/user_settings/code_theme_chooser.jsx (limited to 'web/react/components/user_settings') diff --git a/web/react/components/user_settings/code_theme_chooser.jsx b/web/react/components/user_settings/code_theme_chooser.jsx deleted file mode 100644 index eef4b24ba..000000000 --- a/web/react/components/user_settings/code_theme_chooser.jsx +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -var Constants = require('../../utils/constants.jsx'); - -export default class CodeThemeChooser extends React.Component { - constructor(props) { - super(props); - this.state = {}; - } - render() { - const theme = this.props.theme; - - const premadeThemes = []; - for (const k in Constants.CODE_THEMES) { - if (Constants.CODE_THEMES.hasOwnProperty(k)) { - let activeClass = ''; - if (k === theme.codeTheme) { - activeClass = 'active'; - } - - premadeThemes.push( -
-
this.props.updateTheme(k)} - > - -
-
- ); - } - } - - return ( -
- {premadeThemes} -
- ); - } -} - -CodeThemeChooser.propTypes = { - theme: React.PropTypes.object.isRequired, - updateTheme: React.PropTypes.func.isRequired -}; diff --git a/web/react/components/user_settings/user_settings_appearance.jsx b/web/react/components/user_settings/user_settings_appearance.jsx index e94894a1d..8c62a189d 100644 --- a/web/react/components/user_settings/user_settings_appearance.jsx +++ b/web/react/components/user_settings/user_settings_appearance.jsx @@ -7,7 +7,6 @@ var Utils = require('../../utils/utils.jsx'); const CustomThemeChooser = require('./custom_theme_chooser.jsx'); const PremadeThemeChooser = require('./premade_theme_chooser.jsx'); -const CodeThemeChooser = require('./code_theme_chooser.jsx'); const AppDispatcher = require('../../dispatcher/app_dispatcher.jsx'); const Constants = require('../../utils/constants.jsx'); const ActionTypes = Constants.ActionTypes; @@ -19,14 +18,12 @@ export default class UserSettingsAppearance extends React.Component { this.onChange = this.onChange.bind(this); this.submitTheme = this.submitTheme.bind(this); this.updateTheme = this.updateTheme.bind(this); - this.updateCodeTheme = this.updateCodeTheme.bind(this); this.handleClose = this.handleClose.bind(this); this.handleImportModal = this.handleImportModal.bind(this); this.state = this.getStateFromStores(); this.originalTheme = this.state.theme; - this.originalCodeTheme = this.state.theme.codeTheme; } componentDidMount() { UserStore.addChangeListener(this.onChange); @@ -61,10 +58,6 @@ export default class UserSettingsAppearance extends React.Component { type = 'custom'; } - if (!theme.codeTheme) { - theme.codeTheme = Constants.DEFAULT_CODE_THEME; - } - return {theme, type}; } onChange() { @@ -100,13 +93,6 @@ export default class UserSettingsAppearance extends React.Component { ); } updateTheme(theme) { - theme.codeTheme = this.state.theme.codeTheme; - this.setState({theme}); - Utils.applyTheme(theme); - } - updateCodeTheme(codeTheme) { - var theme = this.state.theme; - theme.codeTheme = codeTheme; this.setState({theme}); Utils.applyTheme(theme); } @@ -116,7 +102,6 @@ export default class UserSettingsAppearance extends React.Component { handleClose() { const state = this.getStateFromStores(); state.serverError = null; - state.theme.codeTheme = this.originalCodeTheme; Utils.applyTheme(state.theme); @@ -185,13 +170,7 @@ export default class UserSettingsAppearance extends React.Component {
{custom}
- {'Code Theme'} - -
- {serverError} + {serverError}