FeDirect/static/confirm_instance_details.mts

101 lines
3.5 KiB
TypeScript

// This file handles the "Confirm instance details" dialog
import { resize } from "./image.mjs";
import knownSoftware from "./known_software.mjs";
const blankImage = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
export function initializeInstanceDetailsDialog(
dialog: HTMLDialogElement,
callback: (
instanceName: string,
instanceHost: string,
instanceHostSecure: boolean,
instanceSoftware: string,
instanceIcon: string | null
) => void
): {
showInstanceDetailsDialog: () => void,
hideInstanceDetailsDialog: () => void,
populateInstanceDetailsDialog: (
instanceNameValue: string,
instanceHostValue: string,
instanceHostSecureValue: boolean,
instanceSoftwareValue: string,
instanceIconValue: string | null
) => void
} {
const showInstanceDetailsDialog = () => dialog.showModal();
const hideInstanceDetailsDialog = () => dialog.close();
const form = dialog.querySelector(".instanceDetailsForm");
if (!(form instanceof HTMLFormElement))
throw new Error(".instanceDetailsForm isn't a form");
const instanceName = form.querySelector("#instanceName");
if (!(instanceName instanceof HTMLInputElement))
throw new Error("#instanceName isn't an input");
const instanceHost = form.querySelector("#instanceHost");
if (!(instanceHost instanceof HTMLInputElement))
throw new Error("#instanceHost isn't an input");
const instanceHostSecure = form.querySelector("#instanceHostSecure");
if (!(instanceHostSecure instanceof HTMLInputElement))
throw new Error("#instanceHostSecure isn't an input");
const instanceSoftware = form.querySelector("#instanceSoftware");
if (!(instanceSoftware instanceof HTMLSelectElement))
throw new Error("#instanceSoftware isn't a select");
for (const [name, software] of Object.entries(knownSoftware.software)) {
const option = new Option(software.name, name);
instanceSoftware.appendChild(option);
}
const instanceIcon = form.querySelector("#instanceIcon");
if (!(instanceIcon instanceof HTMLImageElement))
throw new Error("#instanceIcon isn't an image");
instanceIcon.src = blankImage;
const populateInstanceDetailsDialog = (
instanceNameValue: string,
instanceHostValue: string,
instanceHostSecureValue: boolean,
instanceSoftwareValue: string,
instanceIconValue: string | null
) => {
instanceName.value = instanceNameValue;
instanceHost.value = instanceHostValue;
instanceHostSecure.checked = instanceHostSecureValue;
instanceSoftware.value = instanceSoftwareValue;
instanceIcon.src = instanceIconValue ?? blankImage;
};
form.addEventListener("submit", e => {
callback(
instanceName.value,
instanceHost.value,
instanceHostSecure.checked,
instanceSoftware.value,
instanceIcon.src == blankImage ? null : resize(instanceIcon)
);
form.reset();
});
const closeButton = form.querySelector(".close");
if (!(closeButton instanceof HTMLButtonElement))
throw new Error(".close isn't a button");
closeButton.addEventListener("click", e => {
instanceIcon.src = blankImage;
hideInstanceDetailsDialog();
});
return {
showInstanceDetailsDialog,
hideInstanceDetailsDialog,
populateInstanceDetailsDialog
};
}