@object-ui/plugin-calendar 17.1.0 → 17.3.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,120 @@
1
1
  # @object-ui/plugin-calendar
2
2
 
3
+ ## 17.3.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [18cd432]
8
+ - Updated dependencies [b7165ce]
9
+ - Updated dependencies [532cf8b]
10
+ - Updated dependencies [680080a]
11
+ - Updated dependencies [a7651e6]
12
+ - Updated dependencies [d915c47]
13
+ - Updated dependencies [b71fc92]
14
+ - Updated dependencies [65516ba]
15
+ - Updated dependencies [94c5b7c]
16
+ - Updated dependencies [ca0fa8f]
17
+ - Updated dependencies [34595eb]
18
+ - Updated dependencies [3889ffb]
19
+ - Updated dependencies [5781fb1]
20
+ - Updated dependencies [7e2406a]
21
+ - Updated dependencies [bbbde12]
22
+ - Updated dependencies [5a24ad9]
23
+ - Updated dependencies [9e9e9a9]
24
+ - Updated dependencies [19b8c9b]
25
+ - Updated dependencies [56409c2]
26
+ - Updated dependencies [042e09d]
27
+ - Updated dependencies [7d08c3f]
28
+ - Updated dependencies [9cbcbf4]
29
+ - Updated dependencies [85c4c9c]
30
+ - Updated dependencies [fd54c3e]
31
+ - Updated dependencies [4eeb932]
32
+ - Updated dependencies [6fe485b]
33
+ - Updated dependencies [5c856ec]
34
+ - Updated dependencies [23018cc]
35
+ - Updated dependencies [58a00f0]
36
+ - Updated dependencies [53811d1]
37
+ - Updated dependencies [b17ce4c]
38
+ - Updated dependencies [68b6a28]
39
+ - Updated dependencies [0554e88]
40
+ - Updated dependencies [d915c47]
41
+ - Updated dependencies [f44d872]
42
+ - Updated dependencies [28b2e65]
43
+ - Updated dependencies [509104a]
44
+ - Updated dependencies [825bbe3]
45
+ - Updated dependencies [6195841]
46
+ - Updated dependencies [5dd0127]
47
+ - Updated dependencies [06632e9]
48
+ - Updated dependencies [c7fba27]
49
+ - Updated dependencies [a415684]
50
+ - Updated dependencies [a4cff5b]
51
+ - Updated dependencies [175bd79]
52
+ - Updated dependencies [5af2852]
53
+ - Updated dependencies [12bf669]
54
+ - Updated dependencies [34d9169]
55
+ - Updated dependencies [5881a2c]
56
+ - Updated dependencies [9bc3709]
57
+ - Updated dependencies [f833d3a]
58
+ - Updated dependencies [30ae33a]
59
+ - Updated dependencies [a6ec93d]
60
+ - Updated dependencies [2a9513d]
61
+ - Updated dependencies [49f7449]
62
+ - Updated dependencies [71be406]
63
+ - Updated dependencies [d22ae31]
64
+ - Updated dependencies [c7ed4c3]
65
+ - Updated dependencies [2409e1d]
66
+ - Updated dependencies [789fe3e]
67
+ - Updated dependencies [f789c3b]
68
+ - Updated dependencies [a321fa4]
69
+ - Updated dependencies [8d8094a]
70
+ - @object-ui/core@17.3.0
71
+ - @object-ui/fields@17.3.0
72
+ - @object-ui/components@17.3.0
73
+ - @object-ui/plugin-detail@17.3.0
74
+ - @object-ui/types@17.3.0
75
+ - @object-ui/i18n@17.3.0
76
+ - @object-ui/react@17.3.0
77
+ - @object-ui/mobile@17.3.0
78
+
79
+ ## 17.2.0
80
+
81
+ ### Patch Changes
82
+
83
+ - Updated dependencies [4ae0ac4]
84
+ - Updated dependencies [696e3c1]
85
+ - Updated dependencies [bca45cc]
86
+ - Updated dependencies [6be575c]
87
+ - Updated dependencies [a889e31]
88
+ - Updated dependencies [09d30a4]
89
+ - Updated dependencies [4bf612c]
90
+ - Updated dependencies [335041c]
91
+ - Updated dependencies [b414983]
92
+ - Updated dependencies [256f8cc]
93
+ - Updated dependencies [d9668a7]
94
+ - Updated dependencies [4b470b9]
95
+ - Updated dependencies [785b8a5]
96
+ - Updated dependencies [cb82705]
97
+ - Updated dependencies [f572849]
98
+ - Updated dependencies [4a51e77]
99
+ - Updated dependencies [f6e8d78]
100
+ - Updated dependencies [ea96284]
101
+ - Updated dependencies [d3584c6]
102
+ - Updated dependencies [dd06bcd]
103
+ - Updated dependencies [a8ad6c0]
104
+ - Updated dependencies [444457c]
105
+ - Updated dependencies [850033c]
106
+ - Updated dependencies [022e4c3]
107
+ - Updated dependencies [009e25d]
108
+ - Updated dependencies [726b89c]
109
+ - @object-ui/types@17.2.0
110
+ - @object-ui/components@17.2.0
111
+ - @object-ui/core@17.2.0
112
+ - @object-ui/plugin-detail@17.2.0
113
+ - @object-ui/react@17.2.0
114
+ - @object-ui/i18n@17.2.0
115
+ - @object-ui/fields@17.2.0
116
+ - @object-ui/mobile@17.2.0
117
+
3
118
  ## 17.1.0
