Inital support for multi-tab loging
Этот коммит содержится в:
@@ -14,7 +14,7 @@ export default class AboutBuildModal extends React.Component {
|
||||
}
|
||||
|
||||
render() {
|
||||
const config = global.window.config;
|
||||
const config = global.window.mm_config;
|
||||
|
||||
return (
|
||||
<Modal
|
||||
|
||||
@@ -26,7 +26,6 @@ export default class ChannelLoader extends React.Component {
|
||||
}
|
||||
componentDidMount() {
|
||||
/* Initial aysnc loads */
|
||||
AsyncClient.getMe();
|
||||
AsyncClient.getPosts(ChannelStore.getCurrentId());
|
||||
AsyncClient.getChannels(true, true);
|
||||
AsyncClient.getChannelExtraInfo(true);
|
||||
|
||||
@@ -19,10 +19,10 @@ export default class EmailVerify extends React.Component {
|
||||
var resend = '';
|
||||
var resendConfirm = '';
|
||||
if (this.props.isVerified === 'true') {
|
||||
title = global.window.config.SiteName + ' Email Verified';
|
||||
title = global.window.mm_config.SiteName + ' Email Verified';
|
||||
body = <p>Your email has been verified! Click <a href={this.props.teamURL + '?email=' + this.props.userEmail}>here</a> to log in.</p>;
|
||||
} else {
|
||||
title = global.window.config.SiteName + ': You are almost done';
|
||||
title = global.window.mm_config.SiteName + ': You are almost done';
|
||||
body = <p>Please verify your email address. Check your inbox for an email.</p>;
|
||||
resend = (
|
||||
<button
|
||||
|
||||
@@ -21,7 +21,7 @@ export default class InviteMemberModal extends React.Component {
|
||||
emailErrors: {},
|
||||
firstNameErrors: {},
|
||||
lastNameErrors: {},
|
||||
emailEnabled: global.window.config.SendEmailNotifications === 'true'
|
||||
emailEnabled: global.window.mm_config.SendEmailNotifications === 'true'
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ export default class Login extends React.Component {
|
||||
}
|
||||
handleSubmit(e) {
|
||||
e.preventDefault();
|
||||
let state = {};
|
||||
var state = {};
|
||||
|
||||
const name = this.props.teamName;
|
||||
if (!name) {
|
||||
@@ -49,8 +49,7 @@ export default class Login extends React.Component {
|
||||
this.setState(state);
|
||||
|
||||
Client.loginByEmail(name, email, password,
|
||||
function loggedIn(data) {
|
||||
UserStore.setCurrentUser(data);
|
||||
() => {
|
||||
UserStore.setLastEmail(email);
|
||||
|
||||
const redirect = Utils.getUrlParameter('redirect');
|
||||
@@ -60,7 +59,7 @@ export default class Login extends React.Component {
|
||||
window.location.href = '/' + name + '/channels/town-square';
|
||||
}
|
||||
},
|
||||
function loginFailed(err) {
|
||||
(err) => {
|
||||
if (err.message === 'Login failed because email address has not been verified') {
|
||||
window.location.href = '/verify_email?teamname=' + encodeURIComponent(name) + '&email=' + encodeURIComponent(email);
|
||||
return;
|
||||
@@ -68,7 +67,7 @@ export default class Login extends React.Component {
|
||||
state.serverError = err.message;
|
||||
this.valid = false;
|
||||
this.setState(state);
|
||||
}.bind(this)
|
||||
}
|
||||
);
|
||||
}
|
||||
render() {
|
||||
@@ -95,7 +94,7 @@ export default class Login extends React.Component {
|
||||
}
|
||||
|
||||
let loginMessage = [];
|
||||
if (global.window.config.EnableSignUpWithGitLab === 'true') {
|
||||
if (global.window.mm_config.EnableSignUpWithGitLab === 'true') {
|
||||
loginMessage.push(
|
||||
<a
|
||||
className='btn btn-custom-login gitlab'
|
||||
@@ -124,7 +123,7 @@ export default class Login extends React.Component {
|
||||
}
|
||||
|
||||
let emailSignup;
|
||||
if (global.window.config.EnableSignUpWithEmail === 'true') {
|
||||
if (global.window.mm_config.EnableSignUpWithEmail === 'true') {
|
||||
emailSignup = (
|
||||
<div>
|
||||
<div className={'form-group' + errorClass}>
|
||||
@@ -186,7 +185,7 @@ export default class Login extends React.Component {
|
||||
<div className='signup-team__container'>
|
||||
<h5 className='margin--less'>Sign in to:</h5>
|
||||
<h2 className='signup-team__name'>{teamDisplayName}</h2>
|
||||
<h2 className='signup-team__subdomain'>on {global.window.config.SiteName}</h2>
|
||||
<h2 className='signup-team__subdomain'>on {global.window.mm_config.SiteName}</h2>
|
||||
<form onSubmit={this.handleSubmit}>
|
||||
{verifiedBox}
|
||||
<div className={'form-group' + errorClass}>
|
||||
|
||||
@@ -161,7 +161,7 @@ export default class NavbarDropdown extends React.Component {
|
||||
});
|
||||
}
|
||||
|
||||
if (global.window.config.EnableTeamCreation === 'true') {
|
||||
if (global.window.mm_config.EnableTeamCreation === 'true') {
|
||||
teams.push(
|
||||
<li key='newTeam_li'>
|
||||
<a
|
||||
|
||||
@@ -61,7 +61,7 @@ export default class PasswordResetForm extends React.Component {
|
||||
<div className='signup-team__container'>
|
||||
<h3>Password Reset</h3>
|
||||
<form onSubmit={this.handlePasswordReset}>
|
||||
<p>{'Enter a new password for your ' + this.props.teamDisplayName + ' ' + global.window.config.SiteName + ' account.'}</p>
|
||||
<p>{'Enter a new password for your ' + this.props.teamDisplayName + ' ' + global.window.mm_config.SiteName + ' account.'}</p>
|
||||
<div className={formClass}>
|
||||
<input
|
||||
type='password'
|
||||
|
||||
@@ -159,7 +159,7 @@ export default class Post extends React.Component {
|
||||
var profilePic = null;
|
||||
if (!this.props.hideProfilePic) {
|
||||
let src = '/api/v1/users/' + post.user_id + '/image?time=' + timestamp;
|
||||
if (post.props && post.props.from_webhook && global.window.config.EnablePostIconOverride === 'true') {
|
||||
if (post.props && post.props.from_webhook && global.window.mm_config.EnablePostIconOverride === 'true') {
|
||||
if (post.props.override_icon_url) {
|
||||
src = post.props.override_icon_url;
|
||||
}
|
||||
|
||||
@@ -119,12 +119,12 @@ export default class PostBody extends React.Component {
|
||||
this.setState({youtubeUploader: metadata.channelTitle, youtubeTitle: metadata.title});
|
||||
}
|
||||
|
||||
if (global.window.config.GoogleDeveloperKey && !this.receivedYoutubeData) {
|
||||
if (global.window.mm_config.GoogleDeveloperKey && !this.receivedYoutubeData) {
|
||||
$.ajax({
|
||||
async: true,
|
||||
url: 'https://www.googleapis.com/youtube/v3/videos',
|
||||
type: 'GET',
|
||||
data: {part: 'snippet', id: youtubeId, key: global.window.config.GoogleDeveloperKey},
|
||||
data: {part: 'snippet', id: youtubeId, key: global.window.mm_config.GoogleDeveloperKey},
|
||||
success: success.bind(this)
|
||||
});
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ export default class PostHeader extends React.Component {
|
||||
let botIndicator;
|
||||
|
||||
if (post.props && post.props.from_webhook) {
|
||||
if (post.props.override_username && global.window.config.EnablePostUsernameOverride === 'true') {
|
||||
if (post.props.override_username && global.window.mm_config.EnablePostUsernameOverride === 'true') {
|
||||
userProfile = (
|
||||
<UserProfile
|
||||
userId={post.user_id}
|
||||
|
||||
@@ -121,7 +121,7 @@ export default class RhsRootPost extends React.Component {
|
||||
let botIndicator;
|
||||
|
||||
if (post.props && post.props.from_webhook) {
|
||||
if (post.props.override_username && global.window.config.EnablePostUsernameOverride === 'true') {
|
||||
if (post.props.override_username && global.window.mm_config.EnablePostUsernameOverride === 'true') {
|
||||
userProfile = (
|
||||
<UserProfile
|
||||
userId={post.user_id}
|
||||
@@ -135,7 +135,7 @@ export default class RhsRootPost extends React.Component {
|
||||
}
|
||||
|
||||
let src = '/api/v1/users/' + post.user_id + '/image?time=' + timestamp;
|
||||
if (post.props && post.props.from_webhook && global.window.config.EnablePostIconOverride === 'true') {
|
||||
if (post.props && post.props.from_webhook && global.window.mm_config.EnablePostIconOverride === 'true') {
|
||||
if (post.props.override_icon_url) {
|
||||
src = post.props.override_icon_url;
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ export default class SettingPicture extends React.Component {
|
||||
>Save</a>
|
||||
);
|
||||
}
|
||||
var helpText = 'Upload a profile picture in either JPG or PNG format, at least ' + global.window.config.ProfileWidth + 'px in width and ' + global.window.config.ProfileHeight + 'px height.';
|
||||
var helpText = 'Upload a profile picture in either JPG or PNG format, at least ' + global.window.mm_config.ProfileWidth + 'px in width and ' + global.window.mm_config.ProfileHeight + 'px height.';
|
||||
|
||||
var self = this;
|
||||
return (
|
||||
|
||||
@@ -265,8 +265,8 @@ export default class Sidebar extends React.Component {
|
||||
const channel = ChannelStore.getCurrent();
|
||||
if (channel) {
|
||||
let currentSiteName = '';
|
||||
if (global.window.config.SiteName != null) {
|
||||
currentSiteName = global.window.config.SiteName;
|
||||
if (global.window.mm_config.SiteName != null) {
|
||||
currentSiteName = global.window.mm_config.SiteName;
|
||||
}
|
||||
|
||||
let currentChannelName = channel.display_name;
|
||||
|
||||
@@ -61,7 +61,7 @@ export default class SidebarHeader extends React.Component {
|
||||
}
|
||||
|
||||
SidebarHeader.defaultProps = {
|
||||
teamDisplayName: global.window.config.SiteName,
|
||||
teamDisplayName: global.window.mm_config.SiteName,
|
||||
teamType: ''
|
||||
};
|
||||
SidebarHeader.propTypes = {
|
||||
|
||||
@@ -92,8 +92,8 @@ export default class SidebarRightMenu extends React.Component {
|
||||
}
|
||||
|
||||
var siteName = '';
|
||||
if (global.window.config.SiteName != null) {
|
||||
siteName = global.window.config.SiteName;
|
||||
if (global.window.mm_config.SiteName != null) {
|
||||
siteName = global.window.mm_config.SiteName;
|
||||
}
|
||||
var teamDisplayName = siteName;
|
||||
if (this.props.teamDisplayName) {
|
||||
|
||||
@@ -14,19 +14,19 @@ export default class TeamSignUp extends React.Component {
|
||||
|
||||
var count = 0;
|
||||
|
||||
if (global.window.config.EnableSignUpWithEmail === 'true') {
|
||||
if (global.window.mm_config.EnableSignUpWithEmail === 'true') {
|
||||
count = count + 1;
|
||||
}
|
||||
|
||||
if (global.window.config.EnableSignUpWithGitLab === 'true') {
|
||||
if (global.window.mm_config.EnableSignUpWithGitLab === 'true') {
|
||||
count = count + 1;
|
||||
}
|
||||
|
||||
if (count > 1) {
|
||||
this.state = {page: 'choose'};
|
||||
} else if (global.window.config.EnableSignUpWithEmail === 'true') {
|
||||
} else if (global.window.mm_config.EnableSignUpWithEmail === 'true') {
|
||||
this.state = {page: 'email'};
|
||||
} else if (global.window.config.EnableSignUpWithGitLab === 'true') {
|
||||
} else if (global.window.mm_config.EnableSignUpWithGitLab === 'true') {
|
||||
this.state = {page: 'gitlab'};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,30 +82,29 @@ export default class SignupUserComplete extends React.Component {
|
||||
});
|
||||
|
||||
client.createUser(user, this.props.data, this.props.hash,
|
||||
function createUserSuccess() {
|
||||
() => {
|
||||
client.track('signup', 'signup_user_02_complete');
|
||||
|
||||
client.loginByEmail(this.props.teamName, user.email, user.password,
|
||||
function emailLoginSuccess(data) {
|
||||
() => {
|
||||
UserStore.setLastEmail(user.email);
|
||||
UserStore.setCurrentUser(data);
|
||||
if (this.props.hash > 0) {
|
||||
BrowserStore.setGlobalItem(this.props.hash, JSON.stringify({wizard: 'finished'}));
|
||||
}
|
||||
window.location.href = '/' + this.props.teamName + '/channels/town-square';
|
||||
}.bind(this),
|
||||
function emailLoginFailure(err) {
|
||||
},
|
||||
(err) => {
|
||||
if (err.message === 'Login failed because email address has not been verified') {
|
||||
window.location.href = '/verify_email?email=' + encodeURIComponent(user.email) + '&teamname=' + encodeURIComponent(this.props.teamName);
|
||||
} else {
|
||||
this.setState({serverError: err.message});
|
||||
}
|
||||
}.bind(this)
|
||||
}
|
||||
);
|
||||
}.bind(this),
|
||||
function createUserFailure(err) {
|
||||
},
|
||||
(err) => {
|
||||
this.setState({serverError: err.message});
|
||||
}.bind(this)
|
||||
}
|
||||
);
|
||||
}
|
||||
render() {
|
||||
@@ -149,7 +148,7 @@ export default class SignupUserComplete extends React.Component {
|
||||
// set up the email entry and hide it if an email was provided
|
||||
var yourEmailIs = '';
|
||||
if (this.state.user.email) {
|
||||
yourEmailIs = <span>Your email address is <strong>{this.state.user.email}</strong>. You'll use this address to sign in to {global.window.config.SiteName}.</span>;
|
||||
yourEmailIs = <span>Your email address is <strong>{this.state.user.email}</strong>. You'll use this address to sign in to {global.window.mm_config.SiteName}.</span>;
|
||||
}
|
||||
|
||||
var emailContainerStyle = 'margin--extra';
|
||||
@@ -177,7 +176,7 @@ export default class SignupUserComplete extends React.Component {
|
||||
);
|
||||
|
||||
var signupMessage = [];
|
||||
if (global.window.config.EnableSignUpWithGitLab === 'true') {
|
||||
if (global.window.mm_config.EnableSignUpWithGitLab === 'true') {
|
||||
signupMessage.push(
|
||||
<a
|
||||
className='btn btn-custom-login gitlab'
|
||||
@@ -190,7 +189,7 @@ export default class SignupUserComplete extends React.Component {
|
||||
}
|
||||
|
||||
var emailSignup;
|
||||
if (global.window.config.EnableSignUpWithEmail === 'true') {
|
||||
if (global.window.mm_config.EnableSignUpWithEmail === 'true') {
|
||||
emailSignup = (
|
||||
<div>
|
||||
<div className='inner__content'>
|
||||
@@ -259,7 +258,7 @@ export default class SignupUserComplete extends React.Component {
|
||||
/>
|
||||
<h5 className='margin--less'>Welcome to:</h5>
|
||||
<h2 className='signup-team__name'>{this.props.teamDisplayName}</h2>
|
||||
<h2 className='signup-team__subdomain'>on {global.window.config.SiteName}</h2>
|
||||
<h2 className='signup-team__subdomain'>on {global.window.mm_config.SiteName}</h2>
|
||||
<h4 className='color--light'>Let's create your account</h4>
|
||||
{signupMessage}
|
||||
{emailSignup}
|
||||
|
||||
@@ -8,7 +8,7 @@ export default class ChooseAuthPage extends React.Component {
|
||||
}
|
||||
render() {
|
||||
var buttons = [];
|
||||
if (global.window.config.EnableSignUpWithGitLab === 'true') {
|
||||
if (global.window.mm_config.EnableSignUpWithGitLab === 'true') {
|
||||
buttons.push(
|
||||
<a
|
||||
className='btn btn-custom-login gitlab btn-full'
|
||||
@@ -26,7 +26,7 @@ export default class ChooseAuthPage extends React.Component {
|
||||
);
|
||||
}
|
||||
|
||||
if (global.window.config.EnableSignUpWithEmail === 'true') {
|
||||
if (global.window.mm_config.EnableSignUpWithEmail === 'true') {
|
||||
buttons.push(
|
||||
<a
|
||||
className='btn btn-custom-login email btn-full'
|
||||
|
||||
@@ -36,15 +36,14 @@ export default class TeamSignupPasswordPage extends React.Component {
|
||||
delete teamSignup.wizard;
|
||||
|
||||
Client.createTeamFromSignup(teamSignup,
|
||||
function success() {
|
||||
() => {
|
||||
Client.track('signup', 'signup_team_08_complete');
|
||||
|
||||
var props = this.props;
|
||||
|
||||
Client.loginByEmail(teamSignup.team.name, teamSignup.team.email, teamSignup.user.password,
|
||||
function loginSuccess(data) {
|
||||
() => {
|
||||
UserStore.setLastEmail(teamSignup.team.email);
|
||||
UserStore.setCurrentUser(data);
|
||||
if (this.props.hash > 0) {
|
||||
BrowserStore.setGlobalItem(this.props.hash, JSON.stringify({wizard: 'finished'}));
|
||||
}
|
||||
@@ -54,21 +53,21 @@ export default class TeamSignupPasswordPage extends React.Component {
|
||||
props.updateParent(props.state, true);
|
||||
|
||||
window.location.href = '/' + teamSignup.team.name + '/channels/town-square';
|
||||
}.bind(this),
|
||||
function loginFail(err) {
|
||||
},
|
||||
(err) => {
|
||||
if (err.message === 'Login failed because email address has not been verified') {
|
||||
window.location.href = '/verify_email?email=' + encodeURIComponent(teamSignup.team.email) + '&teamname=' + encodeURIComponent(teamSignup.team.name);
|
||||
} else {
|
||||
this.setState({serverError: err.message});
|
||||
$('#finish-button').button('reset');
|
||||
}
|
||||
}.bind(this)
|
||||
}
|
||||
);
|
||||
}.bind(this),
|
||||
function error(err) {
|
||||
},
|
||||
(err) => {
|
||||
this.setState({serverError: err.message});
|
||||
$('#finish-button').button('reset');
|
||||
}.bind(this)
|
||||
}
|
||||
);
|
||||
}
|
||||
render() {
|
||||
@@ -129,7 +128,7 @@ export default class TeamSignupPasswordPage extends React.Component {
|
||||
Finish
|
||||
</button>
|
||||
</div>
|
||||
<p>By proceeding to create your account and use {global.window.config.SiteName}, you agree to our <a href='/static/help/terms.html'>Terms of Service</a> and <a href='/static/help/privacy.html'>Privacy Policy</a>. If you do not agree, you cannot use {global.window.config.SiteName}.</p>
|
||||
<p>By proceeding to create your account and use {global.window.mm_config.SiteName}, you agree to our <a href='/static/help/terms.html'>Terms of Service</a> and <a href='/static/help/privacy.html'>Privacy Policy</a>. If you do not agree, you cannot use {global.window.mm_config.SiteName}.</p>
|
||||
<div className='margin--extra'>
|
||||
<a
|
||||
href='#'
|
||||
|
||||
@@ -13,7 +13,7 @@ export default class TeamSignupSendInvitesPage extends React.Component {
|
||||
this.submitSkip = this.submitSkip.bind(this);
|
||||
this.keySubmit = this.keySubmit.bind(this);
|
||||
this.state = {
|
||||
emailEnabled: global.window.config.SendEmailNotifications === 'true'
|
||||
emailEnabled: global.window.mm_config.SendEmailNotifications === 'true'
|
||||
};
|
||||
|
||||
if (!this.state.emailEnabled) {
|
||||
|
||||
@@ -110,7 +110,7 @@ export default class TeamSignupWelcomePage extends React.Component {
|
||||
src='/static/images/logo.png'
|
||||
/>
|
||||
<h3 className='sub-heading'>Welcome to:</h3>
|
||||
<h1 className='margin--top-none'>{global.window.config.SiteName}</h1>
|
||||
<h1 className='margin--top-none'>{global.window.mm_config.SiteName}</h1>
|
||||
</p>
|
||||
<p className='margin--less'>Let's set up your new team</p>
|
||||
<p>
|
||||
|
||||
@@ -71,7 +71,7 @@ export default class UserProfile extends React.Component {
|
||||
width='128'
|
||||
/>
|
||||
);
|
||||
if (!global.window.config.ShowEmailAddress === 'true') {
|
||||
if (!global.window.mm_config.ShowEmailAddress === 'true') {
|
||||
dataContent.push(<div className='text-nowrap'>{'Email not shared'}</div>);
|
||||
} else {
|
||||
dataContent.push(
|
||||
|
||||
@@ -122,7 +122,7 @@ export default class UserSettingsGeneralTab extends React.Component {
|
||||
() => {
|
||||
this.updateSection('');
|
||||
AsyncClient.getMe();
|
||||
const verificationEnabled = global.window.config.SendEmailNotifications === 'true' && global.window.config.RequireEmailVerification === 'true' && emailUpdated;
|
||||
const verificationEnabled = global.window.mm_config.SendEmailNotifications === 'true' && global.window.mm_config.RequireEmailVerification === 'true' && emailUpdated;
|
||||
|
||||
if (verificationEnabled) {
|
||||
ErrorStore.storeLastError({message: 'Check your email at ' + user.email + ' to verify the address.'});
|
||||
@@ -451,8 +451,8 @@ export default class UserSettingsGeneralTab extends React.Component {
|
||||
}
|
||||
var emailSection;
|
||||
if (this.props.activeSection === 'email') {
|
||||
const emailEnabled = global.window.config.SendEmailNotifications === 'true';
|
||||
const emailVerificationEnabled = global.window.config.RequireEmailVerification === 'true';
|
||||
const emailEnabled = global.window.mm_config.SendEmailNotifications === 'true';
|
||||
const emailVerificationEnabled = global.window.mm_config.RequireEmailVerification === 'true';
|
||||
let helpText = 'Email is used for notifications, and requires verification if changed.';
|
||||
|
||||
if (!emailEnabled) {
|
||||
|
||||
@@ -35,10 +35,10 @@ export default class UserSettingsModal extends React.Component {
|
||||
tabs.push({name: 'security', uiName: 'Security', icon: 'glyphicon glyphicon-lock'});
|
||||
tabs.push({name: 'notifications', uiName: 'Notifications', icon: 'glyphicon glyphicon-exclamation-sign'});
|
||||
tabs.push({name: 'appearance', uiName: 'Appearance', icon: 'glyphicon glyphicon-wrench'});
|
||||
if (global.window.config.EnableOAuthServiceProvider === 'true') {
|
||||
if (global.window.mm_config.EnableOAuthServiceProvider === 'true') {
|
||||
tabs.push({name: 'developer', uiName: 'Developer', icon: 'glyphicon glyphicon-th'});
|
||||
}
|
||||
if (global.window.config.EnableIncomingWebhooks === 'true') {
|
||||
if (global.window.mm_config.EnableIncomingWebhooks === 'true') {
|
||||
tabs.push({name: 'integrations', uiName: 'Integrations', icon: 'glyphicon glyphicon-transfer'});
|
||||
}
|
||||
|
||||
|
||||
@@ -420,7 +420,7 @@ export default class NotificationsTab extends React.Component {
|
||||
</label>
|
||||
<br/>
|
||||
</div>
|
||||
<div><br/>{'Email notifications are sent for mentions and direct messages after you’ve been offline for more than 60 seconds or away from ' + global.window.config.SiteName + ' for more than 5 minutes.'}</div>
|
||||
<div><br/>{'Email notifications are sent for mentions and direct messages after you’ve been offline for more than 60 seconds or away from ' + global.window.mm_config.SiteName + ' for more than 5 minutes.'}</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ export default class ViewImagePopoverBar extends React.Component {
|
||||
}
|
||||
render() {
|
||||
var publicLink = '';
|
||||
if (global.window.config.EnablePublicLink === 'true') {
|
||||
if (global.window.mm_config.EnablePublicLink === 'true') {
|
||||
publicLink = (
|
||||
<div>
|
||||
<a
|
||||
|
||||
Ссылка в новой задаче
Block a user