@object-ui/plugin-calendar 16.1.0 → 17.1.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,186 @@
1
1
  # @object-ui/plugin-calendar
2
2
 
3
+ ## 17.1.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [62311b6]
8
+ - Updated dependencies [fc0272a]
9
+ - Updated dependencies [9e7349e]
10
+ - Updated dependencies [8864971]
11
+ - Updated dependencies [1cf0de7]
12
+ - Updated dependencies [752e18f]
13
+ - Updated dependencies [c785740]
14
+ - Updated dependencies [b41f401]
15
+ - Updated dependencies [19e9fa0]
16
+ - Updated dependencies [d61efd1]
17
+ - Updated dependencies [95b7214]
18
+ - Updated dependencies [7d9734d]
19
+ - Updated dependencies [6ae818e]
20
+ - Updated dependencies [9eb932b]
21
+ - Updated dependencies [746dd00]
22
+ - Updated dependencies [aebfa4f]
23
+ - Updated dependencies [38ca8be]
24
+ - Updated dependencies [3cb9646]
25
+ - Updated dependencies [68ef584]
26
+ - Updated dependencies [4952edf]
27
+ - Updated dependencies [7f0252e]
28
+ - Updated dependencies [c4d7b20]
29
+ - Updated dependencies [c769d3d]
30
+ - Updated dependencies [7639a61]
31
+ - Updated dependencies [94e63ef]
32
+ - Updated dependencies [c735bf7]
33
+ - Updated dependencies [02aef0c]
34
+ - Updated dependencies [6f29aa5]
35
+ - Updated dependencies [d21794c]
36
+ - Updated dependencies [c4db402]
37
+ - Updated dependencies [5319bf1]
38
+ - Updated dependencies [49e5671]
39
+ - Updated dependencies [9a04d25]
40
+ - Updated dependencies [b5b97e2]
41
+ - Updated dependencies [f59f2c1]
42
+ - Updated dependencies [07de839]
43
+ - Updated dependencies [2a40b5e]
44
+ - Updated dependencies [df613fa]
45
+ - Updated dependencies [4874117]
46
+ - Updated dependencies [ad0183a]
47
+ - Updated dependencies [ce08d55]
48
+ - Updated dependencies [eb4b740]
49
+ - Updated dependencies [aecc934]
50
+ - Updated dependencies [5b084eb]
51
+ - Updated dependencies [aa1240a]
52
+ - Updated dependencies [2374a49]
53
+ - Updated dependencies [390c071]
54
+ - Updated dependencies [d10f526]
55
+ - Updated dependencies [2baa13f]
56
+ - Updated dependencies [bac266c]
57
+ - Updated dependencies [2d5d594]
58
+ - Updated dependencies [ea7f477]
59
+ - Updated dependencies [379728f]
60
+ - Updated dependencies [7f23cd0]
61
+ - Updated dependencies [0ded602]
62
+ - Updated dependencies [24e0e0a]
63
+ - Updated dependencies [f8a95e5]
64
+ - Updated dependencies [3a6cf24]
65
+ - Updated dependencies [aa35561]
66
+ - Updated dependencies [03bd53b]
67
+ - Updated dependencies [3c1f321]
68
+ - Updated dependencies [a045a32]
69
+ - Updated dependencies [912496d]
70
+ - Updated dependencies [80edbd4]
71
+ - Updated dependencies [9867281]
72
+ - @object-ui/core@17.1.0
73
+ - @object-ui/components@17.1.0
74
+ - @object-ui/plugin-detail@17.1.0
75
+ - @object-ui/react@17.1.0
76
+ - @object-ui/types@17.1.0
77
+ - @object-ui/i18n@17.1.0
78
+ - @object-ui/fields@17.1.0
79
+ - @object-ui/mobile@17.1.0
80
+
81
+ ## 17.0.0
82
+
83
+ ### Patch Changes
84
+
85
+ - 7d46648: fix(hooks): stop calling translation hooks inside try/catch (objectui#2879)
86
+
87
+ Eleven call sites wrapped a React hook in `try`/`catch` to make it
88
+ "provider-safe". `useObjectTranslation` and `useObjectLabel` already are — they
89
+ read context optionally and fall back to react-i18next's global instance, and
90
+ never throw. The `catch` bought nothing and cost correctness: a throw _after_
91
+ the hook ran desyncs hook order on the next render, because React matches hooks
92
+ positionally. objectui#2595/#2596 fixed exactly this in `@object-ui/i18n`'s
93
+ `createSafeTranslation`; nine plugin-local re-implementations kept their own
94
+ copy of the bug, and two more (`ObjectTimeline`, `ObjectView`) were found by the
95
+ new lint rule below — `ObjectView` had even suppressed
96
+ `react-hooks/rules-of-hooks` inline to keep it.
97
+
98
+ - Six exact re-implementations now delegate to `createSafeTranslation`:
99
+ `plugin-detail`, `plugin-timeline`, `plugin-list`, `plugin-calendar`,
100
+ `plugin-grid`'s `ObjectGrid`, `plugin-designer`.
101
+ - `components`' `data-table` also delegates; `createSafeTranslation` now
102
+ returns `language` alongside `t` so consumers that localize dates don't need
103
+ a second hook call. Purely additive.
104
+ - `plugin-gantt` and `plugin-grid`'s `ImportWizard` keep their local hooks —
105
+ they fall back _per key_, which a single-probe factory cannot express and
106
+ which their comments justify (a host dictionary that covers common keys but
107
+ lags on newer ones). Only the `try`/`catch` is removed.
108
+ - `ObjectTimeline` and `ObjectView` call the hook directly and probe the
109
+ returned value, mirroring `useSafeFieldLabel`.
110
+
111
+ Adds `object-ui/no-try-catch-around-hook` (error) so a twelfth copy fails CI.
112
+ It only matches `use*` names, accepts member calls solely on `React` (so
113
+ `vi.useRealTimers()` is not a hook), and resets its try-depth inside nested
114
+ functions (so `renderHook(() => useThing())` inside a `try` is fine) — both
115
+ false positives were real code in this repo and are pinned in the rule's tests.
116
+
117
+ `eslint-rules/**/*.test.js` matched no vitest project glob, so the local
118
+ plugin's specs had never run in CI. They are now included; all three pass.
119
+
120
+ `ObjectTimeline`'s test mock of `@object-ui/react` omitted `useObjectLabel` —
121
+ the removed `try`/`catch` had been silently absorbing that gap. The mock is now
122
+ complete.
123
+
124
+ - Updated dependencies [7b21891]
125
+ - Updated dependencies [0b3be01]
126
+ - Updated dependencies [3c4d935]
127
+ - Updated dependencies [4b1ed7d]
128
+ - Updated dependencies [4b60d2d]
129
+ - Updated dependencies [952b978]
130
+ - Updated dependencies [de5e40c]
131
+ - Updated dependencies [1a03af6]
132
+ - Updated dependencies [3e886eb]
133
+ - Updated dependencies [cfc675e]
134
+ - Updated dependencies [20df08c]
135
+ - Updated dependencies [1767124]
136
+ - Updated dependencies [8ecf5a6]
137
+ - Updated dependencies [af705b9]
138
+ - Updated dependencies [0502a7c]
139
+ - Updated dependencies [7b35e4b]
140
+ - Updated dependencies [8fb1295]
141
+ - Updated dependencies [e16ed2d]
142
+ - Updated dependencies [c6fd752]
143
+ - Updated dependencies [f9bbddb]
144
+ - Updated dependencies [dfd3705]
145
+ - Updated dependencies [c77108c]
146
+ - Updated dependencies [2735de6]
147
+ - Updated dependencies [697cda4]
148
+ - Updated dependencies [c19ac11]
149
+ - Updated dependencies [6dee2cb]
150
+ - Updated dependencies [e05f052]
151
+ - Updated dependencies [0502a7c]
152
+ - Updated dependencies [faad45e]
153
+ - Updated dependencies [09c6a17]
154
+ - Updated dependencies [c7cff19]
155
+ - Updated dependencies [ba73a02]
156
+ - Updated dependencies [cd09a7b]
157
+ - Updated dependencies [f1abf0e]
158
+ - Updated dependencies [f05b84e]
159
+ - Updated dependencies [9b4b952]
160
+ - Updated dependencies [341bfb5]
161
+ - Updated dependencies [2f947e4]
162
+ - Updated dependencies [7d46648]
163
+ - Updated dependencies [9b53d72]
164
+ - Updated dependencies [bb4aa25]
165
+ - Updated dependencies [75f1cdf]
166
+ - Updated dependencies [662bdf9]
167
+ - Updated dependencies [059a052]
168
+ - Updated dependencies [53642d4]
169
+ - Updated dependencies [8aae006]
170
+ - Updated dependencies [c6cfdf1]
171
+ - Updated dependencies [d147a13]
172
+ - Updated dependencies [c6aaed8]
173
+ - Updated dependencies [263f885]
174
+ - Updated dependencies [dc334da]
175
+ - @object-ui/components@17.0.0
176
+ - @object-ui/plugin-detail@17.0.0
177
+ - @object-ui/i18n@17.0.0
178
+ - @object-ui/fields@17.0.0
179
+ - @object-ui/react@17.0.0
180
+ - @object-ui/types@17.0.0
181
+ - @object-ui/core@17.0.0
182
+ - @object-ui/mobile@17.0.0
183
+
3
184
  ## 16.1.0
4
185
 
5
186
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"CalendarView.d.ts","sourceRoot":"","sources":["../src/CalendarView.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA0C9B;;;;;;;;;;GAUG;AACH,iBAAS,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAUtG;AAsDD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,IAAI,CAAA;IACX,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,GAAG,CAAA;CACX;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAA;IACxB,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;IAC/B,WAAW,CAAC,EAAE,IAAI,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IAC7C,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IAClC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,KAAK,IAAI,CAAA;IACvD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,KAAK,IAAI,CAAA;IAC3E;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI,CAAA;IACpD;2EACuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,iBAAS,YAAY,CAAC,EACpB,MAAW,EACX,IAAc,EACd,WAAiC,EACjC,MAAkB,EAClB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACV,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,WAAgB,EAChB,SAAS,GACV,EAAE,iBAAiB,qBA8OnB;AAmhCD,OAAO,EAAE,YAAY,EAAE,CAAA;AACvB,OAAO,EAAE,iBAAiB,IAAI,0BAA0B,EAAE,CAAA"}
1
+ {"version":3,"file":"CalendarView.d.ts","sourceRoot":"","sources":["../src/CalendarView.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AA0C9B;;;;;;;;;;GAUG;AACH,iBAAS,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAUtG;AAsBD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,IAAI,CAAA;IACX,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,GAAG,CAAA;CACX;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAA;IACxB,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;IAC/B,WAAW,CAAC,EAAE,IAAI,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IAC7C,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IAClC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,KAAK,IAAI,CAAA;IACvD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,KAAK,IAAI,CAAA;IAC3E;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI,CAAA;IACpD;2EACuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,iBAAS,YAAY,CAAC,EACpB,MAAW,EACX,IAAc,EACd,WAAiC,EACjC,MAAkB,EAClB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACV,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,WAAgB,EAChB,SAAS,GACV,EAAE,iBAAiB,qBA8OnB;AAmhCD,OAAO,EAAE,YAAY,EAAE,CAAA;AACvB,OAAO,EAAE,iBAAiB,IAAI,0BAA0B,EAAE,CAAA"}
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import { ComponentRegistry as s, buildExpandFields as c, extractRecords as l, ge
4
4
  import { extractWriteErrorMessage as d, isPermissionError as f, useNavigationOverlay as p, useSafeTranslate as m, useSchemaContext as h } from "@object-ui/react";
5
5
  import { CalendarIcon as g, ChevronLeftIcon as _, ChevronRightIcon as v, PlusIcon as y } from "lucide-react";
6
6
  import { Button as b, Calendar as x, Dialog as S, DialogContent as C, DialogDescription as w, DialogFooter as T, DialogHeader as E, DialogTitle as D, Input as ee, Label as te, Popover as O, PopoverContent as k, PopoverTrigger as A, Select as ne, SelectContent as j, SelectItem as M, SelectTrigger as N, SelectValue as re, cn as P, toast as ie, useIsMobile as ae } from "@object-ui/components";
7
- import { useObjectTranslation as F } from "@object-ui/i18n";
7
+ import { createSafeTranslation as F } from "@object-ui/i18n";
8
8
  import { Fragment as I, jsx as L, jsxs as R } from "react/jsx-runtime";
9
9
  import { usePullToRefresh as oe } from "@object-ui/mobile";
10
10
  import { RecordDetailDrawer as se, deriveRecordPageHref as ce } from "@object-ui/plugin-detail";
@@ -30,7 +30,7 @@ function B(e) {
30
30
  for (let n = 0; n < e.length; n++) t = (t << 5) - t + e.charCodeAt(n) | 0;
31
31
  return { className: ue[Math.abs(t) % ue.length] };
32
32
  }
33
- var V = {
33
+ var V = F({
34
34
  "calendar.today": "Today",
35
35
  "calendar.month": "Month",
36
36
  "calendar.week": "Week",
@@ -38,34 +38,9 @@ var V = {
38
38
  "calendar.newEvent": "New event",
39
39
  "calendar.moreEvents": "+{{count}} more",
40
40
  "calendar.allDay": "all-day"
41
- };
42
- function H() {
43
- try {
44
- let e = F();
45
- return e.t("calendar.today") === "calendar.today" ? {
46
- t: (e, t) => {
47
- let n = V[e] || e;
48
- if (t) for (let [e, r] of Object.entries(t)) n = n.replace(`{{${e}}}`, String(r));
49
- return n;
50
- },
51
- language: "en"
52
- } : {
53
- t: e.t,
54
- language: e.language
55
- };
56
- } catch {
57
- return {
58
- t: (e, t) => {
59
- let n = V[e] || e;
60
- if (t) for (let [e, r] of Object.entries(t)) n = n.replace(`{{${e}}}`, String(r));
61
- return n;
62
- },
63
- language: "en"
64
- };
65
- }
66
- }
41
+ }, "calendar.today");
67
42
  function pe({ events: t = [], view: n = "month", currentDate: r = z, locale: i = "default", onEventClick: a, onDateClick: o, onViewChange: s, onNavigate: c, onAddClick: l, onEventDrop: u, onTimeRangeSelect: d, slotMinutes: f = 30, className: p }) {
68
- let [m, h] = e.useState(n), [S, C] = e.useState(r), { t: w, language: T } = H(), E = i === "default" ? T : i;
43
+ let [m, h] = e.useState(n), [S, C] = e.useState(r), { t: w, language: T } = V(), E = i === "default" ? T : i;
69
44
  e.useEffect(() => {
70
45
  C(r);
71
46
  }, [r]), e.useEffect(() => {
@@ -95,7 +70,7 @@ function pe({ events: t = [], view: n = "month", currentDate: r = z, locale: i =
95
70
  year: "numeric"
96
71
  });
97
72
  if (m === "week") {
98
- let e = me(S), t = new Date(e);
73
+ let e = H(S), t = new Date(e);
99
74
  return t.setDate(t.getDate() + 6), `${e.toLocaleDateString(E, {
100
75
  month: "short",
101
76
  day: "numeric"
@@ -220,7 +195,7 @@ function pe({ events: t = [], view: n = "month", currentDate: r = z, locale: i =
220
195
  onDateClick: o,
221
196
  onEventDrop: u
222
197
  }),
223
- m === "week" && /* @__PURE__ */ L(J, {
198
+ m === "week" && /* @__PURE__ */ L(q, {
224
199
  mode: "week",
225
200
  date: S,
226
201
  events: t,
@@ -230,7 +205,7 @@ function pe({ events: t = [], view: n = "month", currentDate: r = z, locale: i =
230
205
  onEventDrop: u,
231
206
  onTimeRangeSelect: d
232
207
  }),
233
- m === "day" && /* @__PURE__ */ L(J, {
208
+ m === "day" && /* @__PURE__ */ L(q, {
234
209
  mode: "day",
235
210
  date: S,
236
211
  events: t,
@@ -244,11 +219,11 @@ function pe({ events: t = [], view: n = "month", currentDate: r = z, locale: i =
244
219
  })]
245
220
  });
246
221
  }
247
- function me(e) {
222
+ function H(e) {
248
223
  let t = new Date(e), n = t.getDay(), r = t.getDate() - n;
249
224
  return t.setDate(r), t;
250
225
  }
251
- function he(e) {
226
+ function me(e) {
252
227
  let t = e.getFullYear(), n = e.getMonth(), r = new Date(t, n, 1), i = new Date(t, n + 1, 0), a = r.getDay(), o = [];
253
228
  for (let e = a - 1; e >= 0; e--) {
254
229
  let t = new Date(r.getTime());
@@ -262,11 +237,11 @@ function he(e) {
262
237
  }
263
238
  return o;
264
239
  }
265
- function U(e, t) {
240
+ function he(e, t) {
266
241
  return e.getFullYear() === t.getFullYear() && e.getMonth() === t.getMonth() && e.getDate() === t.getDate();
267
242
  }
268
243
  function ge({ date: t, events: n, locale: r = "default", onEventClick: i, onDateClick: a, onEventDrop: o }) {
269
- let s = e.useMemo(() => he(t), [t.getFullYear(), t.getMonth()]), c = e.useMemo(() => /* @__PURE__ */ new Date(), []), { t: l } = H(), u = e.useMemo(() => {
244
+ let s = e.useMemo(() => me(t), [t.getFullYear(), t.getMonth()]), c = e.useMemo(() => /* @__PURE__ */ new Date(), []), { t: l } = V(), u = e.useMemo(() => {
270
245
  let e = new Date(2024, 0, 7);
271
246
  return Array.from({ length: 7 }, (t, n) => {
272
247
  let i = new Date(e);
@@ -352,7 +327,7 @@ function ge({ date: t, events: n, locale: r = "default", onEventClick: i, onDate
352
327
  "aria-label": "Calendar grid",
353
328
  className: "grid grid-cols-7 flex-1 auto-rows-fr",
354
329
  children: s.map((e, n) => {
355
- let r = `${e.getFullYear()}-${e.getMonth()}-${e.getDate()}`, s = h.get(r) || [], u = e.getMonth() === t.getMonth(), f = U(e, c);
330
+ let r = `${e.getFullYear()}-${e.getMonth()}-${e.getDate()}`, s = h.get(r) || [], u = e.getMonth() === t.getMonth(), f = he(e, c);
356
331
  return /* @__PURE__ */ R("div", {
357
332
  role: "gridcell",
358
333
  "aria-label": `${e.toLocaleDateString("default", {
@@ -407,24 +382,24 @@ function ge({ date: t, events: n, locale: r = "default", onEventClick: i, onDate
407
382
  })]
408
383
  });
409
384
  }
410
- var W = 48;
411
- function G(e) {
385
+ var U = 48;
386
+ function W(e) {
412
387
  let t = new Date(e);
413
388
  return t.setHours(0, 0, 0, 0), t;
414
389
  }
415
- function K(e) {
390
+ function G(e) {
416
391
  return e.getHours() * 60 + e.getMinutes();
417
392
  }
418
- function q(e) {
393
+ function K(e) {
419
394
  return `${e.getFullYear()}-${e.getMonth()}-${e.getDate()}`;
420
395
  }
421
- function J({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a = 30, onEventClick: o, onEventDrop: s, onTimeRangeSelect: c }) {
422
- let { t: l } = H(), u = W * a / 60, d = W * 24, f = e.useMemo(() => {
423
- if (t === "day") return [G(n)];
424
- let e = me(n);
396
+ function q({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a = 30, onEventClick: o, onEventDrop: s, onTimeRangeSelect: c }) {
397
+ let { t: l } = V(), u = U * a / 60, d = U * 24, f = e.useMemo(() => {
398
+ if (t === "day") return [W(n)];
399
+ let e = H(n);
425
400
  return Array.from({ length: 7 }, (t, n) => {
426
401
  let r = new Date(e);
427
- return r.setDate(e.getDate() + n), G(r);
402
+ return r.setDate(e.getDate() + n), W(r);
428
403
  });
429
404
  }, [
430
405
  t,
@@ -444,13 +419,13 @@ function J({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
444
419
  };
445
420
  }, [r, m]), _ = e.useMemo(() => {
446
421
  let e = /* @__PURE__ */ new Map();
447
- for (let t of f) e.set(q(t), []);
422
+ for (let t of f) e.set(K(t), []);
448
423
  for (let t of h) {
449
- let n = G(new Date(t.start)), r = t.end ? new Date(t.end) : new Date(t.start), i = G(r);
424
+ let n = W(new Date(t.start)), r = t.end ? new Date(t.end) : new Date(t.start), i = W(r);
450
425
  r.getHours() === 0 && r.getMinutes() === 0 && r.getSeconds() === 0 && r.getTime() > n.getTime() && (i = new Date(i), i.setDate(i.getDate() - 1));
451
426
  for (let r of f) {
452
- let a = G(r);
453
- a < n || a > i || e.get(q(r)).push({
427
+ let a = W(r);
428
+ a < n || a > i || e.get(K(r)).push({
454
429
  event: t,
455
430
  isStart: a.getTime() === n.getTime(),
456
431
  isEnd: a.getTime() === i.getTime()
@@ -460,14 +435,14 @@ function J({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
460
435
  return e;
461
436
  }, [f, h]), v = e.useMemo(() => {
462
437
  let e = /* @__PURE__ */ new Map();
463
- for (let t of f) e.set(q(t), []);
438
+ for (let t of f) e.set(K(t), []);
464
439
  for (let t of g) {
465
440
  let n = new Date(t.start), r = t.end ? new Date(t.end) : new Date(n.getTime() + 3600 * 1e3);
466
441
  for (let i of f) {
467
- let a = G(i), o = new Date(a);
442
+ let a = W(i), o = new Date(a);
468
443
  if (o.setDate(o.getDate() + 1), r <= a || n >= o) continue;
469
- let s = n < a ? a : n, c = r > o ? o : r, l = K(s), u = c.getTime() === o.getTime() ? 1440 : K(c);
470
- e.get(q(i)).push({
444
+ let s = n < a ? a : n, c = r > o ? o : r, l = G(s), u = c.getTime() === o.getTime() ? 1440 : G(c);
445
+ e.get(K(i)).push({
471
446
  event: t,
472
447
  startMin: l,
473
448
  endMin: Math.max(u, l + 15),
@@ -510,7 +485,7 @@ function J({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
510
485
  let T = e.useRef(!1), E = e.useCallback((e, t) => {
511
486
  let n = x.current[t];
512
487
  if (!n) return 0;
513
- let r = (e - n.getBoundingClientRect().top + n.scrollTop) / W * 60, i = Math.round(r / a) * a;
488
+ let r = (e - n.getBoundingClientRect().top + n.scrollTop) / U * 60, i = Math.round(r / a) * a;
514
489
  return Math.max(0, Math.min(1440, i));
515
490
  }, [a]), D = e.useCallback((e) => {
516
491
  for (let t = 0; t < x.current.length; t++) {
@@ -597,7 +572,7 @@ function J({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
597
572
  weekday: e.toLocaleDateString(i, { weekday: "short" }),
598
573
  day: e.getDate(),
599
574
  month: e.toLocaleDateString(i, { month: "short" }),
600
- isToday: U(e, p)
575
+ isToday: he(e, p)
601
576
  })), [
602
577
  f,
603
578
  i,
@@ -643,13 +618,13 @@ function J({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
643
618
  return /* @__PURE__ */ L("div", {
644
619
  className: "absolute left-1 right-1 rounded bg-primary/30 border border-primary pointer-events-none z-10",
645
620
  style: {
646
- top: t / 60 * W,
647
- height: Math.max(u, (n - t) / 60 * W)
621
+ top: t / 60 * U,
622
+ height: Math.max(u, (n - t) / 60 * U)
648
623
  },
649
624
  "aria-hidden": !0,
650
625
  children: /* @__PURE__ */ L("div", {
651
626
  className: "px-2 py-0.5 text-xs font-medium text-primary",
652
- children: Y(f[e], t, n, i)
627
+ children: J(f[e], t, n, i)
653
628
  })
654
629
  });
655
630
  }
@@ -658,13 +633,13 @@ function J({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
658
633
  return /* @__PURE__ */ L("div", {
659
634
  className: "absolute left-1 right-1 rounded border-2 border-dashed border-primary bg-primary/10 pointer-events-none z-10",
660
635
  style: {
661
- top: n / 60 * W,
662
- height: S.durationMin / 60 * W
636
+ top: n / 60 * U,
637
+ height: S.durationMin / 60 * U
663
638
  },
664
639
  "aria-hidden": !0,
665
640
  children: /* @__PURE__ */ L("div", {
666
641
  className: "px-2 py-0.5 text-xs font-medium text-primary",
667
- children: Y(f[e], n, n + S.durationMin, i)
642
+ children: J(f[e], n, n + S.durationMin, i)
668
643
  })
669
644
  });
670
645
  }
@@ -673,13 +648,13 @@ function J({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
673
648
  return S.kind === "resize-top" ? (t = Math.min(S.anchorEndMin - a, Math.max(0, S.minutes)), n = S.anchorEndMin) : (t = S.anchorStartMin, n = Math.max(S.anchorStartMin + a, Math.min(1440, S.minutes))), /* @__PURE__ */ L("div", {
674
649
  className: "absolute left-1 right-1 rounded border-2 border-dashed border-primary bg-primary/10 pointer-events-none z-10",
675
650
  style: {
676
- top: t / 60 * W,
677
- height: (n - t) / 60 * W
651
+ top: t / 60 * U,
652
+ height: (n - t) / 60 * U
678
653
  },
679
654
  "aria-hidden": !0,
680
655
  children: /* @__PURE__ */ L("div", {
681
656
  className: "px-2 py-0.5 text-xs font-medium text-primary",
682
- children: Y(f[e], t, n, i)
657
+ children: J(f[e], t, n, i)
683
658
  })
684
659
  });
685
660
  }
@@ -712,7 +687,7 @@ function J({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
712
687
  className: "w-14 shrink-0 border-r flex items-start justify-end pr-1 pt-1 text-[10px] text-muted-foreground sticky left-0 bg-muted/20",
713
688
  children: l("calendar.allDay") === "calendar.allDay" ? "all-day" : l("calendar.allDay")
714
689
  }), f.map((e) => {
715
- let t = q(e);
690
+ let t = K(e);
716
691
  return /* @__PURE__ */ L("div", {
717
692
  className: "flex-1 border-r last:border-r-0 min-h-[28px] p-0.5 space-y-0.5",
718
693
  children: (_.get(t) ?? []).map(({ event: e, isStart: t, isEnd: n }, r) => {
@@ -740,11 +715,11 @@ function J({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
740
715
  className: "w-14 shrink-0 border-r relative",
741
716
  children: te.map((e, t) => /* @__PURE__ */ L("div", {
742
717
  className: "absolute right-1 text-[10px] text-muted-foreground -translate-y-1/2",
743
- style: { top: t * W },
718
+ style: { top: t * U },
744
719
  children: t === 0 ? "" : e
745
720
  }, t))
746
721
  }), f.map((e, t) => {
747
- let n = q(e), r = y.get(n) ?? [];
722
+ let n = K(e), r = y.get(n) ?? [];
748
723
  return /* @__PURE__ */ R("div", {
749
724
  ref: (e) => {
750
725
  x.current[t] = e;
@@ -761,17 +736,17 @@ function J({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
761
736
  children: [
762
737
  Array.from({ length: 24 }, (e, t) => /* @__PURE__ */ L("div", {
763
738
  className: "absolute left-0 right-0 border-t border-muted/60 pointer-events-none",
764
- style: { top: t * W }
739
+ style: { top: t * U }
765
740
  }, t)),
766
741
  a < 60 && Array.from({ length: Math.floor(1440 / a) }, (e, t) => {
767
742
  let n = t * a;
768
743
  return n % 60 == 0 ? null : /* @__PURE__ */ L("div", {
769
744
  className: "absolute left-0 right-0 border-t border-dashed border-muted/30 pointer-events-none",
770
- style: { top: n / 60 * W }
745
+ style: { top: n / 60 * U }
771
746
  }, t);
772
747
  }),
773
748
  r.map((n) => {
774
- let r = n.startMin / 60 * W, a = Math.max(u, (n.endMin - n.startMin) / 60 * W), c = 100 / n.cols, l = n.col * c, { className: d, inlineColor: f } = B(n.event.color), p = S && S.eventId === n.event.id;
749
+ let r = n.startMin / 60 * U, a = Math.max(u, (n.endMin - n.startMin) / 60 * U), c = 100 / n.cols, l = n.col * c, { className: d, inlineColor: f } = B(n.event.color), p = S && S.eventId === n.event.id;
775
750
  return /* @__PURE__ */ R("div", {
776
751
  role: "button",
777
752
  tabIndex: 0,
@@ -800,7 +775,7 @@ function J({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
800
775
  }),
801
776
  /* @__PURE__ */ L("div", {
802
777
  className: "text-[10px] opacity-80 truncate",
803
- children: Y(e, n.startMin, n.endMin, i)
778
+ children: J(e, n.startMin, n.endMin, i)
804
779
  }),
805
780
  s && n.isStart && /* @__PURE__ */ L("div", {
806
781
  onPointerDown: (e) => O(e, n, t, "top"),
@@ -824,7 +799,7 @@ function J({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
824
799
  ]
825
800
  });
826
801
  }
827
- function Y(e, t, n, r) {
802
+ function J(e, t, n, r) {
828
803
  let i = new Date(e);
829
804
  i.setHours(0, Math.round(t), 0, 0);
830
805
  let a = new Date(e);
@@ -864,7 +839,7 @@ function ye(e) {
864
839
  allDayField: e.allDayField
865
840
  } : null;
866
841
  }
867
- var be = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventClick: _, onRowClick: v, onDateClick: y, onNavigate: x, onViewChange: O, onEventDrop: k, locale: A }) => {
842
+ var Y = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventClick: _, onRowClick: v, onDateClick: y, onNavigate: x, onViewChange: O, onEventDrop: k, locale: A }) => {
868
843
  let ne = m(), j = Array.isArray(h), [M, N] = o(j ? h : []), [re, P] = o(j ? g ?? !1 : !0), [F, le] = o(null), [z, ue] = o(null), [de, fe] = o(/* @__PURE__ */ new Date()), B = ae(), V = e.defaultView, [H, me] = o(() => {
869
844
  let e = V === "day" || !V;
870
845
  return typeof window < "u" && window.innerWidth < 768 && e ? "month" : V || "month";
@@ -872,19 +847,19 @@ var be = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEvent
872
847
  r(() => {
873
848
  B && H === "day" && (V === "day" || !V) && me("month");
874
849
  }, [B]);
875
- let [he, U] = o(0);
850
+ let [he, ge] = o(0);
876
851
  r(() => {
877
852
  if (!j && !(!t?.onMutation || !e.objectName)) return t.onMutation((t) => {
878
- t.resource === e.objectName && U((e) => e + 1);
853
+ t.resource === e.objectName && ge((e) => e + 1);
879
854
  });
880
855
  }, [
881
856
  t,
882
857
  e.objectName,
883
858
  j
884
859
  ]);
885
- let { ref: ge, isRefreshing: W, pullDistance: G } = oe({
860
+ let { ref: U, isRefreshing: W, pullDistance: G } = oe({
886
861
  onRefresh: n(async () => {
887
- U((e) => e + 1);
862
+ ge((e) => e + 1);
888
863
  }, []),
889
864
  enabled: !!t && !!e.objectName
890
865
  }), K = i(() => _e(e), [
@@ -1108,7 +1083,7 @@ var be = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEvent
1108
1083
  })
1109
1084
  })
1110
1085
  }) : q ? /* @__PURE__ */ R("div", {
1111
- ref: ge,
1086
+ ref: U,
1112
1087
  className: s,
1113
1088
  children: [
1114
1089
  G > 0 && /* @__PURE__ */ L("div", {
@@ -1400,15 +1375,15 @@ s.register("calendar-view", ({ schema: e, className: n, onAction: r, ...i }) =>
1400
1375
  });
1401
1376
  //#endregion
1402
1377
  //#region src/index.tsx
1403
- var X = ({ schema: e, ...t }) => {
1378
+ var be = ({ schema: e, ...t }) => {
1404
1379
  let { dataSource: n } = h() || {};
1405
- return /* @__PURE__ */ L(be, {
1380
+ return /* @__PURE__ */ L(Y, {
1406
1381
  schema: e,
1407
1382
  dataSource: n,
1408
1383
  ...t
1409
1384
  });
1410
1385
  };
1411
- s.register("object-calendar", X, {
1386
+ s.register("object-calendar", be, {
1412
1387
  namespace: "plugin-calendar",
1413
1388
  label: "Object Calendar",
1414
1389
  category: "view",
@@ -1423,7 +1398,7 @@ s.register("object-calendar", X, {
1423
1398
  label: "Calendar Config",
1424
1399
  description: "startDateField, endDateField, titleField, colorField"
1425
1400
  }]
1426
- }), s.register("calendar", X, {
1401
+ }), s.register("calendar", be, {
1427
1402
  namespace: "view",
1428
1403
  label: "Calendar View",
1429
1404
  category: "view",
@@ -1440,4 +1415,4 @@ s.register("object-calendar", X, {
1440
1415
  }]
1441
1416
  });
1442
1417
  //#endregion
1443
- export { pe as CalendarView, be as ObjectCalendar, X as ObjectCalendarRenderer };
1418
+ export { pe as CalendarView, Y as ObjectCalendar, be as ObjectCalendarRenderer };
@@ -1 +1 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("react"),require("@object-ui/core"),require("@object-ui/react"),require("lucide-react"),require("@object-ui/components"),require("@object-ui/i18n"),require("react/jsx-runtime"),require("@object-ui/mobile"),require("@object-ui/plugin-detail")):typeof define==`function`&&define.amd?define([`exports`,`react`,`@object-ui/core`,`@object-ui/react`,`lucide-react`,`@object-ui/components`,`@object-ui/i18n`,`react/jsx-runtime`,`@object-ui/mobile`,`@object-ui/plugin-detail`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginCalendar={},e.React,e.ObjectUICore,e.ObjectUIReact,e.LucideReact,e.ObjectUIComponents,e._object_ui_i18n,e.react_jsx_runtime,e._object_ui_mobile,e._object_ui_plugin_detail))})(this,function(e,t,n,r,i,a,o,s,c,l){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var u=Object.create,d=Object.defineProperty,f=Object.getOwnPropertyDescriptor,p=Object.getOwnPropertyNames,m=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty,g=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=p(t),a=0,o=i.length,s;a<o;a++)s=i[a],!h.call(e,s)&&s!==n&&d(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=f(t,s))||r.enumerable});return e};t=((e,t,n)=>(n=e==null?{}:u(m(e)),g(t||!e||!e.__esModule?d(n,`default`,{value:e,enumerable:!0}):n,e)))(t,1);var _=`bg-blue-100 text-blue-900 border border-blue-200`,v=new Date,y=[`bg-blue-100 text-blue-900 border border-blue-200`,`bg-emerald-100 text-emerald-900 border border-emerald-200`,`bg-amber-100 text-amber-900 border border-amber-200`,`bg-rose-100 text-rose-900 border border-rose-200`,`bg-violet-100 text-violet-900 border border-violet-200`,`bg-cyan-100 text-cyan-900 border border-cyan-200`,`bg-orange-100 text-orange-900 border border-orange-200`,`bg-fuchsia-100 text-fuchsia-900 border border-fuchsia-200`],b=/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i,x=/(^|\s)(bg|text|from|to|via)-/;function S(e){if(!e)return{className:_};if(b.test(e))return{className:`text-white`,inlineColor:e};if(x.test(e))return{className:e};let t=0;for(let n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n)|0;return{className:y[Math.abs(t)%y.length]}}var C={"calendar.today":`Today`,"calendar.month":`Month`,"calendar.week":`Week`,"calendar.day":`Day`,"calendar.newEvent":`New event`,"calendar.moreEvents":`+{{count}} more`,"calendar.allDay":`all-day`};function w(){try{let e=(0,o.useObjectTranslation)();return e.t(`calendar.today`)===`calendar.today`?{t:(e,t)=>{let n=C[e]||e;if(t)for(let[e,r]of Object.entries(t))n=n.replace(`{{${e}}}`,String(r));return n},language:`en`}:{t:e.t,language:e.language}}catch{return{t:(e,t)=>{let n=C[e]||e;if(t)for(let[e,r]of Object.entries(t))n=n.replace(`{{${e}}}`,String(r));return n},language:`en`}}}function T({events:e=[],view:n=`month`,currentDate:r=v,locale:o=`default`,onEventClick:c,onDateClick:l,onViewChange:u,onNavigate:d,onAddClick:f,onEventDrop:p,onTimeRangeSelect:m,slotMinutes:h=30,className:g}){let[_,y]=t.useState(n),[b,x]=t.useState(r),{t:S,language:C}=w(),T=o==="default"?C:o;t.useEffect(()=>{x(r)},[r]),t.useEffect(()=>{y(n)},[n]);let D=t.useRef(u);D.current=u,t.useEffect(()=>{let e=window.matchMedia(`(max-width: 639px)`),t=e=>{e.matches&&(y(`day`),D.current?.(`day`))};return t(e),e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]);let O=()=>{let e=new Date(b);_===`month`?e.setMonth(e.getMonth()-1):_===`week`?e.setDate(e.getDate()-7):e.setDate(e.getDate()-1),x(e),d?.(e)},A=()=>{let e=new Date(b);_===`month`?e.setMonth(e.getMonth()+1):_===`week`?e.setDate(e.getDate()+7):e.setDate(e.getDate()+1),x(e),d?.(e)},j=()=>{let e=new Date;x(e),d?.(e)},M=e=>{y(e),u?.(e)},N=()=>{if(_===`month`)return b.toLocaleDateString(T,{month:`long`,year:`numeric`});if(_===`week`){let e=E(b),t=new Date(e);return t.setDate(t.getDate()+6),`${e.toLocaleDateString(T,{month:`short`,day:`numeric`})} - ${t.toLocaleDateString(T,{month:`short`,day:`numeric`,year:`numeric`})}`}else return b.toLocaleDateString(T,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`})},F=t.useRef(0);return(0,s.jsxs)(`div`,{role:`region`,"aria-label":`Calendar`,className:(0,a.cn)(`flex flex-col h-full bg-background min-w-0 overflow-hidden`,g),children:[(0,s.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 p-2 sm:p-4 border-b min-w-0`,children:[(0,s.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,s.jsxs)(`div`,{className:`flex items-center bg-muted/50 rounded-lg p-1 gap-1`,children:[(0,s.jsx)(a.Button,{variant:`ghost`,size:`sm`,onClick:j,className:`h-8`,"aria-label":`Go to today`,children:S(`calendar.today`)}),(0,s.jsx)(`div`,{className:`h-4 w-px bg-border mx-1`}),(0,s.jsx)(a.Button,{variant:`ghost`,size:`icon`,"aria-label":`Previous period`,onClick:O,className:`h-8 w-8`,children:(0,s.jsx)(i.ChevronLeftIcon,{className:`h-4 w-4`})}),(0,s.jsx)(a.Button,{variant:`ghost`,size:`icon`,"aria-label":`Next period`,onClick:A,className:`h-8 w-8`,children:(0,s.jsx)(i.ChevronRightIcon,{className:`h-4 w-4`})})]}),(0,s.jsxs)(a.Popover,{children:[(0,s.jsx)(a.PopoverTrigger,{asChild:!0,children:(0,s.jsxs)(a.Button,{variant:`ghost`,"aria-label":`Current date: ${N()}`,className:(0,a.cn)(`text-base sm:text-xl font-semibold h-auto px-2 sm:px-3 py-1 hover:bg-muted/50 transition-colors`,`flex items-center gap-2`),children:[(0,s.jsx)(i.CalendarIcon,{className:`h-5 w-5 text-muted-foreground`}),(0,s.jsx)(`span`,{children:N()})]})}),(0,s.jsx)(a.PopoverContent,{className:`w-auto p-0`,align:`start`,children:(0,s.jsx)(a.Calendar,{mode:`single`,selected:b,onSelect:e=>{e&&(x(e),d?.(e))},autoFocus:!0,startMonth:new Date(2e3,0),endMonth:new Date(2050,11)})})]})]}),(0,s.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,s.jsxs)(a.Select,{value:_,onValueChange:M,children:[(0,s.jsx)(a.SelectTrigger,{className:`w-32 bg-background`,children:(0,s.jsx)(a.SelectValue,{})}),(0,s.jsxs)(a.SelectContent,{children:[(0,s.jsx)(a.SelectItem,{value:`day`,children:S(`calendar.day`)}),(0,s.jsx)(a.SelectItem,{value:`week`,children:S(`calendar.week`)}),(0,s.jsx)(a.SelectItem,{value:`month`,children:S(`calendar.month`)})]})]}),f&&(0,s.jsxs)(a.Button,{onClick:f,size:`sm`,className:`gap-1`,children:[(0,s.jsx)(i.PlusIcon,{className:`h-4 w-4`}),S(`calendar.newEvent`)]})]})]}),(0,s.jsxs)(`div`,{className:`flex-1 overflow-auto`,onTouchStart:e=>{F.current=e.touches[0].clientX},onTouchEnd:e=>{let t=F.current-e.changedTouches[0].clientX;if(Math.abs(t)>50){let e=new Date(b);_===`day`?e.setDate(e.getDate()+(t>0?1:-1)):_===`week`?e.setDate(e.getDate()+(t>0?7:-7)):e.setMonth(e.getMonth()+(t>0?1:-1)),x(e),d?.(e)}},children:[_===`month`&&(0,s.jsx)(k,{date:b,events:e,locale:T,onEventClick:c,onDateClick:l,onEventDrop:p}),_===`week`&&(0,s.jsx)(P,{mode:`week`,date:b,events:e,locale:T,slotMinutes:h,onEventClick:c,onEventDrop:p,onTimeRangeSelect:m}),_===`day`&&(0,s.jsx)(P,{mode:`day`,date:b,events:e,locale:T,slotMinutes:h,onEventClick:c,onEventDrop:p,onTimeRangeSelect:m})]})]})}function E(e){let t=new Date(e),n=t.getDay(),r=t.getDate()-n;return t.setDate(r),t}function D(e){let t=e.getFullYear(),n=e.getMonth(),r=new Date(t,n,1),i=new Date(t,n+1,0),a=r.getDay(),o=[];for(let e=a-1;e>=0;e--){let t=new Date(r.getTime());t.setDate(t.getDate()-(e+1)),o.push(t)}for(let e=1;e<=i.getDate();e++)o.push(new Date(t,n,e));let s=42-o.length;for(let e=1;e<=s;e++){let t=new Date(i.getTime());t.setDate(t.getDate()+e),o.push(t)}return o}function O(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function k({date:e,events:n,locale:r=`default`,onEventClick:i,onDateClick:o,onEventDrop:c}){let l=t.useMemo(()=>D(e),[e.getFullYear(),e.getMonth()]),u=t.useMemo(()=>new Date,[]),{t:d}=w(),f=t.useMemo(()=>{let e=new Date(2024,0,7);return Array.from({length:7},(t,n)=>{let i=new Date(e);return i.setDate(i.getDate()+n),i.toLocaleDateString(r,{weekday:`short`})})},[r]),[p,m]=t.useState(null),[h,g]=t.useState(null),_=t.useMemo(()=>{let e=new Map;for(let t of n){let n=new Date(t.start),r=t.end?new Date(t.end):new Date(n);n.setHours(0,0,0,0),r.setHours(0,0,0,0);let i=new Date(n);for(;i<=r;){let a=`${i.getFullYear()}-${i.getMonth()}-${i.getDate()}`,o=i.getTime()===n.getTime(),s=i.getTime()===r.getTime(),c=o||s||i.getDay()===0,l=e.get(a),u={event:t,isTitleDay:c,isSpanStart:o,isSpanEnd:s};l?l.push(u):e.set(a,[u]),i.setDate(i.getDate()+1)}}return e},[n]),v=(e,t,n=`move`,r)=>{m(t.id),e.dataTransfer.effectAllowed=`move`;let i={id:t.id,mode:n,...r?{sourceDay:`${r.getFullYear()}-${r.getMonth()}-${r.getDate()}`}:{}};e.dataTransfer.setData(`text/plain`,JSON.stringify(i)),n===`resize-end`&&e.stopPropagation()},y=()=>{m(null),g(null)},b=(e,t)=>{e.preventDefault(),e.dataTransfer.dropEffect=`move`,g(t)},x=e=>{e.currentTarget.contains(e.relatedTarget)||g(null)},C=(e,t)=>{if(e.preventDefault(),g(null),m(null),!c)return;let r=e.dataTransfer.getData(`text/plain`),i;try{i=JSON.parse(r)}catch{i={id:r,mode:`move`}}let a=n.find(e=>String(e.id)===String(i.id));if(!a)return;let o=new Date(t);if(o.setHours(0,0,0,0),i.mode===`resize-end`){let e=a.end?new Date(a.end):new Date(a.start),t=new Date(e);if(t.setHours(0,0,0,0),o.getTime()===t.getTime())return;let n=new Date(a.start);if(n.setHours(0,0,0,0),o.getTime()<n.getTime())return;let r=new Date(o);r.setHours(e.getHours(),e.getMinutes(),e.getSeconds(),0),c(a,new Date(a.start),r);return}let s=new Date(a.start),l;if(i.sourceDay){let[e,t,n]=i.sourceDay.split(`-`).map(e=>parseInt(e,10));l=new Date(e,t,n)}else l=new Date(s);l.setHours(0,0,0,0);let u=o.getTime()-l.getTime();if(u===0)return;let d=new Date(s.getTime()+u),f;a.end&&(f=new Date(new Date(a.end).getTime()+u)),c(a,d,f)};return(0,s.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,s.jsx)(`div`,{role:`row`,className:`grid grid-cols-7 border-b`,children:f.map(e=>(0,s.jsx)(`div`,{role:`columnheader`,className:`p-2 text-center text-sm font-medium text-muted-foreground border-r last:border-r-0`,children:e},e))}),(0,s.jsx)(`div`,{role:`grid`,"aria-label":`Calendar grid`,className:`grid grid-cols-7 flex-1 auto-rows-fr`,children:l.map((t,n)=>{let r=`${t.getFullYear()}-${t.getMonth()}-${t.getDate()}`,l=_.get(r)||[],f=t.getMonth()===e.getMonth(),m=O(t,u);return(0,s.jsxs)(`div`,{role:`gridcell`,"aria-label":`${t.toLocaleDateString(`default`,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`})}${l.length>0?`, ${l.length} event${l.length>1?`s`:``}`:``}`,className:(0,a.cn)(`border-b border-r last:border-r-0 p-2 min-h-[100px] cursor-pointer hover:bg-accent/50`,!f&&`bg-muted/50 text-muted-foreground opacity-50`,h===n&&`ring-2 ring-primary`),onClick:()=>o?.(t),onDragOver:e=>b(e,n),onDragLeave:x,onDrop:e=>C(e,t),children:[(0,s.jsx)(`div`,{className:(0,a.cn)(`text-sm font-medium mb-2`,m&&`inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground h-6 w-6`),...m?{"aria-current":`date`}:{},children:t.getDate()}),(0,s.jsxs)(`div`,{className:`space-y-0.5`,children:[l.slice(0,4).map(({event:e,isTitleDay:n,isSpanStart:r,isSpanEnd:o},l)=>{let u=!n,{className:d,inlineColor:f}=S(e.color),m=!!c&&o;return(0,s.jsxs)(`div`,{role:`button`,title:e.title,"aria-label":e.title,draggable:!!c,onDragStart:n=>v(n,e,`move`,t),onDragEnd:y,className:(0,a.cn)(`relative text-xs hover:opacity-80 truncate`,c?`cursor-move`:`cursor-pointer`,u?`h-1.5`:`px-2 py-0.5`,r?`rounded-l`:`rounded-l-none`,o?`rounded-r`:`rounded-r-none`,!o&&`-mr-2`,d,p===e.id&&`opacity-50`),style:f?{backgroundColor:f}:void 0,onClick:t=>{t.stopPropagation(),i?.(e)},children:[u?``:e.title,m&&(0,s.jsx)(`span`,{role:`separator`,"aria-label":`Resize event end`,title:`Drag to change end date`,draggable:!0,onDragStart:n=>v(n,e,`resize-end`,t),onDragEnd:y,onClick:e=>e.stopPropagation(),className:`absolute inset-y-0 right-0 w-2 cursor-ew-resize bg-black/25 hover:bg-black/50 rounded-r`})]},`${e.id}-${l}`)}),l.length>4&&(0,s.jsx)(`div`,{className:`text-xs text-muted-foreground px-2`,children:d(`calendar.moreEvents`,{count:l.length-4})})]})]},n)})})]})}var A=48;function j(e){let t=new Date(e);return t.setHours(0,0,0,0),t}function M(e){return e.getHours()*60+e.getMinutes()}function N(e){return`${e.getFullYear()}-${e.getMonth()}-${e.getDate()}`}function P({mode:e,date:n,events:r,locale:i=`default`,slotMinutes:o=30,onEventClick:c,onEventDrop:l,onTimeRangeSelect:u}){let{t:d}=w(),f=A*o/60,p=A*24,m=t.useMemo(()=>{if(e===`day`)return[j(n)];let t=E(n);return Array.from({length:7},(e,n)=>{let r=new Date(t);return r.setDate(t.getDate()+n),j(r)})},[e,n.getFullYear(),n.getMonth(),n.getDate()]),h=t.useMemo(()=>new Date,[]),g=t.useCallback(e=>{if(e.allDay)return!0;let t=new Date(e.start),n=e.end?new Date(e.end):new Date(t),r=t.getHours()===0&&t.getMinutes()===0&&t.getSeconds()===0,i=n.getHours()===0&&n.getMinutes()===0&&n.getSeconds()===0,a=n.getTime()-t.getTime();return!!(r&&i||a>=1440*60*1e3)},[]),{allDayEvents:_,timedEvents:v}=t.useMemo(()=>{let e=[],t=[];for(let n of r)g(n)?e.push(n):t.push(n);return{allDayEvents:e,timedEvents:t}},[r,g]),y=t.useMemo(()=>{let e=new Map;for(let t of m)e.set(N(t),[]);for(let t of _){let n=j(new Date(t.start)),r=t.end?new Date(t.end):new Date(t.start),i=j(r);r.getHours()===0&&r.getMinutes()===0&&r.getSeconds()===0&&r.getTime()>n.getTime()&&(i=new Date(i),i.setDate(i.getDate()-1));for(let r of m){let a=j(r);a<n||a>i||e.get(N(r)).push({event:t,isStart:a.getTime()===n.getTime(),isEnd:a.getTime()===i.getTime()})}}return e},[m,_]),b=t.useMemo(()=>{let e=new Map;for(let t of m)e.set(N(t),[]);for(let t of v){let n=new Date(t.start),r=t.end?new Date(t.end):new Date(n.getTime()+3600*1e3);for(let i of m){let a=j(i),o=new Date(a);if(o.setDate(o.getDate()+1),r<=a||n>=o)continue;let s=n<a?a:n,c=r>o?o:r,l=M(s),u=c.getTime()===o.getTime()?1440:M(c);e.get(N(i)).push({event:t,startMin:l,endMin:Math.max(u,l+15),isStart:s.getTime()===n.getTime(),isEnd:c.getTime()===r.getTime()})}}return e},[m,v]),x=t.useMemo(()=>{let e=new Map;for(let[t,n]of b){let r=[...n].sort((e,t)=>e.startMin-t.startMin||e.endMin-t.endMin),i=[],a=[],o=[];for(let e of r){let t=0;for(;i[t]&&i[t].endMin>e.startMin;)t++;i[t]={endMin:e.endMin},a.push({entry:e,col:t})}for(let e=0;e<a.length;e++){let t=a[e],n=t.col;for(let r=0;r<a.length;r++){if(r===e)continue;let i=a[r];i.entry.startMin<t.entry.endMin&&i.entry.endMin>t.entry.startMin&&i.col>n&&(n=i.col)}o.push({...t.entry,col:t.col,cols:n+1})}e.set(t,o)}return e},[b]),C=t.useRef(null),T=t.useRef([]),[D,k]=t.useState(null),P=t.useRef(null);P.current=D;let I=t.useRef(!1),L=t.useCallback((e,t)=>{let n=T.current[t];if(!n)return 0;let r=(e-n.getBoundingClientRect().top+n.scrollTop)/A*60,i=Math.round(r/o)*o;return Math.max(0,Math.min(1440,i))},[o]),R=t.useCallback(e=>{for(let t=0;t<T.current.length;t++){let n=T.current[t];if(!n)continue;let r=n.getBoundingClientRect();if(e>=r.left&&e<=r.right)return t}return-1},[]);t.useEffect(()=>{if(!D)return;let e=e=>{let t=D.kind===`select`||D.kind===`move`?R(e.clientX):D.dayIndex,n=t<0?D.dayIndex??0:t,r=L(e.clientY,n);k(e=>e&&(e.kind===`select`?{...e,dayIndex:n>=0?n:e.dayIndex,headMinutes:r}:e.kind===`move`?{...e,dayIndex:n,minutes:r}:{...e,minutes:r}))},t=e=>{let t=P.current;if(!t){k(null);return}try{if(t.kind===`select`&&u){let e=Math.min(t.anchorMinutes,t.headMinutes),n=Math.max(t.anchorMinutes,t.headMinutes),r=e,i=n===e?Math.min(1440,e+o):n,a=m[t.dayIndex]??m[0],s=new Date(a);s.setHours(0,Math.round(r),0,0);let c=new Date(a);c.setHours(0,Math.round(i),0,0),I.current=!0,u(s,c)}else if(t.kind===`move`&&l){let e=r.find(e=>String(e.id)===String(t.eventId));if(e){let n=t.dayIndex<0?0:t.dayIndex,r=t.minutes-t.grabMinuteOffset,i=Math.max(0,Math.min(1440-t.durationMin,Math.round(r/o)*o)),a=m[n]??m[0],s=new Date(a);s.setHours(0,i,0,0);let c=new Date(s.getTime()+t.durationMin*60*1e3);I.current=!0,l(e,s,c)}}else if(t.kind===`resize-top`&&l){let e=r.find(e=>String(e.id)===String(t.eventId));if(e){let n=m[t.dayIndex]??m[0],r=Math.min(t.anchorEndMin-o,Math.max(0,t.minutes)),i=new Date(n);i.setHours(0,r,0,0);let a=new Date(n);a.setHours(0,t.anchorEndMin,0,0),I.current=!0,l(e,i,a)}}else if(t.kind===`resize-bottom`&&l){let e=r.find(e=>String(e.id)===String(t.eventId));if(e){let n=m[t.dayIndex]??m[0],r=Math.max(t.anchorStartMin+o,Math.min(1440,t.minutes)),i=new Date(n);i.setHours(0,t.anchorStartMin,0,0);let a=new Date(n);a.setHours(0,r,0,0),I.current=!0,l(e,i,a)}}}finally{k(null),setTimeout(()=>{I.current=!1},50)}};return window.addEventListener(`pointermove`,e),window.addEventListener(`pointerup`,t),()=>{window.removeEventListener(`pointermove`,e),window.removeEventListener(`pointerup`,t)}},[D,m,r,o,l,u,R,L]);let z=t.useMemo(()=>m.map(e=>({weekday:e.toLocaleDateString(i,{weekday:`short`}),day:e.getDate(),month:e.toLocaleDateString(i,{month:`short`}),isToday:O(e,h)})),[m,i,h]),B=t.useMemo(()=>Array.from({length:24},(e,t)=>new Date(2024,0,1,t,0).toLocaleTimeString(i,{hour:`numeric`})),[i]),V=(e,t,n,r)=>{if(!l||e.button!==0)return;e.stopPropagation(),e.preventDefault();let i=L(e.clientY,n);k(r===`body`?{kind:`move`,eventId:t.event.id,grabMinuteOffset:Math.max(0,i-t.startMin),durationMin:t.endMin-t.startMin,dayIndex:n,minutes:i}:r===`top`?{kind:`resize-top`,eventId:t.event.id,anchorEndMin:t.endMin,dayIndex:n,minutes:i}:{kind:`resize-bottom`,eventId:t.event.id,anchorStartMin:t.startMin,dayIndex:n,minutes:i})},H=(e,t)=>{if(!u||e.button!==0)return;e.preventDefault();let n=L(e.clientY,t);k({kind:`select`,dayIndex:t,anchorMinutes:n,headMinutes:n})},U=e=>{if(!D)return null;if(D.kind===`select`&&D.dayIndex===e){let t=Math.min(D.anchorMinutes,D.headMinutes),n=Math.max(D.anchorMinutes,D.headMinutes);return(0,s.jsx)(`div`,{className:`absolute left-1 right-1 rounded bg-primary/30 border border-primary pointer-events-none z-10`,style:{top:t/60*A,height:Math.max(f,(n-t)/60*A)},"aria-hidden":!0,children:(0,s.jsx)(`div`,{className:`px-2 py-0.5 text-xs font-medium text-primary`,children:F(m[e],t,n,i)})})}if(D.kind===`move`&&D.dayIndex===e){let t=D.minutes-D.grabMinuteOffset,n=Math.max(0,Math.min(1440-D.durationMin,Math.round(t/o)*o));return(0,s.jsx)(`div`,{className:`absolute left-1 right-1 rounded border-2 border-dashed border-primary bg-primary/10 pointer-events-none z-10`,style:{top:n/60*A,height:D.durationMin/60*A},"aria-hidden":!0,children:(0,s.jsx)(`div`,{className:`px-2 py-0.5 text-xs font-medium text-primary`,children:F(m[e],n,n+D.durationMin,i)})})}if((D.kind===`resize-top`||D.kind===`resize-bottom`)&&D.dayIndex===e){let t,n;return D.kind===`resize-top`?(t=Math.min(D.anchorEndMin-o,Math.max(0,D.minutes)),n=D.anchorEndMin):(t=D.anchorStartMin,n=Math.max(D.anchorStartMin+o,Math.min(1440,D.minutes))),(0,s.jsx)(`div`,{className:`absolute left-1 right-1 rounded border-2 border-dashed border-primary bg-primary/10 pointer-events-none z-10`,style:{top:t/60*A,height:(n-t)/60*A},"aria-hidden":!0,children:(0,s.jsx)(`div`,{className:`px-2 py-0.5 text-xs font-medium text-primary`,children:F(m[e],t,n,i)})})}return null};return(0,s.jsxs)(`div`,{className:`flex flex-col h-full`,ref:C,children:[(0,s.jsxs)(`div`,{className:`flex border-b sticky top-0 bg-background z-20`,children:[(0,s.jsx)(`div`,{className:`w-14 shrink-0 border-r`,"aria-hidden":!0}),z.map((e,t)=>(0,s.jsxs)(`div`,{role:`columnheader`,className:(0,a.cn)(`flex-1 p-2 text-center text-sm border-r last:border-r-0`,e.isToday&&`bg-primary/5`),children:[(0,s.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:e.weekday}),(0,s.jsx)(`div`,{className:(0,a.cn)(`font-medium`,e.isToday&&`inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground h-6 w-6 mx-auto`),children:e.day})]},t))]}),_.length>0&&(0,s.jsxs)(`div`,{className:`flex border-b bg-muted/20 max-h-[140px] overflow-y-auto`,children:[(0,s.jsx)(`div`,{className:`w-14 shrink-0 border-r flex items-start justify-end pr-1 pt-1 text-[10px] text-muted-foreground sticky left-0 bg-muted/20`,children:d(`calendar.allDay`)===`calendar.allDay`?`all-day`:d(`calendar.allDay`)}),m.map(e=>{let t=N(e);return(0,s.jsx)(`div`,{className:`flex-1 border-r last:border-r-0 min-h-[28px] p-0.5 space-y-0.5`,children:(y.get(t)??[]).map(({event:e,isStart:t,isEnd:n},r)=>{let{className:i,inlineColor:o}=S(e.color);return(0,s.jsx)(`div`,{role:`button`,title:e.title,onClick:t=>{t.stopPropagation(),c?.(e)},className:(0,a.cn)(`text-[11px] px-2 py-0.5 truncate cursor-pointer hover:opacity-80`,t?`rounded-l`:`rounded-l-none -ml-0.5`,n?`rounded-r`:`rounded-r-none -mr-0.5`,i),style:o?{backgroundColor:o}:void 0,children:t?e.title:`\xA0`},`${e.id}-${r}`)})},t)})]}),(0,s.jsx)(`div`,{className:`flex-1 overflow-auto`,children:(0,s.jsxs)(`div`,{className:`flex`,style:{height:p},children:[(0,s.jsx)(`div`,{className:`w-14 shrink-0 border-r relative`,children:B.map((e,t)=>(0,s.jsx)(`div`,{className:`absolute right-1 text-[10px] text-muted-foreground -translate-y-1/2`,style:{top:t*A},children:t===0?``:e},t))}),m.map((e,t)=>{let n=N(e),r=x.get(n)??[];return(0,s.jsxs)(`div`,{ref:e=>{T.current[t]=e},className:`flex-1 border-r last:border-r-0 relative select-none`,style:{height:p},onPointerDown:e=>H(e,t),"aria-label":e.toLocaleDateString(i,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`}),children:[Array.from({length:24},(e,t)=>(0,s.jsx)(`div`,{className:`absolute left-0 right-0 border-t border-muted/60 pointer-events-none`,style:{top:t*A}},t)),o<60&&Array.from({length:Math.floor(1440/o)},(e,t)=>{let n=t*o;return n%60==0?null:(0,s.jsx)(`div`,{className:`absolute left-0 right-0 border-t border-dashed border-muted/30 pointer-events-none`,style:{top:n/60*A}},t)}),r.map(n=>{let r=n.startMin/60*A,o=Math.max(f,(n.endMin-n.startMin)/60*A),u=100/n.cols,d=n.col*u,{className:p,inlineColor:m}=S(n.event.color),h=D&&D.eventId===n.event.id;return(0,s.jsxs)(`div`,{role:`button`,tabIndex:0,title:n.event.title,"aria-label":n.event.title,onPointerDown:e=>V(e,n,t,`body`),onClick:e=>{if(I.current){e.stopPropagation();return}e.stopPropagation(),c?.(n.event)},className:(0,a.cn)(`absolute rounded text-xs px-2 py-1 overflow-hidden shadow-sm`,l?`cursor-move`:`cursor-pointer`,p,h&&`opacity-40`),style:{top:r,height:o,left:`calc(${d}% + 2px)`,width:`calc(${u}% - 4px)`,...m?{backgroundColor:m}:{}},children:[(0,s.jsx)(`div`,{className:`font-medium truncate`,children:n.event.title}),(0,s.jsx)(`div`,{className:`text-[10px] opacity-80 truncate`,children:F(e,n.startMin,n.endMin,i)}),l&&n.isStart&&(0,s.jsx)(`div`,{onPointerDown:e=>V(e,n,t,`top`),className:`absolute top-0 left-0 right-0 h-1.5 cursor-ns-resize`,"aria-label":`Resize start`}),l&&n.isEnd&&(0,s.jsx)(`div`,{onPointerDown:e=>V(e,n,t,`bottom`),className:`absolute bottom-0 left-0 right-0 h-1.5 cursor-ns-resize`,"aria-label":`Resize end`})]},`${n.event.id}-${n.startMin}`)}),U(t)]},n)})]})})]})}function F(e,t,n,r){let i=new Date(e);i.setHours(0,Math.round(t),0,0);let a=new Date(e);a.setHours(0,Math.round(n),0,0);let o=e=>e.toLocaleTimeString(r,{hour:`numeric`,minute:`2-digit`});return`${o(i)} – ${o(a)}`}function I(e){return`data`in e&&e.data?e.data:`staticData`in e&&e.staticData?{provider:`value`,items:e.staticData}:e.objectName?{provider:`object`,object:e.objectName}:null}function L(e){if(e){if(typeof e==`string`){let t=e.split(` `),n=t[0],r=t[1]?.toLowerCase()===`desc`?`desc`:`asc`;return{[n]:r}}if(Array.isArray(e))return e.reduce((e,t)=>(t.field&&t.order&&(e[t.field]=t.order),e),{})}}function R(e){return`filter`in e&&e.filter&&typeof e.filter==`object`&&`calendar`in e.filter?e.filter.calendar:e.calendar?e.calendar:e.startDateField||e.dateField?{startDateField:e.startDateField||e.dateField,endDateField:e.endDateField||e.endField,titleField:e.titleField,colorField:e.colorField,allDayField:e.allDayField}:null}var z=({schema:e,dataSource:i,className:o,data:u,loading:d,onEventClick:f,onRowClick:p,onDateClick:m,onNavigate:h,onViewChange:g,onEventDrop:_,locale:v})=>{let y=(0,r.useSafeTranslate)(),b=Array.isArray(u),[x,S]=(0,t.useState)(b?u:[]),[C,w]=(0,t.useState)(b?d??!1:!0),[E,D]=(0,t.useState)(null),[O,k]=(0,t.useState)(null),[A,j]=(0,t.useState)(new Date),M=(0,a.useIsMobile)(),N=e.defaultView,[P,F]=(0,t.useState)(()=>{let e=N===`day`||!N;return typeof window<`u`&&window.innerWidth<768&&e?`month`:N||`month`});(0,t.useEffect)(()=>{M&&P===`day`&&(N===`day`||!N)&&F(`month`)},[M]);let[z,B]=(0,t.useState)(0);(0,t.useEffect)(()=>{if(!b&&!(!i?.onMutation||!e.objectName))return i.onMutation(t=>{t.resource===e.objectName&&B(e=>e+1)})},[i,e.objectName,b]);let{ref:V,isRefreshing:H,pullDistance:U}=(0,c.usePullToRefresh)({onRefresh:(0,t.useCallback)(async()=>{B(e=>e+1)},[]),enabled:!!i&&!!e.objectName}),W=(0,t.useMemo)(()=>I(e),[e.data,e.staticData,e.objectName]),G=(0,t.useMemo)(()=>R(e),[e.filter,e.calendar,e.dateField,e.endField,e.titleField,e.colorField]),K=W?.provider===`value`,q=(0,t.useRef)(null);q.current=O,(0,t.useEffect)(()=>{b&&S(u)},[u,b]),(0,t.useEffect)(()=>{b&&d!==void 0&&w(d)},[d,b]),(0,t.useEffect)(()=>{if(b)return;let t=!0;return(async()=>{try{if(!t)return;if(w(!0),K&&W?.provider===`value`){t&&(S(W.items),w(!1));return}if(!i||typeof i.find!=`function`)throw Error(`DataSource required for object/api providers`);if(W?.provider===`object`){let r=W.object,a=(0,n.buildExpandFields)(q.current?.fields),o=(0,n.extractRecords)(await i.find(r,{$filter:e.filter,$orderby:L(e.sort),...a.length>0?{$expand:a}:{}}));t&&S(o)}else W?.provider===`api`&&(console.warn(`API provider not yet implemented for ObjectCalendar`),t&&S([]));t&&w(!1)}catch(e){console.error(`[ObjectCalendar] Error fetching data:`,e),t&&(D(e),w(!1))}})(),()=>{t=!1}},[b,W,i,K,e.filter,e.sort,z]),(0,t.useEffect)(()=>{!K&&i&&(async()=>{try{if(!i)return;let t=W?.provider===`object`?W.object:e.objectName;if(!t)return;let n=await i.getObjectSchema(t);k(n)}catch(e){console.error(`Failed to fetch object schema:`,e)}})()},[e.objectName,i,K,W]);let ee=(0,t.useMemo)(()=>{if(!G||!x.length)return[];let{startDateField:e,endDateField:t,titleField:r,colorField:i}=G,a=e=>{if(r){let t=e[r],n=typeof t==`string`?t.trim():t;if(n)return String(n)}return(0,n.getRecordDisplayName)(O,e)};return x.map((n,r)=>{let o=n[e],s=t?n[t]:null,c=a(n),l=i?n[i]:void 0;return{id:n.id||n._id||`event-${r}`,title:c,start:o?new Date(o):new Date,end:s?new Date(s):void 0,color:l,allDay:!s,data:n}}).filter(e=>!isNaN(e.start.getTime()))},[x,G,O]);(0,t.useCallback)(()=>{m?.(new Date)},[m]);let J=e.navigation??{mode:`drawer`,width:`min(960px, 60vw)`},Y=J.mode===`drawer`||J.mode===`modal`||J.mode===`split`||J.mode===`popover`,X=(0,r.useNavigationOverlay)({navigation:J,objectName:e.objectName,onRowClick:Y?void 0:p}),te=(0,t.useCallback)(async(t,n,o)=>{if(!G)return;let{startDateField:s,endDateField:c}=G,l=t?.id??t?._id;if(!l||!e.objectName||!i?.update)return;let u={[s]:n.toISOString()};c&&o&&(u[c]=o.toISOString());let d=x;S(e=>e.map(e=>(e?.id??e?._id)===l?{...e,...u}:e));try{await i.update(e.objectName,l,u)}catch(e){S(d),console.error(`[ObjectCalendar] Failed to persist drag-and-drop reschedule:`,e),a.toast.error((0,r.isPermissionError)(e)?y(`errors.unauthorized`,`You are not authorized to perform this action.`):(0,r.extractWriteErrorMessage)(e)??y(`table.saveFailed`,`Save failed`))}},[G,e.objectName,i,x,y]),[Z,Q]=(0,t.useState)(null),ne=(0,t.useCallback)(t=>{!G||!e.objectName||!i?.create||Q({start:t,title:``,submitting:!1})},[G,e.objectName,i]),re=(0,t.useCallback)((t,n)=>{!G||!e.objectName||!i?.create||Q({start:t,end:n,title:``,submitting:!1})},[G,e.objectName,i]),$=(0,t.useCallback)(async()=>{if(!Z||!G)return;let t=Z.title.trim();if(!t){Q(e=>e&&{...e,error:`Title is required`});return}if(!e.objectName||!i?.create)return;Q(e=>e&&{...e,submitting:!0,error:void 0});let{startDateField:n,endDateField:r,titleField:a}=G,o={[a||`name`]:t,[n]:Z.start.toISOString()};r&&(o[r]=(Z.end??Z.start).toISOString());let s=O?.fields;if(s&&typeof s==`object`){let e=Array.isArray(s)?s.map(e=>[e.name??e.apiName,e]):Object.entries(s);for(let[t,n]of e){if(!t||t in o||!n?.required)continue;if(n.defaultValue!==void 0&&n.defaultValue!==null){o[t]=n.defaultValue;continue}let e=n.type;if(e===`select`||e===`picklist`||e===`status`){let e=(n.options||n.choices||[])[0];e!==void 0&&(o[t]=typeof e==`object`?e.value??e.id:e)}else e===`boolean`||e===`checkbox`?o[t]=!1:(e===`number`||e===`integer`||e===`decimal`||e===`currency`||e===`percent`)&&(o[t]=0)}}try{let t=await i.create(e.objectName,o),n=(t&&(t.record||t.data||t))??null;n&&(n.id!==void 0||n._id!==void 0)&&S(e=>[...e,n]),Q(null)}catch(e){let t=e?.message||String(e);Q(e=>e&&{...e,submitting:!1,error:t}),console.error(`[ObjectCalendar] Quick-create failed:`,e)}},[Z,G,e.objectName,i,O]);return C?(0,s.jsx)(`div`,{className:o,children:(0,s.jsx)(`div`,{className:`flex items-center justify-center h-96`,children:(0,s.jsx)(`div`,{className:`text-muted-foreground`,children:`Loading calendar...`})})}):E?(0,s.jsx)(`div`,{className:o,children:(0,s.jsx)(`div`,{className:`flex items-center justify-center h-96`,children:(0,s.jsxs)(`div`,{className:`text-destructive`,children:[`Error: `,E.message]})})}):G?(0,s.jsxs)(`div`,{ref:V,className:o,children:[U>0&&(0,s.jsx)(`div`,{className:`flex items-center justify-center text-xs text-muted-foreground`,style:{height:U},children:H?`Refreshing…`:`Pull to refresh`}),(0,s.jsx)(`div`,{className:`bg-background h-[calc(100vh-120px)] sm:h-[calc(100vh-160px)] md:h-[calc(100vh-200px)] min-h-[400px] sm:min-h-[600px]`,children:(0,s.jsx)(T,{events:ee,currentDate:A,view:P,locale:v,onEventClick:e=>{X.handleClick(e.data),Y||f?.(e.data)},onDateClick:e=>{m?m(e):ne(e)},onNavigate:e=>{j(e),h?.(e)},onViewChange:e=>{F(e),g?.(e)},onAddClick:void 0,onEventDrop:(e,t,n)=>{_?_(e.data,t,n):te(e.data,t,n)},onTimeRangeSelect:re})}),(0,s.jsx)(a.Dialog,{open:!!Z,onOpenChange:e=>{e||Q(null)},children:(0,s.jsxs)(a.DialogContent,{className:`sm:max-w-md`,children:[(0,s.jsxs)(a.DialogHeader,{children:[(0,s.jsx)(a.DialogTitle,{children:`New event`}),(0,s.jsx)(a.DialogDescription,{children:Z&&(()=>{let e=Z.end&&Z.end.getTime()!==Z.start.getTime(),t=Z.start.toLocaleDateString(v,{year:`numeric`,month:`long`,day:`numeric`});if(e){let e=e=>e.toLocaleTimeString(v,{hour:`numeric`,minute:`2-digit`});return(0,s.jsxs)(s.Fragment,{children:[t,` · `,e(Z.start),` – `,e(Z.end)]})}return(0,s.jsxs)(s.Fragment,{children:[`On `,t]})})()})]}),(0,s.jsxs)(`div`,{className:`space-y-2`,children:[(0,s.jsx)(a.Label,{htmlFor:`quick-create-title`,children:`Title`}),(0,s.jsx)(a.Input,{id:`quick-create-title`,autoFocus:!0,value:Z?.title??``,onChange:e=>Q(t=>t&&{...t,title:e.target.value,error:void 0}),onKeyDown:e=>{e.key===`Enter`&&!Z?.submitting&&(e.preventDefault(),$())},placeholder:`What's this event about?`,disabled:Z?.submitting}),Z?.error&&(0,s.jsx)(`p`,{className:`text-sm text-destructive`,children:Z.error})]}),(0,s.jsxs)(a.DialogFooter,{children:[(0,s.jsx)(a.Button,{variant:`outline`,onClick:()=>Q(null),disabled:Z?.submitting,children:`Cancel`}),(0,s.jsx)(a.Button,{onClick:()=>void $(),disabled:Z?.submitting||!Z?.title.trim(),children:Z?.submitting?`Creating…`:`Create`})]})]})}),X.isOverlay&&X.isOpen&&X.selectedRecord&&(()=>{let t=W?.provider===`object`?W.object:e.objectName,n=X.selectedRecord,r=n.id??n._id;if(!t||r==null)return null;let a=G?.titleField?String(n[G.titleField]??`Event Details`):`Event Details`;return(0,s.jsx)(l.RecordDetailDrawer,{open:!0,onClose:X.close,title:a,record:n,objectName:t,recordId:r,dataSource:i,objectSchema:O,width:X.width??`min(960px, 60vw)`,fullPageHref:(0,l.deriveRecordPageHref)(t,r)??void 0,onFieldSave:async(e,n)=>{i?.update&&(await i.update(t,String(r),{[e]:n}),S(t=>t.map(t=>String(t.id??t._id)===String(r)?{...t,[e]:n}:t)))},onDelete:async()=>{i?.delete&&(await i.delete(t,String(r)),S(e=>e.filter(e=>String(e.id??e._id)!==String(r))))}})})()]}):(0,s.jsx)(`div`,{className:o,children:(0,s.jsx)(`div`,{className:`flex items-center justify-center h-96`,children:(0,s.jsx)(`div`,{className:`text-muted-foreground`,children:`Calendar configuration required. Please specify startDateField and titleField.`})})})};n.ComponentRegistry.register(`calendar-view`,({schema:e,className:n,onAction:r,...i})=>{let a=t.default.useMemo(()=>!e.data||!Array.isArray(e.data)?[]:e.data.map((t,n)=>{let r=e.titleField||`title`,i=e.startDateField||`start`,a=e.endDateField||`end`,o=e.colorField||`color`,s=e.allDayField||`allDay`;return{id:t.id||t._id||n,title:t[r]||`Untitled Event`,start:new Date(t[i]),end:t[a]?new Date(t[a]):void 0,allDay:t[s],color:t[o],data:t}}),[e.data,e.titleField,e.startDateField,e.endDateField,e.colorField,e.allDayField]);return(0,s.jsx)(T,{className:n,events:a,onEventClick:e=>{r?.({type:`event-click`,payload:e})},...i})},{namespace:`plugin-calendar`,label:`Calendar View`,inputs:[{name:`data`,type:`array`,label:`Data`,description:`Array of record objects to display as events`},{name:`titleField`,type:`string`,label:`Title Field`,defaultValue:`title`,description:`Field name to use for event title`},{name:`startDateField`,type:`string`,label:`Start Date Field`,defaultValue:`start`,description:`Field name for event start date`},{name:`endDateField`,type:`string`,label:`End Date Field`,defaultValue:`end`,description:`Field name for event end date (optional)`},{name:`allDayField`,type:`string`,label:`All Day Field`,defaultValue:`allDay`,description:`Field name for all-day flag`},{name:`colorField`,type:`string`,label:`Color Field`,defaultValue:`color`,description:`Field name for event color`},{name:`colorMapping`,type:`object`,label:`Color Mapping`,description:`Map field values to colors (e.g., {meeting: "blue", deadline: "red"})`},{name:`view`,type:`enum`,enum:[`month`,`week`,`day`],defaultValue:`month`,label:`View Mode`,description:`Calendar view mode (month, week, or day)`},{name:`currentDate`,type:`string`,label:`Current Date`,description:`ISO date string for initial calendar date`},{name:`allowCreate`,type:`boolean`,label:`Allow Create`,defaultValue:!1,description:`Allow creating events by clicking on dates`},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{view:`month`,titleField:`title`,startDateField:`start`,endDateField:`end`,allDayField:`allDay`,colorField:`color`,allowCreate:!1,data:[{id:1,title:`Team Meeting`,start:new Date(new Date().setHours(10,0,0,0)).toISOString(),end:new Date(new Date().setHours(11,0,0,0)).toISOString(),color:`#3b82f6`,allDay:!1},{id:2,title:`Project Deadline`,start:new Date(new Date().setDate(new Date().getDate()+3)).toISOString(),color:`#ef4444`,allDay:!0},{id:3,title:`Conference`,start:new Date(new Date().setDate(new Date().getDate()+7)).toISOString(),end:new Date(new Date().setDate(new Date().getDate()+9)).toISOString(),color:`#10b981`,allDay:!0}],className:`h-[600px] border rounded-lg`}});var B=({schema:e,...t})=>{let{dataSource:n}=(0,r.useSchemaContext)()||{};return(0,s.jsx)(z,{schema:e,dataSource:n,...t})};n.ComponentRegistry.register(`object-calendar`,B,{namespace:`plugin-calendar`,label:`Object Calendar`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`calendar`,type:`object`,label:`Calendar Config`,description:`startDateField, endDateField, titleField, colorField`}]}),n.ComponentRegistry.register(`calendar`,B,{namespace:`view`,label:`Calendar View`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`calendar`,type:`object`,label:`Calendar Config`,description:`startDateField, endDateField, titleField, colorField`}]}),e.CalendarView=T,e.ObjectCalendar=z,e.ObjectCalendarRenderer=B});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("react"),require("@object-ui/core"),require("@object-ui/react"),require("lucide-react"),require("@object-ui/components"),require("@object-ui/i18n"),require("react/jsx-runtime"),require("@object-ui/mobile"),require("@object-ui/plugin-detail")):typeof define==`function`&&define.amd?define([`exports`,`react`,`@object-ui/core`,`@object-ui/react`,`lucide-react`,`@object-ui/components`,`@object-ui/i18n`,`react/jsx-runtime`,`@object-ui/mobile`,`@object-ui/plugin-detail`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginCalendar={},e.React,e.ObjectUICore,e.ObjectUIReact,e.LucideReact,e.ObjectUIComponents,e._object_ui_i18n,e.react_jsx_runtime,e._object_ui_mobile,e._object_ui_plugin_detail))})(this,function(e,t,n,r,i,a,o,s,c,l){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var u=Object.create,d=Object.defineProperty,f=Object.getOwnPropertyDescriptor,p=Object.getOwnPropertyNames,m=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty,g=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=p(t),a=0,o=i.length,s;a<o;a++)s=i[a],!h.call(e,s)&&s!==n&&d(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=f(t,s))||r.enumerable});return e};t=((e,t,n)=>(n=e==null?{}:u(m(e)),g(t||!e||!e.__esModule?d(n,`default`,{value:e,enumerable:!0}):n,e)))(t,1);var _=`bg-blue-100 text-blue-900 border border-blue-200`,v=new Date,y=[`bg-blue-100 text-blue-900 border border-blue-200`,`bg-emerald-100 text-emerald-900 border border-emerald-200`,`bg-amber-100 text-amber-900 border border-amber-200`,`bg-rose-100 text-rose-900 border border-rose-200`,`bg-violet-100 text-violet-900 border border-violet-200`,`bg-cyan-100 text-cyan-900 border border-cyan-200`,`bg-orange-100 text-orange-900 border border-orange-200`,`bg-fuchsia-100 text-fuchsia-900 border border-fuchsia-200`],b=/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i,x=/(^|\s)(bg|text|from|to|via)-/;function S(e){if(!e)return{className:_};if(b.test(e))return{className:`text-white`,inlineColor:e};if(x.test(e))return{className:e};let t=0;for(let n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n)|0;return{className:y[Math.abs(t)%y.length]}}var C=(0,o.createSafeTranslation)({"calendar.today":`Today`,"calendar.month":`Month`,"calendar.week":`Week`,"calendar.day":`Day`,"calendar.newEvent":`New event`,"calendar.moreEvents":`+{{count}} more`,"calendar.allDay":`all-day`},`calendar.today`);function w({events:e=[],view:n=`month`,currentDate:r=v,locale:o=`default`,onEventClick:c,onDateClick:l,onViewChange:u,onNavigate:d,onAddClick:f,onEventDrop:p,onTimeRangeSelect:m,slotMinutes:h=30,className:g}){let[_,y]=t.useState(n),[b,x]=t.useState(r),{t:S,language:w}=C(),E=o==="default"?w:o;t.useEffect(()=>{x(r)},[r]),t.useEffect(()=>{y(n)},[n]);let D=t.useRef(u);D.current=u,t.useEffect(()=>{let e=window.matchMedia(`(max-width: 639px)`),t=e=>{e.matches&&(y(`day`),D.current?.(`day`))};return t(e),e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]);let k=()=>{let e=new Date(b);_===`month`?e.setMonth(e.getMonth()-1):_===`week`?e.setDate(e.getDate()-7):e.setDate(e.getDate()-1),x(e),d?.(e)},A=()=>{let e=new Date(b);_===`month`?e.setMonth(e.getMonth()+1):_===`week`?e.setDate(e.getDate()+7):e.setDate(e.getDate()+1),x(e),d?.(e)},j=()=>{let e=new Date;x(e),d?.(e)},M=e=>{y(e),u?.(e)},P=()=>{if(_===`month`)return b.toLocaleDateString(E,{month:`long`,year:`numeric`});if(_===`week`){let e=T(b),t=new Date(e);return t.setDate(t.getDate()+6),`${e.toLocaleDateString(E,{month:`short`,day:`numeric`})} - ${t.toLocaleDateString(E,{month:`short`,day:`numeric`,year:`numeric`})}`}else return b.toLocaleDateString(E,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`})},F=t.useRef(0);return(0,s.jsxs)(`div`,{role:`region`,"aria-label":`Calendar`,className:(0,a.cn)(`flex flex-col h-full bg-background min-w-0 overflow-hidden`,g),children:[(0,s.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 p-2 sm:p-4 border-b min-w-0`,children:[(0,s.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,s.jsxs)(`div`,{className:`flex items-center bg-muted/50 rounded-lg p-1 gap-1`,children:[(0,s.jsx)(a.Button,{variant:`ghost`,size:`sm`,onClick:j,className:`h-8`,"aria-label":`Go to today`,children:S(`calendar.today`)}),(0,s.jsx)(`div`,{className:`h-4 w-px bg-border mx-1`}),(0,s.jsx)(a.Button,{variant:`ghost`,size:`icon`,"aria-label":`Previous period`,onClick:k,className:`h-8 w-8`,children:(0,s.jsx)(i.ChevronLeftIcon,{className:`h-4 w-4`})}),(0,s.jsx)(a.Button,{variant:`ghost`,size:`icon`,"aria-label":`Next period`,onClick:A,className:`h-8 w-8`,children:(0,s.jsx)(i.ChevronRightIcon,{className:`h-4 w-4`})})]}),(0,s.jsxs)(a.Popover,{children:[(0,s.jsx)(a.PopoverTrigger,{asChild:!0,children:(0,s.jsxs)(a.Button,{variant:`ghost`,"aria-label":`Current date: ${P()}`,className:(0,a.cn)(`text-base sm:text-xl font-semibold h-auto px-2 sm:px-3 py-1 hover:bg-muted/50 transition-colors`,`flex items-center gap-2`),children:[(0,s.jsx)(i.CalendarIcon,{className:`h-5 w-5 text-muted-foreground`}),(0,s.jsx)(`span`,{children:P()})]})}),(0,s.jsx)(a.PopoverContent,{className:`w-auto p-0`,align:`start`,children:(0,s.jsx)(a.Calendar,{mode:`single`,selected:b,onSelect:e=>{e&&(x(e),d?.(e))},autoFocus:!0,startMonth:new Date(2e3,0),endMonth:new Date(2050,11)})})]})]}),(0,s.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,s.jsxs)(a.Select,{value:_,onValueChange:M,children:[(0,s.jsx)(a.SelectTrigger,{className:`w-32 bg-background`,children:(0,s.jsx)(a.SelectValue,{})}),(0,s.jsxs)(a.SelectContent,{children:[(0,s.jsx)(a.SelectItem,{value:`day`,children:S(`calendar.day`)}),(0,s.jsx)(a.SelectItem,{value:`week`,children:S(`calendar.week`)}),(0,s.jsx)(a.SelectItem,{value:`month`,children:S(`calendar.month`)})]})]}),f&&(0,s.jsxs)(a.Button,{onClick:f,size:`sm`,className:`gap-1`,children:[(0,s.jsx)(i.PlusIcon,{className:`h-4 w-4`}),S(`calendar.newEvent`)]})]})]}),(0,s.jsxs)(`div`,{className:`flex-1 overflow-auto`,onTouchStart:e=>{F.current=e.touches[0].clientX},onTouchEnd:e=>{let t=F.current-e.changedTouches[0].clientX;if(Math.abs(t)>50){let e=new Date(b);_===`day`?e.setDate(e.getDate()+(t>0?1:-1)):_===`week`?e.setDate(e.getDate()+(t>0?7:-7)):e.setMonth(e.getMonth()+(t>0?1:-1)),x(e),d?.(e)}},children:[_===`month`&&(0,s.jsx)(O,{date:b,events:e,locale:E,onEventClick:c,onDateClick:l,onEventDrop:p}),_===`week`&&(0,s.jsx)(N,{mode:`week`,date:b,events:e,locale:E,slotMinutes:h,onEventClick:c,onEventDrop:p,onTimeRangeSelect:m}),_===`day`&&(0,s.jsx)(N,{mode:`day`,date:b,events:e,locale:E,slotMinutes:h,onEventClick:c,onEventDrop:p,onTimeRangeSelect:m})]})]})}function T(e){let t=new Date(e),n=t.getDay(),r=t.getDate()-n;return t.setDate(r),t}function E(e){let t=e.getFullYear(),n=e.getMonth(),r=new Date(t,n,1),i=new Date(t,n+1,0),a=r.getDay(),o=[];for(let e=a-1;e>=0;e--){let t=new Date(r.getTime());t.setDate(t.getDate()-(e+1)),o.push(t)}for(let e=1;e<=i.getDate();e++)o.push(new Date(t,n,e));let s=42-o.length;for(let e=1;e<=s;e++){let t=new Date(i.getTime());t.setDate(t.getDate()+e),o.push(t)}return o}function D(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function O({date:e,events:n,locale:r=`default`,onEventClick:i,onDateClick:o,onEventDrop:c}){let l=t.useMemo(()=>E(e),[e.getFullYear(),e.getMonth()]),u=t.useMemo(()=>new Date,[]),{t:d}=C(),f=t.useMemo(()=>{let e=new Date(2024,0,7);return Array.from({length:7},(t,n)=>{let i=new Date(e);return i.setDate(i.getDate()+n),i.toLocaleDateString(r,{weekday:`short`})})},[r]),[p,m]=t.useState(null),[h,g]=t.useState(null),_=t.useMemo(()=>{let e=new Map;for(let t of n){let n=new Date(t.start),r=t.end?new Date(t.end):new Date(n);n.setHours(0,0,0,0),r.setHours(0,0,0,0);let i=new Date(n);for(;i<=r;){let a=`${i.getFullYear()}-${i.getMonth()}-${i.getDate()}`,o=i.getTime()===n.getTime(),s=i.getTime()===r.getTime(),c=o||s||i.getDay()===0,l=e.get(a),u={event:t,isTitleDay:c,isSpanStart:o,isSpanEnd:s};l?l.push(u):e.set(a,[u]),i.setDate(i.getDate()+1)}}return e},[n]),v=(e,t,n=`move`,r)=>{m(t.id),e.dataTransfer.effectAllowed=`move`;let i={id:t.id,mode:n,...r?{sourceDay:`${r.getFullYear()}-${r.getMonth()}-${r.getDate()}`}:{}};e.dataTransfer.setData(`text/plain`,JSON.stringify(i)),n===`resize-end`&&e.stopPropagation()},y=()=>{m(null),g(null)},b=(e,t)=>{e.preventDefault(),e.dataTransfer.dropEffect=`move`,g(t)},x=e=>{e.currentTarget.contains(e.relatedTarget)||g(null)},w=(e,t)=>{if(e.preventDefault(),g(null),m(null),!c)return;let r=e.dataTransfer.getData(`text/plain`),i;try{i=JSON.parse(r)}catch{i={id:r,mode:`move`}}let a=n.find(e=>String(e.id)===String(i.id));if(!a)return;let o=new Date(t);if(o.setHours(0,0,0,0),i.mode===`resize-end`){let e=a.end?new Date(a.end):new Date(a.start),t=new Date(e);if(t.setHours(0,0,0,0),o.getTime()===t.getTime())return;let n=new Date(a.start);if(n.setHours(0,0,0,0),o.getTime()<n.getTime())return;let r=new Date(o);r.setHours(e.getHours(),e.getMinutes(),e.getSeconds(),0),c(a,new Date(a.start),r);return}let s=new Date(a.start),l;if(i.sourceDay){let[e,t,n]=i.sourceDay.split(`-`).map(e=>parseInt(e,10));l=new Date(e,t,n)}else l=new Date(s);l.setHours(0,0,0,0);let u=o.getTime()-l.getTime();if(u===0)return;let d=new Date(s.getTime()+u),f;a.end&&(f=new Date(new Date(a.end).getTime()+u)),c(a,d,f)};return(0,s.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,s.jsx)(`div`,{role:`row`,className:`grid grid-cols-7 border-b`,children:f.map(e=>(0,s.jsx)(`div`,{role:`columnheader`,className:`p-2 text-center text-sm font-medium text-muted-foreground border-r last:border-r-0`,children:e},e))}),(0,s.jsx)(`div`,{role:`grid`,"aria-label":`Calendar grid`,className:`grid grid-cols-7 flex-1 auto-rows-fr`,children:l.map((t,n)=>{let r=`${t.getFullYear()}-${t.getMonth()}-${t.getDate()}`,l=_.get(r)||[],f=t.getMonth()===e.getMonth(),m=D(t,u);return(0,s.jsxs)(`div`,{role:`gridcell`,"aria-label":`${t.toLocaleDateString(`default`,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`})}${l.length>0?`, ${l.length} event${l.length>1?`s`:``}`:``}`,className:(0,a.cn)(`border-b border-r last:border-r-0 p-2 min-h-[100px] cursor-pointer hover:bg-accent/50`,!f&&`bg-muted/50 text-muted-foreground opacity-50`,h===n&&`ring-2 ring-primary`),onClick:()=>o?.(t),onDragOver:e=>b(e,n),onDragLeave:x,onDrop:e=>w(e,t),children:[(0,s.jsx)(`div`,{className:(0,a.cn)(`text-sm font-medium mb-2`,m&&`inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground h-6 w-6`),...m?{"aria-current":`date`}:{},children:t.getDate()}),(0,s.jsxs)(`div`,{className:`space-y-0.5`,children:[l.slice(0,4).map(({event:e,isTitleDay:n,isSpanStart:r,isSpanEnd:o},l)=>{let u=!n,{className:d,inlineColor:f}=S(e.color),m=!!c&&o;return(0,s.jsxs)(`div`,{role:`button`,title:e.title,"aria-label":e.title,draggable:!!c,onDragStart:n=>v(n,e,`move`,t),onDragEnd:y,className:(0,a.cn)(`relative text-xs hover:opacity-80 truncate`,c?`cursor-move`:`cursor-pointer`,u?`h-1.5`:`px-2 py-0.5`,r?`rounded-l`:`rounded-l-none`,o?`rounded-r`:`rounded-r-none`,!o&&`-mr-2`,d,p===e.id&&`opacity-50`),style:f?{backgroundColor:f}:void 0,onClick:t=>{t.stopPropagation(),i?.(e)},children:[u?``:e.title,m&&(0,s.jsx)(`span`,{role:`separator`,"aria-label":`Resize event end`,title:`Drag to change end date`,draggable:!0,onDragStart:n=>v(n,e,`resize-end`,t),onDragEnd:y,onClick:e=>e.stopPropagation(),className:`absolute inset-y-0 right-0 w-2 cursor-ew-resize bg-black/25 hover:bg-black/50 rounded-r`})]},`${e.id}-${l}`)}),l.length>4&&(0,s.jsx)(`div`,{className:`text-xs text-muted-foreground px-2`,children:d(`calendar.moreEvents`,{count:l.length-4})})]})]},n)})})]})}var k=48;function A(e){let t=new Date(e);return t.setHours(0,0,0,0),t}function j(e){return e.getHours()*60+e.getMinutes()}function M(e){return`${e.getFullYear()}-${e.getMonth()}-${e.getDate()}`}function N({mode:e,date:n,events:r,locale:i=`default`,slotMinutes:o=30,onEventClick:c,onEventDrop:l,onTimeRangeSelect:u}){let{t:d}=C(),f=k*o/60,p=k*24,m=t.useMemo(()=>{if(e===`day`)return[A(n)];let t=T(n);return Array.from({length:7},(e,n)=>{let r=new Date(t);return r.setDate(t.getDate()+n),A(r)})},[e,n.getFullYear(),n.getMonth(),n.getDate()]),h=t.useMemo(()=>new Date,[]),g=t.useCallback(e=>{if(e.allDay)return!0;let t=new Date(e.start),n=e.end?new Date(e.end):new Date(t),r=t.getHours()===0&&t.getMinutes()===0&&t.getSeconds()===0,i=n.getHours()===0&&n.getMinutes()===0&&n.getSeconds()===0,a=n.getTime()-t.getTime();return!!(r&&i||a>=1440*60*1e3)},[]),{allDayEvents:_,timedEvents:v}=t.useMemo(()=>{let e=[],t=[];for(let n of r)g(n)?e.push(n):t.push(n);return{allDayEvents:e,timedEvents:t}},[r,g]),y=t.useMemo(()=>{let e=new Map;for(let t of m)e.set(M(t),[]);for(let t of _){let n=A(new Date(t.start)),r=t.end?new Date(t.end):new Date(t.start),i=A(r);r.getHours()===0&&r.getMinutes()===0&&r.getSeconds()===0&&r.getTime()>n.getTime()&&(i=new Date(i),i.setDate(i.getDate()-1));for(let r of m){let a=A(r);a<n||a>i||e.get(M(r)).push({event:t,isStart:a.getTime()===n.getTime(),isEnd:a.getTime()===i.getTime()})}}return e},[m,_]),b=t.useMemo(()=>{let e=new Map;for(let t of m)e.set(M(t),[]);for(let t of v){let n=new Date(t.start),r=t.end?new Date(t.end):new Date(n.getTime()+3600*1e3);for(let i of m){let a=A(i),o=new Date(a);if(o.setDate(o.getDate()+1),r<=a||n>=o)continue;let s=n<a?a:n,c=r>o?o:r,l=j(s),u=c.getTime()===o.getTime()?1440:j(c);e.get(M(i)).push({event:t,startMin:l,endMin:Math.max(u,l+15),isStart:s.getTime()===n.getTime(),isEnd:c.getTime()===r.getTime()})}}return e},[m,v]),x=t.useMemo(()=>{let e=new Map;for(let[t,n]of b){let r=[...n].sort((e,t)=>e.startMin-t.startMin||e.endMin-t.endMin),i=[],a=[],o=[];for(let e of r){let t=0;for(;i[t]&&i[t].endMin>e.startMin;)t++;i[t]={endMin:e.endMin},a.push({entry:e,col:t})}for(let e=0;e<a.length;e++){let t=a[e],n=t.col;for(let r=0;r<a.length;r++){if(r===e)continue;let i=a[r];i.entry.startMin<t.entry.endMin&&i.entry.endMin>t.entry.startMin&&i.col>n&&(n=i.col)}o.push({...t.entry,col:t.col,cols:n+1})}e.set(t,o)}return e},[b]),w=t.useRef(null),E=t.useRef([]),[O,N]=t.useState(null),F=t.useRef(null);F.current=O;let I=t.useRef(!1),L=t.useCallback((e,t)=>{let n=E.current[t];if(!n)return 0;let r=(e-n.getBoundingClientRect().top+n.scrollTop)/k*60,i=Math.round(r/o)*o;return Math.max(0,Math.min(1440,i))},[o]),R=t.useCallback(e=>{for(let t=0;t<E.current.length;t++){let n=E.current[t];if(!n)continue;let r=n.getBoundingClientRect();if(e>=r.left&&e<=r.right)return t}return-1},[]);t.useEffect(()=>{if(!O)return;let e=e=>{let t=O.kind===`select`||O.kind===`move`?R(e.clientX):O.dayIndex,n=t<0?O.dayIndex??0:t,r=L(e.clientY,n);N(e=>e&&(e.kind===`select`?{...e,dayIndex:n>=0?n:e.dayIndex,headMinutes:r}:e.kind===`move`?{...e,dayIndex:n,minutes:r}:{...e,minutes:r}))},t=e=>{let t=F.current;if(!t){N(null);return}try{if(t.kind===`select`&&u){let e=Math.min(t.anchorMinutes,t.headMinutes),n=Math.max(t.anchorMinutes,t.headMinutes),r=e,i=n===e?Math.min(1440,e+o):n,a=m[t.dayIndex]??m[0],s=new Date(a);s.setHours(0,Math.round(r),0,0);let c=new Date(a);c.setHours(0,Math.round(i),0,0),I.current=!0,u(s,c)}else if(t.kind===`move`&&l){let e=r.find(e=>String(e.id)===String(t.eventId));if(e){let n=t.dayIndex<0?0:t.dayIndex,r=t.minutes-t.grabMinuteOffset,i=Math.max(0,Math.min(1440-t.durationMin,Math.round(r/o)*o)),a=m[n]??m[0],s=new Date(a);s.setHours(0,i,0,0);let c=new Date(s.getTime()+t.durationMin*60*1e3);I.current=!0,l(e,s,c)}}else if(t.kind===`resize-top`&&l){let e=r.find(e=>String(e.id)===String(t.eventId));if(e){let n=m[t.dayIndex]??m[0],r=Math.min(t.anchorEndMin-o,Math.max(0,t.minutes)),i=new Date(n);i.setHours(0,r,0,0);let a=new Date(n);a.setHours(0,t.anchorEndMin,0,0),I.current=!0,l(e,i,a)}}else if(t.kind===`resize-bottom`&&l){let e=r.find(e=>String(e.id)===String(t.eventId));if(e){let n=m[t.dayIndex]??m[0],r=Math.max(t.anchorStartMin+o,Math.min(1440,t.minutes)),i=new Date(n);i.setHours(0,t.anchorStartMin,0,0);let a=new Date(n);a.setHours(0,r,0,0),I.current=!0,l(e,i,a)}}}finally{N(null),setTimeout(()=>{I.current=!1},50)}};return window.addEventListener(`pointermove`,e),window.addEventListener(`pointerup`,t),()=>{window.removeEventListener(`pointermove`,e),window.removeEventListener(`pointerup`,t)}},[O,m,r,o,l,u,R,L]);let z=t.useMemo(()=>m.map(e=>({weekday:e.toLocaleDateString(i,{weekday:`short`}),day:e.getDate(),month:e.toLocaleDateString(i,{month:`short`}),isToday:D(e,h)})),[m,i,h]),B=t.useMemo(()=>Array.from({length:24},(e,t)=>new Date(2024,0,1,t,0).toLocaleTimeString(i,{hour:`numeric`})),[i]),V=(e,t,n,r)=>{if(!l||e.button!==0)return;e.stopPropagation(),e.preventDefault();let i=L(e.clientY,n);N(r===`body`?{kind:`move`,eventId:t.event.id,grabMinuteOffset:Math.max(0,i-t.startMin),durationMin:t.endMin-t.startMin,dayIndex:n,minutes:i}:r===`top`?{kind:`resize-top`,eventId:t.event.id,anchorEndMin:t.endMin,dayIndex:n,minutes:i}:{kind:`resize-bottom`,eventId:t.event.id,anchorStartMin:t.startMin,dayIndex:n,minutes:i})},H=(e,t)=>{if(!u||e.button!==0)return;e.preventDefault();let n=L(e.clientY,t);N({kind:`select`,dayIndex:t,anchorMinutes:n,headMinutes:n})},U=e=>{if(!O)return null;if(O.kind===`select`&&O.dayIndex===e){let t=Math.min(O.anchorMinutes,O.headMinutes),n=Math.max(O.anchorMinutes,O.headMinutes);return(0,s.jsx)(`div`,{className:`absolute left-1 right-1 rounded bg-primary/30 border border-primary pointer-events-none z-10`,style:{top:t/60*k,height:Math.max(f,(n-t)/60*k)},"aria-hidden":!0,children:(0,s.jsx)(`div`,{className:`px-2 py-0.5 text-xs font-medium text-primary`,children:P(m[e],t,n,i)})})}if(O.kind===`move`&&O.dayIndex===e){let t=O.minutes-O.grabMinuteOffset,n=Math.max(0,Math.min(1440-O.durationMin,Math.round(t/o)*o));return(0,s.jsx)(`div`,{className:`absolute left-1 right-1 rounded border-2 border-dashed border-primary bg-primary/10 pointer-events-none z-10`,style:{top:n/60*k,height:O.durationMin/60*k},"aria-hidden":!0,children:(0,s.jsx)(`div`,{className:`px-2 py-0.5 text-xs font-medium text-primary`,children:P(m[e],n,n+O.durationMin,i)})})}if((O.kind===`resize-top`||O.kind===`resize-bottom`)&&O.dayIndex===e){let t,n;return O.kind===`resize-top`?(t=Math.min(O.anchorEndMin-o,Math.max(0,O.minutes)),n=O.anchorEndMin):(t=O.anchorStartMin,n=Math.max(O.anchorStartMin+o,Math.min(1440,O.minutes))),(0,s.jsx)(`div`,{className:`absolute left-1 right-1 rounded border-2 border-dashed border-primary bg-primary/10 pointer-events-none z-10`,style:{top:t/60*k,height:(n-t)/60*k},"aria-hidden":!0,children:(0,s.jsx)(`div`,{className:`px-2 py-0.5 text-xs font-medium text-primary`,children:P(m[e],t,n,i)})})}return null};return(0,s.jsxs)(`div`,{className:`flex flex-col h-full`,ref:w,children:[(0,s.jsxs)(`div`,{className:`flex border-b sticky top-0 bg-background z-20`,children:[(0,s.jsx)(`div`,{className:`w-14 shrink-0 border-r`,"aria-hidden":!0}),z.map((e,t)=>(0,s.jsxs)(`div`,{role:`columnheader`,className:(0,a.cn)(`flex-1 p-2 text-center text-sm border-r last:border-r-0`,e.isToday&&`bg-primary/5`),children:[(0,s.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:e.weekday}),(0,s.jsx)(`div`,{className:(0,a.cn)(`font-medium`,e.isToday&&`inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground h-6 w-6 mx-auto`),children:e.day})]},t))]}),_.length>0&&(0,s.jsxs)(`div`,{className:`flex border-b bg-muted/20 max-h-[140px] overflow-y-auto`,children:[(0,s.jsx)(`div`,{className:`w-14 shrink-0 border-r flex items-start justify-end pr-1 pt-1 text-[10px] text-muted-foreground sticky left-0 bg-muted/20`,children:d(`calendar.allDay`)===`calendar.allDay`?`all-day`:d(`calendar.allDay`)}),m.map(e=>{let t=M(e);return(0,s.jsx)(`div`,{className:`flex-1 border-r last:border-r-0 min-h-[28px] p-0.5 space-y-0.5`,children:(y.get(t)??[]).map(({event:e,isStart:t,isEnd:n},r)=>{let{className:i,inlineColor:o}=S(e.color);return(0,s.jsx)(`div`,{role:`button`,title:e.title,onClick:t=>{t.stopPropagation(),c?.(e)},className:(0,a.cn)(`text-[11px] px-2 py-0.5 truncate cursor-pointer hover:opacity-80`,t?`rounded-l`:`rounded-l-none -ml-0.5`,n?`rounded-r`:`rounded-r-none -mr-0.5`,i),style:o?{backgroundColor:o}:void 0,children:t?e.title:`\xA0`},`${e.id}-${r}`)})},t)})]}),(0,s.jsx)(`div`,{className:`flex-1 overflow-auto`,children:(0,s.jsxs)(`div`,{className:`flex`,style:{height:p},children:[(0,s.jsx)(`div`,{className:`w-14 shrink-0 border-r relative`,children:B.map((e,t)=>(0,s.jsx)(`div`,{className:`absolute right-1 text-[10px] text-muted-foreground -translate-y-1/2`,style:{top:t*k},children:t===0?``:e},t))}),m.map((e,t)=>{let n=M(e),r=x.get(n)??[];return(0,s.jsxs)(`div`,{ref:e=>{E.current[t]=e},className:`flex-1 border-r last:border-r-0 relative select-none`,style:{height:p},onPointerDown:e=>H(e,t),"aria-label":e.toLocaleDateString(i,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`}),children:[Array.from({length:24},(e,t)=>(0,s.jsx)(`div`,{className:`absolute left-0 right-0 border-t border-muted/60 pointer-events-none`,style:{top:t*k}},t)),o<60&&Array.from({length:Math.floor(1440/o)},(e,t)=>{let n=t*o;return n%60==0?null:(0,s.jsx)(`div`,{className:`absolute left-0 right-0 border-t border-dashed border-muted/30 pointer-events-none`,style:{top:n/60*k}},t)}),r.map(n=>{let r=n.startMin/60*k,o=Math.max(f,(n.endMin-n.startMin)/60*k),u=100/n.cols,d=n.col*u,{className:p,inlineColor:m}=S(n.event.color),h=O&&O.eventId===n.event.id;return(0,s.jsxs)(`div`,{role:`button`,tabIndex:0,title:n.event.title,"aria-label":n.event.title,onPointerDown:e=>V(e,n,t,`body`),onClick:e=>{if(I.current){e.stopPropagation();return}e.stopPropagation(),c?.(n.event)},className:(0,a.cn)(`absolute rounded text-xs px-2 py-1 overflow-hidden shadow-sm`,l?`cursor-move`:`cursor-pointer`,p,h&&`opacity-40`),style:{top:r,height:o,left:`calc(${d}% + 2px)`,width:`calc(${u}% - 4px)`,...m?{backgroundColor:m}:{}},children:[(0,s.jsx)(`div`,{className:`font-medium truncate`,children:n.event.title}),(0,s.jsx)(`div`,{className:`text-[10px] opacity-80 truncate`,children:P(e,n.startMin,n.endMin,i)}),l&&n.isStart&&(0,s.jsx)(`div`,{onPointerDown:e=>V(e,n,t,`top`),className:`absolute top-0 left-0 right-0 h-1.5 cursor-ns-resize`,"aria-label":`Resize start`}),l&&n.isEnd&&(0,s.jsx)(`div`,{onPointerDown:e=>V(e,n,t,`bottom`),className:`absolute bottom-0 left-0 right-0 h-1.5 cursor-ns-resize`,"aria-label":`Resize end`})]},`${n.event.id}-${n.startMin}`)}),U(t)]},n)})]})})]})}function P(e,t,n,r){let i=new Date(e);i.setHours(0,Math.round(t),0,0);let a=new Date(e);a.setHours(0,Math.round(n),0,0);let o=e=>e.toLocaleTimeString(r,{hour:`numeric`,minute:`2-digit`});return`${o(i)} – ${o(a)}`}function F(e){return`data`in e&&e.data?e.data:`staticData`in e&&e.staticData?{provider:`value`,items:e.staticData}:e.objectName?{provider:`object`,object:e.objectName}:null}function I(e){if(e){if(typeof e==`string`){let t=e.split(` `),n=t[0],r=t[1]?.toLowerCase()===`desc`?`desc`:`asc`;return{[n]:r}}if(Array.isArray(e))return e.reduce((e,t)=>(t.field&&t.order&&(e[t.field]=t.order),e),{})}}function L(e){return`filter`in e&&e.filter&&typeof e.filter==`object`&&`calendar`in e.filter?e.filter.calendar:e.calendar?e.calendar:e.startDateField||e.dateField?{startDateField:e.startDateField||e.dateField,endDateField:e.endDateField||e.endField,titleField:e.titleField,colorField:e.colorField,allDayField:e.allDayField}:null}var R=({schema:e,dataSource:i,className:o,data:u,loading:d,onEventClick:f,onRowClick:p,onDateClick:m,onNavigate:h,onViewChange:g,onEventDrop:_,locale:v})=>{let y=(0,r.useSafeTranslate)(),b=Array.isArray(u),[x,S]=(0,t.useState)(b?u:[]),[C,T]=(0,t.useState)(b?d??!1:!0),[E,D]=(0,t.useState)(null),[O,k]=(0,t.useState)(null),[A,j]=(0,t.useState)(new Date),M=(0,a.useIsMobile)(),N=e.defaultView,[P,R]=(0,t.useState)(()=>{let e=N===`day`||!N;return typeof window<`u`&&window.innerWidth<768&&e?`month`:N||`month`});(0,t.useEffect)(()=>{M&&P===`day`&&(N===`day`||!N)&&R(`month`)},[M]);let[z,B]=(0,t.useState)(0);(0,t.useEffect)(()=>{if(!b&&!(!i?.onMutation||!e.objectName))return i.onMutation(t=>{t.resource===e.objectName&&B(e=>e+1)})},[i,e.objectName,b]);let{ref:V,isRefreshing:H,pullDistance:U}=(0,c.usePullToRefresh)({onRefresh:(0,t.useCallback)(async()=>{B(e=>e+1)},[]),enabled:!!i&&!!e.objectName}),W=(0,t.useMemo)(()=>F(e),[e.data,e.staticData,e.objectName]),G=(0,t.useMemo)(()=>L(e),[e.filter,e.calendar,e.dateField,e.endField,e.titleField,e.colorField]),K=W?.provider===`value`,q=(0,t.useRef)(null);q.current=O,(0,t.useEffect)(()=>{b&&S(u)},[u,b]),(0,t.useEffect)(()=>{b&&d!==void 0&&T(d)},[d,b]),(0,t.useEffect)(()=>{if(b)return;let t=!0;return(async()=>{try{if(!t)return;if(T(!0),K&&W?.provider===`value`){t&&(S(W.items),T(!1));return}if(!i||typeof i.find!=`function`)throw Error(`DataSource required for object/api providers`);if(W?.provider===`object`){let r=W.object,a=(0,n.buildExpandFields)(q.current?.fields),o=(0,n.extractRecords)(await i.find(r,{$filter:e.filter,$orderby:I(e.sort),...a.length>0?{$expand:a}:{}}));t&&S(o)}else W?.provider===`api`&&(console.warn(`API provider not yet implemented for ObjectCalendar`),t&&S([]));t&&T(!1)}catch(e){console.error(`[ObjectCalendar] Error fetching data:`,e),t&&(D(e),T(!1))}})(),()=>{t=!1}},[b,W,i,K,e.filter,e.sort,z]),(0,t.useEffect)(()=>{!K&&i&&(async()=>{try{if(!i)return;let t=W?.provider===`object`?W.object:e.objectName;if(!t)return;let n=await i.getObjectSchema(t);k(n)}catch(e){console.error(`Failed to fetch object schema:`,e)}})()},[e.objectName,i,K,W]);let ee=(0,t.useMemo)(()=>{if(!G||!x.length)return[];let{startDateField:e,endDateField:t,titleField:r,colorField:i}=G,a=e=>{if(r){let t=e[r],n=typeof t==`string`?t.trim():t;if(n)return String(n)}return(0,n.getRecordDisplayName)(O,e)};return x.map((n,r)=>{let o=n[e],s=t?n[t]:null,c=a(n),l=i?n[i]:void 0;return{id:n.id||n._id||`event-${r}`,title:c,start:o?new Date(o):new Date,end:s?new Date(s):void 0,color:l,allDay:!s,data:n}}).filter(e=>!isNaN(e.start.getTime()))},[x,G,O]);(0,t.useCallback)(()=>{m?.(new Date)},[m]);let J=e.navigation??{mode:`drawer`,width:`min(960px, 60vw)`},Y=J.mode===`drawer`||J.mode===`modal`||J.mode===`split`||J.mode===`popover`,X=(0,r.useNavigationOverlay)({navigation:J,objectName:e.objectName,onRowClick:Y?void 0:p}),te=(0,t.useCallback)(async(t,n,o)=>{if(!G)return;let{startDateField:s,endDateField:c}=G,l=t?.id??t?._id;if(!l||!e.objectName||!i?.update)return;let u={[s]:n.toISOString()};c&&o&&(u[c]=o.toISOString());let d=x;S(e=>e.map(e=>(e?.id??e?._id)===l?{...e,...u}:e));try{await i.update(e.objectName,l,u)}catch(e){S(d),console.error(`[ObjectCalendar] Failed to persist drag-and-drop reschedule:`,e),a.toast.error((0,r.isPermissionError)(e)?y(`errors.unauthorized`,`You are not authorized to perform this action.`):(0,r.extractWriteErrorMessage)(e)??y(`table.saveFailed`,`Save failed`))}},[G,e.objectName,i,x,y]),[Z,Q]=(0,t.useState)(null),ne=(0,t.useCallback)(t=>{!G||!e.objectName||!i?.create||Q({start:t,title:``,submitting:!1})},[G,e.objectName,i]),re=(0,t.useCallback)((t,n)=>{!G||!e.objectName||!i?.create||Q({start:t,end:n,title:``,submitting:!1})},[G,e.objectName,i]),$=(0,t.useCallback)(async()=>{if(!Z||!G)return;let t=Z.title.trim();if(!t){Q(e=>e&&{...e,error:`Title is required`});return}if(!e.objectName||!i?.create)return;Q(e=>e&&{...e,submitting:!0,error:void 0});let{startDateField:n,endDateField:r,titleField:a}=G,o={[a||`name`]:t,[n]:Z.start.toISOString()};r&&(o[r]=(Z.end??Z.start).toISOString());let s=O?.fields;if(s&&typeof s==`object`){let e=Array.isArray(s)?s.map(e=>[e.name??e.apiName,e]):Object.entries(s);for(let[t,n]of e){if(!t||t in o||!n?.required)continue;if(n.defaultValue!==void 0&&n.defaultValue!==null){o[t]=n.defaultValue;continue}let e=n.type;if(e===`select`||e===`picklist`||e===`status`){let e=(n.options||n.choices||[])[0];e!==void 0&&(o[t]=typeof e==`object`?e.value??e.id:e)}else e===`boolean`||e===`checkbox`?o[t]=!1:(e===`number`||e===`integer`||e===`decimal`||e===`currency`||e===`percent`)&&(o[t]=0)}}try{let t=await i.create(e.objectName,o),n=(t&&(t.record||t.data||t))??null;n&&(n.id!==void 0||n._id!==void 0)&&S(e=>[...e,n]),Q(null)}catch(e){let t=e?.message||String(e);Q(e=>e&&{...e,submitting:!1,error:t}),console.error(`[ObjectCalendar] Quick-create failed:`,e)}},[Z,G,e.objectName,i,O]);return C?(0,s.jsx)(`div`,{className:o,children:(0,s.jsx)(`div`,{className:`flex items-center justify-center h-96`,children:(0,s.jsx)(`div`,{className:`text-muted-foreground`,children:`Loading calendar...`})})}):E?(0,s.jsx)(`div`,{className:o,children:(0,s.jsx)(`div`,{className:`flex items-center justify-center h-96`,children:(0,s.jsxs)(`div`,{className:`text-destructive`,children:[`Error: `,E.message]})})}):G?(0,s.jsxs)(`div`,{ref:V,className:o,children:[U>0&&(0,s.jsx)(`div`,{className:`flex items-center justify-center text-xs text-muted-foreground`,style:{height:U},children:H?`Refreshing…`:`Pull to refresh`}),(0,s.jsx)(`div`,{className:`bg-background h-[calc(100vh-120px)] sm:h-[calc(100vh-160px)] md:h-[calc(100vh-200px)] min-h-[400px] sm:min-h-[600px]`,children:(0,s.jsx)(w,{events:ee,currentDate:A,view:P,locale:v,onEventClick:e=>{X.handleClick(e.data),Y||f?.(e.data)},onDateClick:e=>{m?m(e):ne(e)},onNavigate:e=>{j(e),h?.(e)},onViewChange:e=>{R(e),g?.(e)},onAddClick:void 0,onEventDrop:(e,t,n)=>{_?_(e.data,t,n):te(e.data,t,n)},onTimeRangeSelect:re})}),(0,s.jsx)(a.Dialog,{open:!!Z,onOpenChange:e=>{e||Q(null)},children:(0,s.jsxs)(a.DialogContent,{className:`sm:max-w-md`,children:[(0,s.jsxs)(a.DialogHeader,{children:[(0,s.jsx)(a.DialogTitle,{children:`New event`}),(0,s.jsx)(a.DialogDescription,{children:Z&&(()=>{let e=Z.end&&Z.end.getTime()!==Z.start.getTime(),t=Z.start.toLocaleDateString(v,{year:`numeric`,month:`long`,day:`numeric`});if(e){let e=e=>e.toLocaleTimeString(v,{hour:`numeric`,minute:`2-digit`});return(0,s.jsxs)(s.Fragment,{children:[t,` · `,e(Z.start),` – `,e(Z.end)]})}return(0,s.jsxs)(s.Fragment,{children:[`On `,t]})})()})]}),(0,s.jsxs)(`div`,{className:`space-y-2`,children:[(0,s.jsx)(a.Label,{htmlFor:`quick-create-title`,children:`Title`}),(0,s.jsx)(a.Input,{id:`quick-create-title`,autoFocus:!0,value:Z?.title??``,onChange:e=>Q(t=>t&&{...t,title:e.target.value,error:void 0}),onKeyDown:e=>{e.key===`Enter`&&!Z?.submitting&&(e.preventDefault(),$())},placeholder:`What's this event about?`,disabled:Z?.submitting}),Z?.error&&(0,s.jsx)(`p`,{className:`text-sm text-destructive`,children:Z.error})]}),(0,s.jsxs)(a.DialogFooter,{children:[(0,s.jsx)(a.Button,{variant:`outline`,onClick:()=>Q(null),disabled:Z?.submitting,children:`Cancel`}),(0,s.jsx)(a.Button,{onClick:()=>void $(),disabled:Z?.submitting||!Z?.title.trim(),children:Z?.submitting?`Creating…`:`Create`})]})]})}),X.isOverlay&&X.isOpen&&X.selectedRecord&&(()=>{let t=W?.provider===`object`?W.object:e.objectName,n=X.selectedRecord,r=n.id??n._id;if(!t||r==null)return null;let a=G?.titleField?String(n[G.titleField]??`Event Details`):`Event Details`;return(0,s.jsx)(l.RecordDetailDrawer,{open:!0,onClose:X.close,title:a,record:n,objectName:t,recordId:r,dataSource:i,objectSchema:O,width:X.width??`min(960px, 60vw)`,fullPageHref:(0,l.deriveRecordPageHref)(t,r)??void 0,onFieldSave:async(e,n)=>{i?.update&&(await i.update(t,String(r),{[e]:n}),S(t=>t.map(t=>String(t.id??t._id)===String(r)?{...t,[e]:n}:t)))},onDelete:async()=>{i?.delete&&(await i.delete(t,String(r)),S(e=>e.filter(e=>String(e.id??e._id)!==String(r))))}})})()]}):(0,s.jsx)(`div`,{className:o,children:(0,s.jsx)(`div`,{className:`flex items-center justify-center h-96`,children:(0,s.jsx)(`div`,{className:`text-muted-foreground`,children:`Calendar configuration required. Please specify startDateField and titleField.`})})})};n.ComponentRegistry.register(`calendar-view`,({schema:e,className:n,onAction:r,...i})=>{let a=t.default.useMemo(()=>!e.data||!Array.isArray(e.data)?[]:e.data.map((t,n)=>{let r=e.titleField||`title`,i=e.startDateField||`start`,a=e.endDateField||`end`,o=e.colorField||`color`,s=e.allDayField||`allDay`;return{id:t.id||t._id||n,title:t[r]||`Untitled Event`,start:new Date(t[i]),end:t[a]?new Date(t[a]):void 0,allDay:t[s],color:t[o],data:t}}),[e.data,e.titleField,e.startDateField,e.endDateField,e.colorField,e.allDayField]);return(0,s.jsx)(w,{className:n,events:a,onEventClick:e=>{r?.({type:`event-click`,payload:e})},...i})},{namespace:`plugin-calendar`,label:`Calendar View`,inputs:[{name:`data`,type:`array`,label:`Data`,description:`Array of record objects to display as events`},{name:`titleField`,type:`string`,label:`Title Field`,defaultValue:`title`,description:`Field name to use for event title`},{name:`startDateField`,type:`string`,label:`Start Date Field`,defaultValue:`start`,description:`Field name for event start date`},{name:`endDateField`,type:`string`,label:`End Date Field`,defaultValue:`end`,description:`Field name for event end date (optional)`},{name:`allDayField`,type:`string`,label:`All Day Field`,defaultValue:`allDay`,description:`Field name for all-day flag`},{name:`colorField`,type:`string`,label:`Color Field`,defaultValue:`color`,description:`Field name for event color`},{name:`colorMapping`,type:`object`,label:`Color Mapping`,description:`Map field values to colors (e.g., {meeting: "blue", deadline: "red"})`},{name:`view`,type:`enum`,enum:[`month`,`week`,`day`],defaultValue:`month`,label:`View Mode`,description:`Calendar view mode (month, week, or day)`},{name:`currentDate`,type:`string`,label:`Current Date`,description:`ISO date string for initial calendar date`},{name:`allowCreate`,type:`boolean`,label:`Allow Create`,defaultValue:!1,description:`Allow creating events by clicking on dates`},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{view:`month`,titleField:`title`,startDateField:`start`,endDateField:`end`,allDayField:`allDay`,colorField:`color`,allowCreate:!1,data:[{id:1,title:`Team Meeting`,start:new Date(new Date().setHours(10,0,0,0)).toISOString(),end:new Date(new Date().setHours(11,0,0,0)).toISOString(),color:`#3b82f6`,allDay:!1},{id:2,title:`Project Deadline`,start:new Date(new Date().setDate(new Date().getDate()+3)).toISOString(),color:`#ef4444`,allDay:!0},{id:3,title:`Conference`,start:new Date(new Date().setDate(new Date().getDate()+7)).toISOString(),end:new Date(new Date().setDate(new Date().getDate()+9)).toISOString(),color:`#10b981`,allDay:!0}],className:`h-[600px] border rounded-lg`}});var z=({schema:e,...t})=>{let{dataSource:n}=(0,r.useSchemaContext)()||{};return(0,s.jsx)(R,{schema:e,dataSource:n,...t})};n.ComponentRegistry.register(`object-calendar`,z,{namespace:`plugin-calendar`,label:`Object Calendar`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`calendar`,type:`object`,label:`Calendar Config`,description:`startDateField, endDateField, titleField, colorField`}]}),n.ComponentRegistry.register(`calendar`,z,{namespace:`view`,label:`Calendar View`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`calendar`,type:`object`,label:`Calendar Config`,description:`startDateField, endDateField, titleField, colorField`}]}),e.CalendarView=w,e.ObjectCalendar=R,e.ObjectCalendarRenderer=z});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@object-ui/plugin-calendar",
3
- "version": "16.1.0",
3
+ "version": "17.1.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Calendar view plugins for Object UI - includes both ObjectQL-integrated and standalone calendar components",
@@ -25,14 +25,14 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "lucide-react": "^1.25.0",
28
- "@object-ui/components": "16.1.0",
29
- "@object-ui/core": "16.1.0",
30
- "@object-ui/fields": "16.1.0",
31
- "@object-ui/i18n": "16.1.0",
32
- "@object-ui/mobile": "16.1.0",
33
- "@object-ui/plugin-detail": "16.1.0",
34
- "@object-ui/react": "16.1.0",
35
- "@object-ui/types": "16.1.0"
28
+ "@object-ui/components": "17.1.0",
29
+ "@object-ui/core": "17.1.0",
30
+ "@object-ui/fields": "17.1.0",
31
+ "@object-ui/i18n": "17.1.0",
32
+ "@object-ui/mobile": "17.1.0",
33
+ "@object-ui/plugin-detail": "17.1.0",
34
+ "@object-ui/react": "17.1.0",
35
+ "@object-ui/types": "17.1.0"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "react": "^18.0.0 || ^19.0.0",
@@ -41,11 +41,11 @@
41
41
  "devDependencies": {
42
42
  "@types/react": "19.2.17",
43
43
  "@types/react-dom": "19.2.3",
44
- "@vitejs/plugin-react": "^6.0.3",
44
+ "@vitejs/plugin-react": "^6.0.4",
45
45
  "typescript": "^6.0.3",
46
46
  "vite": "^8.1.5",
47
47
  "vite-plugin-dts": "^5.0.3",
48
- "@object-ui/data-objectstack": "16.1.0"
48
+ "@object-ui/data-objectstack": "17.1.0"
49
49
  },
50
50
  "keywords": [
51
51
  "objectui",
@@ -74,7 +74,7 @@
74
74
  "build": "vite build",
75
75
  "test": "vitest run",
76
76
  "test:watch": "vitest",
77
- "type-check": "tsc --noEmit",
77
+ "type-check": "tsc --noEmit && tsc -p tsconfig.test.json",
78
78
  "lint": "eslint ."
79
79
  }
80
80
  }