|
|
|
@ -52,7 +52,7 @@ const CronPicker: React.FC<CronPickerProps> = ({ value, onChange, style, classNa
|
|
|
|
const [minutesInterval, setMinutesInterval] = useState<number>(5);
|
|
|
|
const [minutesInterval, setMinutesInterval] = useState<number>(5);
|
|
|
|
const [hourType, setHourType] = useState<'every' | 'at'>('at');
|
|
|
|
const [hourType, setHourType] = useState<'every' | 'at'>('at');
|
|
|
|
const [hourlyAt, setHourlyAt] = useState<number>(12);
|
|
|
|
const [hourlyAt, setHourlyAt] = useState<number>(12);
|
|
|
|
const [dailyType, setDailyType] = useState<'every' | 'weekday' | 'specific'>('every');
|
|
|
|
const [dailyType, setDailyType] = useState<'every' | 'weekday' | 'specific' | 'week'>('every');
|
|
|
|
const [specificDay, setSpecificDay] = useState<number>(1);
|
|
|
|
const [specificDay, setSpecificDay] = useState<number>(1);
|
|
|
|
const [selectedWeekdays, setSelectedWeekdays] = useState<string[]>(['MON']);
|
|
|
|
const [selectedWeekdays, setSelectedWeekdays] = useState<string[]>(['MON']);
|
|
|
|
const [selectedMonths, setSelectedMonths] = useState<string[]>(['1']);
|
|
|
|
const [selectedMonths, setSelectedMonths] = useState<string[]>(['1']);
|
|
|
|
@ -103,6 +103,10 @@ const CronPicker: React.FC<CronPickerProps> = ({ value, onChange, style, classNa
|
|
|
|
dom = specificDay.toString();
|
|
|
|
dom = specificDay.toString();
|
|
|
|
dow = '?';
|
|
|
|
dow = '?';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (dailyType === 'week') {
|
|
|
|
|
|
|
|
dom = '?';
|
|
|
|
|
|
|
|
dow = selectedWeekdays.length > 0 ? selectedWeekdays.join(',') : '*';
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const mon = selectedMonths.length < 12 ? selectedMonths.join(',') : '*';
|
|
|
|
const mon = selectedMonths.length < 12 ? selectedMonths.join(',') : '*';
|
|
|
|
const newCron = `${sec} ${min} ${hour} ${dom} ${mon} ${dow}`;
|
|
|
|
const newCron = `${sec} ${min} ${hour} ${dom} ${mon} ${dow}`;
|
|
|
|
@ -162,6 +166,16 @@ const CronPicker: React.FC<CronPickerProps> = ({ value, onChange, style, classNa
|
|
|
|
setSpecificDay(dayNum);
|
|
|
|
setSpecificDay(dayNum);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (dayOfMonth === '?' && dayOfWeek !== '?' && dayOfWeek !== 'MON-FRI') {
|
|
|
|
|
|
|
|
setDailyType('week');
|
|
|
|
|
|
|
|
if (dayOfWeek.includes(',') || dayOfWeek.includes('-')) {
|
|
|
|
|
|
|
|
// 简化处理,实际可以更精确解析
|
|
|
|
|
|
|
|
setSelectedWeekdays(dayOfWeek.split(/[-,]/));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (dayOfWeek !== '*') {
|
|
|
|
|
|
|
|
setSelectedWeekdays([dayOfWeek]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 解析星期部分
|
|
|
|
// 解析星期部分
|
|
|
|
if (dayOfWeek !== '?' && dayOfWeek !== '*') {
|
|
|
|
if (dayOfWeek !== '?' && dayOfWeek !== '*') {
|
|
|
|
@ -272,7 +286,7 @@ const CronPicker: React.FC<CronPickerProps> = ({ value, onChange, style, classNa
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleDailyTypeChange = (value: string) => {
|
|
|
|
const handleDailyTypeChange = (value: string) => {
|
|
|
|
setDailyType(value as 'every' | 'weekday' | 'specific');
|
|
|
|
setDailyType(value as 'every' | 'weekday' | 'specific' | 'week');
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
return (
|
|
|
|
@ -341,29 +355,32 @@ const CronPicker: React.FC<CronPickerProps> = ({ value, onChange, style, classNa
|
|
|
|
/>
|
|
|
|
/>
|
|
|
|
<span>天</span>
|
|
|
|
<span>天</span>
|
|
|
|
</span>
|
|
|
|
</span>
|
|
|
|
|
|
|
|
<Radio value="week">指定星期</Radio>
|
|
|
|
</Space>
|
|
|
|
</Space>
|
|
|
|
</Radio.Group>
|
|
|
|
</Radio.Group>
|
|
|
|
</Form.Item>
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
<Form.Item label="星期" className={styles.formItem}>
|
|
|
|
{dailyType === 'week' && (
|
|
|
|
<div className={styles.inlineGroup}>
|
|
|
|
<Form.Item label="星期" className={styles.formItem}>
|
|
|
|
{['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'].map(day => (
|
|
|
|
<div className={styles.inlineGroup}>
|
|
|
|
<Button
|
|
|
|
{['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'].map(day => (
|
|
|
|
key={day}
|
|
|
|
<Button
|
|
|
|
type={selectedWeekdays.includes(day) ? 'primary' : 'secondary'}
|
|
|
|
key={day}
|
|
|
|
size="small"
|
|
|
|
type={selectedWeekdays.includes(day) ? 'primary' : 'secondary'}
|
|
|
|
className={styles.weekButton}
|
|
|
|
size="small"
|
|
|
|
onClick={() => {
|
|
|
|
className={styles.weekButton}
|
|
|
|
setSelectedWeekdays(prev =>
|
|
|
|
onClick={() => {
|
|
|
|
prev.includes(day) ? prev.filter(d => d !== day) : [...prev, day]
|
|
|
|
setSelectedWeekdays(prev =>
|
|
|
|
);
|
|
|
|
prev.includes(day) ? prev.filter(d => d !== day) : [...prev, day]
|
|
|
|
}}
|
|
|
|
);
|
|
|
|
>
|
|
|
|
}}
|
|
|
|
{dayMap[day]}
|
|
|
|
>
|
|
|
|
</Button>
|
|
|
|
{dayMap[day]}
|
|
|
|
))}
|
|
|
|
</Button>
|
|
|
|
</div>
|
|
|
|
))}
|
|
|
|
</Form.Item>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
<Space wrap size="small" className={styles.presetsContainer}>
|
|
|
|
<Space wrap size="small" className={styles.presetsContainer}>
|
|
|
|
{PRESETS.map(p => (
|
|
|
|
{PRESETS.map(p => (
|
|
|
|
|