| 
									
										
										
										
											2022-06-05 02:24:14 +02:00
										 |  |  | import {Store, UIEventSource} from "../../Logic/UIEventSource"; | 
					
						
							| 
									
										
										
										
											2020-10-27 01:01:34 +01:00
										 |  |  | import TagRenderingQuestion from "./TagRenderingQuestion"; | 
					
						
							|  |  |  | import Translations from "../i18n/Translations"; | 
					
						
							| 
									
										
										
										
											2021-05-17 00:18:21 +02:00
										 |  |  | import Combine from "../Base/Combine"; | 
					
						
							| 
									
										
										
										
											2021-06-22 03:16:45 +02:00
										 |  |  | import BaseUIElement from "../BaseUIElement"; | 
					
						
							| 
									
										
										
										
											2021-06-28 00:45:49 +02:00
										 |  |  | import {VariableUiElement} from "../Base/VariableUIElement"; | 
					
						
							| 
									
										
										
										
											2021-08-07 23:11:34 +02:00
										 |  |  | import TagRenderingConfig from "../../Models/ThemeConfig/TagRenderingConfig"; | 
					
						
							|  |  |  | import {Unit} from "../../Models/Unit"; | 
					
						
							| 
									
										
										
										
											2021-10-03 21:44:43 +02:00
										 |  |  | import Lazy from "../Base/Lazy"; | 
					
						
							| 
									
										
										
										
											2020-10-27 01:01:34 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Generates all the questions, one by one | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-06-28 00:45:49 +02:00
										 |  |  | export default class QuestionBox extends VariableUiElement { | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |     public readonly skippedQuestions: UIEventSource<number[]>; | 
					
						
							| 
									
										
										
										
											2022-06-05 02:24:14 +02:00
										 |  |  |     public readonly restingQuestions: Store<BaseUIElement[]>; | 
					
						
							| 
									
										
										
										
											2020-10-27 01:01:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |     constructor(state, options: { | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  |         tagsSource: UIEventSource<any>, | 
					
						
							|  |  |  |         tagRenderings: TagRenderingConfig[], units: Unit[], | 
					
						
							|  |  |  |         showAllQuestionsAtOnce?: boolean | UIEventSource<boolean> | 
					
						
							|  |  |  |     }) { | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-28 00:45:49 +02:00
										 |  |  |         const skippedQuestions: UIEventSource<number[]> = new UIEventSource<number[]>([]) | 
					
						
							| 
									
										
										
										
											2020-10-27 01:01:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |         const tagsSource = options.tagsSource | 
					
						
							|  |  |  |         const units = options.units | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  |         options.showAllQuestionsAtOnce = options.showAllQuestionsAtOnce ?? false | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |         const tagRenderings = options.tagRenderings | 
					
						
							| 
									
										
										
										
											2020-12-08 23:44:34 +01:00
										 |  |  |             .filter(tr => tr.question !== undefined) | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |             .filter(tr => tr.question !== null) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const tagRenderingQuestions = tagRenderings | 
					
						
							|  |  |  |             .map((tagRendering, i) => | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |                 new Lazy(() => new TagRenderingQuestion(tagsSource, tagRendering, state, | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |                     { | 
					
						
							|  |  |  |                         units: units, | 
					
						
							|  |  |  |                         afterSave: () => { | 
					
						
							|  |  |  |                             // We save and indicate progress by pinging and recalculating
 | 
					
						
							|  |  |  |                             skippedQuestions.ping(); | 
					
						
							|  |  |  |                         }, | 
					
						
							|  |  |  |                         cancelButton: Translations.t.general.skip.Clone() | 
					
						
							| 
									
										
										
										
											2022-02-04 00:45:22 +01:00
										 |  |  |                             .SetClass("btn btn-secondary") | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |                             .onClick(() => { | 
					
						
							|  |  |  |                                 skippedQuestions.data.push(i); | 
					
						
							|  |  |  |                                 skippedQuestions.ping(); | 
					
						
							|  |  |  |                             }) | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 ))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const skippedQuestionsButton = Translations.t.general.skippedQuestions | 
					
						
							|  |  |  |             .onClick(() => { | 
					
						
							|  |  |  |                 skippedQuestions.setData([]); | 
					
						
							|  |  |  |             }) | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  |         tagsSource.map(tags => { | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |             if (tags === undefined) { | 
					
						
							|  |  |  |                 return undefined; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             for (let i = 0; i < tagRenderingQuestions.length; i++) { | 
					
						
							|  |  |  |                 let tagRendering = tagRenderings[i]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (skippedQuestions.data.indexOf(i) >= 0) { | 
					
						
							|  |  |  |                     continue; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 if (tagRendering.IsKnown(tags)) { | 
					
						
							|  |  |  |                     continue; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2022-01-17 21:33:03 +01:00
										 |  |  |                 if (tagRendering.condition) { | 
					
						
							|  |  |  |                     if (!tagRendering.condition.matchesProperties(tags)) { | 
					
						
							|  |  |  |                         // Filtered away by the condition, so it is kindof known
 | 
					
						
							|  |  |  |                         continue; | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2021-06-28 00:45:49 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |                 // this value is NOT known - this is the question we have to show!
 | 
					
						
							|  |  |  |                 return i | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return undefined; // The questions are depleted
 | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  |         }, [skippedQuestions]); | 
					
						
							| 
									
										
										
										
											2022-01-17 21:33:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-05 02:24:14 +02:00
										 |  |  |         const questionsToAsk: Store<BaseUIElement[]> = tagsSource.map(tags => { | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  |             if (tags === undefined) { | 
					
						
							|  |  |  |                 return []; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             const qs = [] | 
					
						
							|  |  |  |             for (let i = 0; i < tagRenderingQuestions.length; i++) { | 
					
						
							|  |  |  |                 let tagRendering = tagRenderings[i]; | 
					
						
							| 
									
										
										
										
											2021-06-28 00:45:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  |                 if (skippedQuestions.data.indexOf(i) >= 0) { | 
					
						
							|  |  |  |                     continue; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 if (tagRendering.IsKnown(tags)) { | 
					
						
							|  |  |  |                     continue; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 if (tagRendering.condition && | 
					
						
							|  |  |  |                     !tagRendering.condition.matchesProperties(tags)) { | 
					
						
							|  |  |  |                     // Filtered away by the condition, so it is kindof known
 | 
					
						
							|  |  |  |                     continue; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 // this value is NOT known - this is the question we have to show!
 | 
					
						
							|  |  |  |                 qs.push(tagRenderingQuestions[i]) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return qs | 
					
						
							|  |  |  |         }, [skippedQuestions]) | 
					
						
							| 
									
										
										
										
											2021-06-28 00:45:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  |         super(questionsToAsk.map(allQuestions => { | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |                 const els: BaseUIElement[] = [] | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  |                 if (options.showAllQuestionsAtOnce === true || options.showAllQuestionsAtOnce["data"]) { | 
					
						
							|  |  |  |                     els.push(...questionsToAsk.data) | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     els.push(allQuestions[0]) | 
					
						
							| 
									
										
										
										
											2021-06-28 00:45:49 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (skippedQuestions.data.length > 0) { | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |                     els.push(skippedQuestionsButton) | 
					
						
							| 
									
										
										
										
											2021-06-28 00:45:49 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |                 return new Combine(els).SetClass("block mb-8") | 
					
						
							|  |  |  |             }) | 
					
						
							| 
									
										
										
										
											2021-06-28 00:45:49 +02:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  |         this.skippedQuestions = skippedQuestions; | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  |         this.restingQuestions = questionsToAsk | 
					
						
							| 
									
										
										
										
											2021-11-10 18:42:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-27 01:01:34 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |