| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  | import TagRenderingConfig from "./TagRenderingConfig"; | 
					
						
							|  |  |  | import SharedTagRenderings from "../../Customizations/SharedTagRenderings"; | 
					
						
							|  |  |  | import {TagRenderingConfigJson} from "./Json/TagRenderingConfigJson"; | 
					
						
							|  |  |  | import {Utils} from "../../Utils"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default class WithContextLoader { | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |     protected readonly _context: string; | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     private readonly _json: any; | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |     constructor(json: any, context: string) { | 
					
						
							|  |  |  |         this._json = json; | 
					
						
							|  |  |  |         this._context = context; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** Given a key, gets the corresponding property from the json (or the default if not found | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * The found value is interpreted as a tagrendering and fetched/parsed | 
					
						
							|  |  |  |      * */ | 
					
						
							|  |  |  |     public tr(key: string, deflt) { | 
					
						
							|  |  |  |         const v = this._json[key]; | 
					
						
							|  |  |  |         if (v === undefined || v === null) { | 
					
						
							|  |  |  |             if (deflt === undefined) { | 
					
						
							|  |  |  |                 return undefined; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return new TagRenderingConfig( | 
					
						
							|  |  |  |                 deflt, | 
					
						
							|  |  |  |                 `${this._context}.${key}.default value` | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (typeof v === "string") { | 
					
						
							|  |  |  |             const shared = SharedTagRenderings.SharedTagRendering.get(v); | 
					
						
							|  |  |  |             if (shared) { | 
					
						
							|  |  |  |                 return shared; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return new TagRenderingConfig( | 
					
						
							|  |  |  |             v, | 
					
						
							|  |  |  |             `${this._context}.${key}` | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Converts a list of tagRenderingCOnfigJSON in to TagRenderingConfig | 
					
						
							|  |  |  |      * A string is interpreted as a name to call | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |     public ParseTagRenderings( | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |         tagRenderings?: (string | { builtin: string, override: any } | TagRenderingConfigJson)[], | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |         readOnly = false, | 
					
						
							|  |  |  |         prepConfig: ((config: TagRenderingConfigJson) => TagRenderingConfigJson) = undefined | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     ): TagRenderingConfig[] { | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |         if (tagRenderings === undefined) { | 
					
						
							|  |  |  |             return []; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |         const context = this._context | 
					
						
							|  |  |  |         const renderings: TagRenderingConfig[] = [] | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |         if (prepConfig === undefined) { | 
					
						
							|  |  |  |             prepConfig = c => c | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |         for (let i = 0; i < tagRenderings.length; i++) { | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |             let renderingJson = tagRenderings[i] | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |             if (typeof renderingJson === "string") { | 
					
						
							|  |  |  |                 renderingJson = {builtin: renderingJson, override: undefined} | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (renderingJson["builtin"] !== undefined) { | 
					
						
							|  |  |  |                 const renderingId = renderingJson["builtin"] | 
					
						
							|  |  |  |                 if (renderingId === "questions") { | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  |                     const tr = new TagRenderingConfig("questions", context); | 
					
						
							|  |  |  |                     renderings.push(tr) | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |                     continue; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-23 00:31:41 +02:00
										 |  |  |                 let sharedJson = SharedTagRenderings.SharedTagRenderingJson.get(renderingId) | 
					
						
							|  |  |  |                 if (sharedJson === undefined) { | 
					
						
							|  |  |  |                     const keys = Array.from(SharedTagRenderings.SharedTagRenderingJson.keys()); | 
					
						
							|  |  |  |                     throw `Predefined tagRendering ${renderingId} not found in ${context}.\n    Try one of ${keys.join( | 
					
						
							|  |  |  |                         ", " | 
					
						
							|  |  |  |                     )}\n    If you intent to output this text literally, use {\"render\": <your text>} instead"}`;
 | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |                 if (renderingJson["override"] !== undefined) { | 
					
						
							| 
									
										
										
										
											2021-11-07 15:31:51 +01:00
										 |  |  |                     sharedJson = Utils.Merge(renderingJson["override"], JSON.parse(JSON.stringify(sharedJson))) | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-10-23 00:31:41 +02:00
										 |  |  |                 renderingJson = sharedJson | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-22 18:53:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             const patchedConfig = prepConfig(<TagRenderingConfigJson>renderingJson) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             const tr = new TagRenderingConfig(patchedConfig, `${context}.tagrendering[${i}]`); | 
					
						
							| 
									
										
										
										
											2021-10-19 02:31:32 +02:00
										 |  |  |             renderings.push(tr) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return renderings; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |