From 5bd14c64daa75c36b963943b1e7dee1f374d5493 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 18 Jul 2024 15:35:56 +0200 Subject: [PATCH] Add option that a TagRendering can automatically introduce a builtin filter when added --- assets/layers/atm/atm.json | 1 - assets/layers/bike_shop/bike_shop.json | 1 - .../layers/elongated_coin/elongated_coin.json | 1 - assets/layers/food/food.json | 8 ++-- assets/layers/shops/shops.json | 7 +--- scripts/generateFavouritesLayer.ts | 5 ++- scripts/generateLayerOverview.ts | 1 + .../ThemeConfig/Conversion/PrepareLayer.ts | 37 ++++++++++++++++++- .../ThemeConfig/Conversion/Validation.ts | 4 ++ .../Json/TagRenderingConfigJson.ts | 5 +++ 10 files changed, 54 insertions(+), 16 deletions(-) diff --git a/assets/layers/atm/atm.json b/assets/layers/atm/atm.json index c9f3bb753..36cd15328 100644 --- a/assets/layers/atm/atm.json +++ b/assets/layers/atm/atm.json @@ -613,7 +613,6 @@ } ], "filter": [ - "open_now", { "id": "speech_output", "options": [ diff --git a/assets/layers/bike_shop/bike_shop.json b/assets/layers/bike_shop/bike_shop.json index 757c3ae9c..d9a619605 100644 --- a/assets/layers/bike_shop/bike_shop.json +++ b/assets/layers/bike_shop/bike_shop.json @@ -893,7 +893,6 @@ "description" ], "filter": [ - "open_now", { "id": "sells_second-hand", "options": [ diff --git a/assets/layers/elongated_coin/elongated_coin.json b/assets/layers/elongated_coin/elongated_coin.json index d76da9ad7..e56b47ddf 100644 --- a/assets/layers/elongated_coin/elongated_coin.json +++ b/assets/layers/elongated_coin/elongated_coin.json @@ -435,7 +435,6 @@ "check_date" ], "filter": [ - "open_now", "accepts_debit_cards", "accepts_credit_cards" ], diff --git a/assets/layers/food/food.json b/assets/layers/food/food.json index 1077a5fde..9719ebcb6 100644 --- a/assets/layers/food/food.json +++ b/assets/layers/food/food.json @@ -1304,10 +1304,10 @@ } ] }, - "has_organic", - "sugar_free", - "gluten_free", - "lactose_free", + "filters.has_organic", + "filters.sugar_free", + "filters.gluten_free", + "filters.lactose_free", "accepts_cash", "accepts_cards", "dogs" diff --git a/assets/layers/shops/shops.json b/assets/layers/shops/shops.json index a3983508c..a794639e5 100644 --- a/assets/layers/shops/shops.json +++ b/assets/layers/shops/shops.json @@ -663,9 +663,6 @@ } ] }, - "accepts_cash", - "accepts_cards", - "has_organic", { "id": "second_hand", "options": [ @@ -686,9 +683,7 @@ } ] }, - "sugar_free", - "gluten_free", - "lactose_free" + "filters.has_organic" ], "deletion": { "softDeletionTags": { diff --git a/scripts/generateFavouritesLayer.ts b/scripts/generateFavouritesLayer.ts index 41b8fd035..fa592b0f6 100644 --- a/scripts/generateFavouritesLayer.ts +++ b/scripts/generateFavouritesLayer.ts @@ -236,8 +236,11 @@ export class GenerateFavouritesLayer extends Script { if (seenTitleIcons.has(titleIcon.id)) { continue } + if(titleIcon.id === undefined){ + continue + } seenTitleIcons.add(titleIcon.id) - console.log("Adding ", titleIcon.id) + console.log("Adding title icon", titleIcon.id) titleIcons.push(titleIcon) } } diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index cc496437a..b0df401c4 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -332,6 +332,7 @@ class LayerOverviewUtils extends Script { return sharedQuestions.tagRenderings } + return this.getSharedTagRenderings( doesImageExist, dict, diff --git a/src/Models/ThemeConfig/Conversion/PrepareLayer.ts b/src/Models/ThemeConfig/Conversion/PrepareLayer.ts index 7a859a5a6..2199ff44b 100644 --- a/src/Models/ThemeConfig/Conversion/PrepareLayer.ts +++ b/src/Models/ThemeConfig/Conversion/PrepareLayer.ts @@ -62,8 +62,37 @@ class ExpandFilter extends DesugaringStep { const newFilters: FilterConfigJson[] = [] const filters = <(FilterConfigJson | string)[]>json.filter + + for (let i = 0; i < json.tagRenderings?.length; i++){ + const tagRendering = json.tagRenderings[i] + if(!tagRendering.filter){ + continue + } + for (const filterName of tagRendering.filter ?? []) { + if(typeof filterName !== "string"){ + context.enters("tagRenderings",i,"filter").err("Not a string: "+ filterName) + } + const exists = filters.some(existing => { + const id : string = existing["id"] ?? existing + return filterName === id || (filterName.startsWith("filters.") && filterName.endsWith("."+id)) + }) + if(exists){ + continue + } + if(!filterName){ + context.err("Got undefined as filter expansion in "+tagRendering["id"]) + continue + } + console.log("Adding filter",filterName," due to", tagRendering["id"]) + filters.push(filterName) + } + } + for (let i = 0; i < filters.length; i++) { const filter = filters[i] + if(filter === undefined){ + continue + } if (typeof filter !== "string") { newFilters.push(filter) continue @@ -85,7 +114,7 @@ class ExpandFilter extends DesugaringStep { osmTags: mapping.if, })) options.unshift({ - question: { + question: matchingTr["question"] ?? { en: "All types", }, osmTags: undefined, @@ -113,7 +142,11 @@ class ExpandFilter extends DesugaringStep { const expandedFilter = (<(FilterConfigJson | string)[]>layer.filter).find( (f) => typeof f !== "string" && f.id === expectedId ) - newFilters.push(expandedFilter) + if(expandedFilter === undefined){ + context.err("Did not find filter with name "+filter) + }else{ + newFilters.push(expandedFilter) + } } else { // This is a bootstrapping-run, we can safely ignore this } diff --git a/src/Models/ThemeConfig/Conversion/Validation.ts b/src/Models/ThemeConfig/Conversion/Validation.ts index b309c1377..f8cddc46c 100644 --- a/src/Models/ThemeConfig/Conversion/Validation.ts +++ b/src/Models/ThemeConfig/Conversion/Validation.ts @@ -1761,6 +1761,10 @@ export class ValidateFilter extends DesugaringStep { // Calling another filter, we skip return filter } + if(filter === undefined){ + context.err("Trying to validate a filter, but this filter is undefined") + return undefined + } for (const option of filter.options) { for (let i = 0; i < option.fields?.length ?? 0; i++) { const field = option.fields[i] diff --git a/src/Models/ThemeConfig/Json/TagRenderingConfigJson.ts b/src/Models/ThemeConfig/Json/TagRenderingConfigJson.ts index 5d037b9c8..645b0eaca 100644 --- a/src/Models/ThemeConfig/Json/TagRenderingConfigJson.ts +++ b/src/Models/ThemeConfig/Json/TagRenderingConfigJson.ts @@ -222,4 +222,9 @@ export interface TagRenderingConfigJson { * Values are split on ` ` (space) */ classes?: string + + /** + * This tagRendering can introduce this builtin filter + */ + filter?: string[] }