control/elevationProfile/PointListDialog.tstypescript
import { Button } from "../../ui/Button";
import { View } from "../../ui/View";
import { type IDialogParams, Dialog } from "../../ui/Dialog";
import { ElevationProfileScene } from "./ElevationProfileScene";
import { LonLat } from "../../LonLat";

const LIST_TEMPLATE = `<div class="og-elevationprofile-list">
        <textarea placeholder="[[lon, lat, height], [lon, lat, height], ..., [lon, lat, height]]"></textarea>
        <div class="og-elevationprofile-list-buttons"></div>
    </div>`;

interface IPointListDialog extends IDialogParams {
    model: ElevationProfileScene;
}

class PointListDialog extends Dialog<ElevationProfileScene> {
    public $textarea: HTMLTextAreaElement | null;

    constructor(params: IPointListDialog) {
        super({
            title: "Points List",
            visible: false,
            resizable: true,
            useHide: true,
            top: 150,
            left: 200,
            width: 400,
            height: 300,
            minHeight: 100,
            minWidth: 100,
            ...params
        });

        this.$textarea = null;
    }

    public override render(params?: any): this {
        super.render(params);

        let view = new View({
            template: LIST_TEMPLATE
        });
        view.appendTo(this.container!);

        let applyBtn = new Button({
            classList: ["og-elevationprofile-list-apply"],
            icon: "Apply"
        });
        applyBtn.appendTo(view.select(".og-elevationprofile-list-buttons")!);

        applyBtn.events.on("click", this._onApplyClick);

        this.$textarea = view.select("textarea");

        return this;
    }

    protected _onApplyClick = () => {
        try {
            this.model.clear();
            let coordsArr = JSON.parse(this.$textarea!.value);
            let lonLatArr: LonLat[] = new Array(coordsArr.length);
            for (let i = 0; i < coordsArr.length; i++) {
                let ci = coordsArr[i];
                lonLatArr[i] = new LonLat(ci[0], ci[1], ci[2]);
            }
            this.model.addPointLonLatArrayAsync(lonLatArr);
        } catch (err) {
            console.error(err);
        }
    };
}

export { PointListDialog };