diff --git a/client/src/app-components/language-selector.js b/client/src/app-components/language-selector.js index 14ab8012..cacb0d8e 100644 --- a/client/src/app-components/language-selector.js +++ b/client/src/app-components/language-selector.js @@ -3,6 +3,7 @@ import {connect} from 'react-redux'; import classNames from 'classnames'; import languageList from 'data/language-list'; +import i18n from 'lib-app/i18n'; import DropDown from 'core-components/drop-down'; const languageCodes = Object.keys(languageList); @@ -10,13 +11,15 @@ const languageCodes = Object.keys(languageList); class LanguageSelector extends React.Component { static propTypes = { value: React.PropTypes.oneOf(languageCodes), - type: React.PropTypes.oneOf(['allowed', 'supported']), + type: React.PropTypes.oneOf(['allowed', 'supported', 'custom']), + customList: React.PropTypes.array, allowedLanguages: React.PropTypes.array, supportedLanguages: React.PropTypes.array }; static defaultProps = { type: 'allowed', + customList: ['en'], allowedLanguages: languageCodes, supportedLanguages: languageCodes }; @@ -75,7 +78,14 @@ class LanguageSelector extends React.Component { } getLanguageList() { - return (this.props.type === 'supported') ? this.props.supportedLanguages : this.props.allowedLanguages; + switch(this.props.type) { + case 'supported': + return this.props.supportedLanguages; + case 'allowed': + return this.props.supportedLanguages; + case 'custom': + return this.props.customList; + } } } diff --git a/client/src/app/admin/panel/settings/admin-panel-system-preferences.js b/client/src/app/admin/panel/settings/admin-panel-system-preferences.js index 4b17f553..cdab72ec 100644 --- a/client/src/app/admin/panel/settings/admin-panel-system-preferences.js +++ b/client/src/app/admin/panel/settings/admin-panel-system-preferences.js @@ -15,13 +15,15 @@ import Button from 'core-components/button'; import Message from 'core-components/message'; import InfoTooltip from 'core-components/info-tooltip'; +const languageKeys = Object.keys(languageList); + class AdminPanelSystemPreferences extends React.Component { state = { loading: true, message: null, values: { - 'maintenance': false + maintenance: false } }; @@ -33,7 +35,7 @@ class AdminPanelSystemPreferences extends React.Component { return (
-
this.setState({values, message: null})} onSubmit={this.onSubmit.bind(this)} loading={this.state.loading}> +
@@ -96,7 +98,10 @@ class AdminPanelSystemPreferences extends React.Component {
- + languageKeys[index]) : undefined + }} />
@@ -139,8 +144,17 @@ class AdminPanelSystemPreferences extends React.Component { } } + onFormChange(form) { + let values = _.clone(form); + + _.extend(values, { + supportedLanguages: _.filter(values.supportedLanguages, (language) => _.includes(values.allowedLanguages, language)) + }); + + this.setState({values, message: null}); + } + onSubmit(form) { - let fullList = Object.keys(languageList); this.setState({loading: true}); API.call({ @@ -161,8 +175,8 @@ class AdminPanelSystemPreferences extends React.Component { 'maintenance-mode': form['maintenance-mode'], 'allow-attachments': form['allow-attachments'], 'max-size': form['max-size'], - 'allowedLanguages': JSON.stringify(form.allowedLanguages.map(index => fullList[index])), - 'supportedLanguages': JSON.stringify(form.supportedLanguages.map(index => fullList[index])) + 'allowedLanguages': JSON.stringify(form.allowedLanguages.map(index => languageKeys[index])), + 'supportedLanguages': JSON.stringify(form.supportedLanguages.map(index => languageKeys[index])) } }).then(this.onSubmitSuccess.bind(this)).catch(() => this.setState({loading: false, message: 'fail'})); } @@ -189,8 +203,6 @@ class AdminPanelSystemPreferences extends React.Component { } onRecoverSettingsSuccess(result) { - let fullList = Object.keys(languageList); - this.setState({ loading: false, values: { @@ -209,8 +221,8 @@ class AdminPanelSystemPreferences extends React.Component { 'maintenance-mode': result.data['maintenance-mode'], 'allow-attachments': result.data['allow-attachments'], 'max-size': result.data['max-size'], - 'allowedLanguages': result.data.allowedLanguages.map(lang => (_.indexOf(fullList, lang))), - 'supportedLanguages': result.data.supportedLanguages.map(lang => (_.indexOf(fullList, lang))) + 'allowedLanguages': result.data.allowedLanguages.map(lang => (_.indexOf(languageKeys, lang))), + 'supportedLanguages': result.data.supportedLanguages.map(lang => (_.indexOf(languageKeys, lang))) } }); } diff --git a/client/src/core-components/form-field.js b/client/src/core-components/form-field.js index ff5e08b8..cbb8f091 100644 --- a/client/src/core-components/form-field.js +++ b/client/src/core-components/form-field.js @@ -22,7 +22,7 @@ class FormField extends React.Component { onBlur: React.PropTypes.func, required: React.PropTypes.bool, error: React.PropTypes.string, - infoMessage: React.PropTypes.string, + infoMessage: React.PropTypes.node, value: React.PropTypes.any, field: React.PropTypes.oneOf(['input', 'textarea', 'select', 'checkbox', 'checkbox-group']), fieldProps: React.PropTypes.object