diff --git a/src/Models/FilteredLayer.ts b/src/Models/FilteredLayer.ts index db228b5066..0077039f4a 100644 --- a/src/Models/FilteredLayer.ts +++ b/src/Models/FilteredLayer.ts @@ -36,7 +36,7 @@ export default class FilteredLayer { constructor( layer: LayerConfig, appliedFilters?: ReadonlyMap>, - isDisplayed?: UIEventSource + isDisplayed?: UIEventSource, ) { this.layerDef = layer this.isDisplayed = isDisplayed ?? new UIEventSource(true) @@ -82,25 +82,25 @@ export default class FilteredLayer { layer: LayerConfig, context: string, osmConnection: OsmConnection, - enabledByDefault?: Store + enabledByDefault?: Store, ) { let isDisplayed: UIEventSource if (layer.syncSelection === "local") { isDisplayed = LocalStorageSource.GetParsed( context + "-layer-" + layer.id + "-enabled", - layer.shownByDefault + layer.shownByDefault, ) } else if (layer.syncSelection === "theme-only") { isDisplayed = FilteredLayer.getPref( osmConnection, context + "-layer-" + layer.id + "-enabled", - layer + layer, ) } else if (layer.syncSelection === "global") { isDisplayed = FilteredLayer.getPref( osmConnection, "layer-" + layer.id + "-enabled", - layer + layer, ) } else { let isShown = layer.shownByDefault @@ -110,7 +110,7 @@ export default class FilteredLayer { isDisplayed = QueryParameters.GetBooleanQueryParameter( FilteredLayer.queryParameterKey(layer), isShown, - "Whether or not layer " + layer.id + " is shown" + "Whether or not layer " + layer.id + " is shown", ) } @@ -134,13 +134,18 @@ export default class FilteredLayer { /** * import Translations from "../UI/i18n/Translations" * import { RegexTag } from "../Logic/Tags/RegexTag" + * import { ComparingTag } from "../Logic/Tags/ComparingTag" * * const option: FilterConfigOption = {question: Translations.T("question"), osmTags: undefined, originalTagsSpec: "key~.*{search}.*", fields: [{name: "search", type: "string"}] } * FilteredLayer.fieldsToTags(option, {search: "value_regex"}) // => new RegexTag("key", /^(.*(value_regex).*)$/s) + * + * const option: FilterConfigOption = {question: Translations.T("question"), searchTerms: undefined, osmTags: undefined, originalTagsSpec: "edit_time>{search}", fields: [{name: "search", type: "date"}] } + * const comparingTag = FilteredLayer.fieldsToTags(option, {search: "2024-09-20"}) + * comparingTag.asJson() // => "edit_time>1726790400000" */ private static fieldsToTags( option: FilterConfigOption, - fieldstate: string | Record + fieldstate: string | Record, ): TagsFilter | undefined { let properties: Record if (typeof fieldstate === "string") { @@ -160,7 +165,12 @@ export default class FilteredLayer { } for (const key in properties) { - v = (v).replace("{" + key + "}", "(" + properties[key] + ")") + const needsParentheses = v.match(/[a-zA-Z0-9_:]+~/) + if (needsParentheses) { + v = (v).replace("{" + key + "}", "(" + properties[key] + ")") + } else { + v = (v).replace("{" + key + "}", properties[key]) + } } return v @@ -171,7 +181,7 @@ export default class FilteredLayer { private static getPref( osmConnection: OsmConnection, key: string, - layer: LayerConfig + layer: LayerConfig, ): UIEventSource { return osmConnection.GetPreference(key, layer.shownByDefault + "").sync( (v) => { @@ -186,7 +196,7 @@ export default class FilteredLayer { return undefined } return "" + b - } + }, ) } diff --git a/src/UI/InputElement/Validator.ts b/src/UI/InputElement/Validator.ts index 1bec3faa8e..51062e1947 100644 --- a/src/UI/InputElement/Validator.ts +++ b/src/UI/InputElement/Validator.ts @@ -68,7 +68,7 @@ export abstract class Validator { } public getPlaceholder() { - return Translations.t.validation[this.name].description + return Translations.t.validation[this.name]?.description } public isValid(_: string, getCountry?: () => string): boolean { diff --git a/src/UI/StatisticsGUI.ts b/src/UI/StatisticsGUI.ts index 0316bbfbf7..297c95eb23 100644 --- a/src/UI/StatisticsGUI.ts +++ b/src/UI/StatisticsGUI.ts @@ -18,7 +18,7 @@ import Filterview from "./BigComponents/Filterview.svelte" import FilteredLayer from "../Models/FilteredLayer" import { SubtleButton } from "./Base/SubtleButton" import { GeoOperations } from "../Logic/GeoOperations" -import { Polygon } from "geojson" +import { FeatureCollection, Polygon } from "geojson" import { Feature } from "geojson" class StatsticsForOverviewFile extends Combine { @@ -30,7 +30,9 @@ class StatsticsForOverviewFile extends Combine { new Title("Filters"), new SvelteUIElement(Filterview, { filteredLayer }), ]) - + filteredLayer.currentFilter.addCallbackAndRun(tf => { + console.log("Filters are", tf) + }) const downloaded = new UIEventSource<{ features: ChangeSetData[] }[]>([]) for (const filepath of paths) {