feat: UX & notification improvements — icons, events, chat names, link validation, templates

- Show entity icons on all cards with fallback defaults (providers, trackers, targets, bots)
- Enrich EventLog with provider_name, tracker_name, assets_count; add DB migration
- Dashboard events: filtering (type, provider, search), sorting, pagination, dynamic page size
- Friendly chat names on telegram target cards (resolve from TelegramChat table)
- Test message button on bot chat items with locale-aware messages
- Album public link validation on tracker save with auto-create dialog
- Support albums without public links: conditional <a href> in templates
- Fetch shared links during poll, enrich events with public_url/protected_url
- Per-asset public_url in template context ({share_url}/photos/{asset_id})
- Common date/location detection: common_date + common_location context vars
- Dual date formats: date_format (datetime) + date_only_format (date only)
- Template clone button, HTML link rendering in template preview
- Fix Telegram asset download 401: pass x-api-key headers through client
- Fix provider external_url matching for API key scoping
- Fix event timestamp timezone (append Z suffix for UTC)
- Localize event filter controls, test messages (EN/RU)
- Template variable UI helpers updated with all new fields
- CLAUDE.md: template system sync rules documentation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-20 16:18:03 +03:00
parent 91e5cd58e9
commit 03c5c66eed
41 changed files with 1424 additions and 132 deletions
+17 -2
View File
@@ -46,7 +46,20 @@
"assetsRemoved": "assets removed",
"collectionRenamed": "collection renamed",
"collectionDeleted": "collection deleted",
"sharingChanged": "sharing changed"
"sharingChanged": "sharing changed",
"searchEvents": "Search events...",
"allEvents": "All Events",
"filterAssetsAdded": "Assets Added",
"filterAssetsRemoved": "Assets Removed",
"filterRenamed": "Renamed",
"filterDeleted": "Deleted",
"filterSharingChanged": "Sharing Changed",
"allProviders": "All Providers",
"newestFirst": "Newest first",
"oldestFirst": "Oldest first",
"loadingEvents": "Loading events...",
"asset": "asset",
"assets": "assets"
},
"providers": {
"title": "Providers",
@@ -284,7 +297,8 @@
"moreMessage": "More message",
"peopleFormat": "People format",
"dateLocation": "Date & Location",
"dateFormat": "Date format",
"dateFormat": "Date & time format",
"dateOnlyFormat": "Date only format",
"commonDate": "Common date",
"uniqueDate": "Per-asset date",
"locationFormat": "Location format",
@@ -417,6 +431,7 @@
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"clone": "Clone",
"edit": "Edit",
"description": "Description",
"close": "Close",
+17 -2
View File
@@ -46,7 +46,20 @@
"assetsRemoved": "удалены файлы",
"collectionRenamed": "альбом переименован",
"collectionDeleted": "альбом удалён",
"sharingChanged": "изменение доступа"
"sharingChanged": "изменение доступа",
"searchEvents": "Поиск событий...",
"allEvents": "Все события",
"filterAssetsAdded": "Добавление файлов",
"filterAssetsRemoved": "Удаление файлов",
"filterRenamed": "Переименование",
"filterDeleted": "Удаление",
"filterSharingChanged": "Изменение доступа",
"allProviders": "Все провайдеры",
"newestFirst": "Сначала новые",
"oldestFirst": "Сначала старые",
"loadingEvents": "Загрузка событий...",
"asset": "файл",
"assets": "файлов"
},
"providers": {
"title": "Провайдеры",
@@ -284,7 +297,8 @@
"moreMessage": "Сообщение \"ещё\"",
"peopleFormat": "Формат людей",
"dateLocation": "Дата и место",
"dateFormat": "Формат даты",
"dateFormat": "Формат даты и времени",
"dateOnlyFormat": "Формат даты",
"commonDate": "Общая дата",
"uniqueDate": "Дата файла",
"locationFormat": "Формат места",
@@ -417,6 +431,7 @@
"save": "Сохранить",
"cancel": "Отмена",
"delete": "Удалить",
"clone": "Копировать",
"edit": "Редактировать",
"description": "Описание",
"close": "Закрыть",