From 41fdeb9cb5c664ca604da1f89f2724c0de3b1304 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 23 May 2023 00:34:26 +0200 Subject: [PATCH] Themes: add label support to questions.json; add opening hours for hospitals --- Models/ThemeConfig/Conversion/PrepareLayer.ts | 134 +++++++++--------- .../Json/TagRenderingConfigJson.ts | 2 + assets/layers/hospital/hospital.json | 22 ++- assets/tagRenderings/questions.json | 3 + 4 files changed, 93 insertions(+), 68 deletions(-) diff --git a/Models/ThemeConfig/Conversion/PrepareLayer.ts b/Models/ThemeConfig/Conversion/PrepareLayer.ts index aaf84bc3a..75acb6c6e 100644 --- a/Models/ThemeConfig/Conversion/PrepareLayer.ts +++ b/Models/ThemeConfig/Conversion/PrepareLayer.ts @@ -1,30 +1,18 @@ -import { - Concat, - Conversion, - DesugaringContext, - DesugaringStep, - Each, - FirstOf, - Fuse, - On, - SetDefault, -} from "./Conversion" -import { LayerConfigJson } from "../Json/LayerConfigJson" -import { TagRenderingConfigJson } from "../Json/TagRenderingConfigJson" -import { Utils } from "../../../Utils" +import {Concat, Conversion, DesugaringContext, DesugaringStep, Each, FirstOf, Fuse, On, SetDefault,} from "./Conversion" +import {LayerConfigJson} from "../Json/LayerConfigJson" +import {TagRenderingConfigJson} from "../Json/TagRenderingConfigJson" +import {Utils} from "../../../Utils" import RewritableConfigJson from "../Json/RewritableConfigJson" import SpecialVisualizations from "../../../UI/SpecialVisualizations" import Translations from "../../../UI/i18n/Translations" -import { Translation } from "../../../UI/i18n/Translation" +import {Translation} from "../../../UI/i18n/Translation" import tagrenderingconfigmeta from "../../../assets/tagrenderingconfigmeta.json" -import { AddContextToTranslations } from "./AddContextToTranslations" +import {AddContextToTranslations} from "./AddContextToTranslations" import FilterConfigJson from "../Json/FilterConfigJson" import predifined_filters from "../../../assets/layers/filters/filters.json" -import { TagConfigJson } from "../Json/TagConfigJson" +import {TagConfigJson} from "../Json/TagConfigJson" import PointRenderingConfigJson from "../Json/PointRenderingConfigJson" import LineRenderingConfigJson from "../Json/LineRenderingConfigJson" -import { type } from "os" -import exp from "constants" class ExpandFilter extends DesugaringStep { private static readonly predefinedFilters = ExpandFilter.load_filters() @@ -52,11 +40,11 @@ class ExpandFilter extends DesugaringStep { context: string ): { result: LayerConfigJson; errors?: string[]; warnings?: string[]; information?: string[] } { if (json.filter === undefined || json.filter === null) { - return { result: json } // Nothing to change here + return {result: json} // Nothing to change here } if (json.filter["sameAs"] !== undefined) { - return { result: json } // Nothing to change here + return {result: json} // Nothing to change here } const newFilters: FilterConfigJson[] = [] @@ -72,9 +60,9 @@ class ExpandFilter extends DesugaringStep { if (split.length > 2) { errors.push( context + - ": invalid filter name: " + - filter + - ", expected `layername.filterid`" + ": invalid filter name: " + + filter + + ", expected `layername.filterid`" ) } const layer = this._state.sharedLayers.get(split[0]) @@ -124,6 +112,7 @@ class ExpandTagRendering extends Conversion< TagRenderingConfigJson[] > { private readonly _state: DesugaringContext + private readonly _tagRenderingsByLabel: Map private readonly _self: LayerConfigJson private readonly _options: { /* If true, will copy the 'osmSource'-tags into the condition */ @@ -144,6 +133,17 @@ class ExpandTagRendering extends Conversion< this._state = state this._self = self this._options = options + this._tagRenderingsByLabel = new Map() + for (const trconfig of state.tagRenderings.values()) { + for (const label of trconfig.labels ?? []) { + let withLabel = this._tagRenderingsByLabel.get(label) + if (withLabel === undefined) { + withLabel = [] + this._tagRenderingsByLabel.set(label, withLabel) + } + withLabel.push(trconfig) + } + } } convert( @@ -161,14 +161,16 @@ class ExpandTagRendering extends Conversion< } private lookup(name: string): TagRenderingConfigJson[] | undefined { + const direct = this.directLookup(name) + if (direct === undefined) { return undefined } const result: TagRenderingConfigJson[] = [] for (const tagRenderingConfigJson of direct) { - if (tagRenderingConfigJson["builtin"] !== undefined) { - let nm: string | string[] = tagRenderingConfigJson["builtin"] + let nm: string | string[] | undefined = tagRenderingConfigJson["builtin"] + if (nm !== undefined) { let indirect: TagRenderingConfigJson[] if (typeof nm === "string") { indirect = this.lookup(nm) @@ -196,6 +198,10 @@ class ExpandTagRendering extends Conversion< if (state.tagRenderings.has(name)) { return [state.tagRenderings.get(name)] } + if(this._tagRenderingsByLabel.has(name)){ + return this._tagRenderingsByLabel.get(name) + } + if (name.indexOf(".") < 0) { return undefined } @@ -233,7 +239,7 @@ class ExpandTagRendering extends Conversion< if (found.condition === undefined) { found.condition = layer.source.osmTags } else { - found.condition = { and: [found.condition, layer.source.osmTags] } + found.condition = {and: [found.condition, layer.source.osmTags]} } } @@ -270,18 +276,18 @@ class ExpandTagRendering extends Conversion< warnings.push( `${ctx}: A literal rendering was detected: ${tr} Did you perhaps forgot to add a layer name as 'layername.${tr}'? ` + - Array.from(state.sharedLayers.keys()).join(", ") + Array.from(state.sharedLayers.keys()).join(", ") ) } if (this._options?.noHardcodedStrings && this._state.sharedLayers.size > 0) { errors.push( ctx + - "Detected an invocation to a builtin tagRendering, but this tagrendering was not found: " + - tr + - " \n Did you perhaps forget to add the layer as prefix, such as `icons." + - tr + - "`? " + "Detected an invocation to a builtin tagRendering, but this tagrendering was not found: " + + tr + + " \n Did you perhaps forget to add the layer as prefix, such as `icons." + + tr + + "`? " ) } @@ -312,11 +318,11 @@ class ExpandTagRendering extends Conversion< } errors.push( "At " + - ctx + - ": an object calling a builtin can only have keys `builtin` or `override`, but a key with name `" + - key + - "` was found. This won't be picked up! The full object is: " + - JSON.stringify(tr) + ctx + + ": an object calling a builtin can only have keys `builtin` or `override`, but a key with name `" + + key + + "` was found. This won't be picked up! The full object is: " + + JSON.stringify(tr) ) } @@ -340,22 +346,22 @@ class ExpandTagRendering extends Conversion< if (state.sharedLayers.size === 0) { warnings.push( ctx + - ": BOOTSTRAPPING. Rerun generate layeroverview. While reusing tagrendering: " + - name + - ": layer " + - layerName + - " not found. Maybe you meant on of " + - candidates.slice(0, 3).join(", ") + ": BOOTSTRAPPING. Rerun generate layeroverview. While reusing tagrendering: " + + name + + ": layer " + + layerName + + " not found. Maybe you meant on of " + + candidates.slice(0, 3).join(", ") ) } else { errors.push( ctx + - ": While reusing tagrendering: " + - name + - ": layer " + - layerName + - " not found. Maybe you meant on of " + - candidates.slice(0, 3).join(", ") + ": While reusing tagrendering: " + + name + + ": layer " + + layerName + + " not found. Maybe you meant on of " + + candidates.slice(0, 3).join(", ") ) } continue @@ -367,11 +373,11 @@ class ExpandTagRendering extends Conversion< candidates = Utils.sortedByLevenshteinDistance(name, candidates, (i) => i) errors.push( ctx + - ": The tagRendering with identifier " + - name + - " was not found.\n\tDid you mean one of " + - candidates.join(", ") + - "?\n(Hint: did you add a new label and are you trying to use this label at the same time? Run 'reset:layeroverview' first" + ": The tagRendering with identifier " + + name + + " was not found.\n\tDid you mean one of " + + candidates.join(", ") + + "?\n(Hint: did you add a new label and are you trying to use this label at the same time? Run 'reset:layeroverview' first" ) continue } @@ -457,7 +463,7 @@ export class ExpandRewrite extends Conversion, T[ } if (typeof obj === "object") { - obj = { ...obj } + obj = {...obj} const isTr = targetIsTranslation && Translations.isProbablyATranslation(obj) @@ -520,12 +526,12 @@ export class ExpandRewrite extends Conversion, T[ context: string ): { result: T[]; errors?: string[]; warnings?: string[]; information?: string[] } { if (json === null || json === undefined) { - return { result: [] } + return {result: []} } if (json["rewrite"] === undefined) { // not a rewrite - return { result: [json] } + return {result: [json]} } const rewrite = >json @@ -565,7 +571,7 @@ export class ExpandRewrite extends Conversion, T[ ts.push(t) } - return { result: ts } + return {result: ts} } } @@ -849,7 +855,7 @@ class ExpandIconBadges extends DesugaringStepjson).iconBadges @@ -860,7 +866,7 @@ class ExpandIconBadges extends DesugaringStep { new On( "titleIcons", (layer) => - new Concat(new ExpandTagRendering(state, layer, { noHardcodedStrings: true })) + new Concat(new ExpandTagRendering(state, layer, {noHardcodedStrings: true})) ), new ExpandFilter(state) ) diff --git a/Models/ThemeConfig/Json/TagRenderingConfigJson.ts b/Models/ThemeConfig/Json/TagRenderingConfigJson.ts index 9f9a6a9af..19df10751 100644 --- a/Models/ThemeConfig/Json/TagRenderingConfigJson.ts +++ b/Models/ThemeConfig/Json/TagRenderingConfigJson.ts @@ -16,6 +16,8 @@ export interface TagRenderingConfigJson { /** * If 'group' is defined on many tagRenderings, these are grouped together when shown. The questions are grouped together as well. * The first tagRendering of a group will always be a sticky element. + * + * @deprecated */ group?: string diff --git a/assets/layers/hospital/hospital.json b/assets/layers/hospital/hospital.json index 14fb5e08d..a5932e5a1 100644 --- a/assets/layers/hospital/hospital.json +++ b/assets/layers/hospital/hospital.json @@ -83,9 +83,23 @@ "ca": "Un pacient hospitalitzat és un pacient que roman diversos dies a la instal·lació" } }, - "phone", - "email", - "website" + "contact", + { + "id": "oh-visitor", + "question": { + "en": "When are visitors allowed to visit?" + }, + "questionHint": { + "en": "These are the regular visitor hours. Some wands have different visitor hours or might allow visitors in emergencies" + }, + "freeform": { + "key": "opening_hours:visitors", + "type": "opening_hours" + }, + "render": { + "en": "

Opening hours for visitors

Regular visitors are allowed at the following moments: {opening_hours_table(opening_hours:visitors)}

Some wands might have different opening hours. Many hospitals allow visits during emergencies too.

" + } + } ], "mapRendering": [ { @@ -103,4 +117,4 @@ "width": 1 } ] -} \ No newline at end of file +} diff --git a/assets/tagRenderings/questions.json b/assets/tagRenderings/questions.json index 8f6ff36b0..bf9ccaab4 100644 --- a/assets/tagRenderings/questions.json +++ b/assets/tagRenderings/questions.json @@ -113,6 +113,7 @@ "render": "{minimap(18, id): width:100%; height:8rem; border-radius:2rem; overflow: hidden; pointer-events: none;}" }, "phone": { + "labels": ["contact"], "question": { "en": "What is the phone number of {title()}?", "nl": "Wat is het telefoonnummer van {title()}?", @@ -164,6 +165,7 @@ ] }, "email": { + "labels": ["contact"], "render": "{email}", "question": { "nl": "Wat is het e-mailadres van {title()}?", @@ -206,6 +208,7 @@ } }, "website": { + "labels": ["contact"], "question": { "en": "What is the website of {title()}?", "nl": "Wat is de website van {title()}?",