From 5426a388badd0edd7506e4f98007309782798907 Mon Sep 17 00:00:00 2001 From: pdmarf <135653545+pdmarf@users.noreply.github.com> Date: Fri, 24 Apr 2026 08:43:12 +0100 Subject: [PATCH] v1.0.27: auto-load projects/users after API token is entered Previously staff had to close and reopen the property inspector after entering their token to trigger the fetch. Now saving the token immediately sends a refreshProjects event to the plugin, which fetches and returns the project list and name dropdown. Co-Authored-By: Claude Sonnet 4.6 --- com.pdma.notion-timer.sdPlugin/bin/plugin.js | 47 +++++++++------- .../bin/plugin.js.sig | Bin 64 -> 64 bytes com.pdma.notion-timer.sdPlugin/manifest.json | 2 +- .../ui/property-inspector.html | 4 ++ notion-timer.streamDeckPlugin | Bin 98774 -> 98859 bytes src/plugin.ts | 50 ++++++++++-------- version.json | 2 +- 7 files changed, 62 insertions(+), 43 deletions(-) diff --git a/com.pdma.notion-timer.sdPlugin/bin/plugin.js b/com.pdma.notion-timer.sdPlugin/bin/plugin.js index d772d8f..e6c3546 100644 --- a/com.pdma.notion-timer.sdPlugin/bin/plugin.js +++ b/com.pdma.notion-timer.sdPlugin/bin/plugin.js @@ -6438,7 +6438,7 @@ async function stopTimer(token, entryId) { } // src/plugin.ts -var CURRENT_VERSION = "1.0.26"; +var CURRENT_VERSION = "1.0.27"; var GITEA_BASE = "https://gitea.pdmarf.co.uk/pdm/stream_deck_notion_timer/raw/branch/stable-rebuild"; var SIGNING_PUBLIC_KEY = `-----BEGIN PUBLIC KEY----- MCowBQYDK2VwAyEAN7ko8TUpuPzPAJuKAZCRjV0c4ZSlou5d9pUAF6o12b4= @@ -6518,6 +6518,27 @@ async function setRunningEntry(entryId) { const stored = await plugin_default.settings.getGlobalSettings(); await plugin_default.settings.setGlobalSettings({ ...stored, runningEntryId: entryId }); } +async function sendProjectsToPI(tokenOverride) { + try { + const global = await getGlobal(); + const token = tokenOverride ?? global.notionToken; + if (!token) { + await plugin_default.ui.sendToPropertyInspector({ event: "projects", data: [], error: "Enter your Notion API token above.", version: CURRENT_VERSION }); + return; + } + const [projects, usersResult] = await Promise.all([ + fetchProjects(token, global.projectsDbId), + fetchUsers(token).catch((err) => { + plugin_default.logger.error("Failed to fetch users:", err); + return []; + }) + ]); + await plugin_default.ui.sendToPropertyInspector({ event: "projects", data: projects, users: usersResult, version: CURRENT_VERSION }); + } catch (err) { + plugin_default.logger.error("Failed to fetch projects:", err); + await plugin_default.ui.sendToPropertyInspector({ event: "projects", data: [], error: String(err), version: CURRENT_VERSION }); + } +} function isConfigured(g) { return !!(g.notionToken && g.userId); } @@ -6545,25 +6566,8 @@ var TimerToggle = class extends SingletonAction { } } } - async onPropertyInspectorDidAppear(ev) { - try { - const global = await getGlobal(); - if (!global.notionToken) { - await plugin_default.ui.sendToPropertyInspector({ event: "projects", data: [], error: "Enter your Notion API token above.", version: CURRENT_VERSION }); - return; - } - const [projects, usersResult] = await Promise.all([ - fetchProjects(global.notionToken, global.projectsDbId), - fetchUsers(global.notionToken).catch((err) => { - plugin_default.logger.error("Failed to fetch users:", err); - return []; - }) - ]); - await plugin_default.ui.sendToPropertyInspector({ event: "projects", data: projects, users: usersResult, version: CURRENT_VERSION }); - } catch (err) { - plugin_default.logger.error("Failed to fetch projects:", err); - await plugin_default.ui.sendToPropertyInspector({ event: "projects", data: [], error: String(err), version: CURRENT_VERSION }); - } + async onPropertyInspectorDidAppear(_ev) { + await sendProjectsToPI(); } async onKeyDown(ev) { this.settingsCache.set(ev.action.id, ev.payload.settings); @@ -6640,6 +6644,9 @@ plugin_default.ui.onSendToPlugin(async (ev) => { const title = buttonTitle(ev.payload.settings.projectName || ""); if (title) await ev.action.setTitle(title); } + if (ev.payload.event === "refreshProjects") { + await sendProjectsToPI(ev.payload.token); + } if (ev.payload.event === "checkForUpdates") { const send = (msg) => plugin_default.ui.sendToPropertyInspector({ event: "updateStatus", message: msg }); send("Checking\u2026"); diff --git a/com.pdma.notion-timer.sdPlugin/bin/plugin.js.sig b/com.pdma.notion-timer.sdPlugin/bin/plugin.js.sig index 6d5f1bcbcaaf19e814e9feed3b6ab646c0b2bf20..77fe0a5fd4feb779c349d125ce4be8e897267223 100644 GIT binary patch literal 64 zcmV-G0KfmOJx`t7G1`EVa6dUwC)rh=M*_BHA`A1}KkUb!)Fd-yVSgT?=HYV#%GB*4 WFwI(LyKvk2<2tXEU4rz=AUX#2I3OYb literal 64 zcmV-G0KfkLIiLM&7SSv5ahw4*E+Lfw diff --git a/com.pdma.notion-timer.sdPlugin/manifest.json b/com.pdma.notion-timer.sdPlugin/manifest.json index 8461c55..4f263ca 100644 --- a/com.pdma.notion-timer.sdPlugin/manifest.json +++ b/com.pdma.notion-timer.sdPlugin/manifest.json @@ -2,7 +2,7 @@ "Author": "Pete Marfleet", "Description": "Toggle Notion time tracking for a project with a single button press.", "Name": "Notion Timer", - "Version": "1.0.26", + "Version": "1.0.27", "SDKVersion": 2, "Software": { "MinimumVersion": "5.0" }, "OS": [{ "Platform": "mac", "MinimumVersion": "10.11" }], diff --git a/com.pdma.notion-timer.sdPlugin/ui/property-inspector.html b/com.pdma.notion-timer.sdPlugin/ui/property-inspector.html index 3d5de35..e355d1f 100644 --- a/com.pdma.notion-timer.sdPlugin/ui/property-inspector.html +++ b/com.pdma.notion-timer.sdPlugin/ui/property-inspector.html @@ -194,6 +194,10 @@ }; $PI.setGlobalSettings(creds); setCredStatus("Credentials saved.", "ok"); + if (creds.notionToken) { + setStatus("Loading…", ""); + $PI.sendToPlugin({ event: "refreshProjects", token: creds.notionToken }); + } } function populateUsers(users, savedUserId) { diff --git a/notion-timer.streamDeckPlugin b/notion-timer.streamDeckPlugin index 0956b61d70a2ba6f85bc32389b4b26a7d785d7d2..764026594e6fd298b3fe194102a014e933615718 100644 GIT binary patch delta 5550 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 delta 5523 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 diff --git a/src/plugin.ts b/src/plugin.ts index 025416b..baed658 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -1,4 +1,4 @@ -const CURRENT_VERSION = "1.0.26"; +const CURRENT_VERSION = "1.0.27"; const GITEA_BASE = "https://gitea.pdmarf.co.uk/pdm/stream_deck_notion_timer/raw/branch/stable-rebuild"; const SIGNING_PUBLIC_KEY = `-----BEGIN PUBLIC KEY----- MCowBQYDK2VwAyEAN7ko8TUpuPzPAJuKAZCRjV0c4ZSlou5d9pUAF6o12b4= @@ -109,6 +109,28 @@ async function setRunningEntry(entryId: string | null): Promise { await streamDeck.settings.setGlobalSettings({ ...stored, runningEntryId: entryId }); } +async function sendProjectsToPI(tokenOverride?: string): Promise { + try { + const global = await getGlobal(); + const token = tokenOverride ?? global.notionToken; + if (!token) { + await streamDeck.ui.sendToPropertyInspector({ event: "projects", data: [], error: "Enter your Notion API token above.", version: CURRENT_VERSION }); + return; + } + const [projects, usersResult] = await Promise.all([ + fetchProjects(token, global.projectsDbId), + fetchUsers(token).catch((err) => { + streamDeck.logger.error("Failed to fetch users:", err); + return []; + }), + ]); + await streamDeck.ui.sendToPropertyInspector({ event: "projects", data: projects, users: usersResult, version: CURRENT_VERSION }); + } catch (err) { + streamDeck.logger.error("Failed to fetch projects:", err); + await streamDeck.ui.sendToPropertyInspector({ event: "projects", data: [], error: String(err), version: CURRENT_VERSION }); + } +} + function isConfigured(g: GlobalSettings): boolean { return !!(g.notionToken && g.userId); } @@ -146,25 +168,8 @@ class TimerToggle extends SingletonAction { } } - async onPropertyInspectorDidAppear(ev: PropertyInspectorDidAppearEvent): Promise { - try { - const global = await getGlobal(); - if (!global.notionToken) { - await streamDeck.ui.sendToPropertyInspector({ event: "projects", data: [], error: "Enter your Notion API token above.", version: CURRENT_VERSION }); - return; - } - const [projects, usersResult] = await Promise.all([ - fetchProjects(global.notionToken, global.projectsDbId), - fetchUsers(global.notionToken).catch((err) => { - streamDeck.logger.error("Failed to fetch users:", err); - return []; - }), - ]); - await streamDeck.ui.sendToPropertyInspector({ event: "projects", data: projects, users: usersResult, version: CURRENT_VERSION }); - } catch (err) { - streamDeck.logger.error("Failed to fetch projects:", err); - await streamDeck.ui.sendToPropertyInspector({ event: "projects", data: [], error: String(err), version: CURRENT_VERSION }); - } + async onPropertyInspectorDidAppear(_ev: PropertyInspectorDidAppearEvent): Promise { + await sendProjectsToPI(); } async onKeyDown(ev: KeyDownEvent): Promise { @@ -244,12 +249,15 @@ const timerAction = new TimerToggle(); streamDeck.actions.registerAction(timerAction); // v2 requires using streamDeck.ui.onSendToPlugin — the SingletonAction method does not fire -streamDeck.ui.onSendToPlugin<{ event: string; settings?: TimerSettings }>(async (ev) => { +streamDeck.ui.onSendToPlugin<{ event: string; settings?: TimerSettings; token?: string }>(async (ev) => { if (ev.payload.event === "saveSettings" && ev.payload.settings) { await ev.action.setSettings(ev.payload.settings); const title = buttonTitle(ev.payload.settings.projectName || ""); if (title) await ev.action.setTitle(title); } + if (ev.payload.event === "refreshProjects") { + await sendProjectsToPI(ev.payload.token); + } if (ev.payload.event === "checkForUpdates") { const send = (msg: string) => streamDeck.ui.sendToPropertyInspector({ event: "updateStatus", message: msg }); send("Checking…"); diff --git a/version.json b/version.json index f78be80..d984738 100644 --- a/version.json +++ b/version.json @@ -1 +1 @@ -{ "version": "1.0.26" } +{ "version": "1.0.27" }