diff --git a/src/components/setting/mods/auto-backup-settings.tsx b/src/components/setting/mods/auto-backup-settings.tsx index 0368a0145..cee8460dd 100644 --- a/src/components/setting/mods/auto-backup-settings.tsx +++ b/src/components/setting/mods/auto-backup-settings.tsx @@ -133,7 +133,11 @@ export function AutoBackupSettings() { return ( - + - + - + {t('shared.actions.save')} @@ -239,6 +243,7 @@ export const BackupConfigViewer = memo( , , + )} + + ) + const resultView = + searching && !showPage ? ( + + {results.length ? ( + results.map((entry, index) => ( + setSelected(index)} + onClick={() => { + setSelected(index) + locate(entry) + }} + onKeyDown={(e) => { + if (e.key === 'ArrowDown' || e.key === 'ArrowUp') { + e.preventDefault() + moveSelection(index, e.key === 'ArrowDown' ? 1 : -1, true) + } + if (e.key === 'Escape') { + e.preventDefault() + inputRef.current?.focus() + } + }} + > + + + )) + ) : ( + {t('settings.search.empty')} + )} + + ) : null + return ( + + + { + if ( + e.key === 'Escape' && + showPage && + !(e.target as HTMLElement).closest('[role="dialog"]') + ) { + e.stopPropagation() + restoreResults() + } + }} + sx={{ + height: '100%', + '& .base-page > header': { + flex: '0 0 auto', + minHeight: 58, + flexWrap: 'wrap', + gap: 1, + py: 1, + }, + }} + > + {children(header, resultView, searching && !showPage)} + + + ) +} diff --git a/src/components/shared/proxy-control-switches.tsx b/src/components/shared/proxy-control-switches.tsx index 493942f85..8d085f36d 100644 --- a/src/components/shared/proxy-control-switches.tsx +++ b/src/components/shared/proxy-control-switches.tsx @@ -220,6 +220,7 @@ const ProxyControlSwitches = ({ )} icon={DeleteForeverRounded} color="secondary" + data-setting-target="service-uninstall" onClick={onUninstallService} sx={{ ml: 1 }} /> diff --git a/src/locales/ar/settings.json b/src/locales/ar/settings.json index ade0d0c0b..494c5a059 100644 --- a/src/locales/ar/settings.json +++ b/src/locales/ar/settings.json @@ -714,5 +714,12 @@ "installing": "جاري تثبيت الخدمة...", "uninstalling": "Uninstalling Service..." } + }, + "search": { + "placeholder": "البحث في الإعدادات", + "clear": "مسح البحث", + "back": "العودة إلى النتائج", + "results": "نتائج البحث", + "empty": "لم يتم العثور على إعدادات" } } diff --git a/src/locales/de/settings.json b/src/locales/de/settings.json index 66766a262..938fd8992 100644 --- a/src/locales/de/settings.json +++ b/src/locales/de/settings.json @@ -714,5 +714,12 @@ "installing": "Service wird installiert...", "uninstalling": "Service wird deinstalliert..." } + }, + "search": { + "placeholder": "Einstellungen suchen", + "clear": "Suche löschen", + "back": "Zurück zu Ergebnissen", + "results": "Suchergebnisse", + "empty": "Keine Einstellungen gefunden" } } diff --git a/src/locales/en/settings.json b/src/locales/en/settings.json index 27f37ae6f..1ef97ab22 100644 --- a/src/locales/en/settings.json +++ b/src/locales/en/settings.json @@ -714,5 +714,12 @@ "installing": "Installing Service...", "uninstalling": "Uninstalling Service..." } + }, + "search": { + "placeholder": "Search settings", + "clear": "Clear search", + "back": "Back to results", + "results": "Search results", + "empty": "No settings found" } } diff --git a/src/locales/es/settings.json b/src/locales/es/settings.json index ae687ea3b..56a00fa22 100644 --- a/src/locales/es/settings.json +++ b/src/locales/es/settings.json @@ -714,5 +714,12 @@ "installing": "Instalando servicio...", "uninstalling": "Desinstalando servicio..." } + }, + "search": { + "placeholder": "Buscar ajustes", + "clear": "Borrar búsqueda", + "back": "Volver a resultados", + "results": "Resultados de búsqueda", + "empty": "No se encontraron ajustes" } } diff --git a/src/locales/fa/settings.json b/src/locales/fa/settings.json index 037517ce4..9c820827d 100644 --- a/src/locales/fa/settings.json +++ b/src/locales/fa/settings.json @@ -714,5 +714,12 @@ "installing": "در حال نصب سرویس...", "uninstalling": "در حال حذف سرویس..." } + }, + "search": { + "placeholder": "جستجوی تنظیمات", + "clear": "پاک کردن جستجو", + "back": "بازگشت به نتایج", + "results": "نتایج جستجو", + "empty": "تنظیماتی یافت نشد" } } diff --git a/src/locales/id/settings.json b/src/locales/id/settings.json index 8430cbe2c..e4365e895 100644 --- a/src/locales/id/settings.json +++ b/src/locales/id/settings.json @@ -714,5 +714,12 @@ "installing": "Memasang Layanan...", "uninstalling": "Uninstalling Service..." } + }, + "search": { + "placeholder": "Cari pengaturan", + "clear": "Hapus pencarian", + "back": "Kembali ke hasil", + "results": "Hasil pencarian", + "empty": "Pengaturan tidak ditemukan" } } diff --git a/src/locales/jp/settings.json b/src/locales/jp/settings.json index cddd2b2f8..4b0bff37c 100644 --- a/src/locales/jp/settings.json +++ b/src/locales/jp/settings.json @@ -714,5 +714,12 @@ "installing": "サービスをインストール中...", "uninstalling": "サービスをアンインストール中..." } + }, + "search": { + "placeholder": "設定を検索", + "clear": "検索をクリア", + "back": "結果に戻る", + "results": "検索結果", + "empty": "設定が見つかりません" } } diff --git a/src/locales/ko/settings.json b/src/locales/ko/settings.json index e27e237a1..12945d42e 100644 --- a/src/locales/ko/settings.json +++ b/src/locales/ko/settings.json @@ -714,5 +714,12 @@ "installing": "서비스 설치 중...", "uninstalling": "서비스 제거 중..." } + }, + "search": { + "placeholder": "설정 검색", + "clear": "검색 지우기", + "back": "결과로 돌아가기", + "results": "검색 결과", + "empty": "설정을 찾을 수 없습니다" } } diff --git a/src/locales/pt/settings.json b/src/locales/pt/settings.json index 79cbdf326..67230c587 100644 --- a/src/locales/pt/settings.json +++ b/src/locales/pt/settings.json @@ -714,5 +714,12 @@ "installing": "Instalando o Serviço...", "uninstalling": "Desinstalando o Serviço..." } + }, + "search": { + "placeholder": "Pesquisar configurações", + "clear": "Limpar pesquisa", + "back": "Voltar aos resultados", + "results": "Resultados da pesquisa", + "empty": "Nenhuma configuração encontrada" } } diff --git a/src/locales/ru/settings.json b/src/locales/ru/settings.json index ae8c65093..caf1bc347 100644 --- a/src/locales/ru/settings.json +++ b/src/locales/ru/settings.json @@ -714,5 +714,12 @@ "installing": "Установка службы...", "uninstalling": "Удаление службы..." } + }, + "search": { + "placeholder": "Поиск настроек", + "clear": "Очистить поиск", + "back": "Вернуться к результатам", + "results": "Результаты поиска", + "empty": "Настройки не найдены" } } diff --git a/src/locales/tr/settings.json b/src/locales/tr/settings.json index 2487169ca..21d5a5c2b 100644 --- a/src/locales/tr/settings.json +++ b/src/locales/tr/settings.json @@ -714,5 +714,12 @@ "installing": "Hizmet Kuruluyor...", "uninstalling": "Hizmet Kaldırılıyor..." } + }, + "search": { + "placeholder": "Ayarları ara", + "clear": "Aramayı temizle", + "back": "Sonuçlara dön", + "results": "Arama sonuçları", + "empty": "Ayar bulunamadı" } } diff --git a/src/locales/tt/settings.json b/src/locales/tt/settings.json index 962584594..a95e305c4 100644 --- a/src/locales/tt/settings.json +++ b/src/locales/tt/settings.json @@ -714,5 +714,12 @@ "installing": "Хезмәт урнаштырыла...", "uninstalling": "Uninstalling Service..." } + }, + "search": { + "placeholder": "Көйләүләрне эзләү", + "clear": "Эзләүне чистарту", + "back": "Нәтиҗәләргә кайту", + "results": "Эзләү нәтиҗәләре", + "empty": "Көйләүләр табылмады" } } diff --git a/src/locales/zh/settings.json b/src/locales/zh/settings.json index 36e446b5c..a03389427 100644 --- a/src/locales/zh/settings.json +++ b/src/locales/zh/settings.json @@ -714,5 +714,12 @@ "installing": "安装服务中...", "uninstalling": "卸载服务中..." } + }, + "search": { + "placeholder": "搜索设置", + "clear": "清空搜索", + "back": "返回结果", + "results": "搜索结果", + "empty": "未找到设置" } } diff --git a/src/locales/zhtw/settings.json b/src/locales/zhtw/settings.json index 8a8f04e55..a117c3f82 100644 --- a/src/locales/zhtw/settings.json +++ b/src/locales/zhtw/settings.json @@ -714,5 +714,12 @@ "installing": "安裝服務中...", "uninstalling": "服務解除安裝中..." } + }, + "search": { + "placeholder": "搜尋設定", + "clear": "清除搜尋", + "back": "返回結果", + "results": "搜尋結果", + "empty": "找不到設定" } } diff --git a/src/pages/settings.tsx b/src/pages/settings.tsx index d00c8629d..9b7101f6f 100644 --- a/src/pages/settings.tsx +++ b/src/pages/settings.tsx @@ -8,6 +8,7 @@ import SettingClash from '@/components/setting/setting-clash' import SettingSystem from '@/components/setting/setting-system' import SettingVergeAdvanced from '@/components/setting/setting-verge-advanced' import SettingVergeBasic from '@/components/setting/setting-verge-basic' +import { SettingsSearch } from '@/components/setting/settings-search' import { showNotice } from '@/services/notice-service' import { useThemeMode } from '@/services/states' import { openExternalUrl } from '@/utils/open-external-url' @@ -39,82 +40,102 @@ const SettingPage = () => { const isDark = mode === 'light' ? false : true return ( - - - - - - - + + {(searchHeader, results, hidden) => ( + + {searchHeader} + + + + + + + - + + + + + } + > + {results} + + + + + + + + + + + + + + + + + + + + )} + ) } diff --git a/src/types/generated/i18n-keys.ts b/src/types/generated/i18n-keys.ts index 489add603..ba6eac3a7 100644 --- a/src/types/generated/i18n-keys.ts +++ b/src/types/generated/i18n-keys.ts @@ -827,6 +827,11 @@ export const translationKeys = [ 'settings.statuses.clash.restarting', 'settings.statuses.clashService.installing', 'settings.statuses.clashService.uninstalling', + 'settings.search.placeholder', + 'settings.search.clear', + 'settings.search.back', + 'settings.search.results', + 'settings.search.empty', 'shared.actions.cancel', 'shared.actions.close', 'shared.actions.confirm', diff --git a/src/types/generated/i18n-resources.ts b/src/types/generated/i18n-resources.ts index 467c7317b..3e5a527f9 100644 --- a/src/types/generated/i18n-resources.ts +++ b/src/types/generated/i18n-resources.ts @@ -1251,6 +1251,13 @@ export interface TranslationResources { actionsGroupLabel: string title: string } + search: { + back: string + clear: string + empty: string + placeholder: string + results: string + } sections: { appearance: { dark: string