From 5f958726d906c8fbae9edb7cd6c8092293f4c291 Mon Sep 17 00:00:00 2001
From: dragonwocky <thedragonring.bod@gmail.com>
Date: Tue, 23 Apr 2024 15:13:05 +1000
Subject: [PATCH] feat(scroller): add calendar scroll functionality to 'Today'
 button

---
 .../calendar-scroll/calendar-scroll.png       | Bin 14519 -> 0 bytes
 src/extensions/calendar-scroll/client.css     |  25 -----------
 src/extensions/calendar-scroll/client.mjs     |  41 -----------------
 src/extensions/calendar-scroll/mod.json       |  23 ----------
 src/extensions/scroller/client.mjs            |  42 +++++++++++++-----
 src/extensions/scroller/mod.json              |   9 +++-
 6 files changed, 39 insertions(+), 101 deletions(-)
 delete mode 100644 src/extensions/calendar-scroll/calendar-scroll.png
 delete mode 100644 src/extensions/calendar-scroll/client.css
 delete mode 100644 src/extensions/calendar-scroll/client.mjs
 delete mode 100644 src/extensions/calendar-scroll/mod.json

diff --git a/src/extensions/calendar-scroll/calendar-scroll.png b/src/extensions/calendar-scroll/calendar-scroll.png
deleted file mode 100644
index 42ab5209bd28b6a9c757cd3c836427507dac08ca..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 14519
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

