From 0e9b15722a02fc1e423fb0d5eec4cd969d397dae Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Tue, 6 Apr 2021 01:30:47 +0300 Subject: [PATCH] add inline doc --- index.js | 18 ++-- menu.js | 1 + providers/logger.js | 20 ++-- providers/prompt/index.js | 41 +++++--- providers/prompt/page/prompt.js | 168 ++++++++++++++++++-------------- providers/prompt/readme.md | 5 +- 6 files changed, 148 insertions(+), 105 deletions(-) diff --git a/index.js b/index.js index 9e8b7233..7fd88754 100644 --- a/index.js +++ b/index.js @@ -110,8 +110,8 @@ function createMainWindow() { titleBarStyle: useInlineMenu ? "hidden" : is.macOS() - ? "hiddenInset" - : "default", + ? "hiddenInset" + : "default", autoHideMenuBar: config.get("options.hideMenu"), }); if (windowPosition) { @@ -156,7 +156,7 @@ function createMainWindow() { let createdWindow = false; app.on("browser-window-created", (event, win) => { - //Ensure listeners aren't registered when creating input dialog + //Ensures listeners are registered only once if (createdWindow) { return; } @@ -172,7 +172,7 @@ app.on("browser-window-created", (event, win) => { frameProcessId, frameRoutingId, ) => { - let log = { + const log = { error: "did-fail-load", event, errorCode, @@ -183,7 +183,7 @@ app.on("browser-window-created", (event, win) => { frameRoutingId, }; if (is.dev()) { - console.log(log); + console.log(log.toString()); } win.webContents.send("log", log); win.webContents.loadFile(path.join(__dirname, "error.html")); @@ -306,13 +306,11 @@ app.on("ready", () => { } // Optimized for Mac OS X - if (is.macOS()) { - if (!config.get("options.appVisible")) { - app.dock.hide(); - } + if (is.macOS() && !config.get("options.appVisible")) { + app.dock.hide(); } - var forceQuit = false; + let forceQuit = false; app.on("before-quit", () => { forceQuit = true; }); diff --git a/menu.js b/menu.js index c0495d68..21ac1e7a 100644 --- a/menu.js +++ b/menu.js @@ -12,6 +12,7 @@ const pluginEnabledMenu = (win, plugin, label = "", hasSubmenu = false) => ({ label: label || plugin, type: "checkbox", checked: config.plugins.isEnabled(plugin), + //Submenu check used in in-app-menu hasSubmenu: hasSubmenu || undefined, click: (item) => { if (item.checked) { diff --git a/providers/logger.js b/providers/logger.js index 08a940f3..730a3dfa 100644 --- a/providers/logger.js +++ b/providers/logger.js @@ -1,11 +1,15 @@ const { ipcRenderer } = require("electron"); +function logToString(log) { + let string = (typeof log === "string") ? log : log.toString(); + if (!string || string.includes("[object Object]")) { + string = JSON.stringify(log); + } + return string; +} + module.exports = () => { - ipcRenderer.on("log", (event, log) => { - let string = log || log.toString(); - if (!string || string === "[object Object]") { - string = JSON.stringify(log); - } - console.log(string); - }) -}; \ No newline at end of file + ipcRenderer.on("log", (event, log) => { + console.log(logToString(log)); + }); +}; diff --git a/providers/prompt/index.js b/providers/prompt/index.js index 302eeea0..bbba8b78 100644 --- a/providers/prompt/index.js +++ b/providers/prompt/index.js @@ -10,8 +10,10 @@ const DEFAULT_HEIGHT = 160; function electronPrompt(options, parentWindow) { return new Promise((resolve, reject) => { + //id used to ensure unique listeners per window const id = `${Date.now()}-${Math.random()}`; + //custom options override default const options_ = Object.assign( { width: DEFAULT_WIDTH, @@ -19,12 +21,12 @@ function electronPrompt(options, parentWindow) { minWidth: DEFAULT_WIDTH, minHeight: DEFAULT_HEIGHT, resizable: false, - title: 'Prompt', - label: 'Please input a value:', + title: "Prompt", + label: "Please input a value:", buttonLabels: null, alwaysOnTop: false, value: null, - type: 'input', + type: "input", selectOptions: null, icon: null, useHtmlLabel: false, @@ -70,10 +72,7 @@ function electronPrompt(options, parentWindow) { promptWindow.setMenu(null); promptWindow.setMenuBarVisibility(options_.menuBarVisible); - const getOptionsListener = event => { - event.returnValue = JSON.stringify(options_); - }; - + //called on exit const cleanup = () => { ipcMain.removeListener("prompt-get-options:" + id, getOptionsListener); ipcMain.removeListener("prompt-post-data:" + id, postDataListener); @@ -85,6 +84,12 @@ function electronPrompt(options, parentWindow) { } }; + ///transfer options to front + const getOptionsListener = event => { + event.returnValue = JSON.stringify(options_); + }; + + //get input from front const postDataListener = (event, value) => { resolve(value); event.returnValue = null; @@ -96,12 +101,14 @@ function electronPrompt(options, parentWindow) { cleanup(); }; + //get error from front const errorListener = (event, message) => { reject(new Error(message)); event.returnValue = null; cleanup(); }; + //attach listeners ipcMain.on("prompt-get-options:" + id, getOptionsListener); ipcMain.on("prompt-post-data:" + id, postDataListener); ipcMain.on("prompt-error:" + id, errorListener); @@ -113,13 +120,23 @@ function electronPrompt(options, parentWindow) { resolve(null); }); - const promptUrl = url.format({ - protocol: "file", - slashes: true, - pathname: path.join(__dirname, "page", "prompt.html"), - hash: id + //should never happen + promptWindow.webContents.on("did-fail-load", ( + event, + errorCode, + errorDescription, + validatedURL, + ) => { + const log = { + error: "did-fail-load", + errorCode, + errorDescription, + validatedURL, + }; + reject(new Error("prompt.html did-fail-load, log:\n", + log.toString())); }); + //Finally, load prompt promptWindow.loadURL(promptUrl); }); } diff --git a/providers/prompt/page/prompt.js b/providers/prompt/page/prompt.js index 67acd31d..b7a54120 100644 --- a/providers/prompt/page/prompt.js +++ b/providers/prompt/page/prompt.js @@ -5,6 +5,93 @@ 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; @@ -13,10 +100,12 @@ function promptError(error) { 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; @@ -32,6 +121,7 @@ function promptSubmit() { ipcRenderer.sendSync("prompt-post-data:" + promptId, data); } +//creates input box function promptCreateInput() { const dataElement = document.createElement("input"); dataElement.setAttribute("type", "text"); @@ -42,6 +132,7 @@ function promptCreateInput() { 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)) { @@ -52,12 +143,14 @@ function promptCreateInput() { } } + //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(); @@ -68,6 +161,7 @@ function promptCreateInput() { return dataElement; } +//create multiple select function promptCreateSelect() { const dataElement = document.createElement("select"); let optionElement; @@ -90,79 +184,5 @@ function promptCreateSelect() { return dataElement; } -function promptRegister() { - promptId = document.location.hash.replace("#", ""); - try { - promptOptions = JSON.parse(ipcRenderer.sendSync("prompt-get-options:" + promptId)); - } catch (error) { - return promptError(error); - } - if (promptOptions.useHtmlLabel) { - document.querySelector("#label").innerHTML = promptOptions.label; - } else { - document.querySelector("#label").textContent = promptOptions.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; - } - - 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); - } - } - - document.querySelector("#form").addEventListener("submit", promptSubmit); - document.querySelector("#cancel").addEventListener("click", promptCancel); - - 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(); - } - - 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); - } -}); - -docReady(promptRegister); diff --git a/providers/prompt/readme.md b/providers/prompt/readme.md index 2eb13b74..6683aced 100644 --- a/providers/prompt/readme.md +++ b/providers/prompt/readme.md @@ -3,11 +3,14 @@
