@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 +115 -0
- package/dist/index.js +84 -78
- package/dist/index.umd.cjs +1 -1
- package/package.json +15 -15
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
|
-
}
|
|
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(
|
|
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(
|
|
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
|
|
391
|
+
function _e(e) {
|
|
391
392
|
return e.getHours() * 60 + e.getMinutes();
|
|
392
393
|
}
|
|
393
|
-
function
|
|
394
|
+
function G(e) {
|
|
394
395
|
return `${e.getFullYear()}-${e.getMonth()}-${e.getDate()}`;
|
|
395
396
|
}
|
|
396
|
-
function
|
|
397
|
-
let { t: l } = V(), u = U * a / 60, d =
|
|
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 >=
|
|
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(
|
|
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(
|
|
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(
|
|
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() +
|
|
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 =
|
|
445
|
-
e.get(
|
|
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:
|
|
622
|
-
height:
|
|
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:
|
|
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:
|
|
637
|
-
height:
|
|
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:
|
|
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
|
-
|
|
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:
|
|
652
|
-
height:
|
|
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:
|
|
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 =
|
|
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:
|
|
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 =
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
861
|
-
|
|
862
|
-
|
|
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(() =>
|
|
868
|
+
}), K = i(() => ve(e), [
|
|
866
869
|
e.data,
|
|
867
870
|
e.staticData,
|
|
868
871
|
e.objectName
|
|
869
|
-
]), q = i(() =>
|
|
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 =
|
|
896
|
+
let r = K.object, i = c(Y.current?.fields), a = await t.find(r, {
|
|
894
897
|
$filter: e.filter,
|
|
895
|
-
$orderby:
|
|
898
|
+
$orderby: ye(e.sort),
|
|
896
899
|
...i.length > 0 ? { $expand: i } : {}
|
|
897
|
-
}));
|
|
898
|
-
n && N(
|
|
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
|
|
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
|
-
},
|
|
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:
|
|
969
|
-
}),
|
|
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),
|
|
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
|
-
]),
|
|
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
|
-
]),
|
|
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:
|
|
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:
|
|
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:
|
|
1100
|
+
events: xe,
|
|
1098
1101
|
currentDate: de,
|
|
1099
1102
|
view: H,
|
|
1100
1103
|
locale: A,
|
|
1101
1104
|
onEventClick: (e) => {
|
|
1102
|
-
Z.handleClick(e.data),
|
|
1105
|
+
Z.handleClick(e.data), Se || _?.(e.data);
|
|
1103
1106
|
},
|
|
1104
1107
|
onDateClick: (e) => {
|
|
1105
|
-
y ? y(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) :
|
|
1118
|
+
k ? k(e.data, t, n) : Ce(e.data, t, n);
|
|
1116
1119
|
},
|
|
1117
|
-
onTimeRangeSelect:
|
|
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(),
|
|
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
|
|
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 }) =>
|
|
1231
|
-
|
|
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
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
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
|
|
1384
|
+
var Y = ({ schema: e, ...t }) => {
|
|
1379
1385
|
let { dataSource: n } = h() || {};
|
|
1380
|
-
return /* @__PURE__ */ L(
|
|
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",
|
|
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",
|
|
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,
|
|
1424
|
+
export { pe as CalendarView, J as ObjectCalendar, Y as ObjectCalendarRenderer };
|
package/dist/index.umd.cjs
CHANGED
|
@@ -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.
|
|
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.
|
|
28
|
-
"@object-ui/components": "17.
|
|
29
|
-
"@object-ui/core": "17.
|
|
30
|
-
"@object-ui/fields": "17.
|
|
31
|
-
"@object-ui/i18n": "17.
|
|
32
|
-
"@object-ui/mobile": "17.
|
|
33
|
-
"@object-ui/plugin-detail": "17.
|
|
34
|
-
"@object-ui/react": "17.
|
|
35
|
-
"@object-ui/types": "17.
|
|
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.
|
|
43
|
-
"@types/react-dom": "19.2.
|
|
44
|
-
"@vitejs/plugin-react": "^6.0.
|
|
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.
|
|
46
|
+
"vite": "^8.2.0",
|
|
47
47
|
"vite-plugin-dts": "^5.0.3",
|
|
48
|
-
"@object-ui/data-objectstack": "17.
|
|
48
|
+
"@object-ui/data-objectstack": "17.3.0"
|
|
49
49
|
},
|
|
50
50
|
"keywords": [
|
|
51
51
|
"objectui",
|