@djangocfg/ui-tools 2.1.132 → 2.1.134
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CronScheduler.client-REXEMXZN.mjs → CronScheduler.client-BYKMIOZJ.mjs} +3 -3
- package/dist/{CronScheduler.client-REXEMXZN.mjs.map → CronScheduler.client-BYKMIOZJ.mjs.map} +1 -1
- package/dist/{CronScheduler.client-YJ2SHYNH.cjs → CronScheduler.client-X74RLZLW.cjs} +11 -11
- package/dist/{CronScheduler.client-YJ2SHYNH.cjs.map → CronScheduler.client-X74RLZLW.cjs.map} +1 -1
- package/dist/{chunk-74JT4UIM.cjs → chunk-D3TZQSX6.cjs} +123 -124
- package/dist/chunk-D3TZQSX6.cjs.map +1 -0
- package/dist/{chunk-6G72N466.mjs → chunk-HVRP57NM.mjs} +123 -124
- package/dist/chunk-HVRP57NM.mjs.map +1 -0
- package/dist/index.cjs +22 -22
- package/dist/index.mjs +3 -3
- package/package.json +8 -7
- package/src/styles/index.css +5 -0
- package/src/tools/CronScheduler/CronScheduler.story.tsx +80 -0
- package/src/tools/CronScheduler/components/DayChips.tsx +55 -49
- package/src/tools/CronScheduler/components/MonthDayGrid.tsx +64 -50
- package/src/tools/CronScheduler/components/ScheduleTypeSelector.tsx +19 -10
- package/dist/chunk-6G72N466.mjs.map +0 -1
- package/dist/chunk-74JT4UIM.cjs.map +0 -1
|
@@ -30,84 +30,98 @@ export function MonthDayGrid({
|
|
|
30
30
|
}: MonthDayGridProps) {
|
|
31
31
|
const { monthDays, toggleMonthDay, setMonthDays } = useCronMonthDays();
|
|
32
32
|
|
|
33
|
+
// Prepare presets data
|
|
33
34
|
const is1st = monthDays.length === 1 && monthDays[0] === 1;
|
|
34
35
|
const is15th = monthDays.length === 1 && monthDays[0] === 15;
|
|
35
36
|
const is1stAnd15th = monthDays.length === 2 && monthDays.includes(1) && monthDays.includes(15);
|
|
36
37
|
|
|
38
|
+
const presets = [
|
|
39
|
+
{ label: '1st', isActive: is1st, days: [1] as MonthDay[] },
|
|
40
|
+
{ label: '15th', isActive: is15th, days: [15] as MonthDay[] },
|
|
41
|
+
{ label: '1st & 15th', isActive: is1stAnd15th, days: [1, 15] as MonthDay[] },
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
// Prepare grid cells data
|
|
45
|
+
const gridCells = Array.from({ length: GRID_SIZE }, (_, i) => {
|
|
46
|
+
const day = i + 1;
|
|
47
|
+
const isValidDay = day <= 31;
|
|
48
|
+
const isSelected = isValidDay && monthDays.includes(day as MonthDay);
|
|
49
|
+
const isPartialMonth = day > 28;
|
|
50
|
+
|
|
51
|
+
if (!isValidDay) {
|
|
52
|
+
return { type: 'empty' as const, key: i };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
type: 'day' as const,
|
|
57
|
+
key: day,
|
|
58
|
+
day: day as MonthDay,
|
|
59
|
+
isSelected,
|
|
60
|
+
className: cn(
|
|
61
|
+
'aspect-square flex items-center justify-center',
|
|
62
|
+
'rounded-lg text-sm font-medium',
|
|
63
|
+
'transition-all duration-150',
|
|
64
|
+
'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50',
|
|
65
|
+
'active:scale-[0.95]',
|
|
66
|
+
isSelected
|
|
67
|
+
? 'bg-primary text-primary-foreground shadow-sm'
|
|
68
|
+
: cn(
|
|
69
|
+
'bg-muted/30 hover:bg-muted/60',
|
|
70
|
+
isPartialMonth
|
|
71
|
+
? 'text-muted-foreground/50'
|
|
72
|
+
: 'text-muted-foreground'
|
|
73
|
+
),
|
|
74
|
+
disabled && 'opacity-50 cursor-not-allowed pointer-events-none'
|
|
75
|
+
),
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
const selectionCount = monthDays.length;
|
|
80
|
+
|
|
37
81
|
return (
|
|
38
82
|
<div className={cn('space-y-3', className)}>
|
|
39
83
|
{/* Quick Presets */}
|
|
40
84
|
{showPresets && (
|
|
41
85
|
<div className="flex gap-2">
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
onClick={() => setMonthDays([15] as MonthDay[])}
|
|
52
|
-
disabled={disabled}
|
|
53
|
-
/>
|
|
54
|
-
<PresetButton
|
|
55
|
-
label="1st & 15th"
|
|
56
|
-
isActive={is1stAnd15th}
|
|
57
|
-
onClick={() => setMonthDays([1, 15] as MonthDay[])}
|
|
58
|
-
disabled={disabled}
|
|
59
|
-
/>
|
|
86
|
+
{presets.map((preset) => (
|
|
87
|
+
<PresetButton
|
|
88
|
+
key={preset.label}
|
|
89
|
+
label={preset.label}
|
|
90
|
+
isActive={preset.isActive}
|
|
91
|
+
onClick={() => setMonthDays(preset.days)}
|
|
92
|
+
disabled={disabled}
|
|
93
|
+
/>
|
|
94
|
+
))}
|
|
60
95
|
</div>
|
|
61
96
|
)}
|
|
62
97
|
|
|
63
98
|
{/* Calendar Grid - full width */}
|
|
64
99
|
<div className="grid grid-cols-7 gap-1">
|
|
65
|
-
{
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const isSelected = isValidDay && monthDays.includes(day as MonthDay);
|
|
69
|
-
// Days that don't exist in some months
|
|
70
|
-
const isPartialMonth = day > 28;
|
|
71
|
-
|
|
72
|
-
if (!isValidDay) {
|
|
73
|
-
return <div key={i} className="aspect-square" />;
|
|
100
|
+
{gridCells.map((cell) => {
|
|
101
|
+
if (cell.type === 'empty') {
|
|
102
|
+
return <div key={cell.key} className="aspect-square" />;
|
|
74
103
|
}
|
|
75
104
|
|
|
76
105
|
return (
|
|
77
106
|
<button
|
|
78
|
-
key={
|
|
107
|
+
key={cell.key}
|
|
79
108
|
type="button"
|
|
80
109
|
disabled={disabled}
|
|
81
|
-
onClick={() => toggleMonthDay(day
|
|
82
|
-
aria-pressed={isSelected}
|
|
83
|
-
aria-label={`Day ${day}`}
|
|
84
|
-
className={
|
|
85
|
-
'aspect-square flex items-center justify-center',
|
|
86
|
-
'rounded-lg text-sm font-medium',
|
|
87
|
-
'transition-all duration-150',
|
|
88
|
-
'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50',
|
|
89
|
-
'active:scale-[0.95]',
|
|
90
|
-
isSelected
|
|
91
|
-
? 'bg-primary text-primary-foreground shadow-sm'
|
|
92
|
-
: cn(
|
|
93
|
-
'bg-muted/30 hover:bg-muted/60',
|
|
94
|
-
isPartialMonth
|
|
95
|
-
? 'text-muted-foreground/50'
|
|
96
|
-
: 'text-muted-foreground'
|
|
97
|
-
),
|
|
98
|
-
disabled && 'opacity-50 cursor-not-allowed pointer-events-none'
|
|
99
|
-
)}
|
|
110
|
+
onClick={() => toggleMonthDay(cell.day)}
|
|
111
|
+
aria-pressed={cell.isSelected}
|
|
112
|
+
aria-label={`Day ${cell.day}`}
|
|
113
|
+
className={cell.className}
|
|
100
114
|
>
|
|
101
|
-
{day}
|
|
115
|
+
{cell.day}
|
|
102
116
|
</button>
|
|
103
117
|
);
|
|
104
118
|
})}
|
|
105
119
|
</div>
|
|
106
120
|
|
|
107
121
|
{/* Selection hint */}
|
|
108
|
-
{
|
|
122
|
+
{selectionCount > 1 && (
|
|
109
123
|
<p className="text-xs text-muted-foreground text-center">
|
|
110
|
-
{
|
|
124
|
+
{selectionCount} days selected
|
|
111
125
|
</p>
|
|
112
126
|
)}
|
|
113
127
|
</div>
|
|
@@ -30,6 +30,19 @@ export function ScheduleTypeSelector({
|
|
|
30
30
|
}: ScheduleTypeSelectorProps) {
|
|
31
31
|
const { type, setType } = useCronType();
|
|
32
32
|
|
|
33
|
+
const triggerClassName = cn(
|
|
34
|
+
'text-xs font-medium px-2 py-1.5',
|
|
35
|
+
'data-[state=active]:shadow-sm',
|
|
36
|
+
'transition-all duration-150'
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
const triggers = SCHEDULE_TYPES.map(({ value, label }) => ({
|
|
40
|
+
value,
|
|
41
|
+
label,
|
|
42
|
+
disabled,
|
|
43
|
+
className: triggerClassName,
|
|
44
|
+
}));
|
|
45
|
+
|
|
33
46
|
return (
|
|
34
47
|
<Tabs
|
|
35
48
|
value={type}
|
|
@@ -37,18 +50,14 @@ export function ScheduleTypeSelector({
|
|
|
37
50
|
className={cn('w-full', className)}
|
|
38
51
|
>
|
|
39
52
|
<TabsList className="grid w-full grid-cols-4 h-9 p-0.5">
|
|
40
|
-
{
|
|
53
|
+
{triggers.map((trigger) => (
|
|
41
54
|
<TabsTrigger
|
|
42
|
-
key={value}
|
|
43
|
-
value={value}
|
|
44
|
-
disabled={disabled}
|
|
45
|
-
className={
|
|
46
|
-
'text-xs font-medium px-2 py-1.5',
|
|
47
|
-
'data-[state=active]:shadow-sm',
|
|
48
|
-
'transition-all duration-150'
|
|
49
|
-
)}
|
|
55
|
+
key={trigger.value}
|
|
56
|
+
value={trigger.value}
|
|
57
|
+
disabled={trigger.disabled}
|
|
58
|
+
className={trigger.className}
|
|
50
59
|
>
|
|
51
|
-
{label}
|
|
60
|
+
{trigger.label}
|
|
52
61
|
</TabsTrigger>
|
|
53
62
|
))}
|
|
54
63
|
</TabsList>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/CronScheduler/utils/cron-builder.ts","../src/tools/CronScheduler/utils/cron-parser.ts","../src/tools/CronScheduler/utils/cron-humanize.ts","../src/tools/CronScheduler/context/CronSchedulerContext.tsx","../src/tools/CronScheduler/context/hooks.ts","../src/tools/CronScheduler/components/ScheduleTypeSelector.tsx","../src/tools/CronScheduler/components/TimeSelector.tsx","../src/tools/CronScheduler/components/DayChips.tsx","../src/tools/CronScheduler/components/MonthDayGrid.tsx","../src/tools/CronScheduler/components/CustomInput.tsx","../src/tools/CronScheduler/components/CronCheatsheet.tsx","../src/tools/CronScheduler/components/SchedulePreview.tsx"],"names":["parseWeekDays","parseMonthDays","useMemo","jsx","cn","isWeekdays","isWeekend","jsxs","PresetButton","useState","useEffect","useCallback"],"mappings":"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","file":"chunk-6G72N466.mjs","sourcesContent":["/**\n * Cron Builder\n *\n * Converts CronSchedulerState to Unix 5-field cron expression\n * Format: minute hour day-of-month month day-of-week\n */\n\nimport type { CronSchedulerState } from '../types';\n\n/**\n * Builds Unix 5-field cron expression from state\n *\n * @example\n * // Daily at 9:00\n * buildCron({ type: 'daily', hour: 9, minute: 0, ... }) // '0 9 * * *'\n *\n * // Weekly on Mon, Wed, Fri at 14:30\n * buildCron({ type: 'weekly', hour: 14, minute: 30, weekDays: [1, 3, 5], ... }) // '30 14 * * 1,3,5'\n *\n * // Monthly on 1st and 15th at 0:00\n * buildCron({ type: 'monthly', hour: 0, minute: 0, monthDays: [1, 15], ... }) // '0 0 1,15 * *'\n */\nexport function buildCron(state: CronSchedulerState): string {\n const { type, hour, minute, weekDays, monthDays, customCron } = state;\n\n // Ensure valid hour/minute\n const h = Math.max(0, Math.min(23, hour));\n const m = Math.max(0, Math.min(59, minute));\n\n switch (type) {\n case 'daily':\n // Run every day at specified time\n return `${m} ${h} * * *`;\n\n case 'weekly': {\n // Run on specified days of week at specified time\n const sortedDays = [...weekDays].sort((a, b) => a - b);\n const daysStr = sortedDays.length > 0 ? formatNumberList(sortedDays) : '*';\n return `${m} ${h} * * ${daysStr}`;\n }\n\n case 'monthly': {\n // Run on specified days of month at specified time\n const sortedDays = [...monthDays].sort((a, b) => a - b);\n const daysStr = sortedDays.length > 0 ? formatNumberList(sortedDays) : '1';\n return `${m} ${h} ${daysStr} * *`;\n }\n\n case 'custom':\n // Return user-provided expression\n return customCron.trim() || '* * * * *';\n\n default:\n return '0 0 * * *';\n }\n}\n\n/**\n * Formats a list of numbers as ranges where possible\n * [1,2,3,5,7,8,9] -> \"1-3,5,7-9\"\n */\nfunction formatNumberList(nums: number[]): string {\n if (nums.length === 0) return '';\n if (nums.length === 1) return nums[0].toString();\n\n const sorted = [...nums].sort((a, b) => a - b);\n const ranges: string[] = [];\n let start = sorted[0];\n let end = sorted[0];\n\n for (let i = 1; i < sorted.length; i++) {\n if (sorted[i] === end + 1) {\n // Continue the range\n end = sorted[i];\n } else {\n // End current range, start new one\n ranges.push(start === end ? `${start}` : `${start}-${end}`);\n start = sorted[i];\n end = sorted[i];\n }\n }\n\n // Don't forget the last range\n ranges.push(start === end ? `${start}` : `${start}-${end}`);\n\n return ranges.join(',');\n}\n\n/**\n * Builds cron for a specific schedule type with defaults\n */\nexport function buildDefaultCron(type: CronSchedulerState['type']): string {\n const defaults: Record<typeof type, string> = {\n daily: '0 9 * * *', // Every day at 9:00\n weekly: '0 9 * * 1-5', // Weekdays at 9:00\n monthly: '0 9 1 * *', // 1st of month at 9:00\n custom: '* * * * *', // Every minute\n };\n return defaults[type];\n}\n","/**\n * Cron Parser\n *\n * Parses Unix 5-field cron expression into CronSchedulerState\n * Format: minute hour day-of-month month day-of-week\n */\n\nimport type { CronSchedulerState, ScheduleType, WeekDay, MonthDay } from '../types';\n\n/**\n * Parses Unix 5-field cron expression into state\n *\n * @param cron - Cron expression to parse\n * @returns Parsed state or null if invalid\n *\n * @example\n * parseCron('0 9 * * *')\n * // { type: 'daily', hour: 9, minute: 0, ... }\n *\n * parseCron('30 14 * * 1,3,5')\n * // { type: 'weekly', hour: 14, minute: 30, weekDays: [1, 3, 5], ... }\n */\nexport function parseCron(cron: string): CronSchedulerState | null {\n if (!cron || typeof cron !== 'string') return null;\n\n const parts = cron.trim().split(/\\s+/);\n\n // Unix cron has exactly 5 fields\n if (parts.length !== 5) return null;\n\n const [minutePart, hourPart, dayOfMonthPart, monthPart, dayOfWeekPart] = parts;\n\n // Parse minute (0-59 or *)\n const minute = parseField(minutePart, 0, 59);\n if (minute === null && minutePart !== '*') return null;\n\n // Parse hour (0-23 or *)\n const hour = parseField(hourPart, 0, 23);\n if (hour === null && hourPart !== '*') return null;\n\n // Determine schedule type based on field patterns\n const result = detectScheduleType(\n minutePart,\n hourPart,\n dayOfMonthPart,\n monthPart,\n dayOfWeekPart\n );\n\n return {\n type: result.type,\n hour: hour ?? 0,\n minute: minute ?? 0,\n weekDays: result.weekDays,\n monthDays: result.monthDays,\n customCron: cron,\n isValid: true,\n };\n}\n\n/**\n * Detects schedule type from cron fields\n */\nfunction detectScheduleType(\n _minutePart: string,\n _hourPart: string,\n dayOfMonthPart: string,\n monthPart: string,\n dayOfWeekPart: string\n): {\n type: ScheduleType;\n weekDays: WeekDay[];\n monthDays: MonthDay[];\n} {\n // Default values\n let type: ScheduleType = 'custom';\n let weekDays: WeekDay[] = [1, 2, 3, 4, 5]; // Mon-Fri\n let monthDays: MonthDay[] = [1];\n\n // Daily: M H * * *\n if (dayOfMonthPart === '*' && monthPart === '*' && dayOfWeekPart === '*') {\n type = 'daily';\n }\n // Weekly: M H * * 1,2,3 (or ranges like 1-5)\n else if (dayOfMonthPart === '*' && monthPart === '*' && dayOfWeekPart !== '*') {\n type = 'weekly';\n weekDays = parseWeekDays(dayOfWeekPart);\n }\n // Monthly: M H 1,15 * * (day-of-month specified)\n else if (dayOfMonthPart !== '*' && monthPart === '*' && dayOfWeekPart === '*') {\n type = 'monthly';\n monthDays = parseMonthDays(dayOfMonthPart);\n }\n // Everything else is custom\n\n return { type, weekDays, monthDays };\n}\n\n/**\n * Parses a single numeric field\n */\nfunction parseField(part: string, min: number, max: number): number | null {\n // Handle simple number\n if (/^\\d+$/.test(part)) {\n const num = parseInt(part, 10);\n if (num >= min && num <= max) return num;\n }\n return null;\n}\n\n/**\n * Parses week days from cron field\n * Supports: 1,2,3 or 1-5 or MON,WED,FRI\n */\nfunction parseWeekDays(part: string): WeekDay[] {\n const result: WeekDay[] = [];\n\n // Handle ranges like 1-5\n if (part.includes('-')) {\n const [start, end] = part.split('-').map(s => parseInt(s, 10));\n if (!isNaN(start) && !isNaN(end)) {\n for (let i = start; i <= end && i <= 6; i++) {\n if (i >= 0) result.push(i as WeekDay);\n }\n }\n return result.length > 0 ? result : [1, 2, 3, 4, 5];\n }\n\n // Handle comma-separated list\n for (const segment of part.split(',')) {\n const num = parseInt(segment.trim(), 10);\n if (!isNaN(num) && num >= 0 && num <= 6) {\n result.push(num as WeekDay);\n }\n }\n\n return result.length > 0 ? result : [1, 2, 3, 4, 5];\n}\n\n/**\n * Parses month days from cron field\n * Supports: 1,15 or 1-15\n */\nfunction parseMonthDays(part: string): MonthDay[] {\n const result: MonthDay[] = [];\n\n // Handle ranges like 1-15\n if (part.includes('-')) {\n const [start, end] = part.split('-').map(s => parseInt(s, 10));\n if (!isNaN(start) && !isNaN(end)) {\n for (let i = start; i <= end && i <= 31; i++) {\n if (i >= 1) result.push(i as MonthDay);\n }\n }\n return result.length > 0 ? result : [1];\n }\n\n // Handle comma-separated list\n for (const segment of part.split(',')) {\n const num = parseInt(segment.trim(), 10);\n if (!isNaN(num) && num >= 1 && num <= 31) {\n result.push(num as MonthDay);\n }\n }\n\n return result.length > 0 ? result : [1];\n}\n\n/**\n * Validates cron expression syntax\n */\nexport function isValidCron(cron: string): boolean {\n if (!cron || typeof cron !== 'string') return false;\n\n const parts = cron.trim().split(/\\s+/);\n if (parts.length !== 5) return false;\n\n // Basic validation for each field\n const patterns = [\n /^(\\*|\\d{1,2}|\\d{1,2}-\\d{1,2}|\\d{1,2}(,\\d{1,2})*|\\*\\/\\d{1,2})$/, // minute\n /^(\\*|\\d{1,2}|\\d{1,2}-\\d{1,2}|\\d{1,2}(,\\d{1,2})*|\\*\\/\\d{1,2})$/, // hour\n /^(\\*|\\d{1,2}|\\d{1,2}-\\d{1,2}|\\d{1,2}(,\\d{1,2})*|\\*\\/\\d{1,2})$/, // day of month\n /^(\\*|\\d{1,2}|\\d{1,2}-\\d{1,2}|\\d{1,2}(,\\d{1,2})*|\\*\\/\\d{1,2})$/, // month\n /^(\\*|\\d{1}|\\d{1}-\\d{1}|\\d{1}(,\\d{1})*|\\*\\/\\d{1,2})$/, // day of week\n ];\n\n return parts.every((part, i) => patterns[i].test(part));\n}\n","/**\n * Cron Humanize\n *\n * Converts cron expressions to human-readable descriptions\n */\n\nconst WEEKDAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst WEEKDAY_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\n/**\n * Converts cron expression to human-readable description\n *\n * Examples:\n * - humanizeCron('0 9 * * *') returns \"Every day at 09:00\"\n * - humanizeCron('30 14 * * 1,3,5') returns \"Mon, Wed, Fri at 14:30\"\n * - humanizeCron('0 0 1 * *') returns \"1st of every month at 00:00\"\n */\nexport function humanizeCron(cron: string): string {\n if (!cron || typeof cron !== 'string') return 'Invalid schedule';\n\n const parts = cron.trim().split(/\\s+/);\n if (parts.length !== 5) return 'Invalid schedule';\n\n const [minutePart, hourPart, dayOfMonthPart, monthPart, dayOfWeekPart] = parts;\n\n // Parse time\n const minute = parseInt(minutePart, 10);\n const hour = parseInt(hourPart, 10);\n const timeStr = formatTime(hour, minute);\n\n // Every minute\n if (minutePart === '*' && hourPart === '*' && dayOfMonthPart === '*' && monthPart === '*' && dayOfWeekPart === '*') {\n return 'Every minute';\n }\n\n // Every N minutes\n if (minutePart.startsWith('*/')) {\n const interval = parseInt(minutePart.slice(2), 10);\n if (hourPart === '*') {\n return `Every ${interval} minute${interval > 1 ? 's' : ''}`;\n }\n return `Every ${interval} minute${interval > 1 ? 's' : ''} at hour ${hour}`;\n }\n\n // Hourly\n if (!isNaN(minute) && hourPart === '*' && dayOfMonthPart === '*' && monthPart === '*' && dayOfWeekPart === '*') {\n return `Every hour at minute ${minute}`;\n }\n\n // Daily\n if (dayOfMonthPart === '*' && monthPart === '*' && dayOfWeekPart === '*') {\n return `Every day at ${timeStr}`;\n }\n\n // Weekly\n if (dayOfMonthPart === '*' && monthPart === '*' && dayOfWeekPart !== '*') {\n const days = parseWeekDays(dayOfWeekPart);\n\n if (days.length === 7) {\n return `Every day at ${timeStr}`;\n }\n\n if (days.length === 5 && isWeekdays(days)) {\n return `Weekdays at ${timeStr}`;\n }\n\n if (days.length === 2 && isWeekend(days)) {\n return `Weekends at ${timeStr}`;\n }\n\n const dayNames = days.map(d => WEEKDAY_SHORT[d]).join(', ');\n return `${dayNames} at ${timeStr}`;\n }\n\n // Monthly\n if (dayOfMonthPart !== '*' && monthPart === '*' && dayOfWeekPart === '*') {\n const days = parseMonthDays(dayOfMonthPart);\n\n if (days.length === 1) {\n return `${ordinal(days[0])} of every month at ${timeStr}`;\n }\n\n if (days.length <= 3) {\n const dayStr = days.map(d => ordinal(d)).join(', ');\n return `${dayStr} of every month at ${timeStr}`;\n }\n\n return `${days.length} days per month at ${timeStr}`;\n }\n\n // Complex expression - show as-is\n return `Custom schedule`;\n}\n\n/**\n * Formats time as HH:MM\n */\nfunction formatTime(hour: number, minute: number): string {\n const h = isNaN(hour) ? 0 : Math.max(0, Math.min(23, hour));\n const m = isNaN(minute) ? 0 : Math.max(0, Math.min(59, minute));\n return `${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}`;\n}\n\n/**\n * Formats time in 12-hour format with AM/PM\n */\nexport function formatTime12h(hour: number, minute: number): string {\n const h = isNaN(hour) ? 0 : Math.max(0, Math.min(23, hour));\n const m = isNaN(minute) ? 0 : Math.max(0, Math.min(59, minute));\n const period = h >= 12 ? 'PM' : 'AM';\n const h12 = h % 12 || 12;\n return `${h12}:${m.toString().padStart(2, '0')} ${period}`;\n}\n\n/**\n * Parses week days from cron field\n */\nfunction parseWeekDays(part: string): number[] {\n const result: number[] = [];\n\n // Handle ranges like 1-5\n if (part.includes('-') && !part.includes(',')) {\n const [start, end] = part.split('-').map(s => parseInt(s, 10));\n if (!isNaN(start) && !isNaN(end)) {\n for (let i = start; i <= end && i <= 6; i++) {\n if (i >= 0) result.push(i);\n }\n }\n return result;\n }\n\n // Handle comma-separated list\n for (const segment of part.split(',')) {\n // Handle nested ranges\n if (segment.includes('-')) {\n const [start, end] = segment.split('-').map(s => parseInt(s, 10));\n if (!isNaN(start) && !isNaN(end)) {\n for (let i = start; i <= end && i <= 6; i++) {\n if (i >= 0) result.push(i);\n }\n }\n } else {\n const num = parseInt(segment.trim(), 10);\n if (!isNaN(num) && num >= 0 && num <= 6) {\n result.push(num);\n }\n }\n }\n\n return result.sort((a, b) => a - b);\n}\n\n/**\n * Parses month days from cron field\n */\nfunction parseMonthDays(part: string): number[] {\n const result: number[] = [];\n\n // Handle ranges\n if (part.includes('-') && !part.includes(',')) {\n const [start, end] = part.split('-').map(s => parseInt(s, 10));\n if (!isNaN(start) && !isNaN(end)) {\n for (let i = start; i <= end && i <= 31; i++) {\n if (i >= 1) result.push(i);\n }\n }\n return result;\n }\n\n // Handle comma-separated list\n for (const segment of part.split(',')) {\n const num = parseInt(segment.trim(), 10);\n if (!isNaN(num) && num >= 1 && num <= 31) {\n result.push(num);\n }\n }\n\n return result.sort((a, b) => a - b);\n}\n\n/**\n * Checks if days array represents weekdays (Mon-Fri)\n */\nfunction isWeekdays(days: number[]): boolean {\n const sorted = [...days].sort((a, b) => a - b);\n return sorted.join(',') === '1,2,3,4,5';\n}\n\n/**\n * Checks if days array represents weekend (Sat-Sun)\n */\nfunction isWeekend(days: number[]): boolean {\n const sorted = [...days].sort((a, b) => a - b);\n return sorted.join(',') === '0,6';\n}\n\n/**\n * Returns ordinal suffix for a number (1st, 2nd, 3rd, etc.)\n */\nfunction ordinal(n: number): string {\n const s = ['th', 'st', 'nd', 'rd'];\n const v = n % 100;\n return n + (s[(v - 20) % 10] || s[v] || s[0]);\n}\n\n/**\n * Gets full weekday name\n */\nexport function getWeekdayName(day: number): string {\n return WEEKDAY_NAMES[day] || 'Unknown';\n}\n\n/**\n * Gets short weekday name\n */\nexport function getWeekdayShort(day: number): string {\n return WEEKDAY_SHORT[day] || '?';\n}\n","'use client';\n\n/**\n * CronScheduler Context\n *\n * Provides centralized state management for the CronScheduler component.\n * All child components subscribe to this context for state and actions.\n */\n\nimport {\n createContext,\n useContext,\n useMemo,\n useCallback,\n useState,\n useEffect,\n useRef,\n} from 'react';\nimport type {\n CronSchedulerContextValue,\n CronSchedulerState,\n CronSchedulerProviderProps,\n ScheduleType,\n WeekDay,\n MonthDay,\n} from '../types';\nimport { buildCron } from '../utils/cron-builder';\nimport { parseCron } from '../utils/cron-parser';\nimport { humanizeCron } from '../utils/cron-humanize';\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst CronSchedulerContext = createContext<CronSchedulerContextValue | null>(null);\n\n// ============================================================================\n// Default State\n// ============================================================================\n\nconst DEFAULT_STATE: CronSchedulerState = {\n type: 'daily',\n hour: 9,\n minute: 0,\n weekDays: [1, 2, 3, 4, 5] as WeekDay[], // Mon-Fri\n monthDays: [1] as MonthDay[],\n customCron: '* * * * *',\n isValid: true,\n};\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport function CronSchedulerProvider({\n children,\n value,\n onChange,\n defaultType = 'daily',\n}: CronSchedulerProviderProps) {\n // Track if this is initial mount to avoid calling onChange on mount\n const isInitialMount = useRef(true);\n\n // Store onChange in a ref to avoid triggering effects when it changes\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n // Initialize state from value prop or defaults\n const [state, setState] = useState<CronSchedulerState>(() => {\n if (value) {\n const parsed = parseCron(value);\n if (parsed) return parsed;\n }\n return { ...DEFAULT_STATE, type: defaultType };\n });\n\n // Sync with external value (controlled component support)\n useEffect(() => {\n if (value) {\n const parsed = parseCron(value);\n if (parsed) {\n const currentCron = buildCron(state);\n if (value !== currentCron) {\n setState(parsed);\n }\n }\n }\n }, [value]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Computed: cron expression\n const cronExpression = useMemo(() => buildCron(state), [state]);\n\n // Computed: human-readable description\n const humanDescription = useMemo(() => humanizeCron(cronExpression), [cronExpression]);\n\n // Notify parent on change (skip initial mount)\n // Use ref to avoid re-triggering when onChange identity changes\n useEffect(() => {\n if (isInitialMount.current) {\n isInitialMount.current = false;\n return;\n }\n onChangeRef.current?.(cronExpression);\n }, [cronExpression]);\n\n // ============================================================================\n // Actions\n // ============================================================================\n\n const setType = useCallback((type: ScheduleType) => {\n setState(s => ({ ...s, type }));\n }, []);\n\n const setTime = useCallback((hour: number, minute: number) => {\n setState(s => ({\n ...s,\n hour: Math.max(0, Math.min(23, hour)),\n minute: Math.max(0, Math.min(59, minute)),\n }));\n }, []);\n\n const toggleWeekDay = useCallback((day: WeekDay) => {\n setState(s => {\n const hasDay = s.weekDays.includes(day);\n // Prevent deselecting the last day\n if (hasDay && s.weekDays.length === 1) return s;\n\n const newDays = hasDay\n ? s.weekDays.filter(d => d !== day)\n : [...s.weekDays, day];\n\n return {\n ...s,\n weekDays: newDays.sort((a, b) => a - b) as WeekDay[],\n };\n });\n }, []);\n\n const setWeekDays = useCallback((days: WeekDay[]) => {\n setState(s => ({\n ...s,\n weekDays: days.length > 0\n ? [...days].sort((a, b) => a - b) as WeekDay[]\n : [1] as WeekDay[], // Default to Monday if empty\n }));\n }, []);\n\n const toggleMonthDay = useCallback((day: MonthDay) => {\n setState(s => {\n const hasDay = s.monthDays.includes(day);\n // Prevent deselecting the last day\n if (hasDay && s.monthDays.length === 1) return s;\n\n const newDays = hasDay\n ? s.monthDays.filter(d => d !== day)\n : [...s.monthDays, day];\n\n return {\n ...s,\n monthDays: newDays.sort((a, b) => a - b) as MonthDay[],\n };\n });\n }, []);\n\n const setMonthDays = useCallback((days: MonthDay[]) => {\n setState(s => ({\n ...s,\n monthDays: days.length > 0\n ? [...days].sort((a, b) => a - b) as MonthDay[]\n : [1] as MonthDay[], // Default to 1st if empty\n }));\n }, []);\n\n const setCustomCron = useCallback((customCron: string) => {\n const parsed = parseCron(customCron);\n setState(s => ({\n ...s,\n customCron,\n isValid: parsed !== null,\n }));\n }, []);\n\n const reset = useCallback(() => {\n setState({ ...DEFAULT_STATE, type: defaultType });\n }, [defaultType]);\n\n // ============================================================================\n // Context Value\n // ============================================================================\n\n const contextValue: CronSchedulerContextValue = useMemo(\n () => ({\n // State\n ...state,\n // Computed\n cronExpression,\n humanDescription,\n // Actions\n setType,\n setTime,\n toggleWeekDay,\n setWeekDays,\n toggleMonthDay,\n setMonthDays,\n setCustomCron,\n reset,\n }),\n [\n state,\n cronExpression,\n humanDescription,\n setType,\n setTime,\n toggleWeekDay,\n setWeekDays,\n toggleMonthDay,\n setMonthDays,\n setCustomCron,\n reset,\n ]\n );\n\n return (\n <CronSchedulerContext.Provider value={contextValue}>\n {children}\n </CronSchedulerContext.Provider>\n );\n}\n\n// ============================================================================\n// Context Hook\n// ============================================================================\n\nexport function useCronSchedulerContext(): CronSchedulerContextValue {\n const context = useContext(CronSchedulerContext);\n if (!context) {\n throw new Error(\n 'useCronSchedulerContext must be used within CronSchedulerProvider'\n );\n }\n return context;\n}\n","'use client';\n\n/**\n * CronScheduler Hooks\n *\n * Selective subscription hooks for optimal re-renders.\n * Each hook returns only the data it needs, preventing\n * unnecessary re-renders when unrelated state changes.\n */\n\nimport { useMemo } from 'react';\nimport { useCronSchedulerContext } from './CronSchedulerContext';\n\n/**\n * Hook for schedule type selection\n * Re-renders only when type changes\n */\nexport function useCronType() {\n const { type, setType } = useCronSchedulerContext();\n return useMemo(() => ({ type, setType }), [type, setType]);\n}\n\n/**\n * Hook for time selection\n * Re-renders only when hour/minute changes\n */\nexport function useCronTime() {\n const { hour, minute, setTime } = useCronSchedulerContext();\n return useMemo(() => ({ hour, minute, setTime }), [hour, minute, setTime]);\n}\n\n/**\n * Hook for week days selection\n * Re-renders only when weekDays changes\n */\nexport function useCronWeekDays() {\n const { weekDays, toggleWeekDay, setWeekDays } = useCronSchedulerContext();\n return useMemo(\n () => ({ weekDays, toggleWeekDay, setWeekDays }),\n [weekDays, toggleWeekDay, setWeekDays]\n );\n}\n\n/**\n * Hook for month days selection\n * Re-renders only when monthDays changes\n */\nexport function useCronMonthDays() {\n const { monthDays, toggleMonthDay, setMonthDays } = useCronSchedulerContext();\n return useMemo(\n () => ({ monthDays, toggleMonthDay, setMonthDays }),\n [monthDays, toggleMonthDay, setMonthDays]\n );\n}\n\n/**\n * Hook for custom cron input\n * Re-renders only when customCron/isValid changes\n */\nexport function useCronCustom() {\n const { customCron, isValid, setCustomCron } = useCronSchedulerContext();\n return useMemo(\n () => ({ customCron, isValid, setCustomCron }),\n [customCron, isValid, setCustomCron]\n );\n}\n\n/**\n * Hook for preview display\n * Re-renders only when computed values change\n */\nexport function useCronPreview() {\n const { cronExpression, humanDescription, isValid } = useCronSchedulerContext();\n return useMemo(\n () => ({ cronExpression, humanDescription, isValid }),\n [cronExpression, humanDescription, isValid]\n );\n}\n\n/**\n * Full context access\n * Use sparingly - causes re-render on any state change\n */\nexport function useCronScheduler() {\n return useCronSchedulerContext();\n}\n","'use client';\n\n/**\n * ScheduleTypeSelector\n *\n * Segmented control for selecting schedule type.\n * Uses Tabs from ui-core styled as a compact segmented control.\n */\n\nimport { Tabs, TabsList, TabsTrigger } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useCronType } from '../context/hooks';\nimport type { ScheduleType } from '../types';\n\nconst SCHEDULE_TYPES: { value: ScheduleType; label: string }[] = [\n { value: 'daily', label: 'Daily' },\n { value: 'weekly', label: 'Weekly' },\n { value: 'monthly', label: 'Monthly' },\n { value: 'custom', label: 'Custom' },\n];\n\nexport interface ScheduleTypeSelectorProps {\n disabled?: boolean;\n className?: string;\n}\n\nexport function ScheduleTypeSelector({\n disabled,\n className,\n}: ScheduleTypeSelectorProps) {\n const { type, setType } = useCronType();\n\n return (\n <Tabs\n value={type}\n onValueChange={(v) => setType(v as ScheduleType)}\n className={cn('w-full', className)}\n >\n <TabsList className=\"grid w-full grid-cols-4 h-9 p-0.5\">\n {SCHEDULE_TYPES.map(({ value, label }) => (\n <TabsTrigger\n key={value}\n value={value}\n disabled={disabled}\n className={cn(\n 'text-xs font-medium px-2 py-1.5',\n 'data-[state=active]:shadow-sm',\n 'transition-all duration-150'\n )}\n >\n {label}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n );\n}\n","'use client';\n\n/**\n * TimeSelector\n *\n * Clean time picker with hour and minute selects.\n */\n\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { Clock } from 'lucide-react';\nimport { useCronTime } from '../context/hooks';\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i);\nconst MINUTES = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];\n\nexport interface TimeSelectorProps {\n format?: '12h' | '24h';\n disabled?: boolean;\n className?: string;\n}\n\nexport function TimeSelector({\n format = '24h',\n disabled,\n className,\n}: TimeSelectorProps) {\n const { hour, minute, setTime } = useCronTime();\n\n const is24h = format === '24h';\n const displayHour = is24h ? hour : (hour % 12) || 12;\n const isPM = hour >= 12;\n\n const handleHourChange = (value: string) => {\n let newHour = parseInt(value, 10);\n if (!is24h) {\n if (isPM && newHour !== 12) newHour += 12;\n else if (!isPM && newHour === 12) newHour = 0;\n }\n setTime(newHour, minute);\n };\n\n const handleMinuteChange = (value: string) => {\n setTime(hour, parseInt(value, 10));\n };\n\n const handlePeriodChange = (value: string) => {\n const newIsPM = value === 'PM';\n let newHour = hour;\n if (newIsPM && hour < 12) newHour = hour + 12;\n else if (!newIsPM && hour >= 12) newHour = hour - 12;\n setTime(newHour, minute);\n };\n\n const hours = is24h ? HOURS : Array.from({ length: 12 }, (_, i) => i + 1);\n\n return (\n <div className={cn('flex items-center gap-3', className)}>\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <Clock className=\"h-4 w-4\" />\n <span className=\"text-sm\">Run at</span>\n </div>\n\n <div className=\"flex items-center gap-1.5 flex-1\">\n {/* Hour */}\n <Select\n value={displayHour.toString()}\n onValueChange={handleHourChange}\n disabled={disabled}\n >\n <SelectTrigger className=\"w-[70px] h-9\">\n <SelectValue>\n {displayHour.toString().padStart(2, '0')}\n </SelectValue>\n </SelectTrigger>\n <SelectContent className=\"max-h-48\">\n {hours.map((h) => (\n <SelectItem key={h} value={h.toString()}>\n {h.toString().padStart(2, '0')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n <span className=\"text-muted-foreground font-medium\">:</span>\n\n {/* Minute */}\n <Select\n value={minute.toString()}\n onValueChange={handleMinuteChange}\n disabled={disabled}\n >\n <SelectTrigger className=\"w-[70px] h-9\">\n <SelectValue>\n {minute.toString().padStart(2, '0')}\n </SelectValue>\n </SelectTrigger>\n <SelectContent className=\"max-h-48\">\n {MINUTES.map((m) => (\n <SelectItem key={m} value={m.toString()}>\n {m.toString().padStart(2, '0')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* AM/PM for 12h */}\n {!is24h && (\n <Select\n value={isPM ? 'PM' : 'AM'}\n onValueChange={handlePeriodChange}\n disabled={disabled}\n >\n <SelectTrigger className=\"w-[70px] h-9\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"AM\">AM</SelectItem>\n <SelectItem value=\"PM\">PM</SelectItem>\n </SelectContent>\n </Select>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\n/**\n * DayChips\n *\n * Full-width day of week selector with clear labels.\n * Shows abbreviated day names for clarity.\n */\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useCronWeekDays } from '../context/hooks';\nimport type { WeekDay } from '../types';\n\nconst DAYS: { value: WeekDay; label: string }[] = [\n { value: 1, label: 'Mon' },\n { value: 2, label: 'Tue' },\n { value: 3, label: 'Wed' },\n { value: 4, label: 'Thu' },\n { value: 5, label: 'Fri' },\n { value: 6, label: 'Sat' },\n { value: 0, label: 'Sun' },\n];\n\nexport interface DayChipsProps {\n disabled?: boolean;\n showPresets?: boolean;\n className?: string;\n}\n\nexport function DayChips({\n disabled,\n showPresets = true,\n className,\n}: DayChipsProps) {\n const { weekDays, toggleWeekDay, setWeekDays } = useCronWeekDays();\n\n const isWeekdays = weekDays.length === 5 && [1,2,3,4,5].every(d => weekDays.includes(d as WeekDay));\n const isWeekend = weekDays.length === 2 && [0,6].every(d => weekDays.includes(d as WeekDay));\n const isEveryday = weekDays.length === 7;\n\n return (\n <div className={cn('space-y-3', className)}>\n {/* Day Grid - full width */}\n <div className=\"grid grid-cols-7 gap-1\">\n {DAYS.map(({ value, label }) => {\n const isSelected = weekDays.includes(value);\n const isWeekend = value === 0 || value === 6;\n\n return (\n <button\n key={value}\n type=\"button\"\n disabled={disabled}\n onClick={() => toggleWeekDay(value)}\n aria-pressed={isSelected}\n className={cn(\n 'flex flex-col items-center justify-center',\n 'py-2.5 rounded-lg text-xs font-medium',\n 'transition-all duration-150',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n 'active:scale-[0.97]',\n isSelected\n ? 'bg-primary text-primary-foreground shadow-sm'\n : cn(\n 'bg-muted/50 hover:bg-muted',\n isWeekend ? 'text-muted-foreground/70' : 'text-muted-foreground'\n ),\n disabled && 'opacity-50 cursor-not-allowed pointer-events-none'\n )}\n >\n <span>{label}</span>\n </button>\n );\n })}\n </div>\n\n {/* Quick Presets */}\n {showPresets && (\n <div className=\"flex gap-2\">\n <PresetButton\n label=\"Weekdays\"\n isActive={isWeekdays}\n onClick={() => setWeekDays([1, 2, 3, 4, 5] as WeekDay[])}\n disabled={disabled}\n />\n <PresetButton\n label=\"Weekends\"\n isActive={isWeekend}\n onClick={() => setWeekDays([0, 6] as WeekDay[])}\n disabled={disabled}\n />\n <PresetButton\n label=\"Every day\"\n isActive={isEveryday}\n onClick={() => setWeekDays([0, 1, 2, 3, 4, 5, 6] as WeekDay[])}\n disabled={disabled}\n />\n </div>\n )}\n </div>\n );\n}\n\ninterface PresetButtonProps {\n label: string;\n isActive: boolean;\n onClick: () => void;\n disabled?: boolean;\n}\n\nfunction PresetButton({ label, isActive, onClick, disabled }: PresetButtonProps) {\n return (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n className={cn(\n 'flex-1 px-3 py-1.5 rounded-md text-xs font-medium',\n 'transition-colors duration-150',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n isActive\n ? 'bg-primary/15 text-primary border border-primary/30'\n : 'bg-muted/30 text-muted-foreground hover:bg-muted/50 border border-transparent',\n disabled && 'opacity-50 cursor-not-allowed'\n )}\n >\n {label}\n </button>\n );\n}\n","'use client';\n\n/**\n * MonthDayGrid\n *\n * Full-width calendar-style grid for selecting days of the month.\n * Clean, intuitive design like a mini calendar.\n */\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useCronMonthDays } from '../context/hooks';\nimport type { MonthDay } from '../types';\n\n// Generate days 1-31\nconst DAYS: MonthDay[] = Array.from({ length: 31 }, (_, i) => (i + 1) as MonthDay);\n\n// Fill to complete last row (31 days = 4 full rows + 3 days, need 4 more to fill)\nconst GRID_SIZE = 35; // 5 rows x 7 columns\n\nexport interface MonthDayGridProps {\n disabled?: boolean;\n showPresets?: boolean;\n className?: string;\n}\n\nexport function MonthDayGrid({\n disabled,\n showPresets = true,\n className,\n}: MonthDayGridProps) {\n const { monthDays, toggleMonthDay, setMonthDays } = useCronMonthDays();\n\n const is1st = monthDays.length === 1 && monthDays[0] === 1;\n const is15th = monthDays.length === 1 && monthDays[0] === 15;\n const is1stAnd15th = monthDays.length === 2 && monthDays.includes(1) && monthDays.includes(15);\n\n return (\n <div className={cn('space-y-3', className)}>\n {/* Quick Presets */}\n {showPresets && (\n <div className=\"flex gap-2\">\n <PresetButton\n label=\"1st\"\n isActive={is1st}\n onClick={() => setMonthDays([1] as MonthDay[])}\n disabled={disabled}\n />\n <PresetButton\n label=\"15th\"\n isActive={is15th}\n onClick={() => setMonthDays([15] as MonthDay[])}\n disabled={disabled}\n />\n <PresetButton\n label=\"1st & 15th\"\n isActive={is1stAnd15th}\n onClick={() => setMonthDays([1, 15] as MonthDay[])}\n disabled={disabled}\n />\n </div>\n )}\n\n {/* Calendar Grid - full width */}\n <div className=\"grid grid-cols-7 gap-1\">\n {Array.from({ length: GRID_SIZE }, (_, i) => {\n const day = i + 1;\n const isValidDay = day <= 31;\n const isSelected = isValidDay && monthDays.includes(day as MonthDay);\n // Days that don't exist in some months\n const isPartialMonth = day > 28;\n\n if (!isValidDay) {\n return <div key={i} className=\"aspect-square\" />;\n }\n\n return (\n <button\n key={day}\n type=\"button\"\n disabled={disabled}\n onClick={() => toggleMonthDay(day as MonthDay)}\n aria-pressed={isSelected}\n aria-label={`Day ${day}`}\n className={cn(\n 'aspect-square flex items-center justify-center',\n 'rounded-lg text-sm font-medium',\n 'transition-all duration-150',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n 'active:scale-[0.95]',\n isSelected\n ? 'bg-primary text-primary-foreground shadow-sm'\n : cn(\n 'bg-muted/30 hover:bg-muted/60',\n isPartialMonth\n ? 'text-muted-foreground/50'\n : 'text-muted-foreground'\n ),\n disabled && 'opacity-50 cursor-not-allowed pointer-events-none'\n )}\n >\n {day}\n </button>\n );\n })}\n </div>\n\n {/* Selection hint */}\n {monthDays.length > 1 && (\n <p className=\"text-xs text-muted-foreground text-center\">\n {monthDays.length} days selected\n </p>\n )}\n </div>\n );\n}\n\ninterface PresetButtonProps {\n label: string;\n isActive: boolean;\n onClick: () => void;\n disabled?: boolean;\n}\n\nfunction PresetButton({ label, isActive, onClick, disabled }: PresetButtonProps) {\n return (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n className={cn(\n 'flex-1 px-3 py-1.5 rounded-md text-xs font-medium',\n 'transition-colors duration-150',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n isActive\n ? 'bg-primary/15 text-primary border border-primary/30'\n : 'bg-muted/30 text-muted-foreground hover:bg-muted/50 border border-transparent',\n disabled && 'opacity-50 cursor-not-allowed'\n )}\n >\n {label}\n </button>\n );\n}\n","'use client';\n\n/**\n * CustomInput\n *\n * Raw cron expression input with validation and help popover.\n */\n\nimport { useState, useEffect } from 'react';\nimport { Input } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { AlertCircle, CheckCircle2 } from 'lucide-react';\nimport { useCronCustom } from '../context/hooks';\nimport { isValidCron } from '../utils/cron-parser';\n\nexport interface CustomInputProps {\n disabled?: boolean;\n className?: string;\n}\n\nexport function CustomInput({ disabled, className }: CustomInputProps) {\n const { customCron, isValid, setCustomCron } = useCronCustom();\n const [localValue, setLocalValue] = useState(customCron);\n const [localValid, setLocalValid] = useState(isValid);\n\n useEffect(() => {\n setLocalValue(customCron);\n setLocalValid(isValid);\n }, [customCron, isValid]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setLocalValue(value);\n const valid = isValidCron(value);\n setLocalValid(valid);\n setCustomCron(value);\n };\n\n return (\n <div className={cn('space-y-2', className)}>\n <span className=\"text-sm text-muted-foreground\">Cron expression</span>\n\n <div className=\"relative\">\n <Input\n type=\"text\"\n value={localValue}\n onChange={handleChange}\n disabled={disabled}\n placeholder=\"* * * * *\"\n className={cn(\n 'font-mono text-base pr-10 h-11',\n !localValid && localValue.trim() && 'border-destructive focus-visible:ring-destructive/50'\n )}\n />\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2\">\n {localValue.trim() && (\n localValid ? (\n <CheckCircle2 className=\"h-5 w-5 text-green-500\" />\n ) : (\n <AlertCircle className=\"h-5 w-5 text-destructive\" />\n )\n )}\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\n/**\n * CronCheatsheet\n *\n * Popover with cron syntax reference.\n */\n\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { HelpCircle } from 'lucide-react';\n\nexport interface CronCheatsheetProps {\n className?: string;\n}\n\nexport function CronCheatsheet({ className }: CronCheatsheetProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'p-1 rounded hover:bg-muted/50 transition-colors',\n className\n )}\n aria-label=\"Cron syntax help\"\n >\n <HelpCircle className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-72 p-3\" align=\"end\">\n <div className=\"space-y-3\">\n <p className=\"font-medium text-sm\">Cron Format</p>\n <code className=\"block text-xs bg-muted px-2 py-1.5 rounded font-mono text-center\">\n min hour day month weekday\n </code>\n\n <div className=\"grid grid-cols-2 gap-x-4 gap-y-1 text-xs\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">minute</span>\n <span>0-59</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">hour</span>\n <span>0-23</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">day</span>\n <span>1-31</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">month</span>\n <span>1-12</span>\n </div>\n <div className=\"flex justify-between col-span-2\">\n <span className=\"text-muted-foreground\">weekday</span>\n <span>0-6 (Sun-Sat)</span>\n </div>\n </div>\n\n <div className=\"pt-2 border-t border-border space-y-1.5\">\n <p className=\"text-xs font-medium\">Special characters</p>\n <div className=\"grid grid-cols-2 gap-1.5 text-xs\">\n <span><code className=\"bg-muted px-1 rounded\">*</code> any value</span>\n <span><code className=\"bg-muted px-1 rounded\">,</code> list (1,3,5)</span>\n <span><code className=\"bg-muted px-1 rounded\">-</code> range (1-5)</span>\n <span><code className=\"bg-muted px-1 rounded\">/</code> step (*/15)</span>\n </div>\n </div>\n\n <div className=\"pt-2 border-t border-border space-y-1.5\">\n <p className=\"text-xs font-medium\">Examples</p>\n <div className=\"space-y-1 text-xs\">\n <div className=\"flex justify-between font-mono\">\n <span className=\"text-muted-foreground\">0 9 * * *</span>\n <span>daily at 9am</span>\n </div>\n <div className=\"flex justify-between font-mono\">\n <span className=\"text-muted-foreground\">0 9 * * 1-5</span>\n <span>weekdays 9am</span>\n </div>\n <div className=\"flex justify-between font-mono\">\n <span className=\"text-muted-foreground\">*/15 * * * *</span>\n <span>every 15 min</span>\n </div>\n <div className=\"flex justify-between font-mono\">\n <span className=\"text-muted-foreground\">0 0 1 * *</span>\n <span>1st of month</span>\n </div>\n </div>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","'use client';\n\n/**\n * SchedulePreview\n *\n * Human-readable preview with cron expression and cheatsheet.\n */\n\nimport { useState, useCallback } from 'react';\nimport { Calendar, Copy, Check } from 'lucide-react';\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { useCronPreview } from '../context/hooks';\nimport { CronCheatsheet } from './CronCheatsheet';\n\nexport interface SchedulePreviewProps {\n /** Show raw cron expression (default: true) */\n showCronExpression?: boolean;\n /** Enable copy to clipboard */\n allowCopy?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport function SchedulePreview({\n showCronExpression = true,\n allowCopy = false,\n className,\n}: SchedulePreviewProps) {\n const { cronExpression, humanDescription, isValid } = useCronPreview();\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(cronExpression);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n }, [cronExpression]);\n\n return (\n <div\n className={cn(\n 'px-3 py-2.5 rounded-lg border',\n 'bg-muted/30 border-border/50',\n !isValid && 'border-destructive/30 bg-destructive/5',\n className\n )}\n >\n {/* Human description */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <Calendar\n className={cn(\n 'h-4 w-4 shrink-0',\n isValid ? 'text-primary' : 'text-destructive'\n )}\n />\n <span\n className={cn(\n 'text-sm',\n isValid ? 'text-foreground' : 'text-destructive'\n )}\n >\n {humanDescription}\n </span>\n </div>\n\n {/* Copy Button */}\n {allowCopy && (\n <button\n type=\"button\"\n onClick={handleCopy}\n disabled={!isValid}\n className={cn(\n 'p-1 rounded transition-colors duration-150',\n 'hover:bg-muted focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n 'disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n title={copied ? 'Copied!' : 'Copy cron expression'}\n >\n {copied ? (\n <Check className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <Copy className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n </button>\n )}\n </div>\n\n {/* Cron expression with cheatsheet */}\n {showCronExpression && (\n <div className=\"mt-1.5 pt-1.5 border-t border-border/30 flex items-center justify-between\">\n <code className=\"text-xs font-mono text-muted-foreground\">\n {cronExpression}\n </code>\n <CronCheatsheet />\n </div>\n )}\n </div>\n );\n}\n"]}
|