2021-10-19 02:31:32 +02:00
import TagRenderingConfig from "./TagRenderingConfig" ;
import SharedTagRenderings from "../../Customizations/SharedTagRenderings" ;
import { TagRenderingConfigJson } from "./Json/TagRenderingConfigJson" ;
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 ;
}
/ * * G i v e n a k e y , g e t s t h e c o r r e s p o n d i n g p r o p e r t y f r o m t h e j s o n ( o r t h e d e f a u l t i f n o t f o u n d
*
* 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-12-21 18:35:31 +01:00
tagRenderings : TagRenderingConfigJson [ ] ,
options ? : {
2021-11-11 17:14:03 +01:00
/ * *
* Throw an error if 'question' is defined
* /
readOnlyMode? : boolean ,
requiresId? : boolean
prepConfig ? : ( ( config : TagRenderingConfigJson ) = > TagRenderingConfigJson )
2021-12-21 18:35:31 +01:00
2021-11-11 17:14:03 +01:00
}
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
2021-11-11 17:14:03 +01:00
options = options ? ? { }
if ( options . prepConfig === undefined ) {
options . prepConfig = c = > c
2021-10-22 18:53:07 +02:00
}
2021-11-14 18:01:48 +01:00
const renderings : TagRenderingConfig [ ] = [ ]
2021-12-21 18:35:31 +01:00
for ( let i = 0 ; i < tagRenderings . length ; i ++ ) {
const preparedConfig = tagRenderings [ i ] ;
2021-11-14 18:01:48 +01:00
const tr = new TagRenderingConfig ( preparedConfig , ` ${ context } .tagrendering[ ${ i } ] ` ) ;
2021-12-21 18:35:31 +01:00
if ( options . readOnlyMode && tr . question !== undefined ) {
throw "A question is defined for " + ` ${ context } .tagrendering[ ${ i } ], but this is not allowed at this position - probably because this rendering is an icon, badge or label `
2021-11-11 17:14:03 +01:00
}
2021-12-21 18:35:31 +01:00
if ( options . requiresId && tr . id === "" ) {
2021-11-11 17:14:03 +01:00
throw ` ${ context } .tagrendering[ ${ i } ] has an invalid ID - make sure it is defined and not empty `
}
2021-12-21 18:35:31 +01:00
2021-10-19 02:31:32 +02:00
renderings . push ( tr )
}
return renderings ;
}
}