96 lines
3.1 KiB
TypeScript
96 lines
3.1 KiB
TypeScript
import FeaturePipelineState from "../../Logic/State/FeaturePipelineState"
|
|
import BaseUIElement from "../BaseUIElement"
|
|
import Translations from "../i18n/Translations"
|
|
import { Utils } from "../../Utils"
|
|
import Svg from "../../Svg"
|
|
import Img from "../Base/Img"
|
|
import { SubtleButton } from "../Base/SubtleButton"
|
|
import Toggle from "../Input/Toggle"
|
|
import { LoginToggle } from "./LoginButton"
|
|
import { SpecialVisualization } from "../SpecialVisualization"
|
|
|
|
export class CloseNoteButton implements SpecialVisualization {
|
|
public readonly funcName = "close_note"
|
|
public readonly docs =
|
|
"Button to close a note. A predifined text can be defined to close the note with. If the note is already closed, will show a small text."
|
|
public readonly args = [
|
|
{
|
|
name: "text",
|
|
doc: "Text to show on this button",
|
|
required: true,
|
|
},
|
|
{
|
|
name: "icon",
|
|
doc: "Icon to show",
|
|
defaultValue: "checkmark.svg",
|
|
},
|
|
{
|
|
name: "idkey",
|
|
doc: "The property name where the ID of the note to close can be found",
|
|
defaultValue: "id",
|
|
},
|
|
{
|
|
name: "comment",
|
|
doc: "Text to add onto the note when closing",
|
|
},
|
|
{
|
|
name: "minZoom",
|
|
doc: "If set, only show the closenote button if zoomed in enough",
|
|
},
|
|
{
|
|
name: "zoomButton",
|
|
doc: "Text to show if not zoomed in enough",
|
|
},
|
|
]
|
|
|
|
public constr(state: FeaturePipelineState, tags, args): BaseUIElement {
|
|
const t = Translations.t.notes
|
|
|
|
const params: {
|
|
text: string
|
|
icon: string
|
|
idkey: string
|
|
comment: string
|
|
minZoom: string
|
|
zoomButton: string
|
|
} = Utils.ParseVisArgs(this.args, args)
|
|
|
|
let icon = Svg.checkmark_svg()
|
|
if (params.icon !== "checkmark.svg" && (args[2] ?? "") !== "") {
|
|
icon = new Img(args[1])
|
|
}
|
|
let textToShow = t.closeNote
|
|
if ((params.text ?? "") !== "") {
|
|
textToShow = Translations.T(args[0])
|
|
}
|
|
|
|
let closeButton: BaseUIElement = new SubtleButton(icon, textToShow)
|
|
const isClosed = tags.map((tags) => (tags["closed_at"] ?? "") !== "")
|
|
closeButton.onClick(() => {
|
|
const id = tags.data[args[2] ?? "id"]
|
|
state.osmConnection.closeNote(id, args[3])?.then((_) => {
|
|
tags.data["closed_at"] = new Date().toISOString()
|
|
tags.ping()
|
|
})
|
|
})
|
|
|
|
if ((params.minZoom ?? "") !== "" && !isNaN(Number(params.minZoom))) {
|
|
closeButton = new Toggle(
|
|
closeButton,
|
|
params.zoomButton ?? "",
|
|
state.locationControl.map((l) => l.zoom >= Number(params.minZoom))
|
|
)
|
|
}
|
|
|
|
return new LoginToggle(
|
|
new Toggle(
|
|
t.isClosed.SetClass("thanks"),
|
|
closeButton,
|
|
|
|
isClosed
|
|
),
|
|
t.loginToClose,
|
|
state
|
|
)
|
|
}
|
|
}
|