summaryrefslogtreecommitdiffstats
path: root/web/react/components
diff options
context:
space:
mode:
Diffstat (limited to 'web/react/components')
-rw-r--r--web/react/components/admin_console/image_settings.jsx5
-rw-r--r--web/react/components/admin_console/user_item.jsx4
-rw-r--r--web/react/components/delete_post_modal.jsx2
-rw-r--r--web/react/components/member_list_item.jsx4
-rw-r--r--web/react/components/member_list_team_item.jsx4
-rw-r--r--web/react/components/more_channels.jsx2
-rw-r--r--web/react/components/posts_view.jsx6
-rw-r--r--web/react/components/search_results.jsx30
-rw-r--r--web/react/components/search_results_item.jsx6
-rw-r--r--web/react/components/signup_user_complete.jsx11
-rw-r--r--web/react/components/user_settings/manage_command_hooks.jsx272
-rw-r--r--web/react/components/user_settings/user_settings_integrations.jsx4
-rw-r--r--web/react/components/user_settings/user_settings_modal.jsx15
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'});