1 import { Option } from "@sniptt/monads";
2 import classNames from "classnames";
3 import { Component, linkEvent } from "inferno";
4 import { Language } from "lemmy-js-client";
5 import { i18n } from "../../i18next";
6 import { UserService } from "../../services/UserService";
7 import { randomStr, selectableLanguages } from "../../utils";
8 import { Icon } from "./icon";
10 interface LanguageSelectProps {
11 allLanguages: Language[];
12 siteLanguages: number[];
13 selectedLanguageIds: Option<number[]>;
15 onChange(val: number[]): any;
18 iconVersion?: boolean;
21 export class LanguageSelect extends Component<LanguageSelectProps, any> {
22 private id = `language-select-${randomStr()}`;
24 constructor(props: any, context: any) {
25 super(props, context);
29 this.setSelectedValues();
32 // Necessary because there is no HTML way to set selected for multiple in value=
34 this.props.selectedLanguageIds.map(toString).match({
36 var select = (document.getElementById(this.id) as HTMLSelectElement)
38 for (let i = 0; i < select.length; i++) {
40 if (ids.includes(o.value)) {
50 return this.props.iconVersion ? (
53 <div className="form-group row">
55 className={classNames("col-form-label", {
56 "col-sm-3": this.props.multiple,
57 "col-sm-2": !this.props.multiple,
61 {i18n.t(this.props.multiple ? "language_plural" : "language")}
64 className={classNames("input-group", {
65 "col-sm-9": this.props.multiple,
66 "col-sm-10": !this.props.multiple,
70 {this.props.multiple && (
71 <div className="input-group-append">
73 className="input-group-text"
74 onClick={linkEvent(this, this.handleDeselectAll)}
86 let selectedLangs = this.props.selectedLanguageIds;
87 let filteredLangs = selectableLanguages(
88 this.props.allLanguages,
89 this.props.siteLanguages,
92 UserService.Instance.myUserInfo
97 className={classNames("lang-select-action", {
98 "form-control custom-select": !this.props.iconVersion,
99 "btn btn-sm text-muted": this.props.iconVersion,
102 onChange={linkEvent(this, this.handleLanguageChange)}
104 multiple={this.props.multiple}
106 {filteredLangs.map(l => (
110 selected={selectedLangs.unwrapOr([]).includes(l.id)}
119 handleLanguageChange(i: LanguageSelect, event: any) {
120 let options: HTMLOptionElement[] = Array.from(event.target.options);
121 let selected: number[] = options
122 .filter(o => o.selected)
123 .map(o => Number(o.value));
125 i.props.onChange(selected);
128 handleDeselectAll(i: LanguageSelect, event: any) {
129 event.preventDefault();
130 i.props.onChange([]);