summaryrefslogtreecommitdiffstats
path: root/web/react
diff options
context:
space:
mode:
Diffstat (limited to 'web/react')
-rw-r--r--web/react/components/admin_console/ldap_settings.jsx6
-rw-r--r--web/react/components/channel_members_modal.jsx1
-rw-r--r--web/react/components/file_attachment.jsx6
-rw-r--r--web/react/components/settings_sidebar.jsx4
-rw-r--r--web/react/components/signup_team.jsx14
-rw-r--r--web/react/components/team_general_tab.jsx4
-rw-r--r--web/react/components/team_import_tab.jsx5
-rw-r--r--web/react/components/team_members_dropdown.jsx2
-rw-r--r--web/react/components/team_settings_modal.jsx2
-rw-r--r--web/react/components/team_signup_choose_auth.jsx24
-rw-r--r--web/react/components/team_signup_with_ldap.jsx234
-rw-r--r--web/react/components/textbox.jsx2
-rw-r--r--web/react/components/user_settings/user_settings_advanced.jsx10
-rw-r--r--web/react/components/user_settings/user_settings_developer.jsx10
-rw-r--r--web/react/components/user_settings/user_settings_display.jsx10
-rw-r--r--web/react/components/user_settings/user_settings_general.jsx10
-rw-r--r--web/react/components/user_settings/user_settings_integrations.jsx10
-rw-r--r--web/react/components/user_settings/user_settings_notifications.jsx10
-rw-r--r--web/react/components/user_settings/user_settings_security.jsx10
-rw-r--r--web/react/stores/admin_store.jsx4
-rw-r--r--web/react/stores/analytics_store.jsx4
-rw-r--r--web/react/stores/channel_store.jsx4
-rw-r--r--web/react/stores/file_store.jsx7
-rw-r--r--web/react/stores/modal_store.jsx4
-rw-r--r--web/react/stores/post_store.jsx4
-rw-r--r--web/react/stores/search_store.jsx4
-rw-r--r--web/react/stores/suggestion_store.jsx7
-rw-r--r--web/react/stores/team_store.jsx4
-rw-r--r--web/react/stores/user_store.jsx4
-rw-r--r--web/react/utils/client.jsx15
-rw-r--r--web/react/utils/utils.jsx33
31 files changed, 408 insertions, 60 deletions
diff --git a/web/react/components/admin_console/ldap_settings.jsx b/web/react/components/admin_console/ldap_settings.jsx
index 535c264dd..4cd19c886 100644
--- a/web/react/components/admin_console/ldap_settings.jsx
+++ b/web/react/components/admin_console/ldap_settings.jsx
@@ -20,7 +20,7 @@ var holders = defineMessages({
},
baseEx: {
id: 'admin.ldap.baseEx',
- defaultMessage: 'Ex "dc=mydomain,dc=com"'
+ defaultMessage: 'Ex "ou=Unit Name,dc=corp,dc=example,dc=com"'
},
firstnameAttrEx: {
id: 'admin.ldap.firstnameAttrEx',
@@ -32,7 +32,7 @@ var holders = defineMessages({
},
emailAttrEx: {
id: 'admin.ldap.emailAttrEx',
- defaultMessage: 'Ex "mail"'
+ defaultMessage: 'Ex "mail" or "userPrincipalName"'
},
usernameAttrEx: {
id: 'admin.ldap.usernameAttrEx',
@@ -581,4 +581,4 @@ LdapSettings.propTypes = {
config: React.PropTypes.object
};
-export default injectIntl(LdapSettings); \ No newline at end of file
+export default injectIntl(LdapSettings);
diff --git a/web/react/components/channel_members_modal.jsx b/web/react/components/channel_members_modal.jsx
index 3ec93a616..dc8e3baaf 100644
--- a/web/react/components/channel_members_modal.jsx
+++ b/web/react/components/channel_members_modal.jsx
@@ -178,7 +178,6 @@ export default class ChannelMembersModal extends React.Component {
this.props.onModalDismissed();
}}
>
- <i className='glyphicon glyphicon-envelope'/>
<FormattedMessage
id='channel_members_modal.addNew'
defaultMessage=' Add New Members'
diff --git a/web/react/components/file_attachment.jsx b/web/react/components/file_attachment.jsx
index 6aeae638f..c719c6c7d 100644
--- a/web/react/components/file_attachment.jsx
+++ b/web/react/components/file_attachment.jsx
@@ -151,9 +151,9 @@ class FileAttachment extends React.Component {
this.setState({fileSize: parseInt(data.size, 10)});
}
}.bind(this),
- function error() {
- // Do nothing
- }
+ function error() {
+ // Do nothing
+ }
);
} else {
fileSizeString = utils.fileSizeToString(this.state.fileSize);
diff --git a/web/react/components/settings_sidebar.jsx b/web/react/components/settings_sidebar.jsx
index 90c0e8435..da8001f6f 100644
--- a/web/react/components/settings_sidebar.jsx
+++ b/web/react/components/settings_sidebar.jsx
@@ -4,10 +4,6 @@
import * as Utils from '../utils/utils.jsx';
export default class SettingsSidebar extends React.Component {
- componentDidUpdate() {
- $('.settings-modal').find('.modal-body').scrollTop(0);
- $('.settings-modal').find('.modal-body').perfectScrollbar('update');
- }
constructor(props) {
super(props);
diff --git a/web/react/components/signup_team.jsx b/web/react/components/signup_team.jsx
index 5e8ae117d..26c46dad0 100644
--- a/web/react/components/signup_team.jsx
+++ b/web/react/components/signup_team.jsx
@@ -4,6 +4,7 @@
import ChoosePage from './team_signup_choose_auth.jsx';
import EmailSignUpPage from './team_signup_with_email.jsx';
import SSOSignupPage from './team_signup_with_sso.jsx';
+import LdapSignUpPage from './team_signup_with_ldap.jsx';
import Constants from '../utils/constants.jsx';
import {FormattedMessage} from 'mm-intl';
@@ -24,12 +25,18 @@ export default class TeamSignUp extends React.Component {
count = count + 1;
}
+ if (global.window.mm_config.EnableLdap === 'true') {
+ count = count + 1;
+ }
+
if (count > 1) {
this.state = {page: 'choose'};
} else if (global.window.mm_config.EnableSignUpWithEmail === 'true') {
this.state = {page: 'email'};
} else if (global.window.mm_config.EnableSignUpWithGitLab === 'true') {
this.state = {page: 'gitlab'};
+ } else if (global.window.mm_config.EnableLdap === 'true') {
+ this.state = {page: 'ldap'};
} else {
this.state = {page: 'none'};
}
@@ -133,6 +140,13 @@ export default class TeamSignUp extends React.Component {
<EmailSignUpPage/>
</div>
);
+ } else if (this.state.page === 'ldap') {
+ return (
+ <div>
+ {teamListing}
+ <LdapSignUpPage/>
+ </div>
+ );
} else if (this.state.page === 'gitlab') {
return (
<div>
diff --git a/web/react/components/team_general_tab.jsx b/web/react/components/team_general_tab.jsx
index c1b2a2e7f..ef7410b2f 100644
--- a/web/react/components/team_general_tab.jsx
+++ b/web/react/components/team_general_tab.jsx
@@ -611,7 +611,9 @@ class GeneralTab extends React.Component {
className='modal-title'
ref='title'
>
- <i className='modal-back'></i>
+ <div className='modal-back'>
+ <i className='fa fa-angle-left'></i>
+ </div>
<FormattedMessage
id='general_tab.title'
defaultMessage='General Settings'
diff --git a/web/react/components/team_import_tab.jsx b/web/react/components/team_import_tab.jsx
index 828e9fc4e..c9a8afe6c 100644
--- a/web/react/components/team_import_tab.jsx
+++ b/web/react/components/team_import_tab.jsx
@@ -131,7 +131,10 @@ class TeamImportTab extends React.Component {
<h4
className='modal-title'
ref='title'
- ><i className='modal-back'></i>
+ >
+ <div className='modal-back'>
+ <i className='fa fa-angle-left'></i>
+ </div>
<FormattedMessage
id='team_import_tab.import'
defaultMessage='Import'
diff --git a/web/react/components/team_members_dropdown.jsx b/web/react/components/team_members_dropdown.jsx
index 8aacba8ca..cd7585d94 100644
--- a/web/react/components/team_members_dropdown.jsx
+++ b/web/react/components/team_members_dropdown.jsx
@@ -308,8 +308,8 @@ export default class TeamMembersDropdown extends React.Component {
data-toggle='dropdown'
aria-expanded='true'
>
- <span className='fa fa-pencil'></span>
<span>{currentRoles} </span>
+ <span className='fa fa-chevron-down'></span>
</a>
<ul
className='dropdown-menu member-menu'
diff --git a/web/react/components/team_settings_modal.jsx b/web/react/components/team_settings_modal.jsx
index d517f92fb..bef3ebf24 100644
--- a/web/react/components/team_settings_modal.jsx
+++ b/web/react/components/team_settings_modal.jsx
@@ -91,7 +91,7 @@ class TeamSettingsModal extends React.Component {
/>
</h4>
</div>
- <div className='modal-body'>
+ <div className='modal-body settings-modal__body'>
<div className='settings-table'>
<div className='settings-links'>
<SettingsSidebar
diff --git a/web/react/components/team_signup_choose_auth.jsx b/web/react/components/team_signup_choose_auth.jsx
index 8c98c5538..5db83fe7d 100644
--- a/web/react/components/team_signup_choose_auth.jsx
+++ b/web/react/components/team_signup_choose_auth.jsx
@@ -58,6 +58,30 @@ export default class ChooseAuthPage extends React.Component {
);
}
+ if (global.window.mm_config.EnableLdap === 'true') {
+ buttons.push(
+ <a
+ className='btn btn-custom-login ldap btn-full'
+ key='ldap'
+ href='#'
+ onClick={
+ (e) => {
+ e.preventDefault();
+ this.props.updatePage('ldap');
+ }
+ }
+ >
+ <span className='icon'/>
+ <span>
+ <FormattedMessage
+ id='choose_auth_page.ldapCreate'
+ defaultMessage='Create new team with LDAP Account'
+ />
+ </span>
+ </a>
+ );
+ }
+
if (global.window.mm_config.EnableSignUpWithEmail === 'true') {
buttons.push(
<a
diff --git a/web/react/components/team_signup_with_ldap.jsx b/web/react/components/team_signup_with_ldap.jsx
new file mode 100644
index 000000000..8c808fa88
--- /dev/null
+++ b/web/react/components/team_signup_with_ldap.jsx
@@ -0,0 +1,234 @@
+// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import * as utils from '../utils/utils.jsx';
+import * as Client from '../utils/client.jsx';
+
+import {injectIntl, intlShape, defineMessages, FormattedMessage} from 'mm-intl';
+
+const holders = defineMessages({
+ team_error: {
+ id: 'ldap_signup.team_error',
+ defaultMessage: 'Please enter a team name'
+ },
+ length_error: {
+ id: 'ldap_signup.length_error',
+ defaultMessage: 'Name must be 3 or more characters up to a maximum of 15'
+ },
+ teamName: {
+ id: 'ldap_signup.teamName',
+ defaultMessage: 'Enter name of new team'
+ },
+ badTeam: {
+ id: 'login_ldap.badTeam',
+ defaultMessage: 'Bad team name'
+ },
+ idReq: {
+ id: 'login_ldap.idlReq',
+ defaultMessage: 'An LDAP ID is required'
+ },
+ pwdReq: {
+ id: 'login_ldap.pwdReq',
+ defaultMessage: 'An LDAP password is required'
+ },
+ username: {
+ id: 'login_ldap.username',
+ defaultMessage: 'LDAP Username'
+ },
+ pwd: {
+ id: 'login_ldap.pwd',
+ defaultMessage: 'LDAP Password'
+ }
+});
+
+class LdapSignUpPage extends React.Component {
+ constructor(props) {
+ super(props);
+
+ this.handleSubmit = this.handleSubmit.bind(this);
+ this.valueChange = this.valueChange.bind(this);
+
+ this.state = {name: '', id: '', password: ''};
+ }
+
+ handleSubmit(e) {
+ e.preventDefault();
+ const {formatMessage} = this.props.intl;
+ var teamSignup = {};
+ teamSignup.user = {};
+ teamSignup.team = {};
+ var state = this.state;
+ state.serverError = null;
+
+ teamSignup.team.display_name = this.state.name;
+
+ if (!teamSignup.team.display_name) {
+ state.serverError = formatMessage(holders.team_error);
+ this.setState(state);
+ return;
+ }
+
+ if (teamSignup.team.display_name.length <= 2) {
+ state.serverError = formatMessage(holders.length_error);
+ this.setState(state);
+ return;
+ }
+
+ const id = this.refs.id.value.trim();
+ if (!id) {
+ state.serverError = formatMessage(holders.idReq);
+ this.setState(state);
+ return;
+ }
+
+ const password = this.refs.password.value.trim();
+ if (!password) {
+ state.serverError = formatMessage(holders.pwdReq);
+ this.setState(state);
+ return;
+ }
+
+ state.serverError = '';
+ this.setState(state);
+
+ teamSignup.team.name = utils.cleanUpUrlable(teamSignup.team.display_name);
+ teamSignup.team.type = 'O';
+
+ teamSignup.user.username = ReactDOM.findDOMNode(this.refs.id).value.trim();
+ teamSignup.user.password = ReactDOM.findDOMNode(this.refs.password).value.trim();
+ teamSignup.user.allow_marketing = true;
+ teamSignup.user.ldap = true;
+ teamSignup.user.auth_service = 'ldap';
+
+ $('#ldap-button').button('loading');
+
+ Client.createTeamWithLdap(teamSignup,
+ () => {
+ Client.track('signup', 'signup_team_ldap_complete');
+
+ Client.loginByLdap(teamSignup.team.name, id, password,
+ () => {
+ window.location.href = '/' + teamSignup.team.name + '/channels/town-square';
+ },
+ (err) => {
+ $('#ldap-button').button('reset');
+ this.setState({serverError: err.message});
+ }
+ );
+ },
+ (err) => {
+ $('#ldap-button').button('reset');
+ this.setState({serverError: err.message});
+ }
+ );
+ }
+
+ valueChange() {
+ this.setState({
+ name: ReactDOM.findDOMNode(this.refs.teamname).value.trim(),
+ id: ReactDOM.findDOMNode(this.refs.id).value.trim(),
+ password: ReactDOM.findDOMNode(this.refs.password).value.trim()
+ });
+ }
+
+ render() {
+ const {formatMessage} = this.props.intl;
+ var nameError = null;
+ var nameDivClass = 'form-group';
+ if (this.state.nameError) {
+ nameError = <label className='control-label'>{this.state.nameError}</label>;
+ nameDivClass += ' has-error';
+ }
+
+ var serverError = null;
+ if (this.state.serverError) {
+ serverError = <div className='form-group has-error'><label className='control-label'>{this.state.serverError}</label></div>;
+ }
+
+ var disabled = false;
+ if (this.state.name.length <= 2) {
+ disabled = true;
+ }
+
+ if (this.state.id.length <= 1) {
+ disabled = true;
+ }
+
+ if (this.state.password.length <= 1) {
+ disabled = true;
+ }
+
+ return (
+ <form
+ role='form'
+ onSubmit={this.handleSubmit}
+ >
+ <div className={nameDivClass}>
+ <input
+ autoFocus={true}
+ type='text'
+ ref='teamname'
+ className='form-control'
+ placeholder={this.props.intl.formatMessage(holders.teamName)}
+ maxLength='128'
+ onChange={this.valueChange}
+ spellCheck='false'
+ />
+ {nameError}
+ </div>
+ <div className={nameDivClass}>
+ <input
+ className='form-control'
+ ref='id'
+ placeholder={formatMessage(holders.username)}
+ spellCheck='false'
+ onChange={this.valueChange}
+ />
+ </div>
+ <div className={nameDivClass}>
+ <input
+ type='password'
+ className='form-control'
+ ref='password'
+ placeholder={formatMessage(holders.pwd)}
+ spellCheck='false'
+ onChange={this.valueChange}
+ />
+ </div>
+ <div className='form-group'>
+ <a
+ className='btn btn-custom-login ldap btn-full'
+ key='ldap'
+ id='ldap-button'
+ href='#'
+ onClick={this.handleSubmit}
+ disabled={disabled}
+ >
+ <span className='icon'/>
+ <span>
+ <FormattedMessage
+ id='ldap_signup.ldap'
+ defaultMessage='Create team with LDAP Account'
+ />
+ </span>
+ </a>
+ {serverError}
+ </div>
+ <div className='form-group margin--extra-2x'>
+ <span><a href='/find_team'>
+ <FormattedMessage
+ id='ldap_signup.find'
+ defaultMessage='Find my teams'
+ />
+ </a></span>
+ </div>
+ </form>
+ );
+ }
+}
+
+LdapSignUpPage.propTypes = {
+ intl: intlShape.isRequired
+};
+
+export default injectIntl(LdapSignUpPage); \ No newline at end of file
diff --git a/web/react/components/textbox.jsx b/web/react/components/textbox.jsx
index c119abcbc..46900e436 100644
--- a/web/react/components/textbox.jsx
+++ b/web/react/components/textbox.jsx
@@ -155,7 +155,7 @@ export default class Textbox extends React.Component {
let helpText = (
<div
- style={{visibility: hasText ? 'visible' : 'hidden', opacity: hasText ? '1' : '0'}}
+ style={{visibility: hasText ? 'visible' : 'hidden', opacity: hasText ? '0.5' : '0'}}
className='help_format_text'
>
<b>
diff --git a/web/react/components/user_settings/user_settings_advanced.jsx b/web/react/components/user_settings/user_settings_advanced.jsx
index efaf63ada..cdaa5fd8a 100644
--- a/web/react/components/user_settings/user_settings_advanced.jsx
+++ b/web/react/components/user_settings/user_settings_advanced.jsx
@@ -300,10 +300,12 @@ class AdvancedSettingsDisplay extends React.Component {
className='modal-title'
ref='title'
>
- <i
- className='modal-back'
- onClick={this.props.collapseModal}
- />
+ <div className='modal-back'>
+ <i
+ className='fa fa-angle-left'
+ onClick={this.props.collapseModal}
+ />
+ </div>
<FormattedMessage
id='user.settings.advance.title'
defaultMessage='Advanced Settings'
diff --git a/web/react/components/user_settings/user_settings_developer.jsx b/web/react/components/user_settings/user_settings_developer.jsx
index 5868e0ad3..0acfd4a16 100644
--- a/web/react/components/user_settings/user_settings_developer.jsx
+++ b/web/react/components/user_settings/user_settings_developer.jsx
@@ -94,10 +94,12 @@ class DeveloperTab extends React.Component {
className='modal-title'
ref='title'
>
- <i
- className='modal-back'
- onClick={this.props.collapseModal}
- />
+ <div className='modal-back'>
+ <i
+ className='fa fa-angle-left'
+ onClick={this.props.collapseModal}
+ />
+ </div>
<FormattedMessage
id='user.settings.developer.title'
defaultMessage='Developer Settings'
diff --git a/web/react/components/user_settings/user_settings_display.jsx b/web/react/components/user_settings/user_settings_display.jsx
index 3e468e08f..b0e64b0aa 100644
--- a/web/react/components/user_settings/user_settings_display.jsx
+++ b/web/react/components/user_settings/user_settings_display.jsx
@@ -444,10 +444,12 @@ export default class UserSettingsDisplay extends React.Component {
className='modal-title'
ref='title'
>
- <i
- className='modal-back'
- onClick={this.props.collapseModal}
- />
+ <div className='modal-back'>
+ <i
+ className='fa fa-angle-left'
+ onClick={this.props.collapseModal}
+ />
+ </div>
<FormattedMessage
id='user.settings.display.title'
defaultMessage='Display Settings'
diff --git a/web/react/components/user_settings/user_settings_general.jsx b/web/react/components/user_settings/user_settings_general.jsx
index 2f2116c2a..b0b1c414e 100644
--- a/web/react/components/user_settings/user_settings_general.jsx
+++ b/web/react/components/user_settings/user_settings_general.jsx
@@ -759,10 +759,12 @@ class UserSettingsGeneralTab extends React.Component {
className='modal-title'
ref='title'
>
- <i
- className='modal-back'
- onClick={this.props.collapseModal}
- />
+ <div className='modal-back'>
+ <i
+ className='fa fa-angle-left'
+ onClick={this.props.collapseModal}
+ />
+ </div>
<FormattedMessage
id='user.settings.general.title'
defaultMessage='General Settings'
diff --git a/web/react/components/user_settings/user_settings_integrations.jsx b/web/react/components/user_settings/user_settings_integrations.jsx
index e4f460a6d..7633b2f95 100644
--- a/web/react/components/user_settings/user_settings_integrations.jsx
+++ b/web/react/components/user_settings/user_settings_integrations.jsx
@@ -163,10 +163,12 @@ class UserSettingsIntegrationsTab extends React.Component {
className='modal-title'
ref='title'
>
- <i
- className='modal-back'
- onClick={this.props.collapseModal}
- />
+ <div className='modal-back'>
+ <i
+ className='fa fa-angle-left'
+ onClick={this.props.collapseModal}
+ />
+ </div>
<FormattedMessage
id='user.settings.integrations.title'
defaultMessage='Integration Settings'
diff --git a/web/react/components/user_settings/user_settings_notifications.jsx b/web/react/components/user_settings/user_settings_notifications.jsx
index ee9febb8e..3ef6435f1 100644
--- a/web/react/components/user_settings/user_settings_notifications.jsx
+++ b/web/react/components/user_settings/user_settings_notifications.jsx
@@ -774,10 +774,12 @@ class NotificationsTab extends React.Component {
className='modal-title'
ref='title'
>
- <i
- className='modal-back'
- onClick={this.props.collapseModal}
- />
+ <div className='modal-back'>
+ <i
+ className='fa fa-angle-left'
+ onClick={this.props.collapseModal}
+ />
+ </div>
<FormattedMessage
id='user.settings.notifications.title'
defaultMessage='Notification Settings'
diff --git a/web/react/components/user_settings/user_settings_security.jsx b/web/react/components/user_settings/user_settings_security.jsx
index 53d79906f..cba7ffdea 100644
--- a/web/react/components/user_settings/user_settings_security.jsx
+++ b/web/react/components/user_settings/user_settings_security.jsx
@@ -389,10 +389,12 @@ class SecurityTab extends React.Component {
className='modal-title'
ref='title'
>
- <i
- className='modal-back'
- onClick={this.props.collapseModal}
- />
+ <div className='modal-back'>
+ <i
+ className='fa fa-angle-left'
+ onClick={this.props.collapseModal}
+ />
+ </div>
<FormattedMessage
id='user.settings.security.title'
defaultMessage='Security Settings'
diff --git a/web/react/stores/admin_store.jsx b/web/react/stores/admin_store.jsx
index eb3254cfe..5c911e94b 100644
--- a/web/react/stores/admin_store.jsx
+++ b/web/react/stores/admin_store.jsx
@@ -156,3 +156,7 @@ AdminStoreClass.dispatchToken = AppDispatcher.register((payload) => {
});
export default AdminStore;
+
+if (window.mm_config.EnableDeveloper === 'true') {
+ window.AdminStore = AdminStore;
+}
diff --git a/web/react/stores/analytics_store.jsx b/web/react/stores/analytics_store.jsx
index ec827f6d7..0ad989206 100644
--- a/web/react/stores/analytics_store.jsx
+++ b/web/react/stores/analytics_store.jsx
@@ -83,3 +83,7 @@ AnalyticsStore.dispatchToken = AppDispatcher.register((payload) => {
});
export default AnalyticsStore;
+
+if (window.mm_config.EnableDeveloper === 'true') {
+ window.AnalyticsStore = AnalyticsStore;
+}
diff --git a/web/react/stores/channel_store.jsx b/web/react/stores/channel_store.jsx
index 60cb10de7..eac24b071 100644
--- a/web/react/stores/channel_store.jsx
+++ b/web/react/stores/channel_store.jsx
@@ -350,3 +350,7 @@ ChannelStore.dispatchToken = AppDispatcher.register((payload) => {
});
export default ChannelStore;
+
+if (window.mm_config.EnableDeveloper === 'true') {
+ window.ChannelStore = ChannelStore;
+}
diff --git a/web/react/stores/file_store.jsx b/web/react/stores/file_store.jsx
index 6d7e0f354..c1fd0ef74 100644
--- a/web/react/stores/file_store.jsx
+++ b/web/react/stores/file_store.jsx
@@ -57,4 +57,9 @@ class FileStore extends EventEmitter {
}
}
-export default new FileStore();
+const instance = new FileStore();
+export default instance;
+
+if (window.mm_config.EnableDeveloper === 'true') {
+ window.FileStore = instance;
+}
diff --git a/web/react/stores/modal_store.jsx b/web/react/stores/modal_store.jsx
index 5ea38030b..1819fffc0 100644
--- a/web/react/stores/modal_store.jsx
+++ b/web/react/stores/modal_store.jsx
@@ -45,3 +45,7 @@ class ModalStoreClass extends EventEmitter {
const ModalStore = new ModalStoreClass();
export default ModalStore;
+
+if (window.mm_config.EnableDeveloper === 'true') {
+ window.ModalStore = ModalStore;
+}
diff --git a/web/react/stores/post_store.jsx b/web/react/stores/post_store.jsx
index a6dfcd46f..5cc3f300d 100644
--- a/web/react/stores/post_store.jsx
+++ b/web/react/stores/post_store.jsx
@@ -608,3 +608,7 @@ function isPostListNull(pl) {
return false;
}
+
+if (window.mm_config.EnableDeveloper === 'true') {
+ window.PostStore = PostStore;
+}
diff --git a/web/react/stores/search_store.jsx b/web/react/stores/search_store.jsx
index 549f355ef..96071665c 100644
--- a/web/react/stores/search_store.jsx
+++ b/web/react/stores/search_store.jsx
@@ -135,3 +135,7 @@ SearchStore.dispatchToken = AppDispatcher.register((payload) => {
});
export default SearchStore;
+
+if (window.mm_config.EnableDeveloper === 'true') {
+ window.SearchStore = SearchStore;
+}
diff --git a/web/react/stores/suggestion_store.jsx b/web/react/stores/suggestion_store.jsx
index efd2b76ed..487bae843 100644
--- a/web/react/stores/suggestion_store.jsx
+++ b/web/react/stores/suggestion_store.jsx
@@ -258,4 +258,9 @@ class SuggestionStore extends EventEmitter {
}
}
-export default new SuggestionStore();
+const instance = new SuggestionStore();
+export default instance;
+
+if (window.mm_config.EnableDeveloper === 'true') {
+ window.SuggestionStore = instance;
+}
diff --git a/web/react/stores/team_store.jsx b/web/react/stores/team_store.jsx
index 7a1a2ef42..493d6bc4d 100644
--- a/web/react/stores/team_store.jsx
+++ b/web/react/stores/team_store.jsx
@@ -126,3 +126,7 @@ TeamStore.dispatchToken = AppDispatcher.register((payload) => {
});
export default TeamStore;
+
+if (window.mm_config.EnableDeveloper === 'true') {
+ window.TeamStore = TeamStore;
+}
diff --git a/web/react/stores/user_store.jsx b/web/react/stores/user_store.jsx
index 75a87d424..9fcd2440e 100644
--- a/web/react/stores/user_store.jsx
+++ b/web/react/stores/user_store.jsx
@@ -325,3 +325,7 @@ UserStore.dispatchToken = AppDispatcher.register((payload) => {
});
export {UserStore as default};
+
+if (window.mm_config.EnableDeveloper === 'true') {
+ window.UserStore = UserStore;
+}
diff --git a/web/react/utils/client.jsx b/web/react/utils/client.jsx
index 1a002bc8c..76d42137a 100644
--- a/web/react/utils/client.jsx
+++ b/web/react/utils/client.jsx
@@ -87,6 +87,21 @@ export function createTeamFromSignup(teamSignup, success, error) {
});
}
+export function createTeamWithLdap(teamSignup, success, error) {
+ $.ajax({
+ url: '/api/v1/teams/create_with_ldap',
+ dataType: 'json',
+ contentType: 'application/json',
+ type: 'POST',
+ data: JSON.stringify(teamSignup),
+ success,
+ error: function onError(xhr, status, err) {
+ var e = handleError('createTeamFromSignup', xhr, status, err);
+ error(e);
+ }
+ });
+}
+
export function createTeamWithSSO(team, service, success, error) {
$.ajax({
url: '/api/v1/teams/create_with_sso/' + service,
diff --git a/web/react/utils/utils.jsx b/web/react/utils/utils.jsx
index 6ab2f64d4..6942a8e08 100644
--- a/web/react/utils/utils.jsx
+++ b/web/react/utils/utils.jsx
@@ -606,16 +606,17 @@ export function toTitleCase(str) {
export function applyTheme(theme) {
if (theme.sidebarBg) {
- changeCss('.sidebar--left, .settings-modal .settings-table .settings-links, .sidebar--menu', 'background:' + theme.sidebarBg, 1);
+ changeCss('.sidebar--left, .modal .settings-modal .settings-table .settings-links, .sidebar--menu', 'background:' + theme.sidebarBg, 1);
+ changeCss('body', 'scrollbar-face-color:' + theme.sidebarBg, 3);
}
if (theme.sidebarText) {
- changeCss('.sidebar--left .nav-pills__container li>a, .sidebar--right, .settings-modal .nav-pills>li a, .sidebar--menu', 'color:' + changeOpacity(theme.sidebarText, 0.6), 1);
- changeCss('@media(max-width: 768px){.settings-modal .settings-table .nav>li>a', 'color:' + theme.sidebarText, 1);
+ changeCss('.sidebar--left .nav-pills__container li>a, .sidebar--right, .modal .settings-modal .nav-pills>li a, .sidebar--menu', 'color:' + changeOpacity(theme.sidebarText, 0.6), 1);
+ changeCss('@media(max-width: 768px){.modal .settings-modal .settings-table .nav>li>a', 'color:' + theme.sidebarText, 1);
changeCss('.sidebar--left .nav-pills__container li>h4, .sidebar--left .add-channel-btn', 'color:' + changeOpacity(theme.sidebarText, 0.6), 1);
changeCss('.sidebar--left .add-channel-btn:hover, .sidebar--left .add-channel-btn:focus', 'color:' + theme.sidebarText, 1);
changeCss('.sidebar--left .status .offline--icon, .sidebar--left .status .offline--icon', 'fill:' + theme.sidebarText, 1);
- changeCss('@media(max-width: 768px){.settings-modal .settings-table .nav>li>a', 'border-color:' + changeOpacity(theme.sidebarText, 0.2), 2);
+ changeCss('@media(max-width: 768px){.modal .settings-modal .settings-table .nav>li>a', 'border-color:' + changeOpacity(theme.sidebarText, 0.2), 2);
}
if (theme.sidebarUnreadText) {
@@ -623,16 +624,16 @@ export function applyTheme(theme) {
}
if (theme.sidebarTextHoverBg) {
- changeCss('.sidebar--left .nav-pills__container li>a:hover, .sidebar--left .nav-pills__container li>a:focus, .settings-modal .nav-pills>li:hover a, .settings-modal .nav-pills>li:focus a', 'background:' + theme.sidebarTextHoverBg, 1);
- changeCss('@media(max-width: 768px){.settings-modal .settings-table .nav>li:hover a', 'background:' + theme.sidebarTextHoverBg, 1);
+ changeCss('.sidebar--left .nav-pills__container li>a:hover, .sidebar--left .nav-pills__container li>a:focus, .modal .settings-modal .nav-pills>li:hover a, .modal .settings-modal .nav-pills>li:focus a', 'background:' + theme.sidebarTextHoverBg, 1);
+ changeCss('@media(max-width: 768px){.modal .settings-modal .settings-table .nav>li:hover a', 'background:' + theme.sidebarTextHoverBg, 1);
}
if (theme.sidebarTextActiveBorder) {
- changeCss('.sidebar--left .nav li.active a:before, .settings-modal .nav-pills>li.active a:before', 'background:' + theme.sidebarTextActiveBorder, 1);
+ changeCss('.sidebar--left .nav li.active a:before, .modal .settings-modal .nav-pills>li.active a:before', 'background:' + theme.sidebarTextActiveBorder, 1);
}
if (theme.sidebarTextActiveColor) {
- changeCss('.sidebar--left .nav-pills__container li.active a, .sidebar--left .nav-pills__container li.active a:hover, .sidebar--left .nav-pills__container li.active a:focus, .settings-modal .nav-pills>li.active a, .settings-modal .nav-pills>li.active a:hover, .settings-modal .nav-pills>li.active a:active', 'color:' + theme.sidebarTextActiveColor, 2);
+ changeCss('.sidebar--left .nav-pills__container li.active a, .sidebar--left .nav-pills__container li.active a:hover, .sidebar--left .nav-pills__container li.active a:focus, .modal .settings-modal .nav-pills>li.active a, .modal .settings-modal .nav-pills>li.active a:hover, .modal .settings-modal .nav-pills>li.active a:active', 'color:' + theme.sidebarTextActiveColor, 2);
changeCss('.sidebar--left .nav li.active a, .sidebar--left .nav li.active a:hover, .sidebar--left .nav li.active a:focus', 'background:' + changeOpacity(theme.sidebarTextActiveColor, 0.1), 1);
}
@@ -665,12 +666,12 @@ export function applyTheme(theme) {
if (theme.mentionBj) {
changeCss('.sidebar--left .nav-pills__unread-indicator', 'background:' + theme.mentionBj, 1);
- changeCss('.sidebar--left .badge', 'background:' + theme.mentionBj, 1);
+ changeCss('.sidebar--left .badge', 'background:' + theme.mentionBj + '!important;', 1);
}
if (theme.mentionColor) {
changeCss('.sidebar--left .nav-pills__unread-indicator', 'color:' + theme.mentionColor, 2);
- changeCss('.sidebar--left .badge', 'color:' + theme.mentionColor, 2);
+ changeCss('.sidebar--left .badge', 'color:' + theme.mentionColor + '!important;', 2);
}
if (theme.centerChannelBg) {
@@ -686,6 +687,8 @@ export function applyTheme(theme) {
changeCss('.popover.top>.arrow:after, .tip-overlay.tip-overlay--chat .arrow', 'border-top-color:' + theme.centerChannelBg, 1);
changeCss('@media(min-width: 768px){.search-bar__container .search__form .search-bar, .form-control', 'background:' + theme.centerChannelBg, 1);
changeCss('.attachment__content', 'background:' + theme.centerChannelBg, 1);
+ changeCss('body', 'scrollbar-face-color:' + theme.centerChannelBg, 2);
+ changeCss('body', 'scrollbar-track-color:' + theme.centerChannelBg, 2);
}
if (theme.centerChannelColor) {
@@ -705,7 +708,7 @@ export function applyTheme(theme) {
changeCss('.markdown__table tbody tr:nth-child(2n)', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
changeCss('.channel-header__info>div.dropdown .header-dropdown__icon', 'color:' + changeOpacity(theme.centerChannelColor, 0.8), 1);
changeCss('.channel-header #member_popover', 'color:' + changeOpacity(theme.centerChannelColor, 0.8), 1);
- changeCss('.custom-textarea, .custom-textarea:focus, .preview-container .preview-div, .post-image__column .post-image__details, .sidebar--right .sidebar-right__body, .markdown__table th, .markdown__table td, .suggestion-content, .modal .modal-content, .settings-modal .settings-table .settings-content .divider-light, .webhooks__container, .dropdown-menu, .modal .modal-header, .popover', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
+ changeCss('.custom-textarea, .custom-textarea:focus, .preview-container .preview-div, .post-image__column .post-image__details, .sidebar--right .sidebar-right__body, .markdown__table th, .markdown__table td, .suggestion-content, .modal .modal-content, .modal .settings-modal .settings-table .settings-content .divider-light, .webhooks__container, .dropdown-menu, .modal .modal-header, .popover', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
changeCss('.popover.bottom>.arrow', 'border-bottom-color:' + changeOpacity(theme.centerChannelColor, 0.25), 1);
changeCss('.search-help-popover .search-autocomplete__divider span', 'color:' + changeOpacity(theme.centerChannelColor, 0.7), 1);
changeCss('.popover.right>.arrow', 'border-right-color:' + changeOpacity(theme.centerChannelColor, 0.25), 1);
@@ -726,18 +729,20 @@ export function applyTheme(theme) {
changeCss('.date-separator .separator__hr, .modal-footer, .modal .custom-textarea', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
changeCss('.search-item-container, .post-right__container .post.post--root', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1), 1);
changeCss('.modal .custom-textarea:focus', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.3), 1);
- changeCss('.channel-intro, .settings-modal .settings-table .settings-content .divider-dark, hr, .settings-modal .settings-table .settings-links, .settings-modal .settings-table .settings-content .appearance-section .theme-elements__header', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
+ changeCss('.channel-intro, .modal .settings-modal .settings-table .settings-content .divider-dark, hr, .modal .settings-modal .settings-table .settings-links, .modal .settings-modal .settings-table .settings-content .appearance-section .theme-elements__header', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2), 1);
changeCss('.post.current--user .post__body, .post.post--comment.other--root.current--user .post-comment, pre, .post-right__container .post.post--root', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
changeCss('.post.current--user .post__body, .post.post--comment.other--root.current--user .post-comment, .post.same--root.post--comment .post__body, .modal .more-table tbody>tr td, .member-div:first-child, .member-div, .access-history__table .access__report, .activity-log__table', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1), 2);
changeCss('@media(max-width: 1800px){.inner__wrap.move--left .post.post--comment.same--root', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.07), 2);
- changeCss('.post:hover, .modal .more-table tbody>tr:hover td, .settings-modal .settings-table .settings-content .section-min:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
+ changeCss('.post:hover, .modal .more-table tbody>tr:hover td, .modal .settings-modal .settings-table .settings-content .section-min:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
changeCss('.date-separator.hovered--before:after, .date-separator.hovered--after:before, .new-separator.hovered--after:before, .new-separator.hovered--before:after', 'background:' + changeOpacity(theme.centerChannelColor, 0.07), 1);
changeCss('.command-name:hover, .mentions-name:hover, .suggestion--selected, .dropdown-menu>li>a:focus, .dropdown-menu>li>a:hover, .bot-indicator', 'background:' + changeOpacity(theme.centerChannelColor, 0.15), 1);
changeCss('code, .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control', 'background:' + changeOpacity(theme.centerChannelColor, 0.1), 1);
changeCss('@media(min-width: 960px){.post.current--user:hover .post__body ', 'background: none;', 1);
changeCss('.sidebar--right', 'color:' + theme.centerChannelColor, 2);
- changeCss('.search-help-popover .search-autocomplete__item:hover, .settings-modal .settings-table .settings-content .appearance-section .theme-elements__body', 'background:' + changeOpacity(theme.centerChannelColor, 0.05), 1);
+ changeCss('.search-help-popover .search-autocomplete__item:hover, .modal .settings-modal .settings-table .settings-content .appearance-section .theme-elements__body', 'background:' + changeOpacity(theme.centerChannelColor, 0.05), 1);
changeCss('.search-help-popover .search-autocomplete__item.selected', 'background:' + changeOpacity(theme.centerChannelColor, 0.15), 1);
+ changeCss('::-webkit-scrollbar-thumb', 'background:' + changeOpacity(theme.centerChannelColor, 0.4), 1);
+ changeCss('body', 'scrollbar-arrow-color:' + theme.centerChannelColor, 4);
}
if (theme.newMessageSeparator) {