4
119
 
5
120
  ### Patch Changes
package/dist/index.js CHANGED
@@ -79,7 +79,8 @@ function pe({ events: t = [], view: n = "month", currentDate: r = z, locale: i =
79
79
  day: "numeric",
80
80
  year: "numeric"
81
81
  })}`;
82
- } else return S.toLocaleDateString(E, {
82
+ }
83
+ return S.toLocaleDateString(E, {
83
84
  weekday: "long",
84
85
  month: "long",
85
86
  day: "numeric",
@@ -195,7 +196,7 @@ function pe({ events: t = [], view: n = "month", currentDate: r = z, locale: i =
195
196
  onDateClick: o,
196
197
  onEventDrop: u
197
198
  }),
198
- m === "week" && /* @__PURE__ */ L(q, {
199
+ m === "week" && /* @__PURE__ */ L(K, {
199
200
  mode: "week",
200
201
  date: S,
201
202
  events: t,
@@ -205,7 +206,7 @@ function pe({ events: t = [], view: n = "month", currentDate: r = z, locale: i =
205
206
  onEventDrop: u,
206
207
  onTimeRangeSelect: d
207
208
  }),
208
- m === "day" && /* @__PURE__ */ L(q, {
209
+ m === "day" && /* @__PURE__ */ L(K, {
209
210
  mode: "day",
210
211
  date: S,
211
212
  events: t,
@@ -387,14 +388,14 @@ function W(e) {
387
388
  let t = new Date(e);
388
389
  return t.setHours(0, 0, 0, 0), t;
389
390
  }
390
- function G(e) {
391
+ function _e(e) {
391
392
  return e.getHours() * 60 + e.getMinutes();
392
393
  }
393
- function K(e) {
394
+ function G(e) {
394
395
  return `${e.getFullYear()}-${e.getMonth()}-${e.getDate()}`;
395
396
  }
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(() => {
397
+ function K({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a = 30, onEventClick: o, onEventDrop: s, onTimeRangeSelect: c }) {
398
+ let { t: l } = V(), u = U * a / 60, d = 1152, f = e.useMemo(() => {
398
399
  if (t === "day") return [W(n)];
399
400
  let e = H(n);
400
401
  return Array.from({ length: 7 }, (t, n) => {
@@ -409,7 +410,7 @@ function q({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
409
410
  ]), p = e.useMemo(() => /* @__PURE__ */ new Date(), []), m = e.useCallback((e) => {
410
411
  if (e.allDay) return !0;
411
412
  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();
412
- return !!(r && i || a >= 1440 * 60 * 1e3);
413
+ return !!(r && i || a >= 864e5);
413
414
  }, []), { allDayEvents: h, timedEvents: g } = e.useMemo(() => {
414
415
  let e = [], t = [];
415
416
  for (let n of r) m(n) ? e.push(n) : t.push(n);
@@ -419,13 +420,13 @@ function q({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
419
420
  };
420
421
  }, [r, m]), _ = e.useMemo(() => {
421
422
  let e = /* @__PURE__ */ new Map();
422
- for (let t of f) e.set(K(t), []);
423
+ for (let t of f) e.set(G(t), []);
423
424
  for (let t of h) {
424
425
  let n = W(new Date(t.start)), r = t.end ? new Date(t.end) : new Date(t.start), i = W(r);
425
426
  r.getHours() === 0 && r.getMinutes() === 0 && r.getSeconds() === 0 && r.getTime() > n.getTime() && (i = new Date(i), i.setDate(i.getDate() - 1));
426
427
  for (let r of f) {
427
428
  let a = W(r);
428
- a < n || a > i || e.get(K(r)).push({
429
+ a < n || a > i || e.get(G(r)).push({
429
430
  event: t,
430
431
  isStart: a.getTime() === n.getTime(),
431
432
  isEnd: a.getTime() === i.getTime()
@@ -435,14 +436,14 @@ function q({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
435
436
  return e;
436
437
  }, [f, h]), v = e.useMemo(() => {
437
438
  let e = /* @__PURE__ */ new Map();
438
- for (let t of f) e.set(K(t), []);
439
+ for (let t of f) e.set(G(t), []);
439
440
  for (let t of g) {
440
- let n = new Date(t.start), r = t.end ? new Date(t.end) : new Date(n.getTime() + 3600 * 1e3);
441
+ let n = new Date(t.start), r = t.end ? new Date(t.end) : new Date(n.getTime() + 36e5);
441
442
  for (let i of f) {
442
443
  let a = W(i), o = new Date(a);
443
444
  if (o.setDate(o.getDate() + 1), r <= a || n >= o) continue;
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({
445
+ let s = n < a ? a : n, c = r > o ? o : r, l = _e(s), u = c.getTime() === o.getTime() ? 1440 : _e(c);
446
+ e.get(G(i)).push({
446
447
  event: t,
447
448
  startMin: l,
448
449
  endMin: Math.max(u, l + 15),
@@ -614,47 +615,49 @@ function q({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
614
615
  }, A = (e) => {
615
616
  if (!S) return null;
616
617
  if (S.kind === "select" && S.dayIndex === e) {
617
- let t = Math.min(S.anchorMinutes, S.headMinutes), n = Math.max(S.anchorMinutes, S.headMinutes);
618
+ let t = Math.min(S.anchorMinutes, S.headMinutes), n = Math.max(S.anchorMinutes, S.headMinutes), r = t / 60 * U, a = Math.max(u, (n - t) / 60 * U);
618
619
  return /* @__PURE__ */ L("div", {
619
620
  className: "absolute left-1 right-1 rounded bg-primary/30 border border-primary pointer-events-none z-10",
620
621
  style: {
621
- top: t / 60 * U,
622
- height: Math.max(u, (n - t) / 60 * U)
622
+ top: r,
623
+ height: a
623
624
  },
624
625
  "aria-hidden": !0,
625
626
  children: /* @__PURE__ */ L("div", {
626
627
  className: "px-2 py-0.5 text-xs font-medium text-primary",
627
- children: J(f[e], t, n, i)
628
+ children: q(f[e], t, n, i)
628
629
  })
629
630
  });
630
631
  }
631
632
  if (S.kind === "move" && S.dayIndex === e) {
632
- let t = S.minutes - S.grabMinuteOffset, n = Math.max(0, Math.min(1440 - S.durationMin, Math.round(t / a) * a));
633
+ let t = S.minutes - S.grabMinuteOffset, n = Math.max(0, Math.min(1440 - S.durationMin, Math.round(t / a) * a)), r = n / 60 * U, o = S.durationMin / 60 * U;
633
634
  return /* @__PURE__ */ L("div", {
634
635
  className: "absolute left-1 right-1 rounded border-2 border-dashed border-primary bg-primary/10 pointer-events-none z-10",
635
636
  style: {
636
- top: n / 60 * U,
637
- height: S.durationMin / 60 * U
637
+ top: r,
638
+ height: o
638
639
  },
639
640
  "aria-hidden": !0,
640
641
  children: /* @__PURE__ */ L("div", {
641
642
  className: "px-2 py-0.5 text-xs font-medium text-primary",
642
- children: J(f[e], n, n + S.durationMin, i)
643
+ children: q(f[e], n, n + S.durationMin, i)
643
644
  })
644
645
  });
645
646
  }
646
647
  if ((S.kind === "resize-top" || S.kind === "resize-bottom") && S.dayIndex === e) {
647
648
  let t, n;
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", {
649
+ 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)));
650
+ let r = t / 60 * U, o = (n - t) / 60 * U;
651
+ return /* @__PURE__ */ L("div", {
649
652
  className: "absolute left-1 right-1 rounded border-2 border-dashed border-primary bg-primary/10 pointer-events-none z-10",
650
653
  style: {
651
- top: t / 60 * U,
652
- height: (n - t) / 60 * U
654
+ top: r,
655
+ height: o
653
656
  },
654
657
  "aria-hidden": !0,
655
658
  children: /* @__PURE__ */ L("div", {
656
659
  className: "px-2 py-0.5 text-xs font-medium text-primary",
657
- children: J(f[e], t, n, i)
660
+ children: q(f[e], t, n, i)
658
661
  })
659
662
  });
660
663
  }
@@ -687,10 +690,10 @@ function q({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
687
690
  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",
688
691
  children: l("calendar.allDay") === "calendar.allDay" ? "all-day" : l("calendar.allDay")
689
692
  }), f.map((e) => {
690
- let t = K(e);
693
+ let t = G(e), n = _.get(t) ?? [];
691
694
  return /* @__PURE__ */ L("div", {
692
695
  className: "flex-1 border-r last:border-r-0 min-h-[28px] p-0.5 space-y-0.5",
693
- children: (_.get(t) ?? []).map(({ event: e, isStart: t, isEnd: n }, r) => {
696
+ children: n.map(({ event: e, isStart: t, isEnd: n }, r) => {
694
697
  let { className: i, inlineColor: a } = B(e.color);
695
698
  return /* @__PURE__ */ L("div", {
696
699
  role: "button",
@@ -719,7 +722,7 @@ function q({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
719
722
  children: t === 0 ? "" : e
720
723
  }, t))
721
724
  }), f.map((e, t) => {
722
- let n = K(e), r = y.get(n) ?? [];
725
+ let n = G(e), r = y.get(n) ?? [];
723
726
  return /* @__PURE__ */ R("div", {
724
727
  ref: (e) => {
725
728
  x.current[t] = e;
@@ -775,7 +778,7 @@ function q({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
775
778
  }),
776
779
  /* @__PURE__ */ L("div", {
777
780
  className: "text-[10px] opacity-80 truncate",
778
- children: J(e, n.startMin, n.endMin, i)
781
+ children: q(e, n.startMin, n.endMin, i)
779
782
  }),
780
783
  s && n.isStart && /* @__PURE__ */ L("div", {
781
784
  onPointerDown: (e) => O(e, n, t, "top"),
@@ -799,7 +802,7 @@ function q({ mode: t, date: n, events: r, locale: i = "default", slotMinutes: a
799
802
  ]
800
803
  });
801
804
  }
802
- function J(e, t, n, r) {
805
+ function q(e, t, n, r) {
803
806
  let i = new Date(e);
804
807
  i.setHours(0, Math.round(t), 0, 0);
805
808
  let a = new Date(e);
@@ -812,7 +815,7 @@ function J(e, t, n, r) {
812
815
  }
813
816
  //#endregion
814
817
  //#region src/ObjectCalendar.tsx
815
- function _e(e) {
818
+ function ve(e) {
816
819
  return "data" in e && e.data ? e.data : "staticData" in e && e.staticData ? {
817
820
  provider: "value",
818
821
  items: e.staticData
@@ -821,7 +824,7 @@ function _e(e) {
821
824
  object: e.objectName
822
825
  } : null;
823
826
  }
824
- function ve(e) {
827
+ function ye(e) {
825
828
  if (e) {
826
829
  if (typeof e == "string") {
827
830
  let t = e.split(" "), n = t[0], r = t[1]?.toLowerCase() === "desc" ? "desc" : "asc";
@@ -830,7 +833,7 @@ function ve(e) {
830
833
  if (Array.isArray(e)) return e.reduce((e, t) => (t.field && t.order && (e[t.field] = t.order), e), {});
831
834
  }
832
835
  }
833
- function ye(e) {
836
+ function be(e) {
834
837
  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 ? {
835
838
  startDateField: e.startDateField || e.dateField,
836
839
  endDateField: e.endDateField || e.endField,
@@ -839,7 +842,7 @@ function ye(e) {
839
842
  allDayField: e.allDayField
840
843
  } : null;
841
844
  }
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 }) => {
845
+ var J = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventClick: _, onRowClick: v, onDateClick: y, onNavigate: x, onViewChange: O, onEventDrop: k, locale: A }) => {
843
846
  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(() => {
844
847
  let e = V === "day" || !V;
845
848
  return typeof window < "u" && window.innerWidth < 768 && e ? "month" : V || "month";
@@ -857,16 +860,16 @@ var Y = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventC
857
860
  e.objectName,
858
861
  j
859
862
  ]);
860
- let { ref: U, isRefreshing: W, pullDistance: G } = oe({
861
- onRefresh: n(async () => {
862
- ge((e) => e + 1);
863
- }, []),
863
+ let U = n(async () => {
864
+ ge((e) => e + 1);
865
+ }, []), { ref: W, isRefreshing: _e, pullDistance: G } = oe({
866
+ onRefresh: U,
864
867
  enabled: !!t && !!e.objectName
865
- }), K = i(() => _e(e), [
868
+ }), K = i(() => ve(e), [
866
869
  e.data,
867
870
  e.staticData,
868
871
  e.objectName
869
- ]), q = i(() => ye(e), [
872
+ ]), q = i(() => be(e), [
870
873
  e.filter,
871
874
  e.calendar,
872
875
  e.dateField,
@@ -890,12 +893,12 @@ var Y = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventC
890
893
  }
891
894
  if (!t || typeof t.find != "function") throw Error("DataSource required for object/api providers");
892
895
  if (K?.provider === "object") {
893
- let r = K.object, i = c(Y.current?.fields), a = l(await t.find(r, {
896
+ let r = K.object, i = c(Y.current?.fields), a = await t.find(r, {
894
897
  $filter: e.filter,
895
- $orderby: ve(e.sort),
898
+ $orderby: ye(e.sort),
896
899
  ...i.length > 0 ? { $expand: i } : {}
897
- }));
898
- n && N(a);
900
+ }), o = l(a);
901
+ n && N(o);
899
902
  } else K?.provider === "api" && (console.warn("API provider not yet implemented for ObjectCalendar"), n && N([]));
900
903
  n && P(!1);
901
904
  } catch (e) {
@@ -930,7 +933,7 @@ var Y = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventC
930
933
  J,
931
934
  K
932
935
  ]);
933
- let be = i(() => {
936
+ let xe = i(() => {
934
937
  if (!q || !M.length) return [];
935
938
  let { startDateField: e, endDateField: t, titleField: n, colorField: r } = q, i = (e) => {
936
939
  if (n) {
@@ -962,11 +965,11 @@ var Y = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventC
962
965
  let X = e.navigation ?? {
963
966
  mode: "drawer",
964
967
  width: "min(960px, 60vw)"
965
- }, xe = X.mode === "drawer" || X.mode === "modal" || X.mode === "split" || X.mode === "popover", Z = p({
968
+ }, Se = X.mode === "drawer" || X.mode === "modal" || X.mode === "split" || X.mode === "popover", Z = p({
966
969
  navigation: X,
967
970
  objectName: e.objectName,
968
- onRowClick: xe ? void 0 : v
969
- }), Se = n(async (n, r, i) => {
971
+ onRowClick: Se ? void 0 : v
972
+ }), Ce = n(async (n, r, i) => {
970
973
  if (!q) return;
971
974
  let { startDateField: a, endDateField: o } = q, s = n?.id ?? n?._id;
972
975
  if (!s || !e.objectName || !t?.update) return;
@@ -988,7 +991,7 @@ var Y = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventC
988
991
  t,
989
992
  M,
990
993
  ne
991
- ]), [Q, $] = o(null), Ce = n((n) => {
994
+ ]), [Q, $] = o(null), we = n((n) => {
992
995
  !q || !e.objectName || !t?.create || $({
993
996
  start: n,
994
997
  title: "",
@@ -998,7 +1001,7 @@ var Y = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventC
998
1001
  q,
999
1002
  e.objectName,
1000
1003
  t
1001
- ]), we = n((n, r) => {
1004
+ ]), Te = n((n, r) => {
1002
1005
  !q || !e.objectName || !t?.create || $({
1003
1006
  start: n,
1004
1007
  end: r,
@@ -1009,7 +1012,7 @@ var Y = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventC
1009
1012
  q,
1010
1013
  e.objectName,
1011
1014
  t
1012
- ]), Te = n(async () => {
1015
+ ]), Ee = n(async () => {
1013
1016
  if (!Q || !q) return;
1014
1017
  let n = Q.title.trim();
1015
1018
  if (!n) {
@@ -1083,26 +1086,26 @@ var Y = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventC
1083
1086
  })
1084
1087
  })
1085
1088
  }) : q ? /* @__PURE__ */ R("div", {
1086
- ref: U,
1089
+ ref: W,
1087
1090
  className: s,
1088
1091
  children: [
1089
1092
  G > 0 && /* @__PURE__ */ L("div", {
1090
1093
  className: "flex items-center justify-center text-xs text-muted-foreground",
1091
1094
  style: { height: G },
1092
- children: W ? "Refreshing…" : "Pull to refresh"
1095
+ children: _e ? "Refreshing…" : "Pull to refresh"
1093
1096
  }),
1094
1097
  /* @__PURE__ */ L("div", {
1095
1098
  className: "bg-background h-[calc(100vh-120px)] sm:h-[calc(100vh-160px)] md:h-[calc(100vh-200px)] min-h-[400px] sm:min-h-[600px]",
1096
1099
  children: /* @__PURE__ */ L(pe, {
1097
- events: be,
1100
+ events: xe,
1098
1101
  currentDate: de,
1099
1102
  view: H,
1100
1103
  locale: A,
1101
1104
  onEventClick: (e) => {
1102
- Z.handleClick(e.data), xe || _?.(e.data);
1105
+ Z.handleClick(e.data), Se || _?.(e.data);
1103
1106
  },
1104
1107
  onDateClick: (e) => {
1105
- y ? y(e) : Ce(e);
1108
+ y ? y(e) : we(e);
1106
1109
  },
1107
1110
  onNavigate: (e) => {
1108
1111
  fe(e), x?.(e);
@@ -1112,9 +1115,9 @@ var Y = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventC
1112
1115
  },
1113
1116
  onAddClick: void 0,
1114
1117
  onEventDrop: (e, t, n) => {
1115
- k ? k(e.data, t, n) : Se(e.data, t, n);
1118
+ k ? k(e.data, t, n) : Ce(e.data, t, n);
1116
1119
  },
1117
- onTimeRangeSelect: we
1120
+ onTimeRangeSelect: Te
1118
1121
  })
1119
1122
  }),
1120
1123
  /* @__PURE__ */ L(S, {
@@ -1163,7 +1166,7 @@ var Y = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventC
1163
1166
  error: void 0
1164
1167
  }),
1165
1168
  onKeyDown: (e) => {
1166
- e.key === "Enter" && !Q?.submitting && (e.preventDefault(), Te());
1169
+ e.key === "Enter" && !Q?.submitting && (e.preventDefault(), Ee());
1167
1170
  },
1168
1171
  placeholder: "What's this event about?",
1169
1172
  disabled: Q?.submitting
@@ -1180,7 +1183,7 @@ var Y = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventC
1180
1183
  disabled: Q?.submitting,
1181
1184
  children: "Cancel"
1182
1185
  }), /* @__PURE__ */ L(b, {
1183
- onClick: () => void Te(),
1186
+ onClick: () => void Ee(),
1184
1187
  disabled: Q?.submitting || !Q?.title.trim(),
1185
1188
  children: Q?.submitting ? "Creating…" : "Create"
1186
1189
  })] })
@@ -1227,9 +1230,8 @@ var Y = ({ schema: e, dataSource: t, className: s, data: h, loading: g, onEventC
1227
1230
  };
1228
1231
  //#endregion
1229
1232
  //#region src/calendar-view-renderer.tsx
1230
- s.register("calendar-view", ({ schema: e, className: n, onAction: r, ...i }) => /* @__PURE__ */ L(pe, {
1231
- className: n,
1232
- events: t.useMemo(() => !e.data || !Array.isArray(e.data) ? [] : e.data.map((t, n) => {
1233
+ s.register("calendar-view", ({ schema: e, className: n, onAction: r, ...i }) => {
1234
+ let a = t.useMemo(() => !e.data || !Array.isArray(e.data) ? [] : e.data.map((t, n) => {
1233
1235
  let r = e.titleField || "title", i = e.startDateField || "start", a = e.endDateField || "end", o = e.colorField || "color", s = e.allDayField || "allDay";
1234
1236
  return {
1235
1237
  id: t.id || t._id || n,
@@ -1247,15 +1249,19 @@ s.register("calendar-view", ({ schema: e, className: n, onAction: r, ...i }) =>
1247
1249
  e.endDateField,
1248
1250
  e.colorField,
1249
1251
  e.allDayField
1250
- ]),
1251
- onEventClick: (e) => {
1252
- r?.({
1253
- type: "event-click",
1254
- payload: e
1255
- });
1256
- },
1257
- ...i
1258
- }), {
1252
+ ]);
1253
+ return /* @__PURE__ */ L(pe, {
1254
+ className: n,
1255
+ events: a,
1256
+ onEventClick: (e) => {
1257
+ r?.({
1258
+ type: "event-click",
1259
+ payload: e
1260
+ });
1261
+ },
1262
+ ...i
1263
+ });
1264
+ }, {
1259
1265
  namespace: "plugin-calendar",
1260
1266
  label: "Calendar View",
1261
1267
  inputs: [
@@ -1375,15 +1381,15 @@ s.register("calendar-view", ({ schema: e, className: n, onAction: r, ...i }) =>
1375
1381
  });
1376
1382
  //#endregion
1377
1383
  //#region src/index.tsx
1378
- var be = ({ schema: e, ...t }) => {
1384
+ var Y = ({ schema: e, ...t }) => {
1379
1385
  let { dataSource: n } = h() || {};
1380
- return /* @__PURE__ */ L(Y, {
1386
+ return /* @__PURE__ */ L(J, {
1381
1387
  schema: e,
1382
1388
  dataSource: n,
1383
1389
  ...t
1384
1390
  });
1385
1391
  };
1386
- s.register("object-calendar", be, {
1392
+ s.register("object-calendar", Y, {
1387
1393
  namespace: "plugin-calendar",
1388
1394
  label: "Object Calendar",
1389
1395
  category: "view",
@@ -1398,7 +1404,7 @@ s.register("object-calendar", be, {
1398
1404
  label: "Calendar Config",
1399
1405
  description: "startDateField, endDateField, titleField, colorField"
1400
1406
  }]
1401
- }), s.register("calendar", be, {
1407
+ }), s.register("calendar", Y, {
1402
1408
  namespace: "view",
1403
1409
  label: "Calendar View",
1404
1410
  category: "view",
@@ -1415,4 +1421,4 @@ s.register("object-calendar", be, {
1415
1421
  }]
1416
1422
  });
1417
1423
  //#endregion
1418
- export { pe as CalendarView, Y as ObjectCalendar, be as ObjectCalendarRenderer };
1424
+ export { pe as CalendarView, J as ObjectCalendar, Y 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=(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});
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||!h.call(e,`default`)?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`})}`}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=1152,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>=864e5)},[]),{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()+36e5);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),r=t/60*k,a=Math.max(f,(n-t)/60*k);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:r,height:a},"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)),r=n/60*k,a=O.durationMin/60*k;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:r,height:a},"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;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)));let r=t/60*k,a=(n-t)/60*k;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:r,height:a},"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),n=y.get(t)??[];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:n.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 V=(0,t.useCallback)(async()=>{B(e=>e+1)},[]),{ref:H,isRefreshing:U,pullDistance:W}=(0,c.usePullToRefresh)({onRefresh:V,enabled:!!i&&!!e.objectName}),G=(0,t.useMemo)(()=>F(e),[e.data,e.staticData,e.objectName]),K=(0,t.useMemo)(()=>L(e),[e.filter,e.calendar,e.dateField,e.endField,e.titleField,e.colorField]),q=G?.provider===`value`,J=(0,t.useRef)(null);J.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),q&&G?.provider===`value`){t&&(S(G.items),T(!1));return}if(!i||typeof i.find!=`function`)throw Error(`DataSource required for object/api providers`);if(G?.provider===`object`){let r=G.object,a=(0,n.buildExpandFields)(J.current?.fields),o=await i.find(r,{$filter:e.filter,$orderby:I(e.sort),...a.length>0?{$expand:a}:{}}),s=(0,n.extractRecords)(o);t&&S(s)}else G?.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,G,i,q,e.filter,e.sort,z]),(0,t.useEffect)(()=>{!q&&i&&(async()=>{try{if(!i)return;let t=G?.provider===`object`?G.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,q,G]);let ee=(0,t.useMemo)(()=>{if(!K||!x.length)return[];let{startDateField:e,endDateField:t,titleField:r,colorField:i}=K,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,K,O]);(0,t.useCallback)(()=>{m?.(new Date)},[m]);let Y=e.navigation??{mode:`drawer`,width:`min(960px, 60vw)`},X=Y.mode===`drawer`||Y.mode===`modal`||Y.mode===`split`||Y.mode===`popover`,Z=(0,r.useNavigationOverlay)({navigation:Y,objectName:e.objectName,onRowClick:X?void 0:p}),te=(0,t.useCallback)(async(t,n,o)=>{if(!K)return;let{startDateField:s,endDateField:c}=K,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`))}},[K,e.objectName,i,x,y]),[Q,$]=(0,t.useState)(null),ne=(0,t.useCallback)(t=>{!K||!e.objectName||!i?.create||$({start:t,title:``,submitting:!1})},[K,e.objectName,i]),re=(0,t.useCallback)((t,n)=>{!K||!e.objectName||!i?.create||$({start:t,end:n,title:``,submitting:!1})},[K,e.objectName,i]),ie=(0,t.useCallback)(async()=>{if(!Q||!K)return;let t=Q.title.trim();if(!t){$(e=>e&&{...e,error:`Title is required`});return}if(!e.objectName||!i?.create)return;$(e=>e&&{...e,submitting:!0,error:void 0});let{startDateField:n,endDateField:r,titleField:a}=K,o={[a||`name`]:t,[n]:Q.start.toISOString()};r&&(o[r]=(Q.end??Q.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]),$(null)}catch(e){let t=e?.message||String(e);$(e=>e&&{...e,submitting:!1,error:t}),console.error(`[ObjectCalendar] Quick-create failed:`,e)}},[Q,K,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]})})}):K?(0,s.jsxs)(`div`,{ref:H,className:o,children:[W>0&&(0,s.jsx)(`div`,{className:`flex items-center justify-center text-xs text-muted-foreground`,style:{height:W},children:U?`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=>{Z.handleClick(e.data),X||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:!!Q,onOpenChange:e=>{e||$(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:Q&&(()=>{let e=Q.end&&Q.end.getTime()!==Q.start.getTime(),t=Q.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(Q.start),` – `,e(Q.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:Q?.title??``,onChange:e=>$(t=>t&&{...t,title:e.target.value,error:void 0}),onKeyDown:e=>{e.key===`Enter`&&!Q?.submitting&&(e.preventDefault(),ie())},placeholder:`What's this event about?`,disabled:Q?.submitting}),Q?.error&&(0,s.jsx)(`p`,{className:`text-sm text-destructive`,children:Q.error})]}),(0,s.jsxs)(a.DialogFooter,{children:[(0,s.jsx)(a.Button,{variant:`outline`,onClick:()=>$(null),disabled:Q?.submitting,children:`Cancel`}),(0,s.jsx)(a.Button,{onClick:()=>void ie(),disabled:Q?.submitting||!Q?.title.trim(),children:Q?.submitting?`Creating…`:`Create`})]})]})}),Z.isOverlay&&Z.isOpen&&Z.selectedRecord&&(()=>{let t=G?.provider===`object`?G.object:e.objectName,n=Z.selectedRecord,r=n.id??n._id;if(!t||r==null)return null;let a=K?.titleField?String(n[K.titleField]??`Event Details`):`Event Details`;return(0,s.jsx)(l.RecordDetailDrawer,{open:!0,onClose:Z.close,title:a,record:n,objectName:t,recordId:r,dataSource:i,objectSchema:O,width:Z.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": "17.1.0",
3
+ "version": "17.3.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",
@@ -24,28 +24,28 @@
24
24
  }
25
25
  },
26
26
  "dependencies": {
27
- "lucide-react": "^1.25.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"
27
+ "lucide-react": "^1.28.0",
28
+ "@object-ui/components": "17.3.0",
29
+ "@object-ui/core": "17.3.0",
30
+ "@object-ui/fields": "17.3.0",
31
+ "@object-ui/i18n": "17.3.0",
32
+ "@object-ui/mobile": "17.3.0",
33
+ "@object-ui/plugin-detail": "17.3.0",
34
+ "@object-ui/react": "17.3.0",
35
+ "@object-ui/types": "17.3.0"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "react": "^18.0.0 || ^19.0.0",
39
39
  "react-dom": "^18.0.0 || ^19.0.0"
40
40
  },
41
41
  "devDependencies": {
42
- "@types/react": "19.2.17",
43
- "@types/react-dom": "19.2.3",
44
- "@vitejs/plugin-react": "^6.0.4",
42
+ "@types/react": "19.2.18",
43
+ "@types/react-dom": "19.2.4",
44
+ "@vitejs/plugin-react": "^6.0.5",
45
45
  "typescript": "^6.0.3",
46
- "vite": "^8.1.5",
46
+ "vite": "^8.2.0",
47
47
  "vite-plugin-dts": "^5.0.3",
48
- "@object-ui/data-objectstack": "17.1.0"
48
+ "@object-ui/data-objectstack": "17.3.0"
49
49
  },
50
50
  "keywords": [
51
51
  "objectui",