@djangocfg/ui-tools 2.1.133 → 2.1.135
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-G65DNGCA.cjs → CronScheduler.client-Q6HLKGLR.cjs} +11 -11
- package/dist/{CronScheduler.client-G65DNGCA.cjs.map → CronScheduler.client-Q6HLKGLR.cjs.map} +1 -1
- package/dist/{CronScheduler.client-HLABENG7.mjs → CronScheduler.client-T42ZXXOG.mjs} +3 -3
- package/dist/{CronScheduler.client-HLABENG7.mjs.map → CronScheduler.client-T42ZXXOG.mjs.map} +1 -1
- package/dist/{chunk-CDUFZ24N.mjs → chunk-7H4LDBIH.mjs} +188 -163
- package/dist/chunk-7H4LDBIH.mjs.map +1 -0
- package/dist/{chunk-CBGBDVUG.cjs → chunk-WU6ZLOL4.cjs} +188 -163
- package/dist/chunk-WU6ZLOL4.cjs.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 +60 -51
- package/src/tools/CronScheduler/components/MonthDayGrid.tsx +70 -53
- package/src/tools/CronScheduler/components/ScheduleTypeSelector.tsx +20 -11
- package/src/tools/CronScheduler/context/CronSchedulerContext.tsx +17 -9
- package/src/tools/CronScheduler/utils/cron-builder.ts +15 -6
- package/src/tools/CronScheduler/utils/cron-parser.ts +54 -18
- package/dist/chunk-CBGBDVUG.cjs.map +0 -1
- package/dist/chunk-CDUFZ24N.mjs.map +0 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var chunkWU6ZLOL4_cjs = require('./chunk-WU6ZLOL4.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 } = chunkWU6ZLOL4_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(chunkWU6ZLOL4_cjs.ScheduleTypeSelector, { disabled }),
|
|
21
|
+
type !== "custom" && /* @__PURE__ */ jsxRuntime.jsx(chunkWU6ZLOL4_cjs.TimeSelector, { format: timeFormat, disabled }),
|
|
22
|
+
type === "weekly" && /* @__PURE__ */ jsxRuntime.jsx(chunkWU6ZLOL4_cjs.DayChips, { disabled, showPresets: true }),
|
|
23
|
+
type === "monthly" && /* @__PURE__ */ jsxRuntime.jsx(chunkWU6ZLOL4_cjs.MonthDayGrid, { disabled, showPresets: true }),
|
|
24
|
+
type === "custom" && /* @__PURE__ */ jsxRuntime.jsx(chunkWU6ZLOL4_cjs.CustomInput, { disabled }),
|
|
25
25
|
showPreview && /* @__PURE__ */ jsxRuntime.jsx(
|
|
26
|
-
|
|
26
|
+
chunkWU6ZLOL4_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
|
+
chunkWU6ZLOL4_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-Q6HLKGLR.cjs.map
|
|
72
|
+
//# sourceMappingURL=CronScheduler.client-Q6HLKGLR.cjs.map
|
package/dist/{CronScheduler.client-G65DNGCA.cjs.map → CronScheduler.client-Q6HLKGLR.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-Q6HLKGLR.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-7H4LDBIH.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-T42ZXXOG.mjs.map
|
|
67
|
+
//# sourceMappingURL=CronScheduler.client-T42ZXXOG.mjs.map
|
package/dist/{CronScheduler.client-HLABENG7.mjs.map → CronScheduler.client-T42ZXXOG.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-T42ZXXOG.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"]}
|
|
@@ -7,24 +7,29 @@ import { Clock, CheckCircle2, AlertCircle, HelpCircle, Calendar, Check, Copy } f
|
|
|
7
7
|
|
|
8
8
|
// src/tools/CronScheduler/utils/cron-builder.ts
|
|
9
9
|
function buildCron(state) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
if (!state || typeof state !== "object") {
|
|
11
|
+
return "0 0 * * *";
|
|
12
|
+
}
|
|
13
|
+
const { type, hour = 0, minute = 0, weekDays = [], monthDays = [], customCron = "" } = state;
|
|
14
|
+
const h = Math.max(0, Math.min(23, Number(hour) || 0));
|
|
15
|
+
const m = Math.max(0, Math.min(59, Number(minute) || 0));
|
|
16
|
+
const safeWeekDays = Array.isArray(weekDays) ? weekDays : [];
|
|
17
|
+
const safeMonthDays = Array.isArray(monthDays) ? monthDays : [];
|
|
13
18
|
switch (type) {
|
|
14
19
|
case "daily":
|
|
15
20
|
return `${m} ${h} * * *`;
|
|
16
21
|
case "weekly": {
|
|
17
|
-
const sortedDays = [...
|
|
22
|
+
const sortedDays = [...safeWeekDays].sort((a, b) => a - b);
|
|
18
23
|
const daysStr = sortedDays.length > 0 ? formatNumberList(sortedDays) : "*";
|
|
19
24
|
return `${m} ${h} * * ${daysStr}`;
|
|
20
25
|
}
|
|
21
26
|
case "monthly": {
|
|
22
|
-
const sortedDays = [...
|
|
27
|
+
const sortedDays = [...safeMonthDays].sort((a, b) => a - b);
|
|
23
28
|
const daysStr = sortedDays.length > 0 ? formatNumberList(sortedDays) : "1";
|
|
24
29
|
return `${m} ${h} ${daysStr} * *`;
|
|
25
30
|
}
|
|
26
31
|
case "custom":
|
|
27
|
-
return customCron.trim() || "* * * * *";
|
|
32
|
+
return (customCron || "").trim() || "* * * * *";
|
|
28
33
|
default:
|
|
29
34
|
return "0 0 * * *";
|
|
30
35
|
}
|
|
@@ -57,10 +62,13 @@ function parseCron(cron) {
|
|
|
57
62
|
const parts = cron.trim().split(/\s+/);
|
|
58
63
|
if (parts.length !== 5) return null;
|
|
59
64
|
const [minutePart, hourPart, dayOfMonthPart, monthPart, dayOfWeekPart] = parts;
|
|
60
|
-
|
|
61
|
-
if (
|
|
62
|
-
|
|
63
|
-
if (
|
|
65
|
+
if (!isValidCronField(minutePart, 0, 59)) return null;
|
|
66
|
+
if (!isValidCronField(hourPart, 0, 23)) return null;
|
|
67
|
+
if (!isValidCronField(dayOfMonthPart, 1, 31)) return null;
|
|
68
|
+
if (!isValidCronField(monthPart, 1, 12)) return null;
|
|
69
|
+
if (!isValidCronField(dayOfWeekPart, 0, 6)) return null;
|
|
70
|
+
const minute = parseField(minutePart);
|
|
71
|
+
const hour = parseField(hourPart);
|
|
64
72
|
const result = detectScheduleType(
|
|
65
73
|
minutePart,
|
|
66
74
|
hourPart,
|
|
@@ -95,10 +103,31 @@ function detectScheduleType(_minutePart, _hourPart, dayOfMonthPart, monthPart, d
|
|
|
95
103
|
return { type, weekDays, monthDays };
|
|
96
104
|
}
|
|
97
105
|
__name(detectScheduleType, "detectScheduleType");
|
|
98
|
-
function
|
|
106
|
+
function isValidCronField(part, min, max) {
|
|
107
|
+
if (part === "*") return true;
|
|
108
|
+
if (part.includes("/")) {
|
|
109
|
+
const [base, step] = part.split("/");
|
|
110
|
+
if (!step || !/^\d+$/.test(step)) return false;
|
|
111
|
+
if (base === "*") return true;
|
|
112
|
+
return isValidCronField(base, min, max);
|
|
113
|
+
}
|
|
114
|
+
if (part.includes("-") && !part.includes(",")) {
|
|
115
|
+
const [start, end] = part.split("-").map((s) => parseInt(s, 10));
|
|
116
|
+
return !isNaN(start) && !isNaN(end) && start >= min && end <= max && start <= end;
|
|
117
|
+
}
|
|
118
|
+
if (part.includes(",")) {
|
|
119
|
+
return part.split(",").every((p) => isValidCronField(p.trim(), min, max));
|
|
120
|
+
}
|
|
99
121
|
if (/^\d+$/.test(part)) {
|
|
100
122
|
const num = parseInt(part, 10);
|
|
101
|
-
|
|
123
|
+
return num >= min && num <= max;
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
__name(isValidCronField, "isValidCronField");
|
|
128
|
+
function parseField(part, _min, _max) {
|
|
129
|
+
if (/^\d+$/.test(part)) {
|
|
130
|
+
return parseInt(part, 10);
|
|
102
131
|
}
|
|
103
132
|
return null;
|
|
104
133
|
}
|
|
@@ -147,19 +176,8 @@ function isValidCron(cron) {
|
|
|
147
176
|
if (!cron || typeof cron !== "string") return false;
|
|
148
177
|
const parts = cron.trim().split(/\s+/);
|
|
149
178
|
if (parts.length !== 5) return false;
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
// minute
|
|
153
|
-
/^(\*|\d{1,2}|\d{1,2}-\d{1,2}|\d{1,2}(,\d{1,2})*|\*\/\d{1,2})$/,
|
|
154
|
-
// hour
|
|
155
|
-
/^(\*|\d{1,2}|\d{1,2}-\d{1,2}|\d{1,2}(,\d{1,2})*|\*\/\d{1,2})$/,
|
|
156
|
-
// day of month
|
|
157
|
-
/^(\*|\d{1,2}|\d{1,2}-\d{1,2}|\d{1,2}(,\d{1,2})*|\*\/\d{1,2})$/,
|
|
158
|
-
// month
|
|
159
|
-
/^(\*|\d{1}|\d{1}-\d{1}|\d{1}(,\d{1})*|\*\/\d{1,2})$/
|
|
160
|
-
// day of week
|
|
161
|
-
];
|
|
162
|
-
return parts.every((part, i) => patterns[i].test(part));
|
|
179
|
+
const [minutePart, hourPart, dayOfMonthPart, monthPart, dayOfWeekPart] = parts;
|
|
180
|
+
return isValidCronField(minutePart, 0, 59) && isValidCronField(hourPart, 0, 23) && isValidCronField(dayOfMonthPart, 1, 31) && isValidCronField(monthPart, 1, 12) && isValidCronField(dayOfWeekPart, 0, 6);
|
|
163
181
|
}
|
|
164
182
|
__name(isValidCron, "isValidCron");
|
|
165
183
|
|
|
@@ -309,21 +327,27 @@ function CronSchedulerProvider({
|
|
|
309
327
|
const onChangeRef = useRef(onChange);
|
|
310
328
|
onChangeRef.current = onChange;
|
|
311
329
|
const [state, setState] = useState(() => {
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
330
|
+
try {
|
|
331
|
+
if (value) {
|
|
332
|
+
const parsed = parseCron(value);
|
|
333
|
+
if (parsed) return parsed;
|
|
334
|
+
}
|
|
335
|
+
} catch {
|
|
315
336
|
}
|
|
316
337
|
return { ...DEFAULT_STATE, type: defaultType };
|
|
317
338
|
});
|
|
318
339
|
useEffect(() => {
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
340
|
+
try {
|
|
341
|
+
if (value) {
|
|
342
|
+
const parsed = parseCron(value);
|
|
343
|
+
if (parsed) {
|
|
344
|
+
const currentCron = buildCron(state);
|
|
345
|
+
if (value !== currentCron) {
|
|
346
|
+
setState(parsed);
|
|
347
|
+
}
|
|
325
348
|
}
|
|
326
349
|
}
|
|
350
|
+
} catch {
|
|
327
351
|
}
|
|
328
352
|
}, [value]);
|
|
329
353
|
const cronExpression = useMemo(() => buildCron(state), [state]);
|
|
@@ -493,25 +517,32 @@ function ScheduleTypeSelector({
|
|
|
493
517
|
className
|
|
494
518
|
}) {
|
|
495
519
|
const { type, setType } = useCronType();
|
|
520
|
+
const triggerClassName = cn(
|
|
521
|
+
"text-xs font-medium px-2 py-1.5",
|
|
522
|
+
"data-[state=active]:shadow-sm",
|
|
523
|
+
"transition-all duration-150"
|
|
524
|
+
);
|
|
525
|
+
const triggers = SCHEDULE_TYPES.map(({ value, label }) => ({
|
|
526
|
+
value,
|
|
527
|
+
label,
|
|
528
|
+
disabled,
|
|
529
|
+
className: triggerClassName
|
|
530
|
+
}));
|
|
496
531
|
return /* @__PURE__ */ jsx(
|
|
497
532
|
Tabs,
|
|
498
533
|
{
|
|
499
534
|
value: type,
|
|
500
535
|
onValueChange: (v) => setType(v),
|
|
501
536
|
className: cn("w-full", className),
|
|
502
|
-
children: /* @__PURE__ */ jsx(TabsList, { className: "
|
|
537
|
+
children: /* @__PURE__ */ jsx(TabsList, { className: "grid w-full grid-cols-4 h-9 p-0.5", children: triggers.map((trigger) => /* @__PURE__ */ jsx(
|
|
503
538
|
TabsTrigger,
|
|
504
539
|
{
|
|
505
|
-
value,
|
|
506
|
-
disabled,
|
|
507
|
-
className:
|
|
508
|
-
|
|
509
|
-
"data-[state=active]:shadow-sm",
|
|
510
|
-
"transition-all duration-150"
|
|
511
|
-
),
|
|
512
|
-
children: label
|
|
540
|
+
value: trigger.value,
|
|
541
|
+
disabled: trigger.disabled,
|
|
542
|
+
className: trigger.className,
|
|
543
|
+
children: trigger.label
|
|
513
544
|
},
|
|
514
|
-
value
|
|
545
|
+
trigger.value
|
|
515
546
|
)) })
|
|
516
547
|
}
|
|
517
548
|
);
|
|
@@ -612,66 +643,60 @@ function DayChips({
|
|
|
612
643
|
className
|
|
613
644
|
}) {
|
|
614
645
|
const { weekDays, toggleWeekDay, setWeekDays } = useCronWeekDays();
|
|
615
|
-
const
|
|
616
|
-
const
|
|
617
|
-
const
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
),
|
|
639
|
-
disabled && "opacity-50 cursor-not-allowed pointer-events-none"
|
|
640
|
-
),
|
|
641
|
-
children: /* @__PURE__ */ jsx("span", { children: label })
|
|
642
|
-
},
|
|
643
|
-
value
|
|
644
|
-
);
|
|
645
|
-
}) }),
|
|
646
|
-
showPresets && /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
647
|
-
/* @__PURE__ */ jsx(
|
|
648
|
-
PresetButton,
|
|
649
|
-
{
|
|
650
|
-
label: "Weekdays",
|
|
651
|
-
isActive: isWeekdays2,
|
|
652
|
-
onClick: () => setWeekDays([1, 2, 3, 4, 5]),
|
|
653
|
-
disabled
|
|
654
|
-
}
|
|
655
|
-
),
|
|
656
|
-
/* @__PURE__ */ jsx(
|
|
657
|
-
PresetButton,
|
|
658
|
-
{
|
|
659
|
-
label: "Weekends",
|
|
660
|
-
isActive: isWeekend2,
|
|
661
|
-
onClick: () => setWeekDays([0, 6]),
|
|
662
|
-
disabled
|
|
663
|
-
}
|
|
664
|
-
),
|
|
665
|
-
/* @__PURE__ */ jsx(
|
|
666
|
-
PresetButton,
|
|
667
|
-
{
|
|
668
|
-
label: "Every day",
|
|
669
|
-
isActive: isEveryday,
|
|
670
|
-
onClick: () => setWeekDays([0, 1, 2, 3, 4, 5, 6]),
|
|
671
|
-
disabled
|
|
672
|
-
}
|
|
646
|
+
const safeWeekDays = Array.isArray(weekDays) ? weekDays : [];
|
|
647
|
+
const isWeekdays2 = safeWeekDays.length === 5 && [1, 2, 3, 4, 5].every((d) => safeWeekDays.includes(d));
|
|
648
|
+
const isWeekendPreset = safeWeekDays.length === 2 && [0, 6].every((d) => safeWeekDays.includes(d));
|
|
649
|
+
const isEveryday = safeWeekDays.length === 7;
|
|
650
|
+
const dayButtons = DAYS.map(({ value, label }) => {
|
|
651
|
+
const isSelected = safeWeekDays.includes(value);
|
|
652
|
+
const isWeekendDay = value === 0 || value === 6;
|
|
653
|
+
return {
|
|
654
|
+
value,
|
|
655
|
+
label,
|
|
656
|
+
isSelected,
|
|
657
|
+
isWeekendDay,
|
|
658
|
+
className: cn(
|
|
659
|
+
"flex flex-col items-center justify-center",
|
|
660
|
+
"py-2.5 rounded-lg text-xs font-medium",
|
|
661
|
+
"transition-all duration-150",
|
|
662
|
+
"focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50",
|
|
663
|
+
"active:scale-[0.97]",
|
|
664
|
+
isSelected ? "bg-primary text-primary-foreground shadow-sm" : cn(
|
|
665
|
+
"bg-muted/50 hover:bg-muted",
|
|
666
|
+
isWeekendDay ? "text-muted-foreground/70" : "text-muted-foreground"
|
|
667
|
+
),
|
|
668
|
+
disabled && "opacity-50 cursor-not-allowed pointer-events-none"
|
|
673
669
|
)
|
|
674
|
-
|
|
670
|
+
};
|
|
671
|
+
});
|
|
672
|
+
const presets = [
|
|
673
|
+
{ label: "Weekdays", isActive: isWeekdays2, days: [1, 2, 3, 4, 5] },
|
|
674
|
+
{ label: "Weekends", isActive: isWeekendPreset, days: [0, 6] },
|
|
675
|
+
{ label: "Every day", isActive: isEveryday, days: [0, 1, 2, 3, 4, 5, 6] }
|
|
676
|
+
];
|
|
677
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("space-y-3", className), children: [
|
|
678
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-7 gap-1", children: dayButtons.map((day) => /* @__PURE__ */ jsx(
|
|
679
|
+
"button",
|
|
680
|
+
{
|
|
681
|
+
type: "button",
|
|
682
|
+
disabled,
|
|
683
|
+
onClick: () => toggleWeekDay(day.value),
|
|
684
|
+
"aria-pressed": day.isSelected,
|
|
685
|
+
className: day.className,
|
|
686
|
+
children: /* @__PURE__ */ jsx("span", { children: day.label })
|
|
687
|
+
},
|
|
688
|
+
day.value
|
|
689
|
+
)) }),
|
|
690
|
+
showPresets && /* @__PURE__ */ jsx("div", { className: "flex gap-2", children: presets.map((preset) => /* @__PURE__ */ jsx(
|
|
691
|
+
PresetButton,
|
|
692
|
+
{
|
|
693
|
+
label: preset.label,
|
|
694
|
+
isActive: preset.isActive,
|
|
695
|
+
onClick: () => setWeekDays(preset.days),
|
|
696
|
+
disabled
|
|
697
|
+
},
|
|
698
|
+
preset.label
|
|
699
|
+
)) })
|
|
675
700
|
] });
|
|
676
701
|
}
|
|
677
702
|
__name(DayChips, "DayChips");
|
|
@@ -702,74 +727,74 @@ function MonthDayGrid({
|
|
|
702
727
|
className
|
|
703
728
|
}) {
|
|
704
729
|
const { monthDays, toggleMonthDay, setMonthDays } = useCronMonthDays();
|
|
705
|
-
const
|
|
706
|
-
const
|
|
707
|
-
const
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
730
|
+
const safeMonthDays = Array.isArray(monthDays) ? monthDays : [];
|
|
731
|
+
const is1st = safeMonthDays.length === 1 && safeMonthDays[0] === 1;
|
|
732
|
+
const is15th = safeMonthDays.length === 1 && safeMonthDays[0] === 15;
|
|
733
|
+
const is1stAnd15th = safeMonthDays.length === 2 && safeMonthDays.includes(1) && safeMonthDays.includes(15);
|
|
734
|
+
const presets = [
|
|
735
|
+
{ label: "1st", isActive: is1st, days: [1] },
|
|
736
|
+
{ label: "15th", isActive: is15th, days: [15] },
|
|
737
|
+
{ label: "1st & 15th", isActive: is1stAnd15th, days: [1, 15] }
|
|
738
|
+
];
|
|
739
|
+
const gridCells = Array.from({ length: GRID_SIZE }, (_, i) => {
|
|
740
|
+
const day = i + 1;
|
|
741
|
+
const isValidDay = day <= 31;
|
|
742
|
+
const isSelected = isValidDay && safeMonthDays.includes(day);
|
|
743
|
+
const isPartialMonth = day > 28;
|
|
744
|
+
if (!isValidDay) {
|
|
745
|
+
return { type: "empty", key: i };
|
|
746
|
+
}
|
|
747
|
+
return {
|
|
748
|
+
type: "day",
|
|
749
|
+
key: day,
|
|
750
|
+
day,
|
|
751
|
+
isSelected,
|
|
752
|
+
className: cn(
|
|
753
|
+
"aspect-square flex items-center justify-center",
|
|
754
|
+
"rounded-lg text-sm font-medium",
|
|
755
|
+
"transition-all duration-150",
|
|
756
|
+
"focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50",
|
|
757
|
+
"active:scale-[0.95]",
|
|
758
|
+
isSelected ? "bg-primary text-primary-foreground shadow-sm" : cn(
|
|
759
|
+
"bg-muted/30 hover:bg-muted/60",
|
|
760
|
+
isPartialMonth ? "text-muted-foreground/50" : "text-muted-foreground"
|
|
761
|
+
),
|
|
762
|
+
disabled && "opacity-50 cursor-not-allowed pointer-events-none"
|
|
736
763
|
)
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
764
|
+
};
|
|
765
|
+
});
|
|
766
|
+
const selectionCount = safeMonthDays.length;
|
|
767
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("space-y-3", className), children: [
|
|
768
|
+
showPresets && /* @__PURE__ */ jsx("div", { className: "flex gap-2", children: presets.map((preset) => /* @__PURE__ */ jsx(
|
|
769
|
+
PresetButton2,
|
|
770
|
+
{
|
|
771
|
+
label: preset.label,
|
|
772
|
+
isActive: preset.isActive,
|
|
773
|
+
onClick: () => setMonthDays(preset.days),
|
|
774
|
+
disabled
|
|
775
|
+
},
|
|
776
|
+
preset.label
|
|
777
|
+
)) }),
|
|
778
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-7 gap-1", children: gridCells.map((cell) => {
|
|
779
|
+
if (cell.type === "empty") {
|
|
780
|
+
return /* @__PURE__ */ jsx("div", { className: "aspect-square" }, cell.key);
|
|
745
781
|
}
|
|
746
782
|
return /* @__PURE__ */ jsx(
|
|
747
783
|
"button",
|
|
748
784
|
{
|
|
749
785
|
type: "button",
|
|
750
786
|
disabled,
|
|
751
|
-
onClick: () => toggleMonthDay(day),
|
|
752
|
-
"aria-pressed": isSelected,
|
|
753
|
-
"aria-label": `Day ${day}`,
|
|
754
|
-
className:
|
|
755
|
-
|
|
756
|
-
"rounded-lg text-sm font-medium",
|
|
757
|
-
"transition-all duration-150",
|
|
758
|
-
"focus:outline-none focus-visible:ring-2 focus-visible:ring-primary/50",
|
|
759
|
-
"active:scale-[0.95]",
|
|
760
|
-
isSelected ? "bg-primary text-primary-foreground shadow-sm" : cn(
|
|
761
|
-
"bg-muted/30 hover:bg-muted/60",
|
|
762
|
-
isPartialMonth ? "text-muted-foreground/50" : "text-muted-foreground"
|
|
763
|
-
),
|
|
764
|
-
disabled && "opacity-50 cursor-not-allowed pointer-events-none"
|
|
765
|
-
),
|
|
766
|
-
children: day
|
|
787
|
+
onClick: () => toggleMonthDay(cell.day),
|
|
788
|
+
"aria-pressed": cell.isSelected,
|
|
789
|
+
"aria-label": `Day ${cell.day}`,
|
|
790
|
+
className: cell.className,
|
|
791
|
+
children: cell.day
|
|
767
792
|
},
|
|
768
|
-
|
|
793
|
+
cell.key
|
|
769
794
|
);
|
|
770
795
|
}) }),
|
|
771
|
-
|
|
772
|
-
|
|
796
|
+
selectionCount > 1 && /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground text-center", children: [
|
|
797
|
+
selectionCount,
|
|
773
798
|
" days selected"
|
|
774
799
|
] })
|
|
775
800
|
] });
|
|
@@ -991,5 +1016,5 @@ function SchedulePreview({
|
|
|
991
1016
|
__name(SchedulePreview, "SchedulePreview");
|
|
992
1017
|
|
|
993
1018
|
export { CronSchedulerProvider, CustomInput, DayChips, MonthDayGrid, SchedulePreview, ScheduleTypeSelector, TimeSelector, buildCron, humanizeCron, isValidCron, parseCron, useCronCustom, useCronMonthDays, useCronPreview, useCronScheduler, useCronSchedulerContext, useCronTime, useCronType, useCronWeekDays };
|
|
994
|
-
//# sourceMappingURL=chunk-
|
|
995
|
-
//# sourceMappingURL=chunk-
|
|
1019
|
+
//# sourceMappingURL=chunk-7H4LDBIH.mjs.map
|
|
1020
|
+
//# sourceMappingURL=chunk-7H4LDBIH.mjs.map
|