From c99db74390e98157acbee17e8286142eebbfe0f7 Mon Sep 17 00:00:00 2001 From: enahum Date: Wed, 7 Sep 2016 09:02:24 -0300 Subject: PLT-4084 Fix Unable to send messages in RC (#3983) --- webapp/components/edit_post_modal.jsx | 10 +++++++++- webapp/components/textbox.jsx | 13 +++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) (limited to 'webapp/components') diff --git a/webapp/components/edit_post_modal.jsx b/webapp/components/edit_post_modal.jsx index c2ffb2ed7..00c8e0f09 100644 --- a/webapp/components/edit_post_modal.jsx +++ b/webapp/components/edit_post_modal.jsx @@ -28,6 +28,7 @@ export default class EditPostModal extends React.Component { this.handleEdit = this.handleEdit.bind(this); this.handleEditKeyPress = this.handleEditKeyPress.bind(this); this.handleEditPostEvent = this.handleEditPostEvent.bind(this); + this.handleKeyDown = this.handleKeyDown.bind(this); this.handleInput = this.handleInput.bind(this); this.onPreferenceChange = this.onPreferenceChange.bind(this); this.onModalHidden = this.onModalHidden.bind(this); @@ -118,6 +119,12 @@ export default class EditPostModal extends React.Component { $(ReactDOM.findDOMNode(this.refs.modal)).modal('show'); } + handleKeyDown(e) { + if (this.state.ctrlSend && e.keyCode === KeyCodes.ENTER && e.ctrlKey === true) { + this.handleEdit(); + } + } + onPreferenceChange() { this.setState({ ctrlSend: PreferenceStore.getBool(Constants.Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter') @@ -222,7 +229,8 @@ export default class EditPostModal extends React.Component {
Date: Thu, 8 Sep 2016 08:48:12 -0400 Subject: PLT-3766 Change remaining LDAP references to AD/LDAP (#3985) * Update user.go * Update en.json * Update ldap_test_button.jsx * Update en.json --- webapp/components/admin_console/ldap_test_button.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'webapp/components') diff --git a/webapp/components/admin_console/ldap_test_button.jsx b/webapp/components/admin_console/ldap_test_button.jsx index 082c13b1b..16a433c23 100644 --- a/webapp/components/admin_console/ldap_test_button.jsx +++ b/webapp/components/admin_console/ldap_test_button.jsx @@ -71,7 +71,7 @@ export default class LdapTestButton extends React.Component { ); @@ -115,7 +115,7 @@ export default class LdapTestButton extends React.Component { contents = ( ); } -- cgit v1.2.3-1-g7c22 From b3f6011fdbe846ee6f769eaf1c85b40f912eeaaa Mon Sep 17 00:00:00 2001 From: Asaad Mahmood Date: Thu, 8 Sep 2016 17:48:29 +0500 Subject: Updating minor fixes for rc4 (#3988) --- webapp/components/login/login_controller.jsx | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'webapp/components') diff --git a/webapp/components/login/login_controller.jsx b/webapp/components/login/login_controller.jsx index 8335dce6f..117747ab9 100644 --- a/webapp/components/login/login_controller.jsx +++ b/webapp/components/login/login_controller.jsx @@ -459,6 +459,17 @@ export default class LoginController extends React.Component { ); } + if (gitlabSigninEnabled || samlSigninEnabled || office365SigninEnabled || googleSigninEnabled || gitlabSigninEnabled) { + loginControls.push( +
+ +
+ ); + } + if (gitlabSigninEnabled) { loginControls.push( Date: Thu, 8 Sep 2016 09:48:39 -0300 Subject: PLT-3880 Update the "Password Requirements" help text (#3989) --- .../components/admin_console/password_settings.jsx | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'webapp/components') diff --git a/webapp/components/admin_console/password_settings.jsx b/webapp/components/admin_console/password_settings.jsx index 1ebcc7707..ad805b38c 100644 --- a/webapp/components/admin_console/password_settings.jsx +++ b/webapp/components/admin_console/password_settings.jsx @@ -22,6 +22,8 @@ export default class PasswordSettings extends AdminSettings { this.getSampleErrorMsg = this.getSampleErrorMsg.bind(this); + this.handlePasswordLengthChange = this.handlePasswordLengthChange.bind(this); + this.state = Object.assign(this.state, { passwordMinimumLength: props.config.PasswordSettings.MinimumLength, passwordLowercase: props.config.PasswordSettings.Lowercase, @@ -54,17 +56,13 @@ export default class PasswordSettings extends AdminSettings { id={sampleErrorMsgId} default='Your password must be at least {min} characters.' values={{ - min: props.config.PasswordSettings.MinimumLength + min: (this.state.passwordMinimumLength || Constants.MIN_PASSWORD_LENGTH) }} /> ); } } - componentWillUpdate() { - this.sampleErrorMsg = this.getSampleErrorMsg(); - } - getConfigFromState(config) { if (global.window.mm_license.IsLicensed === 'true' && global.window.mm_license.PasswordRequirements === 'true') { config.PasswordSettings.MinimumLength = this.parseIntNonZero(this.state.passwordMinimumLength, Constants.MIN_PASSWORD_LENGTH); @@ -96,7 +94,7 @@ export default class PasswordSettings extends AdminSettings { }; } - getSampleErrorMsg() { + getSampleErrorMsg(minLength) { if (global.window.mm_license.IsLicensed === 'true' && global.window.mm_license.PasswordRequirements === 'true') { if (this.props.config.PasswordSettings.MinimumLength > Constants.MAX_PASSWORD_LENGTH || this.props.config.PasswordSettings.MinimumLength < Constants.MIN_PASSWORD_LENGTH) { return ( @@ -106,7 +104,6 @@ export default class PasswordSettings extends AdminSettings { /> ); } - let sampleErrorMsgId = 'user.settings.security.passwordError'; if (this.refs.lowercase.checked) { sampleErrorMsgId = sampleErrorMsgId + 'Lowercase'; @@ -125,7 +122,7 @@ export default class PasswordSettings extends AdminSettings { id={sampleErrorMsgId} default='Your password must be at least {min} characters.' values={{ - min: this.props.config.PasswordSettings.MinimumLength + min: (minLength || Constants.MIN_PASSWORD_LENGTH) }} /> ); @@ -134,6 +131,11 @@ export default class PasswordSettings extends AdminSettings { return null; } + handlePasswordLengthChange(id, value) { + this.sampleErrorMsg = this.getSampleErrorMsg(value); + this.handleChange(id, value); + } + renderTitle() { return (

@@ -193,7 +195,7 @@ export default class PasswordSettings extends AdminSettings { /> } value={this.state.passwordMinimumLength} - onChange={this.handleChange} + onChange={this.handlePasswordLengthChange} /> Date: Thu, 8 Sep 2016 08:48:53 -0400 Subject: PLT-4100 Made SuggestionList dividers optional (#3990) * Made SuggestionList dividers optional * Stopped mutating the User object in the AtMentionProvider --- .../components/suggestion/at_mention_provider.jsx | 21 ++++++--------------- webapp/components/suggestion/suggestion_box.jsx | 2 ++ webapp/components/suggestion/suggestion_list.jsx | 9 +++++++-- webapp/components/textbox.jsx | 1 + 4 files changed, 16 insertions(+), 17 deletions(-) (limited to 'webapp/components') diff --git a/webapp/components/suggestion/at_mention_provider.jsx b/webapp/components/suggestion/at_mention_provider.jsx index 87cdc6894..248e459b5 100644 --- a/webapp/components/suggestion/at_mention_provider.jsx +++ b/webapp/components/suggestion/at_mention_provider.jsx @@ -99,7 +99,7 @@ class AtMentionSuggestion extends Suggestion { } } -function filterUsersByPrefix(users, prefix, limit) { +function filterUsersByPrefix(users, prefix, limit, type) { const filtered = []; for (const id of Object.keys(users)) { @@ -117,7 +117,8 @@ function filterUsersByPrefix(users, prefix, limit) { (user.first_name && user.first_name.toLowerCase().startsWith(prefix)) || (user.last_name && user.last_name.toLowerCase().startsWith(prefix)) || (user.nickname && user.nickname.toLowerCase().startsWith(prefix))) { - filtered.push(user); + // create a new object here since we're mutating it by adding the type field + filtered.push(Object.assign({}, user, {type})); } } @@ -145,15 +146,15 @@ export default class AtMentionProvider { // Filter users by prefix. const filteredMembers = filterUsersByPrefix( - channelMembers, prefix, MaxUserSuggestions); + channelMembers, prefix, MaxUserSuggestions, Constants.MENTION_MEMBERS); const filteredNonmembers = filterUsersByPrefix( - channelNonmembers, prefix, MaxUserSuggestions - filteredMembers.length); + channelNonmembers, prefix, MaxUserSuggestions - filteredMembers.length, Constants.MENTION_NONMEMBERS); let filteredSpecialMentions = []; if (!pretext.startsWith('/msg')) { filteredSpecialMentions = ['here', 'channel', 'all'].filter((item) => { return item.startsWith(prefix); }).map((name) => { - return {username: name}; + return {username: name, type: Constants.MENTION_SPECIAL}; }); } @@ -173,16 +174,6 @@ export default class AtMentionProvider { }); }); - filteredMembers.forEach((item) => { - item.type = Constants.MENTION_MEMBERS; - }); - filteredNonmembers.forEach((item) => { - item.type = Constants.MENTION_NONMEMBERS; - }); - filteredSpecialMentions.forEach((item) => { - item.type = Constants.MENTION_SPECIAL; - }); - const filtered = filteredMembers.concat(filteredSpecialMentions).concat(filteredNonmembers); const mentions = filtered.map((user) => '@' + user.username); diff --git a/webapp/components/suggestion/suggestion_box.jsx b/webapp/components/suggestion/suggestion_box.jsx index d4b150787..d74038ead 100644 --- a/webapp/components/suggestion/suggestion_box.jsx +++ b/webapp/components/suggestion/suggestion_box.jsx @@ -189,6 +189,7 @@ export default class SuggestionBox extends React.Component {

); @@ -220,6 +221,7 @@ SuggestionBox.propTypes = { value: React.PropTypes.string.isRequired, providers: React.PropTypes.arrayOf(React.PropTypes.object), listStyle: React.PropTypes.string, + renderDividers: React.PropTypes.bool, // explicitly name any input event handlers we override and need to manually call onInput: React.PropTypes.func, diff --git a/webapp/components/suggestion/suggestion_list.jsx b/webapp/components/suggestion/suggestion_list.jsx index 7c746ac2a..7d8059e1e 100644 --- a/webapp/components/suggestion/suggestion_list.jsx +++ b/webapp/components/suggestion/suggestion_list.jsx @@ -121,7 +121,7 @@ export default class SuggestionList extends React.Component { // ReactComponent names need to be upper case when used in JSX const Component = this.state.components[i]; - if (item.type !== lastType) { + if (this.props.renderDividers && item.type !== lastType) { items.push(this.renderDivider(item.type)); lastType = item.type; } @@ -157,5 +157,10 @@ export default class SuggestionList extends React.Component { SuggestionList.propTypes = { suggestionId: React.PropTypes.string.isRequired, - location: React.PropTypes.string + location: React.PropTypes.string, + renderDividers: React.PropTypes.bool }; + +SuggestionList.defaultProps = { + renderDividers: false +}; \ No newline at end of file diff --git a/webapp/components/textbox.jsx b/webapp/components/textbox.jsx index fac1bd027..12f111833 100644 --- a/webapp/components/textbox.jsx +++ b/webapp/components/textbox.jsx @@ -198,6 +198,7 @@ export default class Textbox extends React.Component { providers={this.suggestionProviders} channelId={this.props.channelId} value={this.props.messageText} + renderDividers={true} />
Date: Thu, 8 Sep 2016 08:49:03 -0400 Subject: Displayed proper token on integration creation confirmation (#3991) --- .../integrations/components/add_command.jsx | 2 +- .../components/add_outgoing_webhook.jsx | 2 +- .../components/confirm_integration.jsx | 22 ++++++---------------- 3 files changed, 8 insertions(+), 18 deletions(-) (limited to 'webapp/components') diff --git a/webapp/components/integrations/components/add_command.jsx b/webapp/components/integrations/components/add_command.jsx index d71fb7c3f..e01358aa7 100644 --- a/webapp/components/integrations/components/add_command.jsx +++ b/webapp/components/integrations/components/add_command.jsx @@ -166,7 +166,7 @@ export default class AddCommand extends React.Component { AsyncClient.addCommand( command, (data) => { - browserHistory.push('/' + this.props.team.name + '/integrations/confirm?type=commands&id=' + data.token); + browserHistory.push('/' + this.props.team.name + '/integrations/confirm?type=commands&id=' + data.id); }, (err) => { this.setState({ diff --git a/webapp/components/integrations/components/add_outgoing_webhook.jsx b/webapp/components/integrations/components/add_outgoing_webhook.jsx index bf0d327ef..c3d9b0933 100644 --- a/webapp/components/integrations/components/add_outgoing_webhook.jsx +++ b/webapp/components/integrations/components/add_outgoing_webhook.jsx @@ -120,7 +120,7 @@ export default class AddOutgoingWebhook extends React.Component { AsyncClient.addOutgoingHook( hook, (data) => { - browserHistory.push('/' + this.props.team.name + '/integrations/confirm?type=outgoing_webhooks&id=' + data.token); + browserHistory.push('/' + this.props.team.name + '/integrations/confirm?type=outgoing_webhooks&id=' + data.id); }, (err) => { this.setState({ diff --git a/webapp/components/integrations/components/confirm_integration.jsx b/webapp/components/integrations/components/confirm_integration.jsx index bb26a9a8a..b9274f2e4 100644 --- a/webapp/components/integrations/components/confirm_integration.jsx +++ b/webapp/components/integrations/components/confirm_integration.jsx @@ -5,8 +5,7 @@ import React from 'react'; import BackstageHeader from 'components/backstage/components/backstage_header.jsx'; import {FormattedMessage, FormattedHTMLMessage} from 'react-intl'; -import {browserHistory, Link} from 'react-router/es6'; -import SpinnerButton from 'components/spinner_button.jsx'; +import {Link} from 'react-router/es6'; import UserStore from 'stores/user_store.jsx'; import IntegrationStore from 'stores/integration_store.jsx'; @@ -24,8 +23,6 @@ export default class ConfirmIntegration extends React.Component { constructor(props) { super(props); - this.handleDone = this.handleDone.bind(this); - this.handleIntegrationChange = this.handleIntegrationChange.bind(this); const userId = UserStore.getCurrentId(); @@ -55,13 +52,6 @@ export default class ConfirmIntegration extends React.Component { }); } - handleDone() { - browserHistory.push('/' + this.props.team.name + '/integrations/' + this.state.type); - this.setState({ - id: '' - }); - } - render() { let headerText = null; let helpText = null; @@ -87,7 +77,7 @@ export default class ConfirmIntegration extends React.Component { id='add_command.token' defaultMessage='Token: {token}' values={{ - token: this.state.id + token: IntegrationStore.getCommand(this.props.team.id, this.state.id).token }} />

@@ -139,7 +129,7 @@ export default class ConfirmIntegration extends React.Component { id='add_outgoing_webhook.token' defaultMessage='Token: {token}' values={{ - token: this.state.id + token: IntegrationStore.getOutgoingWebhook(this.props.team.id, this.state.id).token }} />

@@ -233,16 +223,16 @@ export default class ConfirmIntegration extends React.Component { {helpText} {tokenText}
- - +
-- cgit v1.2.3-1-g7c22 From 04ee6a6afb238ee81bf2476049ec2056e5c93e8b Mon Sep 17 00:00:00 2001 From: Harrison Healey Date: Thu, 8 Sep 2016 08:49:12 -0400 Subject: Stopped automatically focusing user list search box on mobile (#3992) --- webapp/components/filtered_user_list.jsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'webapp/components') diff --git a/webapp/components/filtered_user_list.jsx b/webapp/components/filtered_user_list.jsx index 67d038fd9..2f9a50d24 100644 --- a/webapp/components/filtered_user_list.jsx +++ b/webapp/components/filtered_user_list.jsx @@ -3,6 +3,7 @@ import $ from 'jquery'; import ReactDOM from 'react-dom'; +import * as UserAgent from 'utils/user_agent.jsx'; import UserList from './user_list.jsx'; import {intlShape, injectIntl, defineMessages, FormattedMessage} from 'react-intl'; @@ -60,7 +61,10 @@ class FilteredUserList extends React.Component { } componentDidMount() { - ReactDOM.findDOMNode(this.refs.filter).focus(); + // only focus the search box on desktop so that we don't cause the keyboard to open on mobile + if (!UserAgent.isMobileApp()) { + ReactDOM.findDOMNode(this.refs.filter).focus(); + } } componentDidUpdate(prevProps, prevState) { -- cgit v1.2.3-1-g7c22