Fix small issue: wrong format for addExtraTags in some layers

This commit is contained in:
pietervdvn 2021-03-31 15:50:29 +02:00
parent edd10d52fd
commit e47accbab1
4 changed files with 53 additions and 51 deletions

View file

@ -17,13 +17,13 @@ export default class TagRenderingConfig {
readonly render?: Translation; readonly render?: Translation;
readonly question?: Translation; readonly question?: Translation;
readonly condition?: TagsFilter; readonly condition?: TagsFilter;
readonly configuration_warnings : string[] = [] readonly configuration_warnings: string[] = []
readonly freeform?: { readonly freeform?: {
readonly key: string, readonly key: string,
readonly type: string, readonly type: string,
readonly addExtraTags: TagsFilter[]; readonly addExtraTags: TagsFilter[];
}; };
readonly multiAnswer: boolean; readonly multiAnswer: boolean;
@ -49,13 +49,13 @@ export default class TagRenderingConfig {
throw "Initing a TagRenderingConfig with undefined in " + context; throw "Initing a TagRenderingConfig with undefined in " + context;
} }
if (typeof json === "string") { if (typeof json === "string") {
this.render = Translations.T(json, context+".render"); this.render = Translations.T(json, context + ".render");
this.multiAnswer = false; this.multiAnswer = false;
return; return;
} }
this.render = Translations.T(json.render, context+".render"); this.render = Translations.T(json.render, context + ".render");
this.question = Translations.T(json.question, context+".question"); this.question = Translations.T(json.question, context + ".question");
this.roaming = json.roaming ?? false; this.roaming = json.roaming ?? false;
const condition = FromJSON.Tag(json.condition ?? {"and": []}, `${context}.condition`); const condition = FromJSON.Tag(json.condition ?? {"and": []}, `${context}.condition`);
if (this.roaming && conditionIfRoaming !== undefined) { if (this.roaming && conditionIfRoaming !== undefined) {
@ -70,15 +70,18 @@ export default class TagRenderingConfig {
addExtraTags: json.freeform.addExtraTags?.map((tg, i) => addExtraTags: json.freeform.addExtraTags?.map((tg, i) =>
FromJSON.Tag(tg, `${context}.extratag[${i}]`)) ?? [] FromJSON.Tag(tg, `${context}.extratag[${i}]`)) ?? []
} }
if(this.freeform.key === undefined || this.freeform.key === ""){ if(json.freeform["extraTags"] !== undefined){
throw `Freeform.extraTags is defined. This should probably be 'freeform.addExtraTag' (at ${context})`
}
if (this.freeform.key === undefined || this.freeform.key === "") {
throw `Freeform.key is undefined or the empty string - this is not allowed; either fill out something or remove the freeform block alltogether. Error in ${context}` throw `Freeform.key is undefined or the empty string - this is not allowed; either fill out something or remove the freeform block alltogether. Error in ${context}`
} }
if (ValidatedTextField.AllTypes[this.freeform.type] === undefined) { if (ValidatedTextField.AllTypes[this.freeform.type] === undefined) {
throw `Freeform.key ${this.freeform.key} is an invalid type` throw `Freeform.key ${this.freeform.key} is an invalid type`
} }
if(this.freeform.addExtraTags){ if (this.freeform.addExtraTags) {
const usedKeys = new And(this.freeform.addExtraTags).usedKeys(); const usedKeys = new And(this.freeform.addExtraTags).usedKeys();
if(usedKeys.indexOf(this.freeform.key) >= 0){ if (usedKeys.indexOf(this.freeform.key) >= 0) {
throw `The freeform key ${this.freeform.key} will be overwritten by one of the extra tags, as they use the same key too. This is in ${context}`; throw `The freeform key ${this.freeform.key} will be overwritten by one of the extra tags, as they use the same key too. This is in ${context}`;
} }
} }
@ -86,8 +89,8 @@ export default class TagRenderingConfig {
this.multiAnswer = json.multiAnswer ?? false this.multiAnswer = json.multiAnswer ?? false
if (json.mappings) { if (json.mappings) {
this.mappings = json.mappings.map((mapping, i) => { this.mappings = json.mappings.map((mapping, i) => {
@ -131,30 +134,30 @@ export default class TagRenderingConfig {
if (this.freeform && this.render === undefined) { if (this.freeform && this.render === undefined) {
throw `${context}: Detected a freeform key without rendering... Key: ${this.freeform.key} in ${context}` throw `${context}: Detected a freeform key without rendering... Key: ${this.freeform.key} in ${context}`
} }
if(this.render && this.question && this.freeform === undefined){ if (this.render && this.question && this.freeform === undefined) {
throw `${context}: Detected a tagrendering which takes input without freeform key in ${context}; the question is ${this.question.txt}` throw `${context}: Detected a tagrendering which takes input without freeform key in ${context}; the question is ${this.question.txt}`
} }
if(!json.multiAnswer && this.mappings !== undefined && this.question !== undefined){ if (!json.multiAnswer && this.mappings !== undefined && this.question !== undefined) {
let keys = [] let keys = []
for (let i = 0; i < this.mappings.length; i++){ for (let i = 0; i < this.mappings.length; i++) {
const mapping = this.mappings[i]; const mapping = this.mappings[i];
if(mapping.if === undefined){ if (mapping.if === undefined) {
throw `${context}.mappings[${i}].if is undefined` throw `${context}.mappings[${i}].if is undefined`
} }
keys.push(...mapping.if.usedKeys()) keys.push(...mapping.if.usedKeys())
} }
keys = Utils.Dedup(keys) keys = Utils.Dedup(keys)
for (let i = 0; i < this.mappings.length; i++){ for (let i = 0; i < this.mappings.length; i++) {
const mapping = this.mappings[i]; const mapping = this.mappings[i];
if(mapping.hideInAnswer){ if (mapping.hideInAnswer) {
continue continue
} }
const usedKeys = mapping.if.usedKeys(); const usedKeys = mapping.if.usedKeys();
for (const expectedKey of keys) { for (const expectedKey of keys) {
if(usedKeys.indexOf(expectedKey) < 0){ if (usedKeys.indexOf(expectedKey) < 0) {
const msg = `${context}.mappings[${i}]: This mapping only defines values for ${usedKeys.join(', ')}, but it should also give a value for ${expectedKey}` const msg = `${context}.mappings[${i}]: This mapping only defines values for ${usedKeys.join(', ')}, but it should also give a value for ${expectedKey}`
this.configuration_warnings.push(msg) this.configuration_warnings.push(msg)
} }
@ -197,15 +200,15 @@ export default class TagRenderingConfig {
// Filtered away by the condition // Filtered away by the condition
return true; return true;
} }
if(this.multiAnswer){ if (this.multiAnswer) {
for (const m of this.mappings) { for (const m of this.mappings) {
if(TagUtils.MatchesMultiAnswer(m.if, tags)){ if (TagUtils.MatchesMultiAnswer(m.if, tags)) {
return true; return true;
} }
} }
const free = this.freeform?.key const free = this.freeform?.key
if(free !== undefined){ if (free !== undefined) {
return tags[free] !== undefined return tags[free] !== undefined
} }
return false return false
@ -219,11 +222,11 @@ export default class TagRenderingConfig {
return false; return false;
} }
public IsQuestionBoxElement(): boolean{ public IsQuestionBoxElement(): boolean {
return this.question === null && this.condition === null; return this.question === null && this.condition === null;
} }
/** /**
* Gets the correct rendering value (or undefined if not known) * Gets the correct rendering value (or undefined if not known)
* @constructor * @constructor

View file

@ -41,7 +41,7 @@ export default class TagRenderingQuestion extends UIElement {
constructor(tags: UIEventSource<any>, constructor(tags: UIEventSource<any>,
configuration: TagRenderingConfig, configuration: TagRenderingConfig,
afterSave?: () => void, afterSave?: () => void,
cancelButton?: UIElement cancelButton?: UIElement
) { ) {
super(tags); super(tags);
this._tags = tags; this._tags = tags;
@ -94,7 +94,19 @@ export default class TagRenderingQuestion extends UIElement {
).SetClass("block") ).SetClass("block")
} }
private GenerateInputElement(): InputElement<TagsFilter> { InnerRender(): string {
return new Combine([
this._question,
this._inputElement,
this._cancelButton,
this._saveButton,
this._appliedTags]
)
.SetClass("question")
.Render()
}
private GenerateInputElement(): InputElement<TagsFilter> {
const ff = this.GenerateFreeform(); const ff = this.GenerateFreeform();
const self = this; const self = this;
let mappings = let mappings =
@ -105,7 +117,7 @@ export default class TagRenderingQuestion extends UIElement {
return ff; return ff;
} }
if(ff){ if (ff) {
mappings.push(ff); mappings.push(ff);
} }
@ -131,11 +143,11 @@ export default class TagRenderingQuestion extends UIElement {
const tags: TagsFilter[] = indices.map(i => elements[i].GetValue().data); const tags: TagsFilter[] = indices.map(i => elements[i].GetValue().data);
const oppositeTags: TagsFilter[] = []; const oppositeTags: TagsFilter[] = [];
for (let i = 0; i < ifNotSelected.length; i++) { for (let i = 0; i < ifNotSelected.length; i++) {
if(indices.indexOf(i) >= 0){ if (indices.indexOf(i) >= 0) {
continue; continue;
} }
const notSelected = ifNotSelected[i]; const notSelected = ifNotSelected[i];
if(notSelected === undefined){ if (notSelected === undefined) {
continue; continue;
} }
oppositeTags.push(notSelected); oppositeTags.push(notSelected);
@ -223,7 +235,7 @@ export default class TagRenderingQuestion extends UIElement {
if (mapping.hideInAnswer === true) { if (mapping.hideInAnswer === true) {
return undefined; return undefined;
} }
if(typeof(mapping.hideInAnswer) !== "boolean" && mapping.hideInAnswer.matchesProperties(this._tags.data)){ if (typeof (mapping.hideInAnswer) !== "boolean" && mapping.hideInAnswer.matchesProperties(this._tags.data)) {
return undefined; return undefined;
} }
return new FixedInputElement( return new FixedInputElement(
@ -232,7 +244,6 @@ export default class TagRenderingQuestion extends UIElement {
(t0, t1) => t1.isEquivalent(t0)); (t0, t1) => t1.isEquivalent(t0));
} }
private GenerateFreeform(): InputElement<TagsFilter> { private GenerateFreeform(): InputElement<TagsFilter> {
const freeform = this._configuration.freeform; const freeform = this._configuration.freeform;
if (freeform === undefined) { if (freeform === undefined) {
@ -287,16 +298,4 @@ export default class TagRenderingQuestion extends UIElement {
} }
InnerRender(): string {
return new Combine([
this._question,
this._inputElement,
this._cancelButton,
this._saveButton,
this._appliedTags]
)
.SetClass("question")
.Render()
}
} }

View file

@ -65,7 +65,7 @@
}, },
"freeform": { "freeform": {
"key": "charge", "key": "charge",
"extraTags": ["fee=yes"] "addExtraTags": ["fee=yes"]
}, },
"mappings": [ "mappings": [
{ {

View file

@ -67,7 +67,7 @@
}, },
"freeform": { "freeform": {
"key": "bicycle_parking", "key": "bicycle_parking",
"extraTags": [ "addExtraTags": [
"fixme=Freeform used on 'bicycle_parking'-tag: possibly a wrong value" "fixme=Freeform used on 'bicycle_parking'-tag: possibly a wrong value"
] ]
}, },
@ -260,7 +260,7 @@
}, },
"freeform": { "freeform": {
"key": "access", "key": "access",
"extraTags": [ "addExtraTags": [
"fixme=Freeform used on 'access'-tag: possibly a wrong value" "fixme=Freeform used on 'access'-tag: possibly a wrong value"
] ]
}, },