@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 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
@@ -1,10 +1,14 @@
1
1
  import { default as React } from 'react';
2
- import { DataSource, TimelineSchema, TimelineConfig } from '@object-ui/types';
2
+ import { DataSource, TimelineSchema, ListViewTimelineConfig } from '@object-ui/types';
3
3
  export interface ObjectTimelineProps {
4
4
  schema: TimelineSchema & {
5
5
  objectName?: string;
6
- /** Spec-compliant nested timeline config */
7
- timeline?: TimelineConfig;
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,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA8CnF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,GAAG;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,4CAA4C;QAC5C,QAAQ,CAAC,EAAE,cAAc,CAAC;QAC1B,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,CAgVxD,CAAA"}
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, useObjectTranslation as _, useSchemaContext as v } from "@object-ui/react";
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 y } from "zod";
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 = 10080 * 60 * 1e3;
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 S(e, t, n, r) {
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 C(e, t) {
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 w({ label: e, color: t }) {
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 T(e) {
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 E = ({ schema: e, className: t, ...n }) => {
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 = T(i), r = e.some((e) => e.key !== ""), d = (e, t) => {
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 ? C(e.time, a) : e.startDate ? C(e.startDate, a) : "", i = e.endDate && e.endDate !== e.startDate ? C(e.endDate, a) : "", d = Array.isArray(e.meta) ? e.meta : [];
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(w, {
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: C(e.time, a)
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 = x(i), c = e.minDate || r.minDate, d = e.maxDate || r.maxDate, f = e.timeScale || "month", p = (() => {
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: p.map((e, t) => /* @__PURE__ */ l("div", {
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 = S(n.startDate, n.endDate, c, d);
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${C(n.startDate, a)} - ${C(n.endDate, a)}`,
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", E, {
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
- //#endregion
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
- }, O = "timeline.bucket.today";
433
- function k(e, t) {
434
- let n = D[e] || e;
435
- if (t) for (let [e, r] of Object.entries(t)) n = n.replace(`{{${e}}}`, String(r));
436
- return n;
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
- try {
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 = y.object({
460
- title: y.string().optional(),
461
- date: y.string().optional(),
462
- description: y.string().optional(),
463
- variant: y.string().optional()
464
- }), te = y.object({
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: y.string().optional(),
467
- titleField: y.string().optional(),
468
- dateField: y.string().optional(),
469
- startDateField: y.string().optional(),
470
- endDateField: y.string().optional(),
471
- descriptionField: y.string().optional(),
472
- groupByField: y.string().optional(),
473
- colorField: y.string().optional(),
474
- scale: y.enum([
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, D] = i(null), O = e.timeline;
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 k = m(e.bind);
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 && D(n);
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 && !k && !e.items && !g.data ? (async () => {
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
- k,
536
+ A,
527
537
  e.items,
528
538
  g.data,
529
539
  C,
530
540
  T
531
541
  ]);
532
- let M = g.data || k || _, { t: N } = A(), { fieldOptionLabel: P } = j(), F = O?.titleField ?? e.mapping?.title ?? e.titleField ?? "name", I = O?.startDateField ?? e.mapping?.date ?? e.startDateField ?? e.dateField ?? "date", L = O?.endDateField ?? e.endDateField ?? I, R = e.mapping?.description ?? e.descriptionField ?? "description", z = e.mapping?.variant ?? "variant", B = O?.groupByField ?? e.groupByField, V = O?.colorField ?? e.colorField, H = r(() => {
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(O?.metaFields) ? O.metaFields.filter((e) => typeof e == "string" && e) : ["status", "priority"].filter((e) => t[e]), o = {};
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 = O?.scale ?? e.scale, J = {
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(E, { schema: J }),
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 } = v() || {};
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, E as TimelineRenderer, V as TimelineTime, B as TimelineTitle, F as timelineItemVariants, L as timelineMarkerVariants };
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 };
@@ -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});
@@ -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;
@@ -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;AAmHvD,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,6BAoQjI,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
- declare function fallback(key: string, options?: Record<string, unknown>): string;
16
- export declare function useTimelineTranslation(): {
17
- t: typeof fallback;
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,iBAAS,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAQxE;AAED,wBAAgB,sBAAsB;;;;EAWrC"}
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": "16.1.0",
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": "^16.0.0-rc.0",
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": "16.1.0",
31
- "@object-ui/core": "16.1.0",
32
- "@object-ui/mobile": "16.1.0",
33
- "@object-ui/react": "16.1.0",
34
- "@object-ui/types": "16.1.0"
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.3",
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": "16.1.0"
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
  }