feat(scheduled-tasks): add cron syntax support to task editor dialog (#1593)
Adds a 'Cron' schedule type option to the scheduled task editor, allowing users to create and edit cron-based schedules through the UI. - Add cron expression input with inline validation (cron-parser) - Show next 4 upcoming run times as a preview - Provide clickable example chips (every 5min, hourly, Monday 9am, etc.) - Preserve cron expressions when editing existing cron tasks - Add cron.ts utility module for validation and next-run computation - Add i18n keys across all 8 locale files Closes #1586 Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
This commit is contained in:
committed by
GitHub
co-authored by
Bohdan Triapitsyn
parent
e904abda04
commit
e402cd75f5
@@ -213,6 +213,7 @@ export const dict = {
|
||||
'sessions.scheduledTasks.editor.scheduleType.daily': 'Daily',
|
||||
'sessions.scheduledTasks.editor.scheduleType.weekly': 'Weekly',
|
||||
'sessions.scheduledTasks.editor.scheduleType.once': 'One-time',
|
||||
'sessions.scheduledTasks.editor.scheduleType.cron': 'Cron',
|
||||
'sessions.scheduledTasks.editor.date.label': 'Date',
|
||||
'sessions.scheduledTasks.editor.date.placeholder': 'Select date',
|
||||
'sessions.scheduledTasks.editor.date.previousMonth': 'Previous month',
|
||||
@@ -251,6 +252,17 @@ export const dict = {
|
||||
'sessions.scheduledTasks.editor.validation.atLeastOneTime': 'Add at least one valid time',
|
||||
'sessions.scheduledTasks.editor.validation.atLeastOneWeekday': 'Select at least one weekday',
|
||||
'sessions.scheduledTasks.editor.validation.timezoneRequired': 'Timezone is required',
|
||||
'sessions.scheduledTasks.editor.validation.cronRequired': 'Cron expression is required',
|
||||
'sessions.scheduledTasks.editor.validation.cronInvalid': 'Invalid cron expression',
|
||||
'sessions.scheduledTasks.editor.cronExpression.label': 'Cron expression',
|
||||
'sessions.scheduledTasks.editor.cronExpression.placeholder': '*/5 * * * *',
|
||||
'sessions.scheduledTasks.editor.cronExpression.nextRuns': 'Next runs',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples': 'Examples',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.every5min': 'Every 5 minutes',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.everyHour': 'Every hour',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.monday9am': 'Every Monday at 9am',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.9am5pm': '9am and 5pm daily',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.firstOfMonth': 'First of every month',
|
||||
'multirun.launcher.title': 'New Multi-Run',
|
||||
'multirun.launcher.actions.closeEsc': 'Close (Esc)',
|
||||
'multirun.launcher.actions.cancel': 'Cancel',
|
||||
|
||||
@@ -214,6 +214,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
"sessions.scheduledTasks.editor.scheduleType.daily": "Diario",
|
||||
"sessions.scheduledTasks.editor.scheduleType.weekly": "Semanal",
|
||||
"sessions.scheduledTasks.editor.scheduleType.once": "Una vez",
|
||||
"sessions.scheduledTasks.editor.scheduleType.cron": "Cron",
|
||||
"sessions.scheduledTasks.editor.date.label": "Fecha",
|
||||
"sessions.scheduledTasks.editor.date.placeholder": "Seleccionar fecha",
|
||||
"sessions.scheduledTasks.editor.date.previousMonth": "Mes anterior",
|
||||
@@ -252,6 +253,17 @@ export const dict: Record<I18nKey, string> = {
|
||||
"sessions.scheduledTasks.editor.validation.atLeastOneTime": "Añadir al menos una hora válida",
|
||||
"sessions.scheduledTasks.editor.validation.atLeastOneWeekday": "Seleccionar al menos un día de la semana",
|
||||
"sessions.scheduledTasks.editor.validation.timezoneRequired": "Se requiere zona horaria",
|
||||
"sessions.scheduledTasks.editor.validation.cronRequired": "Se requiere una expresión cron",
|
||||
"sessions.scheduledTasks.editor.validation.cronInvalid": "Expresión cron no válida",
|
||||
"sessions.scheduledTasks.editor.cronExpression.label": "Expresión cron",
|
||||
"sessions.scheduledTasks.editor.cronExpression.placeholder": "*/5 * * * *",
|
||||
"sessions.scheduledTasks.editor.cronExpression.nextRuns": "Próximas ejecuciones",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples": "Ejemplos",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.every5min": "Cada 5 minutos",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.everyHour": "Cada hora",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.monday9am": "Cada lunes a las 9 a. m.",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.9am5pm": "9 a. m. y 5 p. m. todos los días",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.firstOfMonth": "Primero de cada mes",
|
||||
"multirun.launcher.title": "Nuevo Multi-Run",
|
||||
"multirun.launcher.actions.closeEsc": "Cerrar (Esc)",
|
||||
"multirun.launcher.actions.cancel": "Cancelar",
|
||||
|
||||
@@ -141,6 +141,17 @@ export const dict = {
|
||||
'sessions.scheduledTasks.editor.validation.atLeastOneTime': 'Ajoutez au moins une heure valide',
|
||||
'sessions.scheduledTasks.editor.validation.atLeastOneWeekday': 'Sélectionnez au moins un jour de la semaine',
|
||||
'sessions.scheduledTasks.editor.validation.timezoneRequired': 'Le fuseau horaire est requis',
|
||||
'sessions.scheduledTasks.editor.validation.cronRequired': 'Une expression cron est requise',
|
||||
'sessions.scheduledTasks.editor.validation.cronInvalid': 'Expression cron invalide',
|
||||
'sessions.scheduledTasks.editor.cronExpression.label': 'Expression cron',
|
||||
'sessions.scheduledTasks.editor.cronExpression.placeholder': '*/5 * * * *',
|
||||
'sessions.scheduledTasks.editor.cronExpression.nextRuns': 'Prochaines exécutions',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples': 'Exemples',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.every5min': 'Toutes les 5 minutes',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.everyHour': 'Toutes les heures',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.monday9am': 'Chaque lundi à 9 h',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.9am5pm': '9 h et 17 h chaque jour',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.firstOfMonth': 'Premier jour de chaque mois',
|
||||
'multirun.launcher.title': 'Nouveau multi-run',
|
||||
'multirun.launcher.actions.closeEsc': 'Fermer (Échap)',
|
||||
'multirun.launcher.actions.cancel': 'Annuler',
|
||||
|
||||
@@ -214,6 +214,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.scheduledTasks.editor.scheduleType.daily': '매일',
|
||||
'sessions.scheduledTasks.editor.scheduleType.weekly': '매주',
|
||||
'sessions.scheduledTasks.editor.scheduleType.once': '한 번',
|
||||
'sessions.scheduledTasks.editor.scheduleType.cron': 'Cron',
|
||||
'sessions.scheduledTasks.editor.date.label': '날짜',
|
||||
'sessions.scheduledTasks.editor.date.placeholder': '날짜 선택',
|
||||
'sessions.scheduledTasks.editor.date.previousMonth': '이전 달',
|
||||
@@ -252,6 +253,17 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.scheduledTasks.editor.validation.atLeastOneTime': '유효한 시간을 하나 이상 추가하세요',
|
||||
'sessions.scheduledTasks.editor.validation.atLeastOneWeekday': '요일을 하나 이상 선택하세요',
|
||||
'sessions.scheduledTasks.editor.validation.timezoneRequired': '시간대 필수',
|
||||
'sessions.scheduledTasks.editor.validation.cronRequired': 'Cron 표현식이 필요합니다',
|
||||
'sessions.scheduledTasks.editor.validation.cronInvalid': '유효하지 않은 cron 표현식',
|
||||
'sessions.scheduledTasks.editor.cronExpression.label': 'Cron 표현식',
|
||||
'sessions.scheduledTasks.editor.cronExpression.placeholder': '*/5 * * * *',
|
||||
'sessions.scheduledTasks.editor.cronExpression.nextRuns': '다음 실행',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples': '예시',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.every5min': '5분마다',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.everyHour': '매시간',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.monday9am': '매주 월요일 오전 9시',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.9am5pm': '매일 오전 9시와 오후 5시',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.firstOfMonth': '매월 1일',
|
||||
'multirun.launcher.title': '새 다중 실행',
|
||||
'multirun.launcher.actions.closeEsc': '닫기(Esc)',
|
||||
'multirun.launcher.actions.cancel': '취소',
|
||||
|
||||
@@ -295,6 +295,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.scheduledTasks.editor.scheduleType.daily': 'Codziennie',
|
||||
'sessions.scheduledTasks.editor.scheduleType.weekly': 'Co tydzień',
|
||||
'sessions.scheduledTasks.editor.scheduleType.once': 'Jednorazowo',
|
||||
'sessions.scheduledTasks.editor.scheduleType.cron': 'Cron',
|
||||
'sessions.scheduledTasks.editor.date.label': 'Data',
|
||||
'sessions.scheduledTasks.editor.date.placeholder': 'Wybierz datę',
|
||||
'sessions.scheduledTasks.editor.date.previousMonth': 'Poprzedni miesiąc',
|
||||
@@ -333,6 +334,17 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.scheduledTasks.editor.validation.atLeastOneTime': 'Dodaj przynajmniej jeden prawidłowy czas',
|
||||
'sessions.scheduledTasks.editor.validation.atLeastOneWeekday': 'Wybierz przynajmniej jeden dzień tygodnia',
|
||||
'sessions.scheduledTasks.editor.validation.timezoneRequired': 'Strefa czasowa jest wymagana',
|
||||
'sessions.scheduledTasks.editor.validation.cronRequired': 'Wyrażenie cron jest wymagane',
|
||||
'sessions.scheduledTasks.editor.validation.cronInvalid': 'Nieprawidłowe wyrażenie cron',
|
||||
'sessions.scheduledTasks.editor.cronExpression.label': 'Wyrażenie cron',
|
||||
'sessions.scheduledTasks.editor.cronExpression.placeholder': '*/5 * * * *',
|
||||
'sessions.scheduledTasks.editor.cronExpression.nextRuns': 'Następne uruchomienia',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples': 'Przykłady',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.every5min': 'Co 5 minut',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.everyHour': 'Co godzinę',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.monday9am': 'W każdy poniedziałek o 9:00',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.9am5pm': 'Codziennie o 9:00 i 17:00',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.firstOfMonth': 'Pierwszego dnia każdego miesiąca',
|
||||
'multirun.launcher.title': 'Nowe wielokrotne uruchomienie',
|
||||
'multirun.launcher.actions.closeEsc': 'Zamknij (Esc)',
|
||||
'multirun.launcher.actions.cancel': 'Anuluj',
|
||||
|
||||
@@ -214,6 +214,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
"sessions.scheduledTasks.editor.scheduleType.daily": "Diário",
|
||||
"sessions.scheduledTasks.editor.scheduleType.weekly": "Semanal",
|
||||
"sessions.scheduledTasks.editor.scheduleType.once": "Uma vez",
|
||||
"sessions.scheduledTasks.editor.scheduleType.cron": "Cron",
|
||||
"sessions.scheduledTasks.editor.date.label": "Data",
|
||||
"sessions.scheduledTasks.editor.date.placeholder": "Selecionar data",
|
||||
"sessions.scheduledTasks.editor.date.previousMonth": "Mês anterior",
|
||||
@@ -252,6 +253,17 @@ export const dict: Record<I18nKey, string> = {
|
||||
"sessions.scheduledTasks.editor.validation.atLeastOneTime": "Adicionar ao menos uma hora válida",
|
||||
"sessions.scheduledTasks.editor.validation.atLeastOneWeekday": "Selecione ao menos um dia da semana",
|
||||
"sessions.scheduledTasks.editor.validation.timezoneRequired": "É necessário informar o fuso horário",
|
||||
"sessions.scheduledTasks.editor.validation.cronRequired": "É necessário informar uma expressão cron",
|
||||
"sessions.scheduledTasks.editor.validation.cronInvalid": "Expressão cron inválida",
|
||||
"sessions.scheduledTasks.editor.cronExpression.label": "Expressão cron",
|
||||
"sessions.scheduledTasks.editor.cronExpression.placeholder": "*/5 * * * *",
|
||||
"sessions.scheduledTasks.editor.cronExpression.nextRuns": "Próximas execuções",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples": "Exemplos",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.every5min": "A cada 5 minutos",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.everyHour": "A cada hora",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.monday9am": "Toda segunda-feira às 9h",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.9am5pm": "9h e 17h diariamente",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.firstOfMonth": "Primeiro dia de cada mês",
|
||||
"multirun.launcher.title": "Novo Multi-Run",
|
||||
"multirun.launcher.actions.closeEsc": "Fechar (Esc)",
|
||||
"multirun.launcher.actions.cancel": "Cancelar",
|
||||
|
||||
@@ -214,6 +214,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
"sessions.scheduledTasks.editor.scheduleType.daily": "Щодня",
|
||||
"sessions.scheduledTasks.editor.scheduleType.weekly": "Щотижня",
|
||||
"sessions.scheduledTasks.editor.scheduleType.once": "Одноразовий",
|
||||
"sessions.scheduledTasks.editor.scheduleType.cron": "Cron",
|
||||
"sessions.scheduledTasks.editor.date.label": "Дата",
|
||||
"sessions.scheduledTasks.editor.date.placeholder": "Вибрати дату",
|
||||
"sessions.scheduledTasks.editor.date.previousMonth": "Попередній місяць",
|
||||
@@ -252,6 +253,17 @@ export const dict: Record<I18nKey, string> = {
|
||||
"sessions.scheduledTasks.editor.validation.atLeastOneTime": "Додайте принаймні один дійсний час",
|
||||
"sessions.scheduledTasks.editor.validation.atLeastOneWeekday": "Виберіть хоча б один день тижня",
|
||||
"sessions.scheduledTasks.editor.validation.timezoneRequired": "Потрібно вказати часовий пояс",
|
||||
"sessions.scheduledTasks.editor.validation.cronRequired": "Потрібно вказати cron-вираз",
|
||||
"sessions.scheduledTasks.editor.validation.cronInvalid": "Недійсний cron-вираз",
|
||||
"sessions.scheduledTasks.editor.cronExpression.label": "Cron-вираз",
|
||||
"sessions.scheduledTasks.editor.cronExpression.placeholder": "*/5 * * * *",
|
||||
"sessions.scheduledTasks.editor.cronExpression.nextRuns": "Наступні запуски",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples": "Приклади",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.every5min": "Кожні 5 хвилин",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.everyHour": "Щогодини",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.monday9am": "Щопонеділка о 9:00",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.9am5pm": "Щодня о 9:00 і 17:00",
|
||||
"sessions.scheduledTasks.editor.cronExpression.examples.firstOfMonth": "Першого числа кожного місяця",
|
||||
"multirun.launcher.title": "Новий Multi-Run",
|
||||
"multirun.launcher.actions.closeEsc": "Закрити (Esc)",
|
||||
"multirun.launcher.actions.cancel": "Скасувати",
|
||||
|
||||
@@ -214,6 +214,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.scheduledTasks.editor.scheduleType.daily': '每天',
|
||||
'sessions.scheduledTasks.editor.scheduleType.weekly': '每周',
|
||||
'sessions.scheduledTasks.editor.scheduleType.once': '一次性',
|
||||
'sessions.scheduledTasks.editor.scheduleType.cron': 'Cron',
|
||||
'sessions.scheduledTasks.editor.date.label': '日期',
|
||||
'sessions.scheduledTasks.editor.date.placeholder': '选择日期',
|
||||
'sessions.scheduledTasks.editor.date.previousMonth': '上个月',
|
||||
@@ -252,6 +253,17 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.scheduledTasks.editor.validation.atLeastOneTime': '请至少添加一个有效时间',
|
||||
'sessions.scheduledTasks.editor.validation.atLeastOneWeekday': '请至少选择一个星期',
|
||||
'sessions.scheduledTasks.editor.validation.timezoneRequired': '时区为必填项',
|
||||
'sessions.scheduledTasks.editor.validation.cronRequired': 'Cron 表达式为必填项',
|
||||
'sessions.scheduledTasks.editor.validation.cronInvalid': 'Cron 表达式无效',
|
||||
'sessions.scheduledTasks.editor.cronExpression.label': 'Cron 表达式',
|
||||
'sessions.scheduledTasks.editor.cronExpression.placeholder': '*/5 * * * *',
|
||||
'sessions.scheduledTasks.editor.cronExpression.nextRuns': '下次运行',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples': '示例',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.every5min': '每 5 分钟',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.everyHour': '每小时',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.monday9am': '每周一上午 9 点',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.9am5pm': '每天上午 9 点和下午 5 点',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.firstOfMonth': '每月第一天',
|
||||
'multirun.launcher.title': '新建多运行',
|
||||
'multirun.launcher.actions.closeEsc': '关闭 (Esc)',
|
||||
'multirun.launcher.actions.cancel': '取消',
|
||||
|
||||
@@ -227,6 +227,7 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.scheduledTasks.editor.scheduleType.daily': '每天',
|
||||
'sessions.scheduledTasks.editor.scheduleType.weekly': '每週',
|
||||
'sessions.scheduledTasks.editor.scheduleType.once': '一次性',
|
||||
'sessions.scheduledTasks.editor.scheduleType.cron': 'Cron',
|
||||
'sessions.scheduledTasks.editor.date.label': '日期',
|
||||
'sessions.scheduledTasks.editor.date.placeholder': '選擇日期',
|
||||
'sessions.scheduledTasks.editor.date.previousMonth': '上個月',
|
||||
@@ -265,6 +266,17 @@ export const dict: Record<I18nKey, string> = {
|
||||
'sessions.scheduledTasks.editor.validation.atLeastOneTime': '請至少新增一個有效時間',
|
||||
'sessions.scheduledTasks.editor.validation.atLeastOneWeekday': '請至少選擇一個星期',
|
||||
'sessions.scheduledTasks.editor.validation.timezoneRequired': '時區為必填項',
|
||||
'sessions.scheduledTasks.editor.validation.cronRequired': 'Cron 表達式為必填項',
|
||||
'sessions.scheduledTasks.editor.validation.cronInvalid': 'Cron 表達式無效',
|
||||
'sessions.scheduledTasks.editor.cronExpression.label': 'Cron 表達式',
|
||||
'sessions.scheduledTasks.editor.cronExpression.placeholder': '*/5 * * * *',
|
||||
'sessions.scheduledTasks.editor.cronExpression.nextRuns': '下次執行',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples': '範例',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.every5min': '每 5 分鐘',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.everyHour': '每小時',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.monday9am': '每週一上午 9 點',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.9am5pm': '每天上午 9 點和下午 5 點',
|
||||
'sessions.scheduledTasks.editor.cronExpression.examples.firstOfMonth': '每月第一天',
|
||||
'multirun.launcher.title': '新增 Multi-run',
|
||||
'multirun.launcher.actions.closeEsc': '關閉 (Esc)',
|
||||
'multirun.launcher.actions.cancel': '取消',
|
||||
|
||||
Reference in New Issue
Block a user