diff options
Diffstat (limited to 'web/react/components')
-rw-r--r-- | web/react/components/admin_console/image_settings.jsx | 5 | ||||
-rw-r--r-- | web/react/components/admin_console/user_item.jsx | 4 | ||||
-rw-r--r-- | web/react/components/delete_post_modal.jsx | 2 | ||||
-rw-r--r-- | web/react/components/member_list_item.jsx | 4 | ||||
-rw-r--r-- | web/react/components/member_list_team_item.jsx | 4 | ||||
-rw-r--r-- | web/react/components/more_channels.jsx | 2 | ||||
-rw-r--r-- | web/react/components/posts_view.jsx | 6 | ||||
-rw-r--r-- | web/react/components/search_results.jsx | 30 | ||||
-rw-r--r-- | web/react/components/search_results_item.jsx | 6 | ||||
-rw-r--r-- | web/react/components/signup_user_complete.jsx | 11 | ||||
-rw-r--r-- | web/react/components/user_settings/manage_command_hooks.jsx | 272 | ||||
-rw-r--r-- | web/react/components/user_settings/user_settings_integrations.jsx | 4 | ||||
-rw-r--r-- | web/react/components/user_settings/user_settings_modal.jsx | 15 |
13 files changed, 207 insertions, 158 deletions
diff --git a/web/react/components/admin_console/image_settings.jsx b/web/react/components/admin_console/image_settings.jsx index 12bf554ea..86f78e093 100644 --- a/web/react/components/admin_console/image_settings.jsx +++ b/web/react/components/admin_console/image_settings.jsx @@ -8,10 +8,6 @@ import crypto from 'crypto'; import {injectIntl, intlShape, defineMessages, FormattedMessage} from 'mm-intl'; const holders = defineMessages({ - storeDisabled: { - id: 'admin.image.storeDisabled', - defaultMessage: 'Disable File Storage' - }, storeLocal: { id: 'admin.image.storeLocal', defaultMessage: 'Local File System' @@ -242,7 +238,6 @@ class FileSettings extends React.Component { defaultValue={this.props.config.FileSettings.DriverName} onChange={this.handleChange.bind(this, 'DriverName')} > - <option value=''>{formatMessage(holders.storeDisabled)}</option> <option value='local'>{formatMessage(holders.storeLocal)}</option> <option value='amazons3'>{formatMessage(holders.storeAmazonS3)}</option> </select> diff --git a/web/react/components/admin_console/user_item.jsx b/web/react/components/admin_console/user_item.jsx index 02b01b090..0c1a55cc1 100644 --- a/web/react/components/admin_console/user_item.jsx +++ b/web/react/components/admin_console/user_item.jsx @@ -360,8 +360,8 @@ export default class UserItem extends React.Component { height='36' width='36' /> - <span className='member-name'>{Utils.getDisplayName(user)}</span> - <span className='member-email'>{email}</span> + <span className='more-name'>{Utils.getDisplayName(user)}</span> + <span className='more-description'>{email}</span> <div className='dropdown member-drop'> <a href='#' diff --git a/web/react/components/delete_post_modal.jsx b/web/react/components/delete_post_modal.jsx index 65ffa96a1..95b2e58a8 100644 --- a/web/react/components/delete_post_modal.jsx +++ b/web/react/components/delete_post_modal.jsx @@ -173,7 +173,7 @@ export default class DeletePostModal extends React.Component { <Modal.Body> <FormattedMessage id='delete_post.question' - defaultMessage='Are you sure you want to delete this ${term}?' + defaultMessage='Are you sure you want to delete this {term}?' values={{ term: (postTerm) }} diff --git a/web/react/components/member_list_item.jsx b/web/react/components/member_list_item.jsx index c50ee5c96..41ea58eeb 100644 --- a/web/react/components/member_list_item.jsx +++ b/web/react/components/member_list_item.jsx @@ -124,8 +124,8 @@ export default class MemberListItem extends React.Component { height='36' width='36' /> - <div className='member-name'>{Utils.displayUsername(member.id)}</div> - <div className='member-description'>{member.email}</div> + <div className='more-name'>{Utils.displayUsername(member.id)}</div> + <div className='more-description'>{member.email}</div> </td> <td className='td--action lg'>{invite}</td> </tr> diff --git a/web/react/components/member_list_team_item.jsx b/web/react/components/member_list_team_item.jsx index 6e1006911..30086d1b2 100644 --- a/web/react/components/member_list_team_item.jsx +++ b/web/react/components/member_list_team_item.jsx @@ -208,8 +208,8 @@ export default class MemberListTeamItem extends React.Component { height='36' width='36' /> - <span className='member-name'>{Utils.displayUsername(user.id)}</span> - <span className='member-email'>{email}</span> + <span className='more-name'>{Utils.displayUsername(user.id)}</span> + <span className='more-description'>{email}</span> <div className='dropdown member-drop'> <a href='#' diff --git a/web/react/components/more_channels.jsx b/web/react/components/more_channels.jsx index d12ea4703..d800f93d8 100644 --- a/web/react/components/more_channels.jsx +++ b/web/react/components/more_channels.jsx @@ -114,7 +114,7 @@ export default class MoreChannels extends React.Component { <tr key={channel.id}> <td> <p className='more-name'>{channel.display_name}</p> - <p className='more-purpose'>{channel.purpose}</p> + <p className='more-description'>{channel.purpose}</p> </td> <td className='td--action'> {joinButton} diff --git a/web/react/components/posts_view.jsx b/web/react/components/posts_view.jsx index f108ace2e..ebe19abad 100644 --- a/web/react/components/posts_view.jsx +++ b/web/react/components/posts_view.jsx @@ -94,7 +94,7 @@ export default class PostsView extends React.Component { }); } - this.scrollStopAction.fireAfter(1000); + this.scrollStopAction.fireAfter(2000); } handleScrollStop() { this.setState({ @@ -564,6 +564,8 @@ function ScrollToBottomArrows({isScrolling, atBottom, onClick}) { <div className={className} onClick={onClick} - /> + > + <span dangerouslySetInnerHTML={{__html: Constants.SCROLL_BOTTOM_ICON}} /> + </div> ); } diff --git a/web/react/components/search_results.jsx b/web/react/components/search_results.jsx index 9dcc99061..4adc3afe0 100644 --- a/web/react/components/search_results.jsx +++ b/web/react/components/search_results.jsx @@ -1,6 +1,7 @@ // Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. +import ChannelStore from '../stores/channel_store.jsx'; import SearchStore from '../stores/search_store.jsx'; import UserStore from '../stores/user_store.jsx'; import SearchBox from './search_bar.jsx'; @@ -11,7 +12,22 @@ import SearchResultsItem from './search_results_item.jsx'; import {FormattedMessage, FormattedHTMLMessage} from 'mm-intl'; function getStateFromStores() { - return {results: SearchStore.getSearchResults()}; + const results = SearchStore.getSearchResults(); + + const channels = new Map(); + const channelIds = results.order.map((postId) => results.posts[postId].channel_id); + for (const id of channelIds) { + if (channels.has(id)) { + continue; + } + + channels.set(id, ChannelStore.get(id)); + } + + return { + results, + channels + }; } export default class SearchResults extends React.Component { @@ -33,16 +49,22 @@ export default class SearchResults extends React.Component { componentDidMount() { this.mounted = true; SearchStore.addSearchChangeListener(this.onChange); + ChannelStore.addChangeListener(this.onChange); this.resize(); window.addEventListener('resize', this.handleResize); } + shouldComponentUpdate(nextProps, nextState) { + return !Utils.areObjectsEqual(this.props, nextProps) || !Utils.areObjectsEqual(this.state, nextState); + } + componentDidUpdate() { this.resize(); } componentWillUnmount() { SearchStore.removeSearchChangeListener(this.onChange); + ChannelStore.removeChangeListener(this.onChange); this.mounted = false; window.removeEventListener('resize', this.handleResize); } @@ -56,10 +78,7 @@ export default class SearchResults extends React.Component { onChange() { if (this.mounted) { - var newState = getStateFromStores(); - if (!Utils.areObjectsEqual(newState, this.state)) { - this.setState(newState); - } + this.setState(getStateFromStores()); } } @@ -116,6 +135,7 @@ export default class SearchResults extends React.Component { return ( <SearchResultsItem key={post.id} + channel={this.state.channels.get(post.channel_id)} post={post} term={searchTerm} isMentionSearch={this.props.isMentionSearch} diff --git a/web/react/components/search_results_item.jsx b/web/react/components/search_results_item.jsx index 544ba920a..d3533037f 100644 --- a/web/react/components/search_results_item.jsx +++ b/web/react/components/search_results_item.jsx @@ -1,7 +1,6 @@ // Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. -import ChannelStore from '../stores/channel_store.jsx'; import UserStore from '../stores/user_store.jsx'; import UserProfile from './user_profile.jsx'; import * as EventHelpers from '../dispatcher/event_helpers.jsx'; @@ -37,8 +36,8 @@ export default class SearchResultsItem extends React.Component { } render() { - var channelName = ''; - var channel = ChannelStore.get(this.props.post.channel_id); + var channelName = null; + const channel = this.props.channel; var timestamp = UserStore.getCurrentUser().update_at; if (channel) { @@ -136,6 +135,7 @@ export default class SearchResultsItem extends React.Component { SearchResultsItem.propTypes = { post: React.PropTypes.object, + channel: React.PropTypes.object, isMentionSearch: React.PropTypes.bool, term: React.PropTypes.string }; diff --git a/web/react/components/signup_user_complete.jsx b/web/react/components/signup_user_complete.jsx index 672213d1a..b770a2a2c 100644 --- a/web/react/components/signup_user_complete.jsx +++ b/web/react/components/signup_user_complete.jsx @@ -362,6 +362,17 @@ class SignupUserComplete extends React.Component { ); } + if (signupMessage.length === 0 && !emailSignup) { + emailSignup = ( + <div> + <FormattedMessage + id='signup_user_completed.none' + defaultMessage='No user creation method has been enabled. Please contact an administrator for access.' + /> + </div> + ); + } + return ( <div> <form> diff --git a/web/react/components/user_settings/manage_command_hooks.jsx b/web/react/components/user_settings/manage_command_hooks.jsx index d23d2957e..f4009aeaa 100644 --- a/web/react/components/user_settings/manage_command_hooks.jsx +++ b/web/react/components/user_settings/manage_command_hooks.jsx @@ -18,7 +18,7 @@ const holders = defineMessages({ }, addDisplayNamePlaceholder: { id: 'user.settings.cmds.add_display_name.placeholder', - defaultMessage: 'Display Name' + defaultMessage: 'Example: "Search patient records"' }, addUsernamePlaceholder: { id: 'user.settings.cmds.add_username.placeholder', @@ -30,11 +30,11 @@ const holders = defineMessages({ }, addAutoCompleteDescPlaceholder: { id: 'user.settings.cmds.auto_complete_desc.placeholder', - defaultMessage: 'A short description of what this commands does.' + defaultMessage: 'Example: "Returns search results for patient records"' }, addAutoCompleteHintPlaceholder: { id: 'user.settings.cmds.auto_complete_hint.placeholder', - defaultMessage: '[zipcode]' + defaultMessage: 'Example: [Patient Name]' }, adUrlPlaceholder: { id: 'user.settings.cmds.url.placeholder', @@ -261,7 +261,7 @@ export default class ManageCommandCmds extends React.Component { <strong> <FormattedMessage id='user.settings.cmds.trigger' - defaultMessage='Trigger: ' + defaultMessage='Command Trigger Word: ' /> </strong>{cmd.trigger} </div> @@ -271,21 +271,43 @@ export default class ManageCommandCmds extends React.Component { cmds.push( <div key={cmd.id} - className='webcmd__item' + className='webhook__item webcmd__item' > + {triggerDiv} + <div className='padding-top x2 webcmd__url'> + <strong> + <FormattedMessage + id='user.settings.cmds.url' + defaultMessage='Request URL: ' + /> + </strong><span className='word-break--all'>{cmd.url}</span> + </div> <div className='padding-top x2'> <strong> <FormattedMessage - id='user.settings.cmds.display_name' - defaultMessage='Display Name: ' + id='user.settings.cmds.request_type' + defaultMessage='Request Method: ' /> - </strong><span className='word-break--all'>{cmd.display_name}</span> + </strong> + <span className='word-break--all'> + { + cmd.method === 'P' ? + <FormattedMessage + id='user.settings.cmds.request_type_post' + defaultMessage='POST' + /> : + <FormattedMessage + id='user.settings.cmds.request_type_get' + defaultMessage='GET' + /> + } + </span> </div> <div className='padding-top x2'> <strong> <FormattedMessage id='user.settings.cmds.username' - defaultMessage='Username: ' + defaultMessage='Response Username: ' /> </strong><span className='word-break--all'>{cmd.username}</span> </div> @@ -293,7 +315,7 @@ export default class ManageCommandCmds extends React.Component { <strong> <FormattedMessage id='user.settings.cmds.icon_url' - defaultMessage='Icon URL: ' + defaultMessage='Response Icon: ' /> </strong><span className='word-break--all'>{cmd.icon_url}</span> </div> @@ -301,56 +323,34 @@ export default class ManageCommandCmds extends React.Component { <strong> <FormattedMessage id='user.settings.cmds.auto_complete' - defaultMessage='Auto Complete: ' + defaultMessage='Autocomplete: ' /> </strong><span className='word-break--all'>{cmd.auto_complete ? this.props.intl.formatMessage(holders.autocompleteYes) : this.props.intl.formatMessage(holders.autocompleteNo)}</span> </div> <div className='padding-top x2'> <strong> <FormattedMessage - id='user.settings.cmds.auto_complete_desc' - defaultMessage='Auto Complete Description: ' - /> - </strong><span className='word-break--all'>{cmd.auto_complete_desc}</span> - </div> - <div className='padding-top x2'> - <strong> - <FormattedMessage id='user.settings.cmds.auto_complete_hint' - defaultMessage='Auto Complete Hint: ' + defaultMessage='Autocomplete Hint: ' /> </strong><span className='word-break--all'>{cmd.auto_complete_hint}</span> </div> <div className='padding-top x2'> <strong> <FormattedMessage - id='user.settings.cmds.request_type' - defaultMessage='Request Type: ' + id='user.settings.cmds.auto_complete_desc' + defaultMessage='Autocomplete Description: ' /> - </strong> - <span className='word-break--all'> - { - cmd.method === 'P' ? - <FormattedMessage - id='user.settings.cmds.request_type_post' - defaultMessage='POST' - /> : - <FormattedMessage - id='user.settings.cmds.request_type_get' - defaultMessage='GET' - /> - } - </span> + </strong><span className='word-break--all'>{cmd.auto_complete_desc}</span> </div> - <div className='padding-top x2 webcmd__url'> + <div className='padding-top x2'> <strong> <FormattedMessage - id='user.settings.cmds.url' - defaultMessage='URL: ' + id='user.settings.cmds.display_name' + defaultMessage='Descriptive Label: ' /> - </strong><span className='word-break--all'>{cmd.url}</span> + </strong><span className='word-break--all'>{cmd.display_name}</span> </div> - {triggerDiv} <div className='padding-top'> <strong> <FormattedMessage @@ -400,7 +400,7 @@ export default class ManageCommandCmds extends React.Component { } const existingCmds = ( - <div className='webcmds__container'> + <div className='webhooks__container webcmds__container'> <label className='control-label padding-top x2'> <FormattedMessage id='user.settings.cmds.existing' @@ -408,7 +408,7 @@ export default class ManageCommandCmds extends React.Component { /> </label> <div className='padding-top divider-light'></div> - <div className='webcmds__list'> + <div className='webhooks__list webcmds__list'> {displayCmds} </div> </div> @@ -420,7 +420,7 @@ export default class ManageCommandCmds extends React.Component { <div key='addCommandCmd'> <FormattedHTMLMessage id='user.settings.cmds.add_desc' - defaultMessage='Create commands to send message events to an external integration. Please see <a href="http://mattermost.org/commands">http://mattermost.org/commands</a> to learn more.' + defaultMessage='Create slash commands to send events to external integrations and receive a response. For example typing `/patient Joe Smith` could bring back search results from your internal health records management system for the name “Joe Smith”. Please see <a href="http://docs.mattermost.com/developer/slash-commands.html">Slash commands documentation</a> for detailed instructions.' /> <div><label className='control-label padding-top x2'> <FormattedMessage @@ -430,103 +430,139 @@ export default class ManageCommandCmds extends React.Component { </label></div> <div className='padding-top divider-light'></div> <div className='padding-top'> + <div className='padding-top x2'> <label className='control-label'> <FormattedMessage - id='user.settings.cmds.display_name' - defaultMessage='Display Name: ' + id='user.settings.cmds.trigger' + defaultMessage='Command Trigger Word: ' /> </label> <div className='padding-top'> <input - ref='displayName' + ref='trigger' className='form-control' - value={this.state.cmd.display_name} - onChange={this.updateDisplayName} - placeholder={this.props.intl.formatMessage(holders.addDisplayNamePlaceholder)} + value={this.state.cmd.trigger} + onChange={this.updateTrigger} + placeholder={this.props.intl.formatMessage(holders.addTriggerPlaceholder)} /> </div> <div className='padding-top'> <FormattedMessage - id='user.settings.cmds.cmd_display_name' - defaultMessage='Command display name.' + id='user.settings.cmds.trigger_desc' + defaultMessage='Examples: /patient, /client, /employee Reserved: /echo, /join, /logout, /me, /shrug' /> </div> </div> + <div className='padding-top x2'> <label className='control-label'> <FormattedMessage - id='user.settings.cmds.username' - defaultMessage='Username: ' + id='user.settings.cmds.url' + defaultMessage='Request URL: ' /> </label> <div className='padding-top'> - <input - ref='username' - className='form-control' - value={this.state.cmd.username} - onChange={this.updateUsername} - placeholder={this.props.intl.formatMessage(holders.addUsernamePlaceholder)} + <input + ref='URL' + className='form-control' + value={this.state.cmd.url} + rows={1} + onChange={this.updateURL} + placeholder={this.props.intl.formatMessage(holders.adUrlPlaceholder)} + /> + </div> + <div className='padding-top'> + <FormattedMessage + id='user.settings.cmds.url_desc' + defaultMessage='The callback URL to receive the HTTP POST or GET event request when the slash command is run.' /> </div> + </div> + + <div className='padding-top x2'> + <label className='control-label'> + <FormattedMessage + id='user.settings.cmds.request_type' + defaultMessage='Request Method: ' + /> + </label> + <div className='padding-top'> + <select + ref='method' + className='form-control' + value={this.state.cmd.method} + onChange={this.updateMethod} + > + <option value='P'> + {this.props.intl.formatMessage(holders.requestTypePost)} + </option> + <option value='G'> + {this.props.intl.formatMessage(holders.requestTypeGet)} + </option> + </select> + </div> <div className='padding-top'> <FormattedMessage - id='user.settings.cmds.username_desc' - defaultMessage='The username to use when overriding the post.' + id='user.settings.cmds.request_type_desc' + defaultMessage='The type of command request issued to the Request URL.' /> </div> </div> + <div className='padding-top x2'> <label className='control-label'> <FormattedMessage - id='user.settings.cmds.icon_url' - defaultMessage='Icon URL: ' + id='user.settings.cmds.username' + defaultMessage='Response Username: ' /> </label> <div className='padding-top'> <input - ref='iconURL' + ref='username' className='form-control' - value={this.state.cmd.icon_url} - onChange={this.updateIconURL} - placeholder='https://www.example.com/myicon.png' + value={this.state.cmd.username} + onChange={this.updateUsername} + placeholder={this.props.intl.formatMessage(holders.addUsernamePlaceholder)} /> </div> <div className='padding-top'> <FormattedMessage - id='user.settings.cmds.icon_url_desc' - defaultMessage='URL to an icon' + id='user.settings.cmds.username_desc' + defaultMessage='Choose a username override for responses for this slash command. Usernames can consist of up to 22 characters consisting of lowercase letters, numbers and they symbols "-", "_", and "." .' /> </div> </div> + <div className='padding-top x2'> <label className='control-label'> <FormattedMessage - id='user.settings.cmds.trigger' - defaultMessage='Trigger: ' + id='user.settings.cmds.icon_url' + defaultMessage='Response Icon: ' /> </label> <div className='padding-top'> <input - ref='trigger' + ref='iconURL' className='form-control' - value={this.state.cmd.trigger} - onChange={this.updateTrigger} - placeholder={this.props.intl.formatMessage(holders.addTriggerPlaceholder)} + value={this.state.cmd.icon_url} + onChange={this.updateIconURL} + placeholder='https://www.example.com/myicon.png' /> </div> <div className='padding-top'> <FormattedMessage - id='user.settings.cmds.trigger_desc' - defaultMessage='Word to trigger on' + id='user.settings.cmds.icon_url_desc' + defaultMessage='Choose a profile picture override for the post responses to this slash command. Enter the URL of a .png or .jpg file at least 128 pixels by 128 pixels.' /> - {''}</div> + </div> </div> + <div className='padding-top x2'> <label className='control-label'> <FormattedMessage id='user.settings.cmds.auto_complete' - defaultMessage='Auto Complete: ' + defaultMessage='Autocomplete: ' /> </label> <div className='padding-top'> @@ -539,34 +575,18 @@ export default class ManageCommandCmds extends React.Component { /> <FormattedMessage id='user.settings.cmds.auto_complete_help' - defaultMessage=' Show this command in autocomplete list' + defaultMessage=' Show this command in the autocomplete list.' /> </label> </div> </div> </div> - <div className='padding-top x2'> - <label className='control-label'> - <FormattedMessage - id='user.settings.cmds.auto_complete_desc' - defaultMessage='Auto Complete Description: ' - /> - </label> - <div className='padding-top'> - <input - ref='autoCompleteDesc' - className='form-control' - value={this.state.cmd.auto_complete_desc} - onChange={this.updateAutoCompleteDesc} - placeholder={this.props.intl.formatMessage(holders.addAutoCompleteDescPlaceholder)} - /> - </div> - </div> + <div className='padding-top x2'> <label className='control-label'> <FormattedMessage id='user.settings.cmds.auto_complete_hint' - defaultMessage='Auto Complete Hint: ' + defaultMessage='Autocomplete Hint: ' /> </label> <div className='padding-top'> @@ -581,64 +601,60 @@ export default class ManageCommandCmds extends React.Component { <div className='padding-top'> <FormattedMessage id='user.settings.cmds.auto_complete_hint_desc' - defaultMessage='List parameters to be passed to the command.' + defaultMessage='Optional hint in the autocomplete list about parameters needed for command.' /> </div> </div> + <div className='padding-top x2'> <label className='control-label'> <FormattedMessage - id='user.settings.cmds.request_type' - defaultMessage='Request Type: ' + id='user.settings.cmds.auto_complete_desc' + defaultMessage='Autocomplete Description: ' /> </label> <div className='padding-top'> - <select - ref='method' + <input + ref='autoCompleteDesc' className='form-control' - value={this.state.cmd.method} - onChange={this.updateMethod} - > - <option value='P'> - {this.props.intl.formatMessage(holders.requestTypePost)} - </option> - <option value='G'> - {this.props.intl.formatMessage(holders.requestTypeGet)} - </option> - </select> + value={this.state.cmd.auto_complete_desc} + onChange={this.updateAutoCompleteDesc} + placeholder={this.props.intl.formatMessage(holders.addAutoCompleteDescPlaceholder)} + /> </div> <div className='padding-top'> <FormattedMessage - id='user.settings.cmds.request_type_desc' - defaultMessage='Command request type issued to the callback URL.' + id='user.settings.cmds.auto_complete_desc_desc' + defaultMessage='Optional short description of slash command for the autocomplete list.' /> </div> </div> + <div className='padding-top x2'> <label className='control-label'> <FormattedMessage - id='user.settings.cmds.url' - defaultMessage='URL: ' + id='user.settings.cmds.display_name' + defaultMessage='Descriptive Label: ' /> </label> <div className='padding-top'> - <input - ref='URL' - className='form-control' - value={this.state.cmd.url} - rows={1} - onChange={this.updateURL} - placeholder={this.props.intl.formatMessage(holders.adUrlPlaceholder)} - /> + <input + ref='displayName' + className='form-control' + value={this.state.cmd.display_name} + onChange={this.updateDisplayName} + placeholder={this.props.intl.formatMessage(holders.addDisplayNamePlaceholder)} + /> </div> <div className='padding-top'> <FormattedMessage - id='user.settings.cmds.url_desc' - defaultMessage='URL that will receive the HTTP POST or GET event' + id='user.settings.cmds.cmd_display_name' + defaultMessage='Brief description of slash command to show in listings.' /> </div> {addError} </div> + <div className='padding-top x2 padding-bottom'> <a className={'btn btn-sm btn-primary'} diff --git a/web/react/components/user_settings/user_settings_integrations.jsx b/web/react/components/user_settings/user_settings_integrations.jsx index 1a9edab03..07d5230d1 100644 --- a/web/react/components/user_settings/user_settings_integrations.jsx +++ b/web/react/components/user_settings/user_settings_integrations.jsx @@ -28,11 +28,11 @@ const holders = defineMessages({ }, cmdName: { id: 'user.settings.integrations.commands', - defaultMessage: 'Commands' + defaultMessage: 'Slash Commands' }, cmdDesc: { id: 'user.settings.integrations.commandsDescription', - defaultMessage: 'Manage your commands' + defaultMessage: 'Manage your slash commands' } }); diff --git a/web/react/components/user_settings/user_settings_modal.jsx b/web/react/components/user_settings/user_settings_modal.jsx index e0b72157b..a7541073e 100644 --- a/web/react/components/user_settings/user_settings_modal.jsx +++ b/web/react/components/user_settings/user_settings_modal.jsx @@ -113,6 +113,7 @@ class UserSettingsModal extends React.Component { return false; } + this.resetTheme(); this.deactivateTab(); this.props.onModalDismissed(); } @@ -215,15 +216,19 @@ class UserSettingsModal extends React.Component { this.showConfirmModal(() => this.updateSection(section, true)); } else { if (this.state.active_section === 'theme' && section !== 'theme') { - const user = UserStore.getCurrentUser(); - if (user.theme_props != null) { - Utils.applyTheme(user.theme_props); - } + this.resetTheme(); } this.setState({active_section: section}); } } + resetTheme() { + const user = UserStore.getCurrentUser(); + if (user.theme_props != null) { + Utils.applyTheme(user.theme_props); + } + } + render() { const {formatMessage} = this.props.intl; var tabs = []; @@ -234,7 +239,7 @@ class UserSettingsModal extends React.Component { tabs.push({name: 'developer', uiName: formatMessage(holders.developer), icon: 'glyphicon glyphicon-th'}); } - if (global.window.mm_config.EnableIncomingWebhooks === 'true' || global.window.mm_config.EnableOutgoingWebhooks === 'true') { + if (global.window.mm_config.EnableIncomingWebhooks === 'true' || global.window.mm_config.EnableOutgoingWebhooks === 'true' || global.window.mm_config.EnableCommands === 'true') { tabs.push({name: 'integrations', uiName: formatMessage(holders.integrations), icon: 'glyphicon glyphicon-transfer'}); } tabs.push({name: 'display', uiName: formatMessage(holders.display), icon: 'glyphicon glyphicon-eye-open'}); |