From d55295a91e56554aacd7452e8cddcead4c646637 Mon Sep 17 00:00:00 2001 From: aleksey-hoffman Date: Fri, 21 Aug 2026 22:03:12 +0300 Subject: [PATCH] UX: improved settings search - Marching shortcuts now appear in the search results --- src/localization/messages/ch.json | 2 +- src/localization/messages/fa.json | 2 +- src/localization/messages/he.json | 2 +- src/localization/messages/hi.json | 2 +- src/localization/messages/hy.json | 2 +- src/localization/messages/sl.json | 2 +- src/localization/messages/tr.json | 2 +- src/localization/messages/ur.json | 2 +- src/localization/messages/vi.json | 2 +- src/modules/settings/pages/settings.vue | 2 +- .../ui/categories/shortcuts/shortcuts.vue | 84 +++++- src/modules/settings/ui/view.vue | 4 +- .../utils/__tests__/settings-search.test.ts | 140 +++++++++ src/modules/settings/utils/settings-search.ts | 275 ++++++++++++++++++ src/stores/runtime/settings.ts | 121 +++++--- tsconfig.vitest.json | 7 +- 16 files changed, 591 insertions(+), 60 deletions(-) create mode 100644 src/modules/settings/utils/__tests__/settings-search.test.ts create mode 100644 src/modules/settings/utils/settings-search.ts diff --git a/src/localization/messages/ch.json b/src/localization/messages/ch.json index 89eab22d..6714e59e 100644 --- a/src/localization/messages/ch.json +++ b/src/localization/messages/ch.json @@ -1242,4 +1242,4 @@ "replaceShareDialogDescription": "文件已在网络上共享。当前共享将被停止并替换为新的共享。", "replaceShareDialogConfirm": "替换" } -} \ No newline at end of file +} diff --git a/src/localization/messages/fa.json b/src/localization/messages/fa.json index 1a780361..62b2fc8b 100644 --- a/src/localization/messages/fa.json +++ b/src/localization/messages/fa.json @@ -1242,4 +1242,4 @@ "replaceShareDialogDescription": "فایل‌ها از قبل از طریق شبکه به اشتراک گذاشته شده‌اند. اشتراک‌گذاری فعلی متوقف و با مورد جدید جایگزین خواهد شد.", "replaceShareDialogConfirm": "جایگزینی" } -} \ No newline at end of file +} diff --git a/src/localization/messages/he.json b/src/localization/messages/he.json index b586d596..fef84bce 100644 --- a/src/localization/messages/he.json +++ b/src/localization/messages/he.json @@ -1242,4 +1242,4 @@ "replaceShareDialogDescription": "קבצים כבר משותפים ברשת. השיתוף הנוכחי ייעצר ויוחלף בחדש.", "replaceShareDialogConfirm": "החלף" } -} \ No newline at end of file +} diff --git a/src/localization/messages/hi.json b/src/localization/messages/hi.json index 2aed01cc..e422d672 100644 --- a/src/localization/messages/hi.json +++ b/src/localization/messages/hi.json @@ -1242,4 +1242,4 @@ "replaceShareDialogDescription": "फ़ाइलें पहले से ही नेटवर्क पर साझा की जा रही हैं. वर्तमान शेयर बंद कर दिया जाएगा और उसके स्थान पर नया शेयर ले लिया जाएगा।", "replaceShareDialogConfirm": "प्रतिस्थापित करें" } -} \ No newline at end of file +} diff --git a/src/localization/messages/hy.json b/src/localization/messages/hy.json index 303c8c86..24715c98 100644 --- a/src/localization/messages/hy.json +++ b/src/localization/messages/hy.json @@ -1242,4 +1242,4 @@ "replaceShareDialogDescription": "Ֆայլերն արդեն կիսվում են ցանցում: Ընթացիկ կիսումը կդադարեցվի և կփոխարինվի նորով:", "replaceShareDialogConfirm": "Փոխարինել" } -} \ No newline at end of file +} diff --git a/src/localization/messages/sl.json b/src/localization/messages/sl.json index 156b7a22..d48987c7 100644 --- a/src/localization/messages/sl.json +++ b/src/localization/messages/sl.json @@ -1242,4 +1242,4 @@ "replaceShareDialogDescription": "Datoteke se že delijo po omrežju. Trenutno deljenje bo ustavljeno in zamenjano z novim.", "replaceShareDialogConfirm": "Zamenjaj" } -} \ No newline at end of file +} diff --git a/src/localization/messages/tr.json b/src/localization/messages/tr.json index 1ba56e57..5b97774c 100644 --- a/src/localization/messages/tr.json +++ b/src/localization/messages/tr.json @@ -1242,4 +1242,4 @@ "replaceShareDialogDescription": "Ağ üzerinden zaten dosyalar paylaşılıyor. Mevcut paylaşım durdurulup yenisiyle değiştirilecek.", "replaceShareDialogConfirm": "Değiştir" } -} \ No newline at end of file +} diff --git a/src/localization/messages/ur.json b/src/localization/messages/ur.json index f8d288a0..ff898f14 100644 --- a/src/localization/messages/ur.json +++ b/src/localization/messages/ur.json @@ -1242,4 +1242,4 @@ "replaceShareDialogDescription": "فائلیں پہلے سے نیٹ ورک پر ہیں۔ موجودہ شیئر بند ہو کر نئے سے بدل جائے گا۔", "replaceShareDialogConfirm": "بدل دیں" } -} \ No newline at end of file +} diff --git a/src/localization/messages/vi.json b/src/localization/messages/vi.json index a6ef27a5..d628422f 100644 --- a/src/localization/messages/vi.json +++ b/src/localization/messages/vi.json @@ -1242,4 +1242,4 @@ "replaceShareDialogDescription": "Các tập tin đang được chia sẻ qua mạng. Chia sẻ hiện tại sẽ bị dừng và thay thế bằng chia sẻ mới.", "replaceShareDialogConfirm": "Thay thế" } -} \ No newline at end of file +} diff --git a/src/modules/settings/pages/settings.vue b/src/modules/settings/pages/settings.vue index 5b109b2e..04dcae8c 100644 --- a/src/modules/settings/pages/settings.vue +++ b/src/modules/settings/pages/settings.vue @@ -50,7 +50,7 @@ watch( > - + diff --git a/src/modules/settings/ui/categories/shortcuts/shortcuts.vue b/src/modules/settings/ui/categories/shortcuts/shortcuts.vue index 9470c2cc..dca9f0be 100644 --- a/src/modules/settings/ui/categories/shortcuts/shortcuts.vue +++ b/src/modules/settings/ui/categories/shortcuts/shortcuts.vue @@ -89,8 +89,14 @@ import { useExtensionsStorageStore } from '@/stores/storage/extensions'; import { BlocksIcon } from '@lucide/vue'; import type { ExtensionKeybindingOverride } from '@/types/extension'; import { SettingsItem } from '@/modules/settings'; +import { useSettingsStore } from '@/stores/runtime/settings'; +import { + filterItemsForSettingsSearch, + shortcutSearchItemMatches, +} from '@/modules/settings/utils/settings-search'; const { t } = useI18n(); +const settingsStore = useSettingsStore(); const shortcutsStore = useShortcutsStore(); const globalShortcutsStore = useGlobalShortcutsStore(); const unassignedShortcutLabel = '—'; @@ -1151,6 +1157,64 @@ const globalExtensionShortcuts = computed(() => { keybindingLabel: formatKeybindingKeys(shortcut.keys), })); }); + +function filterShortcutRows( + rows: T[], + rowMatches: (row: T) => boolean, +): T[] { + return filterItemsForSettingsSearch( + rows, + settingsStore.search, + rowMatches, + ); +} + +const visibleGlobalAppShortcuts = computed(() => + filterShortcutRows( + globalShortcutsStore.definitions, + definition => shortcutSearchItemMatches({ + labelKey: definition.labelKey, + combinations: [globalShortcutsStore.getShortcutLabel(definition.id)], + }, settingsStore.search), + ), +); + +const visibleGlobalExtensionShortcuts = computed(() => + filterShortcutRows( + globalExtensionShortcuts.value, + shortcut => shortcutSearchItemMatches({ + titles: [shortcut.commandTitle], + combinations: [shortcut.keybindingLabel, formatShortcutKeys(shortcut.keys)], + }, settingsStore.search), + ), +); + +const visibleLocalShortcuts = computed(() => + filterShortcutRows( + shortcutsStore.definitions, + definition => shortcutSearchItemMatches({ + labelKey: definition.labelKey, + combinations: [shortcutsStore.getShortcutBindingLabel(definition)], + }, settingsStore.search), + ), +); + +const visibleExtensionKeybindings = computed(() => + filterShortcutRows( + extensionKeybindings.value, + keybinding => shortcutSearchItemMatches({ + titles: [keybinding.commandTitle], + combinations: [keybinding.keybindingLabel, formatShortcutKeys(keybinding.keys)], + }, settingsStore.search), + ), +); + +const hasVisibleGlobalShortcuts = computed(() => + visibleGlobalAppShortcuts.value.length > 0 + || visibleGlobalExtensionShortcuts.value.length > 0, +); + +const hasVisibleLocalShortcuts = computed(() => visibleLocalShortcuts.value.length > 0);
-
+

@@ -1200,7 +1267,7 @@ const globalExtensionShortcuts = computed(() => {
@@ -1273,7 +1340,7 @@ const globalExtensionShortcuts = computed(() => { @@ -1351,7 +1418,10 @@ const globalExtensionShortcuts = computed(() => {

-
+

@@ -1378,7 +1448,7 @@ const globalExtensionShortcuts = computed(() => {
{

-