diff --git a/client/src/pages/Automations.tsx b/client/src/pages/Automations.tsx index eb1f5d1..d61b0b7 100644 --- a/client/src/pages/Automations.tsx +++ b/client/src/pages/Automations.tsx @@ -38,6 +38,7 @@ const TRIGGER_LABELS: Record = { 'task.created': 'Задача создана', 'task.status_changed': 'Статус изменён', 'qr.scan': 'Сканирование QR', + schedule: 'По расписанию', }; const CODE_TEMPLATE = `// ============================================================ @@ -54,6 +55,7 @@ const CODE_TEMPLATE = `// ====================================================== // • task.created: { formId, taskId, task: { ... } } // • task.status_changed:{ formId, taskId, oldStatusId, newStatusId, task: { ... } } // • qr.scan: { template, objectId, scannedByUserId } +// • schedule: { trigger: 'schedule', scheduledAt } // // Логирование: // ctx.log(msg) — запись в лог выполнения @@ -86,6 +88,7 @@ const CODE_TEMPLATE = `// ====================================================== // task.created — после создания задачи // task.status_changed — при изменении статуса задачи // qr.scan — при сканировании QR-кода в PWA (только офлайн-автоматизации) +// schedule — ежедневно в заданное время по МСК (triggerConfig: { time: 'HH:MM' }) // // Результат автоматизации (ctx.result): // { allow: false, error: '...' } — отменить действие (task.before_create) @@ -123,6 +126,7 @@ export function AutomationsContent() { const [formCode, setFormCode] = useState(CODE_TEMPLATE); const [formTrigger, setFormTrigger] = useState('manual'); const [formTriggerFormId, setFormTriggerFormId] = useState(''); + const [formTriggerTime, setFormTriggerTime] = useState('08:00'); const [formActive, setFormActive] = useState(true); const [formRunOffline, setFormRunOffline] = useState(false); const [formClientCompatible, setFormClientCompatible] = useState(false); @@ -186,6 +190,7 @@ export function AutomationsContent() { setFormCode(CODE_TEMPLATE); setFormTrigger('manual'); setFormTriggerFormId('all'); + setFormTriggerTime('08:00'); setFormActive(true); setFormRunOffline(false); setFormClientCompatible(false); @@ -199,6 +204,7 @@ export function AutomationsContent() { setFormCode(item.code); setFormTrigger(item.trigger); setFormTriggerFormId(String((item.triggerConfig as any)?.formId ?? 'all')); + setFormTriggerTime(String((item.triggerConfig as any)?.time ?? '08:00')); setFormActive(item.isActive); setFormRunOffline(item.runOffline ?? false); setFormClientCompatible(item.clientCompatible ?? false); @@ -212,7 +218,9 @@ export function AutomationsContent() { function handleSave() { if (!formName.trim()) return; const triggerConfig: Record = {}; - if (formTrigger !== 'manual' && formTriggerFormId && formTriggerFormId !== 'all') { + if (formTrigger === 'schedule') { + triggerConfig.time = formTriggerTime || '08:00'; + } else if (formTrigger !== 'manual' && formTriggerFormId && formTriggerFormId !== 'all') { triggerConfig.formId = parseInt(formTriggerFormId); } // For qr.scan trigger, object matching uses triggerConfig.templateKey @@ -282,6 +290,7 @@ export function AutomationsContent() { task.created: { formId, taskId, task: { ... } } task.status_changed:{ formId, taskId, oldStatusId, newStatusId, task: { ... } } qr.scan: { template, objectId, scannedByUserId } + schedule: { trigger: 'schedule', scheduledAt } Формы: ctx.forms.list() / ctx.forms.get(formId) / ctx.forms.getFields(formId) / ctx.forms.getStatuses(formId) @@ -305,6 +314,7 @@ export function AutomationsContent() { task.created — после создания задачи task.status_changed — при изменении статуса задачи qr.scan — при сканировании QR-кода в PWA + schedule — ежедневно в заданное время по МСК (настройка: время запуска) Результат автоматизации (ctx.result): { allow: false, error: '...' } — отменить действие (task.before_create) @@ -444,12 +454,25 @@ export function AutomationsContent() { При создании задачи При изменении статуса Сканирование QR + По расписанию (ежедневно, МСК) - {formTrigger !== 'manual' && ( + {formTrigger === 'schedule' && ( +
+ + setFormTriggerTime(e.target.value)} + /> +
+ )} + + {formTrigger !== 'manual' && formTrigger !== 'schedule' && (