mapcomplete/UI/Popup/EditableTagRendering.ts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

122 lines
4.7 KiB
TypeScript
Raw Normal View History

import { Store, UIEventSource } from "../../Logic/UIEventSource"
2020-10-27 01:01:34 +01:00
import TagRenderingQuestion from "./TagRenderingQuestion"
import Translations from "../i18n/Translations"
import Combine from "../Base/Combine"
import TagRenderingAnswer from "./TagRenderingAnswer"
2021-06-14 02:39:23 +02:00
import Toggle from "../Input/Toggle"
import BaseUIElement from "../BaseUIElement"
import TagRenderingConfig from "../../Models/ThemeConfig/TagRenderingConfig"
2022-12-16 13:45:07 +01:00
import { Unit } from "../../Models/Unit"
import Lazy from "../Base/Lazy"
2022-12-16 13:45:07 +01:00
import { FixedUiElement } from "../Base/FixedUiElement"
import { EditButton } from "./SaveButton"
import { UploadableTag } from "../../Logic/Tags/TagUtils"
2020-10-27 01:01:34 +01:00
2021-06-14 02:39:23 +02:00
export default class EditableTagRendering extends Toggle {
2020-10-27 01:01:34 +01:00
constructor(
tags: UIEventSource<any>,
2021-06-16 21:23:03 +02:00
configuration: TagRenderingConfig,
units: Unit[],
state,
2021-11-07 16:34:51 +01:00
options: {
editMode?: UIEventSource<boolean>
innerElementClasses?: string
/* Classes applied _only_ on the rendered element, not on the question*/
answerElementClasses?: string
/* Default will apply the tags to the relevant object, only use in special cases */
createSaveButton?: (src: Store<UploadableTag>) => BaseUIElement
2021-10-28 00:53:09 +02:00
}
) {
// The tagrendering is hidden if:
// - The answer is unknown. The questionbox will then show the question
// - There is a condition hiding the answer
const renderingIsShown = tags.map(
(tags) =>
configuration.IsKnown(tags) &&
(configuration?.condition?.matchesProperties(tags) ?? true)
2022-09-08 21:40:48 +02:00
)
const editMode = options.editMode ?? new UIEventSource<boolean>(false)
super(
2021-10-28 00:53:09 +02:00
new Lazy(() => {
2022-01-30 18:29:00 +01:00
let rendering = EditableTagRendering.CreateRendering(
state,
tags,
configuration,
units,
editMode,
{
saveButtonConstructor: options?.createSaveButton,
answerElementClasses: options?.answerElementClasses,
}
2022-09-08 21:40:48 +02:00
)
2021-10-28 00:53:09 +02:00
rendering.SetClass(options.innerElementClasses)
if (state?.featureSwitchIsDebugging?.data || state?.featureSwitchIsTesting?.data) {
2022-01-30 18:29:00 +01:00
rendering = new Combine([
new FixedUiElement(configuration.id).SetClass("self-end subtle"),
rendering,
]).SetClass("flex flex-col")
}
2021-10-28 00:53:09 +02:00
return rendering
}),
undefined,
renderingIsShown
)
2022-12-16 13:45:07 +01:00
const self = this
editMode.addCallback((editing) => {
if (editing) {
self.ScrollIntoView()
}
})
}
2021-11-07 16:34:51 +01:00
2022-06-06 20:12:04 +02:00
private static CreateRendering(
state: any /*FeaturePipelineState*/,
2022-06-06 20:12:04 +02:00
tags: UIEventSource<any>,
configuration: TagRenderingConfig,
units: Unit[],
editMode: UIEventSource<boolean>,
options?: {
saveButtonConstructor?: (src: Store<UploadableTag>) => BaseUIElement
answerElementClasses?: string
}
2022-06-06 20:12:04 +02:00
): BaseUIElement {
const answer: BaseUIElement = new TagRenderingAnswer(tags, configuration, state)
2021-06-16 14:23:53 +02:00
answer.SetClass("w-full")
2021-06-14 02:39:23 +02:00
let rendering = answer
2020-10-27 01:01:34 +01:00
if (configuration.question !== undefined && (state?.featureSwitchUserbadge?.data ?? true)) {
2021-06-14 02:39:23 +02:00
// We have a question and editing is enabled
const question = new Lazy(
() =>
2022-01-26 21:40:38 +01:00
new TagRenderingQuestion(tags, configuration, state, {
units: units,
cancelButton: Translations.t.general.cancel
.Clone()
2022-02-04 00:45:22 +01:00
.SetClass("btn btn-secondary")
.onClick(() => {
editMode.setData(false)
}),
saveButtonConstr: options?.saveButtonConstructor,
afterSave: () => {
editMode.setData(false)
},
})
2021-06-14 02:39:23 +02:00
)
2022-09-08 21:40:48 +02:00
2022-12-16 13:45:07 +01:00
const answerWithEditButton = new Combine([
answer,
new EditButton(state?.osmConnection, () => {
editMode.setData(true)
question.ScrollIntoView({
2022-12-16 13:45:07 +01:00
onlyIfPartiallyHidden: true,
})
}),
]).SetClass("flex justify-between w-full " + (options?.answerElementClasses ?? ""))
rendering = new Toggle(question, answerWithEditButton, editMode)
2020-10-27 01:01:34 +01:00
}
return rendering
2020-10-27 01:01:34 +01:00
}
}