feat(phase3): import/export, sparklines, user theme overrides
- JSON import/export with conflict resolution (skip/overwrite) + admin UI - Ping history sparklines on AppWidget and AppCard (24h, 288 points) - Hourly cleanup job for old AppStatus records - User theme preferences (hue, saturation, mode, background, locale) - Settings page with ThemeCustomizer (sliders, toggles, live preview) - Prisma migration for user preference fields - i18n translations for all new strings (EN/RU)
This commit is contained in:
+31
-1
@@ -127,6 +127,8 @@
|
||||
"app.healthcheck_timeout": "Timeout (ms)",
|
||||
"app.healthcheck_interval": "Interval (seconds)",
|
||||
"app.icon_board_label": "Icon (Lucide name)",
|
||||
"app.uptime": "uptime",
|
||||
"app.history_loading": "Loading history...",
|
||||
|
||||
"admin.panel": "Admin Panel",
|
||||
"admin.users": "Users",
|
||||
@@ -213,6 +215,23 @@
|
||||
"admin.perm_none": "No permissions configured.",
|
||||
"admin.perm_search_placeholder": "Type to search...",
|
||||
|
||||
"admin.import_export_title": "Import / Export",
|
||||
"admin.import_export_description": "Export all data (apps, boards, groups, settings) as JSON, or import from a previously exported file.",
|
||||
"admin.export_section": "Export Data",
|
||||
"admin.export_button": "Export JSON",
|
||||
"admin.export_exporting": "Exporting...",
|
||||
"admin.export_success": "Export downloaded successfully.",
|
||||
"admin.import_section": "Import Data",
|
||||
"admin.import_select_file": "Select a JSON export file",
|
||||
"admin.import_preview": "Preview",
|
||||
"admin.import_mode_label": "Conflict Resolution",
|
||||
"admin.import_mode_skip": "Skip existing (keep current data)",
|
||||
"admin.import_mode_overwrite": "Overwrite existing (replace with imported data)",
|
||||
"admin.import_button": "Import",
|
||||
"admin.import_importing": "Importing...",
|
||||
"admin.import_success": "Import completed.",
|
||||
"admin.import_invalid_json": "Selected file is not valid JSON.",
|
||||
|
||||
"search.placeholder": "Search apps and boards...",
|
||||
"search.trigger": "Search...",
|
||||
"search.min_chars": "Type at least 2 characters to search",
|
||||
@@ -261,5 +280,16 @@
|
||||
"home.view_boards": "View Boards",
|
||||
"home.browse_apps": "Browse Apps",
|
||||
|
||||
"language.label": "Language"
|
||||
"language.label": "Language",
|
||||
|
||||
"settings.title": "Settings",
|
||||
"settings.theme": "Theme Mode",
|
||||
"settings.primary_color": "Primary Color",
|
||||
"settings.hue": "Hue",
|
||||
"settings.saturation": "Saturation",
|
||||
"settings.background": "Background Effect",
|
||||
"settings.language": "Language",
|
||||
"settings.save": "Save Preferences",
|
||||
"settings.saving": "Saving...",
|
||||
"settings.saved": "Preferences saved!"
|
||||
}
|
||||
|
||||
+32
-2
@@ -127,6 +127,8 @@
|
||||
"app.healthcheck_timeout": "\u0422\u0430\u0439\u043c\u0430\u0443\u0442 (\u043c\u0441)",
|
||||
"app.healthcheck_interval": "\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b (\u0441\u0435\u043a\u0443\u043d\u0434\u044b)",
|
||||
"app.icon_board_label": "\u0418\u043a\u043e\u043d\u043a\u0430 (Lucide)",
|
||||
"app.uptime": "\u0430\u043f\u0442\u0430\u0439\u043c",
|
||||
"app.history_loading": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0438...",
|
||||
|
||||
"admin.panel": "\u041f\u0430\u043d\u0435\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430",
|
||||
"admin.users": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438",
|
||||
@@ -213,7 +215,24 @@
|
||||
"admin.perm_none": "\u041f\u0440\u0430\u0432\u0430 \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b.",
|
||||
"admin.perm_search_placeholder": "\u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u0432\u0432\u043e\u0434\u0438\u0442\u044c...",
|
||||
|
||||
"search.placeholder": "\u041f\u043e\u0438\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0434\u043e\u0441\u043e\u043a...",
|
||||
"admin.import_export_title": "Импорт / Экспорт",
|
||||
"admin.import_export_description": "Экспортируйте все данные (приложения, доски, группы, настройки) в формате JSON или импортируйте из ранее экспортированного файла.",
|
||||
"admin.export_section": "Экспорт данных",
|
||||
"admin.export_button": "Экспорт JSON",
|
||||
"admin.export_exporting": "Экспорт...",
|
||||
"admin.export_success": "Экспорт успешно скачан.",
|
||||
"admin.import_section": "Импорт данных",
|
||||
"admin.import_select_file": "Выберите JSON-файл экспорта",
|
||||
"admin.import_preview": "Предпросмотр",
|
||||
"admin.import_mode_label": "Разрешение конфликтов",
|
||||
"admin.import_mode_skip": "Пропустить существующие (оставить текущие данные)",
|
||||
"admin.import_mode_overwrite": "Перезаписать существующие (заменить импортированными)",
|
||||
"admin.import_button": "Импортировать",
|
||||
"admin.import_importing": "Импорт...",
|
||||
"admin.import_success": "Импорт завершён.",
|
||||
"admin.import_invalid_json": "Выбранный файл не является корректным JSON.",
|
||||
|
||||
"search.placeholder": "Поиск приложений и досок...",
|
||||
"search.trigger": "\u041f\u043e\u0438\u0441\u043a...",
|
||||
"search.min_chars": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043c\u0438\u043d\u0438\u043c\u0443\u043c 2 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430",
|
||||
"search.no_results": "\u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u00ab{query}\u00bb",
|
||||
@@ -261,5 +280,16 @@
|
||||
"home.view_boards": "\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u043e\u0441\u043a\u0438",
|
||||
"home.browse_apps": "\u041e\u0431\u0437\u043e\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439",
|
||||
|
||||
"language.label": "\u042f\u0437\u044b\u043a"
|
||||
"language.label": "\u042f\u0437\u044b\u043a",
|
||||
|
||||
"settings.title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",
|
||||
"settings.theme": "\u0420\u0435\u0436\u0438\u043c \u0442\u0435\u043c\u044b",
|
||||
"settings.primary_color": "\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0432\u0435\u0442",
|
||||
"settings.hue": "\u041e\u0442\u0442\u0435\u043d\u043e\u043a",
|
||||
"settings.saturation": "\u041d\u0430\u0441\u044b\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u044c",
|
||||
"settings.background": "\u042d\u0444\u0444\u0435\u043a\u0442 \u0444\u043e\u043d\u0430",
|
||||
"settings.language": "\u042f\u0437\u044b\u043a",
|
||||
"settings.save": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",
|
||||
"settings.saving": "\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435...",
|
||||
"settings.saved": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b!"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user