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