const fs = require("fs"); const {ipcRenderer} = require("electron"); const docReady = require("doc-ready"); let promptId = null; let promptOptions = null; docReady(promptRegister); //start here function promptRegister() { //get custom session id promptId = document.location.hash.replace("#", ""); //get options from back try { promptOptions = JSON.parse(ipcRenderer.sendSync("prompt-get-options:" + promptId)); } catch (error) { return promptError(error); } //set label if (promptOptions.useHtmlLabel) { document.querySelector("#label").innerHTML = promptOptions.label; } else { document.querySelector("#label").textContent = promptOptions.label; } //set button label if (promptOptions.buttonLabels && promptOptions.buttonLabels.ok) { document.querySelector("#ok").textContent = promptOptions.buttonLabels.ok; } if (promptOptions.buttonLabels && promptOptions.buttonLabels.cancel) { document.querySelector("#cancel").textContent = promptOptions.buttonLabels.cancel; } //inject custom stylesheet from options if (promptOptions.customStylesheet) { try { const customStyleContent = fs.readFileSync(promptOptions.customStylesheet); if (customStyleContent) { const customStyle = document.createElement("style"); customStyle.setAttribute("rel", "stylesheet"); customStyle.append(document.createTextNode(customStyleContent)); document.head.append(customStyle); } } catch (error) { return promptError(error); } } //add button listeners document.querySelector("#form").addEventListener("submit", promptSubmit); document.querySelector("#cancel").addEventListener("click", promptCancel); //create input/select const dataContainerElement = document.querySelector("#data-container"); let dataElement; if (promptOptions.type === "input") { dataElement = promptCreateInput(); } else if (promptOptions.type === "select") { dataElement = promptCreateSelect(); } else { return promptError(`Unhandled input type '${promptOptions.type}'`); } dataContainerElement.append(dataElement); dataElement.setAttribute("id", "data"); dataElement.focus(); if (promptOptions.type === "input") { dataElement.select(); } //load custom script from options if (promptOptions.customScript) { try { const customScript = require(promptOptions.customScript); customScript(); } catch (error) { return promptError(error); } } } window.addEventListener("error", error => { if (promptId) { promptError("An error has occured on the prompt window: \n" + error); } }); //send error to back function promptError(error) { if (error instanceof Error) { error = error.message; } ipcRenderer.sendSync("prompt-error:" + promptId, error); } //send to back: input=null function promptCancel() { ipcRenderer.sendSync("prompt-post-data:" + promptId, null); } //transfer input data to back function promptSubmit() { const dataElement = document.querySelector("#data"); let data = null; if (promptOptions.type === "input") { data = dataElement.value; } else if (promptOptions.type === "select") { data = promptOptions.selectMultiple ? dataElement.querySelectorAll("option[selected]").map(o => o.getAttribute("value")) : dataElement.value; } ipcRenderer.sendSync("prompt-post-data:" + promptId, data); } //creates input box function promptCreateInput() { const dataElement = document.createElement("input"); dataElement.setAttribute("type", "text"); if (promptOptions.value) { dataElement.value = promptOptions.value; } else { dataElement.value = ""; } //insert custom input attributes if in options if (promptOptions.inputAttrs && typeof (promptOptions.inputAttrs) === "object") { for (const k in promptOptions.inputAttrs) { if (!Object.prototype.hasOwnProperty.call(promptOptions.inputAttrs, k)) { continue; } dataElement.setAttribute(k, promptOptions.inputAttrs[k]); } } //Cancel/Exit on 'Escape' dataElement.addEventListener("keyup", event => { if (event.key === "Escape") { promptCancel(); } }); //Confrim on 'Enter' dataElement.addEventListener("keypress", event => { if (event.key === "Enter") { event.preventDefault(); document.querySelector("#ok").click(); } }); return dataElement; } //create multiple select function promptCreateSelect() { const dataElement = document.createElement("select"); let optionElement; for (const k in promptOptions.selectOptions) { if (!Object.prototype.hasOwnProperty.call(promptOptions.selectOptions, k)) { continue; } optionElement = document.createElement("option"); optionElement.setAttribute("value", k); optionElement.textContent = promptOptions.selectOptions[k]; if (k === promptOptions.value) { optionElement.setAttribute("selected", "selected"); } dataElement.append(optionElement); } return dataElement; }