@object-ui/plugin-gantt 17.5.0 → 17.6.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 +218 -0
- package/README.md +353 -119
- package/dist/GanttView.d.ts +41 -36
- package/dist/GanttView.d.ts.map +1 -1
- package/dist/ObjectGantt.d.ts +2 -2
- package/dist/ObjectGantt.d.ts.map +1 -1
- package/dist/QuickFilterBar.d.ts +16 -4
- package/dist/QuickFilterBar.d.ts.map +1 -1
- package/dist/ResourceWorkload.d.ts +1 -1
- package/dist/index.js +495 -502
- package/dist/index.umd.cjs +11 -10
- package/dist/scheduling.d.ts +7 -7
- package/dist/shifts.d.ts +16 -13
- package/dist/shifts.d.ts.map +1 -1
- package/dist/workload.d.ts +1 -1
- package/package.json +11 -11
- package/dist/tsconfig.tsbuildinfo +0 -1
package/dist/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import * as e from "react";
|
|
2
2
|
import { useCallback as t, useContext as n, useEffect as r, useMemo as i, useRef as a, useState as o } from "react";
|
|
3
|
-
import { ComponentRegistry as s, buildExpandFields as c,
|
|
4
|
-
import { ElementDataSourceGate as
|
|
5
|
-
import { toast as
|
|
6
|
-
import { GanttConfigSchema as
|
|
7
|
-
import { resolveFieldCurrency as
|
|
8
|
-
import { RecordDetailDrawer as
|
|
9
|
-
import { AlertDialog as
|
|
10
|
-
import { formatCurrency as
|
|
11
|
-
import { Activity as
|
|
12
|
-
import { Fragment as
|
|
3
|
+
import { ComponentRegistry as s, buildExpandFields as c, convertSortToQueryParams as l, extractRecords as u, getRecordDisplayName as d, resolveDataSource as f } from "@object-ui/core";
|
|
4
|
+
import { ElementDataSourceGate as p, SchemaRendererContext as m, useNavigationOverlay as h, useObjectTranslation as g, useSchemaContext as ee } from "@object-ui/react";
|
|
5
|
+
import { toast as te } from "sonner";
|
|
6
|
+
import { GanttConfigSchema as ne } from "@objectstack/spec/ui";
|
|
7
|
+
import { resolveFieldCurrency as _, useDisplayLocale as v, useLocalization as re } from "@object-ui/i18n";
|
|
8
|
+
import { RecordDetailDrawer as ie, deriveRecordPageHref as ae } from "@object-ui/plugin-detail";
|
|
9
|
+
import { AlertDialog as oe, AlertDialogAction as se, AlertDialogCancel as ce, AlertDialogContent as le, AlertDialogDescription as ue, AlertDialogFooter as de, AlertDialogHeader as fe, AlertDialogTitle as pe, Button as y, cn as me, useResizeObserver as b } from "@object-ui/components";
|
|
10
|
+
import { formatCurrency as he, formatDate as ge, formatDateTime as _e, formatNumber as ve, formatPercent as ye, getSemanticColorName as x, getSemanticHex as S, humanizeLabel as be } from "@object-ui/fields";
|
|
11
|
+
import { Activity as xe, ArrowRight as Se, ChevronDown as Ce, ChevronLeft as we, ChevronRight as Te, Download as C, FileDown as Ee, Lock as De, Maximize2 as Oe, Minimize2 as w, PanelLeft as ke, PanelLeftClose as Ae, Redo2 as T, RefreshCw as E, Save as je, Undo2 as Me, Wand2 as D, ZoomIn as O, ZoomOut as Ne } from "lucide-react";
|
|
12
|
+
import { Fragment as Pe, jsx as k, jsxs as A } from "react/jsx-runtime";
|
|
13
13
|
//#region src/scheduling.ts
|
|
14
14
|
var j = 864e5, M = (e) => e.toISOString().slice(0, 10);
|
|
15
15
|
function N(e, t) {
|
|
@@ -19,60 +19,60 @@ function N(e, t) {
|
|
|
19
19
|
}
|
|
20
20
|
return !(t.holidays && t.holidays.has(M(e)));
|
|
21
21
|
}
|
|
22
|
-
function
|
|
22
|
+
function Fe(e) {
|
|
23
23
|
let t = new Date(e);
|
|
24
24
|
return t.setUTCHours(0, 0, 0, 0), t;
|
|
25
25
|
}
|
|
26
|
-
function
|
|
27
|
-
let n =
|
|
26
|
+
function P(e, t) {
|
|
27
|
+
let n = Fe(e);
|
|
28
28
|
for (; !N(n, t);) n = new Date(n.getTime() + j);
|
|
29
29
|
return n.getTime();
|
|
30
30
|
}
|
|
31
|
-
function
|
|
31
|
+
function Ie(e, t, n) {
|
|
32
32
|
if (t <= e) return 0;
|
|
33
|
-
let r = 0, i =
|
|
33
|
+
let r = 0, i = Fe(e), a = Fe(t).getTime();
|
|
34
34
|
for (; i.getTime() < a;) N(i, n) && r++, i = new Date(i.getTime() + j);
|
|
35
35
|
return r;
|
|
36
36
|
}
|
|
37
|
-
function
|
|
38
|
-
if (t <= 0) return
|
|
39
|
-
let r =
|
|
37
|
+
function Le(e, t, n) {
|
|
38
|
+
if (t <= 0) return Fe(e).getTime();
|
|
39
|
+
let r = Fe(e), i = t;
|
|
40
40
|
for (; i > 0;) N(r, n) && i--, r = new Date(r.getTime() + j);
|
|
41
41
|
return r.getTime();
|
|
42
42
|
}
|
|
43
|
-
function
|
|
44
|
-
if (t <= 0) return
|
|
45
|
-
let r =
|
|
43
|
+
function Re(e, t, n) {
|
|
44
|
+
if (t <= 0) return Fe(e).getTime();
|
|
45
|
+
let r = Fe(e), i = t;
|
|
46
46
|
for (; i > 0;) r = /* @__PURE__ */ new Date(r.getTime() - j), N(r, n) && i--;
|
|
47
47
|
return r.getTime();
|
|
48
48
|
}
|
|
49
|
-
var
|
|
50
|
-
function
|
|
49
|
+
var F = (e) => String(e);
|
|
50
|
+
function I(e) {
|
|
51
51
|
return e === "ss" || e === "ff" || e === "sf" ? e : "fs";
|
|
52
52
|
}
|
|
53
|
-
function
|
|
54
|
-
let t = new Set(e.map((e) =>
|
|
53
|
+
function ze(e) {
|
|
54
|
+
let t = new Set(e.map((e) => F(e.id))), n = [];
|
|
55
55
|
for (let r of e) {
|
|
56
|
-
let e =
|
|
56
|
+
let e = F(r.id);
|
|
57
57
|
for (let i of r.dependencies ?? []) {
|
|
58
58
|
let r = typeof i == "object" && !!i, a = r ? i.id : i;
|
|
59
59
|
if (a == null || a === "") continue;
|
|
60
|
-
let o =
|
|
60
|
+
let o = F(a);
|
|
61
61
|
o === e || !t.has(o) || n.push({
|
|
62
62
|
pred: o,
|
|
63
63
|
succ: e,
|
|
64
|
-
type:
|
|
64
|
+
type: I(r ? i.type : void 0)
|
|
65
65
|
});
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
return n;
|
|
69
69
|
}
|
|
70
|
-
function
|
|
70
|
+
function L(e) {
|
|
71
71
|
let t = /* @__PURE__ */ new Set();
|
|
72
|
-
for (let n of e) n.parent != null && n.parent !== "" && t.add(
|
|
72
|
+
for (let n of e) n.parent != null && n.parent !== "" && t.add(F(n.parent));
|
|
73
73
|
return t;
|
|
74
74
|
}
|
|
75
|
-
function
|
|
75
|
+
function Be(e, t) {
|
|
76
76
|
let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
|
|
77
77
|
for (let t of e) n.set(t, 0), r.set(t, []);
|
|
78
78
|
for (let e of t) r.get(e.pred).push(e.succ), n.set(e.succ, (n.get(e.succ) ?? 0) + 1);
|
|
@@ -98,7 +98,7 @@ function L(e, t) {
|
|
|
98
98
|
hasCycle: !1
|
|
99
99
|
};
|
|
100
100
|
}
|
|
101
|
-
function
|
|
101
|
+
function Ve(e, t) {
|
|
102
102
|
let n = {
|
|
103
103
|
criticalIds: /* @__PURE__ */ new Set(),
|
|
104
104
|
criticalEdges: /* @__PURE__ */ new Set()
|
|
@@ -106,10 +106,10 @@ function Be(e, t) {
|
|
|
106
106
|
if (!e.length) return n;
|
|
107
107
|
let r = /* @__PURE__ */ new Map();
|
|
108
108
|
for (let n of e) {
|
|
109
|
-
let e = t ?
|
|
110
|
-
r.set(
|
|
109
|
+
let e = t ? Ie(n.start.getTime(), n.end.getTime(), t) : (n.end.getTime() - n.start.getTime()) / j;
|
|
110
|
+
r.set(F(n.id), Number.isFinite(e) && e > 0 ? e : 0);
|
|
111
111
|
}
|
|
112
|
-
let i =
|
|
112
|
+
let i = ze(e), a = e.map((e) => F(e.id)), { order: o, hasCycle: s } = Be(a, i);
|
|
113
113
|
if (s) return n;
|
|
114
114
|
let c = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map();
|
|
115
115
|
for (let e of a) c.set(e, []), l.set(e, []);
|
|
@@ -140,34 +140,34 @@ function Be(e, t) {
|
|
|
140
140
|
criticalEdges: te
|
|
141
141
|
};
|
|
142
142
|
}
|
|
143
|
-
function
|
|
143
|
+
function He(e, t, n) {
|
|
144
144
|
if (!e.length) return {
|
|
145
145
|
changes: [],
|
|
146
146
|
skippedLocked: []
|
|
147
147
|
};
|
|
148
|
-
let r =
|
|
148
|
+
let r = ze(e), i = e.map((e) => F(e.id)), { order: a, hasCycle: o } = Be(i, r);
|
|
149
149
|
if (o) return {
|
|
150
150
|
changes: [],
|
|
151
151
|
skippedLocked: []
|
|
152
152
|
};
|
|
153
|
-
let s =
|
|
154
|
-
for (let t of e) c.set(
|
|
153
|
+
let s = L(e), c = /* @__PURE__ */ new Map();
|
|
154
|
+
for (let t of e) c.set(F(t.id), t);
|
|
155
155
|
let l = /* @__PURE__ */ new Map();
|
|
156
156
|
for (let t of e) {
|
|
157
157
|
if (t.parent == null || t.parent === "") continue;
|
|
158
|
-
let e =
|
|
158
|
+
let e = F(t.parent), n = l.get(e) ?? [];
|
|
159
159
|
n.push(t), l.set(e, n);
|
|
160
160
|
}
|
|
161
161
|
let u = n?.summaryExtent === "self", d = (e) => u && e.hasOwnDates !== !1 && !e.locked, f = /* @__PURE__ */ new Map();
|
|
162
162
|
for (let e of i) f.set(e, []);
|
|
163
163
|
for (let e of r) f.get(e.succ).push(e);
|
|
164
164
|
let p = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map();
|
|
165
|
-
for (let t of e) p.set(
|
|
165
|
+
for (let t of e) p.set(F(t.id), t.start.getTime()), m.set(F(t.id), t.end.getTime());
|
|
166
166
|
let h = [];
|
|
167
167
|
for (let e of a) {
|
|
168
168
|
let r = c.get(e);
|
|
169
169
|
if (!r) continue;
|
|
170
|
-
let i = t ?
|
|
170
|
+
let i = t ? Ie(p.get(e), m.get(e), t) : m.get(e) - p.get(e), a = r.start.getTime(), o = a;
|
|
171
171
|
for (let n of f.get(e) ?? []) {
|
|
172
172
|
let e = p.get(n.pred), r = m.get(n.pred), a;
|
|
173
173
|
switch (n.type) {
|
|
@@ -175,10 +175,10 @@ function Ve(e, t, n) {
|
|
|
175
175
|
a = e;
|
|
176
176
|
break;
|
|
177
177
|
case "ff":
|
|
178
|
-
a = t ?
|
|
178
|
+
a = t ? Re(r, i, t) : r - i;
|
|
179
179
|
break;
|
|
180
180
|
case "sf":
|
|
181
|
-
a = t ?
|
|
181
|
+
a = t ? Re(e, i, t) : e - i;
|
|
182
182
|
break;
|
|
183
183
|
default: a = r;
|
|
184
184
|
}
|
|
@@ -191,19 +191,19 @@ function Ve(e, t, n) {
|
|
|
191
191
|
continue;
|
|
192
192
|
}
|
|
193
193
|
if (l && !t && n?.snapStart && (o = Math.max(o, n.snapStart(o))), t) {
|
|
194
|
-
let n =
|
|
195
|
-
p.set(e, n), m.set(e,
|
|
194
|
+
let n = P(o, t);
|
|
195
|
+
p.set(e, n), m.set(e, Le(n, i, t));
|
|
196
196
|
} else p.set(e, o), m.set(e, o + i);
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
if (u) for (let t of e) {
|
|
200
|
-
let e =
|
|
200
|
+
let e = F(t.id);
|
|
201
201
|
if (!s.has(e) || !d(t)) continue;
|
|
202
202
|
let n = p.get(e) - t.start.getTime();
|
|
203
203
|
if (n <= 0) continue;
|
|
204
204
|
let r = [...l.get(e) ?? []];
|
|
205
205
|
for (; r.length;) {
|
|
206
|
-
let e = r.pop(), t =
|
|
206
|
+
let e = r.pop(), t = F(e.id);
|
|
207
207
|
if (r.push(...l.get(t) ?? []), e.locked) continue;
|
|
208
208
|
let i = e.start.getTime() + n;
|
|
209
209
|
if (i > p.get(t)) {
|
|
@@ -214,7 +214,7 @@ function Ve(e, t, n) {
|
|
|
214
214
|
}
|
|
215
215
|
let g = [];
|
|
216
216
|
for (let t of e) {
|
|
217
|
-
let e =
|
|
217
|
+
let e = F(t.id), n = p.get(e), r = m.get(e);
|
|
218
218
|
(n !== t.start.getTime() || r !== t.end.getTime()) && g.push({
|
|
219
219
|
id: e,
|
|
220
220
|
start: new Date(n),
|
|
@@ -226,7 +226,7 @@ function Ve(e, t, n) {
|
|
|
226
226
|
skippedLocked: h
|
|
227
227
|
};
|
|
228
228
|
}
|
|
229
|
-
function
|
|
229
|
+
function Ue(e, t, n) {
|
|
230
230
|
let r = String(t), i = String(n);
|
|
231
231
|
if (r === i) return !0;
|
|
232
232
|
let a = /* @__PURE__ */ new Map();
|
|
@@ -246,28 +246,28 @@ function He(e, t, n) {
|
|
|
246
246
|
}
|
|
247
247
|
//#endregion
|
|
248
248
|
//#region src/shifts.ts
|
|
249
|
-
var
|
|
250
|
-
1440 *
|
|
251
|
-
var
|
|
252
|
-
function
|
|
249
|
+
var We = 6e4;
|
|
250
|
+
1440 * We;
|
|
251
|
+
var Ge = 1440;
|
|
252
|
+
function Ke(e) {
|
|
253
253
|
if (typeof e != "string") return null;
|
|
254
254
|
let t = /^(\d{1,2}):(\d{2})$/.exec(e.trim());
|
|
255
255
|
if (!t) return null;
|
|
256
256
|
let n = Number(t[1]), r = Number(t[2]);
|
|
257
257
|
return n < 0 || n > 23 || r < 0 || r > 59 ? null : n * 60 + r;
|
|
258
258
|
}
|
|
259
|
-
function
|
|
259
|
+
function R(e) {
|
|
260
260
|
if (!e || !Array.isArray(e.bands) || e.bands.length === 0) return null;
|
|
261
|
-
let t =
|
|
261
|
+
let t = Ke(e.dayStart) ?? 0, n = [];
|
|
262
262
|
for (let t = 0; t < e.bands.length; t++) {
|
|
263
|
-
let r = e.bands[t], i =
|
|
263
|
+
let r = e.bands[t], i = Ke(r.start), a = Ke(r.end);
|
|
264
264
|
if (i == null || a == null || !r.label) return null;
|
|
265
|
-
let o = (a - i +
|
|
265
|
+
let o = (a - i + Ge) % Ge || Ge;
|
|
266
266
|
n.push({
|
|
267
267
|
key: r.key ?? `band${t}`,
|
|
268
268
|
label: r.label,
|
|
269
269
|
color: r.color,
|
|
270
|
-
durMs: o *
|
|
270
|
+
durMs: o * We
|
|
271
271
|
});
|
|
272
272
|
}
|
|
273
273
|
return {
|
|
@@ -280,7 +280,7 @@ function qe(e, t) {
|
|
|
280
280
|
let n = new Date(e);
|
|
281
281
|
return n.setHours(0, 0, 0, 0), n.setMinutes(t), n.getTime() > e.getTime() && n.setDate(n.getDate() - 1), n;
|
|
282
282
|
}
|
|
283
|
-
function
|
|
283
|
+
function Je(e, t) {
|
|
284
284
|
if (t.bands.length === 0) return null;
|
|
285
285
|
let n = qe(e, t.dayStartMin).getTime(), r = e.getTime() - n, i = 0;
|
|
286
286
|
for (let e of t.bands) if (i += e.durMs, r < i) return e;
|
|
@@ -288,7 +288,7 @@ function R(e, t) {
|
|
|
288
288
|
}
|
|
289
289
|
//#endregion
|
|
290
290
|
//#region src/useGanttTranslation.ts
|
|
291
|
-
var
|
|
291
|
+
var z = {
|
|
292
292
|
"gantt.column.taskName": "Task Name",
|
|
293
293
|
"gantt.column.start": "Start",
|
|
294
294
|
"gantt.column.end": "End",
|
|
@@ -370,55 +370,55 @@ var Je = {
|
|
|
370
370
|
"gantt.lockedHint": "No edit permission",
|
|
371
371
|
"gantt.writeFailed": "Save failed — the change was rolled back"
|
|
372
372
|
};
|
|
373
|
-
function
|
|
374
|
-
let n =
|
|
373
|
+
function Ye(e, t) {
|
|
374
|
+
let n = z[e] || e;
|
|
375
375
|
if (t) for (let [e, r] of Object.entries(t)) n = n.split(`{{${e}}}`).join(String(r));
|
|
376
376
|
return n;
|
|
377
377
|
}
|
|
378
|
-
function
|
|
379
|
-
let e =
|
|
378
|
+
function Xe() {
|
|
379
|
+
let e = g();
|
|
380
380
|
return {
|
|
381
381
|
t: (t, n) => {
|
|
382
382
|
let r = e.t(t, n);
|
|
383
|
-
return typeof r == "string" && r !== t ? r :
|
|
383
|
+
return typeof r == "string" && r !== t ? r : Ye(t, n);
|
|
384
384
|
},
|
|
385
385
|
language: e.language
|
|
386
386
|
};
|
|
387
387
|
}
|
|
388
388
|
//#endregion
|
|
389
389
|
//#region src/GanttView.tsx
|
|
390
|
-
var
|
|
391
|
-
function
|
|
390
|
+
var Ze = 8;
|
|
391
|
+
function Qe(e, t) {
|
|
392
392
|
if (t.width <= 0) return "move";
|
|
393
|
-
let n = Math.min(
|
|
393
|
+
let n = Math.min(Ze, t.width / 3), r = e - t.left;
|
|
394
394
|
return r <= n ? "resize-left" : r >= t.width - n ? "resize-right" : "move";
|
|
395
395
|
}
|
|
396
|
-
function
|
|
396
|
+
function $e(e) {
|
|
397
397
|
return 110;
|
|
398
398
|
}
|
|
399
|
-
function
|
|
399
|
+
function et(e) {
|
|
400
400
|
return e < 640 ? 140 : e < 1024 ? 220 : 320;
|
|
401
401
|
}
|
|
402
|
-
function
|
|
402
|
+
function tt(e) {
|
|
403
403
|
return e >= 280;
|
|
404
404
|
}
|
|
405
|
-
function
|
|
405
|
+
function nt(e) {
|
|
406
406
|
return e < 640 ? 32 : 40;
|
|
407
407
|
}
|
|
408
|
-
var
|
|
408
|
+
var rt = [
|
|
409
409
|
"day",
|
|
410
410
|
"week",
|
|
411
411
|
"month",
|
|
412
412
|
"quarter",
|
|
413
413
|
"year"
|
|
414
|
-
],
|
|
414
|
+
], it = {
|
|
415
415
|
day: 1,
|
|
416
416
|
week: 7,
|
|
417
417
|
month: 30.44,
|
|
418
418
|
quarter: 91.31,
|
|
419
419
|
year: 365.25
|
|
420
|
-
},
|
|
421
|
-
function
|
|
420
|
+
}, at = 864e5;
|
|
421
|
+
function ot(e, t) {
|
|
422
422
|
let n = new Intl.DateTimeFormat("en-US", {
|
|
423
423
|
timeZone: e,
|
|
424
424
|
hour12: !1,
|
|
@@ -431,7 +431,7 @@ function at(e, t) {
|
|
|
431
431
|
}), r = (e) => Number(n.formatToParts(t).find((t) => t.type === e)?.value ?? 0);
|
|
432
432
|
return Date.UTC(r("year"), r("month") - 1, r("day"), r("hour") % 24, r("minute"), r("second")) - Math.floor(t.getTime() / 1e3) * 1e3;
|
|
433
433
|
}
|
|
434
|
-
function
|
|
434
|
+
function st(e) {
|
|
435
435
|
let t = {
|
|
436
436
|
delta: 0,
|
|
437
437
|
to: (e) => e,
|
|
@@ -440,11 +440,11 @@ function ot(e) {
|
|
|
440
440
|
};
|
|
441
441
|
if (!e) return t;
|
|
442
442
|
try {
|
|
443
|
-
|
|
443
|
+
ot(e, /* @__PURE__ */ new Date());
|
|
444
444
|
} catch {
|
|
445
445
|
return console.warn(`[GanttView] invalid timeZone "${e}" — falling back to the browser zone`), t;
|
|
446
446
|
}
|
|
447
|
-
let n = (t) =>
|
|
447
|
+
let n = (t) => ot(e, t) - -t.getTimezoneOffset() * 6e4, r = n(/* @__PURE__ */ new Date());
|
|
448
448
|
return r === 0 ? t : {
|
|
449
449
|
delta: r,
|
|
450
450
|
to: (e) => new Date(e.getTime() + n(e)),
|
|
@@ -452,11 +452,11 @@ function ot(e) {
|
|
|
452
452
|
now: () => new Date(Date.now() + n(/* @__PURE__ */ new Date()))
|
|
453
453
|
};
|
|
454
454
|
}
|
|
455
|
-
function
|
|
455
|
+
function ct(e, t) {
|
|
456
456
|
let n = new Date(e);
|
|
457
457
|
return n.setHours(0, 0, 0, 0), t === "week" ? n.setDate(n.getDate() - (n.getDay() + 6) % 7) : t === "month" ? n.setDate(1) : t === "quarter" ? n.setMonth(Math.floor(n.getMonth() / 3) * 3, 1) : t === "year" && n.setMonth(0, 1), n;
|
|
458
458
|
}
|
|
459
|
-
function
|
|
459
|
+
function lt(e, t, n) {
|
|
460
460
|
let r = e.length - 1, i = 0;
|
|
461
461
|
for (; i < r && e[i + 1] < t;) i++;
|
|
462
462
|
let a = i;
|
|
@@ -466,7 +466,7 @@ function ct(e, t, n) {
|
|
|
466
466
|
end: a
|
|
467
467
|
};
|
|
468
468
|
}
|
|
469
|
-
function
|
|
469
|
+
function ut(e, t, n) {
|
|
470
470
|
let r = new Date(e);
|
|
471
471
|
if (n === "day") r.setDate(r.getDate() + t);
|
|
472
472
|
else if (n === "week") r.setDate(r.getDate() + t * 7);
|
|
@@ -478,7 +478,7 @@ function lt(e, t, n) {
|
|
|
478
478
|
}
|
|
479
479
|
return r;
|
|
480
480
|
}
|
|
481
|
-
function
|
|
481
|
+
function dt(e, t, n, r = 2) {
|
|
482
482
|
return new Promise((i) => {
|
|
483
483
|
let a = new Blob([e], { type: "image/svg+xml;charset=utf-8" }), o = URL.createObjectURL(a), s = new Image();
|
|
484
484
|
s.onload = () => {
|
|
@@ -491,11 +491,11 @@ function ut(e, t, n, r = 2) {
|
|
|
491
491
|
}, s.src = o;
|
|
492
492
|
});
|
|
493
493
|
}
|
|
494
|
-
function
|
|
494
|
+
function ft(e, t) {
|
|
495
495
|
let n = document.createElement("a");
|
|
496
496
|
n.href = URL.createObjectURL(e), n.download = t, document.body.appendChild(n), n.click(), n.remove(), setTimeout(() => URL.revokeObjectURL(n.href), 1e3);
|
|
497
497
|
}
|
|
498
|
-
function
|
|
498
|
+
function pt(e, t, n) {
|
|
499
499
|
let r = (e) => {
|
|
500
500
|
let t = new Uint8Array(e.length);
|
|
501
501
|
for (let n = 0; n < e.length; n++) t[n] = e.charCodeAt(n) & 255;
|
|
@@ -510,18 +510,18 @@ function ft(e, t, n) {
|
|
|
510
510
|
for (let e of o) d += `${String(e).padStart(10, "0")} 00000 n \n`;
|
|
511
511
|
return d += `trailer\n<< /Size 6 /Root 1 0 R >>\nstartxref\n${u}\n%%EOF\n`, c(r(d)), new Blob(a, { type: "application/pdf" });
|
|
512
512
|
}
|
|
513
|
-
function
|
|
513
|
+
function mt(e) {
|
|
514
514
|
let t = e.slice(e.indexOf(",") + 1), n = atob(t), r = new Uint8Array(n.length);
|
|
515
515
|
for (let e = 0; e < n.length; e++) r[e] = n.charCodeAt(e);
|
|
516
516
|
return r;
|
|
517
517
|
}
|
|
518
|
-
var
|
|
519
|
-
function
|
|
518
|
+
var ht = "gantt-layout:";
|
|
519
|
+
function gt(e) {
|
|
520
520
|
if (!e || typeof window > "u") return null;
|
|
521
521
|
try {
|
|
522
|
-
let t = window.localStorage.getItem(
|
|
522
|
+
let t = window.localStorage.getItem(ht + e);
|
|
523
523
|
if (!t) return null;
|
|
524
|
-
let n = JSON.parse(t), r = n.viewMode &&
|
|
524
|
+
let n = JSON.parse(t), r = n.viewMode && rt.includes(n.viewMode) ? n.viewMode : null;
|
|
525
525
|
if (!r) return null;
|
|
526
526
|
let i = typeof n.columnWidth == "number" && isFinite(n.columnWidth) ? n.columnWidth : null, a = typeof n.taskListWidth == "number" && isFinite(n.taskListWidth) ? n.taskListWidth : null, o = Array.isArray(n.collapsedIds) ? n.collapsedIds.filter((e) => typeof e == "string") : void 0;
|
|
527
527
|
return {
|
|
@@ -535,22 +535,22 @@ function ht(e) {
|
|
|
535
535
|
return null;
|
|
536
536
|
}
|
|
537
537
|
}
|
|
538
|
-
function
|
|
538
|
+
function _t(e, t) {
|
|
539
539
|
if (!(typeof window > "u")) try {
|
|
540
|
-
window.localStorage.setItem(
|
|
540
|
+
window.localStorage.setItem(ht + e, JSON.stringify(t));
|
|
541
541
|
} catch {}
|
|
542
542
|
}
|
|
543
|
-
function
|
|
544
|
-
let x = e.useMemo(() =>
|
|
543
|
+
function vt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTaskClick: o, onTaskUpdate: s, onTaskDelete: c, onViewChange: l, onDependencyCreate: u, onBeforeDependencyCreate: d, onDependencyDelete: f, onTaskReorder: p, className: m, inlineEdit: h = !1, autoSchedule: g = !1, rescheduleOnConflict: ee = !1, criticalPathDefault: ne = !1, workingCalendar: _, shiftSegments: v, showBaselines: re = !0, readOnly: ie = !1, mobileReadOnly: ae = !1, groupBy: oe, ungroupedLabel: se = "Ungrouped", defaultCollapsedDepth: ce, summaryExtent: le = "children", persistLayoutKey: ue, onLayoutChange: de, onRefresh: fe, refreshing: pe = !1, dependencyTypes: he = !0, timeZone: ge, exportFileName: _e, interactions: ve, onBeforeTaskUpdate: ye }) {
|
|
544
|
+
let x = e.useMemo(() => st(ge), [ge]), S = e.useMemo(() => x.delta === 0 ? t : t.map((e) => ({
|
|
545
545
|
...e,
|
|
546
546
|
start: x.to(e.start),
|
|
547
547
|
end: x.to(e.end),
|
|
548
548
|
baselineStart: e.baselineStart ? x.to(e.baselineStart) : e.baselineStart,
|
|
549
549
|
baselineEnd: e.baselineEnd ? x.to(e.baselineEnd) : e.baselineEnd
|
|
550
|
-
})), [t, x]),
|
|
550
|
+
})), [t, x]), be = e.useMemo(() => r && x.delta !== 0 ? x.to(r) : r, [r, x]), j = e.useMemo(() => i && x.delta !== 0 ? x.to(i) : i, [i, x]), M = e.useMemo(() => !a || x.delta === 0 ? a : a.map((e) => ({
|
|
551
551
|
...e,
|
|
552
552
|
date: x.to(new Date(e.date))
|
|
553
|
-
})), [a, x]), { t:
|
|
553
|
+
})), [a, x]), { t: N, language: Fe } = Xe(), P = Fe || void 0, [Ie, Le] = e.useState(() => x.now()), Re = e.useRef(null), { width: F } = b(Re), I = F || (typeof window < "u" ? window.innerWidth : 1024), ze = I < 640, L = ie || ae && ze, Be = ve?.move !== !1, We = ve?.resize !== !1, Ge = ve?.progress !== !1, Ke = ve?.link !== !1, R = e.useMemo(() => {
|
|
554
554
|
if (!(L || !s)) return x.delta === 0 ? s : (e, t) => {
|
|
555
555
|
let n = { ...t };
|
|
556
556
|
n.start instanceof Date && (n.start = x.from(n.start)), n.end instanceof Date && (n.end = x.from(n.end)), s(e, n);
|
|
@@ -559,36 +559,36 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
559
559
|
L,
|
|
560
560
|
s,
|
|
561
561
|
x
|
|
562
|
-
]), Je = L ? void 0 : c, z = L || !Ke ? void 0 : u,
|
|
563
|
-
xt.current === void 0 && (xt.current =
|
|
564
|
-
let St = xt.current, [Ct, wt] = e.useState(St ? St.columnWidth : null), [Tt, Et] = e.useState(St ? St.taskListWidth ?? null : null), [V, Dt] = e.useState(n &&
|
|
562
|
+
]), Je = L ? void 0 : c, z = L || !Ke ? void 0 : u, Ye = L || !Ke ? void 0 : f, ot = L ? void 0 : p, ht = !L && h, vt = !L && g, yt = !L && ee, B = nt(I), bt = $e(I), xt = e.useRef(void 0);
|
|
563
|
+
xt.current === void 0 && (xt.current = gt(ue));
|
|
564
|
+
let St = xt.current, [Ct, wt] = e.useState(St ? St.columnWidth : null), [Tt, Et] = e.useState(St ? St.taskListWidth ?? null : null), [V, Dt] = e.useState(n && rt.includes(n) ? n : St?.viewMode ?? "day");
|
|
565
565
|
e.useEffect(() => {
|
|
566
|
-
n &&
|
|
566
|
+
n && rt.includes(n) && Dt(n);
|
|
567
567
|
}, [n]);
|
|
568
568
|
let Ot = e.useRef(null), kt = e.useRef(null), At = e.useRef(!0), [jt, Mt] = e.useState(St ? St.taskListCollapsed : !1), Nt = e.useRef(!1);
|
|
569
569
|
e.useEffect(() => {
|
|
570
570
|
!Nt.current && ze && (Mt(!0), Nt.current = !0);
|
|
571
571
|
}, [ze]);
|
|
572
|
-
let Pt = Math.max(160,
|
|
573
|
-
if (Ct != null ||
|
|
574
|
-
let e =
|
|
575
|
-
|
|
576
|
-
let n = Math.max(1, (t.getTime() - e.getTime()) /
|
|
572
|
+
let Pt = Math.max(160, I - 200), H = jt ? 0 : Tt == null ? et(I) : Math.max(160, Math.min(Tt, Pt)), Ft = e.useMemo(() => {
|
|
573
|
+
if (Ct != null || j || S.length === 0) return null;
|
|
574
|
+
let e = be ? new Date(be) : new Date(Math.min(...S.map((e) => e.start.getTime()))), t = new Date(Math.max(...S.map((e) => e.end.getTime())));
|
|
575
|
+
be || e.setDate(e.getDate() - 7), t.setDate(t.getDate() + 14), e = ct(e, V), t.setHours(23, 59, 59, 999);
|
|
576
|
+
let n = Math.max(1, (t.getTime() - e.getTime()) / at), r = Math.max(0, I - H);
|
|
577
577
|
if (r <= 0) return null;
|
|
578
|
-
let i = r / n *
|
|
578
|
+
let i = r / n * it[V];
|
|
579
579
|
if (i <= bt) return null;
|
|
580
580
|
let a = Math.min(i, r * .6);
|
|
581
581
|
return a > bt ? a : null;
|
|
582
582
|
}, [
|
|
583
583
|
Ct,
|
|
584
584
|
S,
|
|
585
|
+
be,
|
|
585
586
|
j,
|
|
586
|
-
M,
|
|
587
587
|
V,
|
|
588
|
-
|
|
588
|
+
I,
|
|
589
589
|
H,
|
|
590
590
|
bt
|
|
591
|
-
]), It = Ct ?? Ft ?? bt, Lt = It /
|
|
591
|
+
]), It = Ct ?? Ft ?? bt, Lt = It / it[V], Rt = tt(H), [zt, Bt] = e.useState(null), [Vt, Ht] = e.useState({}), [Ut, Wt] = e.useState(null), U = e.useMemo(() => {
|
|
592
592
|
if (!oe) return S;
|
|
593
593
|
let e = /* @__PURE__ */ new Set();
|
|
594
594
|
for (let t of S) {
|
|
@@ -655,7 +655,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
655
655
|
Yt.current = W;
|
|
656
656
|
}, [W]);
|
|
657
657
|
let Xt = e.useRef(!1), Zt = e.useCallback((e) => {
|
|
658
|
-
let t = V === "day" && v && v.bands.length > 0 && v ? Math.min(...v.bands.map((e) => e.durMs)) :
|
|
658
|
+
let t = V === "day" && v && v.bands.length > 0 && v ? Math.min(...v.bands.map((e) => e.durMs)) : at, n = (e, t) => nr.current ? nr.current(e, t) : ut(e, t, "day"), r = new Date(e.originStart), i = new Date(e.originEnd);
|
|
659
659
|
return e.mode === "move" ? (r = n(e.originStart, e.unitDelta), i = new Date(e.originEnd.getTime() + (r.getTime() - e.originStart.getTime()))) : e.mode === "resize-left" ? (r = n(e.originStart, e.unitDelta), i.getTime() - r.getTime() < t && (r = new Date(i.getTime() - t))) : e.mode === "resize-right" && (i = n(e.originEnd, e.unitDelta), i.getTime() - r.getTime() < t && (i = new Date(r.getTime() + t))), {
|
|
660
660
|
start: r,
|
|
661
661
|
end: i
|
|
@@ -700,7 +700,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
700
700
|
let t = new Date(e);
|
|
701
701
|
t.setHours(0, 0, 0, 0);
|
|
702
702
|
for (let n = -1; n <= 1; n++) {
|
|
703
|
-
let r = t.getTime() + n *
|
|
703
|
+
let r = t.getTime() + n * at + v.dayStartMin * 6e4;
|
|
704
704
|
for (let t of v.bands) {
|
|
705
705
|
if (r >= e) return r;
|
|
706
706
|
r += t.durMs;
|
|
@@ -721,7 +721,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
721
721
|
start: r.start ?? n.start,
|
|
722
722
|
end: r.end ?? n.end
|
|
723
723
|
});
|
|
724
|
-
let { changes: n } =
|
|
724
|
+
let { changes: n } = He(Qt.current.map((e) => {
|
|
725
725
|
let n = t.get(String(e.id));
|
|
726
726
|
return n ? {
|
|
727
727
|
...e,
|
|
@@ -767,7 +767,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
767
767
|
}), [tn]);
|
|
768
768
|
e.useEffect(() => {
|
|
769
769
|
if (!W) return;
|
|
770
|
-
let e = V === "day" && v && v.bands.length > 0 && v ? Lt * Math.min(...v.bands.map((e) => e.durMs)) /
|
|
770
|
+
let e = V === "day" && v && v.bands.length > 0 && v ? Lt * Math.min(...v.bands.map((e) => e.durMs)) / at : Lt, t = (t) => {
|
|
771
771
|
let n = Yt.current;
|
|
772
772
|
if (!n) return;
|
|
773
773
|
let r = Math.round((t.clientX - n.originClientX) / Math.max(e, 1));
|
|
@@ -879,7 +879,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
879
879
|
r != null && r !== "" && e.push([String(r), String(t.id)]);
|
|
880
880
|
}
|
|
881
881
|
return e;
|
|
882
|
-
}, [S]), xn = e.useCallback((e, t) => String(t.id) === String(e) ? "self" : t.locked ? "locked" : t.type === "group" ? "group" :
|
|
882
|
+
}, [S]), xn = e.useCallback((e, t) => String(t.id) === String(e) ? "self" : t.locked ? "locked" : t.type === "group" ? "group" : Ue(bn, e, t.id) ? "cycle" : null, [bn]), Sn = e.useCallback((e, t) => xn(e, t) === null, [xn]), Cn = e.useRef(null), [G, wn] = e.useState(null), Tn = e.useRef(null);
|
|
883
883
|
e.useEffect(() => {
|
|
884
884
|
Tn.current = G;
|
|
885
885
|
}, [G]), e.useEffect(() => {
|
|
@@ -898,7 +898,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
898
898
|
if (e && e.targetId != null && z) {
|
|
899
899
|
let t = S.find((t) => String(t.id) === String(e.sourceId)), n = S.find((t) => String(t.id) === String(e.targetId)), r = e.targetEnd ?? "start", i = he ? `${e.sourceEnd === "end" ? "f" : "s"}${r === "end" ? "f" : "s"}` : "fs";
|
|
900
900
|
t && n && Sn(e.sourceId, n) && (d?.(t, n, i) ?? !0) && z(t, n, i);
|
|
901
|
-
} else e && e.rejectedReason && z &&
|
|
901
|
+
} else e && e.rejectedReason && z && te.error(N(`gantt.link.rejected.${e.rejectedReason}`));
|
|
902
902
|
Xt.current = !0, window.setTimeout(() => {
|
|
903
903
|
Xt.current = !1;
|
|
904
904
|
}, 0), wn(null);
|
|
@@ -913,7 +913,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
913
913
|
d,
|
|
914
914
|
Sn,
|
|
915
915
|
he,
|
|
916
|
-
|
|
916
|
+
N
|
|
917
917
|
]);
|
|
918
918
|
let [En, Dn] = e.useState(null), On = e.useRef(null);
|
|
919
919
|
e.useEffect(() => {
|
|
@@ -958,14 +958,14 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
958
958
|
taskId: e.id
|
|
959
959
|
});
|
|
960
960
|
}, [zn]), Vn = e.useCallback((e, t, n, r) => {
|
|
961
|
-
r.preventDefault(), r.stopPropagation(), !(!z && !
|
|
961
|
+
r.preventDefault(), r.stopPropagation(), !(!z && !Ye) && An({
|
|
962
962
|
x: r.clientX,
|
|
963
963
|
y: r.clientY,
|
|
964
964
|
sourceId: e,
|
|
965
965
|
targetId: t,
|
|
966
966
|
type: n
|
|
967
967
|
});
|
|
968
|
-
}, [z,
|
|
968
|
+
}, [z, Ye]), [Hn, Un] = e.useState(() => new Set(St?.collapsedIds ?? [])), Wn = e.useCallback((e) => {
|
|
969
969
|
Un((t) => {
|
|
970
970
|
let n = new Set(t), r = String(e);
|
|
971
971
|
return n.has(r) ? n.delete(r) : n.add(r), n;
|
|
@@ -1014,7 +1014,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1014
1014
|
for (let a of s) {
|
|
1015
1015
|
let s = i(a, n);
|
|
1016
1016
|
(!e || s.start < e) && (e = s.start), (!t || s.end > t) && (t = s.end);
|
|
1017
|
-
let c = Math.max(s.end.getTime() - s.start.getTime(),
|
|
1017
|
+
let c = Math.max(s.end.getTime() - s.start.getTime(), at);
|
|
1018
1018
|
r += c * s.progress, o += c;
|
|
1019
1019
|
}
|
|
1020
1020
|
n.delete(a), c = {
|
|
@@ -1091,14 +1091,14 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1091
1091
|
fn,
|
|
1092
1092
|
pn
|
|
1093
1093
|
]), q = e.useMemo(() => {
|
|
1094
|
-
let e =
|
|
1095
|
-
return !
|
|
1094
|
+
let e = be ? new Date(be) : x.now(), t = j ? new Date(j) : x.now();
|
|
1095
|
+
return !be && S.length > 0 && (e = new Date(Math.min(...S.map((e) => e.start.getTime()))), e.setDate(e.getDate() - 7)), !j && S.length > 0 && (t = new Date(Math.max(...S.map((e) => e.end.getTime()))), t.setDate(t.getDate() + 14)), e = V === "day" && v && v.bands.length > 0 ? qe(e, v.dayStartMin) : ct(e, V), t.setHours(23, 59, 59, 999), {
|
|
1096
1096
|
start: e,
|
|
1097
1097
|
end: t
|
|
1098
1098
|
};
|
|
1099
1099
|
}, [
|
|
1100
|
+
be,
|
|
1100
1101
|
j,
|
|
1101
|
-
M,
|
|
1102
1102
|
S,
|
|
1103
1103
|
V,
|
|
1104
1104
|
v,
|
|
@@ -1119,7 +1119,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1119
1119
|
if (qn && v) {
|
|
1120
1120
|
let t = new Date(q.start);
|
|
1121
1121
|
for (; t <= q.end;) for (let n of v.bands) {
|
|
1122
|
-
let r = n.durMs /
|
|
1122
|
+
let r = n.durMs / at * Lt;
|
|
1123
1123
|
e.push({
|
|
1124
1124
|
date: new Date(t),
|
|
1125
1125
|
label: n.label,
|
|
@@ -1133,16 +1133,16 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1133
1133
|
}
|
|
1134
1134
|
let t = new Date(q.start);
|
|
1135
1135
|
for (; t <= q.end;) {
|
|
1136
|
-
let n =
|
|
1136
|
+
let n = ut(t, 1, V);
|
|
1137
1137
|
if (Jn && !Yn(t)) {
|
|
1138
1138
|
t = n;
|
|
1139
1139
|
continue;
|
|
1140
1140
|
}
|
|
1141
|
-
let r = (n.getTime() - t.getTime()) /
|
|
1142
|
-
V === "day" ? (i = String(t.getDate()), a = t.toLocaleDateString(
|
|
1141
|
+
let r = (n.getTime() - t.getTime()) / at * Lt, i, a;
|
|
1142
|
+
V === "day" ? (i = String(t.getDate()), a = t.toLocaleDateString(P, { weekday: "narrow" })) : i = V === "week" ? t.toLocaleDateString(P, {
|
|
1143
1143
|
month: "numeric",
|
|
1144
1144
|
day: "numeric"
|
|
1145
|
-
}) : V === "month" ? t.toLocaleDateString(
|
|
1145
|
+
}) : V === "month" ? t.toLocaleDateString(P, { month: "short" }) : V === "quarter" ? `Q${Math.floor(t.getMonth() / 3) + 1}` : String(t.getFullYear()), e.push({
|
|
1146
1146
|
date: new Date(t),
|
|
1147
1147
|
label: i,
|
|
1148
1148
|
sublabel: a,
|
|
@@ -1155,7 +1155,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1155
1155
|
q,
|
|
1156
1156
|
V,
|
|
1157
1157
|
Lt,
|
|
1158
|
-
|
|
1158
|
+
P,
|
|
1159
1159
|
Jn,
|
|
1160
1160
|
Yn,
|
|
1161
1161
|
qn,
|
|
@@ -1164,7 +1164,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1164
1164
|
let e = Array(J.length + 1), t = 0;
|
|
1165
1165
|
for (let n = 0; n < J.length; n++) e[n] = t, t += J[n].width;
|
|
1166
1166
|
return e[J.length] = t, e;
|
|
1167
|
-
}, [J]), Xn = Y[Y.length - 1], Zn = e.useMemo(() => J.map((e) => e.date.getTime()), [J]), Qn = e.useMemo(() => J.map((e) => e.realMs == null ?
|
|
1167
|
+
}, [J]), Xn = Y[Y.length - 1], Zn = e.useMemo(() => J.map((e) => e.date.getTime()), [J]), Qn = e.useMemo(() => J.map((e) => e.realMs == null ? ut(e.date, 1, V).getTime() - e.date.getTime() : e.realMs), [J, V]), X = e.useCallback((e) => {
|
|
1168
1168
|
let t = J.length;
|
|
1169
1169
|
if (t === 0) return 0;
|
|
1170
1170
|
let n = e.getTime(), r = 0, i = t - 1, a = 0;
|
|
@@ -1207,7 +1207,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1207
1207
|
Ot.current = null;
|
|
1208
1208
|
let t = Z.current;
|
|
1209
1209
|
if (!t || t.clientWidth === 0) return;
|
|
1210
|
-
let n = Math.max(0, t.scrollWidth - t.clientWidth), r = Math.max(0, Math.min(Math.round(X(
|
|
1210
|
+
let n = Math.max(0, t.scrollWidth - t.clientWidth), r = Math.max(0, Math.min(Math.round(X(ct(e, V))), n));
|
|
1211
1211
|
t.scrollLeft !== r && (t.scrollLeft = r);
|
|
1212
1212
|
}, [V, X]);
|
|
1213
1213
|
let tr = e.useCallback((e, t) => {
|
|
@@ -1230,7 +1230,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1230
1230
|
let r = String(qe(n.date, v.dayStartMin).getTime()), i = e[e.length - 1];
|
|
1231
1231
|
i && i.key === r ? i.width += n.width : e.push({
|
|
1232
1232
|
key: r,
|
|
1233
|
-
label: n.date.toLocaleDateString(
|
|
1233
|
+
label: n.date.toLocaleDateString(P, {
|
|
1234
1234
|
month: "short",
|
|
1235
1235
|
day: "numeric"
|
|
1236
1236
|
}),
|
|
@@ -1245,7 +1245,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1245
1245
|
let i = r.date.getFullYear(), a = Math.floor(i / 10) * 10, o = t === "decade" ? String(a) : t === "year" ? String(i) : `${i}-${r.date.getMonth()}`, s = e[e.length - 1];
|
|
1246
1246
|
s && s.key === o ? s.width += r.width : e.push({
|
|
1247
1247
|
key: o,
|
|
1248
|
-
label: t === "decade" ? `${a}s` : t === "year" ? String(i) : r.date.toLocaleDateString(
|
|
1248
|
+
label: t === "decade" ? `${a}s` : t === "year" ? String(i) : r.date.toLocaleDateString(P, {
|
|
1249
1249
|
month: "short",
|
|
1250
1250
|
year: "numeric"
|
|
1251
1251
|
}),
|
|
@@ -1257,10 +1257,10 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1257
1257
|
}, [
|
|
1258
1258
|
J,
|
|
1259
1259
|
V,
|
|
1260
|
-
|
|
1260
|
+
P,
|
|
1261
1261
|
qn,
|
|
1262
1262
|
v
|
|
1263
|
-
]), ir = e.useMemo(() => (
|
|
1263
|
+
]), ir = e.useMemo(() => (M ?? []).map((e, t) => {
|
|
1264
1264
|
let n = e.date instanceof Date ? e.date : new Date(e.date);
|
|
1265
1265
|
return {
|
|
1266
1266
|
index: t,
|
|
@@ -1270,7 +1270,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1270
1270
|
valid: !isNaN(n.getTime()) && n >= q.start && n <= q.end
|
|
1271
1271
|
};
|
|
1272
1272
|
}).filter((e) => e.valid), [
|
|
1273
|
-
|
|
1273
|
+
M,
|
|
1274
1274
|
q,
|
|
1275
1275
|
X
|
|
1276
1276
|
]), ar = e.useRef(null), or = e.useRef(null), sr = e.useRef(null), Z = e.useRef(null);
|
|
@@ -1319,14 +1319,14 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1319
1319
|
let t = new ResizeObserver(gr);
|
|
1320
1320
|
return t.observe(e), () => t.disconnect();
|
|
1321
1321
|
}, [gr]);
|
|
1322
|
-
let _r = e.useMemo(() =>
|
|
1322
|
+
let _r = e.useMemo(() => lt(Y, fr.left - 240, fr.left + mr.width + 240), [
|
|
1323
1323
|
Y,
|
|
1324
1324
|
fr.left,
|
|
1325
1325
|
mr.width
|
|
1326
1326
|
]), vr = e.useMemo(() => {
|
|
1327
1327
|
let e = rr.map((e) => e.offset);
|
|
1328
1328
|
return e.push(Xn), e;
|
|
1329
|
-
}, [rr, Xn]), yr = e.useMemo(() =>
|
|
1329
|
+
}, [rr, Xn]), yr = e.useMemo(() => lt(vr, fr.left - 240, fr.left + mr.width + 240), [
|
|
1330
1330
|
vr,
|
|
1331
1331
|
fr.left,
|
|
1332
1332
|
mr.width
|
|
@@ -1344,7 +1344,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1344
1344
|
return document.addEventListener("fullscreenchange", e), () => document.removeEventListener("fullscreenchange", e);
|
|
1345
1345
|
}, []);
|
|
1346
1346
|
let Cr = e.useCallback(() => {
|
|
1347
|
-
let e =
|
|
1347
|
+
let e = Re.current;
|
|
1348
1348
|
e && (document.fullscreenElement ? document.exitFullscreen?.() : e.requestFullscreen?.());
|
|
1349
1349
|
}, []), wr = e.useRef(null), Tr = e.useCallback((e) => {
|
|
1350
1350
|
if (e.touches.length === 2) {
|
|
@@ -1428,7 +1428,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1428
1428
|
e.useEffect(() => () => {
|
|
1429
1429
|
ur.current.forEach((e) => window.clearTimeout(e)), dr.current?.();
|
|
1430
1430
|
}, []);
|
|
1431
|
-
let Nr = e.useCallback(() => jr(
|
|
1431
|
+
let Nr = e.useCallback(() => jr(ct(x.now(), "week")), [jr, x]), Pr = e.useCallback(() => jr(ct(x.now(), "month")), [jr, x]), Fr = e.useRef(null), Ir = e.useRef(null), Lr = e.useRef(null), Rr = e.useRef(null), zr = e.useRef(null), Br = e.useRef(null), Vr = e.useRef(null), Hr = e.useRef(null), Ur = e.useCallback(() => {
|
|
1432
1432
|
let e = sr.current, t = Fr.current, n = Ir.current, r = Lr.current;
|
|
1433
1433
|
if (e && t && n && r) {
|
|
1434
1434
|
let i = e.scrollWidth > e.clientWidth + 1;
|
|
@@ -1512,7 +1512,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1512
1512
|
top: t.scrollTop
|
|
1513
1513
|
});
|
|
1514
1514
|
}, Xr = (e, t) => {
|
|
1515
|
-
let n = X(e), r = qn && v ? Lt * Math.min(...v.bands.map((e) => e.durMs)) /
|
|
1515
|
+
let n = X(e), r = qn && v ? Lt * Math.min(...v.bands.map((e) => e.durMs)) / at : Lt;
|
|
1516
1516
|
return {
|
|
1517
1517
|
left: n,
|
|
1518
1518
|
width: Math.max(X(t) - n, r, 3)
|
|
@@ -1583,7 +1583,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1583
1583
|
h.push(`L ${m(f)} ${m(t)}`, `L ${m(p)} ${m(t)}`, `L ${m(p)} ${m(s)}`, `L ${m(d)} ${m(s)}`);
|
|
1584
1584
|
}
|
|
1585
1585
|
return h.join(" ");
|
|
1586
|
-
}, mi = W?.taskId ?? Ut, [hi, gi] = e.useState(ne), _i = e.useMemo(() => hi ?
|
|
1586
|
+
}, mi = W?.taskId ?? Ut, [hi, gi] = e.useState(ne), _i = e.useMemo(() => hi ? Ve(S, _) : null, [
|
|
1587
1587
|
hi,
|
|
1588
1588
|
S,
|
|
1589
1589
|
_
|
|
@@ -1595,7 +1595,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1595
1595
|
}, [xi]);
|
|
1596
1596
|
let Ci = e.useCallback(() => {
|
|
1597
1597
|
if (!R) return;
|
|
1598
|
-
let { changes: e, skippedLocked: t } =
|
|
1598
|
+
let { changes: e, skippedLocked: t } = He(S, _, cn);
|
|
1599
1599
|
if (!e.length) {
|
|
1600
1600
|
Si(!0);
|
|
1601
1601
|
return;
|
|
@@ -1733,15 +1733,15 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1733
1733
|
}, [_e]), Di = e.useCallback(async () => {
|
|
1734
1734
|
let e = Ti();
|
|
1735
1735
|
if (!e) return;
|
|
1736
|
-
let t = await
|
|
1736
|
+
let t = await dt(e.svg, e.W, e.H);
|
|
1737
1737
|
t && t.toBlob((e) => {
|
|
1738
|
-
e &&
|
|
1738
|
+
e && ft(e, `${Ei()}.png`);
|
|
1739
1739
|
}, "image/png");
|
|
1740
1740
|
}, [Ti, Ei]), Oi = e.useCallback(async () => {
|
|
1741
1741
|
let e = Ti();
|
|
1742
1742
|
if (!e) return;
|
|
1743
|
-
let t = await
|
|
1744
|
-
t &&
|
|
1743
|
+
let t = await dt(e.svg, e.W, e.H);
|
|
1744
|
+
t && ft(pt(mt(t.toDataURL("image/jpeg", .92)), t.width, t.height), `${Ei()}.pdf`);
|
|
1745
1745
|
}, [Ti, Ei]), [ki, Ai] = e.useState(!1), ji = e.useCallback(() => {
|
|
1746
1746
|
let e = {
|
|
1747
1747
|
viewMode: V,
|
|
@@ -1750,7 +1750,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1750
1750
|
taskListWidth: Tt,
|
|
1751
1751
|
collapsedIds: Array.from(Hn)
|
|
1752
1752
|
};
|
|
1753
|
-
ue &&
|
|
1753
|
+
ue && _t(ue, e), de?.(e), Ai(!0);
|
|
1754
1754
|
}, [
|
|
1755
1755
|
V,
|
|
1756
1756
|
Ct,
|
|
@@ -1765,12 +1765,12 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1765
1765
|
let e = setTimeout(() => Ai(!1), 1500);
|
|
1766
1766
|
return () => clearTimeout(e);
|
|
1767
1767
|
}, [ki]), /* @__PURE__ */ A("div", {
|
|
1768
|
-
ref:
|
|
1769
|
-
className:
|
|
1768
|
+
ref: Re,
|
|
1769
|
+
className: me("flex flex-col h-full bg-background overflow-hidden min-w-0", m),
|
|
1770
1770
|
"data-readonly": L ? "true" : void 0,
|
|
1771
1771
|
"data-mobile-readonly": ae && ze ? "true" : void 0,
|
|
1772
1772
|
children: [
|
|
1773
|
-
/* @__PURE__ */ k("style", { children: "\n .gantt-resize-handle:hover { background-color: rgba(255, 255, 255, 0.4); }\n .gantt-bar-hover:hover { filter: brightness(1.1); }\n .gantt-row-open-btn { opacity: 0; transition: opacity 0.15s ease; }\n /* :where keeps the row-hover reveal at zero specificity so the\n button's own :hover/:focus-visible full-opacity rule can win. */\n :where(.group\\/task-row:hover) .gantt-row-open-btn { opacity: 0.6; }\n .gantt-row-open-btn:hover, .gantt-row-open-btn:focus-visible { opacity: 1; }\n /*
|
|
1773
|
+
/* @__PURE__ */ k("style", { children: "\n .gantt-resize-handle:hover { background-color: rgba(255, 255, 255, 0.4); }\n .gantt-bar-hover:hover { filter: brightness(1.1); }\n .gantt-row-open-btn { opacity: 0; transition: opacity 0.15s ease; }\n /* :where keeps the row-hover reveal at zero specificity so the\n button's own :hover/:focus-visible full-opacity rule can win. */\n :where(.group\\/task-row:hover) .gantt-row-open-btn { opacity: 0.6; }\n .gantt-row-open-btn:hover, .gantt-row-open-btn:focus-visible { opacity: 1; }\n /* Locate flash: blink the located bar 3× with a thick ring + colored glow so\n it's hard to miss. The ring is an outline (not box-shadow) and the glow\n is a drop-shadow *filter* — both stay clear of the critical-path bar's\n inline box-shadow, which they'd otherwise clobber. */\n @keyframes gantt-flash {\n 0%, 25%, 50%, 100% {\n outline-color: rgba(37, 99, 235, 0);\n filter: drop-shadow(0 0 0 rgba(37, 99, 235, 0));\n }\n 12%, 37%, 62% {\n outline-color: rgba(37, 99, 235, 1);\n filter: drop-shadow(0 0 9px rgba(37, 99, 235, 0.9));\n }\n }\n .gantt-flash {\n outline: 3px solid transparent;\n outline-offset: 3px;\n border-radius: 2px;\n animation: gantt-flash 1.5s ease-in-out;\n }\n @media (min-width: 640px) {\n .gantt-sm-h50 { height: 50px; }\n .gantt-sm-w20 { width: 80px; }\n .gantt-sm-hidden { display: none; }\n }\n /* The timeline's NATIVE scrollbars are fully hidden — both axes are\n replaced by the self-drawn bars (horizontal at the bottom, vertical\n on the right). Styling the native bar is a dead end: overlay-scrollbar\n engines (macOS \"show while scrolling\", embedded Chromium) ignore\n ::-webkit-scrollbar theming yet still flash their own auto-hiding bar\n on scroll, which doubled up with the self-drawn one (two visible\n scrollbars). scrollbar-width:none is honored by overlay engines too;\n the ::-webkit rule covers older WebKit. Wheel/trackpad/programmatic\n scrolling is unaffected. */\n [data-testid=\"gantt-timeline\"] { scrollbar-width: none; }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar { display: none; width: 0; height: 0; }\n /* The task-list pane scrolls in lockstep with the timeline, so its own\n vertical scrollbar (butted against the divider) was a confusing second\n bar. Hide it — the pane stays wheel/drag-scrollable and synced. */\n .gantt-task-list::-webkit-scrollbar { width: 0; height: 0; }\n .gantt-task-list { scrollbar-width: none; }\n " }),
|
|
1774
1774
|
/* @__PURE__ */ A("div", {
|
|
1775
1775
|
className: "flex flex-col sm:flex-row items-start sm:items-center justify-between gap-2 p-2 border-b bg-card",
|
|
1776
1776
|
children: [/* @__PURE__ */ A("div", {
|
|
@@ -1780,19 +1780,19 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1780
1780
|
variant: "ghost",
|
|
1781
1781
|
size: "icon",
|
|
1782
1782
|
className: "h-8 w-8",
|
|
1783
|
-
"aria-label":
|
|
1784
|
-
children: /* @__PURE__ */ k(
|
|
1783
|
+
"aria-label": N("gantt.toolbar.prevPeriod"),
|
|
1784
|
+
children: /* @__PURE__ */ k(we, { className: "h-4 w-4" })
|
|
1785
1785
|
}),
|
|
1786
1786
|
/* @__PURE__ */ k(y, {
|
|
1787
1787
|
variant: "ghost",
|
|
1788
1788
|
size: "icon",
|
|
1789
1789
|
className: "h-8 w-8",
|
|
1790
|
-
"aria-label":
|
|
1791
|
-
children: /* @__PURE__ */ k(
|
|
1790
|
+
"aria-label": N("gantt.toolbar.nextPeriod"),
|
|
1791
|
+
children: /* @__PURE__ */ k(Te, { className: "h-4 w-4" })
|
|
1792
1792
|
}),
|
|
1793
1793
|
/* @__PURE__ */ k("span", {
|
|
1794
1794
|
className: "font-semibold text-xs sm:text-sm",
|
|
1795
|
-
children: q.start.toLocaleDateString(
|
|
1795
|
+
children: q.start.toLocaleDateString(P, {
|
|
1796
1796
|
month: "long",
|
|
1797
1797
|
year: "numeric"
|
|
1798
1798
|
})
|
|
@@ -1800,8 +1800,8 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1800
1800
|
L && /* @__PURE__ */ A("span", {
|
|
1801
1801
|
className: "inline-flex items-center gap-1 rounded-full border bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground",
|
|
1802
1802
|
"data-testid": "gantt-readonly-badge",
|
|
1803
|
-
title:
|
|
1804
|
-
children: [/* @__PURE__ */ k(
|
|
1803
|
+
title: N("gantt.readOnlyHint"),
|
|
1804
|
+
children: [/* @__PURE__ */ k(De, { className: "h-3 w-3" }), N("gantt.readOnly")]
|
|
1805
1805
|
})
|
|
1806
1806
|
]
|
|
1807
1807
|
}), /* @__PURE__ */ A("div", {
|
|
@@ -1810,15 +1810,15 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1810
1810
|
/* @__PURE__ */ k("div", {
|
|
1811
1811
|
className: "flex bg-muted rounded-md p-1",
|
|
1812
1812
|
role: "group",
|
|
1813
|
-
"aria-label":
|
|
1814
|
-
children:
|
|
1813
|
+
"aria-label": N("gantt.toolbar.viewMode"),
|
|
1814
|
+
children: rt.map((e) => /* @__PURE__ */ k(y, {
|
|
1815
1815
|
variant: "ghost",
|
|
1816
1816
|
size: "sm",
|
|
1817
|
-
className:
|
|
1817
|
+
className: me("h-6 px-1.5 sm:px-2 text-xs", V === e && "bg-background shadow-sm hover:bg-background"),
|
|
1818
1818
|
onClick: () => er(e),
|
|
1819
1819
|
"aria-pressed": V === e,
|
|
1820
1820
|
"data-testid": `gantt-view-mode-${e}`,
|
|
1821
|
-
children:
|
|
1821
|
+
children: N(`gantt.viewMode.${e}`)
|
|
1822
1822
|
}, e))
|
|
1823
1823
|
}),
|
|
1824
1824
|
/* @__PURE__ */ A("div", {
|
|
@@ -1830,12 +1830,12 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1830
1830
|
onClick: () => {
|
|
1831
1831
|
if (It > 15) wt(Math.max(15, It - 10));
|
|
1832
1832
|
else {
|
|
1833
|
-
let e =
|
|
1834
|
-
e <
|
|
1833
|
+
let e = rt.indexOf(V);
|
|
1834
|
+
e < rt.length - 1 && (er(rt[e + 1]), wt(bt));
|
|
1835
1835
|
}
|
|
1836
1836
|
},
|
|
1837
|
-
"aria-label":
|
|
1838
|
-
children: /* @__PURE__ */ k(
|
|
1837
|
+
"aria-label": N("gantt.toolbar.zoomOut"),
|
|
1838
|
+
children: /* @__PURE__ */ k(Ne, { className: "h-3 w-3" })
|
|
1839
1839
|
}), /* @__PURE__ */ k(y, {
|
|
1840
1840
|
variant: "ghost",
|
|
1841
1841
|
size: "icon",
|
|
@@ -1843,11 +1843,11 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1843
1843
|
onClick: () => {
|
|
1844
1844
|
if (It < 120) wt(Math.min(120, It + 10));
|
|
1845
1845
|
else {
|
|
1846
|
-
let e =
|
|
1847
|
-
e > 0 && (er(
|
|
1846
|
+
let e = rt.indexOf(V);
|
|
1847
|
+
e > 0 && (er(rt[e - 1]), wt(bt));
|
|
1848
1848
|
}
|
|
1849
1849
|
},
|
|
1850
|
-
"aria-label":
|
|
1850
|
+
"aria-label": N("gantt.toolbar.zoomIn"),
|
|
1851
1851
|
children: /* @__PURE__ */ k(O, { className: "h-3 w-3" })
|
|
1852
1852
|
})]
|
|
1853
1853
|
}),
|
|
@@ -1856,10 +1856,10 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1856
1856
|
size: "icon",
|
|
1857
1857
|
className: "h-8 w-8",
|
|
1858
1858
|
onClick: () => Mt((e) => !e),
|
|
1859
|
-
"aria-label":
|
|
1859
|
+
"aria-label": N(jt ? "gantt.toolbar.showTaskList" : "gantt.toolbar.hideTaskList"),
|
|
1860
1860
|
"aria-pressed": jt,
|
|
1861
1861
|
"data-testid": "gantt-toggle-task-list",
|
|
1862
|
-
children: k(jt ?
|
|
1862
|
+
children: k(jt ? ke : Ae, { className: "h-4 w-4" })
|
|
1863
1863
|
}),
|
|
1864
1864
|
/* @__PURE__ */ k(y, {
|
|
1865
1865
|
variant: "ghost",
|
|
@@ -1867,55 +1867,55 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1867
1867
|
className: "h-8 px-2 text-xs",
|
|
1868
1868
|
onClick: kr,
|
|
1869
1869
|
disabled: Or == null,
|
|
1870
|
-
"aria-label":
|
|
1870
|
+
"aria-label": N("gantt.toolbar.jumpToToday"),
|
|
1871
1871
|
"data-testid": "gantt-jump-today",
|
|
1872
|
-
children:
|
|
1872
|
+
children: N("gantt.toolbar.today")
|
|
1873
1873
|
}),
|
|
1874
1874
|
/* @__PURE__ */ k(y, {
|
|
1875
1875
|
variant: "ghost",
|
|
1876
1876
|
size: "sm",
|
|
1877
1877
|
className: "h-8 px-2 text-xs",
|
|
1878
1878
|
onClick: Nr,
|
|
1879
|
-
"aria-label":
|
|
1879
|
+
"aria-label": N("gantt.toolbar.thisWeek"),
|
|
1880
1880
|
"data-testid": "gantt-jump-week",
|
|
1881
|
-
children:
|
|
1881
|
+
children: N("gantt.toolbar.thisWeek")
|
|
1882
1882
|
}),
|
|
1883
1883
|
/* @__PURE__ */ k(y, {
|
|
1884
1884
|
variant: "ghost",
|
|
1885
1885
|
size: "sm",
|
|
1886
1886
|
className: "h-8 px-2 text-xs",
|
|
1887
1887
|
onClick: Pr,
|
|
1888
|
-
"aria-label":
|
|
1888
|
+
"aria-label": N("gantt.toolbar.thisMonth"),
|
|
1889
1889
|
"data-testid": "gantt-jump-month",
|
|
1890
|
-
children:
|
|
1890
|
+
children: N("gantt.toolbar.thisMonth")
|
|
1891
1891
|
}),
|
|
1892
1892
|
fe ? /* @__PURE__ */ k(y, {
|
|
1893
1893
|
variant: "ghost",
|
|
1894
1894
|
size: "icon",
|
|
1895
1895
|
className: "h-8 w-8",
|
|
1896
1896
|
onClick: () => void fe(),
|
|
1897
|
-
disabled:
|
|
1898
|
-
"aria-label":
|
|
1899
|
-
"aria-busy":
|
|
1897
|
+
disabled: pe,
|
|
1898
|
+
"aria-label": N("gantt.toolbar.refresh"),
|
|
1899
|
+
"aria-busy": pe,
|
|
1900
1900
|
"data-testid": "gantt-refresh",
|
|
1901
1901
|
children: /* @__PURE__ */ k(E, { className: "h-4 w-4" })
|
|
1902
1902
|
}) : null,
|
|
1903
|
-
R ? /* @__PURE__ */ A(
|
|
1903
|
+
R ? /* @__PURE__ */ A(Pe, { children: [/* @__PURE__ */ k(y, {
|
|
1904
1904
|
variant: "ghost",
|
|
1905
1905
|
size: "icon",
|
|
1906
1906
|
className: "h-8 w-8",
|
|
1907
1907
|
onClick: fn,
|
|
1908
1908
|
disabled: !mn,
|
|
1909
|
-
"aria-label":
|
|
1909
|
+
"aria-label": N("gantt.toolbar.undo"),
|
|
1910
1910
|
"data-testid": "gantt-undo",
|
|
1911
|
-
children: /* @__PURE__ */ k(
|
|
1911
|
+
children: /* @__PURE__ */ k(Me, { className: "h-4 w-4" })
|
|
1912
1912
|
}), /* @__PURE__ */ k(y, {
|
|
1913
1913
|
variant: "ghost",
|
|
1914
1914
|
size: "icon",
|
|
1915
1915
|
className: "h-8 w-8",
|
|
1916
1916
|
onClick: pn,
|
|
1917
1917
|
disabled: !hn,
|
|
1918
|
-
"aria-label":
|
|
1918
|
+
"aria-label": N("gantt.toolbar.redo"),
|
|
1919
1919
|
"data-testid": "gantt-redo",
|
|
1920
1920
|
children: /* @__PURE__ */ k(T, { className: "h-4 w-4" })
|
|
1921
1921
|
})] }) : null,
|
|
@@ -1924,18 +1924,18 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1924
1924
|
size: "icon",
|
|
1925
1925
|
className: "h-8 w-8",
|
|
1926
1926
|
onClick: () => gi((e) => !e),
|
|
1927
|
-
"aria-label":
|
|
1927
|
+
"aria-label": N("gantt.toolbar.criticalPath"),
|
|
1928
1928
|
"aria-pressed": hi,
|
|
1929
1929
|
"data-testid": "gantt-critical-path",
|
|
1930
1930
|
style: hi ? { color: $ } : void 0,
|
|
1931
|
-
children: /* @__PURE__ */ k(
|
|
1931
|
+
children: /* @__PURE__ */ k(xe, { className: "h-4 w-4" })
|
|
1932
1932
|
}),
|
|
1933
1933
|
vt && R ? /* @__PURE__ */ k(y, {
|
|
1934
1934
|
variant: "ghost",
|
|
1935
1935
|
size: "icon",
|
|
1936
1936
|
className: "h-8 w-8",
|
|
1937
1937
|
onClick: Ci,
|
|
1938
|
-
"aria-label":
|
|
1938
|
+
"aria-label": N("gantt.toolbar.autoSchedule"),
|
|
1939
1939
|
"data-testid": "gantt-auto-schedule",
|
|
1940
1940
|
children: /* @__PURE__ */ k(D, { className: "h-4 w-4" })
|
|
1941
1941
|
}) : null,
|
|
@@ -1944,7 +1944,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1944
1944
|
size: "icon",
|
|
1945
1945
|
className: "h-8 w-8",
|
|
1946
1946
|
onClick: Di,
|
|
1947
|
-
"aria-label":
|
|
1947
|
+
"aria-label": N("gantt.toolbar.exportPng"),
|
|
1948
1948
|
"data-testid": "gantt-export-png",
|
|
1949
1949
|
children: /* @__PURE__ */ k(C, { className: "h-4 w-4" })
|
|
1950
1950
|
}),
|
|
@@ -1953,30 +1953,30 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1953
1953
|
size: "icon",
|
|
1954
1954
|
className: "h-8 w-8",
|
|
1955
1955
|
onClick: Oi,
|
|
1956
|
-
"aria-label":
|
|
1956
|
+
"aria-label": N("gantt.toolbar.exportPdf"),
|
|
1957
1957
|
"data-testid": "gantt-export-pdf",
|
|
1958
|
-
children: /* @__PURE__ */ k(
|
|
1958
|
+
children: /* @__PURE__ */ k(Ee, { className: "h-4 w-4" })
|
|
1959
1959
|
}),
|
|
1960
1960
|
de || ue ? /* @__PURE__ */ k(y, {
|
|
1961
1961
|
variant: "ghost",
|
|
1962
1962
|
size: "icon",
|
|
1963
1963
|
className: "h-8 w-8",
|
|
1964
1964
|
onClick: ji,
|
|
1965
|
-
"aria-label":
|
|
1965
|
+
"aria-label": N("gantt.toolbar.saveLayout"),
|
|
1966
1966
|
"aria-pressed": ki,
|
|
1967
1967
|
"data-testid": "gantt-save-layout",
|
|
1968
1968
|
style: ki ? { color: $ } : void 0,
|
|
1969
|
-
children: /* @__PURE__ */ k(
|
|
1969
|
+
children: /* @__PURE__ */ k(je, { className: "h-4 w-4" })
|
|
1970
1970
|
}) : null,
|
|
1971
1971
|
/* @__PURE__ */ k(y, {
|
|
1972
1972
|
variant: "ghost",
|
|
1973
1973
|
size: "icon",
|
|
1974
1974
|
className: "h-8 w-8",
|
|
1975
1975
|
onClick: Cr,
|
|
1976
|
-
"aria-label":
|
|
1976
|
+
"aria-label": N(xr ? "gantt.toolbar.exitFullscreen" : "gantt.toolbar.enterFullscreen"),
|
|
1977
1977
|
"aria-pressed": xr,
|
|
1978
1978
|
"data-testid": "gantt-fullscreen",
|
|
1979
|
-
children: k(xr ? w :
|
|
1979
|
+
children: k(xr ? w : Oe, { className: "h-4 w-4" })
|
|
1980
1980
|
})
|
|
1981
1981
|
]
|
|
1982
1982
|
})]
|
|
@@ -2000,7 +2000,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2000
2000
|
onPointerDown: (e) => {
|
|
2001
2001
|
if (e.button !== 0) return;
|
|
2002
2002
|
e.preventDefault();
|
|
2003
|
-
let t = e.clientX, n = H, r = Math.max(160,
|
|
2003
|
+
let t = e.clientX, n = H, r = Math.max(160, I - 200), i = (e) => {
|
|
2004
2004
|
let i = Math.max(160, Math.min(n + (e.clientX - t), r));
|
|
2005
2005
|
Et(i);
|
|
2006
2006
|
}, a = () => {
|
|
@@ -2022,14 +2022,14 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2022
2022
|
children: [
|
|
2023
2023
|
/* @__PURE__ */ k("div", {
|
|
2024
2024
|
className: "flex-1 truncate",
|
|
2025
|
-
children:
|
|
2025
|
+
children: N("gantt.column.taskName")
|
|
2026
2026
|
}),
|
|
2027
|
-
Rt && /* @__PURE__ */ A(
|
|
2027
|
+
Rt && /* @__PURE__ */ A(Pe, { children: [/* @__PURE__ */ k("div", {
|
|
2028
2028
|
className: "w-16 gantt-sm-w20 text-right",
|
|
2029
|
-
children:
|
|
2029
|
+
children: N("gantt.column.start")
|
|
2030
2030
|
}), /* @__PURE__ */ k("div", {
|
|
2031
2031
|
className: "w-16 gantt-sm-w20 text-right",
|
|
2032
|
-
children:
|
|
2032
|
+
children: N("gantt.column.end")
|
|
2033
2033
|
})] }),
|
|
2034
2034
|
o && /* @__PURE__ */ k("div", {
|
|
2035
2035
|
className: "w-6 shrink-0 hidden sm:block",
|
|
@@ -2065,7 +2065,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2065
2065
|
children: J.slice(_r.start, _r.end).map((e, t) => {
|
|
2066
2066
|
let n = _r.start + t;
|
|
2067
2067
|
return /* @__PURE__ */ A("div", {
|
|
2068
|
-
className:
|
|
2068
|
+
className: me("absolute top-0 bottom-0 flex items-center justify-center gap-1 border-r text-xs text-muted-foreground overflow-hidden", e.isWeekend && "bg-muted/50"),
|
|
2069
2069
|
style: {
|
|
2070
2070
|
left: Y[n],
|
|
2071
2071
|
width: e.width,
|
|
@@ -2096,16 +2096,16 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2096
2096
|
minWidth: H
|
|
2097
2097
|
},
|
|
2098
2098
|
role: "tree",
|
|
2099
|
-
"aria-label":
|
|
2099
|
+
"aria-label": N("gantt.aria.taskList"),
|
|
2100
2100
|
children: [
|
|
2101
2101
|
Q.startIdx > 0 && /* @__PURE__ */ k("div", {
|
|
2102
2102
|
style: { height: Q.startIdx * B },
|
|
2103
2103
|
"aria-hidden": "true"
|
|
2104
2104
|
}),
|
|
2105
2105
|
K.slice(Q.startIdx, Q.endIdx).map((e) => {
|
|
2106
|
-
let t = e.task, n =
|
|
2106
|
+
let t = e.task, n = ht && zt === t.id, r = Hn.has(String(t.id)), i = Ln != null && String(Ln) === String(t.id);
|
|
2107
2107
|
return /* @__PURE__ */ A("div", {
|
|
2108
|
-
className:
|
|
2108
|
+
className: me("group/task-row relative flex items-center border-b px-2 sm:px-4 hover:bg-accent/50 cursor-pointer transition-colors", i && "bg-accent/50"),
|
|
2109
2109
|
style: {
|
|
2110
2110
|
height: B,
|
|
2111
2111
|
touchAction: "manipulation"
|
|
@@ -2115,26 +2115,26 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2115
2115
|
"aria-level": e.depth + 1,
|
|
2116
2116
|
"aria-selected": i,
|
|
2117
2117
|
"aria-expanded": e.hasChildren ? !r : void 0,
|
|
2118
|
-
draggable: !!
|
|
2119
|
-
onDragStart:
|
|
2118
|
+
draggable: !!ot && !n && !t.locked,
|
|
2119
|
+
onDragStart: ot ? (e) => {
|
|
2120
2120
|
e.dataTransfer.setData("text/plain", String(t.id)), e.dataTransfer.effectAllowed = "move";
|
|
2121
2121
|
} : void 0,
|
|
2122
|
-
onDragOver:
|
|
2122
|
+
onDragOver: ot ? (e) => {
|
|
2123
2123
|
e.preventDefault(), e.dataTransfer.dropEffect = "move";
|
|
2124
2124
|
} : void 0,
|
|
2125
|
-
onDrop:
|
|
2125
|
+
onDrop: ot ? (e) => {
|
|
2126
2126
|
e.preventDefault();
|
|
2127
2127
|
let n = e.dataTransfer.getData("text/plain");
|
|
2128
2128
|
if (!n || n === String(t.id)) return;
|
|
2129
2129
|
let r = Kt.get(n);
|
|
2130
|
-
r && String(r.parent ?? "") === String(t.parent ?? "") &&
|
|
2130
|
+
r && String(r.parent ?? "") === String(t.parent ?? "") && ot(r, t);
|
|
2131
2131
|
} : void 0,
|
|
2132
2132
|
onContextMenu: (e) => Bn(t, e),
|
|
2133
2133
|
onClick: () => {
|
|
2134
2134
|
Rn(t.id), n || Mr(e.start, e.end, t.id);
|
|
2135
2135
|
},
|
|
2136
2136
|
onDoubleClick: () => {
|
|
2137
|
-
n || (
|
|
2137
|
+
n || (ht && R && !e.isSummary && !t.locked ? (Bt(t.id), Ht({
|
|
2138
2138
|
title: t.title,
|
|
2139
2139
|
start: t.start.toLocaleDateString("en-CA"),
|
|
2140
2140
|
end: t.end.toLocaleDateString("en-CA"),
|
|
@@ -2154,9 +2154,9 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2154
2154
|
e.stopPropagation(), Wn(t.id);
|
|
2155
2155
|
},
|
|
2156
2156
|
"aria-expanded": !r,
|
|
2157
|
-
"aria-label":
|
|
2157
|
+
"aria-label": N(r ? "gantt.row.expand" : "gantt.row.collapse"),
|
|
2158
2158
|
"data-testid": `gantt-row-toggle-${t.id}`,
|
|
2159
|
-
children: k(r ?
|
|
2159
|
+
children: k(r ? Te : Ce, { className: "h-3.5 w-3.5" })
|
|
2160
2160
|
}) : /* @__PURE__ */ k("span", {
|
|
2161
2161
|
className: "w-3 shrink-0",
|
|
2162
2162
|
style: { marginLeft: -4 },
|
|
@@ -2189,17 +2189,17 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2189
2189
|
}) : /* @__PURE__ */ A("span", {
|
|
2190
2190
|
className: "flex flex-col min-w-0",
|
|
2191
2191
|
children: [/* @__PURE__ */ k("span", {
|
|
2192
|
-
className:
|
|
2192
|
+
className: me("truncate", e.isSummary && "font-semibold"),
|
|
2193
2193
|
children: t.title
|
|
2194
2194
|
}), /* @__PURE__ */ A("span", {
|
|
2195
2195
|
className: "text-[10px] text-muted-foreground gantt-sm-hidden",
|
|
2196
2196
|
children: [
|
|
2197
|
-
e.start.toLocaleDateString(
|
|
2197
|
+
e.start.toLocaleDateString(P, {
|
|
2198
2198
|
month: "numeric",
|
|
2199
2199
|
day: "numeric"
|
|
2200
2200
|
}),
|
|
2201
2201
|
" → ",
|
|
2202
|
-
e.end.toLocaleDateString(
|
|
2202
|
+
e.end.toLocaleDateString(P, {
|
|
2203
2203
|
month: "numeric",
|
|
2204
2204
|
day: "numeric"
|
|
2205
2205
|
})
|
|
@@ -2221,7 +2221,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2221
2221
|
start: e.target.value
|
|
2222
2222
|
})),
|
|
2223
2223
|
onClick: (e) => e.stopPropagation()
|
|
2224
|
-
}) : e.start.toLocaleDateString(
|
|
2224
|
+
}) : e.start.toLocaleDateString(P, {
|
|
2225
2225
|
month: "numeric",
|
|
2226
2226
|
day: "numeric"
|
|
2227
2227
|
})
|
|
@@ -2239,7 +2239,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2239
2239
|
end: e.target.value
|
|
2240
2240
|
})),
|
|
2241
2241
|
onClick: (e) => e.stopPropagation()
|
|
2242
|
-
}) : e.end.toLocaleDateString(
|
|
2242
|
+
}) : e.end.toLocaleDateString(P, {
|
|
2243
2243
|
month: "numeric",
|
|
2244
2244
|
day: "numeric"
|
|
2245
2245
|
})
|
|
@@ -2249,14 +2249,14 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2249
2249
|
style: { marginLeft: 4 },
|
|
2250
2250
|
children: !n && /* @__PURE__ */ k("button", {
|
|
2251
2251
|
type: "button",
|
|
2252
|
-
title:
|
|
2253
|
-
"aria-label":
|
|
2252
|
+
title: N("gantt.row.open"),
|
|
2253
|
+
"aria-label": N("gantt.row.open"),
|
|
2254
2254
|
"data-testid": `gantt-row-open-${t.id}`,
|
|
2255
2255
|
className: "gantt-row-open-btn h-6 w-6 rounded-md flex items-center justify-center hover:bg-accent text-muted-foreground hover:text-foreground",
|
|
2256
2256
|
onClick: (e) => {
|
|
2257
2257
|
e.stopPropagation(), o(t);
|
|
2258
2258
|
},
|
|
2259
|
-
children: /* @__PURE__ */ k(
|
|
2259
|
+
children: /* @__PURE__ */ k(Se, { className: "h-3.5 w-3.5" })
|
|
2260
2260
|
})
|
|
2261
2261
|
})
|
|
2262
2262
|
]
|
|
@@ -2289,14 +2289,14 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2289
2289
|
backgroundColor: "rgba(239, 68, 68, 0.8)"
|
|
2290
2290
|
},
|
|
2291
2291
|
"data-testid": "gantt-today-marker",
|
|
2292
|
-
"aria-label":
|
|
2292
|
+
"aria-label": N("gantt.toolbar.today"),
|
|
2293
2293
|
children: /* @__PURE__ */ k("div", {
|
|
2294
2294
|
className: "absolute -translate-x-1/2 left-0 text-[10px] font-semibold text-white rounded-sm px-1 py-0.5 whitespace-nowrap z-30",
|
|
2295
2295
|
style: {
|
|
2296
2296
|
top: 2,
|
|
2297
2297
|
backgroundColor: "#ef4444"
|
|
2298
2298
|
},
|
|
2299
|
-
children:
|
|
2299
|
+
children: N("gantt.toolbar.today")
|
|
2300
2300
|
})
|
|
2301
2301
|
}),
|
|
2302
2302
|
ir.map((e) => /* @__PURE__ */ k("div", {
|
|
@@ -2372,7 +2372,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2372
2372
|
},
|
|
2373
2373
|
"data-testid": `gantt-baseline-${r.id}`,
|
|
2374
2374
|
"aria-hidden": "true"
|
|
2375
|
-
}) : null, l = W?.taskId === r.id, u = Qr?.has(String(r.id)) ?? !1, d = $r?.has(String(r.id)) ?? !1, f = l || u || d ? ei(t) : o, p = !!r.locked, m = !!R && !t.isSummary && !p, h = m &&
|
|
2375
|
+
}) : null, l = W?.taskId === r.id, u = Qr?.has(String(r.id)) ?? !1, d = $r?.has(String(r.id)) ?? !1, f = l || u || d ? ei(t) : o, p = !!r.locked, m = !!R && !t.isSummary && !p, h = m && Be, g = m && We, ee = m && Ge, te = h || g, ne = L || p, _ = G != null && G.targetId != null && String(G.targetId) === String(r.id) && String(G.sourceId) !== String(r.id), v = G != null && G.rejectedId != null && String(G.rejectedId) === String(r.id) ? {
|
|
2376
2376
|
cursor: "not-allowed",
|
|
2377
2377
|
boxShadow: "0 0 0 2px hsl(var(--destructive))"
|
|
2378
2378
|
} : void 0, ie = G ? (e) => {
|
|
@@ -2402,7 +2402,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2402
2402
|
rejectedId: null,
|
|
2403
2403
|
rejectedReason: null
|
|
2404
2404
|
});
|
|
2405
|
-
} : void 0, oe = Math.max(1, Math.round((t.end.getTime() - t.start.getTime()) /
|
|
2405
|
+
} : void 0, oe = Math.max(1, Math.round((t.end.getTime() - t.start.getTime()) / at)), se = (i + 1) * B + 300 > br && i * B > 300, ce = Ut === r.id && !W && !_n && !G ? /* @__PURE__ */ A("div", {
|
|
2406
2406
|
className: "absolute z-30 pointer-events-none rounded-md border bg-popover text-popover-foreground px-2.5 py-1.5 text-xs shadow-md whitespace-nowrap",
|
|
2407
2407
|
style: {
|
|
2408
2408
|
left: Math.max(f.left + 8, 4),
|
|
@@ -2433,18 +2433,18 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2433
2433
|
}) : /* @__PURE__ */ A("div", {
|
|
2434
2434
|
className: "text-muted-foreground",
|
|
2435
2435
|
children: [
|
|
2436
|
-
t.start.toLocaleDateString(
|
|
2436
|
+
t.start.toLocaleDateString(P, {
|
|
2437
2437
|
month: "short",
|
|
2438
2438
|
day: "numeric"
|
|
2439
2439
|
}),
|
|
2440
2440
|
" → ",
|
|
2441
|
-
t.end.toLocaleDateString(
|
|
2441
|
+
t.end.toLocaleDateString(P, {
|
|
2442
2442
|
month: "short",
|
|
2443
2443
|
day: "numeric"
|
|
2444
2444
|
}),
|
|
2445
2445
|
" · ",
|
|
2446
2446
|
oe,
|
|
2447
|
-
|
|
2447
|
+
N("gantt.tooltip.days"),
|
|
2448
2448
|
" · ",
|
|
2449
2449
|
Math.round(t.progress),
|
|
2450
2450
|
"%"
|
|
@@ -2454,7 +2454,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2454
2454
|
className: "text-muted-foreground",
|
|
2455
2455
|
style: { marginTop: 4 },
|
|
2456
2456
|
"data-testid": `gantt-tooltip-locked-${r.id}`,
|
|
2457
|
-
children: ["🚫 ",
|
|
2457
|
+
children: ["🚫 ", N("gantt.lockedHint")]
|
|
2458
2458
|
}) : null
|
|
2459
2459
|
]
|
|
2460
2460
|
}) : null;
|
|
@@ -2465,7 +2465,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2465
2465
|
children: ce
|
|
2466
2466
|
}, r.id);
|
|
2467
2467
|
if (t.isSummary) {
|
|
2468
|
-
let e = r.color || "#0d9488", n = le === "self" && r.hasOwnDates !== !1, i = !!R &&
|
|
2468
|
+
let e = r.color || "#0d9488", n = le === "self" && r.hasOwnDates !== !1, i = !!R && Be && !p, o = !!R && We && n && !p;
|
|
2469
2469
|
return /* @__PURE__ */ A("div", {
|
|
2470
2470
|
className: "relative border-b hover:bg-accent/50",
|
|
2471
2471
|
style: { height: B },
|
|
@@ -2473,7 +2473,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2473
2473
|
children: [
|
|
2474
2474
|
c,
|
|
2475
2475
|
/* @__PURE__ */ A("div", {
|
|
2476
|
-
className:
|
|
2476
|
+
className: me("gantt-bar-hover absolute rounded-sm border shadow-sm flex items-center px-2 select-none group", i && "cursor-grab active:cursor-grabbing", l && "ring-2 ring-primary z-10", _ && "ring-2 ring-primary", cr === r.id && "gantt-flash z-10"),
|
|
2477
2477
|
style: {
|
|
2478
2478
|
left: f.left,
|
|
2479
2479
|
width: f.width,
|
|
@@ -2494,7 +2494,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2494
2494
|
onPointerDown: (e) => {
|
|
2495
2495
|
if (e.button === 0) {
|
|
2496
2496
|
if (o) {
|
|
2497
|
-
let t =
|
|
2497
|
+
let t = Qe(e.clientX, e.currentTarget.getBoundingClientRect());
|
|
2498
2498
|
if (t !== "move") {
|
|
2499
2499
|
gn(r, t, e);
|
|
2500
2500
|
return;
|
|
@@ -2521,10 +2521,10 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2521
2521
|
borderBottomLeftRadius: "var(--radius-sm)"
|
|
2522
2522
|
}
|
|
2523
2523
|
}),
|
|
2524
|
-
o && f.width >= 14 && /* @__PURE__ */ A(
|
|
2524
|
+
o && f.width >= 14 && /* @__PURE__ */ A(Pe, { children: [/* @__PURE__ */ k("div", {
|
|
2525
2525
|
className: "gantt-resize-handle absolute left-0 top-0",
|
|
2526
2526
|
style: {
|
|
2527
|
-
width:
|
|
2527
|
+
width: Ze,
|
|
2528
2528
|
height: ii,
|
|
2529
2529
|
cursor: "ew-resize"
|
|
2530
2530
|
},
|
|
@@ -2536,7 +2536,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2536
2536
|
}), /* @__PURE__ */ k("div", {
|
|
2537
2537
|
className: "gantt-resize-handle absolute right-0 top-0",
|
|
2538
2538
|
style: {
|
|
2539
|
-
width:
|
|
2539
|
+
width: Ze,
|
|
2540
2540
|
height: ii,
|
|
2541
2541
|
cursor: "ew-resize"
|
|
2542
2542
|
},
|
|
@@ -2604,12 +2604,12 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2604
2604
|
},
|
|
2605
2605
|
"data-testid": `gantt-summary-drag-chip-${r.id}`,
|
|
2606
2606
|
children: [
|
|
2607
|
-
Zt(W).start.toLocaleDateString(
|
|
2607
|
+
Zt(W).start.toLocaleDateString(P, {
|
|
2608
2608
|
month: "numeric",
|
|
2609
2609
|
day: "numeric"
|
|
2610
2610
|
}),
|
|
2611
2611
|
" → ",
|
|
2612
|
-
Zt(W).end.toLocaleDateString(
|
|
2612
|
+
Zt(W).end.toLocaleDateString(P, {
|
|
2613
2613
|
month: "numeric",
|
|
2614
2614
|
day: "numeric"
|
|
2615
2615
|
})
|
|
@@ -2628,7 +2628,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2628
2628
|
children: [
|
|
2629
2629
|
c,
|
|
2630
2630
|
/* @__PURE__ */ k("div", {
|
|
2631
|
-
className:
|
|
2631
|
+
className: me("gantt-bar-hover absolute rotate-45 rounded-[2px] border shadow-sm select-none", h && "cursor-grab active:cursor-grabbing", l && "ring-2 ring-primary z-10", _ && "ring-2 ring-primary", cr === r.id && "gantt-flash z-10"),
|
|
2632
2632
|
style: {
|
|
2633
2633
|
left: f.left - e / 2,
|
|
2634
2634
|
top: (B - e) / 2,
|
|
@@ -2679,7 +2679,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2679
2679
|
}),
|
|
2680
2680
|
c,
|
|
2681
2681
|
/* @__PURE__ */ A("div", {
|
|
2682
|
-
className:
|
|
2682
|
+
className: me("gantt-bar-hover absolute rounded-sm bg-primary border shadow-sm flex items-center px-2 group select-none", te && "cursor-grab active:cursor-grabbing", l && "ring-2 ring-primary z-10", _ && "ring-2 ring-primary", cr === r.id && "gantt-flash z-10"),
|
|
2683
2683
|
style: {
|
|
2684
2684
|
left: f.left,
|
|
2685
2685
|
width: f.width,
|
|
@@ -2700,14 +2700,14 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2700
2700
|
onPointerMove: ie,
|
|
2701
2701
|
onPointerDown: te ? (e) => {
|
|
2702
2702
|
if (e.button !== 0) return;
|
|
2703
|
-
let t =
|
|
2703
|
+
let t = Qe(e.clientX, e.currentTarget.getBoundingClientRect()), n = t !== "move" && g ? t : h ? "move" : null;
|
|
2704
2704
|
n && gn(r, n, e);
|
|
2705
2705
|
} : void 0,
|
|
2706
2706
|
children: [
|
|
2707
|
-
g && f.width >= 14 && /* @__PURE__ */ A(
|
|
2707
|
+
g && f.width >= 14 && /* @__PURE__ */ A(Pe, { children: [/* @__PURE__ */ k("div", {
|
|
2708
2708
|
className: "gantt-resize-handle absolute left-0 top-0",
|
|
2709
2709
|
style: {
|
|
2710
|
-
width:
|
|
2710
|
+
width: Ze,
|
|
2711
2711
|
height: ii,
|
|
2712
2712
|
cursor: "ew-resize"
|
|
2713
2713
|
},
|
|
@@ -2719,7 +2719,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2719
2719
|
}), /* @__PURE__ */ k("div", {
|
|
2720
2720
|
className: "gantt-resize-handle absolute right-0 top-0",
|
|
2721
2721
|
style: {
|
|
2722
|
-
width:
|
|
2722
|
+
width: Ze,
|
|
2723
2723
|
height: ii,
|
|
2724
2724
|
cursor: "ew-resize"
|
|
2725
2725
|
},
|
|
@@ -2739,7 +2739,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2739
2739
|
}
|
|
2740
2740
|
}),
|
|
2741
2741
|
ee && f.width >= 30 && /* @__PURE__ */ k("div", {
|
|
2742
|
-
className:
|
|
2742
|
+
className: me("absolute bottom-0 h-1/2 w-4 -translate-x-1/2 cursor-col-resize flex items-end justify-center pb-px", _n?.taskId === r.id ? "opacity-100" : "opacity-0 group-hover:opacity-100 transition-opacity"),
|
|
2743
2743
|
style: { left: `${ue}%` },
|
|
2744
2744
|
"data-testid": `gantt-progress-handle-${r.id}`,
|
|
2745
2745
|
onPointerDown: (e) => {
|
|
@@ -2811,10 +2811,10 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2811
2811
|
}),
|
|
2812
2812
|
/* @__PURE__ */ k("span", {
|
|
2813
2813
|
className: "absolute inset-0 flex items-center px-2 text-[10px] text-white font-medium truncate opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none",
|
|
2814
|
-
children: l ? `${Zt(W).start.toLocaleDateString(
|
|
2814
|
+
children: l ? `${Zt(W).start.toLocaleDateString(P, {
|
|
2815
2815
|
month: "numeric",
|
|
2816
2816
|
day: "numeric"
|
|
2817
|
-
})} → ${Zt(W).end.toLocaleDateString(
|
|
2817
|
+
})} → ${Zt(W).end.toLocaleDateString(P, {
|
|
2818
2818
|
month: "numeric",
|
|
2819
2819
|
day: "numeric"
|
|
2820
2820
|
})}` : `${Math.round(ue)}%`
|
|
@@ -2882,7 +2882,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2882
2882
|
if (Math.max(t.sourceIndex, t.targetIndex) < Q.startIdx - 6 || n > Q.endIdx + 6) return null;
|
|
2883
2883
|
let r = pi(t);
|
|
2884
2884
|
if (!r) return null;
|
|
2885
|
-
let i = mi != null && (String(t.sourceId) === String(mi) || String(t.targetId) === String(mi)), a = _i?.criticalEdges.has(`${String(t.sourceId)}->${String(t.targetId)}`) ?? !1, o = a ? "gantt-link-arrow-critical" : i ? "gantt-link-arrow-active" : "gantt-link-arrow", s = !!(
|
|
2885
|
+
let i = mi != null && (String(t.sourceId) === String(mi) || String(t.targetId) === String(mi)), a = _i?.criticalEdges.has(`${String(t.sourceId)}->${String(t.targetId)}`) ?? !1, o = a ? "gantt-link-arrow-critical" : i ? "gantt-link-arrow-active" : "gantt-link-arrow", s = !!(Ye || z);
|
|
2886
2886
|
return /* @__PURE__ */ A(e.Fragment, { children: [/* @__PURE__ */ k("path", {
|
|
2887
2887
|
d: r,
|
|
2888
2888
|
fill: "none",
|
|
@@ -2925,7 +2925,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2925
2925
|
G && (() => {
|
|
2926
2926
|
let e = S.find((e) => String(e.id) === String(G.sourceId));
|
|
2927
2927
|
if (!e) return null;
|
|
2928
|
-
let t = G.targetId == null ? null : S.find((e) => String(e.id) === String(G.targetId)), n = (e) =>
|
|
2928
|
+
let t = G.targetId == null ? null : S.find((e) => String(e.id) === String(G.targetId)), n = (e) => N(`gantt.linkEnd.${e}`), r = t ? `${e.title} (${n(G.sourceEnd)}) → ${t.title} (${n(G.targetEnd ?? "start")})` : `${e.title} (${n(G.sourceEnd)})`;
|
|
2929
2929
|
return /* @__PURE__ */ k("div", {
|
|
2930
2930
|
className: "absolute z-30 pointer-events-none rounded-md border bg-popover text-popover-foreground px-2 py-1 text-[11px] font-medium shadow-md whitespace-nowrap",
|
|
2931
2931
|
style: {
|
|
@@ -3035,9 +3035,9 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
3035
3035
|
onClick: () => {
|
|
3036
3036
|
Dn(null), o(e);
|
|
3037
3037
|
},
|
|
3038
|
-
children:
|
|
3038
|
+
children: N("gantt.menu.view")
|
|
3039
3039
|
}),
|
|
3040
|
-
|
|
3040
|
+
ht && R && t && !t.isSummary && !e.locked && /* @__PURE__ */ k("button", {
|
|
3041
3041
|
type: "button",
|
|
3042
3042
|
role: "menuitem",
|
|
3043
3043
|
className: n,
|
|
@@ -3050,9 +3050,9 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
3050
3050
|
progress: String(e.progress)
|
|
3051
3051
|
});
|
|
3052
3052
|
},
|
|
3053
|
-
children:
|
|
3053
|
+
children: N("gantt.menu.edit")
|
|
3054
3054
|
}),
|
|
3055
|
-
z && t && !t.isMilestone && !e.locked && /* @__PURE__ */ A(
|
|
3055
|
+
z && t && !t.isMilestone && !e.locked && /* @__PURE__ */ A(Pe, { children: [/* @__PURE__ */ k("button", {
|
|
3056
3056
|
type: "button",
|
|
3057
3057
|
role: "menuitem",
|
|
3058
3058
|
className: n,
|
|
@@ -3066,7 +3066,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
3066
3066
|
relation: "pred"
|
|
3067
3067
|
});
|
|
3068
3068
|
},
|
|
3069
|
-
children:
|
|
3069
|
+
children: N("gantt.menu.addPredecessor")
|
|
3070
3070
|
}), /* @__PURE__ */ k("button", {
|
|
3071
3071
|
type: "button",
|
|
3072
3072
|
role: "menuitem",
|
|
@@ -3081,17 +3081,17 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
3081
3081
|
relation: "succ"
|
|
3082
3082
|
});
|
|
3083
3083
|
},
|
|
3084
|
-
children:
|
|
3084
|
+
children: N("gantt.menu.addSuccessor")
|
|
3085
3085
|
})] }),
|
|
3086
3086
|
Je && !e.locked && /* @__PURE__ */ k("button", {
|
|
3087
3087
|
type: "button",
|
|
3088
3088
|
role: "menuitem",
|
|
3089
|
-
className:
|
|
3089
|
+
className: me(n, "text-destructive"),
|
|
3090
3090
|
"data-testid": "gantt-context-menu-delete",
|
|
3091
3091
|
onClick: () => {
|
|
3092
3092
|
Dn(null), Je(e);
|
|
3093
3093
|
},
|
|
3094
|
-
children:
|
|
3094
|
+
children: N("gantt.menu.delete")
|
|
3095
3095
|
})
|
|
3096
3096
|
]
|
|
3097
3097
|
});
|
|
@@ -3126,30 +3126,30 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
3126
3126
|
i && /* @__PURE__ */ A("div", {
|
|
3127
3127
|
className: "px-3 py-1 text-xs text-muted-foreground",
|
|
3128
3128
|
"data-testid": "gantt-link-menu-locked",
|
|
3129
|
-
children: ["🚫 ",
|
|
3129
|
+
children: ["🚫 ", N("gantt.lockedHint")]
|
|
3130
3130
|
}),
|
|
3131
3131
|
z && he && r.map((r) => /* @__PURE__ */ A("button", {
|
|
3132
3132
|
type: "button",
|
|
3133
3133
|
role: "menuitemradio",
|
|
3134
3134
|
"aria-checked": kn.type === r,
|
|
3135
3135
|
disabled: i,
|
|
3136
|
-
className:
|
|
3136
|
+
className: me(n, kn.type === r && "font-semibold", i && "opacity-50 cursor-not-allowed hover:bg-transparent"),
|
|
3137
3137
|
"data-testid": `gantt-link-menu-type-${r}`,
|
|
3138
3138
|
onClick: () => {
|
|
3139
3139
|
i || (An(null), r !== kn.type && z(e, t, r));
|
|
3140
3140
|
},
|
|
3141
|
-
children: [kn.type === r ? "✓ " : "\xA0\xA0",
|
|
3141
|
+
children: [kn.type === r ? "✓ " : "\xA0\xA0", N(`gantt.linkType.${r}`)]
|
|
3142
3142
|
}, r)),
|
|
3143
|
-
|
|
3143
|
+
Ye && /* @__PURE__ */ A(Pe, { children: [/* @__PURE__ */ k("div", { className: "my-1 border-t" }), /* @__PURE__ */ k("button", {
|
|
3144
3144
|
type: "button",
|
|
3145
3145
|
role: "menuitem",
|
|
3146
3146
|
disabled: i,
|
|
3147
|
-
className:
|
|
3147
|
+
className: me(n, "text-destructive", i && "opacity-50 cursor-not-allowed hover:bg-transparent"),
|
|
3148
3148
|
"data-testid": "gantt-link-menu-remove",
|
|
3149
3149
|
onClick: () => {
|
|
3150
|
-
i || (An(null),
|
|
3150
|
+
i || (An(null), Ye(e, t));
|
|
3151
3151
|
},
|
|
3152
|
-
children:
|
|
3152
|
+
children: N("gantt.menu.removeDependency")
|
|
3153
3153
|
})] })
|
|
3154
3154
|
]
|
|
3155
3155
|
});
|
|
@@ -3174,7 +3174,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
3174
3174
|
children: [
|
|
3175
3175
|
/* @__PURE__ */ k("div", {
|
|
3176
3176
|
className: "px-3 py-1 text-xs text-muted-foreground",
|
|
3177
|
-
children: Mn.relation === "pred" ?
|
|
3177
|
+
children: Mn.relation === "pred" ? N("gantt.menu.addPredecessor") : N("gantt.menu.addSuccessor")
|
|
3178
3178
|
}),
|
|
3179
3179
|
/* @__PURE__ */ k("div", {
|
|
3180
3180
|
className: "px-2 pb-1",
|
|
@@ -3182,14 +3182,14 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
3182
3182
|
className: "border rounded px-2 py-1 text-sm w-full bg-background",
|
|
3183
3183
|
value: Pn,
|
|
3184
3184
|
onChange: (e) => Fn(e.target.value),
|
|
3185
|
-
placeholder:
|
|
3185
|
+
placeholder: N("gantt.menu.searchTasks"),
|
|
3186
3186
|
"data-testid": "gantt-dep-picker-search",
|
|
3187
3187
|
autoFocus: !0
|
|
3188
3188
|
})
|
|
3189
3189
|
}),
|
|
3190
3190
|
i.length === 0 ? /* @__PURE__ */ k("div", {
|
|
3191
3191
|
className: "px-3 py-1.5 text-muted-foreground",
|
|
3192
|
-
children:
|
|
3192
|
+
children: N("gantt.menu.noCandidates")
|
|
3193
3193
|
}) : i.map((t) => /* @__PURE__ */ k("button", {
|
|
3194
3194
|
type: "button",
|
|
3195
3195
|
role: "menuitem",
|
|
@@ -3217,13 +3217,13 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
3217
3217
|
/* @__PURE__ */ k("div", {
|
|
3218
3218
|
className: "text-sm font-semibold mb-1",
|
|
3219
3219
|
"data-testid": "gantt-autoschedule-title",
|
|
3220
|
-
children:
|
|
3220
|
+
children: N("gantt.autoScheduleDlg.title")
|
|
3221
3221
|
}),
|
|
3222
3222
|
/* @__PURE__ */ A("div", {
|
|
3223
3223
|
className: "text-sm text-muted-foreground mb-3",
|
|
3224
|
-
children: [
|
|
3224
|
+
children: [N("gantt.autoScheduleDlg.body", { count: yi.changes.length }), yi.skipped > 0 && /* @__PURE__ */ A(Pe, { children: [" ", /* @__PURE__ */ k("span", {
|
|
3225
3225
|
"data-testid": "gantt-autoschedule-skipped",
|
|
3226
|
-
children:
|
|
3226
|
+
children: N("gantt.autoScheduleDlg.skipped", { count: yi.skipped })
|
|
3227
3227
|
})] })]
|
|
3228
3228
|
}),
|
|
3229
3229
|
/* @__PURE__ */ A("div", {
|
|
@@ -3233,13 +3233,13 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
3233
3233
|
className: "px-3 py-1.5 text-sm rounded-md border hover:bg-accent outline-none",
|
|
3234
3234
|
"data-testid": "gantt-autoschedule-cancel",
|
|
3235
3235
|
onClick: () => bi(null),
|
|
3236
|
-
children:
|
|
3236
|
+
children: N("gantt.autoScheduleDlg.cancel")
|
|
3237
3237
|
}), /* @__PURE__ */ k("button", {
|
|
3238
3238
|
type: "button",
|
|
3239
3239
|
className: "px-3 py-1.5 text-sm rounded-md bg-primary text-primary-foreground hover:opacity-90 outline-none",
|
|
3240
3240
|
"data-testid": "gantt-autoschedule-confirm",
|
|
3241
3241
|
onClick: wi,
|
|
3242
|
-
children:
|
|
3242
|
+
children: N("gantt.autoScheduleDlg.confirm")
|
|
3243
3243
|
})]
|
|
3244
3244
|
})
|
|
3245
3245
|
]
|
|
@@ -3249,7 +3249,7 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
3249
3249
|
className: "fixed bottom-6 left-1/2 -translate-x-1/2 z-[60] rounded-md border bg-popover text-popover-foreground px-3 py-1.5 text-sm shadow-md",
|
|
3250
3250
|
role: "status",
|
|
3251
3251
|
"data-testid": "gantt-autoschedule-clean",
|
|
3252
|
-
children:
|
|
3252
|
+
children: N("gantt.autoScheduleDlg.none")
|
|
3253
3253
|
}),
|
|
3254
3254
|
an && /* @__PURE__ */ k("div", {
|
|
3255
3255
|
className: "fixed inset-0 z-[60] flex items-center justify-center bg-black/30",
|
|
@@ -3265,11 +3265,11 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
3265
3265
|
/* @__PURE__ */ k("div", {
|
|
3266
3266
|
className: "text-sm font-semibold mb-1",
|
|
3267
3267
|
"data-testid": "gantt-conflict-title",
|
|
3268
|
-
children:
|
|
3268
|
+
children: N("gantt.conflict.title")
|
|
3269
3269
|
}),
|
|
3270
3270
|
/* @__PURE__ */ k("div", {
|
|
3271
3271
|
className: "text-sm text-muted-foreground mb-3",
|
|
3272
|
-
children:
|
|
3272
|
+
children: N("gantt.conflict.body", { count: an.length })
|
|
3273
3273
|
}),
|
|
3274
3274
|
/* @__PURE__ */ A("div", {
|
|
3275
3275
|
className: "flex justify-end gap-2",
|
|
@@ -3278,13 +3278,13 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
3278
3278
|
className: "px-3 py-1.5 text-sm rounded-md border hover:bg-accent outline-none",
|
|
3279
3279
|
"data-testid": "gantt-conflict-cancel",
|
|
3280
3280
|
onClick: () => on(null),
|
|
3281
|
-
children:
|
|
3281
|
+
children: N("gantt.conflict.cancel")
|
|
3282
3282
|
}), /* @__PURE__ */ k("button", {
|
|
3283
3283
|
type: "button",
|
|
3284
3284
|
className: "px-3 py-1.5 text-sm rounded-md bg-primary text-primary-foreground hover:opacity-90 outline-none",
|
|
3285
3285
|
"data-testid": "gantt-conflict-confirm",
|
|
3286
3286
|
onClick: un,
|
|
3287
|
-
children:
|
|
3287
|
+
children: N("gantt.conflict.confirm")
|
|
3288
3288
|
})]
|
|
3289
3289
|
})
|
|
3290
3290
|
]
|
|
@@ -3295,10 +3295,10 @@ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
3295
3295
|
}
|
|
3296
3296
|
//#endregion
|
|
3297
3297
|
//#region src/workload.ts
|
|
3298
|
-
function
|
|
3298
|
+
function yt(e, t, n, r) {
|
|
3299
3299
|
return t.getTime() === e.getTime() ? e.getTime() >= n.getTime() && e.getTime() < r.getTime() : e.getTime() < r.getTime() && t.getTime() > n.getTime();
|
|
3300
3300
|
}
|
|
3301
|
-
function
|
|
3301
|
+
function B(e, t, n) {
|
|
3302
3302
|
let { assignee: r, effort: i, capacity: a = 1, unassignedLabel: o = "Unassigned" } = n, s = (e) => typeof a == "function" ? a(e) : a, c = (e) => {
|
|
3303
3303
|
let t = i ? i(e) : 1;
|
|
3304
3304
|
return Number.isFinite(t) && t > 0 ? t : 0;
|
|
@@ -3315,7 +3315,7 @@ function yt(e, t, n) {
|
|
|
3315
3315
|
for (let e of l.values()) {
|
|
3316
3316
|
let n = s(e.key), r = 0, i = 0, a = t.map((t) => {
|
|
3317
3317
|
let a = 0;
|
|
3318
|
-
for (let n of e.items)
|
|
3318
|
+
for (let n of e.items) yt(n.start, n.end, t.start, t.end) && (a += c(n));
|
|
3319
3319
|
a > r && (r = a);
|
|
3320
3320
|
let o = a > n + 1e-9;
|
|
3321
3321
|
return o && i++, {
|
|
@@ -3337,32 +3337,32 @@ function yt(e, t, n) {
|
|
|
3337
3337
|
}
|
|
3338
3338
|
//#endregion
|
|
3339
3339
|
//#region src/ResourceWorkload.tsx
|
|
3340
|
-
var
|
|
3340
|
+
var bt = {
|
|
3341
3341
|
day: 26,
|
|
3342
3342
|
week: 56,
|
|
3343
3343
|
month: 76,
|
|
3344
3344
|
quarter: 88,
|
|
3345
3345
|
year: 104
|
|
3346
|
-
},
|
|
3347
|
-
function
|
|
3346
|
+
}, xt = 48, St = 34, Ct = 180;
|
|
3347
|
+
function wt(e, t, n) {
|
|
3348
3348
|
return t === "day" ? String(e.getDate()) : t === "week" ? e.toLocaleDateString(n, {
|
|
3349
3349
|
month: "numeric",
|
|
3350
3350
|
day: "numeric"
|
|
3351
3351
|
}) : t === "month" ? e.toLocaleDateString(n, { month: "short" }) : t === "year" ? String(e.getFullYear()) : `Q${Math.floor(e.getMonth() / 3) + 1}`;
|
|
3352
3352
|
}
|
|
3353
|
-
function
|
|
3354
|
-
let { t: c, language: l } =
|
|
3353
|
+
function Tt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "day", unassignedLabel: o = "Unassigned", className: s }) {
|
|
3354
|
+
let { t: c, language: l } = Xe(), u = l || void 0, d = bt[a], f = e.useMemo(() => {
|
|
3355
3355
|
if (!t.length) return [];
|
|
3356
|
-
let e = new Date(Math.min(...t.map((e) => e.start.getTime()))), n = new Date(Math.max(...t.map((e) => e.end.getTime()))), r =
|
|
3356
|
+
let e = new Date(Math.min(...t.map((e) => e.start.getTime()))), n = new Date(Math.max(...t.map((e) => e.end.getTime()))), r = ct(e, a), i = ut(ct(n, a), 1, a), o = [], s = 0;
|
|
3357
3357
|
for (; r < i && s++ < 4e3;) {
|
|
3358
|
-
let e =
|
|
3358
|
+
let e = ut(r, 1, a);
|
|
3359
3359
|
o.push({
|
|
3360
3360
|
date: new Date(r),
|
|
3361
3361
|
col: {
|
|
3362
3362
|
start: new Date(r),
|
|
3363
3363
|
end: new Date(e)
|
|
3364
3364
|
},
|
|
3365
|
-
label:
|
|
3365
|
+
label: wt(r, a, u)
|
|
3366
3366
|
}), r = e;
|
|
3367
3367
|
}
|
|
3368
3368
|
return o;
|
|
@@ -3370,7 +3370,7 @@ function wt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
3370
3370
|
t,
|
|
3371
3371
|
a,
|
|
3372
3372
|
u
|
|
3373
|
-
]), p = e.useMemo(() =>
|
|
3373
|
+
]), p = e.useMemo(() => B(t, f.map((e) => e.col), {
|
|
3374
3374
|
assignee: n,
|
|
3375
3375
|
effort: r,
|
|
3376
3376
|
capacity: i,
|
|
@@ -3399,11 +3399,11 @@ function wt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
3399
3399
|
children: /* @__PURE__ */ A("div", {
|
|
3400
3400
|
style: {
|
|
3401
3401
|
display: "flex",
|
|
3402
|
-
minWidth:
|
|
3402
|
+
minWidth: Ct + h
|
|
3403
3403
|
},
|
|
3404
3404
|
children: [/* @__PURE__ */ A("div", {
|
|
3405
3405
|
style: {
|
|
3406
|
-
width:
|
|
3406
|
+
width: Ct,
|
|
3407
3407
|
flexShrink: 0
|
|
3408
3408
|
},
|
|
3409
3409
|
children: [/* @__PURE__ */ k("div", {
|
|
@@ -3420,7 +3420,7 @@ function wt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
3420
3420
|
}), p.map((e) => /* @__PURE__ */ A("div", {
|
|
3421
3421
|
"data-testid": `resource-row-${e.key}`,
|
|
3422
3422
|
style: {
|
|
3423
|
-
height:
|
|
3423
|
+
height: xt,
|
|
3424
3424
|
display: "flex",
|
|
3425
3425
|
flexDirection: "column",
|
|
3426
3426
|
justifyContent: "center",
|
|
@@ -3476,12 +3476,12 @@ function wt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
3476
3476
|
children: e.label
|
|
3477
3477
|
}, t))
|
|
3478
3478
|
}), p.map((e) => {
|
|
3479
|
-
let t =
|
|
3479
|
+
let t = St * (1 - Math.min(e.capacity / m, 1));
|
|
3480
3480
|
return /* @__PURE__ */ A("div", {
|
|
3481
3481
|
style: {
|
|
3482
3482
|
position: "relative",
|
|
3483
3483
|
display: "flex",
|
|
3484
|
-
height:
|
|
3484
|
+
height: xt,
|
|
3485
3485
|
borderBottom: "1px solid hsl(var(--border) / 0.5)"
|
|
3486
3486
|
},
|
|
3487
3487
|
children: [/* @__PURE__ */ k("div", {
|
|
@@ -3496,7 +3496,7 @@ function wt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
3496
3496
|
zIndex: 1
|
|
3497
3497
|
}
|
|
3498
3498
|
}), e.cells.map((t, n) => {
|
|
3499
|
-
let r = Math.max(t.load > 0 ? 2 : 0,
|
|
3499
|
+
let r = Math.max(t.load > 0 ? 2 : 0, St * Math.min(t.load / m, 1));
|
|
3500
3500
|
return /* @__PURE__ */ k("div", {
|
|
3501
3501
|
"data-testid": `resource-cell-${e.key}-${n}`,
|
|
3502
3502
|
"data-load": t.load,
|
|
@@ -3536,7 +3536,7 @@ function wt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
3536
3536
|
}
|
|
3537
3537
|
//#endregion
|
|
3538
3538
|
//#region src/QuickFilterBar.tsx
|
|
3539
|
-
var
|
|
3539
|
+
var Et = {
|
|
3540
3540
|
display: "flex",
|
|
3541
3541
|
flexWrap: "wrap",
|
|
3542
3542
|
alignItems: "center",
|
|
@@ -3545,7 +3545,7 @@ var Tt = {
|
|
|
3545
3545
|
borderBottom: "1px solid hsl(var(--border))",
|
|
3546
3546
|
background: "hsl(var(--background))",
|
|
3547
3547
|
fontSize: 13
|
|
3548
|
-
},
|
|
3548
|
+
}, V = {
|
|
3549
3549
|
display: "inline-flex",
|
|
3550
3550
|
alignItems: "center",
|
|
3551
3551
|
gap: 6,
|
|
@@ -3558,7 +3558,7 @@ var Tt = {
|
|
|
3558
3558
|
cursor: "pointer",
|
|
3559
3559
|
whiteSpace: "nowrap",
|
|
3560
3560
|
lineHeight: "28px"
|
|
3561
|
-
},
|
|
3561
|
+
}, Dt = {
|
|
3562
3562
|
position: "absolute",
|
|
3563
3563
|
top: "calc(100% + 4px)",
|
|
3564
3564
|
left: 0,
|
|
@@ -3572,7 +3572,7 @@ var Tt = {
|
|
|
3572
3572
|
background: "hsl(var(--popover, var(--background)))",
|
|
3573
3573
|
color: "hsl(var(--popover-foreground, var(--foreground)))",
|
|
3574
3574
|
boxShadow: "0 8px 24px rgba(0,0,0,0.18)"
|
|
3575
|
-
},
|
|
3575
|
+
}, Ot = {
|
|
3576
3576
|
display: "flex",
|
|
3577
3577
|
alignItems: "center",
|
|
3578
3578
|
gap: 8,
|
|
@@ -3581,7 +3581,7 @@ var Tt = {
|
|
|
3581
3581
|
cursor: "pointer",
|
|
3582
3582
|
userSelect: "none"
|
|
3583
3583
|
};
|
|
3584
|
-
function
|
|
3584
|
+
function kt({ checked: e }) {
|
|
3585
3585
|
return /* @__PURE__ */ k("span", {
|
|
3586
3586
|
"aria-hidden": !0,
|
|
3587
3587
|
style: {
|
|
@@ -3601,7 +3601,7 @@ function Ot({ checked: e }) {
|
|
|
3601
3601
|
children: e ? "✓" : ""
|
|
3602
3602
|
});
|
|
3603
3603
|
}
|
|
3604
|
-
function
|
|
3604
|
+
function At({ filter: e, selected: t, onChange: n, labels: i }) {
|
|
3605
3605
|
let [s, c] = o(!1), l = a(null);
|
|
3606
3606
|
r(() => {
|
|
3607
3607
|
if (!s) return;
|
|
@@ -3627,7 +3627,7 @@ function kt({ filter: e, selected: t, onChange: n, labels: i }) {
|
|
|
3627
3627
|
children: [/* @__PURE__ */ A("button", {
|
|
3628
3628
|
type: "button",
|
|
3629
3629
|
style: {
|
|
3630
|
-
...
|
|
3630
|
+
...V,
|
|
3631
3631
|
borderColor: d > 0 ? "hsl(var(--primary))" : "hsl(var(--border))",
|
|
3632
3632
|
color: d > 0 ? "hsl(var(--primary))" : "hsl(var(--foreground))"
|
|
3633
3633
|
},
|
|
@@ -3645,26 +3645,26 @@ function kt({ filter: e, selected: t, onChange: n, labels: i }) {
|
|
|
3645
3645
|
})]
|
|
3646
3646
|
}), s && /* @__PURE__ */ k("div", {
|
|
3647
3647
|
role: "listbox",
|
|
3648
|
-
style:
|
|
3648
|
+
style: Dt,
|
|
3649
3649
|
"data-testid": `quick-filter-panel-${e.field}`,
|
|
3650
3650
|
children: e.options.length === 0 ? /* @__PURE__ */ k("div", {
|
|
3651
3651
|
style: {
|
|
3652
|
-
...
|
|
3652
|
+
...Ot,
|
|
3653
3653
|
cursor: "default",
|
|
3654
3654
|
opacity: .6
|
|
3655
3655
|
},
|
|
3656
3656
|
children: i.empty
|
|
3657
|
-
}) : /* @__PURE__ */ A(
|
|
3657
|
+
}) : /* @__PURE__ */ A(Pe, { children: [
|
|
3658
3658
|
/* @__PURE__ */ A("div", {
|
|
3659
3659
|
role: "option",
|
|
3660
3660
|
"aria-selected": f,
|
|
3661
3661
|
style: {
|
|
3662
|
-
...
|
|
3662
|
+
...Ot,
|
|
3663
3663
|
fontWeight: 600
|
|
3664
3664
|
},
|
|
3665
3665
|
"data-testid": `quick-filter-all-${e.field}`,
|
|
3666
3666
|
onClick: () => m(),
|
|
3667
|
-
children: [/* @__PURE__ */ k(
|
|
3667
|
+
children: [/* @__PURE__ */ k(kt, { checked: f }), /* @__PURE__ */ k("span", { children: i.all })]
|
|
3668
3668
|
}),
|
|
3669
3669
|
/* @__PURE__ */ k("div", { style: {
|
|
3670
3670
|
height: 1,
|
|
@@ -3677,27 +3677,27 @@ function kt({ filter: e, selected: t, onChange: n, labels: i }) {
|
|
|
3677
3677
|
role: "option",
|
|
3678
3678
|
"aria-selected": n,
|
|
3679
3679
|
style: {
|
|
3680
|
-
...
|
|
3680
|
+
...Ot,
|
|
3681
3681
|
background: n ? "hsl(var(--accent, var(--muted)))" : "transparent"
|
|
3682
3682
|
},
|
|
3683
3683
|
"data-testid": `quick-filter-option-${e.field}-${t.value}`,
|
|
3684
3684
|
onClick: () => p(t.value),
|
|
3685
|
-
children: [/* @__PURE__ */ k(
|
|
3685
|
+
children: [/* @__PURE__ */ k(kt, { checked: n }), /* @__PURE__ */ k("span", { children: t.label })]
|
|
3686
3686
|
}, t.value);
|
|
3687
3687
|
})
|
|
3688
3688
|
] })
|
|
3689
3689
|
})]
|
|
3690
3690
|
});
|
|
3691
3691
|
}
|
|
3692
|
-
var
|
|
3692
|
+
var jt = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, totalCount: a, labels: o, className: s }) => {
|
|
3693
3693
|
if (!e.length) return null;
|
|
3694
3694
|
let c = o?.all ?? "All", l = o?.empty ?? "No options", u = o?.clear ?? "Clear", d = e.some((e) => (t[e.field]?.length ?? 0) > 0);
|
|
3695
3695
|
return /* @__PURE__ */ A("div", {
|
|
3696
|
-
style:
|
|
3696
|
+
style: Et,
|
|
3697
3697
|
className: s,
|
|
3698
3698
|
"data-testid": "quick-filter-bar",
|
|
3699
3699
|
children: [
|
|
3700
|
-
e.map((e) => /* @__PURE__ */ k(
|
|
3700
|
+
e.map((e) => /* @__PURE__ */ k(At, {
|
|
3701
3701
|
filter: e,
|
|
3702
3702
|
selected: t[e.field] ?? [],
|
|
3703
3703
|
onChange: (t) => n(e.field, t),
|
|
@@ -3709,7 +3709,7 @@ var At = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, total
|
|
|
3709
3709
|
d && /* @__PURE__ */ k("button", {
|
|
3710
3710
|
type: "button",
|
|
3711
3711
|
style: {
|
|
3712
|
-
...
|
|
3712
|
+
...V,
|
|
3713
3713
|
height: 28,
|
|
3714
3714
|
color: "hsl(var(--muted-foreground))"
|
|
3715
3715
|
},
|
|
@@ -3730,7 +3730,7 @@ var At = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, total
|
|
|
3730
3730
|
};
|
|
3731
3731
|
//#endregion
|
|
3732
3732
|
//#region src/ObjectGantt.tsx
|
|
3733
|
-
function
|
|
3733
|
+
function Mt(e) {
|
|
3734
3734
|
if (e == null) return;
|
|
3735
3735
|
let t = String(e).toLowerCase().trim();
|
|
3736
3736
|
if (t === "milestone") return "milestone";
|
|
@@ -3738,7 +3738,7 @@ function jt(e) {
|
|
|
3738
3738
|
if (t === "summary" || t === "project" || t === "phase") return "summary";
|
|
3739
3739
|
if (t === "task") return "task";
|
|
3740
3740
|
}
|
|
3741
|
-
var
|
|
3741
|
+
var Nt = {
|
|
3742
3742
|
fs: "fs",
|
|
3743
3743
|
ss: "ss",
|
|
3744
3744
|
ff: "ff",
|
|
@@ -3751,7 +3751,7 @@ var Mt = {
|
|
|
3751
3751
|
end_to_end: "ff",
|
|
3752
3752
|
start_to_end: "sf"
|
|
3753
3753
|
};
|
|
3754
|
-
function
|
|
3754
|
+
function Pt(e) {
|
|
3755
3755
|
if (e == null || e === "") return [];
|
|
3756
3756
|
if (typeof e == "string") return e.split(",").map((e) => e.trim()).filter(Boolean);
|
|
3757
3757
|
if (typeof e == "number") return [e];
|
|
@@ -3761,7 +3761,7 @@ function Nt(e) {
|
|
|
3761
3761
|
if (typeof n == "object") {
|
|
3762
3762
|
let e = n.id ?? n._id ?? n.task ?? n.target;
|
|
3763
3763
|
if (e == null || e === "") continue;
|
|
3764
|
-
let r =
|
|
3764
|
+
let r = Nt[String(n.type ?? "").toLowerCase().replace(/-/g, "_")];
|
|
3765
3765
|
t.push(r ? {
|
|
3766
3766
|
id: e,
|
|
3767
3767
|
type: r
|
|
@@ -3770,7 +3770,7 @@ function Nt(e) {
|
|
|
3770
3770
|
}
|
|
3771
3771
|
return t;
|
|
3772
3772
|
}
|
|
3773
|
-
function
|
|
3773
|
+
function H(e) {
|
|
3774
3774
|
return e.data ? e.data : e.staticData ? {
|
|
3775
3775
|
provider: "value",
|
|
3776
3776
|
items: e.staticData
|
|
@@ -3779,15 +3779,6 @@ function Pt(e) {
|
|
|
3779
3779
|
object: e.objectName
|
|
3780
3780
|
} : null;
|
|
3781
3781
|
}
|
|
3782
|
-
function H(e) {
|
|
3783
|
-
if (e) {
|
|
3784
|
-
if (typeof e == "string") {
|
|
3785
|
-
let t = e.split(" "), n = t[0], r = t[1]?.toLowerCase() === "desc" ? "desc" : "asc";
|
|
3786
|
-
return { [n]: r };
|
|
3787
|
-
}
|
|
3788
|
-
if (Array.isArray(e)) return e.reduce((e, t) => (t.field && t.order && (e[t.field] = t.order), e), {});
|
|
3789
|
-
}
|
|
3790
|
-
}
|
|
3791
3782
|
function Ft(e) {
|
|
3792
3783
|
let t = e instanceof Error ? e.message : String(e ?? ""), n = t.indexOf("{");
|
|
3793
3784
|
if (n >= 0) try {
|
|
@@ -3822,6 +3813,7 @@ function It(e) {
|
|
|
3822
3813
|
capacity: e.capacity,
|
|
3823
3814
|
quickFilters: e.quickFilters,
|
|
3824
3815
|
autoZoomToFilter: e.autoZoomToFilter,
|
|
3816
|
+
viewMode: e.viewMode,
|
|
3825
3817
|
timeSegments: e.timeSegments,
|
|
3826
3818
|
interactions: e.interactions,
|
|
3827
3819
|
exportFileName: e.exportFileName,
|
|
@@ -3829,45 +3821,45 @@ function It(e) {
|
|
|
3829
3821
|
dependencyTypes: e.dependencyTypes
|
|
3830
3822
|
}, t;
|
|
3831
3823
|
if (e.gantt && (t = e.gantt), t) {
|
|
3832
|
-
let e =
|
|
3824
|
+
let e = ne.safeParse(t);
|
|
3833
3825
|
return e.success || console.warn("[ObjectGantt] Invalid gantt configuration:", e.error.format()), t;
|
|
3834
3826
|
}
|
|
3835
3827
|
return null;
|
|
3836
3828
|
}
|
|
3837
|
-
var Lt = ({ schema: e, dataSource: s, className:
|
|
3838
|
-
let [b,
|
|
3839
|
-
|
|
3840
|
-
}, [w]),
|
|
3829
|
+
var Lt = ({ schema: e, dataSource: s, className: p, onTaskClick: g, onRowClick: ee, onBeforeTaskUpdate: ne, ...y }) => {
|
|
3830
|
+
let [b, xe] = o([]), [Se, Ce] = o(!0), [we, Te] = o(null), [C, Ee] = o(null), { currency: De } = re(), Oe = v(), { t: w } = Xe(), ke = t((e) => {
|
|
3831
|
+
te.error(w("gantt.writeFailed"), { description: Ft(e) ?? void 0 });
|
|
3832
|
+
}, [w]), Ae = H(e), T = i(() => Ae, [JSON.stringify(Ae)]), E = It(e), je = T?.provider === "value", Me = n(m)?.apiFetch, D = i(() => f(T, s ?? null, { fetch: Me }), [
|
|
3841
3833
|
T,
|
|
3842
3834
|
s,
|
|
3843
|
-
|
|
3844
|
-
]), O = T?.provider === "object" ? T.object : e.objectName ?? "", [
|
|
3835
|
+
Me
|
|
3836
|
+
]), O = T?.provider === "object" ? T.object : e.objectName ?? "", [Ne, Pe] = o(!1), j = a(0), M = t(async ({ silent: t = !1 } = {}) => {
|
|
3845
3837
|
let n = ++j.current, r = () => j.current === n;
|
|
3846
3838
|
try {
|
|
3847
|
-
if (t ?
|
|
3848
|
-
r() &&
|
|
3839
|
+
if (t ? Pe(!0) : Ce(!0), y.data && Array.isArray(y.data)) {
|
|
3840
|
+
r() && xe(y.data);
|
|
3849
3841
|
return;
|
|
3850
3842
|
}
|
|
3851
|
-
if (
|
|
3852
|
-
r() &&
|
|
3843
|
+
if (je && T?.provider === "value") {
|
|
3844
|
+
r() && xe(T.items);
|
|
3853
3845
|
return;
|
|
3854
3846
|
}
|
|
3855
3847
|
if (!D || typeof D.find != "function") throw Error("DataSource required for object/api providers");
|
|
3856
3848
|
let n = c(C?.fields), i = await D.find(O, {
|
|
3857
3849
|
$filter: e.filter,
|
|
3858
|
-
$orderby:
|
|
3850
|
+
$orderby: l(e.sort),
|
|
3859
3851
|
...n.length > 0 ? { $expand: n } : {}
|
|
3860
3852
|
});
|
|
3861
|
-
r() &&
|
|
3853
|
+
r() && xe(u(i));
|
|
3862
3854
|
} catch (e) {
|
|
3863
|
-
t ? console.error("[ObjectGantt] Failed to refresh data:", e) : r() &&
|
|
3855
|
+
t ? console.error("[ObjectGantt] Failed to refresh data:", e) : r() && Te(e);
|
|
3864
3856
|
} finally {
|
|
3865
|
-
t ?
|
|
3857
|
+
t ? Pe(!1) : Ce(!1);
|
|
3866
3858
|
}
|
|
3867
3859
|
}, [
|
|
3868
3860
|
D,
|
|
3869
3861
|
O,
|
|
3870
|
-
|
|
3862
|
+
je,
|
|
3871
3863
|
T,
|
|
3872
3864
|
e.filter,
|
|
3873
3865
|
e.sort,
|
|
@@ -3876,11 +3868,11 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
3876
3868
|
r(() => {
|
|
3877
3869
|
M();
|
|
3878
3870
|
}, [M]), r(() => {
|
|
3879
|
-
!
|
|
3871
|
+
!je && D && (async () => {
|
|
3880
3872
|
try {
|
|
3881
3873
|
if (!D || !O) return;
|
|
3882
3874
|
let e = await D.getObjectSchema(O);
|
|
3883
|
-
|
|
3875
|
+
Ee(e);
|
|
3884
3876
|
} catch (e) {
|
|
3885
3877
|
console.error("Failed to fetch object schema:", e);
|
|
3886
3878
|
}
|
|
@@ -3888,12 +3880,12 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
3888
3880
|
}, [
|
|
3889
3881
|
O,
|
|
3890
3882
|
D,
|
|
3891
|
-
|
|
3883
|
+
je,
|
|
3892
3884
|
T
|
|
3893
3885
|
]);
|
|
3894
3886
|
let N = i(() => {
|
|
3895
3887
|
if (!E || !b.length) return [];
|
|
3896
|
-
let { startDateField: e, endDateField: t, titleField: n, progressField: r, dependenciesField: i, colorField: a, borderColorField: o, parentField: s, typeField: c, lockField: l, tooltipFields:
|
|
3888
|
+
let { startDateField: e, endDateField: t, titleField: n, progressField: r, dependenciesField: i, colorField: a, borderColorField: o, parentField: s, typeField: c, lockField: l, tooltipFields: u, baselineStartField: f, baselineEndField: p, quickFilters: m } = E, h = C?.fields ?? {}, g = /* @__PURE__ */ new Map();
|
|
3897
3889
|
for (let e of m ?? []) {
|
|
3898
3890
|
if (!e?.field || !Array.isArray(e.options) || !e.options.length) continue;
|
|
3899
3891
|
let t = /* @__PURE__ */ new Map();
|
|
@@ -3916,11 +3908,11 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
3916
3908
|
e?.contact && [e.contact.first_name, e.contact.last_name].filter(Boolean).join(" ")
|
|
3917
3909
|
];
|
|
3918
3910
|
for (let e of t) if (e != null && String(e).trim() !== "") return String(e);
|
|
3919
|
-
return
|
|
3920
|
-
},
|
|
3911
|
+
return d(C, e);
|
|
3912
|
+
}, ne = (e, t) => {
|
|
3921
3913
|
if (t) return t;
|
|
3922
3914
|
let n = h[e] ?? h[e.split(".")[0]];
|
|
3923
|
-
return n?.label ? n.label :
|
|
3915
|
+
return n?.label ? n.label : be(e);
|
|
3924
3916
|
}, v = (e, t) => {
|
|
3925
3917
|
if (e == null || e === "") return "—";
|
|
3926
3918
|
let n = h[t] ?? h[t.split(".")[0]], r = n?.type, i = n?.options;
|
|
@@ -3933,18 +3925,18 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
3933
3925
|
if (n != null) return n;
|
|
3934
3926
|
}
|
|
3935
3927
|
if (r == null && typeof e == "string") {
|
|
3936
|
-
if (/^\d{4}-\d{2}-\d{2}$/.test(e)) return
|
|
3937
|
-
if (/^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}/.test(e) && !isNaN(new Date(e).getTime())) return
|
|
3928
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(e)) return ge(e, void 0, { locale: Oe });
|
|
3929
|
+
if (/^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}/.test(e) && !isNaN(new Date(e).getTime())) return _e(e, { locale: Oe });
|
|
3938
3930
|
}
|
|
3939
3931
|
switch (r) {
|
|
3940
|
-
case "date": return
|
|
3941
|
-
case "datetime": return
|
|
3932
|
+
case "date": return ge(e, void 0, { locale: Oe });
|
|
3933
|
+
case "datetime": return _e(e, { locale: Oe });
|
|
3942
3934
|
case "number":
|
|
3943
3935
|
case "integer":
|
|
3944
3936
|
case "float":
|
|
3945
|
-
case "decimal": return
|
|
3946
|
-
case "currency": return
|
|
3947
|
-
case "percent": return
|
|
3937
|
+
case "decimal": return ve(Number(e), void 0, Oe);
|
|
3938
|
+
case "currency": return he(Number(e), _(n, De), Oe);
|
|
3939
|
+
case "percent": return ye(Number(e), void 0, Oe);
|
|
3948
3940
|
case "boolean":
|
|
3949
3941
|
case "checkbox": return e ? "Yes" : "No";
|
|
3950
3942
|
default:
|
|
@@ -3966,14 +3958,14 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
3966
3958
|
return String(e);
|
|
3967
3959
|
}
|
|
3968
3960
|
}, re = (e) => {
|
|
3969
|
-
if (!
|
|
3961
|
+
if (!u || !u.length) return;
|
|
3970
3962
|
let t = [];
|
|
3971
|
-
for (let n of
|
|
3963
|
+
for (let n of u) {
|
|
3972
3964
|
let r = typeof n == "string" ? n : n?.field;
|
|
3973
3965
|
if (!r) continue;
|
|
3974
3966
|
let i = typeof n == "object" ? n.label : void 0, a = ee(e, r);
|
|
3975
3967
|
a == null || a === "" || Array.isArray(a) && a.length === 0 || t.push({
|
|
3976
|
-
label:
|
|
3968
|
+
label: ne(r, i),
|
|
3977
3969
|
value: v(a, r)
|
|
3978
3970
|
});
|
|
3979
3971
|
}
|
|
@@ -3984,11 +3976,11 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
3984
3976
|
if (!ae) {
|
|
3985
3977
|
let e = n.status ?? n.state ?? n.priority ?? n.severity;
|
|
3986
3978
|
if (e != null && e !== "") {
|
|
3987
|
-
let t =
|
|
3988
|
-
t && (ae =
|
|
3979
|
+
let t = x(void 0, e);
|
|
3980
|
+
t && (ae = S(t));
|
|
3989
3981
|
}
|
|
3990
3982
|
}
|
|
3991
|
-
let oe = o ? n[o] : void 0, se = oe != null && oe !== "" ?
|
|
3983
|
+
let oe = o ? n[o] : void 0, se = oe != null && oe !== "" ? S(String(oe), String(oe)) : void 0;
|
|
3992
3984
|
return {
|
|
3993
3985
|
id: n.id || n._id || `task-${u}`,
|
|
3994
3986
|
title: _,
|
|
@@ -3996,9 +3988,9 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
3996
3988
|
end: m ? new Date(m) : /* @__PURE__ */ new Date(),
|
|
3997
3989
|
hasOwnDates: !!(d && m),
|
|
3998
3990
|
progress: Math.min(100, Math.max(0, v || 0)),
|
|
3999
|
-
dependencies:
|
|
3991
|
+
dependencies: Pt(ie),
|
|
4000
3992
|
parent: s ? n[s] ?? null : void 0,
|
|
4001
|
-
type: c ?
|
|
3993
|
+
type: c ? Mt(n[c]) : void 0,
|
|
4002
3994
|
locked: l ? !!n[l] : void 0,
|
|
4003
3995
|
color: ae,
|
|
4004
3996
|
borderColor: se,
|
|
@@ -4012,9 +4004,9 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4012
4004
|
b,
|
|
4013
4005
|
E,
|
|
4014
4006
|
C,
|
|
4015
|
-
|
|
4016
|
-
|
|
4017
|
-
]),
|
|
4007
|
+
Oe,
|
|
4008
|
+
De
|
|
4009
|
+
]), Fe = i(() => {
|
|
4018
4010
|
let e = E?.groupByField;
|
|
4019
4011
|
if (!e) return;
|
|
4020
4012
|
let t = C?.fields ?? {}, n = (e, t) => {
|
|
@@ -4044,7 +4036,7 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4044
4036
|
label: r(i)
|
|
4045
4037
|
};
|
|
4046
4038
|
};
|
|
4047
|
-
}, [E?.groupByField, C]),
|
|
4039
|
+
}, [E?.groupByField, C]), P = i(() => {
|
|
4048
4040
|
let e = E?.assigneeField;
|
|
4049
4041
|
if (!e) return;
|
|
4050
4042
|
let t = C?.fields ?? {}, n = (e, t) => {
|
|
@@ -4074,19 +4066,19 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4074
4066
|
label: r(i)
|
|
4075
4067
|
};
|
|
4076
4068
|
};
|
|
4077
|
-
}, [E?.assigneeField, C]),
|
|
4069
|
+
}, [E?.assigneeField, C]), Ie = i(() => {
|
|
4078
4070
|
let e = E?.effortField;
|
|
4079
4071
|
if (e) return (t) => {
|
|
4080
4072
|
let n = t.data?.[e], r = Number(n);
|
|
4081
4073
|
return Number.isFinite(r) && r > 0 ? r : 1;
|
|
4082
4074
|
};
|
|
4083
|
-
}, [E?.effortField]),
|
|
4075
|
+
}, [E?.effortField]), Le = i(() => {
|
|
4084
4076
|
let t = e.skipWeekends, n = e.holidays;
|
|
4085
4077
|
if (!(!t && (!n || n.length === 0))) return {
|
|
4086
4078
|
skipWeekends: !!t,
|
|
4087
4079
|
holidays: n && n.length ? new Set(n) : void 0
|
|
4088
4080
|
};
|
|
4089
|
-
}, [e]),
|
|
4081
|
+
}, [e]), Re = i(() => R(E?.timeSegments), [E?.timeSegments]), F = t((e, t) => {
|
|
4090
4082
|
if (!e || !t) return null;
|
|
4091
4083
|
let n = e;
|
|
4092
4084
|
for (let e of t.split(".")) {
|
|
@@ -4099,19 +4091,19 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4099
4091
|
return String(e.id ?? e._id ?? e.value ?? e.name ?? "");
|
|
4100
4092
|
}
|
|
4101
4093
|
return String(n);
|
|
4102
|
-
}, []),
|
|
4094
|
+
}, []), I = E?.quickFilters, [ze, L] = o({});
|
|
4103
4095
|
r(() => {
|
|
4104
|
-
if (!
|
|
4096
|
+
if (!I?.length || !s || typeof s.find != "function") return;
|
|
4105
4097
|
let e = C?.fields ?? {}, t = !1;
|
|
4106
4098
|
return (async () => {
|
|
4107
4099
|
let n = {};
|
|
4108
|
-
for (let t of
|
|
4100
|
+
for (let t of I) {
|
|
4109
4101
|
if (t.options) continue;
|
|
4110
4102
|
let r = e[t.field] ?? e[t.field.split(".")[0]], i = r?.type;
|
|
4111
4103
|
if (i !== "lookup" && i !== "master_detail") continue;
|
|
4112
4104
|
let a = r?.reference_to ?? r?.reference ?? r?.referenceTo;
|
|
4113
4105
|
if (a) try {
|
|
4114
|
-
let e = await s.find(a, { $top: 1e3 }), r =
|
|
4106
|
+
let e = await s.find(a, { $top: 1e3 }), r = u(e);
|
|
4115
4107
|
n[t.field] = r.map((e) => ({
|
|
4116
4108
|
value: String(e.id ?? e._id ?? e.value ?? ""),
|
|
4117
4109
|
label: String(e.name ?? e.label ?? e.title ?? e.id ?? e._id ?? "")
|
|
@@ -4120,7 +4112,7 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4120
4112
|
console.warn(`[ObjectGantt] Failed to load quick-filter options for "${t.field}":`, e);
|
|
4121
4113
|
}
|
|
4122
4114
|
}
|
|
4123
|
-
t ||
|
|
4115
|
+
t || L((e) => ({
|
|
4124
4116
|
...e,
|
|
4125
4117
|
...n
|
|
4126
4118
|
}));
|
|
@@ -4128,15 +4120,15 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4128
4120
|
t = !0;
|
|
4129
4121
|
};
|
|
4130
4122
|
}, [
|
|
4131
|
-
JSON.stringify(
|
|
4123
|
+
JSON.stringify(I),
|
|
4132
4124
|
s,
|
|
4133
4125
|
C
|
|
4134
4126
|
]);
|
|
4135
|
-
let
|
|
4136
|
-
if (!
|
|
4127
|
+
let Be = i(() => {
|
|
4128
|
+
if (!I?.length) return [];
|
|
4137
4129
|
let e = C?.fields ?? {};
|
|
4138
|
-
return
|
|
4139
|
-
let n = e[t.field] ?? e[t.field.split(".")[0]], r = t.label ?? n?.label ??
|
|
4130
|
+
return I.map((t) => {
|
|
4131
|
+
let n = e[t.field] ?? e[t.field.split(".")[0]], r = t.label ?? n?.label ?? be(t.field), i;
|
|
4140
4132
|
if (t.options?.length) i = t.options.map((e) => typeof e == "object" ? {
|
|
4141
4133
|
value: String(e.value),
|
|
4142
4134
|
label: String(e.label ?? e.value)
|
|
@@ -4148,11 +4140,11 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4148
4140
|
value: String(e.value ?? e),
|
|
4149
4141
|
label: String(e.label ?? e.value ?? e)
|
|
4150
4142
|
}));
|
|
4151
|
-
else if (
|
|
4143
|
+
else if (ze[t.field]?.length) i = ze[t.field];
|
|
4152
4144
|
else {
|
|
4153
4145
|
let e = /* @__PURE__ */ new Map();
|
|
4154
4146
|
for (let n of b) {
|
|
4155
|
-
let r =
|
|
4147
|
+
let r = F(n, t.field);
|
|
4156
4148
|
if (r != null && !e.has(r)) {
|
|
4157
4149
|
let i = n;
|
|
4158
4150
|
for (let e of t.field.split(".")) i = i?.[e];
|
|
@@ -4172,15 +4164,15 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4172
4164
|
};
|
|
4173
4165
|
});
|
|
4174
4166
|
}, [
|
|
4175
|
-
|
|
4167
|
+
I,
|
|
4176
4168
|
C,
|
|
4177
|
-
|
|
4169
|
+
ze,
|
|
4178
4170
|
b,
|
|
4179
|
-
|
|
4180
|
-
]),
|
|
4181
|
-
if (!
|
|
4171
|
+
F
|
|
4172
|
+
]), Ve = e.persistLayout === !1 ? void 0 : `${e.objectName || (T?.provider === "object" ? T.object : "") || "gantt"}:${e.viewName || "default"}`, He = Ve ? `gantt-layout:${Ve}:filters` : null, [Ue, We] = o(() => {
|
|
4173
|
+
if (!He || typeof window > "u") return {};
|
|
4182
4174
|
try {
|
|
4183
|
-
let e = JSON.parse(window.localStorage.getItem(
|
|
4175
|
+
let e = JSON.parse(window.localStorage.getItem(He) || "null");
|
|
4184
4176
|
if (!e || typeof e != "object" || Array.isArray(e)) return {};
|
|
4185
4177
|
let t = {};
|
|
4186
4178
|
for (let [n, r] of Object.entries(e)) Array.isArray(r) && (t[n] = r.filter((e) => typeof e == "string"));
|
|
@@ -4188,31 +4180,31 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4188
4180
|
} catch {
|
|
4189
4181
|
return {};
|
|
4190
4182
|
}
|
|
4191
|
-
}),
|
|
4192
|
-
if (!(!
|
|
4193
|
-
window.localStorage.setItem(
|
|
4183
|
+
}), Ge = t(() => {
|
|
4184
|
+
if (!(!He || typeof window > "u")) try {
|
|
4185
|
+
window.localStorage.setItem(He, JSON.stringify(Ue));
|
|
4194
4186
|
} catch {}
|
|
4195
|
-
}, [
|
|
4196
|
-
|
|
4187
|
+
}, [He, Ue]), Ke = t((e, t) => {
|
|
4188
|
+
We((n) => ({
|
|
4197
4189
|
...n,
|
|
4198
4190
|
[e]: t
|
|
4199
4191
|
}));
|
|
4200
|
-
}, []), qe = t(() =>
|
|
4192
|
+
}, []), qe = t(() => We({}), []), Je = t((e) => !!E?.objectField && !String(e?.[E.objectField] ?? "").trim(), [E?.objectField]), z = t((e) => {
|
|
4201
4193
|
let t = (E?.objectField ? String(e[E.objectField] ?? "").trim() : "") || O, n = e.id ?? e._id;
|
|
4202
4194
|
if (!t || n == null) return null;
|
|
4203
|
-
let r = O ?
|
|
4195
|
+
let r = O ? ae(O, n) : null;
|
|
4204
4196
|
return {
|
|
4205
4197
|
objectName: t,
|
|
4206
4198
|
recordId: n,
|
|
4207
4199
|
href: !O || t === O ? r : r?.replace(`/${O}/record/`, `/${t}/record/`) ?? null
|
|
4208
4200
|
};
|
|
4209
|
-
}, [E?.objectField, O]),
|
|
4210
|
-
let e = Object.entries(
|
|
4201
|
+
}, [E?.objectField, O]), Ye = i(() => {
|
|
4202
|
+
let e = Object.entries(Ue).filter(([, e]) => e.length > 0);
|
|
4211
4203
|
if (!e.length) return N;
|
|
4212
4204
|
let t = new Map(N.map((e) => [String(e.id), e])), n = /* @__PURE__ */ new Set();
|
|
4213
4205
|
for (let r of N) {
|
|
4214
4206
|
if (!e.every(([e, t]) => {
|
|
4215
|
-
let n =
|
|
4207
|
+
let n = F(r.data, e);
|
|
4216
4208
|
return n != null && t.includes(n);
|
|
4217
4209
|
})) continue;
|
|
4218
4210
|
let i = r;
|
|
@@ -4221,9 +4213,9 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4221
4213
|
return N.filter((e) => n.has(String(e.id)));
|
|
4222
4214
|
}, [
|
|
4223
4215
|
N,
|
|
4224
|
-
|
|
4225
|
-
|
|
4226
|
-
]),
|
|
4216
|
+
Ue,
|
|
4217
|
+
F
|
|
4218
|
+
]), Ze = i(() => {
|
|
4227
4219
|
if (E?.autoZoomToFilter !== !1 || !N.length) return null;
|
|
4228
4220
|
let e = N[0].start.getTime(), t = N[0].end.getTime();
|
|
4229
4221
|
for (let n of N) e = Math.min(e, n.start.getTime()), t = Math.max(t, n.end.getTime());
|
|
@@ -4231,66 +4223,66 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4231
4223
|
start: new Date(e),
|
|
4232
4224
|
end: new Date(t)
|
|
4233
4225
|
};
|
|
4234
|
-
}, [N, E?.autoZoomToFilter]),
|
|
4226
|
+
}, [N, E?.autoZoomToFilter]), Qe = e.navigation ?? {
|
|
4235
4227
|
mode: "drawer",
|
|
4236
4228
|
width: "min(960px, 60vw)"
|
|
4237
|
-
},
|
|
4238
|
-
navigation:
|
|
4229
|
+
}, $e = Qe.mode === "drawer" || Qe.mode === "modal" || Qe.mode === "split" || Qe.mode === "popover", et = h({
|
|
4230
|
+
navigation: Qe,
|
|
4239
4231
|
objectName: e.objectName,
|
|
4240
|
-
onRowClick:
|
|
4241
|
-
}), [
|
|
4232
|
+
onRowClick: $e ? void 0 : ee
|
|
4233
|
+
}), [tt, nt] = o(null), rt = et.isOverlay && et.isOpen ? et.selectedRecord : null;
|
|
4242
4234
|
r(() => {
|
|
4243
|
-
if (!
|
|
4244
|
-
|
|
4235
|
+
if (!rt) {
|
|
4236
|
+
nt(null);
|
|
4245
4237
|
return;
|
|
4246
4238
|
}
|
|
4247
|
-
let e =
|
|
4239
|
+
let e = z(rt);
|
|
4248
4240
|
if (!e) {
|
|
4249
|
-
|
|
4241
|
+
nt(null);
|
|
4250
4242
|
return;
|
|
4251
4243
|
}
|
|
4252
4244
|
let { objectName: t, recordId: n } = e;
|
|
4253
4245
|
if (T?.provider !== "api" && t === O || !s || typeof s.findOne != "function") {
|
|
4254
|
-
|
|
4246
|
+
nt(null);
|
|
4255
4247
|
return;
|
|
4256
4248
|
}
|
|
4257
4249
|
let r = `${t}:${n}`, i = !1;
|
|
4258
4250
|
return (async () => {
|
|
4259
4251
|
try {
|
|
4260
4252
|
let [e, a] = await Promise.all([s.findOne(t, String(n)), typeof s.getObjectSchema == "function" ? s.getObjectSchema(t).catch(() => null) : Promise.resolve(null)]);
|
|
4261
|
-
i ||
|
|
4253
|
+
i || nt(e ? {
|
|
4262
4254
|
key: r,
|
|
4263
4255
|
record: e,
|
|
4264
4256
|
schema: a
|
|
4265
4257
|
} : null);
|
|
4266
4258
|
} catch (e) {
|
|
4267
|
-
console.error("[ObjectGantt] Failed to fetch drawer record, falling back to row payload:", e), i ||
|
|
4259
|
+
console.error("[ObjectGantt] Failed to fetch drawer record, falling back to row payload:", e), i || nt(null);
|
|
4268
4260
|
}
|
|
4269
4261
|
})(), () => {
|
|
4270
4262
|
i = !0;
|
|
4271
4263
|
};
|
|
4272
4264
|
}, [
|
|
4273
|
-
|
|
4274
|
-
|
|
4265
|
+
rt,
|
|
4266
|
+
z,
|
|
4275
4267
|
T?.provider,
|
|
4276
4268
|
O,
|
|
4277
4269
|
s
|
|
4278
4270
|
]);
|
|
4279
|
-
let
|
|
4271
|
+
let it = t(async (e, t) => {
|
|
4280
4272
|
if (!E || !D || typeof D.update != "function") return;
|
|
4281
4273
|
let { startDateField: n, endDateField: r, titleField: i, progressField: a } = E, o = {};
|
|
4282
4274
|
if (t.start instanceof Date && (o[n] = t.start.toISOString()), t.end instanceof Date && (o[r] = t.end.toISOString()), typeof t.title == "string" && i && (o[i] = t.title), typeof t.progress == "number" && a && (o[a] = t.progress), Object.keys(o).length === 0) return;
|
|
4283
4275
|
let s = e.data?.id ?? e.data?._id ?? e.id;
|
|
4284
4276
|
if (s == null) return;
|
|
4285
4277
|
let c = b;
|
|
4286
|
-
|
|
4278
|
+
xe((e) => e.map((e) => String(e.id ?? e._id) === String(s) ? {
|
|
4287
4279
|
...e,
|
|
4288
4280
|
...o
|
|
4289
4281
|
} : e));
|
|
4290
4282
|
try {
|
|
4291
4283
|
await D.update(O, String(s), o), M({ silent: !0 });
|
|
4292
4284
|
} catch (e) {
|
|
4293
|
-
console.error("[ObjectGantt] Failed to persist task update:", e),
|
|
4285
|
+
console.error("[ObjectGantt] Failed to persist task update:", e), xe(c), ke(e);
|
|
4294
4286
|
}
|
|
4295
4287
|
}, [
|
|
4296
4288
|
E,
|
|
@@ -4298,25 +4290,25 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4298
4290
|
O,
|
|
4299
4291
|
b,
|
|
4300
4292
|
M,
|
|
4301
|
-
|
|
4302
|
-
]),
|
|
4293
|
+
ke
|
|
4294
|
+
]), at = (e, t) => {
|
|
4303
4295
|
let n = t.some((e) => typeof e == "object" && e.type && e.type !== "fs");
|
|
4304
4296
|
return !n && typeof e == "string" ? t.map((e) => String(typeof e == "object" ? e.id : e)).join(",") : n ? t.map((e) => typeof e == "object" ? e.type && e.type !== "fs" ? {
|
|
4305
4297
|
id: e.id,
|
|
4306
4298
|
type: e.type
|
|
4307
4299
|
} : e.id : e) : t.map((e) => typeof e == "object" ? e.id : e);
|
|
4308
|
-
},
|
|
4300
|
+
}, ot = t(async (e, t, n) => {
|
|
4309
4301
|
let r = E?.dependenciesField;
|
|
4310
4302
|
if (!r || !D || typeof D.update != "function") return;
|
|
4311
|
-
let i =
|
|
4312
|
-
|
|
4303
|
+
let i = at(t, n), a = b;
|
|
4304
|
+
xe((t) => t.map((t) => String(t.id ?? t._id) === String(e) ? {
|
|
4313
4305
|
...t,
|
|
4314
4306
|
[r]: i
|
|
4315
4307
|
} : t));
|
|
4316
4308
|
try {
|
|
4317
4309
|
await D.update(O, String(e), { [r]: i }), M({ silent: !0 });
|
|
4318
4310
|
} catch (e) {
|
|
4319
|
-
console.error("[ObjectGantt] Failed to persist dependency:", e),
|
|
4311
|
+
console.error("[ObjectGantt] Failed to persist dependency:", e), xe(a), ke(e);
|
|
4320
4312
|
}
|
|
4321
4313
|
}, [
|
|
4322
4314
|
E,
|
|
@@ -4324,69 +4316,69 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4324
4316
|
O,
|
|
4325
4317
|
b,
|
|
4326
4318
|
M,
|
|
4327
|
-
|
|
4328
|
-
]),
|
|
4319
|
+
ke
|
|
4320
|
+
]), st = t(async (e, t, n = "fs") => {
|
|
4329
4321
|
let r = e.data?.id ?? e.data?._id ?? e.id, i = t.data?.id ?? t.data?._id ?? t.id;
|
|
4330
4322
|
if (r == null || i == null) return;
|
|
4331
4323
|
let a = E?.dependenciesField;
|
|
4332
4324
|
if (!a) return;
|
|
4333
|
-
let o = b.find((e) => String(e.id ?? e._id) === String(i))?.[a], s =
|
|
4325
|
+
let o = b.find((e) => String(e.id ?? e._id) === String(i))?.[a], s = Pt(o), c = (e) => String(typeof e == "object" ? e.id : e), l = s.find((e) => c(e) === String(r)), u = l && typeof l == "object" ? l.type ?? "fs" : "fs";
|
|
4334
4326
|
if (l && u === n) return;
|
|
4335
4327
|
let d = n === "fs" ? r : {
|
|
4336
4328
|
id: r,
|
|
4337
4329
|
type: n
|
|
4338
4330
|
}, f = l ? s.map((e) => c(e) === String(r) ? d : e) : [...s, d];
|
|
4339
|
-
await
|
|
4331
|
+
await ot(i, o, f);
|
|
4340
4332
|
}, [
|
|
4341
4333
|
E,
|
|
4342
4334
|
b,
|
|
4343
|
-
|
|
4344
|
-
]),
|
|
4335
|
+
ot
|
|
4336
|
+
]), ct = t(async (e, t) => {
|
|
4345
4337
|
let n = e.data?.id ?? e.data?._id ?? e.id, r = t.data?.id ?? t.data?._id ?? t.id;
|
|
4346
4338
|
if (n == null || r == null) return;
|
|
4347
4339
|
let i = E?.dependenciesField;
|
|
4348
4340
|
if (!i) return;
|
|
4349
|
-
let a = b.find((e) => String(e.id ?? e._id) === String(r))?.[i], o =
|
|
4350
|
-
c.length !== o.length && await
|
|
4341
|
+
let a = b.find((e) => String(e.id ?? e._id) === String(r))?.[i], o = Pt(a), s = (e) => String(typeof e == "object" ? e.id : e), c = o.filter((e) => s(e) !== String(n));
|
|
4342
|
+
c.length !== o.length && await ot(r, a, c);
|
|
4351
4343
|
}, [
|
|
4352
4344
|
E,
|
|
4353
4345
|
b,
|
|
4354
|
-
|
|
4355
|
-
]), [
|
|
4356
|
-
|
|
4357
|
-
}, []),
|
|
4358
|
-
if (!
|
|
4346
|
+
ot
|
|
4347
|
+
]), [lt, ut] = o(null), [dt, ft] = o(!1), pt = t((e) => {
|
|
4348
|
+
ut(e);
|
|
4349
|
+
}, []), mt = t(async () => {
|
|
4350
|
+
if (!lt) return;
|
|
4359
4351
|
if (!D?.delete) {
|
|
4360
|
-
|
|
4352
|
+
ut(null);
|
|
4361
4353
|
return;
|
|
4362
4354
|
}
|
|
4363
|
-
let e =
|
|
4355
|
+
let e = lt.data?.id ?? lt.data?._id ?? lt.id;
|
|
4364
4356
|
if (e == null) {
|
|
4365
|
-
|
|
4357
|
+
ut(null);
|
|
4366
4358
|
return;
|
|
4367
4359
|
}
|
|
4368
|
-
|
|
4360
|
+
ft(!0);
|
|
4369
4361
|
let t = b;
|
|
4370
|
-
|
|
4362
|
+
xe((t) => t.filter((t) => String(t.id ?? t._id) !== String(e)));
|
|
4371
4363
|
try {
|
|
4372
4364
|
if (await D.delete(O, String(e)) === !1) throw Error(w("gantt.writeFailed"));
|
|
4373
|
-
|
|
4365
|
+
ut(null), M({ silent: !0 });
|
|
4374
4366
|
} catch (e) {
|
|
4375
|
-
console.error("[ObjectGantt] Failed to delete:", e),
|
|
4367
|
+
console.error("[ObjectGantt] Failed to delete:", e), xe(t), ut(null), ke(e);
|
|
4376
4368
|
} finally {
|
|
4377
|
-
|
|
4369
|
+
ft(!1);
|
|
4378
4370
|
}
|
|
4379
4371
|
}, [
|
|
4380
|
-
|
|
4372
|
+
lt,
|
|
4381
4373
|
D,
|
|
4382
4374
|
O,
|
|
4383
4375
|
b,
|
|
4384
4376
|
M,
|
|
4385
|
-
|
|
4377
|
+
ke,
|
|
4386
4378
|
w
|
|
4387
4379
|
]);
|
|
4388
|
-
return
|
|
4389
|
-
className:
|
|
4380
|
+
return Se ? /* @__PURE__ */ k("div", {
|
|
4381
|
+
className: p,
|
|
4390
4382
|
children: /* @__PURE__ */ k("div", {
|
|
4391
4383
|
className: "flex items-center justify-center h-96",
|
|
4392
4384
|
children: /* @__PURE__ */ k("div", {
|
|
@@ -4394,24 +4386,24 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4394
4386
|
children: "Loading Gantt chart..."
|
|
4395
4387
|
})
|
|
4396
4388
|
})
|
|
4397
|
-
}) :
|
|
4398
|
-
className:
|
|
4389
|
+
}) : we ? /* @__PURE__ */ k("div", {
|
|
4390
|
+
className: p,
|
|
4399
4391
|
children: /* @__PURE__ */ k("div", {
|
|
4400
4392
|
className: "flex items-center justify-center h-96",
|
|
4401
4393
|
children: /* @__PURE__ */ A("div", {
|
|
4402
4394
|
className: "text-destructive",
|
|
4403
|
-
children: ["Error: ",
|
|
4395
|
+
children: ["Error: ", we.message]
|
|
4404
4396
|
})
|
|
4405
4397
|
})
|
|
4406
4398
|
}) : E ? /* @__PURE__ */ A("div", {
|
|
4407
|
-
className:
|
|
4399
|
+
className: me("flex h-full min-h-0 flex-col", p),
|
|
4408
4400
|
children: [
|
|
4409
|
-
|
|
4410
|
-
filters:
|
|
4411
|
-
value:
|
|
4412
|
-
onChange:
|
|
4401
|
+
Be.length > 0 && /* @__PURE__ */ k(jt, {
|
|
4402
|
+
filters: Be,
|
|
4403
|
+
value: Ue,
|
|
4404
|
+
onChange: Ke,
|
|
4413
4405
|
onClear: qe,
|
|
4414
|
-
resultCount:
|
|
4406
|
+
resultCount: Ye.length,
|
|
4415
4407
|
totalCount: N.length,
|
|
4416
4408
|
labels: {
|
|
4417
4409
|
all: w("gantt.quickFilter.all"),
|
|
@@ -4422,61 +4414,62 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4422
4414
|
}),
|
|
4423
4415
|
/* @__PURE__ */ k("div", {
|
|
4424
4416
|
className: "flex-1 min-h-[420px]",
|
|
4425
|
-
children: E?.resourceView &&
|
|
4426
|
-
tasks:
|
|
4427
|
-
assignee:
|
|
4428
|
-
effort:
|
|
4417
|
+
children: E?.resourceView && P ? /* @__PURE__ */ k(Tt, {
|
|
4418
|
+
tasks: Ye,
|
|
4419
|
+
assignee: P,
|
|
4420
|
+
effort: Ie,
|
|
4429
4421
|
capacity: E?.capacity ?? 1,
|
|
4430
|
-
viewMode:
|
|
4431
|
-
}) : /* @__PURE__ */ k(
|
|
4432
|
-
tasks:
|
|
4433
|
-
|
|
4434
|
-
|
|
4422
|
+
viewMode: E?.viewMode || "day"
|
|
4423
|
+
}) : /* @__PURE__ */ k(vt, {
|
|
4424
|
+
tasks: Ye,
|
|
4425
|
+
viewMode: E?.viewMode,
|
|
4426
|
+
startDate: Ze?.start,
|
|
4427
|
+
endDate: Ze?.end,
|
|
4435
4428
|
onTaskClick: (e) => {
|
|
4436
|
-
|
|
4429
|
+
Je(e.data) || et.handleClick(e.data), g?.(e.data);
|
|
4437
4430
|
},
|
|
4438
|
-
onTaskUpdate:
|
|
4439
|
-
onTaskDelete:
|
|
4440
|
-
onDependencyCreate: E?.dependenciesField ?
|
|
4441
|
-
onDependencyDelete: E?.dependenciesField ?
|
|
4431
|
+
onTaskUpdate: it,
|
|
4432
|
+
onTaskDelete: pt,
|
|
4433
|
+
onDependencyCreate: E?.dependenciesField ? st : void 0,
|
|
4434
|
+
onDependencyDelete: E?.dependenciesField ? ct : void 0,
|
|
4442
4435
|
markers: e.markers,
|
|
4443
4436
|
autoSchedule: !!E?.dependenciesField,
|
|
4444
4437
|
rescheduleOnConflict: !!E?.dependenciesField,
|
|
4445
4438
|
criticalPathDefault: !!e.criticalPath,
|
|
4446
|
-
workingCalendar:
|
|
4447
|
-
shiftSegments:
|
|
4439
|
+
workingCalendar: Le,
|
|
4440
|
+
shiftSegments: Re,
|
|
4448
4441
|
showBaselines: e.showBaselines !== !1,
|
|
4449
4442
|
readOnly: !!e.readOnly,
|
|
4450
4443
|
mobileReadOnly: e.mobileReadOnly !== !1,
|
|
4451
|
-
persistLayoutKey:
|
|
4452
|
-
onLayoutChange:
|
|
4453
|
-
groupBy:
|
|
4444
|
+
persistLayoutKey: Ve,
|
|
4445
|
+
onLayoutChange: He ? Ge : void 0,
|
|
4446
|
+
groupBy: Fe,
|
|
4454
4447
|
defaultCollapsedDepth: E?.defaultCollapsedDepth,
|
|
4455
4448
|
summaryExtent: E?.summaryExtent,
|
|
4456
4449
|
interactions: E?.interactions,
|
|
4457
4450
|
dependencyTypes: E?.dependencyTypes,
|
|
4458
4451
|
timeZone: E?.timeZone,
|
|
4459
|
-
onBeforeTaskUpdate:
|
|
4452
|
+
onBeforeTaskUpdate: ne,
|
|
4460
4453
|
exportFileName: String(E?.exportFileName ?? e.label ?? C?.label ?? e.objectName ?? "") || void 0,
|
|
4461
4454
|
inlineEdit: !0,
|
|
4462
4455
|
onRefresh: (T?.provider === "object" || T?.provider === "api") && typeof D?.find == "function" ? () => M({ silent: !0 }) : void 0,
|
|
4463
|
-
refreshing:
|
|
4456
|
+
refreshing: Ne
|
|
4464
4457
|
})
|
|
4465
4458
|
}),
|
|
4466
|
-
|
|
4467
|
-
let t =
|
|
4468
|
-
if (!n ||
|
|
4469
|
-
let { objectName: r, recordId: i } = n, a = n.href ?? void 0, o = E?.titleField ? String(t[E.titleField] ?? w("gantt.drawer.fallbackTitle")) : w("gantt.drawer.fallbackTitle"), c = !!e.readOnly || (E?.lockField ? !!t[E.lockField] : !1), l =
|
|
4470
|
-
return /* @__PURE__ */ k(
|
|
4459
|
+
et.isOverlay && et.isOpen && et.selectedRecord && (() => {
|
|
4460
|
+
let t = et.selectedRecord, n = z(t);
|
|
4461
|
+
if (!n || Je(t)) return null;
|
|
4462
|
+
let { objectName: r, recordId: i } = n, a = n.href ?? void 0, o = E?.titleField ? String(t[E.titleField] ?? w("gantt.drawer.fallbackTitle")) : w("gantt.drawer.fallbackTitle"), c = !!e.readOnly || (E?.lockField ? !!t[E.lockField] : !1), l = tt?.key === `${r}:${i}` ? tt : null, u = l?.record ?? t, d = l?.schema ?? (r === O ? C : void 0), f = l && s ? s : D;
|
|
4463
|
+
return /* @__PURE__ */ k(ie, {
|
|
4471
4464
|
open: !0,
|
|
4472
|
-
onClose:
|
|
4465
|
+
onClose: et.close,
|
|
4473
4466
|
title: o,
|
|
4474
4467
|
record: u,
|
|
4475
4468
|
objectName: r,
|
|
4476
4469
|
recordId: i,
|
|
4477
4470
|
dataSource: f ?? void 0,
|
|
4478
4471
|
objectSchema: d,
|
|
4479
|
-
width:
|
|
4472
|
+
width: et.width,
|
|
4480
4473
|
fullPageHref: a,
|
|
4481
4474
|
onFieldSave: c ? void 0 : async (e, t) => {
|
|
4482
4475
|
if (f?.update) {
|
|
@@ -4486,13 +4479,13 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4486
4479
|
let t = Ft(e);
|
|
4487
4480
|
throw t ? Error(t) : e;
|
|
4488
4481
|
}
|
|
4489
|
-
l &&
|
|
4482
|
+
l && nt((n) => n && n.key === l.key ? {
|
|
4490
4483
|
...n,
|
|
4491
4484
|
record: {
|
|
4492
4485
|
...n.record,
|
|
4493
4486
|
[e]: t
|
|
4494
4487
|
}
|
|
4495
|
-
} : n),
|
|
4488
|
+
} : n), xe((n) => n.map((n) => String(n.id ?? n._id) === String(i) ? {
|
|
4496
4489
|
...n,
|
|
4497
4490
|
[e]: t
|
|
4498
4491
|
} : n)), M({ silent: !0 });
|
|
@@ -4503,34 +4496,34 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4503
4496
|
try {
|
|
4504
4497
|
if (await D.delete(r, String(i)) === !1) throw Error(w("gantt.writeFailed"));
|
|
4505
4498
|
} catch (e) {
|
|
4506
|
-
throw
|
|
4499
|
+
throw ke(e), e;
|
|
4507
4500
|
}
|
|
4508
|
-
|
|
4501
|
+
xe((e) => e.filter((e) => String(e.id ?? e._id) !== String(i)));
|
|
4509
4502
|
}
|
|
4510
4503
|
}
|
|
4511
4504
|
});
|
|
4512
4505
|
})(),
|
|
4513
|
-
/* @__PURE__ */ k(
|
|
4514
|
-
open: !!
|
|
4506
|
+
/* @__PURE__ */ k(oe, {
|
|
4507
|
+
open: !!lt,
|
|
4515
4508
|
onOpenChange: (e) => {
|
|
4516
|
-
!e && !
|
|
4509
|
+
!e && !dt && ut(null);
|
|
4517
4510
|
},
|
|
4518
|
-
children: /* @__PURE__ */ A(
|
|
4519
|
-
disabled:
|
|
4511
|
+
children: /* @__PURE__ */ A(le, { children: [/* @__PURE__ */ A(fe, { children: [/* @__PURE__ */ k(pe, { children: w("gantt.delete.title") }), /* @__PURE__ */ k(ue, { children: lt ? w("gantt.delete.body", { title: lt.title }) : null })] }), /* @__PURE__ */ A(de, { children: [/* @__PURE__ */ k(ce, {
|
|
4512
|
+
disabled: dt,
|
|
4520
4513
|
children: w("gantt.delete.cancel")
|
|
4521
|
-
}), /* @__PURE__ */ k(
|
|
4514
|
+
}), /* @__PURE__ */ k(se, {
|
|
4522
4515
|
onClick: (e) => {
|
|
4523
|
-
e.preventDefault(),
|
|
4516
|
+
e.preventDefault(), mt();
|
|
4524
4517
|
},
|
|
4525
|
-
disabled:
|
|
4518
|
+
disabled: dt,
|
|
4526
4519
|
"data-testid": "gantt-delete-confirm",
|
|
4527
4520
|
className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
4528
|
-
children: w(
|
|
4521
|
+
children: w(dt ? "gantt.delete.deleting" : "gantt.delete.confirm")
|
|
4529
4522
|
})] })] })
|
|
4530
4523
|
})
|
|
4531
4524
|
]
|
|
4532
4525
|
}) : /* @__PURE__ */ k("div", {
|
|
4533
|
-
className:
|
|
4526
|
+
className: p,
|
|
4534
4527
|
children: /* @__PURE__ */ k("div", {
|
|
4535
4528
|
className: "flex items-center justify-center h-96",
|
|
4536
4529
|
children: /* @__PURE__ */ k("div", {
|
|
@@ -4543,8 +4536,8 @@ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick:
|
|
|
4543
4536
|
filter: !0,
|
|
4544
4537
|
sort: !0
|
|
4545
4538
|
}, zt = ({ schema: e }) => {
|
|
4546
|
-
let { dataSource: t } =
|
|
4547
|
-
return /* @__PURE__ */ k(
|
|
4539
|
+
let { dataSource: t } = ee() || {};
|
|
4540
|
+
return /* @__PURE__ */ k(p, {
|
|
4548
4541
|
schema: e,
|
|
4549
4542
|
mapping: Rt,
|
|
4550
4543
|
dataSource: t,
|
|
@@ -4588,4 +4581,4 @@ s.register("object-gantt", zt, {
|
|
|
4588
4581
|
}]
|
|
4589
4582
|
});
|
|
4590
4583
|
//#endregion
|
|
4591
|
-
export {
|
|
4584
|
+
export { vt as GanttView, Lt as ObjectGantt, zt as ObjectGanttRenderer, jt as QuickFilterBar, Tt as ResourceWorkload, Je as bandAt, B as computeWorkload, Pt as normalizeDependencies, R as normalizeShiftSegments, Mt as normalizeTaskType, Ke as parseHHMM, qe as shiftDayStart };
|