@object-ui/plugin-timeline 16.1.0 → 17.2.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 +232 -0
- package/dist/ObjectTimeline.d.ts +7 -3
- package/dist/ObjectTimeline.d.ts.map +1 -1
- package/dist/index.js +100 -90
- package/dist/index.umd.cjs +1 -1
- package/dist/renderer.d.ts +25 -0
- package/dist/renderer.d.ts.map +1 -1
- package/dist/useTimelineTranslation.d.ts +9 -4
- package/dist/useTimelineTranslation.d.ts.map +1 -1
- package/package.json +11 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,237 @@
|
|
|
1
1
|
# @object-ui/plugin-timeline
|
|
2
2
|
|
|
3
|
+
## 17.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 5cb75b3: fix(timeline,list): the timeline honours `timeline.dateField`, not just `timeline.startDateField` (#3129)
|
|
8
|
+
|
|
9
|
+
`dateField` is the pre-#2231 alias for `startDateField`. `@object-ui/types`
|
|
10
|
+
declares it on the nested config (`ListViewTimelineConfig`), and both
|
|
11
|
+
`ObjectView` read-sites (app-shell and plugin-view) resolve it — but the two
|
|
12
|
+
read-sites that actually drive the axis did not:
|
|
13
|
+
|
|
14
|
+
- `ObjectTimeline` consulted the alias only on the FLAT prop (`schema.dateField`),
|
|
15
|
+
never on the nested `schema.timeline`.
|
|
16
|
+
- `ListView` resolved it out of `options.timeline` but not out of the
|
|
17
|
+
spec-canonical `schema.timeline` — including in the capability gate, so such a
|
|
18
|
+
view could fail to offer the Timeline option at all.
|
|
19
|
+
|
|
20
|
+
So a view authored as `timeline: { dateField: 'start_date' }` — the spec nesting
|
|
21
|
+
with the legacy key — fell through to the caller's default (`created_at` /
|
|
22
|
+
`due_date`). That field is normally absent from the `$select` projection, so
|
|
23
|
+
every record came back without it and the timeline rendered all of them under
|
|
24
|
+
**No date** — while the configured date was sitting in the row untouched. That
|
|
25
|
+
also explains why widening the view's projection changed nothing: the projection
|
|
26
|
+
already carried the right field; the renderer was reading a different one.
|
|
27
|
+
|
|
28
|
+
Both read-sites now resolve the alias in the same precedence position they
|
|
29
|
+
already use for `options.timeline.dateField`. The spec key still wins wherever
|
|
30
|
+
both appear. Observable rendering change (records move out of "No date" into
|
|
31
|
+
real date buckets), hence `minor`.
|
|
32
|
+
|
|
33
|
+
### Patch Changes
|
|
34
|
+
|
|
35
|
+
- Updated dependencies [4ae0ac4]
|
|
36
|
+
- Updated dependencies [696e3c1]
|
|
37
|
+
- Updated dependencies [bca45cc]
|
|
38
|
+
- Updated dependencies [a889e31]
|
|
39
|
+
- Updated dependencies [09d30a4]
|
|
40
|
+
- Updated dependencies [4bf612c]
|
|
41
|
+
- Updated dependencies [335041c]
|
|
42
|
+
- Updated dependencies [b414983]
|
|
43
|
+
- Updated dependencies [256f8cc]
|
|
44
|
+
- Updated dependencies [d9668a7]
|
|
45
|
+
- Updated dependencies [4b470b9]
|
|
46
|
+
- Updated dependencies [cb82705]
|
|
47
|
+
- Updated dependencies [f572849]
|
|
48
|
+
- Updated dependencies [f6e8d78]
|
|
49
|
+
- Updated dependencies [ea96284]
|
|
50
|
+
- Updated dependencies [d3584c6]
|
|
51
|
+
- Updated dependencies [a8ad6c0]
|
|
52
|
+
- Updated dependencies [444457c]
|
|
53
|
+
- Updated dependencies [850033c]
|
|
54
|
+
- Updated dependencies [022e4c3]
|
|
55
|
+
- Updated dependencies [009e25d]
|
|
56
|
+
- Updated dependencies [726b89c]
|
|
57
|
+
- @object-ui/types@17.2.0
|
|
58
|
+
- @object-ui/components@17.2.0
|
|
59
|
+
- @object-ui/core@17.2.0
|
|
60
|
+
- @object-ui/react@17.2.0
|
|
61
|
+
- @object-ui/i18n@17.2.0
|
|
62
|
+
- @object-ui/mobile@17.2.0
|
|
63
|
+
|
|
64
|
+
## 17.1.0
|
|
65
|
+
|
|
66
|
+
### Patch Changes
|
|
67
|
+
|
|
68
|
+
- Updated dependencies [62311b6]
|
|
69
|
+
- Updated dependencies [fc0272a]
|
|
70
|
+
- Updated dependencies [9e7349e]
|
|
71
|
+
- Updated dependencies [8864971]
|
|
72
|
+
- Updated dependencies [1cf0de7]
|
|
73
|
+
- Updated dependencies [752e18f]
|
|
74
|
+
- Updated dependencies [c785740]
|
|
75
|
+
- Updated dependencies [b41f401]
|
|
76
|
+
- Updated dependencies [19e9fa0]
|
|
77
|
+
- Updated dependencies [d61efd1]
|
|
78
|
+
- Updated dependencies [95b7214]
|
|
79
|
+
- Updated dependencies [7d9734d]
|
|
80
|
+
- Updated dependencies [6ae818e]
|
|
81
|
+
- Updated dependencies [9eb932b]
|
|
82
|
+
- Updated dependencies [746dd00]
|
|
83
|
+
- Updated dependencies [aebfa4f]
|
|
84
|
+
- Updated dependencies [38ca8be]
|
|
85
|
+
- Updated dependencies [3cb9646]
|
|
86
|
+
- Updated dependencies [68ef584]
|
|
87
|
+
- Updated dependencies [4952edf]
|
|
88
|
+
- Updated dependencies [7f0252e]
|
|
89
|
+
- Updated dependencies [c4d7b20]
|
|
90
|
+
- Updated dependencies [c769d3d]
|
|
91
|
+
- Updated dependencies [7639a61]
|
|
92
|
+
- Updated dependencies [94e63ef]
|
|
93
|
+
- Updated dependencies [c735bf7]
|
|
94
|
+
- Updated dependencies [02aef0c]
|
|
95
|
+
- Updated dependencies [6f29aa5]
|
|
96
|
+
- Updated dependencies [d21794c]
|
|
97
|
+
- Updated dependencies [c4db402]
|
|
98
|
+
- Updated dependencies [5319bf1]
|
|
99
|
+
- Updated dependencies [49e5671]
|
|
100
|
+
- Updated dependencies [9a04d25]
|
|
101
|
+
- Updated dependencies [b5b97e2]
|
|
102
|
+
- Updated dependencies [f59f2c1]
|
|
103
|
+
- Updated dependencies [07de839]
|
|
104
|
+
- Updated dependencies [2a40b5e]
|
|
105
|
+
- Updated dependencies [df613fa]
|
|
106
|
+
- Updated dependencies [4874117]
|
|
107
|
+
- Updated dependencies [ad0183a]
|
|
108
|
+
- Updated dependencies [ce08d55]
|
|
109
|
+
- Updated dependencies [eb4b740]
|
|
110
|
+
- Updated dependencies [5b084eb]
|
|
111
|
+
- Updated dependencies [aa1240a]
|
|
112
|
+
- Updated dependencies [2374a49]
|
|
113
|
+
- Updated dependencies [390c071]
|
|
114
|
+
- Updated dependencies [d10f526]
|
|
115
|
+
- Updated dependencies [2d5d594]
|
|
116
|
+
- Updated dependencies [ea7f477]
|
|
117
|
+
- Updated dependencies [379728f]
|
|
118
|
+
- Updated dependencies [7f23cd0]
|
|
119
|
+
- Updated dependencies [0ded602]
|
|
120
|
+
- Updated dependencies [24e0e0a]
|
|
121
|
+
- Updated dependencies [f8a95e5]
|
|
122
|
+
- Updated dependencies [3a6cf24]
|
|
123
|
+
- Updated dependencies [aa35561]
|
|
124
|
+
- Updated dependencies [03bd53b]
|
|
125
|
+
- Updated dependencies [3c1f321]
|
|
126
|
+
- Updated dependencies [a045a32]
|
|
127
|
+
- Updated dependencies [912496d]
|
|
128
|
+
- Updated dependencies [80edbd4]
|
|
129
|
+
- Updated dependencies [9867281]
|
|
130
|
+
- @object-ui/core@17.1.0
|
|
131
|
+
- @object-ui/components@17.1.0
|
|
132
|
+
- @object-ui/react@17.1.0
|
|
133
|
+
- @object-ui/types@17.1.0
|
|
134
|
+
- @object-ui/i18n@17.1.0
|
|
135
|
+
- @object-ui/mobile@17.1.0
|
|
136
|
+
|
|
137
|
+
## 17.0.0
|
|
138
|
+
|
|
139
|
+
### Patch Changes
|
|
140
|
+
|
|
141
|
+
- 7d46648: fix(hooks): stop calling translation hooks inside try/catch (objectui#2879)
|
|
142
|
+
|
|
143
|
+
Eleven call sites wrapped a React hook in `try`/`catch` to make it
|
|
144
|
+
"provider-safe". `useObjectTranslation` and `useObjectLabel` already are — they
|
|
145
|
+
read context optionally and fall back to react-i18next's global instance, and
|
|
146
|
+
never throw. The `catch` bought nothing and cost correctness: a throw _after_
|
|
147
|
+
the hook ran desyncs hook order on the next render, because React matches hooks
|
|
148
|
+
positionally. objectui#2595/#2596 fixed exactly this in `@object-ui/i18n`'s
|
|
149
|
+
`createSafeTranslation`; nine plugin-local re-implementations kept their own
|
|
150
|
+
copy of the bug, and two more (`ObjectTimeline`, `ObjectView`) were found by the
|
|
151
|
+
new lint rule below — `ObjectView` had even suppressed
|
|
152
|
+
`react-hooks/rules-of-hooks` inline to keep it.
|
|
153
|
+
|
|
154
|
+
- Six exact re-implementations now delegate to `createSafeTranslation`:
|
|
155
|
+
`plugin-detail`, `plugin-timeline`, `plugin-list`, `plugin-calendar`,
|
|
156
|
+
`plugin-grid`'s `ObjectGrid`, `plugin-designer`.
|
|
157
|
+
- `components`' `data-table` also delegates; `createSafeTranslation` now
|
|
158
|
+
returns `language` alongside `t` so consumers that localize dates don't need
|
|
159
|
+
a second hook call. Purely additive.
|
|
160
|
+
- `plugin-gantt` and `plugin-grid`'s `ImportWizard` keep their local hooks —
|
|
161
|
+
they fall back _per key_, which a single-probe factory cannot express and
|
|
162
|
+
which their comments justify (a host dictionary that covers common keys but
|
|
163
|
+
lags on newer ones). Only the `try`/`catch` is removed.
|
|
164
|
+
- `ObjectTimeline` and `ObjectView` call the hook directly and probe the
|
|
165
|
+
returned value, mirroring `useSafeFieldLabel`.
|
|
166
|
+
|
|
167
|
+
Adds `object-ui/no-try-catch-around-hook` (error) so a twelfth copy fails CI.
|
|
168
|
+
It only matches `use*` names, accepts member calls solely on `React` (so
|
|
169
|
+
`vi.useRealTimers()` is not a hook), and resets its try-depth inside nested
|
|
170
|
+
functions (so `renderHook(() => useThing())` inside a `try` is fine) — both
|
|
171
|
+
false positives were real code in this repo and are pinned in the rule's tests.
|
|
172
|
+
|
|
173
|
+
`eslint-rules/**/*.test.js` matched no vitest project glob, so the local
|
|
174
|
+
plugin's specs had never run in CI. They are now included; all three pass.
|
|
175
|
+
|
|
176
|
+
`ObjectTimeline`'s test mock of `@object-ui/react` omitted `useObjectLabel` —
|
|
177
|
+
the removed `try`/`catch` had been silently absorbing that gap. The mock is now
|
|
178
|
+
complete.
|
|
179
|
+
|
|
180
|
+
- Updated dependencies [7b21891]
|
|
181
|
+
- Updated dependencies [0b3be01]
|
|
182
|
+
- Updated dependencies [3c4d935]
|
|
183
|
+
- Updated dependencies [4b60d2d]
|
|
184
|
+
- Updated dependencies [952b978]
|
|
185
|
+
- Updated dependencies [de5e40c]
|
|
186
|
+
- Updated dependencies [1a03af6]
|
|
187
|
+
- Updated dependencies [3e886eb]
|
|
188
|
+
- Updated dependencies [cfc675e]
|
|
189
|
+
- Updated dependencies [20df08c]
|
|
190
|
+
- Updated dependencies [1767124]
|
|
191
|
+
- Updated dependencies [8ecf5a6]
|
|
192
|
+
- Updated dependencies [af705b9]
|
|
193
|
+
- Updated dependencies [0502a7c]
|
|
194
|
+
- Updated dependencies [7b35e4b]
|
|
195
|
+
- Updated dependencies [8fb1295]
|
|
196
|
+
- Updated dependencies [e16ed2d]
|
|
197
|
+
- Updated dependencies [c6fd752]
|
|
198
|
+
- Updated dependencies [f9bbddb]
|
|
199
|
+
- Updated dependencies [dfd3705]
|
|
200
|
+
- Updated dependencies [c77108c]
|
|
201
|
+
- Updated dependencies [2735de6]
|
|
202
|
+
- Updated dependencies [c19ac11]
|
|
203
|
+
- Updated dependencies [6dee2cb]
|
|
204
|
+
- Updated dependencies [e05f052]
|
|
205
|
+
- Updated dependencies [0502a7c]
|
|
206
|
+
- Updated dependencies [faad45e]
|
|
207
|
+
- Updated dependencies [09c6a17]
|
|
208
|
+
- Updated dependencies [c7cff19]
|
|
209
|
+
- Updated dependencies [ba73a02]
|
|
210
|
+
- Updated dependencies [cd09a7b]
|
|
211
|
+
- Updated dependencies [f1abf0e]
|
|
212
|
+
- Updated dependencies [f05b84e]
|
|
213
|
+
- Updated dependencies [9b4b952]
|
|
214
|
+
- Updated dependencies [2f947e4]
|
|
215
|
+
- Updated dependencies [7d46648]
|
|
216
|
+
- Updated dependencies [9b53d72]
|
|
217
|
+
- Updated dependencies [bb4aa25]
|
|
218
|
+
- Updated dependencies [75f1cdf]
|
|
219
|
+
- Updated dependencies [662bdf9]
|
|
220
|
+
- Updated dependencies [059a052]
|
|
221
|
+
- Updated dependencies [53642d4]
|
|
222
|
+
- Updated dependencies [8aae006]
|
|
223
|
+
- Updated dependencies [c6cfdf1]
|
|
224
|
+
- Updated dependencies [d147a13]
|
|
225
|
+
- Updated dependencies [c6aaed8]
|
|
226
|
+
- Updated dependencies [263f885]
|
|
227
|
+
- Updated dependencies [dc334da]
|
|
228
|
+
- @object-ui/components@17.0.0
|
|
229
|
+
- @object-ui/i18n@17.0.0
|
|
230
|
+
- @object-ui/react@17.0.0
|
|
231
|
+
- @object-ui/types@17.0.0
|
|
232
|
+
- @object-ui/core@17.0.0
|
|
233
|
+
- @object-ui/mobile@17.0.0
|
|
234
|
+
|
|
3
235
|
## 16.1.0
|
|
4
236
|
|
|
5
237
|
### Patch Changes
|
package/dist/ObjectTimeline.d.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
-
import { DataSource, TimelineSchema,
|
|
2
|
+
import { DataSource, TimelineSchema, ListViewTimelineConfig } from '@object-ui/types';
|
|
3
3
|
export interface ObjectTimelineProps {
|
|
4
4
|
schema: TimelineSchema & {
|
|
5
5
|
objectName?: string;
|
|
6
|
-
/**
|
|
7
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Spec-compliant nested timeline config. Typed as `ListViewTimelineConfig`
|
|
8
|
+
* — the spec shape plus the legacy `dateField` alias that `@object-ui/types`
|
|
9
|
+
* has always declared on it, and that this renderer now actually reads.
|
|
10
|
+
*/
|
|
11
|
+
timeline?: ListViewTimelineConfig;
|
|
8
12
|
/** @deprecated Use timeline.titleField instead */
|
|
9
13
|
titleField?: string;
|
|
10
14
|
/** @deprecated Use timeline.startDateField instead */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectTimeline.d.ts","sourceRoot":"","sources":["../src/ObjectTimeline.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAoD,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"ObjectTimeline.d.ts","sourceRoot":"","sources":["../src/ObjectTimeline.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAoD,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAmD3F,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,GAAG;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB;;;;WAIG;QACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;QAClC,kDAAkD;QAClD,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,sDAAsD;QACtD,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,sDAAsD;QACtD,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,oDAAoD;QACpD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,oDAAoD;QACpD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,kDAAkD;QAClD,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,6CAA6C;QAC7C,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;QAE/D,OAAO,CAAC,EAAE;YACR,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAA;KACF,CAAC;IACF,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;CACrC;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAyVxD,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -3,26 +3,76 @@ import { useCallback as t, useEffect as n, useMemo as r, useState as i } from "r
|
|
|
3
3
|
import { NavigationOverlay as a, cn as o, cva as s, renderChildren as c } from "@object-ui/components";
|
|
4
4
|
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
5
5
|
import { ComponentRegistry as d, buildExpandFields as f, extractRecords as p } from "@object-ui/core";
|
|
6
|
-
import { useDataScope as m, useNavigationOverlay as h, useObjectLabel as g,
|
|
6
|
+
import { useDataScope as m, useNavigationOverlay as h, useObjectLabel as g, useSchemaContext as _ } from "@object-ui/react";
|
|
7
7
|
import { usePullToRefresh as ee } from "@object-ui/mobile";
|
|
8
|
-
import { z as
|
|
8
|
+
import { z as v } from "zod";
|
|
9
|
+
import { createSafeTranslation as y } from "@object-ui/i18n";
|
|
9
10
|
//#region src/renderer.tsx
|
|
10
|
-
var b =
|
|
11
|
+
var b = /* @__PURE__ */ new Set([
|
|
12
|
+
"hour",
|
|
13
|
+
"day",
|
|
14
|
+
"week",
|
|
15
|
+
"month",
|
|
16
|
+
"quarter",
|
|
17
|
+
"year"
|
|
18
|
+
]);
|
|
11
19
|
function x(e) {
|
|
20
|
+
let t = e.scale ?? e.timeScale;
|
|
21
|
+
return typeof t == "string" && b.has(t) ? t : "month";
|
|
22
|
+
}
|
|
23
|
+
function S(e, t, n) {
|
|
24
|
+
let r = [], i = new Date(t), a = new Date(n);
|
|
25
|
+
if (Number.isNaN(i.getTime()) || Number.isNaN(a.getTime()) || i > a) return r;
|
|
26
|
+
let o = new Date(i);
|
|
27
|
+
switch (e) {
|
|
28
|
+
case "hour":
|
|
29
|
+
for (; o <= a;) r.push(o.toLocaleString("en-US", {
|
|
30
|
+
month: "short",
|
|
31
|
+
day: "numeric",
|
|
32
|
+
hour: "numeric"
|
|
33
|
+
})), o.setHours(o.getHours() + 1);
|
|
34
|
+
break;
|
|
35
|
+
case "day":
|
|
36
|
+
for (; o <= a;) r.push(o.toLocaleDateString("en-US", {
|
|
37
|
+
month: "short",
|
|
38
|
+
day: "numeric"
|
|
39
|
+
})), o.setDate(o.getDate() + 1);
|
|
40
|
+
break;
|
|
41
|
+
case "week": {
|
|
42
|
+
let e = 1;
|
|
43
|
+
for (; o <= a;) r.push(`Week ${e++}`), o.setDate(o.getDate() + 7);
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case "quarter":
|
|
47
|
+
for (o.setMonth(Math.floor(o.getMonth() / 3) * 3, 1); o <= a;) r.push(`Q${Math.floor(o.getMonth() / 3) + 1} ${o.getFullYear()}`), o.setMonth(o.getMonth() + 3);
|
|
48
|
+
break;
|
|
49
|
+
case "year":
|
|
50
|
+
for (o.setMonth(0, 1); o <= a;) r.push(String(o.getFullYear())), o.setFullYear(o.getFullYear() + 1);
|
|
51
|
+
break;
|
|
52
|
+
default:
|
|
53
|
+
for (; o <= a;) r.push(o.toLocaleDateString("en-US", {
|
|
54
|
+
month: "short",
|
|
55
|
+
year: "numeric"
|
|
56
|
+
})), o.setMonth(o.getMonth() + 1);
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
return r;
|
|
60
|
+
}
|
|
61
|
+
function C(e) {
|
|
12
62
|
let t = e.flatMap((e) => (e.items || []).flatMap((e) => [e.startDate, e.endDate])), n = Math.min(...t.map((e) => new Date(e).getTime())), r = Math.max(...t.map((e) => new Date(e).getTime()));
|
|
13
63
|
return {
|
|
14
64
|
minDate: new Date(n).toISOString().split("T")[0],
|
|
15
65
|
maxDate: new Date(r).toISOString().split("T")[0]
|
|
16
66
|
};
|
|
17
67
|
}
|
|
18
|
-
function
|
|
68
|
+
function w(e, t, n, r) {
|
|
19
69
|
let i = new Date(e).getTime(), a = new Date(t).getTime(), o = new Date(n).getTime(), s = new Date(r).getTime() - o, c = i - o, l = a - i;
|
|
20
70
|
return {
|
|
21
71
|
start: c / s * 100,
|
|
22
72
|
width: l / s * 100
|
|
23
73
|
};
|
|
24
74
|
}
|
|
25
|
-
function
|
|
75
|
+
function T(e, t) {
|
|
26
76
|
let n = new Date(e);
|
|
27
77
|
return t === "short" ? n.toLocaleDateString() : t === "long" ? n.toLocaleDateString("en-US", {
|
|
28
78
|
year: "numeric",
|
|
@@ -30,7 +80,7 @@ function C(e, t) {
|
|
|
30
80
|
day: "numeric"
|
|
31
81
|
}) : n.toISOString().split("T")[0];
|
|
32
82
|
}
|
|
33
|
-
function
|
|
83
|
+
function E({ label: e, color: t }) {
|
|
34
84
|
let n = t ? {
|
|
35
85
|
backgroundColor: `${t}22`,
|
|
36
86
|
color: t,
|
|
@@ -42,7 +92,7 @@ function w({ label: e, color: t }) {
|
|
|
42
92
|
children: e
|
|
43
93
|
});
|
|
44
94
|
}
|
|
45
|
-
function
|
|
95
|
+
function D(e) {
|
|
46
96
|
let t = [];
|
|
47
97
|
for (let n of e) {
|
|
48
98
|
let e = n.group == null ? "" : String(n.group), r = t[t.length - 1];
|
|
@@ -53,14 +103,14 @@ function T(e) {
|
|
|
53
103
|
}
|
|
54
104
|
return t;
|
|
55
105
|
}
|
|
56
|
-
var
|
|
106
|
+
var O = ({ schema: e, className: t, ...n }) => {
|
|
57
107
|
let { variant: r = "vertical", items: i = [], dateFormat: a = "short", onItemClick: s } = e;
|
|
58
108
|
if (r === "vertical") {
|
|
59
|
-
let e =
|
|
109
|
+
let e = D(i), r = e.some((e) => e.key !== ""), d = (e, t) => {
|
|
60
110
|
let n = e.color ? {
|
|
61
111
|
backgroundColor: `${e.color}33`,
|
|
62
112
|
borderColor: e.color
|
|
63
|
-
} : void 0, r = e.time ?
|
|
113
|
+
} : void 0, r = e.time ? T(e.time, a) : e.startDate ? T(e.startDate, a) : "", i = e.endDate && e.endDate !== e.startDate ? T(e.endDate, a) : "", d = Array.isArray(e.meta) ? e.meta : [];
|
|
64
114
|
return /* @__PURE__ */ u(I, {
|
|
65
115
|
density: "compact",
|
|
66
116
|
className: o(e.className, s && "cursor-pointer"),
|
|
@@ -87,7 +137,7 @@ var E = ({ schema: e, className: t, ...n }) => {
|
|
|
87
137
|
}),
|
|
88
138
|
d.length > 0 && /* @__PURE__ */ l("div", {
|
|
89
139
|
className: "flex flex-wrap gap-1.5 mt-1 mb-1",
|
|
90
|
-
children: d.map((e) => /* @__PURE__ */ l(
|
|
140
|
+
children: d.map((e) => /* @__PURE__ */ l(E, {
|
|
91
141
|
label: e.label,
|
|
92
142
|
color: e.color
|
|
93
143
|
}, e.key))
|
|
@@ -141,7 +191,7 @@ var E = ({ schema: e, className: t, ...n }) => {
|
|
|
141
191
|
children: [
|
|
142
192
|
e.time && /* @__PURE__ */ l(V, {
|
|
143
193
|
dateTime: e.time,
|
|
144
|
-
children:
|
|
194
|
+
children: T(e.time, a)
|
|
145
195
|
}),
|
|
146
196
|
e.title && /* @__PURE__ */ l(B, { children: e.title }),
|
|
147
197
|
e.description && /* @__PURE__ */ l(H, {
|
|
@@ -155,26 +205,7 @@ var E = ({ schema: e, className: t, ...n }) => {
|
|
|
155
205
|
}, t))
|
|
156
206
|
});
|
|
157
207
|
if (r === "gantt") {
|
|
158
|
-
let r =
|
|
159
|
-
let e = [], t = new Date(c), n = new Date(d);
|
|
160
|
-
if (f === "month") {
|
|
161
|
-
let r = new Date(t);
|
|
162
|
-
for (; r <= n;) e.push(r.toLocaleDateString("en-US", {
|
|
163
|
-
month: "short",
|
|
164
|
-
year: "numeric"
|
|
165
|
-
})), r.setMonth(r.getMonth() + 1);
|
|
166
|
-
} else if (f === "week") {
|
|
167
|
-
let r = new Date(t);
|
|
168
|
-
for (; r <= n;) e.push(`Week ${Math.ceil((r.getTime() - t.getTime()) / b) + 1}`), r.setDate(r.getDate() + 7);
|
|
169
|
-
} else if (f === "day") {
|
|
170
|
-
let r = new Date(t);
|
|
171
|
-
for (; r <= n;) e.push(r.toLocaleDateString("en-US", {
|
|
172
|
-
month: "short",
|
|
173
|
-
day: "numeric"
|
|
174
|
-
})), r.setDate(r.getDate() + 1);
|
|
175
|
-
}
|
|
176
|
-
return e;
|
|
177
|
-
})();
|
|
208
|
+
let r = C(i), c = e.minDate || r.minDate, d = e.maxDate || r.maxDate, f = S(x(e), c, d);
|
|
178
209
|
return /* @__PURE__ */ u(G, {
|
|
179
210
|
className: o("overflow-x-auto [-webkit-overflow-scrolling:touch]", t),
|
|
180
211
|
...n,
|
|
@@ -186,7 +217,7 @@ var E = ({ schema: e, className: t, ...n }) => {
|
|
|
186
217
|
})
|
|
187
218
|
}), /* @__PURE__ */ l(J, { children: /* @__PURE__ */ l("div", {
|
|
188
219
|
className: "flex h-full",
|
|
189
|
-
children:
|
|
220
|
+
children: f.map((e, t) => /* @__PURE__ */ l("div", {
|
|
190
221
|
className: "flex-1 px-1 sm:px-2 py-2 sm:py-3 border-r text-xs font-medium text-center",
|
|
191
222
|
children: e
|
|
192
223
|
}, t))
|
|
@@ -201,13 +232,13 @@ var E = ({ schema: e, className: t, ...n }) => {
|
|
|
201
232
|
children: i.map((e, t) => /* @__PURE__ */ l(Y, {
|
|
202
233
|
className: "relative",
|
|
203
234
|
children: (e.items || []).map((n, r) => {
|
|
204
|
-
let i =
|
|
235
|
+
let i = w(n.startDate, n.endDate, c, d);
|
|
205
236
|
return /* @__PURE__ */ l(Z, {
|
|
206
237
|
start: i.start,
|
|
207
238
|
width: i.width,
|
|
208
239
|
variant: n.variant || "default",
|
|
209
240
|
onClick: () => s?.(n, e, t, r),
|
|
210
|
-
title: `${n.title || ""}\n${
|
|
241
|
+
title: `${n.title || ""}\n${T(n.startDate, a)} - ${T(n.endDate, a)}`,
|
|
211
242
|
children: /* @__PURE__ */ l(Q, { children: n.title })
|
|
212
243
|
}, r);
|
|
213
244
|
})
|
|
@@ -218,7 +249,7 @@ var E = ({ schema: e, className: t, ...n }) => {
|
|
|
218
249
|
}
|
|
219
250
|
return null;
|
|
220
251
|
};
|
|
221
|
-
d.register("timeline",
|
|
252
|
+
d.register("timeline", O, {
|
|
222
253
|
namespace: "plugin-timeline",
|
|
223
254
|
label: "Timeline",
|
|
224
255
|
category: "data-display",
|
|
@@ -413,9 +444,7 @@ d.register("timeline", E, {
|
|
|
413
444
|
}
|
|
414
445
|
}
|
|
415
446
|
});
|
|
416
|
-
|
|
417
|
-
//#region src/useTimelineTranslation.ts
|
|
418
|
-
var D = {
|
|
447
|
+
var k = y({
|
|
419
448
|
"timeline.bucket.overdue": "Overdue",
|
|
420
449
|
"timeline.bucket.today": "Today",
|
|
421
450
|
"timeline.bucket.tomorrow": "Tomorrow",
|
|
@@ -429,49 +458,30 @@ var D = {
|
|
|
429
458
|
"timeline.relative.yesterday": "Yesterday",
|
|
430
459
|
"timeline.relative.inDays": "In {{n}} days",
|
|
431
460
|
"timeline.relative.daysAgo": "{{n}} days ago"
|
|
432
|
-
},
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
}
|
|
438
|
-
function A() {
|
|
439
|
-
try {
|
|
440
|
-
let e = _();
|
|
441
|
-
return e.t(O) === O ? { t: k } : { t: e.t };
|
|
442
|
-
} catch {
|
|
443
|
-
return { t: k };
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
//#endregion
|
|
447
|
-
//#region src/ObjectTimeline.tsx
|
|
461
|
+
}, "timeline.bucket.today"), A = {
|
|
462
|
+
fieldOptionLabel: (e, t, n, r) => r,
|
|
463
|
+
translateOptions: (e, t, n) => n,
|
|
464
|
+
fieldLabel: (e, t, n) => n
|
|
465
|
+
};
|
|
448
466
|
function j() {
|
|
449
|
-
|
|
450
|
-
return g();
|
|
451
|
-
} catch {
|
|
452
|
-
return {
|
|
453
|
-
fieldOptionLabel: (e, t, n, r) => r,
|
|
454
|
-
translateOptions: (e, t, n) => n,
|
|
455
|
-
fieldLabel: (e, t, n) => n
|
|
456
|
-
};
|
|
457
|
-
}
|
|
467
|
+
return g() ?? A;
|
|
458
468
|
}
|
|
459
|
-
var M =
|
|
460
|
-
title:
|
|
461
|
-
date:
|
|
462
|
-
description:
|
|
463
|
-
variant:
|
|
464
|
-
}), te =
|
|
469
|
+
var M = v.object({
|
|
470
|
+
title: v.string().optional(),
|
|
471
|
+
date: v.string().optional(),
|
|
472
|
+
description: v.string().optional(),
|
|
473
|
+
variant: v.string().optional()
|
|
474
|
+
}), te = v.object({
|
|
465
475
|
mapping: M.optional(),
|
|
466
|
-
objectName:
|
|
467
|
-
titleField:
|
|
468
|
-
dateField:
|
|
469
|
-
startDateField:
|
|
470
|
-
endDateField:
|
|
471
|
-
descriptionField:
|
|
472
|
-
groupByField:
|
|
473
|
-
colorField:
|
|
474
|
-
scale:
|
|
476
|
+
objectName: v.string().optional(),
|
|
477
|
+
titleField: v.string().optional(),
|
|
478
|
+
dateField: v.string().optional(),
|
|
479
|
+
startDateField: v.string().optional(),
|
|
480
|
+
endDateField: v.string().optional(),
|
|
481
|
+
descriptionField: v.string().optional(),
|
|
482
|
+
groupByField: v.string().optional(),
|
|
483
|
+
colorField: v.string().optional(),
|
|
484
|
+
scale: v.enum([
|
|
475
485
|
"hour",
|
|
476
486
|
"day",
|
|
477
487
|
"week",
|
|
@@ -483,18 +493,18 @@ var M = y.object({
|
|
|
483
493
|
let [_, v] = i([]), [y, b] = i(() => {
|
|
484
494
|
let t = Array.isArray(e.items) && e.items.length > 0, n = Array.isArray(g.data) && g.data.length > 0;
|
|
485
495
|
return !t && !n && !!e.objectName;
|
|
486
|
-
}), [x, S] = i(null), [C, w] = i(0), [T,
|
|
496
|
+
}), [x, S] = i(null), [C, w] = i(0), [T, E] = i(null), D = e.timeline;
|
|
487
497
|
n(() => {
|
|
488
498
|
let t = te.safeParse(e);
|
|
489
499
|
t.success || console.warn("[ObjectTimeline] Invalid timeline configuration:", t.error.format());
|
|
490
500
|
}, [e]);
|
|
491
|
-
let
|
|
501
|
+
let A = m(e.bind);
|
|
492
502
|
n(() => {
|
|
493
503
|
let t = !0;
|
|
494
504
|
return (async () => {
|
|
495
505
|
if (!(!o || typeof o.getObjectSchema != "function" || !e.objectName)) try {
|
|
496
506
|
let n = await o.getObjectSchema(e.objectName);
|
|
497
|
-
t &&
|
|
507
|
+
t && E(n);
|
|
498
508
|
} catch (e) {
|
|
499
509
|
console.warn("Failed to fetch object def for ObjectTimeline", e);
|
|
500
510
|
}
|
|
@@ -502,7 +512,7 @@ var M = y.object({
|
|
|
502
512
|
t = !1;
|
|
503
513
|
};
|
|
504
514
|
}, [e.objectName, o]), n(() => {
|
|
505
|
-
e.objectName && !
|
|
515
|
+
e.objectName && !A && !e.items && !g.data ? (async () => {
|
|
506
516
|
if (!o || typeof o.find != "function" || !e.objectName) {
|
|
507
517
|
b(!1);
|
|
508
518
|
return;
|
|
@@ -523,13 +533,13 @@ var M = y.object({
|
|
|
523
533
|
}, [
|
|
524
534
|
e.objectName,
|
|
525
535
|
o,
|
|
526
|
-
|
|
536
|
+
A,
|
|
527
537
|
e.items,
|
|
528
538
|
g.data,
|
|
529
539
|
C,
|
|
530
540
|
T
|
|
531
541
|
]);
|
|
532
|
-
let M = g.data ||
|
|
542
|
+
let M = g.data || A || _, { t: N } = k(), { fieldOptionLabel: P } = j(), F = D?.titleField ?? e.mapping?.title ?? e.titleField ?? "name", I = D?.startDateField ?? D?.dateField ?? e.mapping?.date ?? e.startDateField ?? e.dateField ?? "date", L = D?.endDateField ?? e.endDateField ?? I, R = e.mapping?.description ?? e.descriptionField ?? "description", z = e.mapping?.variant ?? "variant", B = D?.groupByField ?? e.groupByField, V = D?.colorField ?? e.colorField, H = r(() => {
|
|
533
543
|
if (e.items) return e.items;
|
|
534
544
|
if (!M || !Array.isArray(M)) return [];
|
|
535
545
|
let t = T?.fields ?? {}, n = e.objectName || "", r = (e) => {
|
|
@@ -537,7 +547,7 @@ var M = y.object({
|
|
|
537
547
|
let n = {};
|
|
538
548
|
for (let r of t[e].options) r && r.value != null && (n[String(r.value)] = r);
|
|
539
549
|
return n;
|
|
540
|
-
}, i = r(V), a = Array.isArray(
|
|
550
|
+
}, i = r(V), a = Array.isArray(D?.metaFields) ? D.metaFields.filter((e) => typeof e == "string" && e) : ["status", "priority"].filter((e) => t[e]), o = {};
|
|
541
551
|
for (let e of a) o[e] = r(e);
|
|
542
552
|
let s = (e) => {
|
|
543
553
|
if (e == null || e === "") return;
|
|
@@ -618,7 +628,7 @@ var M = y.object({
|
|
|
618
628
|
navigation: e.navigation,
|
|
619
629
|
objectName: e.objectName,
|
|
620
630
|
onRowClick: c ?? d
|
|
621
|
-
}), q =
|
|
631
|
+
}), q = D?.scale ?? e.scale, J = {
|
|
622
632
|
...e,
|
|
623
633
|
items: H || [],
|
|
624
634
|
className: s || e.className,
|
|
@@ -664,7 +674,7 @@ var M = y.object({
|
|
|
664
674
|
style: { height: G },
|
|
665
675
|
children: W ? "Refreshing…" : "Pull to refresh"
|
|
666
676
|
}),
|
|
667
|
-
/* @__PURE__ */ l(
|
|
677
|
+
/* @__PURE__ */ l(O, { schema: J }),
|
|
668
678
|
K.isOverlay && /* @__PURE__ */ l(a, {
|
|
669
679
|
...K,
|
|
670
680
|
title: "Timeline Item",
|
|
@@ -816,7 +826,7 @@ var Q = e.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ l("div", {
|
|
|
816
826
|
}));
|
|
817
827
|
Q.displayName = "TimelineGanttBarContent";
|
|
818
828
|
var $ = ({ schema: e, ...t }) => {
|
|
819
|
-
let { dataSource: n } =
|
|
829
|
+
let { dataSource: n } = _() || {};
|
|
820
830
|
return /* @__PURE__ */ l(N, {
|
|
821
831
|
schema: e,
|
|
822
832
|
dataSource: n,
|
|
@@ -863,4 +873,4 @@ d.register("object-timeline", $, {
|
|
|
863
873
|
}]
|
|
864
874
|
});
|
|
865
875
|
//#endregion
|
|
866
|
-
export { N as ObjectTimeline, $ as ObjectTimelineRenderer, P as Timeline, z as TimelineContent, H as TimelineDescription, G as TimelineGantt, Z as TimelineGanttBar, Q as TimelineGanttBarContent, J as TimelineGanttGrid, K as TimelineGanttHeader, X as TimelineGanttLabel, Y as TimelineGanttRow, q as TimelineGanttRowLabels, U as TimelineHorizontal, W as TimelineHorizontalItem, I as TimelineItem, R as TimelineMarker,
|
|
876
|
+
export { N as ObjectTimeline, $ as ObjectTimelineRenderer, b as TIMELINE_SCALES, P as Timeline, z as TimelineContent, H as TimelineDescription, G as TimelineGantt, Z as TimelineGanttBar, Q as TimelineGanttBarContent, J as TimelineGanttGrid, K as TimelineGanttHeader, X as TimelineGanttLabel, Y as TimelineGanttRow, q as TimelineGanttRowLabels, U as TimelineHorizontal, W as TimelineHorizontalItem, I as TimelineItem, R as TimelineMarker, O as TimelineRenderer, V as TimelineTime, B as TimelineTitle, S as generateTimeScaleHeaders, x as resolveTimelineScale, F as timelineItemVariants, L as timelineMarkerVariants };
|
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/components"),require("react/jsx-runtime"),require("@object-ui/core"),require("@object-ui/react"),require("@object-ui/mobile"),require("zod")):typeof define==`function`&&define.amd?define([`exports`,`react`,`@object-ui/components`,`react/jsx-runtime`,`@object-ui/core`,`@object-ui/react`,`@object-ui/mobile`,`zod`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginTimeline={},e.React,e.ObjectUIComponents,e.react_jsx_runtime,e.ObjectUICore,e.ObjectUIReact,e.ObjectUIMobile,e.zod))})(this,function(e,t,n,r,i,a,o,s){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var c=Object.create,l=Object.defineProperty,u=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyNames,f=Object.getPrototypeOf,p=Object.prototype.hasOwnProperty,m=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=d(t),a=0,o=i.length,s;a<o;a++)s=i[a],!p.call(e,s)&&s!==n&&l(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=u(t,s))||r.enumerable});return e};t=((e,t,n)=>(n=e==null?{}:c(f(e)),m(t||!e||!e.__esModule?l(n,`default`,{value:e,enumerable:!0}):n,e)))(t,1);var h=10080*60*1e3;function g(e){let t=e.flatMap(e=>(e.items||[]).flatMap(e=>[e.startDate,e.endDate])),n=Math.min(...t.map(e=>new Date(e).getTime())),r=Math.max(...t.map(e=>new Date(e).getTime()));return{minDate:new Date(n).toISOString().split(`T`)[0],maxDate:new Date(r).toISOString().split(`T`)[0]}}function _(e,t,n,r){let i=new Date(e).getTime(),a=new Date(t).getTime(),o=new Date(n).getTime(),s=new Date(r).getTime()-o,c=i-o,l=a-i;return{start:c/s*100,width:l/s*100}}function v(e,t){let n=new Date(e);return t===`short`?n.toLocaleDateString():t===`long`?n.toLocaleDateString(`en-US`,{year:`numeric`,month:`long`,day:`numeric`}):n.toISOString().split(`T`)[0]}function y({label:e,color:t}){let i=t?{backgroundColor:`${t}22`,color:t,borderColor:`${t}55`}:void 0;return(0,r.jsx)(`span`,{className:(0,n.cn)(`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium`,!t&&`bg-muted text-muted-foreground border-transparent`),style:i,children:e})}function b(e){let t=[];for(let n of e){let e=n.group==null?``:String(n.group),r=t[t.length-1];r&&r.key===e?r.items.push(n):t.push({key:e,items:[n]})}return t}var x=({schema:e,className:t,...i})=>{let{variant:a=`vertical`,items:o=[],dateFormat:s=`short`,onItemClick:c}=e;if(a===`vertical`){let e=b(o),a=e.some(e=>e.key!==``),l=(e,t)=>{let i=e.color?{backgroundColor:`${e.color}33`,borderColor:e.color}:void 0,a=e.time?v(e.time,s):e.startDate?v(e.startDate,s):``,o=e.endDate&&e.endDate!==e.startDate?v(e.endDate,s):``,l=Array.isArray(e.meta)?e.meta:[];return(0,r.jsxs)(M,{density:`compact`,className:(0,n.cn)(e.className,c&&`cursor-pointer`),onClick:()=>c?.(e),children:[(0,r.jsx)(P,{variant:e.color?`default`:e.variant||`default`,style:i,children:e.icon&&(0,r.jsx)(`span`,{className:`text-xs`,children:e.icon})}),(0,r.jsxs)(F,{children:[(a||o)&&(0,r.jsxs)(L,{dateTime:e.time||e.startDate,className:`!mb-1 text-xs`,children:[a,o&&(0,r.jsxs)(`span`,{className:`text-muted-foreground/70`,children:[` → `,o]})]}),e.title&&(0,r.jsx)(I,{className:`text-sm sm:text-base mb-1`,children:e.title}),l.length>0&&(0,r.jsx)(`div`,{className:`flex flex-wrap gap-1.5 mt-1 mb-1`,children:l.map(e=>(0,r.jsx)(y,{label:e.label,color:e.color},e.key))}),e.description&&(0,r.jsx)(R,{className:`text-sm text-muted-foreground line-clamp-2 sm:line-clamp-none`,children:e.description}),e.content&&(0,n.renderChildren)(e.content)]})]},t)};return a?(0,r.jsx)(`div`,{className:(0,n.cn)(`px-4 sm:px-6 py-2`,t),...i,children:e.map((e,t)=>(0,r.jsxs)(`section`,{className:`mb-4`,children:[(0,r.jsxs)(`header`,{className:`sticky top-0 z-10 -mx-4 sm:-mx-6 px-4 sm:px-6 py-1.5 backdrop-blur bg-background/90 text-xs font-semibold uppercase tracking-wide text-muted-foreground border-b`,children:[(0,r.jsx)(`span`,{children:e.key}),(0,r.jsx)(`span`,{className:`ml-2 text-muted-foreground/60 font-normal normal-case`,children:e.items.length})]}),(0,r.jsx)(A,{className:`mt-3`,children:e.items.map((e,n)=>l(e,`${t}-${n}`))})]},`${e.key}-${t}`))}):(0,r.jsx)(A,{className:t,...i,children:o.map((e,t)=>l(e,t))})}if(a===`horizontal`)return(0,r.jsx)(z,{className:(0,n.cn)(`overflow-x-auto [-webkit-overflow-scrolling:touch]`,t),...i,children:o.map((e,t)=>(0,r.jsxs)(B,{className:(0,n.cn)(e.className,c&&`cursor-pointer`),onClick:()=>c?.(e),children:[(0,r.jsxs)(`div`,{className:`flex flex-col items-center`,children:[(0,r.jsx)(P,{variant:e.variant||`default`,children:e.icon&&(0,r.jsx)(`span`,{className:`text-xs`,children:e.icon})}),(0,r.jsxs)(`div`,{className:`mt-4 text-center`,children:[e.time&&(0,r.jsx)(L,{dateTime:e.time,children:v(e.time,s)}),e.title&&(0,r.jsx)(I,{children:e.title}),e.description&&(0,r.jsx)(R,{className:`text-center line-clamp-2 sm:line-clamp-none`,children:e.description}),e.content&&(0,n.renderChildren)(e.content)]})]}),t<o.length-1&&(0,r.jsx)(`div`,{className:`absolute left-full w-16 border-t-2 border-gray-200 top-3`})]},t))});if(a===`gantt`){let a=g(o),l=e.minDate||a.minDate,u=e.maxDate||a.maxDate,d=e.timeScale||`month`,f=(()=>{let e=[],t=new Date(l),n=new Date(u);if(d===`month`){let r=new Date(t);for(;r<=n;)e.push(r.toLocaleDateString(`en-US`,{month:`short`,year:`numeric`})),r.setMonth(r.getMonth()+1)}else if(d===`week`){let r=new Date(t);for(;r<=n;)e.push(`Week ${Math.ceil((r.getTime()-t.getTime())/h)+1}`),r.setDate(r.getDate()+7)}else if(d===`day`){let r=new Date(t);for(;r<=n;)e.push(r.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})),r.setDate(r.getDate()+1)}return e})();return(0,r.jsxs)(V,{className:(0,n.cn)(`overflow-x-auto [-webkit-overflow-scrolling:touch]`,t),...i,children:[(0,r.jsxs)(H,{children:[(0,r.jsx)(U,{className:`flex items-center px-2 sm:px-4 py-2 sm:py-3`,children:(0,r.jsx)(`span`,{className:`font-semibold text-xs sm:text-sm`,children:e.rowLabel||`Items`})}),(0,r.jsx)(W,{children:(0,r.jsx)(`div`,{className:`flex h-full`,children:f.map((e,t)=>(0,r.jsx)(`div`,{className:`flex-1 px-1 sm:px-2 py-2 sm:py-3 border-r text-xs font-medium text-center`,children:e},t))})})]}),(0,r.jsx)(`div`,{children:(0,r.jsxs)(`div`,{className:`flex`,children:[(0,r.jsx)(U,{children:o.map((e,t)=>(0,r.jsx)(G,{children:(0,r.jsx)(K,{title:e.label,className:`truncate`,children:e.label})},t))}),(0,r.jsx)(W,{className:`relative`,children:o.map((e,t)=>(0,r.jsx)(G,{className:`relative`,children:(e.items||[]).map((n,i)=>{let a=_(n.startDate,n.endDate,l,u);return(0,r.jsx)(q,{start:a.start,width:a.width,variant:n.variant||`default`,onClick:()=>c?.(n,e,t,i),title:`${n.title||``}\n${v(n.startDate,s)} - ${v(n.endDate,s)}`,children:(0,r.jsx)(J,{children:n.title})},i)})},t))})]})})]})}return null};i.ComponentRegistry.register(`timeline`,x,{namespace:`plugin-timeline`,label:`Timeline`,category:`data-display`,inputs:[{name:`variant`,type:`enum`,enum:[`vertical`,`horizontal`,`gantt`],label:`Timeline Variant`,defaultValue:`vertical`},{name:`items`,type:`array`,label:`Timeline Items`,description:`For vertical/horizontal: Array of { time, title, description, variant, icon, content }. For gantt: Array of { label, items: [{ title, startDate, endDate, variant }] }`},{name:`dateFormat`,type:`enum`,enum:[`short`,`long`,`iso`],label:`Date Format`,defaultValue:`short`},{name:`timeScale`,type:`enum`,enum:[`day`,`week`,`month`],label:`Time Scale (Gantt only)`,defaultValue:`month`},{name:`rowLabel`,type:`string`,label:`Row Label (Gantt only)`,defaultValue:`Items`},{name:`minDate`,type:`string`,label:`Min Date (Gantt only)`,description:`Override auto-calculated min date (YYYY-MM-DD)`},{name:`maxDate`,type:`string`,label:`Max Date (Gantt only)`,description:`Override auto-calculated max date (YYYY-MM-DD)`},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{variant:`vertical`,dateFormat:`short`,items:[{time:`2024-01-15`,title:`Project Started`,description:`Kickoff meeting and initial planning`,variant:`success`,icon:`🚀`},{time:`2024-02-01`,title:`First Milestone`,description:`Completed initial design phase`,variant:`info`,icon:`🎨`},{time:`2024-03-15`,title:`Beta Release`,description:`Released beta version to testers`,variant:`warning`,icon:`⚡`},{time:`2024-04-01`,title:`Launch`,description:`Official product launch`,variant:`success`,icon:`🎉`}]},examples:{vertical:{variant:`vertical`,dateFormat:`long`,items:[{time:`2024-01-15`,title:`Project Started`,description:`Kickoff meeting and initial planning`,variant:`success`},{time:`2024-02-01`,title:`First Milestone`,description:`Completed initial design phase`,variant:`info`}]},horizontal:{variant:`horizontal`,dateFormat:`short`,items:[{time:`2024-01-01`,title:`Q1`,description:`First quarter`,variant:`default`},{time:`2024-04-01`,title:`Q2`,description:`Second quarter`,variant:`info`},{time:`2024-07-01`,title:`Q3`,description:`Third quarter`,variant:`warning`},{time:`2024-10-01`,title:`Q4`,description:`Fourth quarter`,variant:`success`}]},gantt:{variant:`gantt`,dateFormat:`short`,timeScale:`month`,rowLabel:`Projects`,items:[{label:`Backend Development`,items:[{title:`API Design`,startDate:`2024-01-01`,endDate:`2024-01-31`,variant:`success`},{title:`Implementation`,startDate:`2024-02-01`,endDate:`2024-03-31`,variant:`info`}]},{label:`Frontend Development`,items:[{title:`UI Design`,startDate:`2024-01-15`,endDate:`2024-02-15`,variant:`warning`},{title:`Component Dev`,startDate:`2024-02-15`,endDate:`2024-04-15`,variant:`default`}]},{label:`Testing`,items:[{title:`QA Phase`,startDate:`2024-03-01`,endDate:`2024-04-30`,variant:`danger`}]}]}}});var S={"timeline.bucket.overdue":`Overdue`,"timeline.bucket.today":`Today`,"timeline.bucket.tomorrow":`Tomorrow`,"timeline.bucket.thisWeek":`This week`,"timeline.bucket.nextWeek":`Next week`,"timeline.bucket.later":`Later`,"timeline.bucket.noDate":`No date`,"timeline.bucket.unassigned":`Unassigned`,"timeline.relative.today":`Today`,"timeline.relative.tomorrow":`Tomorrow`,"timeline.relative.yesterday":`Yesterday`,"timeline.relative.inDays":`In {{n}} days`,"timeline.relative.daysAgo":`{{n}} days ago`},C=`timeline.bucket.today`;function w(e,t){let n=S[e]||e;if(t)for(let[e,r]of Object.entries(t))n=n.replace(`{{${e}}}`,String(r));return n}function T(){try{let e=(0,a.useObjectTranslation)();return e.t(C)===C?{t:w}:{t:e.t}}catch{return{t:w}}}function E(){try{return(0,a.useObjectLabel)()}catch{return{fieldOptionLabel:(e,t,n,r)=>r,translateOptions:(e,t,n)=>n,fieldLabel:(e,t,n)=>n}}}var D=s.z.object({title:s.z.string().optional(),date:s.z.string().optional(),description:s.z.string().optional(),variant:s.z.string().optional()}),O=s.z.object({mapping:D.optional(),objectName:s.z.string().optional(),titleField:s.z.string().optional(),dateField:s.z.string().optional(),startDateField:s.z.string().optional(),endDateField:s.z.string().optional(),descriptionField:s.z.string().optional(),groupByField:s.z.string().optional(),colorField:s.z.string().optional(),scale:s.z.enum([`hour`,`day`,`week`,`month`,`quarter`,`year`]).optional()}),k=({schema:e,dataSource:s,className:c,onRowClick:l,onItemClick:u,...d})=>{let[f,p]=(0,t.useState)([]),[m,h]=(0,t.useState)(()=>{let t=Array.isArray(e.items)&&e.items.length>0,n=Array.isArray(d.data)&&d.data.length>0;return!t&&!n&&!!e.objectName}),[g,_]=(0,t.useState)(null),[v,y]=(0,t.useState)(0),[b,S]=(0,t.useState)(null),C=e.timeline;(0,t.useEffect)(()=>{let t=O.safeParse(e);t.success||console.warn(`[ObjectTimeline] Invalid timeline configuration:`,t.error.format())},[e]);let w=(0,a.useDataScope)(e.bind);(0,t.useEffect)(()=>{let t=!0;return(async()=>{if(!(!s||typeof s.getObjectSchema!=`function`||!e.objectName))try{let n=await s.getObjectSchema(e.objectName);t&&S(n)}catch(e){console.warn(`Failed to fetch object def for ObjectTimeline`,e)}})(),()=>{t=!1}},[e.objectName,s]),(0,t.useEffect)(()=>{e.objectName&&!w&&!e.items&&!d.data?(async()=>{if(!s||typeof s.find!=`function`||!e.objectName){h(!1);return}h(!0);try{let t=(0,i.buildExpandFields)(b?.fields),n=(0,i.extractRecords)(await s.find(e.objectName,{options:{$top:100},...t.length>0?{$expand:t}:{}}));p(n)}catch(e){console.error(e),_(e)}finally{h(!1)}})():h(!1)},[e.objectName,s,w,e.items,d.data,v,b]);let D=d.data||w||f,{t:k}=T(),{fieldOptionLabel:A}=E(),j=C?.titleField??e.mapping?.title??e.titleField??`name`,M=C?.startDateField??e.mapping?.date??e.startDateField??e.dateField??`date`,N=C?.endDateField??e.endDateField??M,P=e.mapping?.description??e.descriptionField??`description`,F=e.mapping?.variant??`variant`,I=C?.groupByField??e.groupByField,L=C?.colorField??e.colorField,R=(0,t.useMemo)(()=>{if(e.items)return e.items;if(!D||!Array.isArray(D))return[];let t=b?.fields??{},n=e.objectName||``,r=e=>{if(!e||!t[e]?.options)return{};let n={};for(let r of t[e].options)r&&r.value!=null&&(n[String(r.value)]=r);return n},i=r(L),a=Array.isArray(C?.metaFields)?C.metaFields.filter(e=>typeof e==`string`&&e):[`status`,`priority`].filter(e=>t[e]),o={};for(let e of a)o[e]=r(e);let s=e=>{if(e==null||e===``)return;let t=i[String(e)];if(t?.color)return String(t.color);let n=String(e);if(/^#([0-9a-f]{3}){1,2}$/i.test(n)||n.startsWith(`rgb`)||n.startsWith(`hsl`))return n},c=(e,t,r)=>{if(t==null||t===``)return null;let i=r[String(t)];return{label:i?.label?A(n,e,String(t),i.label):String(t),color:i?.color}},l=D.map(e=>{let t=e[M],r=e[N],i=L?e[L]:void 0,l=I?e[I]:void 0,u=[];if(n)for(let t of a){let n=c(t,e[t],o[t]||{});n&&u.push({key:t,label:n.label,color:n.color})}return{title:e[j],time:t,startDate:t,endDate:r,description:e[P],variant:e[F]||`default`,color:s(i),group:l,meta:u,_data:e}});l.sort((e,t)=>(e.startDate?new Date(e.startDate).getTime():1/0)-(t.startDate?new Date(t.startDate).getTime():1/0));let u=new Date,d=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),f=d(u),p=864e5,m=f-(u.getDay()+6)%7*p+7*p,h=m+7*p,g=e=>{if(!e)return k(`timeline.bucket.noDate`);let t=d(new Date(e));return Number.isNaN(t)?k(`timeline.bucket.noDate`):t<f?k(`timeline.bucket.overdue`):t===f?k(`timeline.bucket.today`):t===f+p?k(`timeline.bucket.tomorrow`):k(t<m?`timeline.bucket.thisWeek`:t<h?`timeline.bucket.nextWeek`:`timeline.bucket.later`)};if(I&&!l.every(e=>e.group==null||e.group===``)){let e=r(I);return l.map(t=>{let n=c(I,t.group,e);return{...t,group:n?n.label:t.group!=null&&t.group!==``?String(t.group):k(`timeline.bucket.unassigned`)}})}return l.map(e=>({...e,group:g(e.startDate)}))},[e.items,D,b,e.objectName,j,M,N,P,F,L,I,k,A]),{ref:z,isRefreshing:B,pullDistance:V}=(0,o.usePullToRefresh)({onRefresh:(0,t.useCallback)(async()=>{y(e=>e+1)},[]),enabled:!!e.objectName&&!!s}),H=(0,a.useNavigationOverlay)({navigation:e.navigation,objectName:e.objectName,onRowClick:l??u}),U=C?.scale??e.scale,W={...e,items:R||[],className:c||e.className,...U?{timeScale:U}:{},onItemClick:e=>{let t=e._data||e;H.handleClick(t),u?.(t)}};return g?(0,r.jsxs)(`div`,{className:`p-4 text-destructive`,"data-testid":`timeline-error`,role:`alert`,children:[`Error loading timeline: `,g.message]}):m&&(!R||R.length===0)?(0,r.jsxs)(`div`,{className:`flex flex-col h-full min-h-[200px] p-4 gap-3`,"data-testid":`timeline-loading`,role:`status`,"aria-live":`polite`,"aria-busy":`true`,children:[(0,r.jsx)(`span`,{className:`sr-only`,children:`Loading timeline…`}),[0,1,2,3].map(e=>(0,r.jsxs)(`div`,{className:`flex items-start gap-3`,style:{opacity:Math.max(.3,1-e*.18)},children:[(0,r.jsx)(`div`,{className:`h-3 w-3 rounded-full bg-muted/70 animate-pulse mt-1.5 shrink-0`}),(0,r.jsxs)(`div`,{className:`flex-1 space-y-2`,children:[(0,r.jsx)(`div`,{className:`h-4 w-1/3 rounded bg-muted/70 animate-pulse`}),(0,r.jsx)(`div`,{className:`h-3 w-2/3 rounded bg-muted/50 animate-pulse`})]})]},e))]}):(0,r.jsxs)(`div`,{ref:z,className:`relative overflow-auto h-full min-w-0`,children:[V>0&&(0,r.jsx)(`div`,{className:`flex items-center justify-center text-xs text-muted-foreground`,style:{height:V},children:B?`Refreshing…`:`Pull to refresh`}),(0,r.jsx)(x,{schema:W}),H.isOverlay&&(0,r.jsx)(n.NavigationOverlay,{...H,title:`Timeline Item`,children:e=>(0,r.jsx)(`div`,{className:`space-y-3`,children:Object.entries(e).map(([e,t])=>(0,r.jsxs)(`div`,{className:`flex flex-col`,children:[(0,r.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground uppercase tracking-wide`,children:e.replace(/_/g,` `)}),(0,r.jsx)(`span`,{className:`text-sm`,children:String(t??`—`)})]},e))})})]})},A=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`ol`,{ref:i,className:(0,n.cn)(`relative ml-3 border-l border-gray-200`,e),...t}));A.displayName=`Timeline`;var j=(0,n.cva)(`ml-6`,{variants:{density:{default:`mb-10`,compact:`mb-3`,comfortable:`mb-6`}},defaultVariants:{density:`default`}}),M=t.forwardRef(({className:e,density:t,...i},a)=>(0,r.jsx)(`li`,{ref:a,className:(0,n.cn)(j({density:t}),e),...i}));M.displayName=`TimelineItem`;var N=(0,n.cva)(`absolute -left-3 w-6 h-6 rounded-full border-2 flex items-center justify-center`,{variants:{variant:{default:`bg-blue-200 border-blue-400`,success:`bg-emerald-200 border-emerald-500`,warning:`bg-amber-200 border-amber-500`,danger:`bg-red-200 border-red-500`,info:`bg-purple-200 border-purple-500`,todo:`bg-slate-200 border-slate-400`,"in-progress":`bg-blue-200 border-blue-500`,done:`bg-emerald-200 border-emerald-500`}},defaultVariants:{variant:`default`}}),P=t.forwardRef(({className:e,variant:t=`default`,...i},a)=>(0,r.jsx)(`div`,{ref:a,className:(0,n.cn)(N({variant:t}),e),...i}));P.displayName=`TimelineMarker`;var F=t.forwardRef(({className:e,...t},n)=>(0,r.jsx)(`div`,{ref:n,className:e,...t}));F.displayName=`TimelineContent`;var I=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`h3`,{ref:i,className:(0,n.cn)(`font-semibold text-lg mb-1`,e),...t}));I.displayName=`TimelineTitle`;var L=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`time`,{ref:i,className:(0,n.cn)(`text-sm font-normal text-gray-500 mb-2 block`,e),...t}));L.displayName=`TimelineTime`;var R=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`p`,{ref:i,className:(0,n.cn)(`text-base text-gray-700`,e),...t}));R.displayName=`TimelineDescription`;var z=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`relative flex overflow-x-auto py-8`,e),...t}));z.displayName=`TimelineHorizontal`;var B=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`shrink-0 w-64 relative`,e),...t}));B.displayName=`TimelineHorizontalItem`;var V=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`relative w-full border rounded-lg overflow-hidden`,e),...t}));V.displayName=`TimelineGantt`;var H=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`flex border-b bg-gray-50`,e),...t}));H.displayName=`TimelineGanttHeader`;var U=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`w-48 border-r bg-white`,e),...t}));U.displayName=`TimelineGanttRowLabels`;var W=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`flex-1 overflow-x-auto`,e),...t}));W.displayName=`TimelineGanttGrid`;var G=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`flex items-center border-b min-h-12`,e),...t}));G.displayName=`TimelineGanttRow`;var K=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`px-4 py-2 font-medium text-sm truncate`,e),...t}));K.displayName=`TimelineGanttLabel`;var q=t.forwardRef(({className:e,start:t=0,width:i=100,variant:a=`default`,...o},s)=>(0,r.jsx)(`div`,{ref:s,className:(0,n.cn)(`absolute h-8 rounded-md transition-colors cursor-pointer`,{default:`bg-blue-500 hover:bg-blue-600`,success:`bg-green-500 hover:bg-green-600`,warning:`bg-yellow-500 hover:bg-yellow-600`,danger:`bg-red-500 hover:bg-red-600`,info:`bg-purple-500 hover:bg-purple-600`}[a],e),style:{left:`${t}%`,width:`${i}%`},...o}));q.displayName=`TimelineGanttBar`;var J=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`px-2 py-1 text-white text-xs font-medium truncate`,e),...t}));J.displayName=`TimelineGanttBarContent`;var Y=({schema:e,...t})=>{let{dataSource:n}=(0,a.useSchemaContext)()||{};return(0,r.jsx)(k,{schema:e,dataSource:n,...t})};i.ComponentRegistry.register(`object-timeline`,Y,{namespace:`plugin-timeline`,label:`Object Timeline`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`variant`,type:`enum`,enum:[`vertical`,`horizontal`,`gantt`],defaultValue:`vertical`}]}),i.ComponentRegistry.register(`timeline`,Y,{namespace:`view`,label:`Timeline View`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`variant`,type:`enum`,enum:[`vertical`,`horizontal`,`gantt`],defaultValue:`vertical`}]}),e.ObjectTimeline=k,e.ObjectTimelineRenderer=Y,e.Timeline=A,e.TimelineContent=F,e.TimelineDescription=R,e.TimelineGantt=V,e.TimelineGanttBar=q,e.TimelineGanttBarContent=J,e.TimelineGanttGrid=W,e.TimelineGanttHeader=H,e.TimelineGanttLabel=K,e.TimelineGanttRow=G,e.TimelineGanttRowLabels=U,e.TimelineHorizontal=z,e.TimelineHorizontalItem=B,e.TimelineItem=M,e.TimelineMarker=P,e.TimelineRenderer=x,e.TimelineTime=L,e.TimelineTitle=I,e.timelineItemVariants=j,e.timelineMarkerVariants=N});
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("react"),require("@object-ui/components"),require("react/jsx-runtime"),require("@object-ui/core"),require("@object-ui/react"),require("@object-ui/mobile"),require("zod"),require("@object-ui/i18n")):typeof define==`function`&&define.amd?define([`exports`,`react`,`@object-ui/components`,`react/jsx-runtime`,`@object-ui/core`,`@object-ui/react`,`@object-ui/mobile`,`zod`,`@object-ui/i18n`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginTimeline={},e.React,e.ObjectUIComponents,e.react_jsx_runtime,e.ObjectUICore,e.ObjectUIReact,e.ObjectUIMobile,e.zod,e._object_ui_i18n))})(this,function(e,t,n,r,i,a,o,s,c){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var l=Object.create,u=Object.defineProperty,d=Object.getOwnPropertyDescriptor,f=Object.getOwnPropertyNames,p=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty,h=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=f(t),a=0,o=i.length,s;a<o;a++)s=i[a],!m.call(e,s)&&s!==n&&u(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=d(t,s))||r.enumerable});return e};t=((e,t,n)=>(n=e==null?{}:l(p(e)),h(t||!e||!e.__esModule?u(n,`default`,{value:e,enumerable:!0}):n,e)))(t,1);var g=new Set([`hour`,`day`,`week`,`month`,`quarter`,`year`]);function _(e){let t=e.scale??e.timeScale;return typeof t==`string`&&g.has(t)?t:`month`}function v(e,t,n){let r=[],i=new Date(t),a=new Date(n);if(Number.isNaN(i.getTime())||Number.isNaN(a.getTime())||i>a)return r;let o=new Date(i);switch(e){case`hour`:for(;o<=a;)r.push(o.toLocaleString(`en-US`,{month:`short`,day:`numeric`,hour:`numeric`})),o.setHours(o.getHours()+1);break;case`day`:for(;o<=a;)r.push(o.toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})),o.setDate(o.getDate()+1);break;case`week`:{let e=1;for(;o<=a;)r.push(`Week ${e++}`),o.setDate(o.getDate()+7);break}case`quarter`:for(o.setMonth(Math.floor(o.getMonth()/3)*3,1);o<=a;)r.push(`Q${Math.floor(o.getMonth()/3)+1} ${o.getFullYear()}`),o.setMonth(o.getMonth()+3);break;case`year`:for(o.setMonth(0,1);o<=a;)r.push(String(o.getFullYear())),o.setFullYear(o.getFullYear()+1);break;default:for(;o<=a;)r.push(o.toLocaleDateString(`en-US`,{month:`short`,year:`numeric`})),o.setMonth(o.getMonth()+1);break}return r}function y(e){let t=e.flatMap(e=>(e.items||[]).flatMap(e=>[e.startDate,e.endDate])),n=Math.min(...t.map(e=>new Date(e).getTime())),r=Math.max(...t.map(e=>new Date(e).getTime()));return{minDate:new Date(n).toISOString().split(`T`)[0],maxDate:new Date(r).toISOString().split(`T`)[0]}}function b(e,t,n,r){let i=new Date(e).getTime(),a=new Date(t).getTime(),o=new Date(n).getTime(),s=new Date(r).getTime()-o,c=i-o,l=a-i;return{start:c/s*100,width:l/s*100}}function x(e,t){let n=new Date(e);return t===`short`?n.toLocaleDateString():t===`long`?n.toLocaleDateString(`en-US`,{year:`numeric`,month:`long`,day:`numeric`}):n.toISOString().split(`T`)[0]}function S({label:e,color:t}){let i=t?{backgroundColor:`${t}22`,color:t,borderColor:`${t}55`}:void 0;return(0,r.jsx)(`span`,{className:(0,n.cn)(`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium`,!t&&`bg-muted text-muted-foreground border-transparent`),style:i,children:e})}function C(e){let t=[];for(let n of e){let e=n.group==null?``:String(n.group),r=t[t.length-1];r&&r.key===e?r.items.push(n):t.push({key:e,items:[n]})}return t}var w=({schema:e,className:t,...i})=>{let{variant:a=`vertical`,items:o=[],dateFormat:s=`short`,onItemClick:c}=e;if(a===`vertical`){let e=C(o),a=e.some(e=>e.key!==``),l=(e,t)=>{let i=e.color?{backgroundColor:`${e.color}33`,borderColor:e.color}:void 0,a=e.time?x(e.time,s):e.startDate?x(e.startDate,s):``,o=e.endDate&&e.endDate!==e.startDate?x(e.endDate,s):``,l=Array.isArray(e.meta)?e.meta:[];return(0,r.jsxs)(N,{density:`compact`,className:(0,n.cn)(e.className,c&&`cursor-pointer`),onClick:()=>c?.(e),children:[(0,r.jsx)(F,{variant:e.color?`default`:e.variant||`default`,style:i,children:e.icon&&(0,r.jsx)(`span`,{className:`text-xs`,children:e.icon})}),(0,r.jsxs)(I,{children:[(a||o)&&(0,r.jsxs)(R,{dateTime:e.time||e.startDate,className:`!mb-1 text-xs`,children:[a,o&&(0,r.jsxs)(`span`,{className:`text-muted-foreground/70`,children:[` → `,o]})]}),e.title&&(0,r.jsx)(L,{className:`text-sm sm:text-base mb-1`,children:e.title}),l.length>0&&(0,r.jsx)(`div`,{className:`flex flex-wrap gap-1.5 mt-1 mb-1`,children:l.map(e=>(0,r.jsx)(S,{label:e.label,color:e.color},e.key))}),e.description&&(0,r.jsx)(z,{className:`text-sm text-muted-foreground line-clamp-2 sm:line-clamp-none`,children:e.description}),e.content&&(0,n.renderChildren)(e.content)]})]},t)};return a?(0,r.jsx)(`div`,{className:(0,n.cn)(`px-4 sm:px-6 py-2`,t),...i,children:e.map((e,t)=>(0,r.jsxs)(`section`,{className:`mb-4`,children:[(0,r.jsxs)(`header`,{className:`sticky top-0 z-10 -mx-4 sm:-mx-6 px-4 sm:px-6 py-1.5 backdrop-blur bg-background/90 text-xs font-semibold uppercase tracking-wide text-muted-foreground border-b`,children:[(0,r.jsx)(`span`,{children:e.key}),(0,r.jsx)(`span`,{className:`ml-2 text-muted-foreground/60 font-normal normal-case`,children:e.items.length})]}),(0,r.jsx)(j,{className:`mt-3`,children:e.items.map((e,n)=>l(e,`${t}-${n}`))})]},`${e.key}-${t}`))}):(0,r.jsx)(j,{className:t,...i,children:o.map((e,t)=>l(e,t))})}if(a===`horizontal`)return(0,r.jsx)(B,{className:(0,n.cn)(`overflow-x-auto [-webkit-overflow-scrolling:touch]`,t),...i,children:o.map((e,t)=>(0,r.jsxs)(V,{className:(0,n.cn)(e.className,c&&`cursor-pointer`),onClick:()=>c?.(e),children:[(0,r.jsxs)(`div`,{className:`flex flex-col items-center`,children:[(0,r.jsx)(F,{variant:e.variant||`default`,children:e.icon&&(0,r.jsx)(`span`,{className:`text-xs`,children:e.icon})}),(0,r.jsxs)(`div`,{className:`mt-4 text-center`,children:[e.time&&(0,r.jsx)(R,{dateTime:e.time,children:x(e.time,s)}),e.title&&(0,r.jsx)(L,{children:e.title}),e.description&&(0,r.jsx)(z,{className:`text-center line-clamp-2 sm:line-clamp-none`,children:e.description}),e.content&&(0,n.renderChildren)(e.content)]})]}),t<o.length-1&&(0,r.jsx)(`div`,{className:`absolute left-full w-16 border-t-2 border-gray-200 top-3`})]},t))});if(a===`gantt`){let a=y(o),l=e.minDate||a.minDate,u=e.maxDate||a.maxDate,d=v(_(e),l,u);return(0,r.jsxs)(H,{className:(0,n.cn)(`overflow-x-auto [-webkit-overflow-scrolling:touch]`,t),...i,children:[(0,r.jsxs)(U,{children:[(0,r.jsx)(W,{className:`flex items-center px-2 sm:px-4 py-2 sm:py-3`,children:(0,r.jsx)(`span`,{className:`font-semibold text-xs sm:text-sm`,children:e.rowLabel||`Items`})}),(0,r.jsx)(G,{children:(0,r.jsx)(`div`,{className:`flex h-full`,children:d.map((e,t)=>(0,r.jsx)(`div`,{className:`flex-1 px-1 sm:px-2 py-2 sm:py-3 border-r text-xs font-medium text-center`,children:e},t))})})]}),(0,r.jsx)(`div`,{children:(0,r.jsxs)(`div`,{className:`flex`,children:[(0,r.jsx)(W,{children:o.map((e,t)=>(0,r.jsx)(K,{children:(0,r.jsx)(q,{title:e.label,className:`truncate`,children:e.label})},t))}),(0,r.jsx)(G,{className:`relative`,children:o.map((e,t)=>(0,r.jsx)(K,{className:`relative`,children:(e.items||[]).map((n,i)=>{let a=b(n.startDate,n.endDate,l,u);return(0,r.jsx)(J,{start:a.start,width:a.width,variant:n.variant||`default`,onClick:()=>c?.(n,e,t,i),title:`${n.title||``}\n${x(n.startDate,s)} - ${x(n.endDate,s)}`,children:(0,r.jsx)(Y,{children:n.title})},i)})},t))})]})})]})}return null};i.ComponentRegistry.register(`timeline`,w,{namespace:`plugin-timeline`,label:`Timeline`,category:`data-display`,inputs:[{name:`variant`,type:`enum`,enum:[`vertical`,`horizontal`,`gantt`],label:`Timeline Variant`,defaultValue:`vertical`},{name:`items`,type:`array`,label:`Timeline Items`,description:`For vertical/horizontal: Array of { time, title, description, variant, icon, content }. For gantt: Array of { label, items: [{ title, startDate, endDate, variant }] }`},{name:`dateFormat`,type:`enum`,enum:[`short`,`long`,`iso`],label:`Date Format`,defaultValue:`short`},{name:`timeScale`,type:`enum`,enum:[`day`,`week`,`month`],label:`Time Scale (Gantt only)`,defaultValue:`month`},{name:`rowLabel`,type:`string`,label:`Row Label (Gantt only)`,defaultValue:`Items`},{name:`minDate`,type:`string`,label:`Min Date (Gantt only)`,description:`Override auto-calculated min date (YYYY-MM-DD)`},{name:`maxDate`,type:`string`,label:`Max Date (Gantt only)`,description:`Override auto-calculated max date (YYYY-MM-DD)`},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{variant:`vertical`,dateFormat:`short`,items:[{time:`2024-01-15`,title:`Project Started`,description:`Kickoff meeting and initial planning`,variant:`success`,icon:`🚀`},{time:`2024-02-01`,title:`First Milestone`,description:`Completed initial design phase`,variant:`info`,icon:`🎨`},{time:`2024-03-15`,title:`Beta Release`,description:`Released beta version to testers`,variant:`warning`,icon:`⚡`},{time:`2024-04-01`,title:`Launch`,description:`Official product launch`,variant:`success`,icon:`🎉`}]},examples:{vertical:{variant:`vertical`,dateFormat:`long`,items:[{time:`2024-01-15`,title:`Project Started`,description:`Kickoff meeting and initial planning`,variant:`success`},{time:`2024-02-01`,title:`First Milestone`,description:`Completed initial design phase`,variant:`info`}]},horizontal:{variant:`horizontal`,dateFormat:`short`,items:[{time:`2024-01-01`,title:`Q1`,description:`First quarter`,variant:`default`},{time:`2024-04-01`,title:`Q2`,description:`Second quarter`,variant:`info`},{time:`2024-07-01`,title:`Q3`,description:`Third quarter`,variant:`warning`},{time:`2024-10-01`,title:`Q4`,description:`Fourth quarter`,variant:`success`}]},gantt:{variant:`gantt`,dateFormat:`short`,timeScale:`month`,rowLabel:`Projects`,items:[{label:`Backend Development`,items:[{title:`API Design`,startDate:`2024-01-01`,endDate:`2024-01-31`,variant:`success`},{title:`Implementation`,startDate:`2024-02-01`,endDate:`2024-03-31`,variant:`info`}]},{label:`Frontend Development`,items:[{title:`UI Design`,startDate:`2024-01-15`,endDate:`2024-02-15`,variant:`warning`},{title:`Component Dev`,startDate:`2024-02-15`,endDate:`2024-04-15`,variant:`default`}]},{label:`Testing`,items:[{title:`QA Phase`,startDate:`2024-03-01`,endDate:`2024-04-30`,variant:`danger`}]}]}}});var T=(0,c.createSafeTranslation)({"timeline.bucket.overdue":`Overdue`,"timeline.bucket.today":`Today`,"timeline.bucket.tomorrow":`Tomorrow`,"timeline.bucket.thisWeek":`This week`,"timeline.bucket.nextWeek":`Next week`,"timeline.bucket.later":`Later`,"timeline.bucket.noDate":`No date`,"timeline.bucket.unassigned":`Unassigned`,"timeline.relative.today":`Today`,"timeline.relative.tomorrow":`Tomorrow`,"timeline.relative.yesterday":`Yesterday`,"timeline.relative.inDays":`In {{n}} days`,"timeline.relative.daysAgo":`{{n}} days ago`},`timeline.bucket.today`),E={fieldOptionLabel:(e,t,n,r)=>r,translateOptions:(e,t,n)=>n,fieldLabel:(e,t,n)=>n};function D(){return(0,a.useObjectLabel)()??E}var O=s.z.object({title:s.z.string().optional(),date:s.z.string().optional(),description:s.z.string().optional(),variant:s.z.string().optional()}),k=s.z.object({mapping:O.optional(),objectName:s.z.string().optional(),titleField:s.z.string().optional(),dateField:s.z.string().optional(),startDateField:s.z.string().optional(),endDateField:s.z.string().optional(),descriptionField:s.z.string().optional(),groupByField:s.z.string().optional(),colorField:s.z.string().optional(),scale:s.z.enum([`hour`,`day`,`week`,`month`,`quarter`,`year`]).optional()}),A=({schema:e,dataSource:s,className:c,onRowClick:l,onItemClick:u,...d})=>{let[f,p]=(0,t.useState)([]),[m,h]=(0,t.useState)(()=>{let t=Array.isArray(e.items)&&e.items.length>0,n=Array.isArray(d.data)&&d.data.length>0;return!t&&!n&&!!e.objectName}),[g,_]=(0,t.useState)(null),[v,y]=(0,t.useState)(0),[b,x]=(0,t.useState)(null),S=e.timeline;(0,t.useEffect)(()=>{let t=k.safeParse(e);t.success||console.warn(`[ObjectTimeline] Invalid timeline configuration:`,t.error.format())},[e]);let C=(0,a.useDataScope)(e.bind);(0,t.useEffect)(()=>{let t=!0;return(async()=>{if(!(!s||typeof s.getObjectSchema!=`function`||!e.objectName))try{let n=await s.getObjectSchema(e.objectName);t&&x(n)}catch(e){console.warn(`Failed to fetch object def for ObjectTimeline`,e)}})(),()=>{t=!1}},[e.objectName,s]),(0,t.useEffect)(()=>{e.objectName&&!C&&!e.items&&!d.data?(async()=>{if(!s||typeof s.find!=`function`||!e.objectName){h(!1);return}h(!0);try{let t=(0,i.buildExpandFields)(b?.fields),n=(0,i.extractRecords)(await s.find(e.objectName,{options:{$top:100},...t.length>0?{$expand:t}:{}}));p(n)}catch(e){console.error(e),_(e)}finally{h(!1)}})():h(!1)},[e.objectName,s,C,e.items,d.data,v,b]);let E=d.data||C||f,{t:O}=T(),{fieldOptionLabel:A}=D(),j=S?.titleField??e.mapping?.title??e.titleField??`name`,M=S?.startDateField??S?.dateField??e.mapping?.date??e.startDateField??e.dateField??`date`,N=S?.endDateField??e.endDateField??M,P=e.mapping?.description??e.descriptionField??`description`,F=e.mapping?.variant??`variant`,I=S?.groupByField??e.groupByField,L=S?.colorField??e.colorField,R=(0,t.useMemo)(()=>{if(e.items)return e.items;if(!E||!Array.isArray(E))return[];let t=b?.fields??{},n=e.objectName||``,r=e=>{if(!e||!t[e]?.options)return{};let n={};for(let r of t[e].options)r&&r.value!=null&&(n[String(r.value)]=r);return n},i=r(L),a=Array.isArray(S?.metaFields)?S.metaFields.filter(e=>typeof e==`string`&&e):[`status`,`priority`].filter(e=>t[e]),o={};for(let e of a)o[e]=r(e);let s=e=>{if(e==null||e===``)return;let t=i[String(e)];if(t?.color)return String(t.color);let n=String(e);if(/^#([0-9a-f]{3}){1,2}$/i.test(n)||n.startsWith(`rgb`)||n.startsWith(`hsl`))return n},c=(e,t,r)=>{if(t==null||t===``)return null;let i=r[String(t)];return{label:i?.label?A(n,e,String(t),i.label):String(t),color:i?.color}},l=E.map(e=>{let t=e[M],r=e[N],i=L?e[L]:void 0,l=I?e[I]:void 0,u=[];if(n)for(let t of a){let n=c(t,e[t],o[t]||{});n&&u.push({key:t,label:n.label,color:n.color})}return{title:e[j],time:t,startDate:t,endDate:r,description:e[P],variant:e[F]||`default`,color:s(i),group:l,meta:u,_data:e}});l.sort((e,t)=>(e.startDate?new Date(e.startDate).getTime():1/0)-(t.startDate?new Date(t.startDate).getTime():1/0));let u=new Date,d=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),f=d(u),p=864e5,m=f-(u.getDay()+6)%7*p+7*p,h=m+7*p,g=e=>{if(!e)return O(`timeline.bucket.noDate`);let t=d(new Date(e));return Number.isNaN(t)?O(`timeline.bucket.noDate`):t<f?O(`timeline.bucket.overdue`):t===f?O(`timeline.bucket.today`):t===f+p?O(`timeline.bucket.tomorrow`):O(t<m?`timeline.bucket.thisWeek`:t<h?`timeline.bucket.nextWeek`:`timeline.bucket.later`)};if(I&&!l.every(e=>e.group==null||e.group===``)){let e=r(I);return l.map(t=>{let n=c(I,t.group,e);return{...t,group:n?n.label:t.group!=null&&t.group!==``?String(t.group):O(`timeline.bucket.unassigned`)}})}return l.map(e=>({...e,group:g(e.startDate)}))},[e.items,E,b,e.objectName,j,M,N,P,F,L,I,O,A]),{ref:z,isRefreshing:B,pullDistance:V}=(0,o.usePullToRefresh)({onRefresh:(0,t.useCallback)(async()=>{y(e=>e+1)},[]),enabled:!!e.objectName&&!!s}),H=(0,a.useNavigationOverlay)({navigation:e.navigation,objectName:e.objectName,onRowClick:l??u}),U=S?.scale??e.scale,W={...e,items:R||[],className:c||e.className,...U?{timeScale:U}:{},onItemClick:e=>{let t=e._data||e;H.handleClick(t),u?.(t)}};return g?(0,r.jsxs)(`div`,{className:`p-4 text-destructive`,"data-testid":`timeline-error`,role:`alert`,children:[`Error loading timeline: `,g.message]}):m&&(!R||R.length===0)?(0,r.jsxs)(`div`,{className:`flex flex-col h-full min-h-[200px] p-4 gap-3`,"data-testid":`timeline-loading`,role:`status`,"aria-live":`polite`,"aria-busy":`true`,children:[(0,r.jsx)(`span`,{className:`sr-only`,children:`Loading timeline…`}),[0,1,2,3].map(e=>(0,r.jsxs)(`div`,{className:`flex items-start gap-3`,style:{opacity:Math.max(.3,1-e*.18)},children:[(0,r.jsx)(`div`,{className:`h-3 w-3 rounded-full bg-muted/70 animate-pulse mt-1.5 shrink-0`}),(0,r.jsxs)(`div`,{className:`flex-1 space-y-2`,children:[(0,r.jsx)(`div`,{className:`h-4 w-1/3 rounded bg-muted/70 animate-pulse`}),(0,r.jsx)(`div`,{className:`h-3 w-2/3 rounded bg-muted/50 animate-pulse`})]})]},e))]}):(0,r.jsxs)(`div`,{ref:z,className:`relative overflow-auto h-full min-w-0`,children:[V>0&&(0,r.jsx)(`div`,{className:`flex items-center justify-center text-xs text-muted-foreground`,style:{height:V},children:B?`Refreshing…`:`Pull to refresh`}),(0,r.jsx)(w,{schema:W}),H.isOverlay&&(0,r.jsx)(n.NavigationOverlay,{...H,title:`Timeline Item`,children:e=>(0,r.jsx)(`div`,{className:`space-y-3`,children:Object.entries(e).map(([e,t])=>(0,r.jsxs)(`div`,{className:`flex flex-col`,children:[(0,r.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground uppercase tracking-wide`,children:e.replace(/_/g,` `)}),(0,r.jsx)(`span`,{className:`text-sm`,children:String(t??`—`)})]},e))})})]})},j=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`ol`,{ref:i,className:(0,n.cn)(`relative ml-3 border-l border-gray-200`,e),...t}));j.displayName=`Timeline`;var M=(0,n.cva)(`ml-6`,{variants:{density:{default:`mb-10`,compact:`mb-3`,comfortable:`mb-6`}},defaultVariants:{density:`default`}}),N=t.forwardRef(({className:e,density:t,...i},a)=>(0,r.jsx)(`li`,{ref:a,className:(0,n.cn)(M({density:t}),e),...i}));N.displayName=`TimelineItem`;var P=(0,n.cva)(`absolute -left-3 w-6 h-6 rounded-full border-2 flex items-center justify-center`,{variants:{variant:{default:`bg-blue-200 border-blue-400`,success:`bg-emerald-200 border-emerald-500`,warning:`bg-amber-200 border-amber-500`,danger:`bg-red-200 border-red-500`,info:`bg-purple-200 border-purple-500`,todo:`bg-slate-200 border-slate-400`,"in-progress":`bg-blue-200 border-blue-500`,done:`bg-emerald-200 border-emerald-500`}},defaultVariants:{variant:`default`}}),F=t.forwardRef(({className:e,variant:t=`default`,...i},a)=>(0,r.jsx)(`div`,{ref:a,className:(0,n.cn)(P({variant:t}),e),...i}));F.displayName=`TimelineMarker`;var I=t.forwardRef(({className:e,...t},n)=>(0,r.jsx)(`div`,{ref:n,className:e,...t}));I.displayName=`TimelineContent`;var L=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`h3`,{ref:i,className:(0,n.cn)(`font-semibold text-lg mb-1`,e),...t}));L.displayName=`TimelineTitle`;var R=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`time`,{ref:i,className:(0,n.cn)(`text-sm font-normal text-gray-500 mb-2 block`,e),...t}));R.displayName=`TimelineTime`;var z=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`p`,{ref:i,className:(0,n.cn)(`text-base text-gray-700`,e),...t}));z.displayName=`TimelineDescription`;var B=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`relative flex overflow-x-auto py-8`,e),...t}));B.displayName=`TimelineHorizontal`;var V=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`shrink-0 w-64 relative`,e),...t}));V.displayName=`TimelineHorizontalItem`;var H=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`relative w-full border rounded-lg overflow-hidden`,e),...t}));H.displayName=`TimelineGantt`;var U=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`flex border-b bg-gray-50`,e),...t}));U.displayName=`TimelineGanttHeader`;var W=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`w-48 border-r bg-white`,e),...t}));W.displayName=`TimelineGanttRowLabels`;var G=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`flex-1 overflow-x-auto`,e),...t}));G.displayName=`TimelineGanttGrid`;var K=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`flex items-center border-b min-h-12`,e),...t}));K.displayName=`TimelineGanttRow`;var q=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`px-4 py-2 font-medium text-sm truncate`,e),...t}));q.displayName=`TimelineGanttLabel`;var J=t.forwardRef(({className:e,start:t=0,width:i=100,variant:a=`default`,...o},s)=>(0,r.jsx)(`div`,{ref:s,className:(0,n.cn)(`absolute h-8 rounded-md transition-colors cursor-pointer`,{default:`bg-blue-500 hover:bg-blue-600`,success:`bg-green-500 hover:bg-green-600`,warning:`bg-yellow-500 hover:bg-yellow-600`,danger:`bg-red-500 hover:bg-red-600`,info:`bg-purple-500 hover:bg-purple-600`}[a],e),style:{left:`${t}%`,width:`${i}%`},...o}));J.displayName=`TimelineGanttBar`;var Y=t.forwardRef(({className:e,...t},i)=>(0,r.jsx)(`div`,{ref:i,className:(0,n.cn)(`px-2 py-1 text-white text-xs font-medium truncate`,e),...t}));Y.displayName=`TimelineGanttBarContent`;var X=({schema:e,...t})=>{let{dataSource:n}=(0,a.useSchemaContext)()||{};return(0,r.jsx)(A,{schema:e,dataSource:n,...t})};i.ComponentRegistry.register(`object-timeline`,X,{namespace:`plugin-timeline`,label:`Object Timeline`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`variant`,type:`enum`,enum:[`vertical`,`horizontal`,`gantt`],defaultValue:`vertical`}]}),i.ComponentRegistry.register(`timeline`,X,{namespace:`view`,label:`Timeline View`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`variant`,type:`enum`,enum:[`vertical`,`horizontal`,`gantt`],defaultValue:`vertical`}]}),e.ObjectTimeline=A,e.ObjectTimelineRenderer=X,e.TIMELINE_SCALES=g,e.Timeline=j,e.TimelineContent=I,e.TimelineDescription=z,e.TimelineGantt=H,e.TimelineGanttBar=J,e.TimelineGanttBarContent=Y,e.TimelineGanttGrid=G,e.TimelineGanttHeader=U,e.TimelineGanttLabel=q,e.TimelineGanttRow=K,e.TimelineGanttRowLabels=W,e.TimelineHorizontal=B,e.TimelineHorizontalItem=V,e.TimelineItem=N,e.TimelineMarker=F,e.TimelineRenderer=w,e.TimelineTime=R,e.TimelineTitle=L,e.generateTimeScaleHeaders=v,e.resolveTimelineScale=_,e.timelineItemVariants=M,e.timelineMarkerVariants=P});
|
package/dist/renderer.d.ts
CHANGED
|
@@ -7,6 +7,31 @@ import { TimelineSchema } from '@object-ui/types';
|
|
|
7
7
|
* LICENSE file in the root directory of this source tree.
|
|
8
8
|
*/
|
|
9
9
|
import * as React from 'react';
|
|
10
|
+
/**
|
|
11
|
+
* The spec's timeline scale vocabulary (`ui/view.zod.ts`
|
|
12
|
+
* `TimelineConfigSchema.scale`). Exported for the spec-parity test.
|
|
13
|
+
*/
|
|
14
|
+
export declare const TIMELINE_SCALES: ReadonlySet<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Resolve the axis scale for the gantt variant. The spec key is `scale`;
|
|
17
|
+
* `timeScale` is this renderer's pre-spec dialect, kept for stored JSON —
|
|
18
|
+
* before #2942 ONLY `timeScale` was read, so every spec-authored `scale`
|
|
19
|
+
* (all six values) was silently ignored. An absent/unknown value keeps the
|
|
20
|
+
* renderer's historical `month` default. The `vertical` / `horizontal`
|
|
21
|
+
* variants are sequential event feeds with no time axis, so `scale` has
|
|
22
|
+
* nothing to bucket there by construction.
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveTimelineScale(schema: {
|
|
25
|
+
scale?: unknown;
|
|
26
|
+
timeScale?: unknown;
|
|
27
|
+
}): string;
|
|
28
|
+
/**
|
|
29
|
+
* Gantt header labels for one scale across [minDate, maxDate]. Every spec
|
|
30
|
+
* scale produces a non-empty header row — `hour` / `quarter` / `year` used to
|
|
31
|
+
* fall through the month/week/day chain and return `[]`, blanking the axis
|
|
32
|
+
* (#2942). Exported for the spec-parity test.
|
|
33
|
+
*/
|
|
34
|
+
export declare function generateTimeScaleHeaders(scale: string, minDate: string, maxDate: string): string[];
|
|
10
35
|
export declare const TimelineRenderer: ({ schema, className, ...props }: {
|
|
11
36
|
schema: TimelineSchema;
|
|
12
37
|
className?: string;
|
package/dist/renderer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAuBvD;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,CAE9C,CAAC;AAEH;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAG7F;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAoDlG;AA4FD,eAAO,MAAM,gBAAgB,GAAI,iCAAiC;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,6BA+NjI,CAAC"}
|
|
@@ -12,11 +12,16 @@
|
|
|
12
12
|
* embed) without an I18nProvider on the React tree.
|
|
13
13
|
*/
|
|
14
14
|
export declare const TIMELINE_DEFAULT_TRANSLATIONS: Record<string, string>;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Was a local re-implementation that wrapped the hook in try/catch — a
|
|
17
|
+
* rules-of-hooks violation (objectui#2879, same class as #2595/#2596).
|
|
18
|
+
* `useObjectTranslation` is provider-safe, so the probe alone is enough.
|
|
19
|
+
*/
|
|
20
|
+
export declare const useTimelineTranslation: () => {
|
|
21
|
+
t: (key: string, options?: Record<string, unknown>) => string;
|
|
22
|
+
language: string;
|
|
18
23
|
} | {
|
|
19
24
|
t: import('i18next').TFunction<string, undefined>;
|
|
25
|
+
language: string;
|
|
20
26
|
};
|
|
21
|
-
export {};
|
|
22
27
|
//# sourceMappingURL=useTimelineTranslation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTimelineTranslation.d.ts","sourceRoot":"","sources":["../src/useTimelineTranslation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAchE,CAAC;AAIF,
|
|
1
|
+
{"version":3,"file":"useTimelineTranslation.d.ts","sourceRoot":"","sources":["../src/useTimelineTranslation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAchE,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;4BAlClC,CAAC;;;;;CAqCD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@object-ui/plugin-timeline",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "17.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Timeline component plugin for Object UI",
|
|
@@ -24,14 +24,15 @@
|
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@objectstack/spec": "^
|
|
27
|
+
"@objectstack/spec": "^17.0.0-rc.1",
|
|
28
28
|
"class-variance-authority": "^0.7.1",
|
|
29
29
|
"zod": "^4.4.3",
|
|
30
|
-
"@object-ui/components": "
|
|
31
|
-
"@object-ui/core": "
|
|
32
|
-
"@object-ui/
|
|
33
|
-
"@object-ui/
|
|
34
|
-
"@object-ui/
|
|
30
|
+
"@object-ui/components": "17.2.0",
|
|
31
|
+
"@object-ui/core": "17.2.0",
|
|
32
|
+
"@object-ui/i18n": "17.2.0",
|
|
33
|
+
"@object-ui/mobile": "17.2.0",
|
|
34
|
+
"@object-ui/react": "17.2.0",
|
|
35
|
+
"@object-ui/types": "17.2.0"
|
|
35
36
|
},
|
|
36
37
|
"peerDependencies": {
|
|
37
38
|
"react": "^18.0.0 || ^19.0.0",
|
|
@@ -40,11 +41,11 @@
|
|
|
40
41
|
"devDependencies": {
|
|
41
42
|
"@types/react": "19.2.17",
|
|
42
43
|
"@types/react-dom": "19.2.3",
|
|
43
|
-
"@vitejs/plugin-react": "^6.0.
|
|
44
|
+
"@vitejs/plugin-react": "^6.0.4",
|
|
44
45
|
"typescript": "^6.0.3",
|
|
45
46
|
"vite": "^8.1.5",
|
|
46
47
|
"vite-plugin-dts": "^5.0.3",
|
|
47
|
-
"@object-ui/data-objectstack": "
|
|
48
|
+
"@object-ui/data-objectstack": "17.2.0"
|
|
48
49
|
},
|
|
49
50
|
"keywords": [
|
|
50
51
|
"objectui",
|
|
@@ -73,7 +74,7 @@
|
|
|
73
74
|
"build": "vite build",
|
|
74
75
|
"test": "vitest run",
|
|
75
76
|
"test:watch": "vitest",
|
|
76
|
-
"type-check": "tsc --noEmit",
|
|
77
|
+
"type-check": "tsc --noEmit && tsc -p tsconfig.test.json",
|
|
77
78
|
"lint": "eslint ."
|
|
78
79
|
}
|
|
79
80
|
}
|