78 lines
2.7 KiB
TypeScript
78 lines
2.7 KiB
TypeScript
import TagRenderingConfig from "./TagRenderingConfig"
|
|
import SharedTagRenderings from "../../Customizations/SharedTagRenderings"
|
|
import { TagRenderingConfigJson } from "./Json/TagRenderingConfigJson"
|
|
|
|
export default class WithContextLoader {
|
|
protected readonly _context: string
|
|
private readonly _json: any
|
|
|
|
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
|
|
*/
|
|
public ParseTagRenderings(
|
|
tagRenderings: TagRenderingConfigJson[],
|
|
options?: {
|
|
/**
|
|
* Throw an error if 'question' is defined
|
|
*/
|
|
readOnlyMode?: boolean
|
|
requiresId?: boolean
|
|
prepConfig?: (config: TagRenderingConfigJson) => TagRenderingConfigJson
|
|
}
|
|
): TagRenderingConfig[] {
|
|
if (tagRenderings === undefined) {
|
|
return []
|
|
}
|
|
|
|
const context = this._context
|
|
options = options ?? {}
|
|
if (options.prepConfig === undefined) {
|
|
options.prepConfig = (c) => c
|
|
}
|
|
const renderings: TagRenderingConfig[] = []
|
|
for (let i = 0; i < tagRenderings.length; i++) {
|
|
const preparedConfig = tagRenderings[i]
|
|
const tr = new TagRenderingConfig(preparedConfig, `${context}.tagrendering[${i}]`)
|
|
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`
|
|
)
|
|
}
|
|
if (options.requiresId && tr.id === "") {
|
|
throw `${context}.tagrendering[${i}] has an invalid ID - make sure it is defined and not empty`
|
|
}
|
|
|
|
renderings.push(tr)
|
|
}
|
|
|
|
return renderings
|
|
}
|
|
}
|