Fix: search fields in a filter are now wrapped into parentheses, allowing for OR as regex

This commit is contained in:
Pieter Vander Vennet 2024-09-17 02:33:05 +02:00
parent de699b6ea3
commit fb250fb928
2 changed files with 14 additions and 7 deletions

View file

@ -131,6 +131,13 @@ export default class FilteredLayer {
return values return values
} }
/**
* import Translations from "../UI/i18n/Translations"
* import { RegexTag } from "../Logic/Tags/RegexTag"
*
* 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).*)$/)
*/
private static fieldsToTags( private static fieldsToTags(
option: FilterConfigOption, option: FilterConfigOption,
fieldstate: string | Record<string, string> fieldstate: string | Record<string, string>
@ -153,7 +160,7 @@ export default class FilteredLayer {
} }
for (const key in properties) { for (const key in properties) {
v = (<string>v).replace("{" + key + "}", properties[key]) v = (<string>v).replace("{" + key + "}", "(" + properties[key] + ")")
} }
return v return v

View file

@ -60,8 +60,8 @@ export default class FilterConfig {
} }
const fields: { name: string; type: ValidatorType }[] = (option.fields ?? []).map((f, i) => { const fields: { name: string; type: ValidatorType }[] = (option.fields ?? []).map((f, i) => {
const type = <ValidatorType> f.type ?? "string" const type = <ValidatorType>f.type ?? "string"
if(Validators.availableTypes.indexOf(type) < 0){ if (Validators.availableTypes.indexOf(type) < 0) {
throw `Invalid filter: type is not a valid validator. Did you mean one of ${Utils.sortedByLevenshteinDistance(type, <any>Validators.availableTypes, x => x).slice(0, 3)}` throw `Invalid filter: type is not a valid validator. Did you mean one of ${Utils.sortedByLevenshteinDistance(type, <any>Validators.availableTypes, x => x).slice(0, 3)}`
} }
// Type is validated against 'ValidatedTextField' in Validation.ts, in ValidateFilterConfig // Type is validated against 'ValidatedTextField' in Validation.ts, in ValidateFilterConfig
@ -70,12 +70,12 @@ export default class FilterConfig {
} }
return { return {
name: f.name, name: f.name,
type, type
} }
}) })
for (const field of fields) { for (const field of fields) {
for (let ln in question.translations) { for (const ln in question.translations) {
const txt = question.translations[ln] const txt = question.translations[ln]
if (ln.startsWith("_")) { if (ln.startsWith("_")) {
continue continue
@ -111,7 +111,7 @@ export default class FilterConfig {
question: question, question: question,
osmTags: osmTags, osmTags: osmTags,
fields, fields,
originalTagsSpec: option.osmTags, originalTagsSpec: option.osmTags
} }
}) })
@ -223,7 +223,7 @@ export default class FilterConfig {
opt.osmTags?.asHumanString() ?? "", opt.osmTags?.asHumanString() ?? "",
opt.fields?.length > 0 opt.fields?.length > 0
? opt.fields.map((f) => f.name + " (" + f.type + ")").join(" ") ? opt.fields.map((f) => f.name + " (" + f.type + ")").join(" ")
: undefined, : undefined
]) ])
) )
}) })