Add days schedule trigger (#10800)

<img width="1470" alt="image"
src="https://github.com/user-attachments/assets/660d79ba-60c7-4874-aa82-80a7575366ba"
/>
This commit is contained in:
martmull
2025-03-12 16:25:07 +01:00
committed by GitHub
parent bfc542290b
commit 1b0413bf8b
10 changed files with 244 additions and 5 deletions

View File

@ -30,6 +30,9 @@ type WorkflowEditTriggerCronFormProps = {
type FormErrorMessages = {
CUSTOM?: string | undefined;
DAYS_day?: string | undefined;
DAYS_hour?: string | undefined;
DAYS_minute?: string | undefined;
HOURS_hour?: string | undefined;
HOURS_minute?: string | undefined;
MINUTES?: string | undefined;
@ -146,6 +149,159 @@ export const WorkflowEditTriggerCronForm = ({
}}
/>
)}
{trigger.settings.type === 'DAYS' && (
<>
<FormNumberFieldInput
label="Days Between Triggers"
error={errorMessagesVisible ? errorMessages.DAYS_day : undefined}
onBlur={onBlur}
defaultValue={trigger.settings.schedule.day}
onPersist={(newDay) => {
if (triggerOptions.readonly === true) {
return;
}
if (!isDefined(newDay)) {
return;
}
if (!isNumber(newDay) || newDay <= 0) {
setErrorMessages((prev) => ({
...prev,
DAYS_day: `Invalid day value '${newDay}'. Should be integer greater than 1`,
}));
return;
}
setErrorMessages((prev) => ({
...prev,
DAYS_day: undefined,
}));
triggerOptions.onTriggerUpdate({
...trigger,
settings: {
...trigger.settings,
type: 'DAYS',
schedule: {
day: newDay,
hour:
trigger.settings.type === 'DAYS'
? trigger.settings.schedule.hour
: 0,
minute:
trigger.settings.type === 'DAYS'
? trigger.settings.schedule.minute
: 0,
},
},
});
}}
placeholder="Enter number greater than 1"
readonly={triggerOptions.readonly}
/>
<FormNumberFieldInput
label="Trigger at Hour"
error={errorMessagesVisible ? errorMessages.DAYS_hour : undefined}
onBlur={onBlur}
defaultValue={trigger.settings.schedule.hour}
onPersist={(newHour) => {
if (triggerOptions.readonly === true) {
return;
}
if (!isDefined(newHour)) {
return;
}
if (!isNumber(newHour) || newHour < 0 || newHour > 23) {
setErrorMessages((prev) => ({
...prev,
DAYS_hour: `Invalid hour value '${newHour}'. Should be integer between 0 and 23`,
}));
return;
}
setErrorMessages((prev) => ({
...prev,
DAYS_hour: undefined,
}));
triggerOptions.onTriggerUpdate({
...trigger,
settings: {
...trigger.settings,
type: 'DAYS',
schedule: {
day:
trigger.settings.type === 'DAYS'
? trigger.settings.schedule.day
: 1,
hour: newHour,
minute:
trigger.settings.type === 'DAYS'
? trigger.settings.schedule.minute
: 0,
},
},
});
}}
placeholder="Enter number between 0 and 23"
readonly={triggerOptions.readonly}
/>
<FormNumberFieldInput
label="Trigger at Minute"
error={
errorMessagesVisible ? errorMessages.DAYS_minute : undefined
}
onBlur={onBlur}
defaultValue={trigger.settings.schedule.minute}
onPersist={(newMinute) => {
if (triggerOptions.readonly === true) {
return;
}
if (!isDefined(newMinute)) {
return;
}
if (!isNumber(newMinute) || newMinute < 0 || newMinute > 59) {
setErrorMessages((prev) => ({
...prev,
DAYS_minute: `Invalid minute value '${newMinute}'. Should be integer between 0 and 59`,
}));
return;
}
setErrorMessages((prev) => ({
...prev,
DAYS_minute: undefined,
}));
triggerOptions.onTriggerUpdate({
...trigger,
settings: {
...trigger.settings,
type: 'DAYS',
schedule: {
day:
trigger.settings.type === 'DAYS'
? trigger.settings.schedule.day
: 1,
hour:
trigger.settings.type === 'DAYS'
? trigger.settings.schedule.hour
: 0,
minute: newMinute,
},
},
});
}}
placeholder="Enter number between 0 and 59"
readonly={triggerOptions.readonly}
/>
</>
)}
{trigger.settings.type === 'HOURS' && (
<>
<FormNumberFieldInput

View File

@ -3,15 +3,21 @@ import {
IconComponent,
IconHours24,
IconTimeDuration60,
IconBrandDaysCounter,
} from 'twenty-ui';
export type CronTriggerInterval = 'HOURS' | 'MINUTES' | 'CUSTOM';
export type CronTriggerInterval = 'DAYS' | 'HOURS' | 'MINUTES' | 'CUSTOM';
export const CRON_TRIGGER_INTERVAL_OPTIONS: Array<{
label: string;
value: CronTriggerInterval;
Icon: IconComponent;
}> = [
{
label: 'Days',
value: 'DAYS',
Icon: IconBrandDaysCounter,
},
{
label: 'Hours',
value: 'HOURS',

View File

@ -8,6 +8,16 @@ export const getCronTriggerDefaultSettings = (
cronTriggerInterval: CronTriggerInterval,
): WorkflowCronTrigger['settings'] => {
switch (cronTriggerInterval) {
case 'DAYS':
return {
schedule: {
day: 1,
hour: 0,
minute: 0,
},
type: cronTriggerInterval,
outputSchema: {},
};
case 'HOURS':
return {
schedule: {

View File

@ -52,8 +52,8 @@ export const getTriggerDefaultDefinition = ({
type,
name: defaultLabel,
settings: {
type: 'HOURS',
schedule: { hour: 1, minute: 0 },
type: 'DAYS',
schedule: { day: 1, hour: 0, minute: 0 },
outputSchema: {},
},
};