118 lines
4.2 KiB
TypeScript
118 lines
4.2 KiB
TypeScript
import Translations from "../i18n/Translations"
|
|
import { TextField } from "../Input/TextField"
|
|
import { SubtleButton } from "../Base/SubtleButton"
|
|
import Svg from "../../Svg"
|
|
import NoteCommentElement from "./NoteCommentElement"
|
|
import { VariableUiElement } from "../Base/VariableUIElement"
|
|
import Toggle from "../Input/Toggle"
|
|
import { LoginToggle } from "./LoginButton"
|
|
import Combine from "../Base/Combine"
|
|
import Title from "../Base/Title"
|
|
import { SpecialVisualization, SpecialVisualizationState } from "../SpecialVisualization"
|
|
import { UIEventSource } from "../../Logic/UIEventSource"
|
|
|
|
export class AddNoteCommentViz implements SpecialVisualization {
|
|
funcName = "add_note_comment"
|
|
docs = "A textfield to add a comment to a node (with the option to close the note)."
|
|
args = [
|
|
{
|
|
name: "Id-key",
|
|
doc: "The property name where the ID of the note to close can be found",
|
|
defaultValue: "id",
|
|
},
|
|
]
|
|
|
|
public constr(
|
|
state: SpecialVisualizationState,
|
|
tags: UIEventSource<Record<string, string>>,
|
|
args: string[]
|
|
) {
|
|
const t = Translations.t.notes
|
|
const textField = new TextField({
|
|
placeholder: t.addCommentPlaceholder,
|
|
inputStyle: "width: 100%; height: 6rem;",
|
|
textAreaRows: 3,
|
|
htmlType: "area",
|
|
})
|
|
textField.SetClass("rounded-l border border-grey")
|
|
const txt = textField.GetValue()
|
|
|
|
const addCommentButton = new SubtleButton(
|
|
Svg.speech_bubble_svg().SetClass("max-h-7"),
|
|
t.addCommentPlaceholder
|
|
).onClick(async () => {
|
|
const id = tags.data[args[1] ?? "id"]
|
|
|
|
if ((txt.data ?? "") == "") {
|
|
return
|
|
}
|
|
|
|
if (isClosed.data) {
|
|
await state.osmConnection.reopenNote(id, txt.data)
|
|
await state.osmConnection.closeNote(id)
|
|
} else {
|
|
await state.osmConnection.addCommentToNote(id, txt.data)
|
|
}
|
|
NoteCommentElement.addCommentTo(txt.data, tags, state)
|
|
txt.setData("")
|
|
})
|
|
|
|
const close = new SubtleButton(
|
|
Svg.resolved_svg().SetClass("max-h-7"),
|
|
new VariableUiElement(
|
|
txt.map((txt) => {
|
|
if (txt === undefined || txt === "") {
|
|
return t.closeNote
|
|
}
|
|
return t.addCommentAndClose
|
|
})
|
|
)
|
|
).onClick(async () => {
|
|
const id = tags.data[args[1] ?? "id"]
|
|
await state.osmConnection.closeNote(id, txt.data)
|
|
tags.data["closed_at"] = new Date().toISOString()
|
|
tags.ping()
|
|
})
|
|
|
|
const reopen = new SubtleButton(
|
|
Svg.note_svg().SetClass("max-h-7"),
|
|
new VariableUiElement(
|
|
txt.map((txt) => {
|
|
if (txt === undefined || txt === "") {
|
|
return t.reopenNote
|
|
}
|
|
return t.reopenNoteAndComment
|
|
})
|
|
)
|
|
).onClick(async () => {
|
|
const id = tags.data[args[1] ?? "id"]
|
|
await state.osmConnection.reopenNote(id, txt.data)
|
|
tags.data["closed_at"] = undefined
|
|
tags.ping()
|
|
})
|
|
|
|
const isClosed = tags.map((tags) => (tags["closed_at"] ?? "") !== "")
|
|
const stateButtons = new Toggle(
|
|
new Toggle(reopen, close, isClosed),
|
|
undefined,
|
|
state.osmConnection.isLoggedIn
|
|
)
|
|
|
|
return new LoginToggle(
|
|
new Combine([
|
|
new Title(t.addAComment),
|
|
textField,
|
|
new Combine([
|
|
stateButtons.SetClass("sm:mr-2"),
|
|
new Toggle(
|
|
addCommentButton,
|
|
new Combine([t.typeText]).SetClass("flex items-center h-full subtle"),
|
|
textField.GetValue().map((t) => t !== undefined && t.length >= 1)
|
|
).SetClass("sm:mr-2"),
|
|
]).SetClass("sm:flex sm:justify-between sm:items-stretch"),
|
|
]).SetClass("border-2 border-black rounded-xl p-4 block"),
|
|
t.loginToAddComment,
|
|
state
|
|
)
|
|
}
|
|
}
|