feat: default tracker configs, email validation, expandable target links

- Tracker now has default_tracking_config_id and default_template_config_id
  that apply to all linked targets unless overridden per-target
- Dispatch falls back to tracker defaults when per-link configs are null
- Email bot creation validates SMTP connection before saving
- Email notifications sent as HTML (links render properly)
- Linked target items are expandable: collapsed shows config CrossLinks,
  expanded shows config selectors; action buttons always visible
- Fix email bot test button icon (mdiEmailSend → mdiSend)
- Fix target type icons in LinkedTargetsSection for all types
- Provider filter moved above search in sidebar
This commit is contained in:
2026-03-24 22:32:37 +03:00
parent d4cb388c74
commit 6e35926772
16 changed files with 246 additions and 102 deletions
+6 -1
View File
@@ -207,6 +207,8 @@
"quietHoursStart": "Quiet hours start",
"quietHoursEnd": "Quiet hours end",
"batchDuration": "Batch duration (seconds)",
"defaultTrackingConfig": "Default tracking config",
"defaultTemplateConfig": "Default template config",
"linkedTargets": "targets",
"noLinkedTargets": "No targets linked. Add a target below.",
"addTarget": "Add target",
@@ -540,7 +542,8 @@
"albumFields": "Album fields (in {% for album in albums %})",
"confirmDelete": "Delete this template config?",
"invalidFormat": "Invalid format string",
"filterSlots": "Filter slots..."
"filterSlots": "Filter slots...",
"slots": "slots"
},
"templateVars": {
"message_assets_added": {
@@ -645,6 +648,8 @@
"templateConfig": "Controls the message format. Uses default templates if not set.",
"scanInterval": "How often to poll the provider for changes, in seconds. Lower = faster detection but more API calls.",
"batchDuration": "Time to accumulate changes before dispatching notifications. 0 = send immediately.",
"defaultTrackingConfig": "Applied to all linked targets unless overridden per target.",
"defaultTemplateConfig": "Applied to all linked targets unless overridden per target.",
"defaultCount": "How many results to return when the user doesn't specify a count (1-20).",
"responseMode": "Media: send actual photos. Text: send filenames/links only. Media mode uses more bandwidth.",
"botLocale": "Language for command descriptions in Telegram's menu and bot response messages.",
+6 -1
View File
@@ -207,6 +207,8 @@
"quietHoursStart": "Тихие часы начало",
"quietHoursEnd": "Тихие часы конец",
"batchDuration": "Длительность пакета (секунды)",
"defaultTrackingConfig": "Конфигурация отслеживания по умолчанию",
"defaultTemplateConfig": "Шаблон уведомлений по умолчанию",
"linkedTargets": "получатели",
"noLinkedTargets": "Нет привязанных получателей. Добавьте получателя ниже.",
"addTarget": "Добавить получателя",
@@ -540,7 +542,8 @@
"albumFields": "Поля альбома (в {% for album in albums %})",
"confirmDelete": "Удалить эту конфигурацию шаблона?",
"invalidFormat": "Некорректная строка формата",
"filterSlots": "Фильтр слотов..."
"filterSlots": "Фильтр слотов...",
"slots": "слотов"
},
"templateVars": {
"message_assets_added": {
@@ -645,6 +648,8 @@
"templateConfig": "Управляет форматом сообщений. Используются шаблоны по умолчанию, если не задано.",
"scanInterval": "Как часто опрашивать провайдер на предмет изменений (в секундах). Меньше = быстрее обнаружение, но больше запросов к API.",
"batchDuration": "Время накопления изменений перед отправкой уведомлений. 0 = отправлять сразу.",
"defaultTrackingConfig": "Применяется ко всем привязанным получателям, если не переопределено.",
"defaultTemplateConfig": "Применяется ко всем привязанным получателям, если не переопределено.",
"defaultCount": "Сколько результатов возвращать, если пользователь не указал количество (1-20).",
"responseMode": "Медиа: отправка фото. Текст: только имена файлов/ссылки. Медиа-режим использует больше трафика.",
"botLocale": "Язык описаний команд в меню Telegram и ответов бота.",
+2
View File
@@ -80,6 +80,8 @@ export interface Tracker {
collection_ids: string[];
scan_interval: number;
batch_duration: number;
default_tracking_config_id: number | null;
default_template_config_id: number | null;
enabled: boolean;
filters?: Record<string, any>;
tracker_targets: TrackerTarget[];