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,25 +147,37 @@ export class RegexTag extends TagsFilter {
 | 
				
			||||||
     * new RegexTag("key", new RegExp(".+")).matchesProperties({"key": undefined}) // => false
 | 
					     * 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": v}) // => false
 | 
				
			||||||
     * new RegexTag("key", new RegExp(".+")).matchesProperties({"key": ""}) // => 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") {
 | 
					        if (typeof this.key === "string") {
 | 
				
			||||||
            const value = tags[this.key]
 | 
					            let value = tags[this.key]
 | 
				
			||||||
            if(!value || value === ""){
 | 
					            if(!value || value === ""){
 | 
				
			||||||
                // No tag is known, so we assume the empty string
 | 
					                // No tag is known, so we assume the empty string
 | 
				
			||||||
                // If this regexTag matches the empty string, we return true, otherwise false
 | 
					                // If this regexTag matches the empty string, we return true, otherwise false
 | 
				
			||||||
                // (Note: if inverted, we must reverse this)
 | 
					                // (Note: if inverted, we must reverse this)
 | 
				
			||||||
                return this.invert !== this.matchesEmpty
 | 
					                return this.invert !== this.matchesEmpty
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if(typeof value !== "string"){
 | 
					
 | 
				
			||||||
 | 
					            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") {
 | 
					            if (typeof this.value !== "string") {
 | 
				
			||||||
                const regExp = this.value
 | 
					                const regExp = this.value
 | 
				
			||||||
                if (regExp.source === ".*") {
 | 
					                if (regExp.source === ".*") {
 | 
				
			||||||
                        // We match anything, and we do have a value
 | 
					                    // We match anything, and we do have some value
 | 
				
			||||||
                    return !this.invert
 | 
					                    return !this.invert
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                    return RegexTag.doesMatch(value, JSON.stringify(this.value)) != this.invert
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            if(typeof value !== "string"){
 | 
				
			||||||
 | 
					                value = JSON.stringify(value)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return RegexTag.doesMatch(value, this.value) != this.invert
 | 
					            return RegexTag.doesMatch(value, this.value) != this.invert
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -175,7 +187,10 @@ export class RegexTag extends TagsFilter {
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (RegexTag.doesMatch(key, this.key)) {
 | 
					            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
 | 
					                return RegexTag.doesMatch(value, this.value) != this.invert
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -180,7 +180,10 @@ export default class FilteredLayer {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Returns true if the given tags match the current filters (and the specified 'global filters')
 | 
					     * Returns true if the given tags match
 | 
				
			||||||
 | 
					     * - the current filters
 | 
				
			||||||
 | 
					     * - the specified 'global filters'
 | 
				
			||||||
 | 
					     * - the 'isShown'-filter set by the layer
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public isShown(properties: Record<string, string>, globalFilters?: GlobalFilter[]): boolean {
 | 
					    public isShown(properties: Record<string, string>, globalFilters?: GlobalFilter[]): boolean {
 | 
				
			||||||
        if (properties._deleted === "yes") {
 | 
					        if (properties._deleted === "yes") {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										33
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										33
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							| 
						 | 
					@ -19,13 +19,12 @@
 | 
				
			||||||
        "@turf/distance": "^6.5.0",
 | 
					        "@turf/distance": "^6.5.0",
 | 
				
			||||||
        "@turf/length": "^6.5.0",
 | 
					        "@turf/length": "^6.5.0",
 | 
				
			||||||
        "@turf/turf": "^6.5.0",
 | 
					        "@turf/turf": "^6.5.0",
 | 
				
			||||||
        "@types/dom-to-image": "^2.6.4",
 | 
					        "@types/mocha": "^10.0.1",
 | 
				
			||||||
        "@types/showdown": "^2.0.0",
 | 
					        "@types/showdown": "^2.0.0",
 | 
				
			||||||
        "chart.js": "^3.8.0",
 | 
					        "chart.js": "^3.8.0",
 | 
				
			||||||
        "country-language": "^0.1.7",
 | 
					        "country-language": "^0.1.7",
 | 
				
			||||||
        "csv-parse": "^5.1.0",
 | 
					        "csv-parse": "^5.1.0",
 | 
				
			||||||
        "doctest-ts-improved": "^0.8.8",
 | 
					        "doctest-ts-improved": "^0.8.8",
 | 
				
			||||||
        "dom-to-image": "^2.6.0",
 | 
					 | 
				
			||||||
        "email-validator": "^2.0.4",
 | 
					        "email-validator": "^2.0.4",
 | 
				
			||||||
        "escape-html": "^1.0.3",
 | 
					        "escape-html": "^1.0.3",
 | 
				
			||||||
        "fake-dom": "^1.0.4",
 | 
					        "fake-dom": "^1.0.4",
 | 
				
			||||||
| 
						 | 
					@ -3646,11 +3645,6 @@
 | 
				
			||||||
        "@types/chai": "*"
 | 
					        "@types/chai": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/dom-to-image": {
 | 
					 | 
				
			||||||
      "version": "2.6.4",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/dom-to-image/-/dom-to-image-2.6.4.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-UddUdGF1qulrSDulkz3K2Ypq527MR6ixlgAzqLbxSiQ0icx0XDlIV+h4+edmjq/1dqn0KgN0xGSe1kI9t+vGuw=="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/@types/estree": {
 | 
					    "node_modules/@types/estree": {
 | 
				
			||||||
      "version": "1.0.0",
 | 
					      "version": "1.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
 | 
				
			||||||
| 
						 | 
					@ -3715,6 +3709,11 @@
 | 
				
			||||||
        "@types/pbf": "*"
 | 
					        "@types/pbf": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@types/mocha": {
 | 
				
			||||||
 | 
					      "version": "10.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/node": {
 | 
					    "node_modules/@types/node": {
 | 
				
			||||||
      "version": "18.11.18",
 | 
					      "version": "18.11.18",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
 | 
				
			||||||
| 
						 | 
					@ -5457,11 +5456,6 @@
 | 
				
			||||||
        "url": "https://github.com/fb55/domhandler?sponsor=1"
 | 
					        "url": "https://github.com/fb55/domhandler?sponsor=1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/dom-to-image": {
 | 
					 | 
				
			||||||
      "version": "2.6.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/dom-to-image/-/dom-to-image-2.6.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA=="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/dom-walk": {
 | 
					    "node_modules/dom-walk": {
 | 
				
			||||||
      "version": "0.1.2",
 | 
					      "version": "0.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
 | 
				
			||||||
| 
						 | 
					@ -14768,11 +14762,6 @@
 | 
				
			||||||
        "@types/chai": "*"
 | 
					        "@types/chai": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "@types/dom-to-image": {
 | 
					 | 
				
			||||||
      "version": "2.6.4",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/dom-to-image/-/dom-to-image-2.6.4.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-UddUdGF1qulrSDulkz3K2Ypq527MR6ixlgAzqLbxSiQ0icx0XDlIV+h4+edmjq/1dqn0KgN0xGSe1kI9t+vGuw=="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "@types/estree": {
 | 
					    "@types/estree": {
 | 
				
			||||||
      "version": "1.0.0",
 | 
					      "version": "1.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
 | 
				
			||||||
| 
						 | 
					@ -14837,6 +14826,11 @@
 | 
				
			||||||
        "@types/pbf": "*"
 | 
					        "@types/pbf": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/mocha": {
 | 
				
			||||||
 | 
					      "version": "10.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "@types/node": {
 | 
					    "@types/node": {
 | 
				
			||||||
      "version": "18.11.18",
 | 
					      "version": "18.11.18",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
 | 
				
			||||||
| 
						 | 
					@ -16142,11 +16136,6 @@
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "dom-to-image": {
 | 
					 | 
				
			||||||
      "version": "2.6.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/dom-to-image/-/dom-to-image-2.6.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA=="
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "dom-walk": {
 | 
					    "dom-walk": {
 | 
				
			||||||
      "version": "0.1.2",
 | 
					      "version": "0.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -118,6 +118,7 @@
 | 
				
			||||||
    "@types/chai": "^4.3.0",
 | 
					    "@types/chai": "^4.3.0",
 | 
				
			||||||
    "@types/geojson": "^7946.0.10",
 | 
					    "@types/geojson": "^7946.0.10",
 | 
				
			||||||
    "@types/lz-string": "^1.3.34",
 | 
					    "@types/lz-string": "^1.3.34",
 | 
				
			||||||
 | 
					    "@types/mocha": "^10.0.1",
 | 
				
			||||||
    "@types/node": "^18.11.18",
 | 
					    "@types/node": "^18.11.18",
 | 
				
			||||||
    "@types/papaparse": "^5.3.1",
 | 
					    "@types/papaparse": "^5.3.1",
 | 
				
			||||||
    "@types/prompt-sync": "^4.1.0",
 | 
					    "@types/prompt-sync": "^4.1.0",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue