@djangocfg/ui-tools 2.1.134 → 2.1.136
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-X74RLZLW.cjs → CronScheduler.client-3JXCOKFY.cjs} +11 -11
- package/dist/{CronScheduler.client-X74RLZLW.cjs.map → CronScheduler.client-3JXCOKFY.cjs.map} +1 -1
- package/dist/{CronScheduler.client-BYKMIOZJ.mjs → CronScheduler.client-MCNY3POV.mjs} +3 -3
- package/dist/{CronScheduler.client-BYKMIOZJ.mjs.map → CronScheduler.client-MCNY3POV.mjs.map} +1 -1
- package/dist/{chunk-D3TZQSX6.cjs → chunk-AL7PTAS5.cjs} +98 -51
- package/dist/chunk-AL7PTAS5.cjs.map +1 -0
- package/dist/{chunk-HVRP57NM.mjs → chunk-QIAP4G5L.mjs} +100 -53
- package/dist/chunk-QIAP4G5L.mjs.map +1 -0
- package/dist/index.cjs +22 -22
- package/dist/index.d.cts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.mjs +3 -3
- package/package.json +6 -6
- package/src/tools/CronScheduler/components/DayChips.tsx +7 -4
- package/src/tools/CronScheduler/components/MonthDayGrid.tsx +8 -5
- package/src/tools/CronScheduler/components/SchedulePreview.tsx +26 -6
- package/src/tools/CronScheduler/context/CronSchedulerContext.tsx +22 -9
- package/src/tools/CronScheduler/context/hooks.ts +3 -3
- package/src/tools/CronScheduler/types/index.ts +2 -0
- package/src/tools/CronScheduler/utils/cron-builder.ts +15 -6
- package/src/tools/CronScheduler/utils/cron-parser.ts +70 -21
- package/dist/chunk-D3TZQSX6.cjs.map +0 -1
- package/dist/chunk-HVRP57NM.mjs.map +0 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var chunkAL7PTAS5_cjs = require('./chunk-AL7PTAS5.cjs');
|
|
6
6
|
var chunkWGEGR3DF_cjs = require('./chunk-WGEGR3DF.cjs');
|
|
7
7
|
var lib = require('@djangocfg/ui-core/lib');
|
|
8
8
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -15,15 +15,15 @@ function CronSchedulerInner({
|
|
|
15
15
|
disabled,
|
|
16
16
|
className
|
|
17
17
|
}) {
|
|
18
|
-
const { type } =
|
|
18
|
+
const { type } = chunkAL7PTAS5_cjs.useCronType();
|
|
19
19
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: lib.cn("space-y-3", className), children: [
|
|
20
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
21
|
-
type !== "custom" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
22
|
-
type === "weekly" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
23
|
-
type === "monthly" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
24
|
-
type === "custom" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
20
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkAL7PTAS5_cjs.ScheduleTypeSelector, { disabled }),
|
|
21
|
+
type !== "custom" && /* @__PURE__ */ jsxRuntime.jsx(chunkAL7PTAS5_cjs.TimeSelector, { format: timeFormat, disabled }),
|
|
22
|
+
type === "weekly" && /* @__PURE__ */ jsxRuntime.jsx(chunkAL7PTAS5_cjs.DayChips, { disabled, showPresets: true }),
|
|
23
|
+
type === "monthly" && /* @__PURE__ */ jsxRuntime.jsx(chunkAL7PTAS5_cjs.MonthDayGrid, { disabled, showPresets: true }),
|
|
24
|
+
type === "custom" && /* @__PURE__ */ jsxRuntime.jsx(chunkAL7PTAS5_cjs.CustomInput, { disabled }),
|
|
25
25
|
showPreview && /* @__PURE__ */ jsxRuntime.jsx(
|
|
26
|
-
|
|
26
|
+
chunkAL7PTAS5_cjs.SchedulePreview,
|
|
27
27
|
{
|
|
28
28
|
showCronExpression: true,
|
|
29
29
|
allowCopy
|
|
@@ -44,7 +44,7 @@ function CronScheduler({
|
|
|
44
44
|
className
|
|
45
45
|
}) {
|
|
46
46
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
47
|
-
|
|
47
|
+
chunkAL7PTAS5_cjs.CronSchedulerProvider,
|
|
48
48
|
{
|
|
49
49
|
value,
|
|
50
50
|
onChange,
|
|
@@ -68,5 +68,5 @@ var CronScheduler_client_default = CronScheduler;
|
|
|
68
68
|
|
|
69
69
|
exports.CronScheduler = CronScheduler;
|
|
70
70
|
exports.default = CronScheduler_client_default;
|
|
71
|
-
//# sourceMappingURL=CronScheduler.client-
|
|
72
|
-
//# sourceMappingURL=CronScheduler.client-
|
|
71
|
+
//# sourceMappingURL=CronScheduler.client-3JXCOKFY.cjs.map
|
|
72
|
+
//# sourceMappingURL=CronScheduler.client-3JXCOKFY.cjs.map
|
package/dist/{CronScheduler.client-X74RLZLW.cjs.map → CronScheduler.client-3JXCOKFY.cjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/CronScheduler/CronScheduler.client.tsx"],"names":["useCronType","cn","jsx","ScheduleTypeSelector","TimeSelector","DayChips","MonthDayGrid","CustomInput","SchedulePreview","__name","CronSchedulerProvider"],"mappings":";;;;;;;;;AAmCA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,EAAE,IAAA,EAAK,GAAIA,6BAAA,EAAY;AAE7B,EAAA,uCACG,KAAA,EAAA,EAAI,SAAA,EAAWC,MAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EAEvC,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,0CAAqB,QAAA,EAAoB,CAAA;AAAA,IAGzC,SAAS,QAAA,oBACRD,cAAA,CAACE,8BAAA,EAAA,EAAa,MAAA,EAAQ,YAAY,QAAA,EAAoB,CAAA;AAAA,IAIvD,SAAS,QAAA,oBACRF,cAAA,CAACG,0BAAA,EAAA,EAAS,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI3C,SAAS,SAAA,oBACRH,cAAA,CAACI,8BAAA,EAAA,EAAa,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI/C,IAAA,KAAS,QAAA,oBACRJ,cAAA,CAACK,6BAAA,EAAA,EAAY,QAAA,EAAoB,CAAA;AAAA,IAIlC,WAAA,oBACCL,cAAA;AAAA,MAACM,iCAAA;AAAA,MAAA;AAAA,QACC,kBAAA,EAAkB,IAAA;AAAA,QAClB;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ;AA5CSC,wBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AA2EF,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,WAAA,GAAc,IAAA;AAAA,EACd,kBAAA,GAAqB,KAAA;AAAA,EACrB,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAuB;AACrB,EAAA,uBACEP,cAAA;AAAA,IAACQ,uCAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MAEA,QAAA,kBAAAR,cAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,WAAA;AAAA,UACA,kBAAA;AAAA,UACA,SAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AA3BgBO,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AA6BhB,IAAO,4BAAA,GAAQ","file":"CronScheduler.client-
|
|
1
|
+
{"version":3,"sources":["../src/tools/CronScheduler/CronScheduler.client.tsx"],"names":["useCronType","cn","jsx","ScheduleTypeSelector","TimeSelector","DayChips","MonthDayGrid","CustomInput","SchedulePreview","__name","CronSchedulerProvider"],"mappings":";;;;;;;;;AAmCA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,EAAE,IAAA,EAAK,GAAIA,6BAAA,EAAY;AAE7B,EAAA,uCACG,KAAA,EAAA,EAAI,SAAA,EAAWC,MAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EAEvC,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,0CAAqB,QAAA,EAAoB,CAAA;AAAA,IAGzC,SAAS,QAAA,oBACRD,cAAA,CAACE,8BAAA,EAAA,EAAa,MAAA,EAAQ,YAAY,QAAA,EAAoB,CAAA;AAAA,IAIvD,SAAS,QAAA,oBACRF,cAAA,CAACG,0BAAA,EAAA,EAAS,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI3C,SAAS,SAAA,oBACRH,cAAA,CAACI,8BAAA,EAAA,EAAa,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI/C,IAAA,KAAS,QAAA,oBACRJ,cAAA,CAACK,6BAAA,EAAA,EAAY,QAAA,EAAoB,CAAA;AAAA,IAIlC,WAAA,oBACCL,cAAA;AAAA,MAACM,iCAAA;AAAA,MAAA;AAAA,QACC,kBAAA,EAAkB,IAAA;AAAA,QAClB;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ;AA5CSC,wBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AA2EF,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,WAAA,GAAc,IAAA;AAAA,EACd,kBAAA,GAAqB,KAAA;AAAA,EACrB,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAuB;AACrB,EAAA,uBACEP,cAAA;AAAA,IAACQ,uCAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MAEA,QAAA,kBAAAR,cAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,WAAA;AAAA,UACA,kBAAA;AAAA,UACA,SAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AA3BgBO,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AA6BhB,IAAO,4BAAA,GAAQ","file":"CronScheduler.client-3JXCOKFY.cjs","sourcesContent":["'use client';\n\n/**\n * CronScheduler Client Component\n *\n * Compact cron expression builder following Apple HIG principles.\n * Uses context-based architecture for state management.\n */\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { CronSchedulerProvider } from './context/CronSchedulerContext';\nimport { useCronType } from './context/hooks';\nimport {\n ScheduleTypeSelector,\n TimeSelector,\n DayChips,\n MonthDayGrid,\n CustomInput,\n SchedulePreview,\n} from './components';\nimport type { CronSchedulerProps } from './types';\n\n// ============================================================================\n// Inner Component (uses context)\n// ============================================================================\n\ninterface CronSchedulerInnerProps {\n showPreview: boolean;\n showCronExpression: boolean;\n allowCopy: boolean;\n timeFormat: '12h' | '24h';\n disabled: boolean;\n className?: string;\n}\n\nfunction CronSchedulerInner({\n showPreview,\n showCronExpression,\n allowCopy,\n timeFormat,\n disabled,\n className,\n}: CronSchedulerInnerProps) {\n const { type } = useCronType();\n\n return (\n <div className={cn('space-y-3', className)}>\n {/* Schedule Type Selector */}\n <ScheduleTypeSelector disabled={disabled} />\n\n {/* Time Selector (shown for daily, weekly, monthly) */}\n {type !== 'custom' && (\n <TimeSelector format={timeFormat} disabled={disabled} />\n )}\n\n {/* Day Chips (weekly only) */}\n {type === 'weekly' && (\n <DayChips disabled={disabled} showPresets />\n )}\n\n {/* Month Day Grid (monthly only) */}\n {type === 'monthly' && (\n <MonthDayGrid disabled={disabled} showPresets />\n )}\n\n {/* Custom Input (custom only) */}\n {type === 'custom' && (\n <CustomInput disabled={disabled} />\n )}\n\n {/* Preview - always show cron expression */}\n {showPreview && (\n <SchedulePreview\n showCronExpression\n allowCopy={allowCopy}\n />\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Main Component (with Provider)\n// ============================================================================\n\n/**\n * CronScheduler - Compact cron expression builder\n *\n * A user-friendly interface for creating cron schedules without\n * needing to know cron syntax. Follows Apple HIG design principles.\n *\n * @example\n * // Basic usage\n * <CronScheduler\n * value={cronExpression}\n * onChange={setCronExpression}\n * />\n *\n * @example\n * // With all options\n * <CronScheduler\n * value=\"0 9 * * 1-5\"\n * onChange={handleChange}\n * defaultType=\"weekly\"\n * showPreview\n * showCronExpression\n * allowCopy\n * timeFormat=\"24h\"\n * />\n */\nexport function CronScheduler({\n value,\n onChange,\n defaultType = 'daily',\n showPreview = true,\n showCronExpression = false,\n allowCopy = false,\n timeFormat = '24h',\n disabled = false,\n className,\n}: CronSchedulerProps) {\n return (\n <CronSchedulerProvider\n value={value}\n onChange={onChange}\n defaultType={defaultType}\n >\n <CronSchedulerInner\n showPreview={showPreview}\n showCronExpression={showCronExpression}\n allowCopy={allowCopy}\n timeFormat={timeFormat}\n disabled={disabled}\n className={className}\n />\n </CronSchedulerProvider>\n );\n}\n\nexport default CronScheduler;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useCronType, ScheduleTypeSelector, TimeSelector, DayChips, MonthDayGrid, CustomInput, SchedulePreview, CronSchedulerProvider } from './chunk-
|
|
1
|
+
import { useCronType, ScheduleTypeSelector, TimeSelector, DayChips, MonthDayGrid, CustomInput, SchedulePreview, CronSchedulerProvider } from './chunk-QIAP4G5L.mjs';
|
|
2
2
|
import { __name } from './chunk-CGILA3WO.mjs';
|
|
3
3
|
import { cn } from '@djangocfg/ui-core/lib';
|
|
4
4
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -63,5 +63,5 @@ __name(CronScheduler, "CronScheduler");
|
|
|
63
63
|
var CronScheduler_client_default = CronScheduler;
|
|
64
64
|
|
|
65
65
|
export { CronScheduler, CronScheduler_client_default as default };
|
|
66
|
-
//# sourceMappingURL=CronScheduler.client-
|
|
67
|
-
//# sourceMappingURL=CronScheduler.client-
|
|
66
|
+
//# sourceMappingURL=CronScheduler.client-MCNY3POV.mjs.map
|
|
67
|
+
//# sourceMappingURL=CronScheduler.client-MCNY3POV.mjs.map
|
package/dist/{CronScheduler.client-BYKMIOZJ.mjs.map → CronScheduler.client-MCNY3POV.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/CronScheduler/CronScheduler.client.tsx"],"names":[],"mappings":";;;;;AAmCA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,WAAA,EAAY;AAE7B,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EAEvC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,wBAAqB,QAAA,EAAoB,CAAA;AAAA,IAGzC,SAAS,QAAA,oBACR,GAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAQ,YAAY,QAAA,EAAoB,CAAA;AAAA,IAIvD,SAAS,QAAA,oBACR,GAAA,CAAC,QAAA,EAAA,EAAS,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI3C,SAAS,SAAA,oBACR,GAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI/C,IAAA,KAAS,QAAA,oBACR,GAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAoB,CAAA;AAAA,IAIlC,WAAA,oBACC,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,kBAAA,EAAkB,IAAA;AAAA,QAClB;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ;AA5CS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AA2EF,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,WAAA,GAAc,IAAA;AAAA,EACd,kBAAA,GAAqB,KAAA;AAAA,EACrB,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAuB;AACrB,EAAA,uBACE,GAAA;AAAA,IAAC,qBAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MAEA,QAAA,kBAAA,GAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,WAAA;AAAA,UACA,kBAAA;AAAA,UACA,SAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AA3BgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AA6BhB,IAAO,4BAAA,GAAQ","file":"CronScheduler.client-
|
|
1
|
+
{"version":3,"sources":["../src/tools/CronScheduler/CronScheduler.client.tsx"],"names":[],"mappings":";;;;;AAmCA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,WAAA,EAAY;AAE7B,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EAEvC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,wBAAqB,QAAA,EAAoB,CAAA;AAAA,IAGzC,SAAS,QAAA,oBACR,GAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAQ,YAAY,QAAA,EAAoB,CAAA;AAAA,IAIvD,SAAS,QAAA,oBACR,GAAA,CAAC,QAAA,EAAA,EAAS,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI3C,SAAS,SAAA,oBACR,GAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAoB,aAAW,IAAA,EAAC,CAAA;AAAA,IAI/C,IAAA,KAAS,QAAA,oBACR,GAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAoB,CAAA;AAAA,IAIlC,WAAA,oBACC,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,kBAAA,EAAkB,IAAA;AAAA,QAClB;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ;AA5CS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AA2EF,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,WAAA,GAAc,IAAA;AAAA,EACd,kBAAA,GAAqB,KAAA;AAAA,EACrB,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAuB;AACrB,EAAA,uBACE,GAAA;AAAA,IAAC,qBAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MAEA,QAAA,kBAAA,GAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,WAAA;AAAA,UACA,kBAAA;AAAA,UACA,SAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AA3BgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AA6BhB,IAAO,4BAAA,GAAQ","file":"CronScheduler.client-MCNY3POV.mjs","sourcesContent":["'use client';\n\n/**\n * CronScheduler Client Component\n *\n * Compact cron expression builder following Apple HIG principles.\n * Uses context-based architecture for state management.\n */\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { CronSchedulerProvider } from './context/CronSchedulerContext';\nimport { useCronType } from './context/hooks';\nimport {\n ScheduleTypeSelector,\n TimeSelector,\n DayChips,\n MonthDayGrid,\n CustomInput,\n SchedulePreview,\n} from './components';\nimport type { CronSchedulerProps } from './types';\n\n// ============================================================================\n// Inner Component (uses context)\n// ============================================================================\n\ninterface CronSchedulerInnerProps {\n showPreview: boolean;\n showCronExpression: boolean;\n allowCopy: boolean;\n timeFormat: '12h' | '24h';\n disabled: boolean;\n className?: string;\n}\n\nfunction CronSchedulerInner({\n showPreview,\n showCronExpression,\n allowCopy,\n timeFormat,\n disabled,\n className,\n}: CronSchedulerInnerProps) {\n const { type } = useCronType();\n\n return (\n <div className={cn('space-y-3', className)}>\n {/* Schedule Type Selector */}\n <ScheduleTypeSelector disabled={disabled} />\n\n {/* Time Selector (shown for daily, weekly, monthly) */}\n {type !== 'custom' && (\n <TimeSelector format={timeFormat} disabled={disabled} />\n )}\n\n {/* Day Chips (weekly only) */}\n {type === 'weekly' && (\n <DayChips disabled={disabled} showPresets />\n )}\n\n {/* Month Day Grid (monthly only) */}\n {type === 'monthly' && (\n <MonthDayGrid disabled={disabled} showPresets />\n )}\n\n {/* Custom Input (custom only) */}\n {type === 'custom' && (\n <CustomInput disabled={disabled} />\n )}\n\n {/* Preview - always show cron expression */}\n {showPreview && (\n <SchedulePreview\n showCronExpression\n allowCopy={allowCopy}\n />\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Main Component (with Provider)\n// ============================================================================\n\n/**\n * CronScheduler - Compact cron expression builder\n *\n * A user-friendly interface for creating cron schedules without\n * needing to know cron syntax. Follows Apple HIG design principles.\n *\n * @example\n * // Basic usage\n * <CronScheduler\n * value={cronExpression}\n * onChange={setCronExpression}\n * />\n *\n * @example\n * // With all options\n * <CronScheduler\n * value=\"0 9 * * 1-5\"\n * onChange={handleChange}\n * defaultType=\"weekly\"\n * showPreview\n * showCronExpression\n * allowCopy\n * timeFormat=\"24h\"\n * />\n */\nexport function CronScheduler({\n value,\n onChange,\n defaultType = 'daily',\n showPreview = true,\n showCronExpression = false,\n allowCopy = false,\n timeFormat = '24h',\n disabled = false,\n className,\n}: CronSchedulerProps) {\n return (\n <CronSchedulerProvider\n value={value}\n onChange={onChange}\n defaultType={defaultType}\n >\n <CronSchedulerInner\n showPreview={showPreview}\n showCronExpression={showCronExpression}\n allowCopy={allowCopy}\n timeFormat={timeFormat}\n disabled={disabled}\n className={className}\n />\n </CronSchedulerProvider>\n );\n}\n\nexport default CronScheduler;\n"]}
|
|
@@ -9,24 +9,29 @@ var lucideReact = require('lucide-react');
|
|
|
9
9
|
|
|
10
10
|
// src/tools/CronScheduler/utils/cron-builder.ts
|
|
11
11
|
function buildCron(state) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
if (!state || typeof state !== "object") {
|
|
13
|
+
return "0 0 * * *";
|
|
14
|
+
}
|
|
15
|
+
const { type, hour = 0, minute = 0, weekDays = [], monthDays = [], customCron = "" } = state;
|
|
16
|
+
const h = Math.max(0, Math.min(23, Number(hour) || 0));
|
|
17
|
+
const m = Math.max(0, Math.min(59, Number(minute) || 0));
|
|
18
|
+
const safeWeekDays = Array.isArray(weekDays) ? weekDays : [];
|
|
19
|
+
const safeMonthDays = Array.isArray(monthDays) ? monthDays : [];
|
|
15
20
|
switch (type) {
|
|
16
21
|
case "daily":
|
|
17
22
|
return `${m} ${h} * * *`;
|
|
18
23
|
case "weekly": {
|
|
19
|
-
const sortedDays = [...
|
|
24
|
+
const sortedDays = [...safeWeekDays].sort((a, b) => a - b);
|
|
20
25
|
const daysStr = sortedDays.length > 0 ? formatNumberList(sortedDays) : "*";
|
|
21
26
|
return `${m} ${h} * * ${daysStr}`;
|
|
22
27
|
}
|
|
23
28
|
case "monthly": {
|
|
24
|
-
const sortedDays = [...
|
|
29
|
+
const sortedDays = [...safeMonthDays].sort((a, b) => a - b);
|
|
25
30
|
const daysStr = sortedDays.length > 0 ? formatNumberList(sortedDays) : "1";
|
|
26
31
|
return `${m} ${h} ${daysStr} * *`;
|
|
27
32
|
}
|
|
28
33
|
case "custom":
|
|
29
|
-
return customCron.trim() || "* * * * *";
|
|
34
|
+
return (customCron || "").trim() || "* * * * *";
|
|
30
35
|
default:
|
|
31
36
|
return "0 0 * * *";
|
|
32
37
|
}
|
|
@@ -59,10 +64,13 @@ function parseCron(cron) {
|
|
|
59
64
|
const parts = cron.trim().split(/\s+/);
|
|
60
65
|
if (parts.length !== 5) return null;
|
|
61
66
|
const [minutePart, hourPart, dayOfMonthPart, monthPart, dayOfWeekPart] = parts;
|
|
62
|
-
|
|
63
|
-
if (
|
|
64
|
-
|
|
65
|
-
if (
|
|
67
|
+
if (!isValidCronField(minutePart, 0, 59)) return null;
|
|
68
|
+
if (!isValidCronField(hourPart, 0, 23)) return null;
|
|
69
|
+
if (!isValidCronField(dayOfMonthPart, 1, 31)) return null;
|
|
70
|
+
if (!isValidCronField(monthPart, 1, 12)) return null;
|
|
71
|
+
if (!isValidCronField(dayOfWeekPart, 0, 6)) return null;
|
|
72
|
+
const minute = parseField(minutePart);
|
|
73
|
+
const hour = parseField(hourPart);
|
|
66
74
|
const result = detectScheduleType(
|
|
67
75
|
minutePart,
|
|
68
76
|
hourPart,
|
|
@@ -81,10 +89,17 @@ function parseCron(cron) {
|
|
|
81
89
|
};
|
|
82
90
|
}
|
|
83
91
|
chunkWGEGR3DF_cjs.__name(parseCron, "parseCron");
|
|
84
|
-
function
|
|
92
|
+
function isSimpleField(part) {
|
|
93
|
+
return part === "*" || /^\d+$/.test(part);
|
|
94
|
+
}
|
|
95
|
+
chunkWGEGR3DF_cjs.__name(isSimpleField, "isSimpleField");
|
|
96
|
+
function detectScheduleType(minutePart, hourPart, dayOfMonthPart, monthPart, dayOfWeekPart) {
|
|
85
97
|
let type = "custom";
|
|
86
98
|
let weekDays = [1, 2, 3, 4, 5];
|
|
87
99
|
let monthDays = [1];
|
|
100
|
+
if (!isSimpleField(minutePart) || !isSimpleField(hourPart)) {
|
|
101
|
+
return { type: "custom", weekDays, monthDays };
|
|
102
|
+
}
|
|
88
103
|
if (dayOfMonthPart === "*" && monthPart === "*" && dayOfWeekPart === "*") {
|
|
89
104
|
type = "daily";
|
|
90
105
|
} else if (dayOfMonthPart === "*" && monthPart === "*" && dayOfWeekPart !== "*") {
|
|
@@ -97,10 +112,31 @@ function detectScheduleType(_minutePart, _hourPart, dayOfMonthPart, monthPart, d
|
|
|
97
112
|
return { type, weekDays, monthDays };
|
|
98
113
|
}
|
|
99
114
|
chunkWGEGR3DF_cjs.__name(detectScheduleType, "detectScheduleType");
|
|
100
|
-
function
|
|
115
|
+
function isValidCronField(part, min, max) {
|
|
116
|
+
if (part === "*") return true;
|
|
117
|
+
if (part.includes("/")) {
|
|
118
|
+
const [base, step] = part.split("/");
|
|
119
|
+
if (!step || !/^\d+$/.test(step)) return false;
|
|
120
|
+
if (base === "*") return true;
|
|
121
|
+
return isValidCronField(base, min, max);
|
|
122
|
+
}
|
|
123
|
+
if (part.includes("-") && !part.includes(",")) {
|
|
124
|
+
const [start, end] = part.split("-").map((s) => parseInt(s, 10));
|
|
125
|
+
return !isNaN(start) && !isNaN(end) && start >= min && end <= max && start <= end;
|
|
126
|
+
}
|
|
127
|
+
if (part.includes(",")) {
|
|
128
|
+
return part.split(",").every((p) => isValidCronField(p.trim(), min, max));
|
|
129
|
+
}
|
|
101
130
|
if (/^\d+$/.test(part)) {
|
|
102
131
|
const num = parseInt(part, 10);
|
|
103
|
-
|
|
132
|
+
return num >= min && num <= max;
|
|
133
|
+
}
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
chunkWGEGR3DF_cjs.__name(isValidCronField, "isValidCronField");
|
|
137
|
+
function parseField(part, _min, _max) {
|
|
138
|
+
if (/^\d+$/.test(part)) {
|
|
139
|
+
return parseInt(part, 10);
|
|
104
140
|
}
|
|
105
141
|
return null;
|
|
106
142
|
}
|
|
@@ -149,19 +185,8 @@ function isValidCron(cron) {
|
|
|
149
185
|
if (!cron || typeof cron !== "string") return false;
|
|
150
186
|
const parts = cron.trim().split(/\s+/);
|
|
151
187
|
if (parts.length !== 5) return false;
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
// minute
|
|
155
|
-
/^(\*|\d{1,2}|\d{1,2}-\d{1,2}|\d{1,2}(,\d{1,2})*|\*\/\d{1,2})$/,
|
|
156
|
-
// hour
|
|
157
|
-
/^(\*|\d{1,2}|\d{1,2}-\d{1,2}|\d{1,2}(,\d{1,2})*|\*\/\d{1,2})$/,
|
|
158
|
-
// day of month
|
|
159
|
-
/^(\*|\d{1,2}|\d{1,2}-\d{1,2}|\d{1,2}(,\d{1,2})*|\*\/\d{1,2})$/,
|
|
160
|
-
// month
|
|
161
|
-
/^(\*|\d{1}|\d{1}-\d{1}|\d{1}(,\d{1})*|\*\/\d{1,2})$/
|
|
162
|
-
// day of week
|
|
163
|
-
];
|
|
164
|
-
return parts.every((part, i) => patterns[i].test(part));
|
|
188
|
+
const [minutePart, hourPart, dayOfMonthPart, monthPart, dayOfWeekPart] = parts;
|
|
189
|
+
return isValidCronField(minutePart, 0, 59) && isValidCronField(hourPart, 0, 23) && isValidCronField(dayOfMonthPart, 1, 31) && isValidCronField(monthPart, 1, 12) && isValidCronField(dayOfWeekPart, 0, 6);
|
|
165
190
|
}
|
|
166
191
|
chunkWGEGR3DF_cjs.__name(isValidCron, "isValidCron");
|
|
167
192
|
|
|
@@ -310,22 +335,29 @@ function CronSchedulerProvider({
|
|
|
310
335
|
const isInitialMount = react.useRef(true);
|
|
311
336
|
const onChangeRef = react.useRef(onChange);
|
|
312
337
|
onChangeRef.current = onChange;
|
|
338
|
+
const [initialValue] = react.useState(() => value || null);
|
|
313
339
|
const [state, setState] = react.useState(() => {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
340
|
+
try {
|
|
341
|
+
if (value) {
|
|
342
|
+
const parsed = parseCron(value);
|
|
343
|
+
if (parsed) return parsed;
|
|
344
|
+
}
|
|
345
|
+
} catch {
|
|
317
346
|
}
|
|
318
347
|
return { ...DEFAULT_STATE, type: defaultType };
|
|
319
348
|
});
|
|
320
349
|
react.useEffect(() => {
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
350
|
+
try {
|
|
351
|
+
if (value) {
|
|
352
|
+
const parsed = parseCron(value);
|
|
353
|
+
if (parsed) {
|
|
354
|
+
const currentCron = buildCron(state);
|
|
355
|
+
if (value !== currentCron) {
|
|
356
|
+
setState(parsed);
|
|
357
|
+
}
|
|
327
358
|
}
|
|
328
359
|
}
|
|
360
|
+
} catch {
|
|
329
361
|
}
|
|
330
362
|
}, [value]);
|
|
331
363
|
const cronExpression = react.useMemo(() => buildCron(state), [state]);
|
|
@@ -401,6 +433,7 @@ function CronSchedulerProvider({
|
|
|
401
433
|
// Computed
|
|
402
434
|
cronExpression,
|
|
403
435
|
humanDescription,
|
|
436
|
+
initialValue,
|
|
404
437
|
// Actions
|
|
405
438
|
setType,
|
|
406
439
|
setTime,
|
|
@@ -415,6 +448,7 @@ function CronSchedulerProvider({
|
|
|
415
448
|
state,
|
|
416
449
|
cronExpression,
|
|
417
450
|
humanDescription,
|
|
451
|
+
initialValue,
|
|
418
452
|
setType,
|
|
419
453
|
setTime,
|
|
420
454
|
toggleWeekDay,
|
|
@@ -473,10 +507,10 @@ function useCronCustom() {
|
|
|
473
507
|
}
|
|
474
508
|
chunkWGEGR3DF_cjs.__name(useCronCustom, "useCronCustom");
|
|
475
509
|
function useCronPreview() {
|
|
476
|
-
const { cronExpression, humanDescription, isValid } = useCronSchedulerContext();
|
|
510
|
+
const { cronExpression, humanDescription, isValid, initialValue } = useCronSchedulerContext();
|
|
477
511
|
return react.useMemo(
|
|
478
|
-
() => ({ cronExpression, humanDescription, isValid }),
|
|
479
|
-
[cronExpression, humanDescription, isValid]
|
|
512
|
+
() => ({ cronExpression, humanDescription, isValid, initialValue }),
|
|
513
|
+
[cronExpression, humanDescription, isValid, initialValue]
|
|
480
514
|
);
|
|
481
515
|
}
|
|
482
516
|
chunkWGEGR3DF_cjs.__name(useCronPreview, "useCronPreview");
|
|
@@ -621,11 +655,12 @@ function DayChips({
|
|
|
621
655
|
className
|
|
622
656
|
}) {
|
|
623
657
|
const { weekDays, toggleWeekDay, setWeekDays } = useCronWeekDays();
|
|
624
|
-
const
|
|
625
|
-
const
|
|
626
|
-
const
|
|
658
|
+
const safeWeekDays = Array.isArray(weekDays) ? weekDays : [];
|
|
659
|
+
const isWeekdays2 = safeWeekDays.length === 5 && [1, 2, 3, 4, 5].every((d) => safeWeekDays.includes(d));
|
|
660
|
+
const isWeekendPreset = safeWeekDays.length === 2 && [0, 6].every((d) => safeWeekDays.includes(d));
|
|
661
|
+
const isEveryday = safeWeekDays.length === 7;
|
|
627
662
|
const dayButtons = DAYS.map(({ value, label }) => {
|
|
628
|
-
const isSelected =
|
|
663
|
+
const isSelected = safeWeekDays.includes(value);
|
|
629
664
|
const isWeekendDay = value === 0 || value === 6;
|
|
630
665
|
return {
|
|
631
666
|
value,
|
|
@@ -704,9 +739,10 @@ function MonthDayGrid({
|
|
|
704
739
|
className
|
|
705
740
|
}) {
|
|
706
741
|
const { monthDays, toggleMonthDay, setMonthDays } = useCronMonthDays();
|
|
707
|
-
const
|
|
708
|
-
const
|
|
709
|
-
const
|
|
742
|
+
const safeMonthDays = Array.isArray(monthDays) ? monthDays : [];
|
|
743
|
+
const is1st = safeMonthDays.length === 1 && safeMonthDays[0] === 1;
|
|
744
|
+
const is15th = safeMonthDays.length === 1 && safeMonthDays[0] === 15;
|
|
745
|
+
const is1stAnd15th = safeMonthDays.length === 2 && safeMonthDays.includes(1) && safeMonthDays.includes(15);
|
|
710
746
|
const presets = [
|
|
711
747
|
{ label: "1st", isActive: is1st, days: [1] },
|
|
712
748
|
{ label: "15th", isActive: is15th, days: [15] },
|
|
@@ -715,7 +751,7 @@ function MonthDayGrid({
|
|
|
715
751
|
const gridCells = Array.from({ length: GRID_SIZE }, (_, i) => {
|
|
716
752
|
const day = i + 1;
|
|
717
753
|
const isValidDay = day <= 31;
|
|
718
|
-
const isSelected = isValidDay &&
|
|
754
|
+
const isSelected = isValidDay && safeMonthDays.includes(day);
|
|
719
755
|
const isPartialMonth = day > 28;
|
|
720
756
|
if (!isValidDay) {
|
|
721
757
|
return { type: "empty", key: i };
|
|
@@ -739,7 +775,7 @@ function MonthDayGrid({
|
|
|
739
775
|
)
|
|
740
776
|
};
|
|
741
777
|
});
|
|
742
|
-
const selectionCount =
|
|
778
|
+
const selectionCount = safeMonthDays.length;
|
|
743
779
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: lib.cn("space-y-3", className), children: [
|
|
744
780
|
showPresets && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-2", children: presets.map((preset) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
745
781
|
PresetButton2,
|
|
@@ -920,9 +956,14 @@ chunkWGEGR3DF_cjs.__name(CronCheatsheet, "CronCheatsheet");
|
|
|
920
956
|
function SchedulePreview({
|
|
921
957
|
showCronExpression = true,
|
|
922
958
|
allowCopy = false,
|
|
959
|
+
showInitialValue = true,
|
|
923
960
|
className
|
|
924
961
|
}) {
|
|
925
|
-
const { cronExpression, humanDescription, isValid } = useCronPreview();
|
|
962
|
+
const { cronExpression, humanDescription, isValid, initialValue } = useCronPreview();
|
|
963
|
+
const hasChanged = react.useMemo(
|
|
964
|
+
() => showInitialValue && initialValue && initialValue !== cronExpression,
|
|
965
|
+
[showInitialValue, initialValue, cronExpression]
|
|
966
|
+
);
|
|
926
967
|
const [copied, setCopied] = react.useState(false);
|
|
927
968
|
const handleCopy = react.useCallback(async () => {
|
|
928
969
|
try {
|
|
@@ -982,7 +1023,13 @@ function SchedulePreview({
|
|
|
982
1023
|
)
|
|
983
1024
|
] }),
|
|
984
1025
|
showCronExpression && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-1.5 pt-1.5 border-t border-border/30 flex items-center justify-between", children: [
|
|
985
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1026
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 min-w-0", children: [
|
|
1027
|
+
hasChanged && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1028
|
+
/* @__PURE__ */ jsxRuntime.jsx("code", { className: "text-xs font-mono text-muted-foreground/60 line-through", children: initialValue }),
|
|
1029
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRight, { className: "h-3 w-3 text-muted-foreground/40 shrink-0" })
|
|
1030
|
+
] }),
|
|
1031
|
+
/* @__PURE__ */ jsxRuntime.jsx("code", { className: "text-xs font-mono text-muted-foreground", children: cronExpression })
|
|
1032
|
+
] }),
|
|
986
1033
|
/* @__PURE__ */ jsxRuntime.jsx(CronCheatsheet, {})
|
|
987
1034
|
] })
|
|
988
1035
|
]
|
|
@@ -1010,5 +1057,5 @@ exports.useCronSchedulerContext = useCronSchedulerContext;
|
|
|
1010
1057
|
exports.useCronTime = useCronTime;
|
|
1011
1058
|
exports.useCronType = useCronType;
|
|
1012
1059
|
exports.useCronWeekDays = useCronWeekDays;
|
|
1013
|
-
//# sourceMappingURL=chunk-
|
|
1014
|
-
//# sourceMappingURL=chunk-
|
|
1060
|
+
//# sourceMappingURL=chunk-AL7PTAS5.cjs.map
|
|
1061
|
+
//# sourceMappingURL=chunk-AL7PTAS5.cjs.map
|