diff --git a/frontend/src/lib/i18n/en.json b/frontend/src/lib/i18n/en.json
index cd8bfa1..c902196 100644
--- a/frontend/src/lib/i18n/en.json
+++ b/frontend/src/lib/i18n/en.json
@@ -263,8 +263,8 @@
"periodicAlbum": "Per-album item",
"scheduledAssets": "Scheduled assets",
"memoryMode": "Memory mode",
- "telegramSettings": "Telegram",
- "videoWarning": "Video warning",
+ "settings": "Settings",
+ "previewAs": "Preview as",
"preview": "Preview",
"variables": "Variables",
"assetFields": "Asset fields (in {% for asset in added_assets %})",
@@ -289,7 +289,9 @@
"added_assets": "List of asset dicts (use {% for asset in added_assets %})",
"removed_assets": "List of removed asset IDs (strings)",
"shared": "Whether album is shared (boolean)",
- "video_warning": "Video size warning (from template config, only if videos present)",
+ "target_type": "Target type: 'telegram' or 'webhook'",
+ "has_videos": "Whether added assets contain videos (boolean)",
+ "has_photos": "Whether added assets contain photos (boolean)",
"old_name": "Previous album name (rename events)",
"new_name": "New album name (rename events)",
"old_shared": "Was album shared before rename (boolean)",
diff --git a/frontend/src/lib/i18n/ru.json b/frontend/src/lib/i18n/ru.json
index f116815..f1899a4 100644
--- a/frontend/src/lib/i18n/ru.json
+++ b/frontend/src/lib/i18n/ru.json
@@ -263,8 +263,8 @@
"periodicAlbum": "Элемент альбома",
"scheduledAssets": "Запланированные фото",
"memoryMode": "Воспоминания",
- "telegramSettings": "Telegram",
- "videoWarning": "Предупреждение о видео",
+ "settings": "Настройки",
+ "previewAs": "Предпросмотр как",
"preview": "Предпросмотр",
"variables": "Переменные",
"assetFields": "Поля файла (в {% for asset in added_assets %})",
@@ -289,7 +289,9 @@
"added_assets": "Список файлов ({% for asset in added_assets %})",
"removed_assets": "Список ID удалённых файлов (строки)",
"shared": "Общий альбом (boolean)",
- "video_warning": "Предупреждение о видео (из конфига шаблона, если есть видео)",
+ "target_type": "Тип получателя: 'telegram' или 'webhook'",
+ "has_videos": "Содержат ли добавленные файлы видео (boolean)",
+ "has_photos": "Содержат ли добавленные файлы фото (boolean)",
"old_name": "Прежнее название альбома (при переименовании)",
"new_name": "Новое название альбома (при переименовании)",
"old_shared": "Был ли общим до переименования (boolean)",
diff --git a/frontend/src/routes/template-configs/+page.svelte b/frontend/src/routes/template-configs/+page.svelte
index 4d37a3c..6866bf3 100644
--- a/frontend/src/routes/template-configs/+page.svelte
+++ b/frontend/src/routes/template-configs/+page.svelte
@@ -43,7 +43,7 @@
// Debounce 800ms
validateTimers[slotKey] = setTimeout(async () => {
try {
- const res = await api('/template-configs/preview-raw', { method: 'POST', body: JSON.stringify({ template }) });
+ const res = await api('/template-configs/preview-raw', { method: 'POST', body: JSON.stringify({ template, target_type: previewTargetType }) });
slotErrors = { ...slotErrors, [slotKey]: res.error || '' };
slotErrorLines = { ...slotErrorLines, [slotKey]: res.error_line || null };
slotErrorTypes = { ...slotErrorTypes, [slotKey]: res.error_type || '' };
@@ -73,9 +73,9 @@
scheduled_assets_message: '',
memory_mode_message: '',
date_format: '%d.%m.%Y, %H:%M UTC',
- video_warning: '\n\n⚠️ Note: Videos may not be sent due to Telegram\'s 50 MB file size limit.',
});
let form = $state(defaultForm());
+ let previewTargetType = $state('telegram');
const templateSlots = [
{ group: 'eventMessages', slots: [
@@ -89,9 +89,8 @@
{ key: 'scheduled_assets_message', label: 'scheduledAssets', rows: 6 },
{ key: 'memory_mode_message', label: 'memoryMode', rows: 6 },
]},
- { group: 'telegramSettings', slots: [
+ { group: 'settings', slots: [
{ key: 'date_format', label: 'dateFormat', rows: 1 },
- { key: 'video_warning', label: 'videoWarning', rows: 2 },
]},
];
@@ -124,7 +123,7 @@
const template = (form as any)[slotKey] || '';
if (!template) { slotPreview = { ...slotPreview, [slotKey]: '(empty)' }; return; }
try {
- const res = await api('/template-configs/preview-raw', { method: 'POST', body: JSON.stringify({ template }) });
+ const res = await api('/template-configs/preview-raw', { method: 'POST', body: JSON.stringify({ template, target_type: previewTargetType }) });
slotPreview = { ...slotPreview, [slotKey]: res.error ? `Error: ${res.error}` : res.rendered };
} catch (err: any) { slotPreview = { ...slotPreview, [slotKey]: `Error: ${err.message}` }; }
}
@@ -135,7 +134,7 @@
const template = config[slotKey] || '';
if (!template) return;
try {
- const res = await api('/template-configs/preview-raw', { method: 'POST', body: JSON.stringify({ template }) });
+ const res = await api('/template-configs/preview-raw', { method: 'POST', body: JSON.stringify({ template, target_type: previewTargetType }) });
slotPreview[slotKey + '_' + configId] = res.error ? `Error: ${res.error}` : res.rendered;
} catch (err: any) { slotPreview[slotKey + '_' + configId] = `Error: ${err.message}`; }
}
@@ -180,6 +179,21 @@
class="w-full px-3 py-2 border border-[var(--color-border)] rounded-md text-sm bg-[var(--color-background)]" />
+
+
+
+
+
+
+
+
+
{#each templateSlots as group}