| 
									
										
										
										
											2020-08-31 02:59:47 +02:00
										 |  |  | import {InputElement} from "./InputElement"; | 
					
						
							|  |  |  | import {UIEventSource} from "../../Logic/UIEventSource"; | 
					
						
							|  |  |  | import {TextField} from "./TextField"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default class MultiLingualTextFields extends InputElement<any> { | 
					
						
							| 
									
										
										
										
											2020-09-25 17:57:01 +02:00
										 |  |  |     private _fields: Map<string, TextField> = new Map<string, TextField>(); | 
					
						
							|  |  |  |     private readonly _value: UIEventSource<any>; | 
					
						
							|  |  |  |     public readonly IsSelected: UIEventSource<boolean> = new UIEventSource<boolean>(false); | 
					
						
							|  |  |  |     constructor(languages: UIEventSource<string[]>, | 
					
						
							| 
									
										
										
										
											2020-08-31 02:59:47 +02:00
										 |  |  |                 textArea: boolean = false, | 
					
						
							|  |  |  |                 value: UIEventSource<Map<string, UIEventSource<string>>> = undefined) { | 
					
						
							|  |  |  |         super(undefined); | 
					
						
							|  |  |  |         this._value = value ?? new UIEventSource({}); | 
					
						
							| 
									
										
										
										
											2020-09-25 17:57:01 +02:00
										 |  |  |         this._value.addCallbackAndRun(latestData => { | 
					
						
							|  |  |  |             if (typeof (latestData) === "string") { | 
					
						
							|  |  |  |                 console.warn("Refusing string for multilingual input", latestData); | 
					
						
							| 
									
										
										
										
											2020-09-15 02:29:31 +02:00
										 |  |  |                 self._value.setData({}); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         const self = this; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-31 02:59:47 +02:00
										 |  |  |         function setup(languages: string[]) { | 
					
						
							| 
									
										
										
										
											2020-09-15 02:29:31 +02:00
										 |  |  |             if (languages === undefined) { | 
					
						
							| 
									
										
										
										
											2020-08-31 02:59:47 +02:00
										 |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-09-25 17:57:01 +02:00
										 |  |  |             const newFields = new Map<string, TextField>(); | 
					
						
							| 
									
										
										
										
											2020-08-31 02:59:47 +02:00
										 |  |  |             for (const language of languages) { | 
					
						
							| 
									
										
										
										
											2020-09-15 02:29:31 +02:00
										 |  |  |                 if (language.length != 2) { | 
					
						
							| 
									
										
										
										
											2020-08-31 02:59:47 +02:00
										 |  |  |                     continue; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                  | 
					
						
							|  |  |  |                 let oldField = self._fields.get(language); | 
					
						
							|  |  |  |                 if (oldField === undefined) { | 
					
						
							| 
									
										
										
										
											2020-09-25 17:57:01 +02:00
										 |  |  |                     oldField = new TextField({textArea: textArea}); | 
					
						
							| 
									
										
										
										
											2020-08-31 02:59:47 +02:00
										 |  |  |                     oldField.GetValue().addCallback(str => { | 
					
						
							|  |  |  |                         self._value.data[language] = str; | 
					
						
							|  |  |  |                         self._value.ping(); | 
					
						
							|  |  |  |                     }); | 
					
						
							|  |  |  |                     oldField.GetValue().setData(self._value.data[language]); | 
					
						
							|  |  |  |                      | 
					
						
							|  |  |  |                     oldField.IsSelected.addCallback(() => { | 
					
						
							|  |  |  |                         let selected = false; | 
					
						
							|  |  |  |                         self._fields.forEach(value => {selected = selected || value.IsSelected.data}); | 
					
						
							|  |  |  |                         self.IsSelected.setData(selected); | 
					
						
							|  |  |  |                     }) | 
					
						
							|  |  |  |                      | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 newFields.set(language, oldField); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             self._fields = newFields; | 
					
						
							|  |  |  |             self.Update(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         setup(languages.data); | 
					
						
							|  |  |  |         languages.addCallback(setup); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         function load(latest: any){ | 
					
						
							|  |  |  |             if(latest === undefined){ | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             for (const lang in latest) { | 
					
						
							|  |  |  |                 self._fields.get(lang)?.GetValue().setData(latest[lang]); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         this._value.addCallback(load); | 
					
						
							|  |  |  |         load(this._value.data); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected InnerUpdate(htmlElement: HTMLElement) { | 
					
						
							|  |  |  |         super.InnerUpdate(htmlElement); | 
					
						
							|  |  |  |         this._fields.forEach(value => value.Update()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     GetValue(): UIEventSource<Map<string, UIEventSource<string>>> { | 
					
						
							|  |  |  |         return this._value; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     InnerRender(): string { | 
					
						
							|  |  |  |         let html = ""; | 
					
						
							|  |  |  |         this._fields.forEach((field, lang) => { | 
					
						
							|  |  |  |             html += `<tr><td>${lang}</td><td>${field.Render()}</td></tr>` | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         if(html === ""){ | 
					
						
							|  |  |  |             return "Please define one or more languages" | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         return `<table>${html}</table>`; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     IsValid(t: any): boolean { | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |