forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			112 lines
		
	
	
		
			No EOL
		
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			No EOL
		
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import {TagsFilter} from "../../Logic/Tags";
 | 
						|
import {TagRenderingConfigJson} from "./TagRenderingConfigJson";
 | 
						|
import Translations from "../../UI/i18n/Translations";
 | 
						|
import {FromJSON} from "./FromJSON";
 | 
						|
import ValidatedTextField from "../../UI/Input/ValidatedTextField";
 | 
						|
import {Translation} from "../../UI/i18n/Translation";
 | 
						|
 | 
						|
/***
 | 
						|
 * The parsed version of TagRenderingConfigJSON
 | 
						|
 * Identical data, but with some methods and validation
 | 
						|
 */
 | 
						|
export default class TagRenderingConfig {
 | 
						|
 | 
						|
    render?: Translation;
 | 
						|
    question?: Translation;
 | 
						|
    condition?: TagsFilter;
 | 
						|
 | 
						|
    freeform?: {
 | 
						|
        key: string,
 | 
						|
        type: string,
 | 
						|
        addExtraTags: TagsFilter[];
 | 
						|
    };
 | 
						|
 | 
						|
    multiAnswer: boolean;
 | 
						|
 | 
						|
    mappings?: {
 | 
						|
        if: TagsFilter,
 | 
						|
        then: Translation
 | 
						|
        hideInAnswer: boolean
 | 
						|
    }[]
 | 
						|
 | 
						|
    constructor(json: string | TagRenderingConfigJson, context?: string) {
 | 
						|
 | 
						|
        if(json === undefined){
 | 
						|
            throw "Initing a TagRenderingConfig with undefined in "+context;
 | 
						|
        }
 | 
						|
        if (typeof json === "string") {
 | 
						|
            this.render = Translations.T(json);
 | 
						|
            this.multiAnswer = false;
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        this.render = Translations.T(json.render);
 | 
						|
        this.question = Translations.T(json.question);
 | 
						|
        this.condition = FromJSON.Tag(json.condition ?? {"and": []}, `${context}.condition`);
 | 
						|
        if (json.freeform) {
 | 
						|
            this.freeform = {
 | 
						|
                key: json.freeform.key,
 | 
						|
                type: json.freeform.type ?? "string",
 | 
						|
                addExtraTags: json.freeform.addExtraTags?.map((tg, i) =>
 | 
						|
                    FromJSON.Tag(tg, `${context}.extratag[${i}]`)) ?? []
 | 
						|
            }
 | 
						|
            if (ValidatedTextField.AllTypes[this.freeform.type] === undefined) {
 | 
						|
                throw `Freeform.key ${this.freeform.key} is an invalid type`
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        this.multiAnswer = json.multiAnswer ?? false
 | 
						|
        if (json.mappings) {
 | 
						|
            this.mappings = json.mappings.map((mapping, i) => {
 | 
						|
 | 
						|
                if (mapping.then === undefined) {
 | 
						|
                    throw "Invalid mapping: if without body"
 | 
						|
                }
 | 
						|
                return {
 | 
						|
                    if: FromJSON.Tag(mapping.if, `${context}.mapping[${i}]`),
 | 
						|
                    then: Translations.T(mapping.then),
 | 
						|
                    hideInAnswer: mapping.hideInAnswer ?? false
 | 
						|
                };
 | 
						|
            });
 | 
						|
        }
 | 
						|
 | 
						|
        if (this.question && this.freeform?.key === undefined && this.mappings === undefined) {
 | 
						|
            throw `A question is defined, but no mappings nor freeform (key) are. The question is ${this.question.txt} at ${context}`
 | 
						|
        }
 | 
						|
 | 
						|
        if (json.multiAnswer) {
 | 
						|
            if ((this.mappings?.length ?? 0) === 0) {
 | 
						|
                throw "MultiAnswer is set, but no mappings are defined"
 | 
						|
            }
 | 
						|
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets the correct rendering value (or undefined if not known)
 | 
						|
     * @constructor
 | 
						|
     */
 | 
						|
    public GetRenderValue(tags: any): Translation {
 | 
						|
        if (this.mappings !== undefined && !this.multiAnswer) {
 | 
						|
            for (const mapping of this.mappings) {
 | 
						|
                if (mapping.if === undefined) {
 | 
						|
                    return mapping.then;
 | 
						|
                }
 | 
						|
                if (mapping.if.matchesProperties(tags)) {
 | 
						|
                    return mapping.then;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if (this.freeform?.key === undefined){
 | 
						|
            return this.render;
 | 
						|
        }
 | 
						|
 | 
						|
        if (tags[this.freeform.key] !== undefined) {
 | 
						|
            return this.render;
 | 
						|
        }
 | 
						|
        return undefined;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
} |