From 84a02f157a7202d2de28c6a52e6f4375d4b4da4b Mon Sep 17 00:00:00 2001
From: dragonwocky <thedragonring.bod@gmail.com>
Date: Mon, 10 Apr 2023 21:14:27 +1000
Subject: [PATCH] fix: prevent type-specific format descs from duplicating on
 menu reopen

---
 main.js | 34 +++++++++++++++-------------------
 1 file changed, 15 insertions(+), 19 deletions(-)

diff --git a/main.js b/main.js
index fbead13..26dc2cc 100644
--- a/main.js
+++ b/main.js
@@ -31,8 +31,8 @@ const LOG_PREFIX = "obsidian-tray",
     Format:
     <a href="https://momentjs.com/docs/#/displaying/format/" target="_blank" rel="noopener">
     Moment.js format string</a>
-    <br>Preview:
   `,
+  REQUIRES_RESTART = `<span class="mod-warning">Changing this option requires a restart to take effect.</span>`,
   // 16x16 base64 obsidian icon: generated from obsidian.asar/icon.png
   OBSIDIAN_BASE64_ICON = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHZSURBVDhPlZKxTxRBFMa/XZcF7nIG7mjxjoRCwomJxgsFdhaASqzQxFDzB1AQKgstLGxIiBQGJBpiCCGx8h+wgYaGgAWNd0dyHofeEYVwt/PmOTMZV9aDIL/s5pvZvPfN9yaL/+HR3eXcypta0m4juFbP5GHuXc9IbunDFc9db/G81/ZzhDMN7g8td47mll4R5BfHwZN4LOaA+fHa259PbUmIYzWkt3e2NZNo3/V9v1vvU6kkstk+tLW3ItUVr/m+c3N8MlkwxYqmBFcbwUQQCNOcyVzDwEAWjuPi5DhAMV/tKOYPX5hCyz8Gz1zX5SmWjBvZfmTSaRBJkGAIoxJHv+pVW2yIGNxOJ8bUVNcFEWLxuG1ia6JercTbttwQTeDwPS0kCMXiXtgk/jQrFUw7ptYSMWApF40yo/ytjHq98fdk3ayVE+cn2CxMb6ruz9qAJKFUKoWza1VJSi/n0+ffgYHdWW2gHuxXymg0gjCB0sjpmiaDnkL3RzDyzLqBUKns2ztQqUR0fk2TwSrGSf1eczqF5vsPZRCQSSAFLk6gqctgQRkc6TWRQLV2YMYQki9OoNkqzFQ9r+WOGuW5CrJbOzyAlPKr6MSGLbkcDwbf35oY/jRkt6cAfgNwowruAMz9AgAAAABJRU5ErkJggg==`,
   log = (message) => console.log(`${LOG_PREFIX}: ${message}`);
@@ -231,15 +231,18 @@ const OPTIONS = [
       Adds an icon to your system tray/menubar to bring hidden Obsidian windows
       back into focus on click or force a full quit/relaunch of the app through
       the right-click menu.
-      <br><span class="mod-warning">Changing this option requires a restart to take effect.</span>
+      <br>${REQUIRES_RESTART}
     `,
     type: "toggle",
     default: true,
   },
   {
     key: "toggleWindowFocusHotkey",
+    desc: ACCELERATOR_FORMAT,
     type: "hotkey",
     default: "CmdOrCtrl+Shift+Tab",
+    onBeforeChange: unregisterHotkeys,
+    onChange: registerHotkeys,
   },
   "Quick notes",
   {
@@ -250,14 +253,20 @@ const OPTIONS = [
   },
   {
     key: "quickNoteDateFormat",
-    desc: "New quick notes will use a filename of this pattern.",
+    desc: `
+      New quick notes will use a filename of this pattern. ${MOMENT_FORMAT}
+      <br>Preview: <b class="u-pop" data-preview></b>
+    `,
     type: "moment",
     default: DEFAULT_DATE_FORMAT,
   },
   {
     key: "quickNoteHotkey",
+    desc: ACCELERATOR_FORMAT,
     type: "hotkey",
     default: "CmdOrCtrl+Shift+Q",
+    onBeforeChange: unregisterHotkeys,
+    onChange: registerHotkeys,
   },
 ];
 
@@ -286,19 +295,7 @@ class SettingsTab extends obsidian.PluginSettingTab {
         setting.setName(opt);
         setting.setHeading();
       } else {
-        if (opt.default) {
-          opt.placeholder ??= `Example: ${opt.default}`;
-        }
-        if (opt.type === "hotkey") {
-          opt.desc ??= "";
-          opt.desc += ACCELERATOR_FORMAT;
-          opt.onBeforeChange = unregisterHotkeys;
-          opt.onChange = registerHotkeys;
-        }
-        if (opt.type === "moment") {
-          opt.desc = `${opt.desc ? `${opt.desc}<br>` : ""}${MOMENT_FORMAT}`;
-        }
-
+        if (opt.default) opt.placeholder ??= `Example: ${opt.default}`;
         setting.setName(keyToLabel(opt.key));
         setting.setDesc(htmlToFragment(opt.desc));
         const onChange = async (value) => {
@@ -316,13 +313,12 @@ class SettingsTab extends obsidian.PluginSettingTab {
           });
         } else if (opt.type === "moment") {
           setting.addMomentFormat((moment) => {
-            const sampleEl = setting.descEl.createEl("b");
-            sampleEl.className = "u-pop";
+            const previewEl = setting.descEl.querySelector("[data-preview]");
+            if (previewEl) moment.setSampleEl(previewEl);
             moment
               .setPlaceholder(opt.placeholder)
               .setDefaultFormat(opt.default ?? "")
               .setValue(this.plugin.settings[opt.key] ?? opt.default ?? "")
-              .setSampleEl(sampleEl)
               .onChange(onChange);
           });
         } else {