forked from MapComplete/MapComplete
Use a dropdown if there are a lot of options to choose from in tagrenderingquestion
This commit is contained in:
parent
1609c63f3b
commit
55f03c3de7
2 changed files with 59 additions and 20 deletions
|
@ -23,6 +23,7 @@ import {Tag} from "../../Logic/Tags/Tag";
|
||||||
import {And} from "../../Logic/Tags/And";
|
import {And} from "../../Logic/Tags/And";
|
||||||
import {TagUtils} from "../../Logic/Tags/TagUtils";
|
import {TagUtils} from "../../Logic/Tags/TagUtils";
|
||||||
import BaseUIElement from "../BaseUIElement";
|
import BaseUIElement from "../BaseUIElement";
|
||||||
|
import {DropDown} from "../Input/DropDown";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shows the question element.
|
* Shows the question element.
|
||||||
|
@ -96,7 +97,6 @@ export default class TagRenderingQuestion extends UIElement {
|
||||||
).SetClass("block break-all")
|
).SetClass("block break-all")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
InnerRender() {
|
InnerRender() {
|
||||||
|
@ -111,24 +111,58 @@ export default class TagRenderingQuestion extends UIElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
private GenerateInputElement(): InputElement<TagsFilter> {
|
private GenerateInputElement(): InputElement<TagsFilter> {
|
||||||
const ff = this.GenerateFreeform();
|
|
||||||
const self = this;
|
const self = this;
|
||||||
let mappings =
|
let inputEls: InputElement<TagsFilter>[];
|
||||||
(this._configuration.mappings ?? []).map(mapping => self.GenerateMappingElement(mapping));
|
|
||||||
mappings = Utils.NoNull(mappings);
|
|
||||||
|
|
||||||
if (mappings.length == 0) {
|
const mappings = (this._configuration.mappings??[])
|
||||||
|
.filter( mapping => {
|
||||||
|
if(mapping.hideInAnswer === true){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (typeof (mapping.hideInAnswer) !== "boolean" && mapping.hideInAnswer.matchesProperties(this._tags.data)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
let allIfNots: TagsFilter[] = Utils.NoNull(this._configuration.mappings?.map(m => m.ifnot) ?? [] );
|
||||||
|
const ff = this.GenerateFreeform();
|
||||||
|
const hasImages = mappings.filter(mapping => mapping.then.ExtractImages().length > 0).length > 0
|
||||||
|
|
||||||
|
if (mappings.length < 8 || this._configuration.multiAnswer || hasImages) {
|
||||||
|
inputEls = (mappings ?? []).map(mapping => self.GenerateMappingElement(mapping, allIfNots));
|
||||||
|
inputEls = Utils.NoNull(inputEls);
|
||||||
|
} else {
|
||||||
|
const dropdown: InputElement<TagsFilter> = new DropDown("",
|
||||||
|
mappings.map(mapping => {
|
||||||
|
return {
|
||||||
|
value: new And([mapping.if, ...allIfNots]),
|
||||||
|
shown: Translations.WT(mapping.then).Clone()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
if (ff == undefined) {
|
||||||
|
return dropdown;
|
||||||
|
} else {
|
||||||
|
inputEls = [dropdown]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (inputEls.length == 0) {
|
||||||
return ff;
|
return ff;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ff) {
|
if (ff) {
|
||||||
mappings.push(ff);
|
inputEls.push(ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._configuration.multiAnswer) {
|
if (this._configuration.multiAnswer) {
|
||||||
return this.GenerateMultiAnswer(mappings, ff, this._configuration.mappings.map(mp => mp.ifnot))
|
return this.GenerateMultiAnswer(inputEls, ff, this._configuration.mappings.map(mp => mp.ifnot))
|
||||||
} else {
|
} else {
|
||||||
return new RadioButton(mappings, false)
|
return new RadioButton(inputEls, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -237,16 +271,16 @@ export default class TagRenderingQuestion extends UIElement {
|
||||||
if: TagsFilter,
|
if: TagsFilter,
|
||||||
then: Translation,
|
then: Translation,
|
||||||
hideInAnswer: boolean | TagsFilter
|
hideInAnswer: boolean | TagsFilter
|
||||||
}): InputElement<TagsFilter> {
|
}, ifNot?: TagsFilter[]): InputElement<TagsFilter> {
|
||||||
if (mapping.hideInAnswer === true) {
|
|
||||||
return undefined;
|
let tagging = mapping.if;
|
||||||
}
|
if (ifNot.length > 0) {
|
||||||
if (typeof (mapping.hideInAnswer) !== "boolean" && mapping.hideInAnswer.matchesProperties(this._tags.data)) {
|
tagging = new And([tagging, ...ifNot])
|
||||||
return undefined;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return new FixedInputElement(
|
return new FixedInputElement(
|
||||||
new SubstitutedTranslation(mapping.then, this._tags),
|
new SubstitutedTranslation(mapping.then, this._tags),
|
||||||
mapping.if,
|
tagging,
|
||||||
(t0, t1) => t1.isEquivalent(t0));
|
(t0, t1) => t1.isEquivalent(t0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -159,7 +159,12 @@ export default class ShowDataLayer {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (selected.properties.id === feature.properties.id) {
|
if (selected.properties.id === feature.properties.id) {
|
||||||
leafletLayer.openPopup()
|
// A small sanity check to prevent infinite loops:
|
||||||
|
// If a feature is rendered both as way and as point, opening one popup might trigger the other to open, which might trigger the one to open again
|
||||||
|
if(selected.geometry.type === feature.geometry.type){
|
||||||
|
leafletLayer.openPopup()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue