mapcomplete/UI/Popup/EditableTagRendering.ts

90 lines
3.1 KiB
TypeScript
Raw Normal View History

2020-10-27 01:01:34 +01:00
import {UIElement} from "../UIElement";
import {UIEventSource} from "../../Logic/UIEventSource";
import TagRenderingConfig from "../../Customizations/JSON/TagRenderingConfig";
import TagRenderingQuestion from "./TagRenderingQuestion";
import Translations from "../i18n/Translations";
import Combine from "../Base/Combine";
import TagRenderingAnswer from "./TagRenderingAnswer";
import State from "../../State";
2020-11-06 01:58:26 +01:00
import Svg from "../../Svg";
import {TagUtils} from "../../Logic/Tags";
2020-10-27 01:01:34 +01:00
export default class EditableTagRendering extends UIElement {
private readonly _tags: UIEventSource<any>;
private readonly _configuration: TagRenderingConfig;
2020-10-27 01:01:34 +01:00
private _editMode: UIEventSource<boolean> = new UIEventSource<boolean>(false);
private _editButton: UIElement;
private _question: UIElement;
private _answer: UIElement;
constructor(tags: UIEventSource<any>,
configuration: TagRenderingConfig) {
super(tags);
this._tags = tags;
this._configuration = configuration;
this.ListenTo(this._editMode);
this.ListenTo(State.state?.osmConnection?.userDetails)
this._answer = new TagRenderingAnswer(tags, configuration);
this._answer.SetStyle("width:100%;")
2020-11-17 16:29:51 +01:00
this._question = this.GenerateQuestion();
this.dumbMode = false;
2020-10-27 01:01:34 +01:00
if (this._configuration.question !== undefined) {
if (State.state?.featureSwitchUserbadge?.data) {
2020-11-16 01:59:30 +01:00
// 2.3em total width
const self = this;
this._editButton =
Svg.pencil_svg().SetClass("edit-button")
.onClick(() => {
self._editMode.setData(true);
});
}
2020-11-16 01:59:30 +01:00
}
}
2020-10-27 01:01:34 +01:00
InnerRender(): string {
if (!this._configuration?.condition?.matchesProperties(this._tags.data)) {
return "";
}
if (this._editMode.data) {
return this._question.Render();
}
if (this._configuration.multiAnswer) {
const atLeastOneMatch = this._configuration.mappings.some(mp =>TagUtils.MatchesMultiAnswer(mp.if, this._tags.data));
if (!atLeastOneMatch) {
return "";
}
} else if (this._configuration.GetRenderValue(this._tags.data) === undefined) {
return "";
}
return new Combine([this._answer,
(State.state?.osmConnection?.userDetails?.data?.loggedIn ?? true) ? this._editButton : undefined
]).SetClass("answer")
.Render();
}
2020-11-16 01:59:30 +01:00
private GenerateQuestion() {
const self = this;
if (this._configuration.question !== undefined) {
2020-10-27 01:01:34 +01:00
// And at last, set up the skip button
const cancelbutton =
Translations.t.general.cancel.Clone()
.SetClass("cancel")
.onClick(() => {
self._editMode.setData(false)
});
2020-11-16 01:59:30 +01:00
return new TagRenderingQuestion(this._tags, this._configuration,
2020-10-27 01:01:34 +01:00
() => {
self._editMode.setData(false)
},
cancelbutton)
}
}
}