...
 
Commits (7)
......@@ -20,6 +20,7 @@ import DatabaseSettings from 'components/admin_console/database_settings.jsx';
import ElasticsearchSettings from 'components/admin_console/elasticsearch_settings.jsx';
import EmailSettings from 'components/admin_console/email_settings.jsx';
import GitLabSettings from 'components/admin_console/gitlab_settings.jsx';
import PhabricatorSettings from 'components/admin_console/phabricator_settings.jsx';
import MessageExportSettings from 'components/admin_console/message_export_settings';
import OAuthSettings from 'components/admin_console/oauth_settings.jsx';
import PasswordSettings from 'components/admin_console/password_settings.jsx';
......@@ -284,6 +285,11 @@ export default class AdminConsole extends React.Component {
component={GitLabSettings}
extraProps={extraProps}
/>
<SCRoute
path={`${props.match.url}/phabricator`}
component={PhabricatorSettings}
extraProps={extraProps}
/>
<SCRoute
path={`${props.match.url}/oauth`}
component={OAuthSettings}
......
......@@ -72,6 +72,8 @@ export default class AdminSidebar extends React.Component {
let oauthSettings = null;
let ldapSettings = null;
let samlSettings = null;
let gitlabSettings = null;
let phabricatorSettings = null;
let clusterSettings = null;
let metricsSettings = null;
let complianceSettings = null;
......@@ -219,7 +221,7 @@ export default class AdminSidebar extends React.Component {
/>
);
} else {
oauthSettings = (
gitlabSettings = (
<AdminSidebarSection
name='gitlab'
title={
......@@ -230,6 +232,18 @@ export default class AdminSidebar extends React.Component {
}
/>
);
phabricatorSettings = (
<AdminSidebarSection
name='phabricator'
title={
<FormattedMessage
id='admin.sidebar.phabricator'
defaultMessage='Phabricator'
/>
}
/>
);
}
if (this.props.license.IsLicensed === 'true') {
......@@ -530,6 +544,8 @@ export default class AdminSidebar extends React.Component {
}
/>
{oauthSettings}
{gitlabSettings}
{phabricatorSettings}
{ldapSettings}
{samlSettings}
{mfaSettings}
......
This diff is collapsed.
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React from 'react';
import {FormattedHTMLMessage, FormattedMessage} from 'react-intl';
import * as Utils from 'utils/utils.jsx';
import AdminSettings from './admin_settings.jsx';
import BooleanSetting from './boolean_setting.jsx';
import SettingsGroup from './settings_group.jsx';
import TextSetting from './text_setting.jsx';
export default class PhabricatorSettings extends AdminSettings {
constructor(props) {
super(props);
this.getConfigFromState = this.getConfigFromState.bind(this);
this.renderSettings = this.renderSettings.bind(this);
this.updatePhabricatorUrl = this.updatePhabricatorUrl.bind(this);
}
getConfigFromState(config) {
config.PhabricatorSettings.Enable = this.state.enable;
config.PhabricatorSettings.Id = this.state.id;
config.PhabricatorSettings.Secret = this.state.secret;
config.PhabricatorSettings.UserApiEndpoint = this.state.userApiEndpoint;
config.PhabricatorSettings.AuthEndpoint = this.state.authEndpoint;
config.PhabricatorSettings.TokenEndpoint = this.state.tokenEndpoint;
return config;
}
getStateFromConfig(config) {
return {
enable: config.PhabricatorSettings.Enable,
id: config.PhabricatorSettings.Id,
secret: config.PhabricatorSettings.Secret,
phabricatorUrl: config.PhabricatorSettings.UserApiEndpoint.replace('/api/user.whoami', ''),
userApiEndpoint: config.PhabricatorSettings.UserApiEndpoint,
authEndpoint: config.PhabricatorSettings.AuthEndpoint,
tokenEndpoint: config.PhabricatorSettings.TokenEndpoint,
};
}
updatePhabricatorUrl(id, value) {
let trimmedValue = value;
if (value.endsWith('/')) {
trimmedValue = value.slice(0, -1);
}
this.setState({
saveNeeded: true,
phabricatorUrl: value,
userApiEndpoint: trimmedValue + '/api/user.whoami',
authEndpoint: trimmedValue + '/oauthserver/auth/',
tokenEndpoint: trimmedValue + '/oauthserver/token/',
});
}
isPhabricatorURLSetByEnv = () => {
// Assume that if one of these has been set using an environment variable,
// all of them have been set that way
return this.isSetByEnv('PhabricatorSettings.AuthEndpoint') ||
this.isSetByEnv('PhabricatorSettings.TokenEndpoint') ||
this.isSetByEnv('PhabricatorSettings.UserApiEndpoint');
};
renderTitle() {
return (
<FormattedMessage
id='admin.authentication.phabricator'
defaultMessage='Phabricator'
/>
);
}
renderSettings() {
return (
<SettingsGroup>
<BooleanSetting
id='enable'
label={
<FormattedMessage
id='admin.phabricator.enableTitle'
defaultMessage='Enable authentication with Phabricator: '
/>
}
helpText={
<div>
<FormattedMessage
id='admin.phabricator.enableDescription'
defaultMessage='When true, Mattermost allows team creation and account signup using Phabricator OAuth.'
/>
<br/>
<FormattedHTMLMessage
id='admin.phabricator.EnableHtmlDesc'
defaultMessage='<ol><li>Log in to your Phabricator account and go to Applications -> OAuth Server -> Create OAuth Server.</li><li>Enter Redirect URIs "<your-mattermost-url>/login/phabricator/complete" (example: http://localhost:8065/login/phabricator/complete) and "<your-mattermost-url>/signup/phabricator/complete". </li><li>Then use "Show Application Secret" and "Client PHID" fields from Phabricator to complete the options below.</li><li>Complete the Endpoint URLs below. </li></ol>'
/>
</div>
}
value={this.state.enable}
onChange={this.handleChange}
setByEnv={this.isSetByEnv('PhabricatorSettings.Enable')}
/>
<TextSetting
id='id'
label={
<FormattedMessage
id='admin.phabricator.clientIdTitle'
defaultMessage='Application ID:'
/>
}
placeholder={Utils.localizeMessage('admin.phabricator.clientIdExample', 'E.g.: "jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY"')}
helpText={
<FormattedMessage
id='admin.phabricator.clientIdDescription'
defaultMessage='Obtain this value via the instructions above for logging into Phabricator'
/>
}
value={this.state.id}
onChange={this.handleChange}
disabled={!this.state.enable}
setByEnv={this.isSetByEnv('PhabricatorSettings.Id')}
/>
<TextSetting
id='secret'
label={
<FormattedMessage
id='admin.phabricator.clientSecretTitle'
defaultMessage='Application Secret Key:'
/>
}
placeholder={Utils.localizeMessage('admin.phabricator.clientSecretExample', 'E.g.: "jcuS8PuvcpGhpgHhlcpT1Mx42pnqMxQY"')}
helpText={
<FormattedMessage
id='admin.phabricator.clientSecretDescription'
defaultMessage='Obtain this value via the instructions above for logging into Phabricator.'
/>
}
value={this.state.secret}
onChange={this.handleChange}
disabled={!this.state.enable}
setByEnv={this.isSetByEnv('PhabricatorSettings.Secret')}
/>
<TextSetting
id='phabricatorUrl'
label={
<FormattedMessage
id='admin.phabricator.siteUrl'
defaultMessage='Phabricator Site URL:'
/>
}
placeholder={Utils.localizeMessage('admin.phabricator.siteUrlExample', 'E.g.: https://')}
helpText={
<FormattedMessage
id='admin.phabricator.siteUrlDescription'
defaultMessage='Enter the URL of your Phabricator instance, e.g. https://example.com:3000. If your Phabricator instance is not set up with SSL, start the URL with http:// instead of https://.'
/>
}
value={this.state.phabricatorUrl}
onChange={this.updatePhabricatorUrl}
disabled={!this.state.enable}
setByEnv={this.isPhabricatorURLSetByEnv()}
/>
<TextSetting
id='userApiEndpoint'
label={
<FormattedMessage
id='admin.phabricator.userTitle'
defaultMessage='User API Endpoint:'
/>
}
placeholder={''}
value={this.state.userApiEndpoint}
disabled={true}
setByEnv={false}
/>
<TextSetting
id='authEndpoint'
label={
<FormattedMessage
id='admin.phabricator.authTitle'
defaultMessage='Auth Endpoint:'
/>
}
placeholder={''}
value={this.state.authEndpoint}
disabled={true}
setByEnv={false}
/>
<TextSetting
id='tokenEndpoint'
label={
<FormattedMessage
id='admin.phabricator.tokenTitle'
defaultMessage='Token Endpoint:'
/>
}
placeholder={''}
value={this.state.tokenEndpoint}
disabled={true}
setByEnv={false}
/>
</SettingsGroup>
);
}
}
......@@ -397,6 +397,7 @@ export class UsersAndTeamsSettings extends AdminSettings {
id='teammateNameDisplay'
values={[
{value: Constants.TEAMMATE_NAME_DISPLAY.SHOW_USERNAME, text: Utils.localizeMessage('admin.team.showUsername', 'Show username (default)')},
{value: Constants.TEAMMATE_NAME_DISPLAY.SHOW_NICKNAME_USERNAME, text: Utils.localizeMessage('admin.team.showNicknameOrUsername', 'Show nickname if one exists, otherwise show username')},
{value: Constants.TEAMMATE_NAME_DISPLAY.SHOW_NICKNAME_FULLNAME, text: Utils.localizeMessage('admin.team.showNickname', 'Show nickname if one exists, otherwise show first and last name')},
{value: Constants.TEAMMATE_NAME_DISPLAY.SHOW_FULLNAME, text: Utils.localizeMessage('admin.team.showFullname', 'Show first and last name')},
]}
......
......@@ -22,6 +22,7 @@ function mapStateToProps(state) {
const enableSignInWithUsername = config.EnableSignInWithUsername === 'true';
const enableSignUpWithEmail = config.EnableSignUpWithEmail === 'true';
const enableSignUpWithGitLab = config.EnableSignUpWithGitLab === 'true';
const enableSignUpWithPhabricator = config.EnableSignUpWithPhabricator === 'true';
const enableSignUpWithGoogle = config.EnableSignUpWithGoogle === 'true';
const enableSignUpWithOffice365 = config.EnableSignUpWithOffice365 === 'true';
const experimentalPrimaryTeam = config.ExperimentalPrimaryTeam;
......@@ -41,6 +42,7 @@ function mapStateToProps(state) {
enableSignInWithUsername,
enableSignUpWithEmail,
enableSignUpWithGitLab,
enableSignUpWithPhabricator,
enableSignUpWithGoogle,
enableSignUpWithOffice365,
experimentalPrimaryTeam,
......
......@@ -44,6 +44,7 @@ export default class LoginController extends React.Component {
enableSignInWithUsername: PropTypes.bool.isRequired,
enableSignUpWithEmail: PropTypes.bool.isRequired,
enableSignUpWithGitLab: PropTypes.bool.isRequired,
enableSignUpWithPhabricator: PropTypes.bool.isRequired,
enableSignUpWithGoogle: PropTypes.bool.isRequired,
enableSignUpWithOffice365: PropTypes.bool.isRequired,
experimentalPrimaryTeam: PropTypes.string,
......@@ -319,6 +320,7 @@ export default class LoginController extends React.Component {
checkSignUpEnabled() {
return this.props.enableSignUpWithEmail ||
this.props.enableSignUpWithGitLab ||
this.props.enableSignUpWithPhabricator ||
this.props.enableSignUpWithOffice365 ||
this.props.enableSignUpWithGoogle ||
this.props.enableLdap ||
......@@ -388,6 +390,7 @@ export default class LoginController extends React.Component {
const ldapEnabled = this.state.ldapEnabled;
const gitlabSigninEnabled = this.props.enableSignUpWithGitLab;
const phabricatorSigninEnabled = this.props.enableSignUpWithPhabricator;
const googleSigninEnabled = this.props.enableSignUpWithGoogle;
const office365SigninEnabled = this.props.enableSignUpWithOffice365;
const samlSigninEnabled = this.state.samlEnabled;
......@@ -514,7 +517,7 @@ export default class LoginController extends React.Component {
);
}
if ((emailSigninEnabled || usernameSigninEnabled || ldapEnabled) && (gitlabSigninEnabled || googleSigninEnabled || samlSigninEnabled || office365SigninEnabled)) {
if ((emailSigninEnabled || usernameSigninEnabled || ldapEnabled) && (gitlabSigninEnabled || phabricatorSigninEnabled || googleSigninEnabled || samlSigninEnabled || office365SigninEnabled)) {
loginControls.push(
<div
key='divider'
......@@ -557,6 +560,26 @@ export default class LoginController extends React.Component {
);
}
if (phabricatorSigninEnabled) {
loginControls.push(
<a
className='btn btn-custom-login phabricator'
key='phabricator'
href={Client4.getOAuthRoute() + '/phabricator/login' + this.props.location.search}
>
<span>
<span className='icon'/>
<span>
<FormattedMessage
id='login.phabricator'
defaultMessage='Phabricator'
/>
</span>
</span>
</a>
);
}
if (googleSigninEnabled) {
loginControls.push(
<a
......
......@@ -196,6 +196,9 @@ export default class Root extends React.Component {
const iosDownloadLink = getConfig(store.getState()).IosAppDownloadLink;
const androidDownloadLink = getConfig(store.getState()).AndroidAppDownloadLink;
// Remove any redirects - the mobile apps do no work with the instance
// XXX: Should we make this a proper option/toggle somewhere.
if (false) {
// redirect to the mobile landing page if the user hasn't seen it before
if (iosDownloadLink && UserAgent.isIosWeb() && !BrowserStore.hasSeenLandingPage()) {
this.props.history.push('/get_ios_app');
......@@ -204,6 +207,7 @@ export default class Root extends React.Component {
this.props.history.push('/get_android_app');
BrowserStore.setLandingPageSeen(true);
}
}
}
localizationChanged = () => {
......
......@@ -15,6 +15,7 @@ function mapStateToProps(state) {
const noAccounts = config.NoAccounts === 'true';
const enableSignUpWithEmail = config.EnableSignUpWithEmail === 'true';
const enableSignUpWithGitLab = config.EnableSignUpWithGitLab === 'true';
const enableSignUpWithPhabricator = config.EnableSignUpWithPhabricator === 'true';
const enableSignUpWithGoogle = config.EnableSignUpWithGoogle === 'true';
const enableSignUpWithOffice365 = config.EnableSignUpWithOffice365 === 'true';
const enableLDAP = config.EnableLdap === 'true';
......@@ -28,6 +29,7 @@ function mapStateToProps(state) {
noAccounts,
enableSignUpWithEmail,
enableSignUpWithGitLab,
enableSignUpWithPhabricator,
enableSignUpWithGoogle,
enableSignUpWithOffice365,
enableLDAP,
......
......@@ -181,6 +181,26 @@ export default class SignupController extends React.Component {
);
}
if (this.props.enableSignUpWithPhabricator) {
signupControls.push(
<a
className='btn btn-custom-login btn--full phabricator'
key='phabricator'
href={Client4.getOAuthRoute() + '/phabricator/signup' + window.location.search}
>
<span>
<span className='icon'/>
<span>
<FormattedMessage
id='signup.phabricator'
defaultMessage='Phabricator Single Sign-On'
/>
</span>
</span>
</a>
);
}
if (this.props.isLicensed && this.props.enableSignUpWithGoogle) {
signupControls.push(
<a
......@@ -384,6 +404,7 @@ SignupController.propTypes = {
noAccounts: PropTypes.bool.isRequired,
enableSignUpWithEmail: PropTypes.bool.isRequired,
enableSignUpWithGitLab: PropTypes.bool.isRequired,
enableSignUpWithPhabricator: PropTypes.bool.isRequired,
enableSignUpWithGoogle: PropTypes.bool.isRequired,
enableSignUpWithOffice365: PropTypes.bool.isRequired,
enableLDAP: PropTypes.bool.isRequired,
......
......@@ -172,6 +172,7 @@ export default class UserSettingsDisplay extends React.Component {
firstOption,
secondOption,
thirdOption,
fourthOption,
description,
} = props;
......@@ -225,6 +226,16 @@ export default class UserSettingsDisplay extends React.Component {
);
}
let fourthMessage;
if (fourthOption) {
fourthMessage = (
<FormattedMessage
id={fourthOption.radionButtonText.id}
defaultMessage={fourthOption.radionButtonText.message}
/>
);
}
const messageTitle = (
<FormattedMessage
id={title.id}
......@@ -240,13 +251,15 @@ export default class UserSettingsDisplay extends React.Component {
);
if (this.props.activeSection === section) {
const format = [false, false, false];
const format = [false, false, false, false];
if (value === firstOption.value) {
format[0] = true;
} else if (value === secondOption.value) {
format[1] = true;
} else {
} else if (thirdOption && value === thirdOption.value) {
format[2] = true;
} else {
format[3] = true;
}
const name = section + 'Format';
......@@ -263,6 +276,11 @@ export default class UserSettingsDisplay extends React.Component {
thirdDisplay[display] = thirdOption.value;
}
const fourthDisplay = {};
if (fourthOption) {
fourthDisplay[display] = fourthOption.value;
}
let thirdSection;
if (thirdMessage) {
thirdSection = (
......@@ -282,6 +300,25 @@ export default class UserSettingsDisplay extends React.Component {
);
}
let fourthSection;
if (fourthMessage) {
fourthSection = (
<div className='radio'>
<label>
<input
id={name + 'D'}
type='radio'
name={name}
checked={format[3]}
onChange={() => this.handleOnChange(fourthDisplay)}
/>
{fourthMessage}
</label>
<br/>
</div>
);
}
const inputs = [
<div key={key}>
<div className='radio'>
......@@ -315,6 +352,7 @@ export default class UserSettingsDisplay extends React.Component {
<br/>
</div>
{thirdSection}
{fourthSection}
<div>
<br/>
{messageDesc}
......@@ -485,6 +523,13 @@ export default class UserSettingsDisplay extends React.Component {
message: 'Show first and last name',
},
},
fourthOption: {
value: Constants.TEAMMATE_NAME_DISPLAY.SHOW_NICKNAME_USERNAME,
radionButtonText: {
id: 'user.settings.display.teammateNameDisplayNicknameUsername',
message: 'Show nickname if one exists, otherwise show username',
},
},
description: {
id: 'user.settings.display.teammateNameDisplayDescription',
message: 'Set how to display other user\'s names in posts and the Direct Messages list.',
......
......@@ -487,6 +487,24 @@ class UserSettingsGeneralTab extends React.Component {
{helpText}
</div>
);
} else if (this.props.user.auth_service === Constants.PHABRICATOR_SERVICE) {
inputs.push(
<div
key='oauthEmailInfo'
className='form-group'
>
<div className='setting-list__hint col-sm-12'>
<FormattedMessage
id='user.settings.general.emailPhabricatorCantUpdate'
defaultMessage='Login occurs through Phabricator. Email cannot be updated. Email address used for notifications is {email}.'
values={{
email: this.state.originalEmail,
}}
/>
</div>
{helpText}
</div>
);
} else if (this.props.user.auth_service === Constants.GOOGLE_SERVICE) {
inputs.push(
<div
......@@ -612,6 +630,16 @@ class UserSettingsGeneralTab extends React.Component {
}}
/>
);
} else if (this.props.user.auth_service === Constants.PHABRICATOR_SERVICE) {
describe = (
<FormattedMessage
id='user.settings.general.loginPhabricator'
defaultMessage='Login done through Phabricator ({email})'
values={{
email: this.state.originalEmail,
}}
/>
);
} else if (this.props.user.auth_service === Constants.GOOGLE_SERVICE) {
describe = (
<FormattedMessage
......
......@@ -26,6 +26,7 @@ function mapStateToProps(state, ownProps) {
const enforceMultifactorAuthentication = config.EnforceMultifactorAuthentication === 'true';
const enableSignUpWithEmail = config.EnableSignUpWithEmail === 'true';
const enableSignUpWithGitLab = config.EnableSignUpWithGitLab === 'true';
const enableSignUpWithPhabricator = config.EnableSignUpWithPhabricator === 'true';
const enableSignUpWithGoogle = config.EnableSignUpWithGoogle === 'true';
const enableLdap = config.EnableLdap === 'true';
const enableSaml = config.EnableSaml === 'true';
......@@ -41,6 +42,7 @@ function mapStateToProps(state, ownProps) {
enforceMultifactorAuthentication,
enableSignUpWithEmail,
enableSignUpWithGitLab,
enableSignUpWithPhabricator,
enableSignUpWithGoogle,
enableLdap,
enableSaml,
......
......@@ -61,6 +61,9 @@ export default class SecurityTab extends React.Component {
// Whether or not sign-up with GitLab is enabled.
enableSignUpWithGitLab: PropTypes.bool,
// Whether or not sign-up with Phabricator is enabled.
enableSignUpWithPhabricator: PropTypes.bool,
// Whether or not sign-up with Google is enabled.
enableSignUpWithGoogle: PropTypes.bool,
......@@ -465,6 +468,20 @@ export default class SecurityTab extends React.Component {
</div>
</div>
);
} else if (this.props.user.auth_service === Constants.PHABRICATOR_SERVICE) {
inputs.push(
<div
key='oauthEmailInfo'
className='form-group'
>
<div className='setting-list__hint col-sm-12'>
<FormattedMessage
id='user.settings.security.passwordPhabricatorCantUpdate'
defaultMessage='Login occurs through Phabricator. Password cannot be updated.'
/>
</div>
</div>
);
} else if (this.props.user.auth_service === Constants.LDAP_SERVICE) {
inputs.push(
<div
......@@ -578,6 +595,13 @@ export default class SecurityTab extends React.Component {
defaultMessage='Login done through GitLab'
/>
);
} else if (this.props.user.auth_service === Constants.PHABRICATOR_SERVICE) {
describe = (
<FormattedMessage
id='user.settings.security.loginPhabricator'
defaultMessage='Login done through Phabricator'
/>
);
} else if (this.props.user.auth_service === Constants.LDAP_SERVICE) {
describe = (
<FormattedMessage
......@@ -629,6 +653,7 @@ export default class SecurityTab extends React.Component {
if (this.props.activeSection === SECTION_SIGNIN) {
let emailOption;
let gitlabOption;
let phabricatorOption;
let googleOption;
let office365Option;
let ldapOption;
......@@ -652,6 +677,23 @@ export default class SecurityTab extends React.Component {
);
}
if (this.props.enableSignUpWithPhabricator) {
phabricatorOption = (
<div className='padding-bottom x2'>
<Link
className='btn btn-primary'
to={'/claim/email_to_oauth?email=' + encodeURIComponent(user.email) + '&old_type=' + user.auth_service + '&new_type=' + Constants.PHABRICATOR_SERVICE}
>
<FormattedMessage
id='user.settings.security.switchPhabricator'
defaultMessage='Switch to using Phabricator SSO'
/>
</Link>
<br/>
</div>
);
}
if (this.props.enableSignUpWithGoogle) {
googleOption = (
<div className='padding-bottom x2'>
......@@ -748,6 +790,7 @@ export default class SecurityTab extends React.Component {
<div key='userSignInOption'>
{emailOption}
{gitlabOption}
{phabricatorOption}
{googleOption}
{office365Option}
{ldapOption}
......@@ -788,6 +831,13 @@ export default class SecurityTab extends React.Component {
defaultMessage='GitLab'
/>
);
} else if (this.props.user.auth_service === Constants.PHABRICATOR_SERVICE) {
describe = (
<FormattedMessage
id='user.settings.security.phabricator'
defaultMessage='Phabricator'
/>
);
} else if (this.props.user.auth_service === Constants.GOOGLE_SERVICE) {
describe = (
<FormattedMessage
......@@ -966,6 +1016,7 @@ export default class SecurityTab extends React.Component {
let numMethods = 0;
numMethods = this.props.enableSignUpWithGitLab ? numMethods + 1 : numMethods;
numMethods = this.props.enableSignUpWithPhabricator ? numMethods + 1 : numMethods;
numMethods = this.props.enableSignUpWithGoogle ? numMethods + 1 : numMethods;
numMethods = this.props.enableSignUpWithOffice365 ? numMethods + 1 : numMethods;
numMethods = this.props.enableLdap ? numMethods + 1 : numMethods;
......
......@@ -3207,6 +3207,7 @@
"user.settings.display.teammateNameDisplayDescription": "Set how to display other user's names in posts and the Direct Messages list.",
"user.settings.display.teammateNameDisplayFullname": "Show first and last name",
"user.settings.display.teammateNameDisplayNicknameFullname": "Show nickname if one exists, otherwise show first and last name",
"user.settings.display.teammateNameDisplayNicknameUsername": "Show nickname if one exists, otherwise show username",
"user.settings.display.teammateNameDisplayTitle": "Teammate Name Display",
"user.settings.display.teammateNameDisplayUsername": "Show username",
"user.settings.display.theme.applyToAllTeams": "Apply new theme to all my teams",
......
......@@ -3207,6 +3207,7 @@
"user.settings.display.teammateNameDisplayDescription": "Choisissez comment afficher les noms des autres utilisateurs dans les messages et la liste de messages personnels.",
"user.settings.display.teammateNameDisplayFullname": "Afficher le prénom d'abord puis le nom",
"user.settings.display.teammateNameDisplayNicknameFullname": "Afficher le pseudo s'il existe, sinon afficher le prénom d'abord puis le nom",
"user.settings.display.teammateNameDisplayNicknameUsername": "Afficher le pseudo s'il exists, sinon afficher le nom d'utilisateur",
"user.settings.display.teammateNameDisplayTitle": "Affichage des noms des membres de l'équipe",
"user.settings.display.teammateNameDisplayUsername": "Afficher le nom d'utilisateur",
"user.settings.display.theme.applyToAllTeams": "Appliquer le nouveau thème à toutes mes équipes",
......
......@@ -3207,6 +3207,7 @@
"user.settings.display.teammateNameDisplayDescription": "投稿やダイレクトメッセージ中の他のユーザーの名前の表示方法を設定します。",
"user.settings.display.teammateNameDisplayFullname": "氏名を表示する",
"user.settings.display.teammateNameDisplayNicknameFullname": "ニックネームがあればそれを表示する。無ければ氏名を表示する。",
"user.settings.display.teammateNameDisplayNicknameFullname": "ニックネームがあればそれを表示する。無ければユーザー名を表示する",
"user.settings.display.teammateNameDisplayTitle": "チームメイトの名前の表示",
"user.settings.display.teammateNameDisplayUsername": "ユーザー名を表示する",
"user.settings.display.theme.applyToAllTeams": "全ての自分のチームに新しいテーマを適用する",
......
......@@ -10245,8 +10245,8 @@
"dev": true
},
"mattermost-redux": {
"version": "github:mattermost/mattermost-redux#c3a7215403d8607a21a30e11f6066308c448ce75",
"from": "github:mattermost/mattermost-redux#c3a7215403d8607a21a30e11f6066308c448ce75",
"version": "git+https://gitlab.collabora.com/sysadmin/mattermost/mattermost-redux#collabora-5.1",
"from": "git+https://gitlab.collabora.com/sysadmin/mattermost/mattermost-redux#collabora-5.1",
"requires": {
"deep-equal": "1.0.1",
"eslint-plugin-header": "1.2.0",
......
......@@ -261,6 +261,18 @@
}
}
&.phabricator {
background: #4a5f88;
&:hover {
background: darken(#4a5f88, 10%);
}
.icon {
background-image: url('../images/phabricatorLogo.png');
}
}
&.google {
background: #dd4b39;
......@@ -541,4 +553,4 @@
.verify_panel {
margin: 60px auto auto;
max-width: 380px;
}
\ No newline at end of file
}
......@@ -714,6 +714,7 @@ export const Constants = {
OFFTOPIC_CHANNEL: 'off-topic',
OFFTOPIC_CHANNEL_UI_NAME: 'Off-Topic',
GITLAB_SERVICE: 'gitlab',
PHABRICATOR_SERVICE: 'phabricator',
GOOGLE_SERVICE: 'google',
OFFICE365_SERVICE: 'office365',
EMAIL_SERVICE: 'email',
......@@ -1260,13 +1261,14 @@ export const Constants = {
AUTOCOMPLETE_TIMEOUT: 100,
ANIMATION_TIMEOUT: 1000,
SEARCH_TIMEOUT_MILLISECONDS: 100,
DIAGNOSTICS_SEGMENT_KEY: 'fwb7VPbFeQ7SKp3wHm1RzFUuXZudqVok',
DIAGNOSTICS_SEGMENT_KEY: '',
TEST_ID_COUNT: 0,
CENTER: 'center',
RHS: 'rhs',
RHS_ROOT: 'rhsroot',
TEAMMATE_NAME_DISPLAY: {
SHOW_USERNAME: 'username',
SHOW_NICKNAME_USERNAME: 'nickname_username',
SHOW_NICKNAME_FULLNAME: 'nickname_full_name',
SHOW_FULLNAME: 'full_name',
},
......