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>, 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 ) } }