Fix up language dropdown

* Read languages from the available ones rather than the config
 * Make the search work (add searchEnabled=true)
 * Move variables to the class since they were populated there
pull/21833/head
David Baker 2017-05-24 11:25:06 +01:00
parent a95f3252b8
commit c2df23395d
1 changed files with 28 additions and 41 deletions

View File

@ -20,11 +20,6 @@ import sdk from '../../../index';
import UserSettingsStore from '../../../UserSettingsStore'; import UserSettingsStore from '../../../UserSettingsStore';
import _t from 'counterpart-riot'; import _t from 'counterpart-riot';
import * as languageHandler from '../../../languageHandler'; import * as languageHandler from '../../../languageHandler';
import SdkConfig from '../../../SdkConfig';
let LANGUAGES = [];
const LANGUAGES_BY_VALUE = new Object(null);
function languageMatchesSearchQuery(query, language) { function languageMatchesSearchQuery(query, language) {
if (language.label.toUpperCase().indexOf(query.toUpperCase()) == 0) return true; if (language.label.toUpperCase().indexOf(query.toUpperCase()) == 0) return true;
@ -39,31 +34,28 @@ export default class LanguageDropdown extends React.Component {
this.state = { this.state = {
searchQuery: '', searchQuery: '',
langs: null,
} }
} }
componentWillMount() { componentWillMount() {
const languageKeys = SdkConfig.get().languages; languageHandler.getAllLanguageKeysFromJson().then((langKeys) => {
const langs = [];
// Build const LANGUAGES in a way that counterpart allows translation inside object: langKeys.forEach((languageKey) => {
languageKeys.forEach(function(languageKey) { langs.push({
var l = {}; value: languageKey,
l.id = "language"; label: _t(languageKey)
l.label = _t(languageKey); });
l.value = languageKey; });
LANGUAGES.push(l); langs.sort(function(a, b){
}); if(a.label < b.label) return -1;
if(a.label > b.label) return 1;
LANGUAGES = LANGUAGES.sort(function(a, b){ return 0;
if(a.label < b.label) return -1; });
if(a.label > b.label) return 1; this.setState({langs});
return 0; }).catch(() => {
}) this.setState({langs: ['en']});
}).done();
for (const l of LANGUAGES) {
LANGUAGES_BY_VALUE[l.value] = l;
}
if (!this.props.value) { if (!this.props.value) {
// If no value is given, we start with the first // If no value is given, we start with the first
@ -86,25 +78,20 @@ export default class LanguageDropdown extends React.Component {
} }
render() { render() {
if (this.state.langs === null) {
const Spinner = sdk.getComponent('elements.Spinner');
return <Spinner />;
}
const Dropdown = sdk.getComponent('elements.Dropdown'); const Dropdown = sdk.getComponent('elements.Dropdown');
let displayedLanguages; let displayedLanguages;
if (this.state.searchQuery) { if (this.state.searchQuery) {
displayedLanguages = LANGUAGES.filter( displayedLanguages = this.state.langs.filter((lang) => {
languageMatchesSearchQuery.bind(this, this.state.searchQuery), return languageMatchesSearchQuery(this.state.searchQuery, lang);
); });
if (
this.state.searchQuery.length == 2 &&
LANGUAGES_BY_VALUE[this.state.searchQuery.toUpperCase()]
) {
const matched = LANGUAGES_BY_VALUE[this.state.searchQuery.toUpperCase()];
displayedLanguages = displayedLanguages.filter((l) => {
return l.id != matched.id;
});
displayedLanguages.unshift(matched);
}
} else { } else {
displayedLanguages = LANGUAGES; displayedLanguages = this.state.langs;
} }
const options = displayedLanguages.map((language) => { const options = displayedLanguages.map((language) => {
@ -126,7 +113,7 @@ export default class LanguageDropdown extends React.Component {
return <Dropdown className={this.props.className} return <Dropdown className={this.props.className}
onOptionChange={this.props.onOptionChange} onSearchChange={this._onSearchChange} onOptionChange={this.props.onOptionChange} onSearchChange={this._onSearchChange}
value={value} searchEnabled={true} value={value}
> >
{options} {options}
</Dropdown> </Dropdown>