From 16ee2d9fa5f838c2d372a895f065e24448a3152d Mon Sep 17 00:00:00 2001 From: jph-sendlater <75693008+jph-sendlater@users.noreply.github.com> Date: Sat, 26 Nov 2022 15:31:51 -0800 Subject: [PATCH] Move status indicator to browserAction (#487) --- _locales/en/messages.json | 4 +- background.js | 104 ++++++++++++++------- experiments/legacyColumnImplementation.js | 23 ++--- manifest.json | 11 ++- ui/browserActionPopup.html | 105 ++++++++++++++++++++++ ui/browserActionPopup.js | 103 +++++++++++++++++++++ ui/options.html | 6 +- ui/popup.html | 4 - ui/popup.js | 6 +- utils/static.js | 2 - 10 files changed, 310 insertions(+), 58 deletions(-) create mode 100644 ui/browserActionPopup.html create mode 100644 ui/browserActionPopup.js diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 185655f1..135ff4cd 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -224,8 +224,8 @@ "description": "" }, "showStatusPrefLabel": { - "message": "Show Send Later In Status Bar", - "description": "" + "message": "Show text in toolbar button", + "description": "If this setting is enabled, then the toolbar button will say 'Send Later' (or translated equivalent) alongside the icon. If it is disabled, then only the icon will be visible." }, "userGuideLabel": { "message": "User guide", diff --git a/background.js b/background.js index 9badb70a..32cce20f 100644 --- a/background.js +++ b/background.js @@ -138,10 +138,10 @@ const SendLater = { ); } + let composeDetails = await messenger.compose.getComposeDetails(tabId); // // // Merge the new custom headers into the original headers // // // Note: this shouldn't be necessary, but it appears that // // // `setComposeDetails` does not preserve existing headers. - // // let composeDetails = await messenger.compose.getComposeDetails(tabId); // // for (let hdr of composeDetails.customHeaders) { // // if (!hdr.name.toLowerCase().startsWith("x-send-later")) { // // customHeaders.push(hdr); @@ -635,21 +635,15 @@ const SendLater = { let extName = messenger.i18n.getMessage("extensionName"); let nActive = await SLTools.countActiveScheduledMessages(); if (nActive) { - messenger.spacesToolbar.updateButton( - SLStatic.TOOLBAR_ID, - { - title: `${extName} [${messenger.i18n.getMessage("PendingMessage", [nActive])}]`, - badgeText: String(nActive), - } - ); + messenger.browserAction.setTitle({title: ( + `${extName} [${messenger.i18n.getMessage("PendingMessage", [nActive])}]` + )}); + messenger.browserAction.setBadgeText({text: String(nActive)}); } else { - messenger.spacesToolbar.updateButton( - SLStatic.TOOLBAR_ID, - { - title: `${extName} [${messenger.i18n.getMessage("IdleMessage")}]`, - badgeText: "", - } - ); + messenger.browserAction.setTitle({title: ( + `${extName} [${messenger.i18n.getMessage("IdleMessage")}]` + )}); + messenger.browserAction.setBadgeText({text: null}); } }, @@ -698,10 +692,17 @@ const SendLater = { SLStatic.shortDateTimeFormat = preferences.shortDateTimeFormat; messenger.SL3U.setLogConsoleLevel(SLStatic.logConsoleLevel); - for (let pref of ["customizeDateTime", "longDateTimeFormat", "shortDateTimeFormat", "instanceUUID"]) + for (let pref of [ + "customizeDateTime", "longDateTimeFormat", "shortDateTimeFormat", "instanceUUID" + ]) { messenger.columnHandler.setPreference(pref, preferences[pref]); + } SendLater.setQuitNotificationsEnabled(preferences.askQuit); + + messenger.browserAction.setLabel({label: ( + preferences.showStatus ? messenger.i18n.getMessage("sendlater3header.label") : "" + )}); }).catch(ex => SLStatic.error(ex)); // Initialize drafts folder column @@ -715,14 +716,6 @@ const SendLater = { name: messenger.i18n.getMessage("sendlater3header.label"), }); - // Add spacesToolbar button - await messenger.spacesToolbar.addButton( - SLStatic.TOOLBAR_ID, { - title: messenger.i18n.getMessage("extensionName"), - url: messenger.runtime.getURL("ui/options.html"), - } - ); - // Attach to all existing msgcompose windows messenger.SL3U.hijackComposeWindowKeyBindings().catch(ex => { SLStatic.error("SL3U.hijackComposeWindowKeyBindings",ex); @@ -778,6 +771,10 @@ const SendLater = { SendLater.setQuitNotificationsEnabled(preferences.askQuit); + messenger.browserAction.setLabel({label: ( + preferences.showStatus ? messenger.i18n.getMessage("sendlater3header.label") : "" + )}); + // Note: It's possible to immediately obey a preference change if the // user has decided to disable the send later column, but when the column // is being enabled there isn't a simple way to tell whether we're in a @@ -1089,6 +1086,53 @@ messenger.runtime.onMessage.addListener(async (message, sender) => { break; } + case "getAllSchedules": { + response.schedules = await SLTools.forAllDrafts( + async (draftHdr) => { + return await messenger.messages.getFull(draftHdr.id).then( + async (draftMsg) => { + function getHeader(name) { + return (draftMsg.headers[name]||[])[0]; + } + if (getHeader("x-send-later-at")) { + return { + sendAt: getHeader("x-send-later-at"), + recur: getHeader("x-send-later-recur"), + args: getHeader("x-send-later-args"), + cancel: getHeader("x-send-later-cancel-on-reply"), + subject: draftHdr.subject, + recipients: draftHdr.recipients, + } + } else { + return null; + } + } + ); + }, + false // non-sequential + ).then((r) => r.filter(x => x != null)); + break; + } + case "showPreferences": { + messenger.runtime.openOptionsPage(); + break; + } + case "showUserGuide": { + messenger.windows.openDefaultBrowser('https://extended-thunder.github.io/send-later/'); + break; + } + case "showReleaseNotes": { + messenger.windows.openDefaultBrowser("https://github.com/Extended-Thunder/send-later/releases"); + break; + } + case "contactAuthor": { + messenger.windows.openDefaultBrowser("https://github.com/Extended-Thunder/send-later/discussions/278"); + break; + } + case "donateLink": { + messenger.windows.openDefaultBrowser("https://extended-thunder.github.io/send-later/#support-send-later"); + break; + } default: { SLStatic.warn(`Unrecognized operation <${message.action}>.`); } @@ -1203,9 +1247,8 @@ function mainLoop() { // or (⌛ \u231B) (e.g. badgeText = "\u27F3") let extName = messenger.i18n.getMessage("extensionName"); let isActiveMessage = messenger.i18n.getMessage("CheckingMessage"); - messenger.spacesToolbar.updateButton( - SLStatic.TOOLBAR_ID, {title: `${extName} [${isActiveMessage}]`} - ); + messenger.browserAction.enable(); + messenger.browserAction.setTitle({title: `${extName} [${isActiveMessage}]`}); let doSequential = preferences.throttleDelay > 0; SLTools.forAllDrafts(SendLater.possiblySendMessage, doSequential).then(() => { @@ -1227,10 +1270,9 @@ function mainLoop() { SendLater.setQuitNotificationsEnabled(false); let extName = messenger.i18n.getMessage("extensionName"); let disabledMsg = messenger.i18n.getMessage("DisabledMessage"); - messenger.spacesToolbar.updateButton( - SLStatic.TOOLBAR_ID, - {title: `${extName} [${disabledMsg}]`, badgeText: "X"} - ); + messenger.browserAction.disable(); + messenger.browserAction.setTitle({title: `${extName} [${disabledMsg}]`}); + messenger.browserAction.setBadgeText({text: null}); SendLater.previousLoop = new Date(); SendLater.loopTimeout = setTimeout(mainLoop, 60000); diff --git a/experiments/legacyColumnImplementation.js b/experiments/legacyColumnImplementation.js index ea674bf9..3a40583e 100644 --- a/experiments/legacyColumnImplementation.js +++ b/experiments/legacyColumnImplementation.js @@ -41,7 +41,7 @@ var LegacyColumn = { { OnStartRunningUrl() {}, OnStopRunningUrl(url, exitCode) { - SLStatic.debug( + console.debug( `LegacyColumn.getRawMessage.streamListener.OnStopRunning ` + `received ${streamListener.inputStream.available()} bytes ` + `(exitCode: ${exitCode})` @@ -58,7 +58,7 @@ var LegacyColumn = { "" ); }).catch((ex) => { - SLStatic.error(`Error reading message ${messageUri}`,ex); + console.error(`Error reading message ${messageUri}`,ex); }); const available = streamListener.inputStream.available(); @@ -69,7 +69,7 @@ var LegacyColumn = { ); return rawMessage; } else { - SLStatic.debug(`No data available for message ${messageUri}`); + console.debug(`No data available for message ${messageUri}`); return null; } }, @@ -93,15 +93,16 @@ var LegacyColumn = { const msgContentType = this.getStorageLocal(CTPropertyName); const sendAtStr = hdr.getStringProperty("x-send-later-at"); const msgUuid = hdr.getStringProperty("x-send-later-uuid"); - let SLStatic = this.SLStatic; + const incorrectUUIDMsg = this.SLStatic.i18n.getMessage("incorrectUUID"); + const encryptionIncompatMsg = this.SLStatic.i18n.getMessage("EncryptionIncompatTitle") if (!sendAtStr) { return { valid: false, detail: "Not scheduled" }; } else if (msgUuid !== instanceUUID) { - return { valid: false, detail: `${msgUuid} != ${instanceUUID}`, msg: SLStatic.i18n.getMessage("incorrectUUID") }; + return { valid: false, detail: `${msgUuid} != ${instanceUUID}`, msg: incorrectUUIDMsg }; } else if (!msgContentType) { return { valid: false, detail: "Missing ContentType" }; } else if (/encrypted/i.test(msgContentType)) { - return { valid: false, detail: "Encrypted", msg: SLStatic.i18n.getMessage("EncryptionIncompatTitle") }; + return { valid: false, detail: "Encrypted", msg: encryptionIncompatMsg }; } return { valid: true }; }, @@ -142,7 +143,7 @@ class MessageViewsCustomColumn { window.document.getElementById(this.columnId + "-splitter").remove(); window.document.getElementById(this.columnId).remove(); } catch (ex) { - SLStatic.error(ex); + console.error(ex); } } @@ -190,13 +191,13 @@ class MessageViewsCustomColumn { } } } catch (ex) { - SLStatic.error("Unable to set column visible",ex); + console.error("Unable to set column visible",ex); } } addToWindow(window) { if (window.document.getElementById(this.columnId)) { - SLStatic.warn("Attempted to add duplicate column", this.columnId); + console.warn("Attempted to add duplicate column", this.columnId); return; } let treecol = window.document.createXULElement("treecol"); @@ -297,7 +298,7 @@ var columnHandler = class extends ExtensionCommon.ExtensionAPI { try { column.destroy(); } catch (ex) { - SLStatic.error("Unable to destroy column:",ex); + console.error("Unable to destroy column:",ex); } LegacyColumn = undefined; @@ -354,7 +355,7 @@ var columnHandler = class extends ExtensionCommon.ExtensionAPI { if (column) { column.setVisible(visible, windowId); } else { - SLStatic.error("Attempted to update visibility of non-existent column"); + console.error("Attempted to update visibility of non-existent column"); } }, } diff --git a/manifest.json b/manifest.json index 5775204c..b102e1b3 100644 --- a/manifest.json +++ b/manifest.json @@ -5,7 +5,7 @@ "description": "__MSG_extensionDescription__", - "version": "9.2.2", + "version": "9.2.3", "homepage_url": "https://github.com/Extended-Thunder/send-later/", @@ -93,6 +93,15 @@ "default_title": "__MSG_extensionName__" }, + "browser_action": { + "browser_style": true, + "default_icon": "ui/icons/icon.png", + "default_area": "maintoolbar", + "default_label": "__MSG_extensionName__", + "default_title": "__MSG_extensionName__", + "default_popup": "ui/browserActionPopup.html" + }, + "experiment_apis": { "SL3U": { "schema": "experiments/sl3u.json", diff --git a/ui/browserActionPopup.html b/ui/browserActionPopup.html new file mode 100644 index 00000000..6b26fa76 --- /dev/null +++ b/ui/browserActionPopup.html @@ -0,0 +1,105 @@ + + + + + + + + +
+ +
+ +
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + + + + + + diff --git a/ui/browserActionPopup.js b/ui/browserActionPopup.js new file mode 100644 index 00000000..04067e32 --- /dev/null +++ b/ui/browserActionPopup.js @@ -0,0 +1,103 @@ + +function truncateString(s, limit) { + if (s.length <= limit) { + return String(s); + } else { + return String(s).substring(0, limit-3) + "..."; + } +} + +function formatRecipientList(recipients, limit) { + let contactList = recipients.map((contact) => { + let contactName = String(contact).split(/<.*>/)[0].trim(); + return truncateString(contactName, Math.min(limit, 15)); + }); + + let ret = contactList[0]; + for (let i=1; i { + messenger.runtime.sendMessage({action: "showPreferences"}).then(() => window.close()); + } + ); + document.getElementById("showGuideButton").addEventListener("click", + () => { + messenger.runtime.sendMessage({action: "showUserGuide"}).then(() => window.close()); + } + ); + document.getElementById("showNotesButton").addEventListener("click", + () => { + messenger.runtime.sendMessage({action: "showReleaseNotes"}).then(() => window.close()); + } + ); + document.getElementById("contactAuthorButton").addEventListener("click", + () => { + messenger.runtime.sendMessage({action: "contactAuthor"}).then(() => window.close()); + } + ); + document.getElementById("donateButton").addEventListener("click", + () => { + messenger.runtime.sendMessage({action: "donateLink"}).then(() => window.close()); + } + ); + messenger.runtime.sendMessage({action: "getAllSchedules"}).then((res) => { + res.schedules.sort( + (a, b) => (new Date(a.sendAt)).getTime() - (new Date(b.sendAt)).getTime() + ).forEach((schedule) => { + document.getElementById("scheduleTable").appendChild( + makeRow( + formatSchedule(schedule), + formatRecipientList(schedule.recipients, 15), + truncateString(schedule.subject, 40), + ) + ); + }); + }); +} + +window.addEventListener("load", init, false); diff --git a/ui/options.html b/ui/options.html index cd310fdb..deb74285 100644 --- a/ui/options.html +++ b/ui/options.html @@ -6,10 +6,6 @@ Send Later