forked from MapComplete/MapComplete
Fix: dynamic filtering with non-string values
This commit is contained in:
parent
44b919fec0
commit
58b94c38e5
4 changed files with 42 additions and 34 deletions
|
@ -147,26 +147,38 @@ export class RegexTag extends TagsFilter {
|
|||
* new RegexTag("key", new RegExp(".+")).matchesProperties({"key": undefined}) // => false
|
||||
* new RegexTag("key", new RegExp(".+")).matchesProperties({"key": v}) // => false
|
||||
* new RegexTag("key", new RegExp(".+")).matchesProperties({"key": ""}) // => false
|
||||
*
|
||||
* // Show work with non-string objects
|
||||
* new RegexTag("key", "true").matchesProperties({"key": true}) // => true
|
||||
* new RegexTag("key", "true", true).matchesProperties({"key": true}) // => false
|
||||
*/
|
||||
matchesProperties(tags: Record<string, string>): boolean {
|
||||
matchesProperties(tags: Record<string, string | number | boolean>): boolean {
|
||||
if (typeof this.key === "string") {
|
||||
const value = tags[this.key]
|
||||
let value = tags[this.key]
|
||||
if(!value || value === ""){
|
||||
// No tag is known, so we assume the empty string
|
||||
// If this regexTag matches the empty string, we return true, otherwise false
|
||||
// (Note: if inverted, we must reverse this)
|
||||
return this.invert !== this.matchesEmpty
|
||||
}
|
||||
if(typeof value !== "string"){
|
||||
if(typeof this.value !== "string"){
|
||||
const regExp = this.value
|
||||
if(regExp.source === ".*"){
|
||||
// We match anything, and we do have a value
|
||||
return !this.invert
|
||||
}
|
||||
return RegexTag.doesMatch(value, JSON.stringify(this.value)) != this.invert
|
||||
|
||||
if (typeof value === "string") {
|
||||
return RegexTag.doesMatch(value, this.value) != this.invert
|
||||
}
|
||||
|
||||
// The value under test is _not_ a string; it can be a culculated tag, thus be e.g. a number or a boolean
|
||||
// It might also be an object
|
||||
|
||||
if (typeof this.value !== "string") {
|
||||
const regExp = this.value
|
||||
if (regExp.source === ".*") {
|
||||
// We match anything, and we do have some value
|
||||
return !this.invert
|
||||
}
|
||||
}
|
||||
if(typeof value !== "string"){
|
||||
value = JSON.stringify(value)
|
||||
}
|
||||
return RegexTag.doesMatch(value, this.value) != this.invert
|
||||
}
|
||||
|
||||
|
@ -175,7 +187,10 @@ export class RegexTag extends TagsFilter {
|
|||
continue
|
||||
}
|
||||
if (RegexTag.doesMatch(key, this.key)) {
|
||||
const value = tags[key] ?? ""
|
||||
let value = tags[key] ?? ""
|
||||
if(typeof value !== "string"){
|
||||
value = JSON.stringify(value)
|
||||
}
|
||||
return RegexTag.doesMatch(value, this.value) != this.invert
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue