PLT-7 adding lang selector
Этот коммит содержится в:
101
web/react/components/user_settings/manage_languages.jsx
Обычный файл
101
web/react/components/user_settings/manage_languages.jsx
Обычный файл
@@ -0,0 +1,101 @@
|
|||||||
|
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
|
||||||
|
// See License.txt for license information.
|
||||||
|
|
||||||
|
import * as Client from '../../utils/client.jsx';
|
||||||
|
import * as Utils from '../../utils/utils.jsx';
|
||||||
|
|
||||||
|
export default class ManageLanguage extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.setupInitialState = this.setupInitialState.bind(this);
|
||||||
|
this.setLanguage = this.setLanguage.bind(this);
|
||||||
|
this.changeLanguage = this.changeLanguage.bind(this);
|
||||||
|
this.submitUser = this.submitUser.bind(this);
|
||||||
|
this.state = this.setupInitialState(props);
|
||||||
|
}
|
||||||
|
setupInitialState(props) {
|
||||||
|
var user = props.user;
|
||||||
|
return {
|
||||||
|
languages: Utils.languages(),
|
||||||
|
locale: user.locale
|
||||||
|
};
|
||||||
|
}
|
||||||
|
setLanguage(e) {
|
||||||
|
this.setState({locale: e.target.value});
|
||||||
|
}
|
||||||
|
changeLanguage(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
var user = this.props.user;
|
||||||
|
var locale = this.state.locale;
|
||||||
|
|
||||||
|
user.locale = locale;
|
||||||
|
|
||||||
|
this.submitUser(user);
|
||||||
|
}
|
||||||
|
submitUser(user) {
|
||||||
|
Client.updateUser(user,
|
||||||
|
() => {
|
||||||
|
window.location.reload(true);
|
||||||
|
},
|
||||||
|
(err) => {
|
||||||
|
let serverError;
|
||||||
|
if (err.message) {
|
||||||
|
serverError = err.message;
|
||||||
|
} else {
|
||||||
|
serverError = err;
|
||||||
|
}
|
||||||
|
this.setState({serverError});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
let serverError;
|
||||||
|
if (this.state.serverError) {
|
||||||
|
serverError = <label className='has-error'>{this.state.serverError}</label>;
|
||||||
|
}
|
||||||
|
|
||||||
|
const options = [];
|
||||||
|
this.state.languages.forEach((lang) => {
|
||||||
|
options.push(
|
||||||
|
<option
|
||||||
|
key={lang.value}
|
||||||
|
value={lang.value}
|
||||||
|
>
|
||||||
|
{lang.name}
|
||||||
|
</option>);
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div key='changeLanguage'>
|
||||||
|
<br/>
|
||||||
|
<label className='control-label'>{'Change interface language'}</label>
|
||||||
|
<div className='padding-top'>
|
||||||
|
<select
|
||||||
|
ref='language'
|
||||||
|
className='form-control'
|
||||||
|
value={this.state.locale}
|
||||||
|
onChange={this.setLanguage}
|
||||||
|
>
|
||||||
|
{options}
|
||||||
|
</select>
|
||||||
|
{serverError}
|
||||||
|
<div className='padding-top'>
|
||||||
|
<a
|
||||||
|
className={'btn btn-sm btn-primary'}
|
||||||
|
href='#'
|
||||||
|
onClick={this.changeLanguage}
|
||||||
|
>
|
||||||
|
{'Set language'}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ManageLanguage.propTypes = {
|
||||||
|
user: React.PropTypes.object
|
||||||
|
};
|
||||||
@@ -11,6 +11,7 @@ import DeveloperTab from './user_settings_developer.jsx';
|
|||||||
import IntegrationsTab from './user_settings_integrations.jsx';
|
import IntegrationsTab from './user_settings_integrations.jsx';
|
||||||
import DisplayTab from './user_settings_display.jsx';
|
import DisplayTab from './user_settings_display.jsx';
|
||||||
import AdvancedTab from './user_settings_advanced.jsx';
|
import AdvancedTab from './user_settings_advanced.jsx';
|
||||||
|
import LanguagesTab from './user_settings_language.jsx';
|
||||||
|
|
||||||
export default class UserSettings extends React.Component {
|
export default class UserSettings extends React.Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import SettingItemMin from '../setting_item_min.jsx';
|
|||||||
import SettingItemMax from '../setting_item_max.jsx';
|
import SettingItemMax from '../setting_item_max.jsx';
|
||||||
import Constants from '../../utils/constants.jsx';
|
import Constants from '../../utils/constants.jsx';
|
||||||
import PreferenceStore from '../../stores/preference_store.jsx';
|
import PreferenceStore from '../../stores/preference_store.jsx';
|
||||||
|
import ManageLanguages from './manage_languages.jsx';
|
||||||
import * as Utils from '../../utils/utils.jsx';
|
import * as Utils from '../../utils/utils.jsx';
|
||||||
|
|
||||||
function getDisplayStateFromStores() {
|
function getDisplayStateFromStores() {
|
||||||
@@ -78,6 +79,7 @@ export default class UserSettingsDisplay extends React.Component {
|
|||||||
let clockSection;
|
let clockSection;
|
||||||
let nameFormatSection;
|
let nameFormatSection;
|
||||||
let fontSection;
|
let fontSection;
|
||||||
|
let languagesSection;
|
||||||
|
|
||||||
if (this.props.activeSection === 'clock') {
|
if (this.props.activeSection === 'clock') {
|
||||||
const clockFormat = [false, false];
|
const clockFormat = [false, false];
|
||||||
@@ -292,6 +294,46 @@ export default class UserSettingsDisplay extends React.Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.props.activeSection === 'languages') {
|
||||||
|
var inputs = [];
|
||||||
|
inputs.push(
|
||||||
|
<ManageLanguages
|
||||||
|
user={this.props.user}
|
||||||
|
key='languages-ui'
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
languagesSection = (
|
||||||
|
<SettingItemMax
|
||||||
|
title={'Language'}
|
||||||
|
width='medium'
|
||||||
|
inputs={inputs}
|
||||||
|
updateSection={(e) => {
|
||||||
|
this.updateSection('');
|
||||||
|
e.preventDefault();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
var locale = 'English';
|
||||||
|
Utils.languages().forEach((l) => {
|
||||||
|
if (l.value === this.props.user.locale) {
|
||||||
|
locale = l.name;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
languagesSection = (
|
||||||
|
<SettingItemMin
|
||||||
|
title={'Language'}
|
||||||
|
width='medium'
|
||||||
|
describe={locale}
|
||||||
|
updateSection={() => {
|
||||||
|
this.updateSection('languages');
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div className='modal-header'>
|
<div className='modal-header'>
|
||||||
@@ -324,6 +366,8 @@ export default class UserSettingsDisplay extends React.Component {
|
|||||||
<div className='divider-dark'/>
|
<div className='divider-dark'/>
|
||||||
{nameFormatSection}
|
{nameFormatSection}
|
||||||
<div className='divider-dark'/>
|
<div className='divider-dark'/>
|
||||||
|
{languagesSection}
|
||||||
|
<div className='divider-dark'/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1340,3 +1340,18 @@ export function clearFileInput(elm) {
|
|||||||
// Do nothing
|
// Do nothing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function languages() {
|
||||||
|
return (
|
||||||
|
[
|
||||||
|
{
|
||||||
|
value: 'en',
|
||||||
|
name: 'English'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'es',
|
||||||
|
name: 'Español'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user