feat: Actions system — scheduled mutations on external services
Full-stack implementation of provider-scoped Actions with extensible executor architecture. First action type: Immich auto_organize (sort assets into albums by person, CLIP search, date range, favorites). Core: - ActionTypeDefinition registry + ActionExecutor ABC with execute/validate/dry-run - ImmichActionExecutor with multi-album support and client-side filtering - ImmichClient write methods: add/remove assets, create album, paginated search Server: - Action, ActionRule, ActionExecution DB models - Full CRUD API + manual execute + dry-run + execution history endpoints - APScheduler integration (interval + cron) for automated execution - Action type discovery API + provider people endpoint Frontend: - Actions page with CRUD, execute/dry-run buttons, inline rule editor - RuleEditor: person/album MultiEntitySelect pickers, criteria config - ExecutionHistory: expandable per-rule result details - MultiEntitySelect reusable component (searchable multi-pick palette) - Notification tracker album picker migrated to MultiEntitySelect - Fixed MdiIcon race condition (icons missing after cache-clearing reload)
This commit is contained in:
@@ -33,7 +33,9 @@
|
||||
"targetDiscord": "Discord",
|
||||
"targetSlack": "Slack",
|
||||
"targetNtfy": "ntfy",
|
||||
"targetMatrix": "Matrix"
|
||||
"targetMatrix": "Matrix",
|
||||
"automation": "Автоматизация",
|
||||
"actions": "Действия"
|
||||
},
|
||||
"auth": {
|
||||
"signIn": "Войти",
|
||||
@@ -138,6 +140,7 @@
|
||||
"server": "Провайдер",
|
||||
"selectServer": "Выберите провайдер...",
|
||||
"albums": "Альбомы",
|
||||
"selectAlbums": "Выберите альбомы...",
|
||||
"eventTypes": "Типы событий",
|
||||
"notificationTargets": "Получатели уведомлений",
|
||||
"scanInterval": "Интервал проверки (секунды)",
|
||||
@@ -828,5 +831,59 @@
|
||||
"navigate": "навигация",
|
||||
"open": "открыть",
|
||||
"close": "закрыть"
|
||||
},
|
||||
"actions": {
|
||||
"title": "Действия",
|
||||
"description": "Запланированные операции над внешними сервисами",
|
||||
"addAction": "Добавить действие",
|
||||
"noActions": "Действия ещё не настроены.",
|
||||
"provider": "Провайдер",
|
||||
"selectProvider": "Выберите провайдер...",
|
||||
"actionType": "Тип действия",
|
||||
"name": "Название",
|
||||
"schedule": "Расписание",
|
||||
"interval": "Интервал",
|
||||
"seconds": "секунд",
|
||||
"cronHint": "Стандартное cron-выражение (напр. 0 3 * * * — ежедневно в 3:00)",
|
||||
"enabled": "Включено",
|
||||
"rules": "правил",
|
||||
"addRule": "Добавить правило",
|
||||
"ruleName": "Название правила",
|
||||
"ruleNamePlaceholder": "напр. Алиса → Семейный альбом",
|
||||
"unnamedRule": "Без названия",
|
||||
"noRules": "Правил пока нет. Добавьте правило, чтобы определить, что делает это действие.",
|
||||
"on": "ВКЛ",
|
||||
"off": "ВЫКЛ",
|
||||
"criteria": "Критерии",
|
||||
"persons": "Люди",
|
||||
"addPerson": "Добавить человека...",
|
||||
"searchQuery": "Умный поиск",
|
||||
"searchQueryPlaceholder": "напр. закат, пляж, день рождения...",
|
||||
"assetType": "Тип файла",
|
||||
"dateFrom": "С даты",
|
||||
"dateTo": "По дату",
|
||||
"favoritesOnly": "Только избранное",
|
||||
"targetAlbum": "Целевой альбом",
|
||||
"selectAlbum": "Альбом",
|
||||
"selectAlbumPlaceholder": "— Выберите альбом —",
|
||||
"albumId": "ID альбома",
|
||||
"createAlbumIfMissing": "Создать альбом, если не существует",
|
||||
"newAlbumName": "Название нового альбома",
|
||||
"execute": "Выполнить",
|
||||
"dryRun": "Пробный запуск",
|
||||
"history": "История",
|
||||
"affected": "затронуто",
|
||||
"executeResult": "Действие выполнено: затронуто {affected} объектов",
|
||||
"dryRunResult": "Пробный запуск: было бы затронуто {affected} объектов",
|
||||
"saved": "Действие сохранено",
|
||||
"deleted": "Действие удалено",
|
||||
"ruleSaved": "Правило сохранено",
|
||||
"ruleDeleted": "Правило удалено",
|
||||
"confirmDelete": "Вы уверены, что хотите удалить это действие? Все правила и история выполнений будут потеряны.",
|
||||
"loadError": "Не удалось загрузить действия",
|
||||
"noExecutions": "Выполнений пока нет.",
|
||||
"triggerManual": "вручную",
|
||||
"triggerDryRun": "пробный",
|
||||
"triggerScheduled": "по расписанию"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user