forked from MapComplete/MapComplete
		
	Merge develop
This commit is contained in:
		
						commit
						448468c928
					
				
					 97 changed files with 5039 additions and 1139 deletions
				
			
		|  | @ -16,6 +16,8 @@ import LengthInput from "./LengthInput"; | |||
| import {GeoOperations} from "../../Logic/GeoOperations"; | ||||
| import {Unit} from "../../Models/Unit"; | ||||
| import {FixedInputElement} from "./FixedInputElement"; | ||||
| import WikidataSearchBox from "../Wikipedia/WikidataSearchBox"; | ||||
| import Wikidata from "../../Logic/Web/Wikidata"; | ||||
| 
 | ||||
| interface TextFieldDef { | ||||
|     name: string, | ||||
|  | @ -147,23 +149,58 @@ export default class ValidatedTextField { | |||
|         ), | ||||
|         ValidatedTextField.tp( | ||||
|             "wikidata", | ||||
|             "A wikidata identifier, e.g. Q42", | ||||
|             "A wikidata identifier, e.g. Q42. Input helper arguments: [ key: the value of this tag will initialize search (default: name), options: { removePrefixes: string[], removePostfixes: string[] }  these prefixes and postfixes will be removed from the initial search value]", | ||||
|             (str) => { | ||||
|                 if (str === undefined) { | ||||
|                     return false; | ||||
|                 } | ||||
|                 return (str.length > 1 && (str.startsWith("q") || str.startsWith("Q")) || str.startsWith("https://www.wikidata.org/wiki/Q")) | ||||
|                 if(str.length <= 2){ | ||||
|                     return false; | ||||
|                 } | ||||
|                 return !str.split(";").some(str => Wikidata.ExtractKey(str) === undefined) | ||||
|             }, | ||||
|             (str) => { | ||||
|                 if (str === undefined) { | ||||
|                     return undefined; | ||||
|                 } | ||||
|                 const wd = "https://www.wikidata.org/wiki/"; | ||||
|                 if (str.startsWith(wd)) { | ||||
|                     str = str.substr(wd.length) | ||||
|                 let out = str.split(";").map(str => Wikidata.ExtractKey(str)).join("; ") | ||||
|                 if(str.endsWith(";")){ | ||||
|                     out = out + ";" | ||||
|                 } | ||||
|                 return str.toUpperCase(); | ||||
|             }), | ||||
|                 return out; | ||||
|             }, | ||||
|             (currentValue, inputHelperOptions) => { | ||||
|                 const args = inputHelperOptions.args ?? [] | ||||
|                 const searchKey = args[0] ?? "name" | ||||
| 
 | ||||
|                 let searchFor = <string>inputHelperOptions.feature?.properties[searchKey]?.toLowerCase() | ||||
| 
 | ||||
|                 const options = args[1] | ||||
|                 if (searchFor !== undefined && options !== undefined) { | ||||
|                     const prefixes = <string[]>options["removePrefixes"] | ||||
|                     const postfixes = <string[]>options["removePostfixes"] | ||||
|                     for (const postfix of postfixes ?? []) { | ||||
|                         if (searchFor.endsWith(postfix)) { | ||||
|                             searchFor = searchFor.substring(0, searchFor.length - postfix.length) | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|                     for (const prefix of prefixes ?? []) { | ||||
|                         if (searchFor.startsWith(prefix)) { | ||||
|                             searchFor = searchFor.substring(prefix.length) | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|                 } | ||||
| 
 | ||||
|                 return new WikidataSearchBox({ | ||||
|                     value: currentValue, | ||||
|                     searchText: new UIEventSource<string>(searchFor) | ||||
|                 }) | ||||
|             } | ||||
|         ), | ||||
| 
 | ||||
|         ValidatedTextField.tp( | ||||
|             "int", | ||||
|  | @ -361,13 +398,13 @@ export default class ValidatedTextField { | |||
|             // This implies:
 | ||||
|             // We have to create a dropdown with applicable denominations, and fuse those values
 | ||||
|             const unit = options.unit | ||||
|              | ||||
|              | ||||
| 
 | ||||
| 
 | ||||
|             const isSingular = input.GetValue().map(str => str?.trim() === "1") | ||||
| 
 | ||||
|             const unitDropDown = | ||||
|                 unit.denominations.length === 1 ? | ||||
|                     new FixedInputElement( unit.denominations[0].getToggledHuman(isSingular), unit.denominations[0]) | ||||
|                     new FixedInputElement(unit.denominations[0].getToggledHuman(isSingular), unit.denominations[0]) | ||||
|                     : new DropDown("", | ||||
|                         unit.denominations.map(denom => { | ||||
|                             return { | ||||
|  | @ -378,17 +415,17 @@ export default class ValidatedTextField { | |||
|                     ) | ||||
|             unitDropDown.GetValue().setData(unit.defaultDenom) | ||||
|             unitDropDown.SetClass("w-min") | ||||
|              | ||||
|             const fixedDenom =  unit.denominations.length === 1 ? unit.denominations[0] : undefined | ||||
| 
 | ||||
|             const fixedDenom = unit.denominations.length === 1 ? unit.denominations[0] : undefined | ||||
|             input = new CombinedInputElement( | ||||
|                 input, | ||||
|                 unitDropDown, | ||||
|                 // combine the value from the textfield and the dropdown into the resulting value that should go into OSM
 | ||||
|                 (text, denom) => { | ||||
|                     if(denom === undefined){ | ||||
|                     if (denom === undefined) { | ||||
|                         return text | ||||
|                     } | ||||
|                     return denom?.canonicalValue(text, true)  | ||||
|                     return denom?.canonicalValue(text, true) | ||||
|                 }, | ||||
|                 (valueWithDenom: string) => { | ||||
|                     // Take the value from OSM and feed it into the textfield and the dropdown
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue