From bc478266904944108977f6fca48fd5b34927dc78 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 31 Mar 2026 23:36:34 +0200 Subject: [PATCH] feat(frontend): add configurable quick entry shortcut setting Add desktopQuickEntryShortcut to frontend settings with a Desktop App section in General settings, only visible when running in the Electron app. The setting syncs to the desktop main process via IPC whenever settings are loaded or saved. --- desktop/preload.js | 1 + .../src/components/misc/ShortcutRecorder.vue | 208 ++++++++++++++++++ frontend/src/i18n/lang/en.json | 8 +- frontend/src/modelTypes/IUserSettings.ts | 1 + frontend/src/models/userSettings.ts | 1 + frontend/src/stores/auth.ts | 7 +- frontend/src/types/desktop.d.ts | 1 + frontend/src/views/user/settings/General.vue | 28 +++ 8 files changed, 253 insertions(+), 2 deletions(-) create mode 100644 frontend/src/components/misc/ShortcutRecorder.vue diff --git a/desktop/preload.js b/desktop/preload.js index 19e907b8b..6282ef0a7 100644 --- a/desktop/preload.js +++ b/desktop/preload.js @@ -11,5 +11,6 @@ contextBridge.exposeInMainWorld('vikunjaDesktop', { ipcRenderer.on('oauth:error', (_event, error) => callback(error)) }, refreshToken: (apiUrl, refreshToken) => ipcRenderer.invoke('oauth:refresh-token', apiUrl, refreshToken), + updateQuickEntryShortcut: (shortcut) => ipcRenderer.send('desktop:update-quick-entry-shortcut', shortcut), isDesktop: true, }) diff --git a/frontend/src/components/misc/ShortcutRecorder.vue b/frontend/src/components/misc/ShortcutRecorder.vue new file mode 100644 index 000000000..9a4d38b16 --- /dev/null +++ b/frontend/src/components/misc/ShortcutRecorder.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/frontend/src/i18n/lang/en.json b/frontend/src/i18n/lang/en.json index 3898f1438..67a4060ea 100644 --- a/frontend/src/i18n/lang/en.json +++ b/frontend/src/i18n/lang/en.json @@ -135,7 +135,13 @@ "taskAndNotifications": "Projects & Tasks", "privacy": "Privacy", "localization": "Localization", - "appearance": "Appearance & Behavior" + "appearance": "Appearance & Behavior", + "desktop": "Desktop App" + }, + "desktop": { + "quickEntryShortcut": "Quick Entry Shortcut", + "shortcutRecorderPlaceholder": "Click to set shortcut", + "shortcutRecorderRecording": "Press a key combination…" }, "totp": { "title": "Two Factor Authentication", diff --git a/frontend/src/modelTypes/IUserSettings.ts b/frontend/src/modelTypes/IUserSettings.ts index 63b5f7a58..833638c93 100644 --- a/frontend/src/modelTypes/IUserSettings.ts +++ b/frontend/src/modelTypes/IUserSettings.ts @@ -24,6 +24,7 @@ export interface IFrontendSettings { alwaysShowBucketTaskCount: boolean sidebarWidth: number | null commentSortOrder: 'asc' | 'desc' + desktopQuickEntryShortcut: string } export interface IExtraSettingsLink { diff --git a/frontend/src/models/userSettings.ts b/frontend/src/models/userSettings.ts index b8b648319..a3411706f 100644 --- a/frontend/src/models/userSettings.ts +++ b/frontend/src/models/userSettings.ts @@ -35,6 +35,7 @@ export default class UserSettingsModel extends AbstractModel impl alwaysShowBucketTaskCount: false, sidebarWidth: null, commentSortOrder: 'asc', + desktopQuickEntryShortcut: 'CmdOrCtrl+Shift+A', } extraSettingsLinks = {} diff --git a/frontend/src/stores/auth.ts b/frontend/src/stores/auth.ts index 6ced8283d..f79003b67 100644 --- a/frontend/src/stores/auth.ts +++ b/frontend/src/stores/auth.ts @@ -141,10 +141,15 @@ export const useAuthStore = defineStore('auth', () => { backgroundBrightness: 100, sidebarWidth: null, commentSortOrder: 'asc', + desktopQuickEntryShortcut: 'CmdOrCtrl+Shift+A', ...newSettings.frontendSettings, }, }) - // console.log('settings from auth store', {...settings.value.frontendSettings}) + + // Sync the quick entry shortcut to the desktop app when settings are loaded + window.vikunjaDesktop?.updateQuickEntryShortcut( + settings.value.frontendSettings.desktopQuickEntryShortcut || '', + ) } function setAuthenticated(newAuthenticated: boolean) { diff --git a/frontend/src/types/desktop.d.ts b/frontend/src/types/desktop.d.ts index 4e8c28506..58c3cf8ad 100644 --- a/frontend/src/types/desktop.d.ts +++ b/frontend/src/types/desktop.d.ts @@ -10,6 +10,7 @@ export interface VikunjaDesktop { onOAuthTokens: (callback: (tokens: OAuthTokens) => void) => void onOAuthError: (callback: (error: string) => void) => void refreshToken: (apiUrl: string, refreshToken: string) => Promise + updateQuickEntryShortcut: (shortcut: string) => void } declare global { diff --git a/frontend/src/views/user/settings/General.vue b/frontend/src/views/user/settings/General.vue index 7754f5aed..25ae1bef4 100644 --- a/frontend/src/views/user/settings/General.vue +++ b/frontend/src/views/user/settings/General.vue @@ -342,6 +342,30 @@ + +
+
+ +
+
+
+ `${t('user.settings.general.title')} - ${t('user.settings.title')}`)