diff --git a/src/extensions/calendar-scroll/client.css b/src/extensions/calendar-scroll/client.css
deleted file mode 100644
index 2cbdb62..0000000
--- a/src/extensions/calendar-scroll/client.css
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * notion-enhancer: calendar scroll
- * (c) 2021 dragonwocky <thedragonring.bod@gmail.com> (https://dragonwocky.me/)
- * (https://notion-enhancer.github.io/) under the MIT license
- */
-
-#enhancer--calendar-scroll {
-  background: var(--theme--ui_interactive-hover);
-  border: 1px solid transparent;
-  font-size: 14px;
-  color: var(--theme--text);
-  height: 24px;
-  border-radius: 3px;
-  line-height: 1.2;
-  padding: 0 0.5em;
-  margin-right: 5px;
-}
-#enhancer--calendar-scroll:focus,
-#enhancer--calendar-scroll:hover {
-  background: transparent;
-  border: 1px solid var(--theme--ui_interactive-hover);
-}
-#enhancer--calendar-scroll:active {
-  background: var(--theme--ui_interactive-active);
-}
diff --git a/src/extensions/calendar-scroll/client.mjs b/src/extensions/calendar-scroll/client.mjs
deleted file mode 100644
index a13851e..0000000
--- a/src/extensions/calendar-scroll/client.mjs
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * notion-enhancer: calendar scroll
- * (c) 2021 dragonwocky <thedragonring.bod@gmail.com> (https://dragonwocky.me/)
- * (https://notion-enhancer.github.io/) under the MIT license
- */
-
-'use strict';
-
-const pageSelector = '.notion-page-content',
-  calendarSelector = '.notion-calendar-view:not([data-calendar-scroll])',
-  scrollerSelector = '.notion-frame > .notion-scroller',
-  toolbarSelector = '.notion-calendar-view > :first-child > :first-child > :first-child',
-  todaySelector = '.notion-calendar-view-day[style*="background:"]';
-
-export default function ({ web }, db) {
-  const insertButton = () => {
-    document.querySelectorAll(calendarSelector).forEach(($calendar) => {
-      $calendar.dataset.calendarScroll = true;
-      const $page = document.querySelector(pageSelector);
-      if ($page) return;
-      const $toolbar = $calendar.querySelector(toolbarSelector),
-        $pageScroller = document.querySelector(scrollerSelector),
-        $scrollButton = web.html`<button id="enhancer--calendar-scroll">Scroll</button>`;
-      $scrollButton.addEventListener('click', async (event) => {
-        let $today = $calendar.querySelector(todaySelector);
-        if (!$today) {
-          $toolbar.children[4].click();
-          await new Promise((res, rej) => setTimeout(res, 500));
-          $today = $calendar.querySelector(todaySelector);
-        }
-        $pageScroller.scroll({
-          top: $today.offsetParent.offsetParent.offsetTop + 70,
-          behavior: 'auto',
-        });
-      });
-      $toolbar.insertBefore($scrollButton, $toolbar.children[2]);
-    });
-  };
-  web.addDocumentObserver(insertButton, [calendarSelector]);
-  insertButton();
-}
diff --git a/src/extensions/calendar-scroll/mod.json b/src/extensions/calendar-scroll/mod.json
deleted file mode 100644
index 5dbd371..0000000
--- a/src/extensions/calendar-scroll/mod.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "name": "calendar scroll",
-  "id": "b1c7db33-dfee-489a-a76c-0dd66f7ed29a",
-  "version": "0.2.0",
-  "description": "adds a button to jump down to the current week in fullpage/infinite-scroll calendars.",
-  "preview": "calendar-scroll.png",
-  "tags": ["extension", "shortcut"],
-  "authors": [
-    {
-      "name": "dragonwocky",
-      "email": "thedragonring.bod@gmail.com",
-      "homepage": "https://dragonwocky.me/",
-      "avatar": "https://dragonwocky.me/avatar.jpg"
-    }
-  ],
-  "js": {
-    "client": ["client.mjs"]
-  },
-  "css": {
-    "client": ["client.css"]
-  },
-  "options": []
-}
diff --git a/src/extensions/scroller/client.mjs b/src/extensions/scroller/client.mjs
index c36e41c..f9e8c91 100644
--- a/src/extensions/scroller/client.mjs
+++ b/src/extensions/scroller/client.mjs
@@ -8,27 +8,30 @@
 import { FloatingButton } from "../../core/islands/FloatingButton.mjs";
 
 export default async (api, db) => {
-  const { html, addMutationListener } = api,
-    { addFloatingButton, removeFloatingButton } = api,
+  const { html, addFloatingButton, removeFloatingButton } = api,
+    { addMutationListener, removeMutationListener } = api,
+    jumpToWeek = await db.get("jumpToWeek"),
+    todayButton = `.notion-collection_view_page-block [aria-label="Previous Month"] + [role="button"]`,
+    todayBubble = `.notion-calendar-view-day[style*="background"]`,
     showScrollToBottom = await db.get("showScrollToBottom"),
     distanceUntilShown = await db.get("distanceUntilScrollToTopShown"),
     scrollUnit = await db.get("scrollDistanceUnit"),
-    behavior = (await db.get("smoothScrolling")) ? "smooth" : "auto",
+    scrollBehavior = (await db.get("smoothScrolling")) ? "smooth" : "auto",
     scroller = ".notion-frame .notion-scroller";
 
-  let $scroller;
-  const scrollTo = (top) => $scroller?.scroll({ top, behavior }),
+  let $scroller, $todayButton;
+  const scrollTo = (top, behavior) => $scroller?.scroll({ top, behavior }),
     $scrollToBottom = html`<${FloatingButton}
-      onclick="${() => scrollTo($scroller.scrollHeight)}"
+      onclick="${() => scrollTo($scroller.scrollHeight, scrollBehavior)}"
       aria-label="Scroll to bottom"
       ><i class="i-chevrons-down" />
     <//>`,
     $scrollToTop = html`<${FloatingButton}
-      onclick=${() => scrollTo(0)}
+      onclick=${() => scrollTo(0, scrollBehavior)}
       aria-label="Scroll to top"
       ><i class="i-chevrons-up" />
     <//>`,
-    onScroll = () => {
+    onPageScrolled = () => {
       if (!$scroller) return;
       const { scrollTop, scrollHeight, clientHeight } = $scroller;
       let scrollDist = scrollTop;
@@ -46,12 +49,29 @@ export default async (api, db) => {
         else addFloatingButton($scrollToBottom);
       } else removeFloatingButton($scrollToTop);
     },
+    onTodayLoaded = () => {
+      const $bubble = document.querySelector(todayBubble);
+      if (!$bubble) return;
+      // calendar will jump anyway when pinning the current month,
+      // so ignore smooth scroll setting and jump direct to week
+      scrollTo($bubble.offsetParent.offsetParent.offsetTop + 57, "auto");
+      removeMutationListener(onTodayLoaded);
+    },
+    onTodayClicked = () => {
+      removeMutationListener(onTodayLoaded);
+      addMutationListener(todayBubble, onTodayLoaded);
+    },
     setup = () => {
       if (document.contains($scroller)) return;
       $scroller = document.querySelector(scroller);
-      $scroller?.removeEventListener("scroll", onScroll);
-      $scroller?.addEventListener("scroll", onScroll);
-      onScroll();
+      $scroller?.removeEventListener("scroll", onPageScrolled);
+      $scroller?.addEventListener("scroll", onPageScrolled);
+      onPageScrolled();
+      if (jumpToWeek) {
+        $todayButton = document.querySelector(todayButton);
+        $todayButton?.removeEventListener("click", onTodayClicked);
+        $todayButton?.addEventListener("click", onTodayClicked);
+      }
     };
   addMutationListener(scroller, setup, { subtree: false });
   setup();
diff --git a/src/extensions/scroller/mod.json b/src/extensions/scroller/mod.json
index 84f30b0..8e63b0a 100644
--- a/src/extensions/scroller/mod.json
+++ b/src/extensions/scroller/mod.json
@@ -21,7 +21,7 @@
     {
       "type": "toggle",
       "key": "smoothScrolling",
-      "description": "Smoothly animates any scrolling triggered by this extension. Disable this to jump across pages instantly.",
+      "description": "Smoothly animates scrolling triggered by this extension. Disable this to jump across pages instantly.",
       "value": true
     },
     { "type": "heading", "label": "Pages" },
@@ -42,6 +42,13 @@
       "key": "scrollDistanceUnit",
       "description": "The unit to measure the above distance in, e.g. you may wish the button to appear at 90% down any page or only on pages that scroll down further than a certain number of pixels.",
       "values": ["Percent", "Pixels"]
+    },
+    { "type": "heading", "label": "Calendars" },
+    {
+      "type": "toggle",
+      "key": "jumpToWeek",
+      "description": "Jump to the current week (not just the current month) when clicking the 'Today' button on a full-page calendar view.",
+      "value": true
     }
   ],
   "clientScripts": ["client.mjs"]