@object-ui/plugin-gantt 11.2.0 → 11.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/ObjectGantt.d.ts.map +1 -1
- package/dist/index.js +443 -449
- package/dist/index.umd.cjs +1 -1
- package/package.json +13 -13
package/dist/index.js
CHANGED
|
@@ -1,77 +1,77 @@
|
|
|
1
1
|
import * as e from "react";
|
|
2
2
|
import { useCallback as t, useEffect as n, useMemo as r, useRef as i, useState as a } from "react";
|
|
3
|
-
import { ComponentRegistry as o, buildExpandFields as s, extractRecords as c } from "@object-ui/core";
|
|
4
|
-
import { useNavigationOverlay as
|
|
5
|
-
import { GanttConfigSchema as
|
|
6
|
-
import { resolveFieldCurrency as
|
|
7
|
-
import { RecordDetailDrawer as
|
|
8
|
-
import { AlertDialog as
|
|
9
|
-
import { formatCurrency as
|
|
10
|
-
import { Activity as
|
|
11
|
-
import { Fragment as
|
|
3
|
+
import { ComponentRegistry as o, buildExpandFields as s, extractRecords as c, getRecordDisplayName as l } from "@object-ui/core";
|
|
4
|
+
import { useNavigationOverlay as u, useObjectTranslation as d, useSchemaContext as f } from "@object-ui/react";
|
|
5
|
+
import { GanttConfigSchema as p } from "@objectstack/spec/ui";
|
|
6
|
+
import { resolveFieldCurrency as m, useLocalization as h } from "@object-ui/i18n";
|
|
7
|
+
import { RecordDetailDrawer as g, deriveRecordPageHref as ee } from "@object-ui/plugin-detail";
|
|
8
|
+
import { AlertDialog as _, AlertDialogAction as v, AlertDialogCancel as te, AlertDialogContent as ne, AlertDialogDescription as re, AlertDialogFooter as ie, AlertDialogHeader as ae, AlertDialogTitle as oe, Button as y, cn as b, useResizeObserver as se } from "@object-ui/components";
|
|
9
|
+
import { formatCurrency as ce, formatDate as le, formatDateTime as x, formatNumber as ue, formatPercent as S, getSemanticColorName as de, getSemanticHex as fe, humanizeLabel as pe } from "@object-ui/fields";
|
|
10
|
+
import { Activity as me, ChevronDown as he, ChevronLeft as ge, ChevronRight as C, Crosshair as _e, Download as ve, FileDown as ye, Lock as w, Maximize2 as T, Minimize2 as be, PanelLeft as xe, PanelLeftClose as Se, Redo2 as Ce, Save as we, Undo2 as Te, Wand2 as Ee, ZoomIn as De, ZoomOut as Oe } from "lucide-react";
|
|
11
|
+
import { Fragment as ke, jsx as E, jsxs as D } from "react/jsx-runtime";
|
|
12
12
|
//#region src/scheduling.ts
|
|
13
|
-
var
|
|
14
|
-
function
|
|
13
|
+
var Ae = 1e3 * 60 * 60 * 24, je = (e) => e.toISOString().slice(0, 10);
|
|
14
|
+
function O(e, t) {
|
|
15
15
|
if (t.skipWeekends) {
|
|
16
16
|
let t = e.getUTCDay();
|
|
17
17
|
if (t === 0 || t === 6) return !1;
|
|
18
18
|
}
|
|
19
|
-
return !(t.holidays && t.holidays.has(
|
|
19
|
+
return !(t.holidays && t.holidays.has(je(e)));
|
|
20
20
|
}
|
|
21
|
-
function
|
|
21
|
+
function k(e) {
|
|
22
22
|
let t = new Date(e);
|
|
23
23
|
return t.setUTCHours(0, 0, 0, 0), t;
|
|
24
24
|
}
|
|
25
|
-
function
|
|
26
|
-
let n =
|
|
27
|
-
for (; !
|
|
25
|
+
function A(e, t) {
|
|
26
|
+
let n = k(e);
|
|
27
|
+
for (; !O(n, t);) n = new Date(n.getTime() + Ae);
|
|
28
28
|
return n.getTime();
|
|
29
29
|
}
|
|
30
|
-
function
|
|
30
|
+
function Me(e, t, n) {
|
|
31
31
|
if (t <= e) return 0;
|
|
32
|
-
let r = 0, i =
|
|
33
|
-
for (; i.getTime() < a;)
|
|
32
|
+
let r = 0, i = k(e), a = k(t).getTime();
|
|
33
|
+
for (; i.getTime() < a;) O(i, n) && r++, i = new Date(i.getTime() + Ae);
|
|
34
34
|
return r;
|
|
35
35
|
}
|
|
36
|
-
function
|
|
37
|
-
if (t <= 0) return
|
|
38
|
-
let r =
|
|
39
|
-
for (; i > 0;)
|
|
36
|
+
function j(e, t, n) {
|
|
37
|
+
if (t <= 0) return k(e).getTime();
|
|
38
|
+
let r = k(e), i = t;
|
|
39
|
+
for (; i > 0;) O(r, n) && i--, r = new Date(r.getTime() + Ae);
|
|
40
40
|
return r.getTime();
|
|
41
41
|
}
|
|
42
|
-
function
|
|
43
|
-
if (t <= 0) return
|
|
44
|
-
let r =
|
|
45
|
-
for (; i > 0;) r = /* @__PURE__ */ new Date(r.getTime() -
|
|
42
|
+
function Ne(e, t, n) {
|
|
43
|
+
if (t <= 0) return k(e).getTime();
|
|
44
|
+
let r = k(e), i = t;
|
|
45
|
+
for (; i > 0;) r = /* @__PURE__ */ new Date(r.getTime() - Ae), O(r, n) && i--;
|
|
46
46
|
return r.getTime();
|
|
47
47
|
}
|
|
48
|
-
var
|
|
49
|
-
function
|
|
48
|
+
var M = (e) => String(e);
|
|
49
|
+
function Pe(e) {
|
|
50
50
|
return e === "ss" || e === "ff" || e === "sf" ? e : "fs";
|
|
51
51
|
}
|
|
52
|
-
function
|
|
53
|
-
let t = new Set(e.map((e) =>
|
|
52
|
+
function Fe(e) {
|
|
53
|
+
let t = new Set(e.map((e) => M(e.id))), n = [];
|
|
54
54
|
for (let r of e) {
|
|
55
|
-
let e =
|
|
55
|
+
let e = M(r.id);
|
|
56
56
|
for (let i of r.dependencies ?? []) {
|
|
57
57
|
let r = typeof i == "object" && !!i, a = r ? i.id : i;
|
|
58
58
|
if (a == null || a === "") continue;
|
|
59
|
-
let o =
|
|
59
|
+
let o = M(a);
|
|
60
60
|
o === e || !t.has(o) || n.push({
|
|
61
61
|
pred: o,
|
|
62
62
|
succ: e,
|
|
63
|
-
type:
|
|
63
|
+
type: Pe(r ? i.type : void 0)
|
|
64
64
|
});
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
return n;
|
|
68
68
|
}
|
|
69
|
-
function
|
|
69
|
+
function N(e) {
|
|
70
70
|
let t = /* @__PURE__ */ new Set();
|
|
71
|
-
for (let n of e) n.parent != null && n.parent !== "" && t.add(
|
|
71
|
+
for (let n of e) n.parent != null && n.parent !== "" && t.add(M(n.parent));
|
|
72
72
|
return t;
|
|
73
73
|
}
|
|
74
|
-
function
|
|
74
|
+
function P(e, t) {
|
|
75
75
|
let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
|
|
76
76
|
for (let t of e) n.set(t, 0), r.set(t, []);
|
|
77
77
|
for (let e of t) r.get(e.pred).push(e.succ), n.set(e.succ, (n.get(e.succ) ?? 0) + 1);
|
|
@@ -97,7 +97,7 @@ function Pe(e, t) {
|
|
|
97
97
|
hasCycle: !1
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
|
-
function
|
|
100
|
+
function Ie(e, t) {
|
|
101
101
|
let n = {
|
|
102
102
|
criticalIds: /* @__PURE__ */ new Set(),
|
|
103
103
|
criticalEdges: /* @__PURE__ */ new Set()
|
|
@@ -105,10 +105,10 @@ function Fe(e, t) {
|
|
|
105
105
|
if (!e.length) return n;
|
|
106
106
|
let r = /* @__PURE__ */ new Map();
|
|
107
107
|
for (let n of e) {
|
|
108
|
-
let e = t ?
|
|
109
|
-
r.set(
|
|
108
|
+
let e = t ? Me(n.start.getTime(), n.end.getTime(), t) : (n.end.getTime() - n.start.getTime()) / Ae;
|
|
109
|
+
r.set(M(n.id), Number.isFinite(e) && e > 0 ? e : 0);
|
|
110
110
|
}
|
|
111
|
-
let i =
|
|
111
|
+
let i = Fe(e), a = e.map((e) => M(e.id)), { order: o, hasCycle: s } = P(a, i);
|
|
112
112
|
if (s) return n;
|
|
113
113
|
let c = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map();
|
|
114
114
|
for (let e of a) c.set(e, []), l.set(e, []);
|
|
@@ -139,21 +139,21 @@ function Fe(e, t) {
|
|
|
139
139
|
criticalEdges: _
|
|
140
140
|
};
|
|
141
141
|
}
|
|
142
|
-
function
|
|
142
|
+
function Le(e, t) {
|
|
143
143
|
if (!e.length) return [];
|
|
144
|
-
let n =
|
|
144
|
+
let n = Fe(e), r = e.map((e) => M(e.id)), { order: i, hasCycle: a } = P(r, n);
|
|
145
145
|
if (a) return [];
|
|
146
|
-
let o =
|
|
147
|
-
for (let t of e) s.set(
|
|
146
|
+
let o = N(e), s = /* @__PURE__ */ new Map();
|
|
147
|
+
for (let t of e) s.set(M(t.id), t);
|
|
148
148
|
let c = /* @__PURE__ */ new Map();
|
|
149
149
|
for (let e of r) c.set(e, []);
|
|
150
150
|
for (let e of n) c.get(e.succ).push(e);
|
|
151
151
|
let l = /* @__PURE__ */ new Map(), u = /* @__PURE__ */ new Map();
|
|
152
|
-
for (let t of e) l.set(
|
|
152
|
+
for (let t of e) l.set(M(t.id), t.start.getTime()), u.set(M(t.id), t.end.getTime());
|
|
153
153
|
for (let e of i) {
|
|
154
154
|
let n = s.get(e);
|
|
155
155
|
if (!n) continue;
|
|
156
|
-
let r = t ?
|
|
156
|
+
let r = t ? Me(l.get(e), u.get(e), t) : u.get(e) - l.get(e), i = n.start.getTime();
|
|
157
157
|
for (let n of c.get(e) ?? []) {
|
|
158
158
|
let e = l.get(n.pred), a = u.get(n.pred), o;
|
|
159
159
|
switch (n.type) {
|
|
@@ -161,10 +161,10 @@ function Ie(e, t) {
|
|
|
161
161
|
o = e;
|
|
162
162
|
break;
|
|
163
163
|
case "ff":
|
|
164
|
-
o = t ?
|
|
164
|
+
o = t ? Ne(a, r, t) : a - r;
|
|
165
165
|
break;
|
|
166
166
|
case "sf":
|
|
167
|
-
o = t ?
|
|
167
|
+
o = t ? Ne(e, r, t) : e - r;
|
|
168
168
|
break;
|
|
169
169
|
default:
|
|
170
170
|
o = a;
|
|
@@ -173,13 +173,13 @@ function Ie(e, t) {
|
|
|
173
173
|
o > i && (i = o);
|
|
174
174
|
}
|
|
175
175
|
if (!o.has(e)) if (t) {
|
|
176
|
-
let n =
|
|
177
|
-
l.set(e, n), u.set(e,
|
|
176
|
+
let n = A(i, t);
|
|
177
|
+
l.set(e, n), u.set(e, j(n, r, t));
|
|
178
178
|
} else l.set(e, i), u.set(e, i + r);
|
|
179
179
|
}
|
|
180
180
|
let d = [];
|
|
181
181
|
for (let t of e) {
|
|
182
|
-
let e =
|
|
182
|
+
let e = M(t.id);
|
|
183
183
|
if (o.has(e)) continue;
|
|
184
184
|
let n = l.get(e), r = u.get(e);
|
|
185
185
|
(n !== t.start.getTime() || r !== t.end.getTime()) && d.push({
|
|
@@ -192,28 +192,28 @@ function Ie(e, t) {
|
|
|
192
192
|
}
|
|
193
193
|
//#endregion
|
|
194
194
|
//#region src/shifts.ts
|
|
195
|
-
var
|
|
196
|
-
1440 *
|
|
197
|
-
var
|
|
198
|
-
function
|
|
195
|
+
var Re = 6e4;
|
|
196
|
+
1440 * Re;
|
|
197
|
+
var ze = 1440;
|
|
198
|
+
function F(e) {
|
|
199
199
|
if (typeof e != "string") return null;
|
|
200
200
|
let t = /^(\d{1,2}):(\d{2})$/.exec(e.trim());
|
|
201
201
|
if (!t) return null;
|
|
202
202
|
let n = Number(t[1]), r = Number(t[2]);
|
|
203
203
|
return n < 0 || n > 23 || r < 0 || r > 59 ? null : n * 60 + r;
|
|
204
204
|
}
|
|
205
|
-
function
|
|
205
|
+
function Be(e) {
|
|
206
206
|
if (!e || !Array.isArray(e.bands) || e.bands.length === 0) return null;
|
|
207
|
-
let t =
|
|
207
|
+
let t = F(e.dayStart) ?? 0, n = [];
|
|
208
208
|
for (let t = 0; t < e.bands.length; t++) {
|
|
209
|
-
let r = e.bands[t], i =
|
|
209
|
+
let r = e.bands[t], i = F(r.start), a = F(r.end);
|
|
210
210
|
if (i == null || a == null || !r.label) return null;
|
|
211
|
-
let o = (a - i +
|
|
211
|
+
let o = (a - i + ze) % ze || ze;
|
|
212
212
|
n.push({
|
|
213
213
|
key: r.key ?? `band${t}`,
|
|
214
214
|
label: r.label,
|
|
215
215
|
color: r.color,
|
|
216
|
-
durMs: o *
|
|
216
|
+
durMs: o * Re
|
|
217
217
|
});
|
|
218
218
|
}
|
|
219
219
|
return {
|
|
@@ -222,19 +222,19 @@ function Re(e) {
|
|
|
222
222
|
showMidnight: e.showMidnight !== !1
|
|
223
223
|
};
|
|
224
224
|
}
|
|
225
|
-
function
|
|
225
|
+
function Ve(e, t) {
|
|
226
226
|
let n = new Date(e);
|
|
227
227
|
return n.setHours(0, 0, 0, 0), n.setMinutes(t), n.getTime() > e.getTime() && n.setDate(n.getDate() - 1), n;
|
|
228
228
|
}
|
|
229
|
-
function
|
|
229
|
+
function I(e, t) {
|
|
230
230
|
if (t.bands.length === 0) return null;
|
|
231
|
-
let n =
|
|
231
|
+
let n = Ve(e, t.dayStartMin).getTime(), r = e.getTime() - n, i = 0;
|
|
232
232
|
for (let e of t.bands) if (i += e.durMs, r < i) return e;
|
|
233
233
|
return t.bands[t.bands.length - 1];
|
|
234
234
|
}
|
|
235
235
|
//#endregion
|
|
236
236
|
//#region src/useGanttTranslation.ts
|
|
237
|
-
var
|
|
237
|
+
var He = {
|
|
238
238
|
"gantt.column.taskName": "Task Name",
|
|
239
239
|
"gantt.column.start": "Start",
|
|
240
240
|
"gantt.column.end": "End",
|
|
@@ -292,60 +292,60 @@ var Ve = {
|
|
|
292
292
|
"gantt.readOnly": "Read-only",
|
|
293
293
|
"gantt.readOnlyHint": "Editing is disabled for this view."
|
|
294
294
|
};
|
|
295
|
-
function
|
|
296
|
-
let n =
|
|
295
|
+
function Ue(e, t) {
|
|
296
|
+
let n = He[e] || e;
|
|
297
297
|
if (t) for (let [e, r] of Object.entries(t)) n = n.replace(`{{${e}}}`, String(r));
|
|
298
298
|
return n;
|
|
299
299
|
}
|
|
300
|
-
function
|
|
300
|
+
function We() {
|
|
301
301
|
try {
|
|
302
|
-
let e =
|
|
302
|
+
let e = d();
|
|
303
303
|
return {
|
|
304
304
|
t: (t, n) => {
|
|
305
305
|
let r = e.t(t, n);
|
|
306
|
-
return typeof r == "string" && r !== t ? r :
|
|
306
|
+
return typeof r == "string" && r !== t ? r : Ue(t, n);
|
|
307
307
|
},
|
|
308
308
|
language: e.language
|
|
309
309
|
};
|
|
310
310
|
} catch {
|
|
311
311
|
return {
|
|
312
|
-
t:
|
|
312
|
+
t: Ue,
|
|
313
313
|
language: void 0
|
|
314
314
|
};
|
|
315
315
|
}
|
|
316
316
|
}
|
|
317
317
|
//#endregion
|
|
318
318
|
//#region src/GanttView.tsx
|
|
319
|
-
function
|
|
319
|
+
function Ge(e) {
|
|
320
320
|
return 110;
|
|
321
321
|
}
|
|
322
|
-
function
|
|
322
|
+
function Ke(e) {
|
|
323
323
|
return e < 640 ? 140 : e < 1024 ? 220 : 320;
|
|
324
324
|
}
|
|
325
|
-
function
|
|
325
|
+
function qe(e) {
|
|
326
326
|
return e >= 280;
|
|
327
327
|
}
|
|
328
|
-
function
|
|
328
|
+
function Je(e) {
|
|
329
329
|
return e < 640 ? 32 : 40;
|
|
330
330
|
}
|
|
331
|
-
var
|
|
331
|
+
var Ye = [
|
|
332
332
|
"day",
|
|
333
333
|
"week",
|
|
334
334
|
"month",
|
|
335
335
|
"quarter",
|
|
336
336
|
"year"
|
|
337
|
-
],
|
|
337
|
+
], Xe = {
|
|
338
338
|
day: 1,
|
|
339
339
|
week: 7,
|
|
340
340
|
month: 30.44,
|
|
341
341
|
quarter: 91.31,
|
|
342
342
|
year: 365.25
|
|
343
|
-
},
|
|
344
|
-
function
|
|
343
|
+
}, Ze = 1e3 * 60 * 60 * 24;
|
|
344
|
+
function Qe(e, t) {
|
|
345
345
|
let n = new Date(e);
|
|
346
346
|
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;
|
|
347
347
|
}
|
|
348
|
-
function
|
|
348
|
+
function $e(e, t, n) {
|
|
349
349
|
let r = e.length - 1, i = 0;
|
|
350
350
|
for (; i < r && e[i + 1] < t;) i++;
|
|
351
351
|
let a = i;
|
|
@@ -355,7 +355,7 @@ function Qe(e, t, n) {
|
|
|
355
355
|
end: a
|
|
356
356
|
};
|
|
357
357
|
}
|
|
358
|
-
function
|
|
358
|
+
function et(e, t, n) {
|
|
359
359
|
let r = new Date(e);
|
|
360
360
|
if (n === "day") r.setDate(r.getDate() + t);
|
|
361
361
|
else if (n === "week") r.setDate(r.getDate() + t * 7);
|
|
@@ -367,7 +367,7 @@ function $e(e, t, n) {
|
|
|
367
367
|
}
|
|
368
368
|
return r;
|
|
369
369
|
}
|
|
370
|
-
function
|
|
370
|
+
function tt(e, t, n, r = 2) {
|
|
371
371
|
return new Promise((i) => {
|
|
372
372
|
let a = new Blob([e], { type: "image/svg+xml;charset=utf-8" }), o = URL.createObjectURL(a), s = new Image();
|
|
373
373
|
s.onload = () => {
|
|
@@ -380,11 +380,11 @@ function et(e, t, n, r = 2) {
|
|
|
380
380
|
}, s.src = o;
|
|
381
381
|
});
|
|
382
382
|
}
|
|
383
|
-
function
|
|
383
|
+
function nt(e, t) {
|
|
384
384
|
let n = document.createElement("a");
|
|
385
385
|
n.href = URL.createObjectURL(e), n.download = t, document.body.appendChild(n), n.click(), n.remove(), setTimeout(() => URL.revokeObjectURL(n.href), 1e3);
|
|
386
386
|
}
|
|
387
|
-
function
|
|
387
|
+
function rt(e, t, n) {
|
|
388
388
|
let r = (e) => {
|
|
389
389
|
let t = new Uint8Array(e.length);
|
|
390
390
|
for (let n = 0; n < e.length; n++) t[n] = e.charCodeAt(n) & 255;
|
|
@@ -399,18 +399,18 @@ function nt(e, t, n) {
|
|
|
399
399
|
for (let e of o) d += `${String(e).padStart(10, "0")} 00000 n \n`;
|
|
400
400
|
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" });
|
|
401
401
|
}
|
|
402
|
-
function
|
|
402
|
+
function it(e) {
|
|
403
403
|
let t = e.slice(e.indexOf(",") + 1), n = atob(t), r = new Uint8Array(n.length);
|
|
404
404
|
for (let e = 0; e < n.length; e++) r[e] = n.charCodeAt(e);
|
|
405
405
|
return r;
|
|
406
406
|
}
|
|
407
|
-
var
|
|
407
|
+
var L = "gantt-layout:";
|
|
408
408
|
function at(e) {
|
|
409
409
|
if (!e || typeof window > "u") return null;
|
|
410
410
|
try {
|
|
411
|
-
let t = window.localStorage.getItem(
|
|
411
|
+
let t = window.localStorage.getItem(L + e);
|
|
412
412
|
if (!t) return null;
|
|
413
|
-
let n = JSON.parse(t), r = n.viewMode &&
|
|
413
|
+
let n = JSON.parse(t), r = n.viewMode && Ye.includes(n.viewMode) ? n.viewMode : null;
|
|
414
414
|
if (!r) return null;
|
|
415
415
|
let i = typeof n.columnWidth == "number" && isFinite(n.columnWidth) ? n.columnWidth : null, a = typeof n.taskListWidth == "number" && isFinite(n.taskListWidth) ? n.taskListWidth : null;
|
|
416
416
|
return {
|
|
@@ -425,40 +425,40 @@ function at(e) {
|
|
|
425
425
|
}
|
|
426
426
|
function ot(e, t) {
|
|
427
427
|
if (!(typeof window > "u")) try {
|
|
428
|
-
window.localStorage.setItem(
|
|
428
|
+
window.localStorage.setItem(L + e, JSON.stringify(t));
|
|
429
429
|
} catch {}
|
|
430
430
|
}
|
|
431
|
-
function
|
|
432
|
-
let { t: x, language: ue } =
|
|
433
|
-
|
|
434
|
-
let
|
|
431
|
+
function st({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTaskClick: o, onTaskUpdate: s, onTaskDelete: c, onViewChange: l, onDependencyCreate: u, onDependencyDelete: d, onTaskReorder: f, className: p, inlineEdit: m = !1, autoSchedule: h = !1, rescheduleOnConflict: g = !1, criticalPathDefault: ee = !1, workingCalendar: _, shiftSegments: v, showBaselines: te = !0, readOnly: ne = !1, mobileReadOnly: re = !1, groupBy: ie, ungroupedLabel: ae = "Ungrouped", defaultCollapsedDepth: oe, persistLayoutKey: ce, onLayoutChange: le }) {
|
|
432
|
+
let { t: x, language: ue } = We(), S = ue || void 0, [de, fe] = e.useState(/* @__PURE__ */ new Date()), pe = e.useRef(null), { width: Ae } = se(pe), je = Ae || (typeof window < "u" ? window.innerWidth : 1024), O = je < 640, k = ne || re && O, A = k ? void 0 : s, Me = k ? void 0 : c, j = k ? void 0 : u, Ne = k ? void 0 : d, M = k ? void 0 : f, Pe = k ? !1 : m, Fe = k ? !1 : h, N = k ? !1 : g, P = Je(je), Re = Ge(je), ze = e.useRef(void 0);
|
|
433
|
+
ze.current === void 0 && (ze.current = at(ce));
|
|
434
|
+
let F = ze.current, [Be, I] = e.useState(F ? F.columnWidth : null), [He, Ue] = e.useState(F ? F.taskListWidth ?? null : null), [L, st] = e.useState(n && Ye.includes(n) ? n : F?.viewMode ?? "day");
|
|
435
435
|
e.useEffect(() => {
|
|
436
|
-
n &&
|
|
436
|
+
n && Ye.includes(n) && st(n);
|
|
437
437
|
}, [n]);
|
|
438
|
-
let ct = e.useRef(null), lt = e.useRef(null), ut = e.useRef(!0), [R, dt] = e.useState(
|
|
438
|
+
let ct = e.useRef(null), lt = e.useRef(null), ut = e.useRef(!0), [R, dt] = e.useState(F ? F.taskListCollapsed : !1), ft = e.useRef(!1);
|
|
439
439
|
e.useEffect(() => {
|
|
440
|
-
!ft.current &&
|
|
441
|
-
}, [
|
|
442
|
-
let pt = Math.max(160,
|
|
440
|
+
!ft.current && O && (dt(!0), ft.current = !0);
|
|
441
|
+
}, [O]);
|
|
442
|
+
let pt = Math.max(160, je - 200), z = R ? 0 : He == null ? Ke(je) : Math.max(160, Math.min(He, pt)), mt = e.useMemo(() => {
|
|
443
443
|
if (Be != null || i || t.length === 0) return null;
|
|
444
444
|
let e = r ? new Date(r) : new Date(Math.min(...t.map((e) => e.start.getTime()))), n = new Date(Math.max(...t.map((e) => e.end.getTime())));
|
|
445
|
-
r || e.setDate(e.getDate() - 7), n.setDate(n.getDate() + 14), e =
|
|
446
|
-
let a = Math.max(1, (n.getTime() - e.getTime()) /
|
|
445
|
+
r || e.setDate(e.getDate() - 7), n.setDate(n.getDate() + 14), e = Qe(e, L), n.setHours(23, 59, 59, 999);
|
|
446
|
+
let a = Math.max(1, (n.getTime() - e.getTime()) / Ze), o = Math.max(0, je - z);
|
|
447
447
|
if (o <= 0) return null;
|
|
448
|
-
let s = o / a *
|
|
449
|
-
if (s <=
|
|
448
|
+
let s = o / a * Xe[L];
|
|
449
|
+
if (s <= Re) return null;
|
|
450
450
|
let c = Math.min(s, o * .6);
|
|
451
|
-
return c >
|
|
451
|
+
return c > Re ? c : null;
|
|
452
452
|
}, [
|
|
453
453
|
Be,
|
|
454
454
|
t,
|
|
455
455
|
r,
|
|
456
456
|
i,
|
|
457
457
|
L,
|
|
458
|
-
|
|
458
|
+
je,
|
|
459
459
|
z,
|
|
460
|
-
|
|
461
|
-
]), B = Be ?? mt ??
|
|
460
|
+
Re
|
|
461
|
+
]), B = Be ?? mt ?? Re, ht = B / Xe[L], gt = qe(z), [_t, vt] = e.useState(null), [yt, bt] = e.useState({}), [xt, St] = e.useState(null), V = e.useMemo(() => {
|
|
462
462
|
if (!ie) return t;
|
|
463
463
|
let e = /* @__PURE__ */ new Set();
|
|
464
464
|
for (let n of t) {
|
|
@@ -525,7 +525,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
525
525
|
Dt.current = H;
|
|
526
526
|
}, [H]);
|
|
527
527
|
let Ot = e.useRef(!1), kt = e.useCallback((e) => {
|
|
528
|
-
let t = L === "day" && v && v.bands.length > 0 && v ? Math.min(...v.bands.map((e) => e.durMs)) :
|
|
528
|
+
let t = L === "day" && v && v.bands.length > 0 && v ? Math.min(...v.bands.map((e) => e.durMs)) : Ze, n = (e, t) => En.current ? En.current(e, t) : et(e, t, L), r = new Date(e.originStart), i = new Date(e.originEnd);
|
|
529
529
|
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))), {
|
|
530
530
|
start: r,
|
|
531
531
|
end: i
|
|
@@ -533,7 +533,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
533
533
|
}, [L, v]), At = e.useRef(t);
|
|
534
534
|
At.current = t;
|
|
535
535
|
let jt = e.useRef([]), Mt = e.useRef([]), [Nt, Pt] = e.useState(0), Ft = e.useCallback((e) => {
|
|
536
|
-
if (!
|
|
536
|
+
if (!A) return;
|
|
537
537
|
let t = [];
|
|
538
538
|
for (let { task: n, changes: r } of e) {
|
|
539
539
|
let e = {}, i = {}, a = !1;
|
|
@@ -541,21 +541,21 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
541
541
|
let o = r[t], s = n[t], c = o instanceof Date && s instanceof Date ? o.getTime() === s.getTime() : o === s;
|
|
542
542
|
e[t] = s, i[t] = o, c || (a = !0);
|
|
543
543
|
}
|
|
544
|
-
|
|
544
|
+
A(n, r), a && t.push({
|
|
545
545
|
taskId: String(n.id),
|
|
546
546
|
before: e,
|
|
547
547
|
after: i
|
|
548
548
|
});
|
|
549
549
|
}
|
|
550
550
|
t.length && (jt.current.push(t), Mt.current = [], Pt((e) => e + 1));
|
|
551
|
-
}, [
|
|
552
|
-
if (!
|
|
551
|
+
}, [A]), [It, Lt] = e.useState(null), Rt = e.useCallback((e) => {
|
|
552
|
+
if (!N) return;
|
|
553
553
|
let t = /* @__PURE__ */ new Map();
|
|
554
554
|
for (let { task: n, changes: r } of e) t.set(String(n.id), {
|
|
555
555
|
start: r.start ?? n.start,
|
|
556
556
|
end: r.end ?? n.end
|
|
557
557
|
});
|
|
558
|
-
let n =
|
|
558
|
+
let n = Le(At.current.map((e) => {
|
|
559
559
|
let n = t.get(String(e.id));
|
|
560
560
|
return n ? {
|
|
561
561
|
...e,
|
|
@@ -567,7 +567,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
567
567
|
return !n || e.start.getTime() !== n.start.getTime() || e.end.getTime() !== n.end.getTime();
|
|
568
568
|
});
|
|
569
569
|
n.length && Lt(n);
|
|
570
|
-
}, [
|
|
570
|
+
}, [N, _]), zt = e.useCallback(() => {
|
|
571
571
|
if (!It) return;
|
|
572
572
|
let e = It.map((e) => {
|
|
573
573
|
let t = At.current.find((t) => String(t.id) === e.id);
|
|
@@ -581,11 +581,11 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
581
581
|
}).filter(Boolean);
|
|
582
582
|
e.length && Ft(e), Lt(null);
|
|
583
583
|
}, [It, Ft]), Bt = e.useCallback((e, t) => {
|
|
584
|
-
if (
|
|
584
|
+
if (A) for (let n of e) {
|
|
585
585
|
let e = At.current.find((e) => String(e.id) === n.taskId);
|
|
586
|
-
e &&
|
|
586
|
+
e && A(e, t === "undo" ? n.before : n.after);
|
|
587
587
|
}
|
|
588
|
-
}, [
|
|
588
|
+
}, [A]), Vt = e.useCallback(() => {
|
|
589
589
|
let e = jt.current.pop();
|
|
590
590
|
e && (Bt(e, "undo"), Mt.current.push(e), Pt((e) => e + 1));
|
|
591
591
|
}, [Bt]), Ht = e.useCallback(() => {
|
|
@@ -597,7 +597,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
597
597
|
}), [Nt]);
|
|
598
598
|
e.useEffect(() => {
|
|
599
599
|
if (!H) return;
|
|
600
|
-
let e = L === "day" && v && v.bands.length > 0 && v ? ht * Math.min(...v.bands.map((e) => e.durMs)) /
|
|
600
|
+
let e = L === "day" && v && v.bands.length > 0 && v ? ht * Math.min(...v.bands.map((e) => e.durMs)) / Ze : B, n = (t) => {
|
|
601
601
|
let n = Dt.current;
|
|
602
602
|
if (!n) return;
|
|
603
603
|
let r = Math.round((t.clientX - n.originClientX) / Math.max(e, 1));
|
|
@@ -610,7 +610,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
610
610
|
if (e) {
|
|
611
611
|
if (e.unitDelta !== 0) {
|
|
612
612
|
let n = t.find((t) => t.id === e.taskId);
|
|
613
|
-
if (n &&
|
|
613
|
+
if (n && A) {
|
|
614
614
|
let { start: t, end: r } = kt(e);
|
|
615
615
|
if (e.group) {
|
|
616
616
|
let r = t.getTime() - e.originStart.getTime(), i = [n, ...Tt(n.id)].map((e) => ({
|
|
@@ -649,14 +649,14 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
649
649
|
L,
|
|
650
650
|
v,
|
|
651
651
|
t,
|
|
652
|
-
|
|
652
|
+
A,
|
|
653
653
|
kt,
|
|
654
654
|
Tt,
|
|
655
655
|
Ft,
|
|
656
656
|
Rt
|
|
657
657
|
]);
|
|
658
658
|
let Gt = e.useCallback((e, t, n, r) => {
|
|
659
|
-
!
|
|
659
|
+
!A || e.data?.__group || (n.stopPropagation(), n.preventDefault(), Et({
|
|
660
660
|
taskId: e.id,
|
|
661
661
|
mode: t,
|
|
662
662
|
group: r?.group ?? !1,
|
|
@@ -665,7 +665,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
665
665
|
originClientX: n.clientX,
|
|
666
666
|
unitDelta: 0
|
|
667
667
|
}));
|
|
668
|
-
}, [
|
|
668
|
+
}, [A]), [Kt, qt] = e.useState(null), Jt = e.useRef(null);
|
|
669
669
|
e.useEffect(() => {
|
|
670
670
|
Jt.current = Kt;
|
|
671
671
|
}, [Kt]), e.useEffect(() => {
|
|
@@ -683,7 +683,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
683
683
|
if (e) {
|
|
684
684
|
if (e.value !== e.originProgress) {
|
|
685
685
|
let n = t.find((t) => t.id === e.taskId);
|
|
686
|
-
n &&
|
|
686
|
+
n && A && Ft([{
|
|
687
687
|
task: n,
|
|
688
688
|
changes: { progress: e.value }
|
|
689
689
|
}]), Ot.current = !0, window.setTimeout(() => {
|
|
@@ -699,7 +699,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
699
699
|
}, [
|
|
700
700
|
Kt,
|
|
701
701
|
t,
|
|
702
|
-
|
|
702
|
+
A,
|
|
703
703
|
Ft
|
|
704
704
|
]);
|
|
705
705
|
let Yt = e.useRef(null), [U, Xt] = e.useState(null), Zt = e.useRef(null);
|
|
@@ -718,9 +718,9 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
718
718
|
});
|
|
719
719
|
}, n = () => {
|
|
720
720
|
let e = Zt.current;
|
|
721
|
-
if (e && e.targetId != null && String(e.targetId) !== String(e.sourceId) &&
|
|
721
|
+
if (e && e.targetId != null && String(e.targetId) !== String(e.sourceId) && j) {
|
|
722
722
|
let n = t.find((t) => String(t.id) === String(e.sourceId)), r = t.find((t) => String(t.id) === String(e.targetId)), i = e.targetEnd ?? "start", a = `${e.sourceEnd === "end" ? "f" : "s"}${i === "end" ? "f" : "s"}`;
|
|
723
|
-
n && r &&
|
|
723
|
+
n && r && j(n, r, a);
|
|
724
724
|
}
|
|
725
725
|
Ot.current = !0, window.setTimeout(() => {
|
|
726
726
|
Ot.current = !1;
|
|
@@ -732,7 +732,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
732
732
|
}, [
|
|
733
733
|
U,
|
|
734
734
|
t,
|
|
735
|
-
|
|
735
|
+
j
|
|
736
736
|
]);
|
|
737
737
|
let [Qt, $t] = e.useState(null), en = e.useRef(null);
|
|
738
738
|
e.useEffect(() => {
|
|
@@ -770,28 +770,28 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
770
770
|
window.removeEventListener("pointerdown", e, !0), window.removeEventListener("keydown", t);
|
|
771
771
|
};
|
|
772
772
|
}, [rn]);
|
|
773
|
-
let [sn, cn] = e.useState(null), ln = !!(o ||
|
|
773
|
+
let [sn, cn] = e.useState(null), ln = !!(o || A || j || Me), un = e.useCallback((e, t) => {
|
|
774
774
|
t.preventDefault(), t.stopPropagation(), cn(e.id), ln && $t({
|
|
775
775
|
x: t.clientX,
|
|
776
776
|
y: t.clientY,
|
|
777
777
|
taskId: e.id
|
|
778
778
|
});
|
|
779
779
|
}, [ln]), dn = e.useCallback((e, t, n, r) => {
|
|
780
|
-
r.preventDefault(), r.stopPropagation(), !(!
|
|
780
|
+
r.preventDefault(), r.stopPropagation(), !(!j && !Ne) && tn({
|
|
781
781
|
x: r.clientX,
|
|
782
782
|
y: r.clientY,
|
|
783
783
|
sourceId: e,
|
|
784
784
|
targetId: t,
|
|
785
785
|
type: n
|
|
786
786
|
});
|
|
787
|
-
}, [
|
|
787
|
+
}, [j, Ne]), [fn, pn] = e.useState(() => /* @__PURE__ */ new Set()), mn = e.useCallback((e) => {
|
|
788
788
|
pn((t) => {
|
|
789
789
|
let n = new Set(t), r = String(e);
|
|
790
790
|
return n.has(r) ? n.delete(r) : n.add(r), n;
|
|
791
791
|
});
|
|
792
792
|
}, []), hn = e.useRef(!1);
|
|
793
793
|
e.useEffect(() => {
|
|
794
|
-
if (hn.current ||
|
|
794
|
+
if (hn.current || oe == null || V.length === 0) return;
|
|
795
795
|
hn.current = !0;
|
|
796
796
|
let e = new Map(V.map((e) => [String(e.id), e])), t = /* @__PURE__ */ new Set();
|
|
797
797
|
for (let n of V) {
|
|
@@ -799,16 +799,16 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
799
799
|
r && r !== String(n.id) && e.has(r) && t.add(r);
|
|
800
800
|
}
|
|
801
801
|
let n = (t) => {
|
|
802
|
-
let n = 0, r = new Set([String(t.id)]), i = t.parent != null && t.parent !== "" ? e.get(String(t.parent)) : void 0;
|
|
802
|
+
let n = 0, r = /* @__PURE__ */ new Set([String(t.id)]), i = t.parent != null && t.parent !== "" ? e.get(String(t.parent)) : void 0;
|
|
803
803
|
for (; i && !r.has(String(i.id));) n += 1, r.add(String(i.id)), i = i.parent != null && i.parent !== "" ? e.get(String(i.parent)) : void 0;
|
|
804
804
|
return n;
|
|
805
805
|
}, r = /* @__PURE__ */ new Set();
|
|
806
806
|
for (let e of V) {
|
|
807
807
|
let i = String(e.id);
|
|
808
|
-
t.has(i) && n(e) >=
|
|
808
|
+
t.has(i) && n(e) >= oe && r.add(i);
|
|
809
809
|
}
|
|
810
810
|
r.size && pn((e) => e.size ? e : r);
|
|
811
|
-
}, [
|
|
811
|
+
}, [oe, V]);
|
|
812
812
|
let G = e.useMemo(() => {
|
|
813
813
|
let e = new Set(V.map((e) => String(e.id))), t = /* @__PURE__ */ new Map(), n = [];
|
|
814
814
|
for (let r of V) {
|
|
@@ -833,7 +833,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
833
833
|
for (let a of s) {
|
|
834
834
|
let s = i(a, n);
|
|
835
835
|
(!e || s.start < e) && (e = s.start), (!t || s.end > t) && (t = s.end);
|
|
836
|
-
let c = Math.max(s.end.getTime() - s.start.getTime(),
|
|
836
|
+
let c = Math.max(s.end.getTime() - s.start.getTime(), Ze);
|
|
837
837
|
r += c * s.progress, o += c;
|
|
838
838
|
}
|
|
839
839
|
n.delete(a), c = {
|
|
@@ -885,27 +885,27 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
885
885
|
cn(G[n].task.id);
|
|
886
886
|
let r = X.current;
|
|
887
887
|
if (r) {
|
|
888
|
-
let e = n *
|
|
889
|
-
e < r.scrollTop ? r.scrollTop = e : e +
|
|
888
|
+
let e = n * P;
|
|
889
|
+
e < r.scrollTop ? r.scrollTop = e : e + P > r.scrollTop + r.clientHeight && (r.scrollTop = e + P - r.clientHeight);
|
|
890
890
|
}
|
|
891
891
|
return;
|
|
892
892
|
}
|
|
893
893
|
if (t < 0) return;
|
|
894
894
|
let n = G[t];
|
|
895
|
-
e.key === "Enter" ? (e.preventDefault(), o?.(n.task)) : e.key === "Delete" || e.key === "Backspace" ?
|
|
895
|
+
e.key === "Enter" ? (e.preventDefault(), o?.(n.task)) : e.key === "Delete" || e.key === "Backspace" ? Me && (e.preventDefault(), Me(n.task)) : (e.key === "ArrowRight" && n.hasChildren && fn.has(String(n.task.id)) || e.key === "ArrowLeft" && n.hasChildren && !fn.has(String(n.task.id))) && (e.preventDefault(), mn(n.task.id));
|
|
896
896
|
}, [
|
|
897
897
|
G,
|
|
898
898
|
sn,
|
|
899
899
|
o,
|
|
900
|
-
|
|
900
|
+
Me,
|
|
901
901
|
fn,
|
|
902
902
|
mn,
|
|
903
|
-
|
|
903
|
+
P,
|
|
904
904
|
Vt,
|
|
905
905
|
Ht
|
|
906
906
|
]), K = e.useMemo(() => {
|
|
907
907
|
let e = r ? new Date(r) : /* @__PURE__ */ new Date(), n = i ? new Date(i) : /* @__PURE__ */ new Date();
|
|
908
|
-
return !r && t.length > 0 && (e = new Date(Math.min(...t.map((e) => e.start.getTime()))), e.setDate(e.getDate() - 7)), !i && t.length > 0 && (n = new Date(Math.max(...t.map((e) => e.end.getTime()))), n.setDate(n.getDate() + 14)), e = L === "day" && v && v.bands.length > 0 ?
|
|
908
|
+
return !r && t.length > 0 && (e = new Date(Math.min(...t.map((e) => e.start.getTime()))), e.setDate(e.getDate() - 7)), !i && t.length > 0 && (n = new Date(Math.max(...t.map((e) => e.end.getTime()))), n.setDate(n.getDate() + 14)), e = L === "day" && v && v.bands.length > 0 ? Ve(e, v.dayStartMin) : Qe(e, L), n.setHours(23, 59, 59, 999), {
|
|
909
909
|
start: e,
|
|
910
910
|
end: n
|
|
911
911
|
};
|
|
@@ -931,7 +931,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
931
931
|
if (_n && v) {
|
|
932
932
|
let t = new Date(K.start);
|
|
933
933
|
for (; t <= K.end;) for (let n of v.bands) {
|
|
934
|
-
let r = n.durMs /
|
|
934
|
+
let r = n.durMs / Ze * ht;
|
|
935
935
|
e.push({
|
|
936
936
|
date: new Date(t),
|
|
937
937
|
label: n.label,
|
|
@@ -945,12 +945,12 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
945
945
|
}
|
|
946
946
|
let t = new Date(K.start);
|
|
947
947
|
for (; t <= K.end;) {
|
|
948
|
-
let n =
|
|
948
|
+
let n = et(t, 1, L);
|
|
949
949
|
if (vn && !yn(t)) {
|
|
950
950
|
t = n;
|
|
951
951
|
continue;
|
|
952
952
|
}
|
|
953
|
-
let r = (n.getTime() - t.getTime()) /
|
|
953
|
+
let r = (n.getTime() - t.getTime()) / Ze * ht, i, a;
|
|
954
954
|
L === "day" ? (i = String(t.getDate()), a = t.toLocaleDateString(S, { weekday: "narrow" })) : i = L === "week" ? t.toLocaleDateString(S, {
|
|
955
955
|
month: "numeric",
|
|
956
956
|
day: "numeric"
|
|
@@ -976,7 +976,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
976
976
|
let e = Array(q.length + 1), t = 0;
|
|
977
977
|
for (let n = 0; n < q.length; n++) e[n] = t, t += q[n].width;
|
|
978
978
|
return e[q.length] = t, e;
|
|
979
|
-
}, [q]), bn = J[J.length - 1], xn = e.useMemo(() => q.map((e) => e.date.getTime()), [q]), Sn = e.useMemo(() => q.map((e) => e.realMs == null ?
|
|
979
|
+
}, [q]), bn = J[J.length - 1], xn = e.useMemo(() => q.map((e) => e.date.getTime()), [q]), Sn = e.useMemo(() => q.map((e) => e.realMs == null ? et(e.date, 1, L).getTime() - e.date.getTime() : e.realMs), [q, L]), Y = e.useCallback((e) => {
|
|
980
980
|
let t = q.length;
|
|
981
981
|
if (t === 0) return 0;
|
|
982
982
|
let n = e.getTime(), r = 0, i = t - 1, a = 0;
|
|
@@ -1019,7 +1019,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1019
1019
|
ct.current = null;
|
|
1020
1020
|
let t = X.current;
|
|
1021
1021
|
if (!t || t.clientWidth === 0) return;
|
|
1022
|
-
let n = Math.max(0, t.scrollWidth - t.clientWidth), r = Math.max(0, Math.min(Math.round(Y(
|
|
1022
|
+
let n = Math.max(0, t.scrollWidth - t.clientWidth), r = Math.max(0, Math.min(Math.round(Y(Qe(e, L))), n));
|
|
1023
1023
|
t.scrollLeft !== r && (t.scrollLeft = r);
|
|
1024
1024
|
}, [L, Y]);
|
|
1025
1025
|
let Tn = e.useCallback((e, t) => {
|
|
@@ -1039,7 +1039,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1039
1039
|
if (_n && v) {
|
|
1040
1040
|
let t = 0;
|
|
1041
1041
|
for (let n of q) {
|
|
1042
|
-
let r = String(
|
|
1042
|
+
let r = String(Ve(n.date, v.dayStartMin).getTime()), i = e[e.length - 1];
|
|
1043
1043
|
i && i.key === r ? i.width += n.width : e.push({
|
|
1044
1044
|
key: r,
|
|
1045
1045
|
label: n.date.toLocaleDateString(S, {
|
|
@@ -1091,7 +1091,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1091
1091
|
if (!e) return;
|
|
1092
1092
|
let t = () => {
|
|
1093
1093
|
ut.current = !1;
|
|
1094
|
-
}, n = new Set([
|
|
1094
|
+
}, n = /* @__PURE__ */ new Set([
|
|
1095
1095
|
"ArrowLeft",
|
|
1096
1096
|
"ArrowRight",
|
|
1097
1097
|
"ArrowUp",
|
|
@@ -1131,32 +1131,32 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1131
1131
|
let t = new ResizeObserver(Bn);
|
|
1132
1132
|
return t.observe(e), () => t.disconnect();
|
|
1133
1133
|
}, [Bn]);
|
|
1134
|
-
let Vn = e.useMemo(() =>
|
|
1134
|
+
let Vn = e.useMemo(() => $e(J, In.left - 240, In.left + Rn.width + 240), [
|
|
1135
1135
|
J,
|
|
1136
1136
|
In.left,
|
|
1137
1137
|
Rn.width
|
|
1138
1138
|
]), Hn = e.useMemo(() => {
|
|
1139
1139
|
let e = Dn.map((e) => e.offset);
|
|
1140
1140
|
return e.push(bn), e;
|
|
1141
|
-
}, [Dn, bn]), Un = e.useMemo(() =>
|
|
1141
|
+
}, [Dn, bn]), Un = e.useMemo(() => $e(Hn, In.left - 240, In.left + Rn.width + 240), [
|
|
1142
1142
|
Hn,
|
|
1143
1143
|
In.left,
|
|
1144
1144
|
Rn.width
|
|
1145
1145
|
]), Z = e.useMemo(() => ({
|
|
1146
|
-
startIdx: Math.max(0, Math.floor(In.top /
|
|
1147
|
-
endIdx: Math.min(G.length, Math.ceil((In.top + Rn.height) /
|
|
1146
|
+
startIdx: Math.max(0, Math.floor(In.top / P) - 6),
|
|
1147
|
+
endIdx: Math.min(G.length, Math.ceil((In.top + Rn.height) / P) + 6)
|
|
1148
1148
|
}), [
|
|
1149
1149
|
In.top,
|
|
1150
1150
|
Rn.height,
|
|
1151
|
-
|
|
1151
|
+
P,
|
|
1152
1152
|
G.length
|
|
1153
|
-
]), Wn = G.length *
|
|
1153
|
+
]), Wn = G.length * P, [Gn, Kn] = e.useState(!1);
|
|
1154
1154
|
e.useEffect(() => {
|
|
1155
1155
|
let e = () => Kn(!!document.fullscreenElement);
|
|
1156
1156
|
return document.addEventListener("fullscreenchange", e), () => document.removeEventListener("fullscreenchange", e);
|
|
1157
1157
|
}, []);
|
|
1158
1158
|
let qn = e.useCallback(() => {
|
|
1159
|
-
let e =
|
|
1159
|
+
let e = pe.current;
|
|
1160
1160
|
e && (document.fullscreenElement ? document.exitFullscreen?.() : e.requestFullscreen?.());
|
|
1161
1161
|
}, []), Jn = e.useRef(null), Yn = e.useCallback((e) => {
|
|
1162
1162
|
if (e.touches.length === 2) {
|
|
@@ -1169,7 +1169,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1169
1169
|
}, [B]), Xn = e.useCallback((e) => {
|
|
1170
1170
|
if (e.touches.length !== 2 || !Jn.current) return;
|
|
1171
1171
|
let t = e.touches[0].clientX - e.touches[1].clientX, n = e.touches[0].clientY - e.touches[1].clientY, r = Math.max(1, Math.sqrt(t * t + n * n)) / Jn.current.baseDistance;
|
|
1172
|
-
|
|
1172
|
+
I(Math.max(15, Math.min(120, Math.round(Jn.current.baseColumn * r))));
|
|
1173
1173
|
}, []), Zn = e.useCallback(() => {
|
|
1174
1174
|
Jn.current = null;
|
|
1175
1175
|
}, []), Q = e.useMemo(() => {
|
|
@@ -1236,7 +1236,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1236
1236
|
e.useEffect(() => () => {
|
|
1237
1237
|
Pn.current.forEach((e) => window.clearTimeout(e)), Fn.current?.();
|
|
1238
1238
|
}, []);
|
|
1239
|
-
let nr = e.useCallback(() => er(
|
|
1239
|
+
let nr = e.useCallback(() => er(Qe(/* @__PURE__ */ new Date(), "week")), [er]), rr = e.useCallback(() => er(Qe(/* @__PURE__ */ new Date(), "month")), [er]), ir = (e) => {
|
|
1240
1240
|
let t = e.currentTarget;
|
|
1241
1241
|
!ut.current && t.clientWidth > 0 && (lt.current = Cn(t.scrollLeft)), kn.current && (kn.current.scrollLeft = t.scrollLeft), An.current && An.current.scrollTop !== t.scrollTop && (An.current.scrollTop = t.scrollTop), Ln((e) => e.top === t.scrollTop && e.left === t.scrollLeft ? e : {
|
|
1242
1242
|
top: t.scrollTop,
|
|
@@ -1249,14 +1249,14 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1249
1249
|
top: t.scrollTop
|
|
1250
1250
|
});
|
|
1251
1251
|
}, or = (e, t) => {
|
|
1252
|
-
let n = Y(e), r = _n && v ? ht * Math.min(...v.bands.map((e) => e.durMs)) /
|
|
1252
|
+
let n = Y(e), r = _n && v ? ht * Math.min(...v.bands.map((e) => e.durMs)) / Ze : ht;
|
|
1253
1253
|
return {
|
|
1254
1254
|
left: n,
|
|
1255
1255
|
width: Math.max(Y(t) - n, r, 3)
|
|
1256
1256
|
};
|
|
1257
1257
|
}, sr = H?.group ? H.taskId : null, cr = e.useMemo(() => {
|
|
1258
1258
|
if (sr == null) return null;
|
|
1259
|
-
let e = new Set([String(sr)]);
|
|
1259
|
+
let e = /* @__PURE__ */ new Set([String(sr)]);
|
|
1260
1260
|
for (let t of Tt(sr)) e.add(String(t.id));
|
|
1261
1261
|
return e;
|
|
1262
1262
|
}, [sr, Tt]), lr = e.useMemo(() => {
|
|
@@ -1310,23 +1310,23 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1310
1310
|
});
|
|
1311
1311
|
}
|
|
1312
1312
|
}), t;
|
|
1313
|
-
}, [G]), fr = Math.round(
|
|
1313
|
+
}, [G]), fr = Math.round(P * .2), pr = P - fr * 2, mr = Math.max(Math.round(P * .4), 12), hr = mr * Math.SQRT2 / 2, gr = pr, _r = fr, vr = Math.max(3, Math.round(P * .13)), yr = P - vr - 1, br = "rgba(100, 116, 139, 0.35)", xr = "rgba(100, 116, 139, 0.6)", Sr = (e) => {
|
|
1314
1314
|
let t = G[e.sourceIndex], n = G[e.targetIndex];
|
|
1315
1315
|
if (!t || !n) return null;
|
|
1316
|
-
let r = ur(t), i = ur(n), a = (e) => e.isSummary ? _r + gr / 2 :
|
|
1316
|
+
let r = ur(t), i = ur(n), a = (e) => e.isSummary ? _r + gr / 2 : P / 2, o = e.sourceIndex * P + a(t), s = e.targetIndex * P + a(n), c = e.type === "fs" || e.type === "ff", l = e.type === "ff" || e.type === "sf", u = t.isMilestone ? r.left + (c ? hr : -hr) : c ? r.left + r.width : r.left, d = n.isMilestone ? i.left + (l ? hr : -hr) : l ? i.left + i.width : i.left, f = u + (c ? 10 : -10), p = d + (l ? 10 : -10), m = Math.round, h = [`M ${m(u)} ${m(o)}`, `L ${m(f)} ${m(o)}`];
|
|
1317
1317
|
if (l ? f >= p : f <= p) h.push(`L ${m(f)} ${m(s)}`, `L ${m(d)} ${m(s)}`);
|
|
1318
1318
|
else {
|
|
1319
|
-
let t = s >= o ? (e.sourceIndex + 1) *
|
|
1319
|
+
let t = s >= o ? (e.sourceIndex + 1) * P : e.sourceIndex * P;
|
|
1320
1320
|
h.push(`L ${m(f)} ${m(t)}`, `L ${m(p)} ${m(t)}`, `L ${m(p)} ${m(s)}`, `L ${m(d)} ${m(s)}`);
|
|
1321
1321
|
}
|
|
1322
1322
|
return h.join(" ");
|
|
1323
|
-
}, Cr = H?.taskId ?? xt, [wr, Tr] = e.useState(ee), Er = e.useMemo(() => wr ?
|
|
1323
|
+
}, Cr = H?.taskId ?? xt, [wr, Tr] = e.useState(ee), Er = e.useMemo(() => wr ? Ie(t, _) : null, [
|
|
1324
1324
|
wr,
|
|
1325
1325
|
t,
|
|
1326
1326
|
_
|
|
1327
1327
|
]), Dr = e.useCallback((e) => Er?.criticalIds.has(String(e)) ?? !1, [Er]), $ = "#dc2626", Or = e.useCallback(() => {
|
|
1328
|
-
if (!
|
|
1329
|
-
let e =
|
|
1328
|
+
if (!A) return;
|
|
1329
|
+
let e = Le(t, _), n = [];
|
|
1330
1330
|
for (let r of e) {
|
|
1331
1331
|
let e = t.find((e) => String(e.id) === r.id);
|
|
1332
1332
|
e && n.push({
|
|
@@ -1340,7 +1340,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1340
1340
|
Ft(n);
|
|
1341
1341
|
}, [
|
|
1342
1342
|
t,
|
|
1343
|
-
|
|
1343
|
+
A,
|
|
1344
1344
|
_,
|
|
1345
1345
|
Ft
|
|
1346
1346
|
]), kr = e.useCallback(() => {
|
|
@@ -1350,25 +1350,25 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1350
1350
|
"<": "<",
|
|
1351
1351
|
">": ">",
|
|
1352
1352
|
"\"": """
|
|
1353
|
-
})[e]), n = Math.max(z, 200), r = Math.ceil(n + bn), i = Math.ceil(36 + G.length *
|
|
1353
|
+
})[e]), n = Math.max(z, 200), r = Math.ceil(n + bn), i = Math.ceil(36 + G.length * P), a = Er?.criticalEdges ?? null, o = [];
|
|
1354
1354
|
o.push(`<rect x="0" y="0" width="${r}" height="${i}" fill="#ffffff"/>`), o.push(`<rect x="0" y="0" width="${r}" height="36" fill="#f8fafc"/>`), o.push(`<g transform="translate(${n},0)" font-family="sans-serif" font-size="10" fill="#475569">`), Dn.forEach((t) => {
|
|
1355
1355
|
o.push(`<line x1="${t.offset.toFixed(1)}" y1="0" x2="${t.offset.toFixed(1)}" y2="36" stroke="#e2e8f0"/>`), o.push(`<text x="${(t.offset + t.width / 2).toFixed(1)}" y="12" text-anchor="middle" font-weight="600">${e(t.label)}</text>`);
|
|
1356
1356
|
}), q.forEach((t, n) => {
|
|
1357
1357
|
let r = J[n];
|
|
1358
1358
|
o.push(`<line x1="${r.toFixed(1)}" y1="18" x2="${r.toFixed(1)}" y2="${i}" stroke="#eef2f7"/>`), o.push(`<text x="${(r + t.width / 2).toFixed(1)}" y="30" text-anchor="middle" fill="#1f2937">${e(t.label)}</text>`);
|
|
1359
1359
|
}), o.push("</g>"), o.push(`<line x1="0" y1="18" x2="${r}" y2="18" stroke="#e2e8f0"/>`), o.push(`<line x1="0" y1="36" x2="${r}" y2="36" stroke="#cbd5e1"/>`), o.push(`<line x1="${n}" y1="0" x2="${n}" y2="${i}" stroke="#cbd5e1"/>`), o.push("<g transform=\"translate(0,36)\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#1f2937\">"), G.forEach((t, r) => {
|
|
1360
|
-
let i = r *
|
|
1361
|
-
o.push(`<line x1="0" y1="${(i +
|
|
1360
|
+
let i = r * P;
|
|
1361
|
+
o.push(`<line x1="0" y1="${(i + P).toFixed(1)}" x2="${n}" y2="${(i + P).toFixed(1)}" stroke="#f1f5f9"/>`);
|
|
1362
1362
|
let a = 8 + t.depth * 14, s = Math.max(4, Math.floor((n - a) / 6.5)), c = t.task.title.length > s ? t.task.title.slice(0, s - 1) + "…" : t.task.title, l = t.isSummary ? " font-weight=\"600\"" : "";
|
|
1363
|
-
o.push(`<text x="${a}" y="${(i +
|
|
1363
|
+
o.push(`<text x="${a}" y="${(i + P / 2 + 4).toFixed(1)}"${l}>${e(c)}</text>`);
|
|
1364
1364
|
}), o.push("</g>"), o.push(`<g transform="translate(${n},36)" font-family="sans-serif" font-size="9">`), G.forEach((e, t) => {
|
|
1365
|
-
let n = t *
|
|
1365
|
+
let n = t * P, { left: r, width: i } = or(e.start, e.end), a = Dr(e.task.id), s = a ? ` stroke="${$}" stroke-width="2"` : "";
|
|
1366
1366
|
if (te && e.task.baselineStart && e.task.baselineEnd) {
|
|
1367
1367
|
let t = or(e.task.baselineStart, e.task.baselineEnd);
|
|
1368
1368
|
o.push(`<rect x="${t.left.toFixed(1)}" y="${(n + yr).toFixed(1)}" width="${Math.max(2, t.width).toFixed(1)}" height="${vr}" rx="1" fill="${br}" stroke="${xr}"/>`);
|
|
1369
1369
|
}
|
|
1370
1370
|
if (e.isMilestone) {
|
|
1371
|
-
let t = r, i = n +
|
|
1371
|
+
let t = r, i = n + P / 2, s = mr / 2, c = a ? $ : e.task.color || "#3b82f6";
|
|
1372
1372
|
o.push(`<polygon points="${t},${i - s} ${t + s},${i} ${t},${i + s} ${t - s},${i}" fill="${c}"/>`);
|
|
1373
1373
|
} else if (e.isSummary) {
|
|
1374
1374
|
let t = e.task.color || "#64748b";
|
|
@@ -1379,15 +1379,15 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1379
1379
|
let t = e.task.color || "#3b82f6";
|
|
1380
1380
|
o.push(`<rect x="${r.toFixed(1)}" y="${(n + fr).toFixed(1)}" width="${i.toFixed(1)}" height="${pr}" rx="3" fill="${t}"${s}/>`);
|
|
1381
1381
|
let a = i * Math.min(100, Math.max(0, e.progress)) / 100;
|
|
1382
|
-
o.push(`<rect x="${r.toFixed(1)}" y="${(n + fr).toFixed(1)}" width="${a.toFixed(1)}" height="${pr}" rx="3" fill="rgba(0,0,0,0.18)"/>`), i >= 24 && o.push(`<text x="${(r + i / 2).toFixed(1)}" y="${(n +
|
|
1382
|
+
o.push(`<rect x="${r.toFixed(1)}" y="${(n + fr).toFixed(1)}" width="${a.toFixed(1)}" height="${pr}" rx="3" fill="rgba(0,0,0,0.18)"/>`), i >= 24 && o.push(`<text x="${(r + i / 2).toFixed(1)}" y="${(n + P / 2 + 3).toFixed(1)}" text-anchor="middle" fill="#ffffff">${Math.round(e.progress)}%</text>`);
|
|
1383
1383
|
}
|
|
1384
1384
|
}), dr.forEach((e) => {
|
|
1385
1385
|
let t = Sr(e);
|
|
1386
1386
|
if (!t) return;
|
|
1387
1387
|
let n = a?.has(`${String(e.sourceId)}->${String(e.targetId)}`) ?? !1, r = n ? $ : "#94a3b8";
|
|
1388
1388
|
o.push(`<path d="${t}" fill="none" stroke="${r}" stroke-width="${n ? 2 : 1.5}"/>`);
|
|
1389
|
-
}), Q != null && o.push(`<line x1="${Q.toFixed(1)}" y1="0" x2="${Q.toFixed(1)}" y2="${G.length *
|
|
1390
|
-
let s = G.length *
|
|
1389
|
+
}), Q != null && o.push(`<line x1="${Q.toFixed(1)}" y1="0" x2="${Q.toFixed(1)}" y2="${G.length * P}" stroke="#ef4444" stroke-width="1.5"/>`);
|
|
1390
|
+
let s = G.length * P;
|
|
1391
1391
|
return On.forEach((t) => {
|
|
1392
1392
|
let n = /var\(/.test(t.color) ? "#6366f1" : t.color;
|
|
1393
1393
|
if (o.push(`<line x1="${t.left.toFixed(1)}" y1="0" x2="${t.left.toFixed(1)}" y2="${s}" stroke="${e(n)}" stroke-width="1.5"/>`), t.label) {
|
|
@@ -1411,7 +1411,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1411
1411
|
J,
|
|
1412
1412
|
bn,
|
|
1413
1413
|
z,
|
|
1414
|
-
|
|
1414
|
+
P,
|
|
1415
1415
|
fr,
|
|
1416
1416
|
pr,
|
|
1417
1417
|
_r,
|
|
@@ -1429,15 +1429,15 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1429
1429
|
]), Ar = e.useCallback(async () => {
|
|
1430
1430
|
let e = kr();
|
|
1431
1431
|
if (!e) return;
|
|
1432
|
-
let t = await
|
|
1432
|
+
let t = await tt(e.svg, e.W, e.H);
|
|
1433
1433
|
t && t.toBlob((e) => {
|
|
1434
|
-
e &&
|
|
1434
|
+
e && nt(e, `gantt-${L}.png`);
|
|
1435
1435
|
}, "image/png");
|
|
1436
1436
|
}, [kr, L]), jr = e.useCallback(async () => {
|
|
1437
1437
|
let e = kr();
|
|
1438
1438
|
if (!e) return;
|
|
1439
|
-
let t = await
|
|
1440
|
-
t &&
|
|
1439
|
+
let t = await tt(e.svg, e.W, e.H);
|
|
1440
|
+
t && nt(rt(it(t.toDataURL("image/jpeg", .92)), t.width, t.height), `gantt-${L}.pdf`);
|
|
1441
1441
|
}, [kr, L]), [Mr, Nr] = e.useState(!1), Pr = e.useCallback(() => {
|
|
1442
1442
|
let e = {
|
|
1443
1443
|
viewMode: L,
|
|
@@ -1459,10 +1459,10 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1459
1459
|
let e = setTimeout(() => Nr(!1), 1500);
|
|
1460
1460
|
return () => clearTimeout(e);
|
|
1461
1461
|
}, [Mr]), /* @__PURE__ */ D("div", {
|
|
1462
|
-
ref:
|
|
1462
|
+
ref: pe,
|
|
1463
1463
|
className: b("flex flex-col h-full bg-background overflow-hidden min-w-0", p),
|
|
1464
|
-
"data-readonly":
|
|
1465
|
-
"data-mobile-readonly": re &&
|
|
1464
|
+
"data-readonly": k ? "true" : void 0,
|
|
1465
|
+
"data-mobile-readonly": re && O ? "true" : void 0,
|
|
1466
1466
|
children: [
|
|
1467
1467
|
/* @__PURE__ */ E("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-locate-btn { opacity: 0; transition: opacity 0.15s ease; }\n .group\\/task-row:hover .gantt-locate-btn { opacity: 0.6; }\n .gantt-locate-btn:hover, .gantt-locate-btn:focus-visible { opacity: 1; }\n /* 定位闪烁: 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 /* Persistent, grabbable timeline scrollbars. macOS (and iOS) default to\n overlay scrollbars that collapse to 0px and auto-hide, so the\n timeline's vertical scrollbar was nearly impossible to find. Defining\n ::-webkit-scrollbar opts this pane into a classic, always-visible bar\n regardless of the OS overlay preference. The thumb gets a min size so\n that with thousands of virtualized rows (scrollHeight in the hundreds\n of thousands of px) it never shrinks to an un-grabbable sliver. Scoped\n to the gantt pane so the host app's own scrollbars are untouched, and\n themed with neutral rgba (not theme utilities, which don't always\n reach a consuming app) so it's visible on any background. */\n /* Firefox (and any engine without ::-webkit-scrollbar) only: the\n standard props. We must NOT set these unconditionally — modern Chrome\n now honors scrollbar-width and, when it's present, IGNORES the\n ::-webkit-scrollbar rule below, falling back to the 0px auto-hiding\n overlay bar we're trying to replace. */\n @supports not selector(::-webkit-scrollbar) {\n [data-testid=\"gantt-timeline\"] {\n scrollbar-width: thin;\n scrollbar-color: rgba(130,130,130,0.55) transparent;\n }\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar {\n width: 14px;\n height: 14px;\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar-track {\n background: transparent;\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar-thumb {\n background-color: rgba(130,130,130,0.55);\n border-radius: 8px;\n border: 3px solid transparent;\n background-clip: padding-box;\n min-height: 40px;\n min-width: 40px;\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar-thumb:hover {\n background-color: rgba(110,110,110,0.85);\n }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar-corner {\n background: transparent;\n }\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 " }),
|
|
1468
1468
|
/* @__PURE__ */ D("div", {
|
|
@@ -1475,7 +1475,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1475
1475
|
size: "icon",
|
|
1476
1476
|
className: "h-8 w-8",
|
|
1477
1477
|
"aria-label": x("gantt.toolbar.prevPeriod"),
|
|
1478
|
-
children: /* @__PURE__ */ E(
|
|
1478
|
+
children: /* @__PURE__ */ E(ge, { className: "h-4 w-4" })
|
|
1479
1479
|
}),
|
|
1480
1480
|
/* @__PURE__ */ E(y, {
|
|
1481
1481
|
variant: "ghost",
|
|
@@ -1491,7 +1491,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1491
1491
|
year: "numeric"
|
|
1492
1492
|
})
|
|
1493
1493
|
}),
|
|
1494
|
-
|
|
1494
|
+
k && /* @__PURE__ */ D("span", {
|
|
1495
1495
|
className: "inline-flex items-center gap-1 rounded-full border bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground",
|
|
1496
1496
|
"data-testid": "gantt-readonly-badge",
|
|
1497
1497
|
title: x("gantt.readOnlyHint"),
|
|
@@ -1505,7 +1505,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1505
1505
|
className: "flex bg-muted rounded-md p-1",
|
|
1506
1506
|
role: "group",
|
|
1507
1507
|
"aria-label": x("gantt.toolbar.viewMode"),
|
|
1508
|
-
children:
|
|
1508
|
+
children: Ye.map((e) => /* @__PURE__ */ E(y, {
|
|
1509
1509
|
variant: "ghost",
|
|
1510
1510
|
size: "sm",
|
|
1511
1511
|
className: b("h-6 px-1.5 sm:px-2 text-xs", L === e && "bg-background shadow-sm hover:bg-background"),
|
|
@@ -1522,27 +1522,27 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1522
1522
|
size: "icon",
|
|
1523
1523
|
className: "h-6 w-6",
|
|
1524
1524
|
onClick: () => {
|
|
1525
|
-
if (B > 15)
|
|
1525
|
+
if (B > 15) I(Math.max(15, B - 10));
|
|
1526
1526
|
else {
|
|
1527
|
-
let e =
|
|
1528
|
-
e <
|
|
1527
|
+
let e = Ye.indexOf(L);
|
|
1528
|
+
e < Ye.length - 1 && (wn(Ye[e + 1]), I(Re));
|
|
1529
1529
|
}
|
|
1530
1530
|
},
|
|
1531
1531
|
"aria-label": x("gantt.toolbar.zoomOut"),
|
|
1532
|
-
children: /* @__PURE__ */ E(
|
|
1532
|
+
children: /* @__PURE__ */ E(Oe, { className: "h-3 w-3" })
|
|
1533
1533
|
}), /* @__PURE__ */ E(y, {
|
|
1534
1534
|
variant: "ghost",
|
|
1535
1535
|
size: "icon",
|
|
1536
1536
|
className: "h-6 w-6",
|
|
1537
1537
|
onClick: () => {
|
|
1538
|
-
if (B < 120)
|
|
1538
|
+
if (B < 120) I(Math.min(120, B + 10));
|
|
1539
1539
|
else {
|
|
1540
|
-
let e =
|
|
1541
|
-
e > 0 && (wn(
|
|
1540
|
+
let e = Ye.indexOf(L);
|
|
1541
|
+
e > 0 && (wn(Ye[e - 1]), I(Re));
|
|
1542
1542
|
}
|
|
1543
1543
|
},
|
|
1544
1544
|
"aria-label": x("gantt.toolbar.zoomIn"),
|
|
1545
|
-
children: /* @__PURE__ */ E(
|
|
1545
|
+
children: /* @__PURE__ */ E(De, { className: "h-3 w-3" })
|
|
1546
1546
|
})]
|
|
1547
1547
|
}),
|
|
1548
1548
|
/* @__PURE__ */ E(y, {
|
|
@@ -1553,7 +1553,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1553
1553
|
"aria-label": x(R ? "gantt.toolbar.showTaskList" : "gantt.toolbar.hideTaskList"),
|
|
1554
1554
|
"aria-pressed": R,
|
|
1555
1555
|
"data-testid": "gantt-toggle-task-list",
|
|
1556
|
-
children: E(R ?
|
|
1556
|
+
children: E(R ? xe : Se, { className: "h-4 w-4" })
|
|
1557
1557
|
}),
|
|
1558
1558
|
/* @__PURE__ */ E(y, {
|
|
1559
1559
|
variant: "ghost",
|
|
@@ -1583,7 +1583,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1583
1583
|
"data-testid": "gantt-jump-month",
|
|
1584
1584
|
children: x("gantt.toolbar.thisMonth")
|
|
1585
1585
|
}),
|
|
1586
|
-
|
|
1586
|
+
A ? /* @__PURE__ */ D(ke, { children: [/* @__PURE__ */ E(y, {
|
|
1587
1587
|
variant: "ghost",
|
|
1588
1588
|
size: "icon",
|
|
1589
1589
|
className: "h-8 w-8",
|
|
@@ -1591,7 +1591,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1591
1591
|
disabled: !Ut,
|
|
1592
1592
|
"aria-label": x("gantt.toolbar.undo"),
|
|
1593
1593
|
"data-testid": "gantt-undo",
|
|
1594
|
-
children: /* @__PURE__ */ E(
|
|
1594
|
+
children: /* @__PURE__ */ E(Te, { className: "h-4 w-4" })
|
|
1595
1595
|
}), /* @__PURE__ */ E(y, {
|
|
1596
1596
|
variant: "ghost",
|
|
1597
1597
|
size: "icon",
|
|
@@ -1600,7 +1600,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1600
1600
|
disabled: !Wt,
|
|
1601
1601
|
"aria-label": x("gantt.toolbar.redo"),
|
|
1602
1602
|
"data-testid": "gantt-redo",
|
|
1603
|
-
children: /* @__PURE__ */ E(
|
|
1603
|
+
children: /* @__PURE__ */ E(Ce, { className: "h-4 w-4" })
|
|
1604
1604
|
})] }) : null,
|
|
1605
1605
|
/* @__PURE__ */ E(y, {
|
|
1606
1606
|
variant: "ghost",
|
|
@@ -1611,16 +1611,16 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1611
1611
|
"aria-pressed": wr,
|
|
1612
1612
|
"data-testid": "gantt-critical-path",
|
|
1613
1613
|
style: wr ? { color: $ } : void 0,
|
|
1614
|
-
children: /* @__PURE__ */ E(
|
|
1614
|
+
children: /* @__PURE__ */ E(me, { className: "h-4 w-4" })
|
|
1615
1615
|
}),
|
|
1616
|
-
|
|
1616
|
+
Fe && A ? /* @__PURE__ */ E(y, {
|
|
1617
1617
|
variant: "ghost",
|
|
1618
1618
|
size: "icon",
|
|
1619
1619
|
className: "h-8 w-8",
|
|
1620
1620
|
onClick: Or,
|
|
1621
1621
|
"aria-label": x("gantt.toolbar.autoSchedule"),
|
|
1622
1622
|
"data-testid": "gantt-auto-schedule",
|
|
1623
|
-
children: /* @__PURE__ */ E(
|
|
1623
|
+
children: /* @__PURE__ */ E(Ee, { className: "h-4 w-4" })
|
|
1624
1624
|
}) : null,
|
|
1625
1625
|
/* @__PURE__ */ E(y, {
|
|
1626
1626
|
variant: "ghost",
|
|
@@ -1629,7 +1629,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1629
1629
|
onClick: Ar,
|
|
1630
1630
|
"aria-label": x("gantt.toolbar.exportPng"),
|
|
1631
1631
|
"data-testid": "gantt-export-png",
|
|
1632
|
-
children: /* @__PURE__ */ E(
|
|
1632
|
+
children: /* @__PURE__ */ E(ve, { className: "h-4 w-4" })
|
|
1633
1633
|
}),
|
|
1634
1634
|
/* @__PURE__ */ E(y, {
|
|
1635
1635
|
variant: "ghost",
|
|
@@ -1638,7 +1638,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1638
1638
|
onClick: jr,
|
|
1639
1639
|
"aria-label": x("gantt.toolbar.exportPdf"),
|
|
1640
1640
|
"data-testid": "gantt-export-pdf",
|
|
1641
|
-
children: /* @__PURE__ */ E(
|
|
1641
|
+
children: /* @__PURE__ */ E(ye, { className: "h-4 w-4" })
|
|
1642
1642
|
}),
|
|
1643
1643
|
le || ce ? /* @__PURE__ */ E(y, {
|
|
1644
1644
|
variant: "ghost",
|
|
@@ -1649,7 +1649,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1649
1649
|
"aria-pressed": Mr,
|
|
1650
1650
|
"data-testid": "gantt-save-layout",
|
|
1651
1651
|
style: Mr ? { color: $ } : void 0,
|
|
1652
|
-
children: /* @__PURE__ */ E(
|
|
1652
|
+
children: /* @__PURE__ */ E(we, { className: "h-4 w-4" })
|
|
1653
1653
|
}) : null,
|
|
1654
1654
|
/* @__PURE__ */ E(y, {
|
|
1655
1655
|
variant: "ghost",
|
|
@@ -1659,7 +1659,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1659
1659
|
"aria-label": x(Gn ? "gantt.toolbar.exitFullscreen" : "gantt.toolbar.enterFullscreen"),
|
|
1660
1660
|
"aria-pressed": Gn,
|
|
1661
1661
|
"data-testid": "gantt-fullscreen",
|
|
1662
|
-
children: E(Gn ?
|
|
1662
|
+
children: E(Gn ? be : T, { className: "h-4 w-4" })
|
|
1663
1663
|
})
|
|
1664
1664
|
]
|
|
1665
1665
|
})]
|
|
@@ -1683,14 +1683,14 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1683
1683
|
onPointerDown: (e) => {
|
|
1684
1684
|
if (e.button !== 0) return;
|
|
1685
1685
|
e.preventDefault();
|
|
1686
|
-
let t = e.clientX, n = z, r = Math.max(160,
|
|
1687
|
-
|
|
1686
|
+
let t = e.clientX, n = z, r = Math.max(160, je - 200), i = (e) => {
|
|
1687
|
+
Ue(Math.max(160, Math.min(n + (e.clientX - t), r)));
|
|
1688
1688
|
}, a = () => {
|
|
1689
1689
|
window.removeEventListener("pointermove", i), window.removeEventListener("pointerup", a), window.removeEventListener("pointercancel", a), document.body.style.cursor = "";
|
|
1690
1690
|
};
|
|
1691
1691
|
document.body.style.cursor = "col-resize", window.addEventListener("pointermove", i), window.addEventListener("pointerup", a), window.addEventListener("pointercancel", a);
|
|
1692
1692
|
},
|
|
1693
|
-
onDoubleClick: () =>
|
|
1693
|
+
onDoubleClick: () => Ue(null),
|
|
1694
1694
|
children: /* @__PURE__ */ E("div", { className: "absolute inset-y-0 left-1/2 -translate-x-1/2 w-px bg-border group-hover/splitter:w-[3px] group-hover/splitter:bg-primary transition-all" })
|
|
1695
1695
|
}),
|
|
1696
1696
|
/* @__PURE__ */ D("div", {
|
|
@@ -1704,7 +1704,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1704
1704
|
children: [/* @__PURE__ */ E("div", {
|
|
1705
1705
|
className: "flex-1 truncate",
|
|
1706
1706
|
children: x("gantt.column.taskName")
|
|
1707
|
-
}), gt && /* @__PURE__ */ D(
|
|
1707
|
+
}), gt && /* @__PURE__ */ D(ke, { children: [/* @__PURE__ */ E("div", {
|
|
1708
1708
|
className: "w-16 gantt-sm-w20 text-right",
|
|
1709
1709
|
children: x("gantt.column.start")
|
|
1710
1710
|
}), /* @__PURE__ */ E("div", {
|
|
@@ -1771,41 +1771,41 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1771
1771
|
"aria-label": x("gantt.aria.taskList"),
|
|
1772
1772
|
children: [
|
|
1773
1773
|
Z.startIdx > 0 && /* @__PURE__ */ E("div", {
|
|
1774
|
-
style: { height: Z.startIdx *
|
|
1774
|
+
style: { height: Z.startIdx * P },
|
|
1775
1775
|
"aria-hidden": "true"
|
|
1776
1776
|
}),
|
|
1777
1777
|
G.slice(Z.startIdx, Z.endIdx).map((e) => {
|
|
1778
|
-
let t = e.task, n =
|
|
1778
|
+
let t = e.task, n = Pe && _t === t.id, r = fn.has(String(t.id)), i = sn != null && String(sn) === String(t.id);
|
|
1779
1779
|
return /* @__PURE__ */ D("div", {
|
|
1780
1780
|
className: b("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"),
|
|
1781
1781
|
style: {
|
|
1782
|
-
height:
|
|
1782
|
+
height: P,
|
|
1783
1783
|
touchAction: "manipulation"
|
|
1784
1784
|
},
|
|
1785
1785
|
role: "treeitem",
|
|
1786
1786
|
"aria-level": e.depth + 1,
|
|
1787
1787
|
"aria-selected": i,
|
|
1788
1788
|
"aria-expanded": e.hasChildren ? !r : void 0,
|
|
1789
|
-
draggable: !!
|
|
1790
|
-
onDragStart:
|
|
1789
|
+
draggable: !!M && !n && !t.locked,
|
|
1790
|
+
onDragStart: M ? (e) => {
|
|
1791
1791
|
e.dataTransfer.setData("text/plain", String(t.id)), e.dataTransfer.effectAllowed = "move";
|
|
1792
1792
|
} : void 0,
|
|
1793
|
-
onDragOver:
|
|
1793
|
+
onDragOver: M ? (e) => {
|
|
1794
1794
|
e.preventDefault(), e.dataTransfer.dropEffect = "move";
|
|
1795
1795
|
} : void 0,
|
|
1796
|
-
onDrop:
|
|
1796
|
+
onDrop: M ? (e) => {
|
|
1797
1797
|
e.preventDefault();
|
|
1798
1798
|
let n = e.dataTransfer.getData("text/plain");
|
|
1799
1799
|
if (!n || n === String(t.id)) return;
|
|
1800
1800
|
let r = wt.get(n);
|
|
1801
|
-
r && String(r.parent ?? "") === String(t.parent ?? "") &&
|
|
1801
|
+
r && String(r.parent ?? "") === String(t.parent ?? "") && M(r, t);
|
|
1802
1802
|
} : void 0,
|
|
1803
1803
|
onContextMenu: (e) => un(t, e),
|
|
1804
1804
|
onClick: () => {
|
|
1805
1805
|
cn(t.id), n || o?.(t);
|
|
1806
1806
|
},
|
|
1807
1807
|
onDoubleClick: () => {
|
|
1808
|
-
|
|
1808
|
+
Pe && A && !e.isSummary && !t.locked && (vt(t.id), bt({
|
|
1809
1809
|
title: t.title,
|
|
1810
1810
|
start: t.start.toLocaleDateString("en-CA"),
|
|
1811
1811
|
end: t.end.toLocaleDateString("en-CA"),
|
|
@@ -1827,7 +1827,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1827
1827
|
"aria-expanded": !r,
|
|
1828
1828
|
"aria-label": x(r ? "gantt.row.expand" : "gantt.row.collapse"),
|
|
1829
1829
|
"data-testid": `gantt-row-toggle-${t.id}`,
|
|
1830
|
-
children: E(r ? C :
|
|
1830
|
+
children: E(r ? C : he, { className: "h-3.5 w-3.5" })
|
|
1831
1831
|
}) : /* @__PURE__ */ E("span", {
|
|
1832
1832
|
className: "w-3 shrink-0",
|
|
1833
1833
|
style: { marginLeft: -4 },
|
|
@@ -1924,13 +1924,13 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
1924
1924
|
onClick: (t) => {
|
|
1925
1925
|
t.stopPropagation(), tr(e.start, e.end, e.task.id);
|
|
1926
1926
|
},
|
|
1927
|
-
children: /* @__PURE__ */ E(
|
|
1927
|
+
children: /* @__PURE__ */ E(_e, { className: "w-3 h-3" })
|
|
1928
1928
|
})
|
|
1929
1929
|
]
|
|
1930
1930
|
}, t.id);
|
|
1931
1931
|
}),
|
|
1932
1932
|
Z.endIdx < G.length && /* @__PURE__ */ E("div", {
|
|
1933
|
-
style: { height: (G.length - Z.endIdx) *
|
|
1933
|
+
style: { height: (G.length - Z.endIdx) * P },
|
|
1934
1934
|
"aria-hidden": "true"
|
|
1935
1935
|
})
|
|
1936
1936
|
]
|
|
@@ -2020,7 +2020,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2020
2020
|
})
|
|
2021
2021
|
}),
|
|
2022
2022
|
Z.startIdx > 0 && /* @__PURE__ */ E("div", {
|
|
2023
|
-
style: { height: Z.startIdx *
|
|
2023
|
+
style: { height: Z.startIdx * P },
|
|
2024
2024
|
"aria-hidden": "true"
|
|
2025
2025
|
}),
|
|
2026
2026
|
G.slice(Z.startIdx, Z.endIdx).map((t) => {
|
|
@@ -2036,7 +2036,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2036
2036
|
},
|
|
2037
2037
|
"data-testid": `gantt-baseline-${n.id}`,
|
|
2038
2038
|
"aria-hidden": "true"
|
|
2039
|
-
}) : null, c = H?.taskId === n.id, l = cr?.has(String(n.id)) ?? !1, u = lr?.has(String(n.id)) ?? !1, d = c || l || u ? ur(t) : i, f = !!n.locked, p = !!
|
|
2039
|
+
}) : null, c = H?.taskId === n.id, l = cr?.has(String(n.id)) ?? !1, u = lr?.has(String(n.id)) ?? !1, d = c || l || u ? ur(t) : i, f = !!n.locked, p = !!A && !t.isSummary && !f, m = U != null && U.targetId != null && String(U.targetId) === String(n.id) && String(U.sourceId) !== String(n.id), h = U ? (e) => {
|
|
2040
2040
|
let t = e.currentTarget.getBoundingClientRect(), r = t.width > 0 && e.clientX - t.left > t.width / 2 ? "end" : "start";
|
|
2041
2041
|
Xt((e) => e && String(e.sourceId) !== String(n.id) ? {
|
|
2042
2042
|
...e,
|
|
@@ -2049,11 +2049,11 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2049
2049
|
targetId: null,
|
|
2050
2050
|
targetEnd: null
|
|
2051
2051
|
});
|
|
2052
|
-
} : void 0, ee = Math.max(1, Math.round((t.end.getTime() - t.start.getTime()) /
|
|
2052
|
+
} : void 0, ee = Math.max(1, Math.round((t.end.getTime() - t.start.getTime()) / Ze)), _ = xt === n.id && !H && !Kt && !U ? /* @__PURE__ */ D("div", {
|
|
2053
2053
|
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",
|
|
2054
2054
|
style: {
|
|
2055
2055
|
left: Math.max(d.left + 8, 4),
|
|
2056
|
-
top:
|
|
2056
|
+
top: P - 8
|
|
2057
2057
|
},
|
|
2058
2058
|
role: "tooltip",
|
|
2059
2059
|
"data-testid": `gantt-tooltip-${n.id}`,
|
|
@@ -2098,7 +2098,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2098
2098
|
}) : null;
|
|
2099
2099
|
if (n.type === "group") return /* @__PURE__ */ E("div", {
|
|
2100
2100
|
className: "relative border-b hover:bg-accent/50",
|
|
2101
|
-
style: { height:
|
|
2101
|
+
style: { height: P },
|
|
2102
2102
|
onPointerMove: g,
|
|
2103
2103
|
children: _
|
|
2104
2104
|
}, n.id);
|
|
@@ -2106,12 +2106,12 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2106
2106
|
let e = n.color || "#0d9488";
|
|
2107
2107
|
return /* @__PURE__ */ D("div", {
|
|
2108
2108
|
className: "relative border-b hover:bg-accent/50",
|
|
2109
|
-
style: { height:
|
|
2109
|
+
style: { height: P },
|
|
2110
2110
|
onPointerMove: g,
|
|
2111
2111
|
children: [
|
|
2112
2112
|
s,
|
|
2113
2113
|
/* @__PURE__ */ D("div", {
|
|
2114
|
-
className: b("gantt-bar-hover absolute rounded-sm border shadow-sm flex items-center px-2 select-none",
|
|
2114
|
+
className: b("gantt-bar-hover absolute rounded-sm border shadow-sm flex items-center px-2 select-none", A ? "cursor-grab active:cursor-grabbing" : "cursor-pointer", c && "ring-2 ring-primary z-10", Mn === n.id && "gantt-flash z-10"),
|
|
2115
2115
|
style: {
|
|
2116
2116
|
left: d.left,
|
|
2117
2117
|
width: d.width,
|
|
@@ -2177,7 +2177,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2177
2177
|
let e = mr;
|
|
2178
2178
|
return /* @__PURE__ */ D("div", {
|
|
2179
2179
|
className: "relative border-b hover:bg-accent/50",
|
|
2180
|
-
style: { height:
|
|
2180
|
+
style: { height: P },
|
|
2181
2181
|
onPointerMove: g,
|
|
2182
2182
|
children: [
|
|
2183
2183
|
s,
|
|
@@ -2185,7 +2185,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2185
2185
|
className: b("gantt-bar-hover absolute rotate-45 rounded-[2px] border shadow-sm select-none", p ? "cursor-grab active:cursor-grabbing" : "cursor-pointer", c && "ring-2 ring-primary z-10", m && "ring-2 ring-primary", Mn === n.id && "gantt-flash z-10"),
|
|
2186
2186
|
style: {
|
|
2187
2187
|
left: d.left - e / 2,
|
|
2188
|
-
top: (
|
|
2188
|
+
top: (P - e) / 2,
|
|
2189
2189
|
width: e,
|
|
2190
2190
|
height: e,
|
|
2191
2191
|
backgroundColor: r ? $ : n.color || "#3b82f6",
|
|
@@ -2212,7 +2212,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2212
2212
|
let v = Kt && Kt.taskId === n.id ? Kt.value : n.progress;
|
|
2213
2213
|
return /* @__PURE__ */ D("div", {
|
|
2214
2214
|
className: "relative border-b hover:bg-accent/50",
|
|
2215
|
-
style: { height:
|
|
2215
|
+
style: { height: P },
|
|
2216
2216
|
onPointerMove: g,
|
|
2217
2217
|
onMouseEnter: () => St(n.id),
|
|
2218
2218
|
onMouseLeave: () => St((e) => e === n.id ? null : e),
|
|
@@ -2252,7 +2252,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2252
2252
|
e.button === 0 && Gt(n, "move", e);
|
|
2253
2253
|
} : void 0,
|
|
2254
2254
|
children: [
|
|
2255
|
-
p && d.width >= 14 && /* @__PURE__ */ D(
|
|
2255
|
+
p && d.width >= 14 && /* @__PURE__ */ D(ke, { children: [/* @__PURE__ */ E("div", {
|
|
2256
2256
|
className: "gantt-resize-handle absolute left-0 top-0 bottom-0",
|
|
2257
2257
|
style: {
|
|
2258
2258
|
width: 6,
|
|
@@ -2307,7 +2307,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2307
2307
|
filter: "drop-shadow(0 1px 1px rgba(0, 0, 0, 0.35))"
|
|
2308
2308
|
} })
|
|
2309
2309
|
}),
|
|
2310
|
-
|
|
2310
|
+
j && !f && ["start", "end"].map((e) => {
|
|
2311
2311
|
let t = U != null && String(U.sourceId) === String(n.id) && U.sourceEnd === e, r = t || xt === n.id, i = r && U == null;
|
|
2312
2312
|
return /* @__PURE__ */ E("div", {
|
|
2313
2313
|
className: "absolute top-1/2 -translate-y-1/2 z-20 flex items-center transition-opacity",
|
|
@@ -2370,7 +2370,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2370
2370
|
}, n.id);
|
|
2371
2371
|
}),
|
|
2372
2372
|
Z.endIdx < G.length && /* @__PURE__ */ E("div", {
|
|
2373
|
-
style: { height: (G.length - Z.endIdx) *
|
|
2373
|
+
style: { height: (G.length - Z.endIdx) * P },
|
|
2374
2374
|
"aria-hidden": "true"
|
|
2375
2375
|
}),
|
|
2376
2376
|
(dr.length > 0 || U) && /* @__PURE__ */ D("svg", {
|
|
@@ -2426,7 +2426,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2426
2426
|
if (Math.max(t.sourceIndex, t.targetIndex) < Z.startIdx - 6 || n > Z.endIdx + 6) return null;
|
|
2427
2427
|
let r = Sr(t);
|
|
2428
2428
|
if (!r) return null;
|
|
2429
|
-
let i = Cr != null && (String(t.sourceId) === String(Cr) || String(t.targetId) === String(Cr)), a = Er?.criticalEdges.has(`${String(t.sourceId)}->${String(t.targetId)}`) ?? !1, o = a ? "gantt-link-arrow-critical" : i ? "gantt-link-arrow-active" : "gantt-link-arrow", s = !!(
|
|
2429
|
+
let i = Cr != null && (String(t.sourceId) === String(Cr) || String(t.targetId) === String(Cr)), a = Er?.criticalEdges.has(`${String(t.sourceId)}->${String(t.targetId)}`) ?? !1, o = a ? "gantt-link-arrow-critical" : i ? "gantt-link-arrow-active" : "gantt-link-arrow", s = !!(Ne || j);
|
|
2430
2430
|
return /* @__PURE__ */ D(e.Fragment, { children: [/* @__PURE__ */ E("path", {
|
|
2431
2431
|
d: r,
|
|
2432
2432
|
fill: "none",
|
|
@@ -2454,7 +2454,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2454
2454
|
U && (() => {
|
|
2455
2455
|
let e = G.findIndex((e) => String(e.task.id) === String(U.sourceId));
|
|
2456
2456
|
if (e < 0) return null;
|
|
2457
|
-
let t = ur(G[e]), n = G[e].isMilestone ? t.left + (U.sourceEnd === "start" ? -hr : hr) : U.sourceEnd === "start" ? t.left : t.left + t.width, r = e *
|
|
2457
|
+
let t = ur(G[e]), n = G[e].isMilestone ? t.left + (U.sourceEnd === "start" ? -hr : hr) : U.sourceEnd === "start" ? t.left : t.left + t.width, r = e * P + P / 2;
|
|
2458
2458
|
return /* @__PURE__ */ E("path", {
|
|
2459
2459
|
d: `M ${Math.round(n)} ${Math.round(r)} L ${Math.round(U.x)} ${Math.round(U.y)}`,
|
|
2460
2460
|
fill: "none",
|
|
@@ -2512,7 +2512,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2512
2512
|
},
|
|
2513
2513
|
children: x("gantt.menu.view")
|
|
2514
2514
|
}),
|
|
2515
|
-
|
|
2515
|
+
Pe && A && n && !n.isSummary && !e.locked && /* @__PURE__ */ E("button", {
|
|
2516
2516
|
type: "button",
|
|
2517
2517
|
role: "menuitem",
|
|
2518
2518
|
className: r,
|
|
@@ -2527,7 +2527,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2527
2527
|
},
|
|
2528
2528
|
children: x("gantt.menu.edit")
|
|
2529
2529
|
}),
|
|
2530
|
-
|
|
2530
|
+
j && n && !n.isMilestone && !e.locked && /* @__PURE__ */ D(ke, { children: [/* @__PURE__ */ E("button", {
|
|
2531
2531
|
type: "button",
|
|
2532
2532
|
role: "menuitem",
|
|
2533
2533
|
className: r,
|
|
@@ -2558,13 +2558,13 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2558
2558
|
},
|
|
2559
2559
|
children: x("gantt.menu.addSuccessor")
|
|
2560
2560
|
})] }),
|
|
2561
|
-
|
|
2561
|
+
Me && !e.locked && /* @__PURE__ */ E("button", {
|
|
2562
2562
|
type: "button",
|
|
2563
2563
|
role: "menuitem",
|
|
2564
2564
|
className: b(r, "text-destructive"),
|
|
2565
2565
|
"data-testid": "gantt-context-menu-delete",
|
|
2566
2566
|
onClick: () => {
|
|
2567
|
-
$t(null),
|
|
2567
|
+
$t(null), Me(e);
|
|
2568
2568
|
},
|
|
2569
2569
|
children: x("gantt.menu.delete")
|
|
2570
2570
|
})
|
|
@@ -2593,7 +2593,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2593
2593
|
n.title
|
|
2594
2594
|
]
|
|
2595
2595
|
}),
|
|
2596
|
-
|
|
2596
|
+
j && [
|
|
2597
2597
|
"fs",
|
|
2598
2598
|
"ss",
|
|
2599
2599
|
"ff",
|
|
@@ -2605,24 +2605,24 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2605
2605
|
className: b(r, W.type === t && "font-semibold"),
|
|
2606
2606
|
"data-testid": `gantt-link-menu-type-${t}`,
|
|
2607
2607
|
onClick: () => {
|
|
2608
|
-
tn(null), t !== W.type &&
|
|
2608
|
+
tn(null), t !== W.type && j(e, n, t);
|
|
2609
2609
|
},
|
|
2610
2610
|
children: [W.type === t ? "✓ " : "\xA0\xA0", x(`gantt.linkType.${t}`)]
|
|
2611
2611
|
}, t)),
|
|
2612
|
-
|
|
2612
|
+
Ne && /* @__PURE__ */ D(ke, { children: [/* @__PURE__ */ E("div", { className: "my-1 border-t" }), /* @__PURE__ */ E("button", {
|
|
2613
2613
|
type: "button",
|
|
2614
2614
|
role: "menuitem",
|
|
2615
2615
|
className: b(r, "text-destructive"),
|
|
2616
2616
|
"data-testid": "gantt-link-menu-remove",
|
|
2617
2617
|
onClick: () => {
|
|
2618
|
-
tn(null),
|
|
2618
|
+
tn(null), Ne(e, n);
|
|
2619
2619
|
},
|
|
2620
2620
|
children: x("gantt.menu.removeDependency")
|
|
2621
2621
|
})] })
|
|
2622
2622
|
]
|
|
2623
2623
|
});
|
|
2624
2624
|
})(),
|
|
2625
|
-
rn &&
|
|
2625
|
+
rn && j && (() => {
|
|
2626
2626
|
let e = t.find((e) => String(e.id) === String(rn.taskId));
|
|
2627
2627
|
if (!e) return null;
|
|
2628
2628
|
let n = new Set(dr.map((e) => `${String(e.sourceId)}->${String(e.targetId)}`)), r = t.filter((t) => {
|
|
@@ -2651,7 +2651,7 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2651
2651
|
className: "w-full text-left px-3 py-1.5 hover:bg-accent focus:bg-accent outline-none truncate",
|
|
2652
2652
|
"data-testid": `gantt-dep-picker-option-${t.id}`,
|
|
2653
2653
|
onClick: () => {
|
|
2654
|
-
an(null), rn.relation === "pred" ?
|
|
2654
|
+
an(null), rn.relation === "pred" ? j(t, e, "fs") : j(e, t, "fs");
|
|
2655
2655
|
},
|
|
2656
2656
|
children: t.title
|
|
2657
2657
|
}, String(t.id)))]
|
|
@@ -2701,10 +2701,10 @@ function L({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTask
|
|
|
2701
2701
|
}
|
|
2702
2702
|
//#endregion
|
|
2703
2703
|
//#region src/workload.ts
|
|
2704
|
-
function
|
|
2704
|
+
function ct(e, t, n, r) {
|
|
2705
2705
|
return t.getTime() === e.getTime() ? e.getTime() >= n.getTime() && e.getTime() < r.getTime() : e.getTime() < r.getTime() && t.getTime() > n.getTime();
|
|
2706
2706
|
}
|
|
2707
|
-
function
|
|
2707
|
+
function lt(e, t, n) {
|
|
2708
2708
|
let { assignee: r, effort: i, capacity: a = 1, unassignedLabel: o = "Unassigned" } = n, s = (e) => typeof a == "function" ? a(e) : a, c = (e) => {
|
|
2709
2709
|
let t = i ? i(e) : 1;
|
|
2710
2710
|
return Number.isFinite(t) && t > 0 ? t : 0;
|
|
@@ -2721,7 +2721,7 @@ function ct(e, t, n) {
|
|
|
2721
2721
|
for (let e of l.values()) {
|
|
2722
2722
|
let n = s(e.key), r = 0, i = 0, a = t.map((t) => {
|
|
2723
2723
|
let a = 0;
|
|
2724
|
-
for (let n of e.items)
|
|
2724
|
+
for (let n of e.items) ct(n.start, n.end, t.start, t.end) && (a += c(n));
|
|
2725
2725
|
a > r && (r = a);
|
|
2726
2726
|
let o = a > n + 1e-9;
|
|
2727
2727
|
return o && i++, {
|
|
@@ -2743,32 +2743,32 @@ function ct(e, t, n) {
|
|
|
2743
2743
|
}
|
|
2744
2744
|
//#endregion
|
|
2745
2745
|
//#region src/ResourceWorkload.tsx
|
|
2746
|
-
var
|
|
2746
|
+
var ut = {
|
|
2747
2747
|
day: 26,
|
|
2748
2748
|
week: 56,
|
|
2749
2749
|
month: 76,
|
|
2750
2750
|
quarter: 88,
|
|
2751
2751
|
year: 104
|
|
2752
|
-
},
|
|
2753
|
-
function
|
|
2752
|
+
}, R = 48, dt = 34, ft = 180;
|
|
2753
|
+
function pt(e, t, n) {
|
|
2754
2754
|
return t === "day" ? String(e.getDate()) : t === "week" ? e.toLocaleDateString(n, {
|
|
2755
2755
|
month: "numeric",
|
|
2756
2756
|
day: "numeric"
|
|
2757
2757
|
}) : t === "month" ? e.toLocaleDateString(n, { month: "short" }) : t === "year" ? String(e.getFullYear()) : `Q${Math.floor(e.getMonth() / 3) + 1}`;
|
|
2758
2758
|
}
|
|
2759
|
-
function
|
|
2760
|
-
let { t: c, language: l } =
|
|
2759
|
+
function z({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "day", unassignedLabel: o = "Unassigned", className: s }) {
|
|
2760
|
+
let { t: c, language: l } = We(), u = l || void 0, d = ut[a], f = e.useMemo(() => {
|
|
2761
2761
|
if (!t.length) return [];
|
|
2762
|
-
let e = new Date(Math.min(...t.map((e) => e.start.getTime()))), n = new Date(Math.max(...t.map((e) => e.end.getTime()))), r =
|
|
2762
|
+
let e = new Date(Math.min(...t.map((e) => e.start.getTime()))), n = new Date(Math.max(...t.map((e) => e.end.getTime()))), r = Qe(e, a), i = et(Qe(n, a), 1, a), o = [], s = 0;
|
|
2763
2763
|
for (; r < i && s++ < 4e3;) {
|
|
2764
|
-
let e =
|
|
2764
|
+
let e = et(r, 1, a);
|
|
2765
2765
|
o.push({
|
|
2766
2766
|
date: new Date(r),
|
|
2767
2767
|
col: {
|
|
2768
2768
|
start: new Date(r),
|
|
2769
2769
|
end: new Date(e)
|
|
2770
2770
|
},
|
|
2771
|
-
label:
|
|
2771
|
+
label: pt(r, a, u)
|
|
2772
2772
|
}), r = e;
|
|
2773
2773
|
}
|
|
2774
2774
|
return o;
|
|
@@ -2776,7 +2776,7 @@ function pt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2776
2776
|
t,
|
|
2777
2777
|
a,
|
|
2778
2778
|
u
|
|
2779
|
-
]), p = e.useMemo(() =>
|
|
2779
|
+
]), p = e.useMemo(() => lt(t, f.map((e) => e.col), {
|
|
2780
2780
|
assignee: n,
|
|
2781
2781
|
effort: r,
|
|
2782
2782
|
capacity: i,
|
|
@@ -2805,11 +2805,11 @@ function pt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2805
2805
|
children: /* @__PURE__ */ D("div", {
|
|
2806
2806
|
style: {
|
|
2807
2807
|
display: "flex",
|
|
2808
|
-
minWidth:
|
|
2808
|
+
minWidth: ft + h
|
|
2809
2809
|
},
|
|
2810
2810
|
children: [/* @__PURE__ */ D("div", {
|
|
2811
2811
|
style: {
|
|
2812
|
-
width:
|
|
2812
|
+
width: ft,
|
|
2813
2813
|
flexShrink: 0
|
|
2814
2814
|
},
|
|
2815
2815
|
children: [/* @__PURE__ */ E("div", {
|
|
@@ -2826,7 +2826,7 @@ function pt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2826
2826
|
}), p.map((e) => /* @__PURE__ */ D("div", {
|
|
2827
2827
|
"data-testid": `resource-row-${e.key}`,
|
|
2828
2828
|
style: {
|
|
2829
|
-
height:
|
|
2829
|
+
height: R,
|
|
2830
2830
|
display: "flex",
|
|
2831
2831
|
flexDirection: "column",
|
|
2832
2832
|
justifyContent: "center",
|
|
@@ -2882,12 +2882,12 @@ function pt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2882
2882
|
children: e.label
|
|
2883
2883
|
}, t))
|
|
2884
2884
|
}), p.map((e) => {
|
|
2885
|
-
let t =
|
|
2885
|
+
let t = dt * (1 - Math.min(e.capacity / m, 1));
|
|
2886
2886
|
return /* @__PURE__ */ D("div", {
|
|
2887
2887
|
style: {
|
|
2888
2888
|
position: "relative",
|
|
2889
2889
|
display: "flex",
|
|
2890
|
-
height:
|
|
2890
|
+
height: R,
|
|
2891
2891
|
borderBottom: "1px solid hsl(var(--border) / 0.5)"
|
|
2892
2892
|
},
|
|
2893
2893
|
children: [/* @__PURE__ */ E("div", {
|
|
@@ -2896,13 +2896,13 @@ function pt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2896
2896
|
position: "absolute",
|
|
2897
2897
|
left: 0,
|
|
2898
2898
|
right: 0,
|
|
2899
|
-
top: (
|
|
2899
|
+
top: (R - dt) / 2 + t,
|
|
2900
2900
|
borderTop: "1px dashed hsl(var(--muted-foreground) / 0.6)",
|
|
2901
2901
|
pointerEvents: "none",
|
|
2902
2902
|
zIndex: 1
|
|
2903
2903
|
}
|
|
2904
2904
|
}), e.cells.map((t, n) => {
|
|
2905
|
-
let r = Math.max(t.load > 0 ? 2 : 0,
|
|
2905
|
+
let r = Math.max(t.load > 0 ? 2 : 0, dt * Math.min(t.load / m, 1));
|
|
2906
2906
|
return /* @__PURE__ */ E("div", {
|
|
2907
2907
|
"data-testid": `resource-cell-${e.key}-${n}`,
|
|
2908
2908
|
"data-load": t.load,
|
|
@@ -2916,7 +2916,7 @@ function pt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2916
2916
|
display: "flex",
|
|
2917
2917
|
alignItems: "flex-end",
|
|
2918
2918
|
justifyContent: "center",
|
|
2919
|
-
paddingBottom: (
|
|
2919
|
+
paddingBottom: (R - dt) / 2
|
|
2920
2920
|
},
|
|
2921
2921
|
children: t.load > 0 && /* @__PURE__ */ E("div", { style: {
|
|
2922
2922
|
width: d - 6,
|
|
@@ -2942,7 +2942,7 @@ function pt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2942
2942
|
}
|
|
2943
2943
|
//#endregion
|
|
2944
2944
|
//#region src/QuickFilterBar.tsx
|
|
2945
|
-
var
|
|
2945
|
+
var mt = {
|
|
2946
2946
|
display: "flex",
|
|
2947
2947
|
flexWrap: "wrap",
|
|
2948
2948
|
alignItems: "center",
|
|
@@ -2951,7 +2951,7 @@ var z = {
|
|
|
2951
2951
|
borderBottom: "1px solid hsl(var(--border))",
|
|
2952
2952
|
background: "hsl(var(--background))",
|
|
2953
2953
|
fontSize: 13
|
|
2954
|
-
},
|
|
2954
|
+
}, B = {
|
|
2955
2955
|
display: "inline-flex",
|
|
2956
2956
|
alignItems: "center",
|
|
2957
2957
|
gap: 6,
|
|
@@ -2964,7 +2964,7 @@ var z = {
|
|
|
2964
2964
|
cursor: "pointer",
|
|
2965
2965
|
whiteSpace: "nowrap",
|
|
2966
2966
|
lineHeight: "28px"
|
|
2967
|
-
},
|
|
2967
|
+
}, ht = {
|
|
2968
2968
|
position: "absolute",
|
|
2969
2969
|
top: "calc(100% + 4px)",
|
|
2970
2970
|
left: 0,
|
|
@@ -2978,7 +2978,7 @@ var z = {
|
|
|
2978
2978
|
background: "hsl(var(--popover, var(--background)))",
|
|
2979
2979
|
color: "hsl(var(--popover-foreground, var(--foreground)))",
|
|
2980
2980
|
boxShadow: "0 8px 24px rgba(0,0,0,0.18)"
|
|
2981
|
-
},
|
|
2981
|
+
}, gt = {
|
|
2982
2982
|
display: "flex",
|
|
2983
2983
|
alignItems: "center",
|
|
2984
2984
|
gap: 8,
|
|
@@ -2987,7 +2987,7 @@ var z = {
|
|
|
2987
2987
|
cursor: "pointer",
|
|
2988
2988
|
userSelect: "none"
|
|
2989
2989
|
};
|
|
2990
|
-
function
|
|
2990
|
+
function _t({ checked: e }) {
|
|
2991
2991
|
return /* @__PURE__ */ E("span", {
|
|
2992
2992
|
"aria-hidden": !0,
|
|
2993
2993
|
style: {
|
|
@@ -3007,7 +3007,7 @@ function gt({ checked: e }) {
|
|
|
3007
3007
|
children: e ? "✓" : ""
|
|
3008
3008
|
});
|
|
3009
3009
|
}
|
|
3010
|
-
function
|
|
3010
|
+
function vt({ filter: e, selected: t, onChange: r, labels: o }) {
|
|
3011
3011
|
let [s, c] = a(!1), l = i(null);
|
|
3012
3012
|
n(() => {
|
|
3013
3013
|
if (!s) return;
|
|
@@ -3033,7 +3033,7 @@ function _t({ filter: e, selected: t, onChange: r, labels: o }) {
|
|
|
3033
3033
|
children: [/* @__PURE__ */ D("button", {
|
|
3034
3034
|
type: "button",
|
|
3035
3035
|
style: {
|
|
3036
|
-
...
|
|
3036
|
+
...B,
|
|
3037
3037
|
borderColor: d > 0 ? "hsl(var(--primary))" : "hsl(var(--border))",
|
|
3038
3038
|
color: d > 0 ? "hsl(var(--primary))" : "hsl(var(--foreground))"
|
|
3039
3039
|
},
|
|
@@ -3051,26 +3051,26 @@ function _t({ filter: e, selected: t, onChange: r, labels: o }) {
|
|
|
3051
3051
|
})]
|
|
3052
3052
|
}), s && /* @__PURE__ */ E("div", {
|
|
3053
3053
|
role: "listbox",
|
|
3054
|
-
style:
|
|
3054
|
+
style: ht,
|
|
3055
3055
|
"data-testid": `quick-filter-panel-${e.field}`,
|
|
3056
3056
|
children: e.options.length === 0 ? /* @__PURE__ */ E("div", {
|
|
3057
3057
|
style: {
|
|
3058
|
-
...
|
|
3058
|
+
...gt,
|
|
3059
3059
|
cursor: "default",
|
|
3060
3060
|
opacity: .6
|
|
3061
3061
|
},
|
|
3062
3062
|
children: o.empty
|
|
3063
|
-
}) : /* @__PURE__ */ D(
|
|
3063
|
+
}) : /* @__PURE__ */ D(ke, { children: [
|
|
3064
3064
|
/* @__PURE__ */ D("div", {
|
|
3065
3065
|
role: "option",
|
|
3066
3066
|
"aria-selected": f,
|
|
3067
3067
|
style: {
|
|
3068
|
-
...
|
|
3068
|
+
...gt,
|
|
3069
3069
|
fontWeight: 600
|
|
3070
3070
|
},
|
|
3071
3071
|
"data-testid": `quick-filter-all-${e.field}`,
|
|
3072
3072
|
onClick: () => m(),
|
|
3073
|
-
children: [/* @__PURE__ */ E(
|
|
3073
|
+
children: [/* @__PURE__ */ E(_t, { checked: f }), /* @__PURE__ */ E("span", { children: o.all })]
|
|
3074
3074
|
}),
|
|
3075
3075
|
/* @__PURE__ */ E("div", { style: {
|
|
3076
3076
|
height: 1,
|
|
@@ -3083,27 +3083,27 @@ function _t({ filter: e, selected: t, onChange: r, labels: o }) {
|
|
|
3083
3083
|
role: "option",
|
|
3084
3084
|
"aria-selected": n,
|
|
3085
3085
|
style: {
|
|
3086
|
-
...
|
|
3086
|
+
...gt,
|
|
3087
3087
|
background: n ? "hsl(var(--accent, var(--muted)))" : "transparent"
|
|
3088
3088
|
},
|
|
3089
3089
|
"data-testid": `quick-filter-option-${e.field}-${t.value}`,
|
|
3090
3090
|
onClick: () => p(t.value),
|
|
3091
|
-
children: [/* @__PURE__ */ E(
|
|
3091
|
+
children: [/* @__PURE__ */ E(_t, { checked: n }), /* @__PURE__ */ E("span", { children: t.label })]
|
|
3092
3092
|
}, t.value);
|
|
3093
3093
|
})
|
|
3094
3094
|
] })
|
|
3095
3095
|
})]
|
|
3096
3096
|
});
|
|
3097
3097
|
}
|
|
3098
|
-
var
|
|
3098
|
+
var yt = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, totalCount: a, labels: o, className: s }) => {
|
|
3099
3099
|
if (!e.length) return null;
|
|
3100
3100
|
let c = o?.all ?? "All", l = o?.empty ?? "No options", u = o?.clear ?? "Clear", d = e.some((e) => (t[e.field]?.length ?? 0) > 0);
|
|
3101
3101
|
return /* @__PURE__ */ D("div", {
|
|
3102
|
-
style:
|
|
3102
|
+
style: mt,
|
|
3103
3103
|
className: s,
|
|
3104
3104
|
"data-testid": "quick-filter-bar",
|
|
3105
3105
|
children: [
|
|
3106
|
-
e.map((e) => /* @__PURE__ */ E(
|
|
3106
|
+
e.map((e) => /* @__PURE__ */ E(vt, {
|
|
3107
3107
|
filter: e,
|
|
3108
3108
|
selected: t[e.field] ?? [],
|
|
3109
3109
|
onChange: (t) => n(e.field, t),
|
|
@@ -3115,7 +3115,7 @@ var vt = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, total
|
|
|
3115
3115
|
d && /* @__PURE__ */ E("button", {
|
|
3116
3116
|
type: "button",
|
|
3117
3117
|
style: {
|
|
3118
|
-
...
|
|
3118
|
+
...B,
|
|
3119
3119
|
height: 28,
|
|
3120
3120
|
color: "hsl(var(--muted-foreground))"
|
|
3121
3121
|
},
|
|
@@ -3136,7 +3136,7 @@ var vt = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, total
|
|
|
3136
3136
|
};
|
|
3137
3137
|
//#endregion
|
|
3138
3138
|
//#region src/ObjectGantt.tsx
|
|
3139
|
-
function
|
|
3139
|
+
function bt(e) {
|
|
3140
3140
|
if (e == null) return;
|
|
3141
3141
|
let t = String(e).toLowerCase().trim();
|
|
3142
3142
|
if (t === "milestone") return "milestone";
|
|
@@ -3144,7 +3144,7 @@ function yt(e) {
|
|
|
3144
3144
|
if (t === "summary" || t === "project" || t === "phase") return "summary";
|
|
3145
3145
|
if (t === "task") return "task";
|
|
3146
3146
|
}
|
|
3147
|
-
var
|
|
3147
|
+
var xt = {
|
|
3148
3148
|
fs: "fs",
|
|
3149
3149
|
ss: "ss",
|
|
3150
3150
|
ff: "ff",
|
|
@@ -3157,7 +3157,7 @@ var bt = {
|
|
|
3157
3157
|
end_to_end: "ff",
|
|
3158
3158
|
start_to_end: "sf"
|
|
3159
3159
|
};
|
|
3160
|
-
function
|
|
3160
|
+
function St(e) {
|
|
3161
3161
|
if (e == null || e === "") return [];
|
|
3162
3162
|
if (typeof e == "string") return e.split(",").map((e) => e.trim()).filter(Boolean);
|
|
3163
3163
|
if (typeof e == "number") return [e];
|
|
@@ -3166,7 +3166,7 @@ function xt(e) {
|
|
|
3166
3166
|
for (let n of e) if (!(n == null || n === "")) if (typeof n == "object") {
|
|
3167
3167
|
let e = n.id ?? n._id ?? n.task ?? n.target;
|
|
3168
3168
|
if (e == null || e === "") continue;
|
|
3169
|
-
let r =
|
|
3169
|
+
let r = xt[String(n.type ?? "").toLowerCase().replace(/-/g, "_")];
|
|
3170
3170
|
t.push(r ? {
|
|
3171
3171
|
id: e,
|
|
3172
3172
|
type: r
|
|
@@ -3174,7 +3174,7 @@ function xt(e) {
|
|
|
3174
3174
|
} else t.push(n);
|
|
3175
3175
|
return t;
|
|
3176
3176
|
}
|
|
3177
|
-
function
|
|
3177
|
+
function V(e) {
|
|
3178
3178
|
return e.data ? e.data : e.staticData ? {
|
|
3179
3179
|
provider: "value",
|
|
3180
3180
|
items: e.staticData
|
|
@@ -3183,7 +3183,7 @@ function St(e) {
|
|
|
3183
3183
|
object: e.objectName
|
|
3184
3184
|
} : null;
|
|
3185
3185
|
}
|
|
3186
|
-
function
|
|
3186
|
+
function Ct(e) {
|
|
3187
3187
|
if (e) {
|
|
3188
3188
|
if (typeof e == "string") {
|
|
3189
3189
|
let t = e.split(" "), n = t[0], r = t[1]?.toLowerCase() === "desc" ? "desc" : "asc";
|
|
@@ -3192,7 +3192,7 @@ function V(e) {
|
|
|
3192
3192
|
if (Array.isArray(e)) return e.reduce((e, t) => (t.field && t.order && (e[t.field] = t.order), e), {});
|
|
3193
3193
|
}
|
|
3194
3194
|
}
|
|
3195
|
-
function
|
|
3195
|
+
function wt(e) {
|
|
3196
3196
|
let t = null;
|
|
3197
3197
|
if (e.startDateField && e.endDateField) return t = {
|
|
3198
3198
|
startDateField: e.startDateField,
|
|
@@ -3218,22 +3218,22 @@ function Ct(e) {
|
|
|
3218
3218
|
timeSegments: e.timeSegments
|
|
3219
3219
|
}, t;
|
|
3220
3220
|
if (e.gantt && (t = e.gantt), t) {
|
|
3221
|
-
let e =
|
|
3221
|
+
let e = p.safeParse(t);
|
|
3222
3222
|
return e.success || console.warn("[ObjectGantt] Invalid gantt configuration:", e.error.format()), t;
|
|
3223
3223
|
}
|
|
3224
3224
|
return null;
|
|
3225
3225
|
}
|
|
3226
|
-
var
|
|
3227
|
-
let [y, b] = a([]), [
|
|
3226
|
+
var Tt = ({ schema: e, dataSource: i, className: o, onTaskClick: d, onRowClick: f, ...p }) => {
|
|
3227
|
+
let [y, b] = a([]), [se, me] = a(!0), [he, ge] = a(null), [C, _e] = a(null), { currency: ve } = h(), ye = V(e), w = r(() => ye, [JSON.stringify(ye)]), T = wt(e), be = w?.provider === "value";
|
|
3228
3228
|
n(() => {
|
|
3229
3229
|
(async () => {
|
|
3230
3230
|
try {
|
|
3231
|
-
if (
|
|
3232
|
-
b(
|
|
3231
|
+
if (me(!0), p.data && Array.isArray(p.data)) {
|
|
3232
|
+
b(p.data), me(!1);
|
|
3233
3233
|
return;
|
|
3234
3234
|
}
|
|
3235
|
-
if (
|
|
3236
|
-
b(w.items),
|
|
3235
|
+
if (be && w?.provider === "value") {
|
|
3236
|
+
b(w.items), me(!1);
|
|
3237
3237
|
return;
|
|
3238
3238
|
}
|
|
3239
3239
|
if (!i || typeof i.find != "function") throw Error("DataSource required for object/api providers");
|
|
@@ -3241,29 +3241,29 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3241
3241
|
let t = w.object, n = s(C?.fields);
|
|
3242
3242
|
b(c(await i.find(t, {
|
|
3243
3243
|
$filter: e.filter,
|
|
3244
|
-
$orderby:
|
|
3244
|
+
$orderby: Ct(e.sort),
|
|
3245
3245
|
...n.length > 0 ? { $expand: n } : {}
|
|
3246
3246
|
})));
|
|
3247
3247
|
} else w?.provider === "api" && (console.warn("API provider not yet implemented for ObjectGantt"), b([]));
|
|
3248
|
-
|
|
3248
|
+
me(!1);
|
|
3249
3249
|
} catch (e) {
|
|
3250
|
-
|
|
3250
|
+
ge(e), me(!1);
|
|
3251
3251
|
}
|
|
3252
3252
|
})();
|
|
3253
3253
|
}, [
|
|
3254
3254
|
w,
|
|
3255
3255
|
i,
|
|
3256
|
-
|
|
3256
|
+
be,
|
|
3257
3257
|
e.filter,
|
|
3258
3258
|
e.sort,
|
|
3259
3259
|
C
|
|
3260
3260
|
]), n(() => {
|
|
3261
|
-
!
|
|
3261
|
+
!be && i && (async () => {
|
|
3262
3262
|
try {
|
|
3263
3263
|
if (!i) return;
|
|
3264
3264
|
let t = w?.provider === "object" ? w.object : e.objectName;
|
|
3265
3265
|
if (!t) return;
|
|
3266
|
-
|
|
3266
|
+
_e(await i.getObjectSchema(t));
|
|
3267
3267
|
} catch (e) {
|
|
3268
3268
|
console.error("Failed to fetch object schema:", e);
|
|
3269
3269
|
}
|
|
@@ -3271,12 +3271,12 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3271
3271
|
}, [
|
|
3272
3272
|
e.objectName,
|
|
3273
3273
|
i,
|
|
3274
|
-
|
|
3274
|
+
be,
|
|
3275
3275
|
w
|
|
3276
3276
|
]);
|
|
3277
|
-
let
|
|
3277
|
+
let xe = r(() => {
|
|
3278
3278
|
if (!T || !y.length) return [];
|
|
3279
|
-
let { startDateField: e, endDateField: t, titleField: n, progressField: r, dependenciesField: i, colorField: a, parentField: o, typeField: s, lockField: c, tooltipFields:
|
|
3279
|
+
let { startDateField: e, endDateField: t, titleField: n, progressField: r, dependenciesField: i, colorField: a, parentField: o, typeField: s, lockField: c, tooltipFields: u, baselineStartField: d, baselineEndField: f } = T, p = C?.fields ?? {}, h = (e, t) => {
|
|
3280
3280
|
if (!t) return;
|
|
3281
3281
|
let n = t.split("."), r = e;
|
|
3282
3282
|
for (let e of n) {
|
|
@@ -3284,41 +3284,35 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3284
3284
|
r = r[e];
|
|
3285
3285
|
}
|
|
3286
3286
|
return r;
|
|
3287
|
-
},
|
|
3287
|
+
}, g = (e) => {
|
|
3288
3288
|
let t = [
|
|
3289
|
-
|
|
3290
|
-
e?.name,
|
|
3291
|
-
e?.title,
|
|
3292
|
-
e?.subject,
|
|
3293
|
-
e?.label,
|
|
3289
|
+
h(e, n),
|
|
3294
3290
|
e?.account?.name,
|
|
3295
3291
|
e?.opportunity?.name,
|
|
3296
|
-
e?.contact && [e.contact.first_name, e.contact.last_name].filter(Boolean).join(" ")
|
|
3297
|
-
e?.id,
|
|
3298
|
-
e?._id
|
|
3292
|
+
e?.contact && [e.contact.first_name, e.contact.last_name].filter(Boolean).join(" ")
|
|
3299
3293
|
];
|
|
3300
3294
|
for (let e of t) if (e != null && String(e).trim() !== "") return String(e);
|
|
3301
|
-
return
|
|
3302
|
-
}, g = (e, t) => {
|
|
3303
|
-
if (t) return t;
|
|
3304
|
-
let n = f[e] ?? f[e.split(".")[0]];
|
|
3305
|
-
return n?.label ? n.label : fe(e);
|
|
3295
|
+
return l(C, e);
|
|
3306
3296
|
}, ee = (e, t) => {
|
|
3297
|
+
if (t) return t;
|
|
3298
|
+
let n = p[e] ?? p[e.split(".")[0]];
|
|
3299
|
+
return n?.label ? n.label : pe(e);
|
|
3300
|
+
}, _ = (e, t) => {
|
|
3307
3301
|
if (e == null || e === "") return "—";
|
|
3308
|
-
let n =
|
|
3302
|
+
let n = p[t] ?? p[t.split(".")[0]], r = n?.type, i = n?.options;
|
|
3309
3303
|
if (Array.isArray(i) && i.length) {
|
|
3310
3304
|
let t = i.find((t) => String(t.value) === String(e));
|
|
3311
3305
|
if (t) return t.label;
|
|
3312
3306
|
}
|
|
3313
3307
|
switch (r) {
|
|
3314
|
-
case "date": return
|
|
3315
|
-
case "datetime": return
|
|
3308
|
+
case "date": return le(e);
|
|
3309
|
+
case "datetime": return x(e);
|
|
3316
3310
|
case "number":
|
|
3317
3311
|
case "integer":
|
|
3318
3312
|
case "float":
|
|
3319
|
-
case "decimal": return
|
|
3320
|
-
case "currency": return
|
|
3321
|
-
case "percent": return
|
|
3313
|
+
case "decimal": return ue(Number(e));
|
|
3314
|
+
case "currency": return ce(Number(e), m(n, ve));
|
|
3315
|
+
case "percent": return S(Number(e));
|
|
3322
3316
|
case "boolean":
|
|
3323
3317
|
case "checkbox": return e ? "Yes" : "No";
|
|
3324
3318
|
default:
|
|
@@ -3339,43 +3333,43 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3339
3333
|
}
|
|
3340
3334
|
return String(e);
|
|
3341
3335
|
}
|
|
3342
|
-
},
|
|
3343
|
-
if (!
|
|
3336
|
+
}, v = (e) => {
|
|
3337
|
+
if (!u || !u.length) return;
|
|
3344
3338
|
let t = [];
|
|
3345
|
-
for (let n of
|
|
3339
|
+
for (let n of u) {
|
|
3346
3340
|
let r = typeof n == "string" ? n : n?.field;
|
|
3347
3341
|
if (!r) continue;
|
|
3348
3342
|
let i = typeof n == "object" ? n.label : void 0;
|
|
3349
3343
|
t.push({
|
|
3350
|
-
label:
|
|
3351
|
-
value:
|
|
3344
|
+
label: ee(r, i),
|
|
3345
|
+
value: _(h(e, r), r)
|
|
3352
3346
|
});
|
|
3353
3347
|
}
|
|
3354
3348
|
return t.length ? t : void 0;
|
|
3355
3349
|
};
|
|
3356
3350
|
return y.map((n, l) => {
|
|
3357
|
-
let
|
|
3351
|
+
let u = n[e], p = n[t], m = d ? n[d] : void 0, h = f ? n[f] : void 0, ee = m ? new Date(m) : void 0, _ = h ? new Date(h) : void 0, te = g(n), ne = r ? n[r] : 0, re = i ? n[i] : [], ie = a ? n[a] : void 0;
|
|
3358
3352
|
if (!ie) {
|
|
3359
3353
|
let e = n.status ?? n.state ?? n.priority ?? n.severity;
|
|
3360
3354
|
if (e != null && e !== "") {
|
|
3361
|
-
let t =
|
|
3362
|
-
t && (ie =
|
|
3355
|
+
let t = de(void 0, e);
|
|
3356
|
+
t && (ie = fe(t));
|
|
3363
3357
|
}
|
|
3364
3358
|
}
|
|
3365
3359
|
return {
|
|
3366
3360
|
id: n.id || n._id || `task-${l}`,
|
|
3367
3361
|
title: te,
|
|
3368
|
-
start:
|
|
3362
|
+
start: u ? new Date(u) : /* @__PURE__ */ new Date(),
|
|
3369
3363
|
end: p ? new Date(p) : /* @__PURE__ */ new Date(),
|
|
3370
3364
|
progress: Math.min(100, Math.max(0, ne || 0)),
|
|
3371
|
-
dependencies:
|
|
3365
|
+
dependencies: St(re),
|
|
3372
3366
|
parent: o ? n[o] ?? null : void 0,
|
|
3373
|
-
type: s ?
|
|
3367
|
+
type: s ? bt(n[s]) : void 0,
|
|
3374
3368
|
locked: c ? !!n[c] : void 0,
|
|
3375
3369
|
color: ie,
|
|
3376
3370
|
baselineStart: ee && !isNaN(ee.getTime()) ? ee : void 0,
|
|
3377
|
-
baselineEnd:
|
|
3378
|
-
fields:
|
|
3371
|
+
baselineEnd: _ && !isNaN(_.getTime()) ? _ : void 0,
|
|
3372
|
+
fields: v(n),
|
|
3379
3373
|
data: n
|
|
3380
3374
|
};
|
|
3381
3375
|
}).filter((e) => !isNaN(e.start.getTime()) && !isNaN(e.end.getTime()));
|
|
@@ -3383,7 +3377,7 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3383
3377
|
y,
|
|
3384
3378
|
T,
|
|
3385
3379
|
C
|
|
3386
|
-
]),
|
|
3380
|
+
]), Se = r(() => {
|
|
3387
3381
|
let e = T?.groupByField;
|
|
3388
3382
|
if (!e) return;
|
|
3389
3383
|
let t = C?.fields ?? {}, n = (e, t) => {
|
|
@@ -3413,7 +3407,7 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3413
3407
|
label: r(i)
|
|
3414
3408
|
};
|
|
3415
3409
|
};
|
|
3416
|
-
}, [T?.groupByField, C]),
|
|
3410
|
+
}, [T?.groupByField, C]), Ce = r(() => {
|
|
3417
3411
|
let e = T?.assigneeField;
|
|
3418
3412
|
if (!e) return;
|
|
3419
3413
|
let t = C?.fields ?? {}, n = (e, t) => {
|
|
@@ -3443,19 +3437,19 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3443
3437
|
label: r(i)
|
|
3444
3438
|
};
|
|
3445
3439
|
};
|
|
3446
|
-
}, [T?.assigneeField, C]),
|
|
3440
|
+
}, [T?.assigneeField, C]), we = r(() => {
|
|
3447
3441
|
let e = T?.effortField;
|
|
3448
3442
|
if (e) return (t) => {
|
|
3449
3443
|
let n = t.data?.[e], r = Number(n);
|
|
3450
3444
|
return Number.isFinite(r) && r > 0 ? r : 1;
|
|
3451
3445
|
};
|
|
3452
|
-
}, [T?.effortField]),
|
|
3446
|
+
}, [T?.effortField]), Te = r(() => {
|
|
3453
3447
|
let t = e.skipWeekends, n = e.holidays;
|
|
3454
3448
|
if (!(!t && (!n || n.length === 0))) return {
|
|
3455
3449
|
skipWeekends: !!t,
|
|
3456
3450
|
holidays: n && n.length ? new Set(n) : void 0
|
|
3457
3451
|
};
|
|
3458
|
-
}, [e]),
|
|
3452
|
+
}, [e]), Ee = r(() => Be(T?.timeSegments), [T?.timeSegments]), De = t((e, t) => {
|
|
3459
3453
|
if (!e || !t) return null;
|
|
3460
3454
|
let n = e;
|
|
3461
3455
|
for (let e of t.split(".")) {
|
|
@@ -3468,13 +3462,13 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3468
3462
|
return String(e.id ?? e._id ?? e.value ?? e.name ?? "");
|
|
3469
3463
|
}
|
|
3470
3464
|
return String(n);
|
|
3471
|
-
}, []),
|
|
3465
|
+
}, []), Oe = T?.quickFilters, [Ae, je] = a({});
|
|
3472
3466
|
n(() => {
|
|
3473
|
-
if (!
|
|
3467
|
+
if (!Oe?.length || !i || typeof i.find != "function") return;
|
|
3474
3468
|
let e = C?.fields ?? {}, t = !1;
|
|
3475
3469
|
return (async () => {
|
|
3476
3470
|
let n = {};
|
|
3477
|
-
for (let t of
|
|
3471
|
+
for (let t of Oe) {
|
|
3478
3472
|
if (t.options) continue;
|
|
3479
3473
|
let r = e[t.field] ?? e[t.field.split(".")[0]], a = r?.type;
|
|
3480
3474
|
if (a !== "lookup" && a !== "master_detail") continue;
|
|
@@ -3489,7 +3483,7 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3489
3483
|
console.warn(`[ObjectGantt] Failed to load quick-filter options for "${t.field}":`, e);
|
|
3490
3484
|
}
|
|
3491
3485
|
}
|
|
3492
|
-
t ||
|
|
3486
|
+
t || je((e) => ({
|
|
3493
3487
|
...e,
|
|
3494
3488
|
...n
|
|
3495
3489
|
}));
|
|
@@ -3497,15 +3491,15 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3497
3491
|
t = !0;
|
|
3498
3492
|
};
|
|
3499
3493
|
}, [
|
|
3500
|
-
JSON.stringify(
|
|
3494
|
+
JSON.stringify(Oe),
|
|
3501
3495
|
i,
|
|
3502
3496
|
C
|
|
3503
3497
|
]);
|
|
3504
|
-
let
|
|
3505
|
-
if (!
|
|
3498
|
+
let O = r(() => {
|
|
3499
|
+
if (!Oe?.length) return [];
|
|
3506
3500
|
let e = C?.fields ?? {};
|
|
3507
|
-
return
|
|
3508
|
-
let n = e[t.field] ?? e[t.field.split(".")[0]], r = t.label ?? n?.label ??
|
|
3501
|
+
return Oe.map((t) => {
|
|
3502
|
+
let n = e[t.field] ?? e[t.field.split(".")[0]], r = t.label ?? n?.label ?? pe(t.field), i = [];
|
|
3509
3503
|
if (t.options?.length) i = t.options.map((e) => typeof e == "object" ? {
|
|
3510
3504
|
value: String(e.value),
|
|
3511
3505
|
label: String(e.label ?? e.value)
|
|
@@ -3517,11 +3511,11 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3517
3511
|
value: String(e.value ?? e),
|
|
3518
3512
|
label: String(e.label ?? e.value ?? e)
|
|
3519
3513
|
}));
|
|
3520
|
-
else if (
|
|
3514
|
+
else if (Ae[t.field]?.length) i = Ae[t.field];
|
|
3521
3515
|
else {
|
|
3522
3516
|
let e = /* @__PURE__ */ new Map();
|
|
3523
3517
|
for (let n of y) {
|
|
3524
|
-
let r =
|
|
3518
|
+
let r = De(n, t.field);
|
|
3525
3519
|
if (r != null && !e.has(r)) {
|
|
3526
3520
|
let i = n;
|
|
3527
3521
|
for (let e of t.field.split(".")) i = i?.[e];
|
|
@@ -3541,42 +3535,42 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3541
3535
|
};
|
|
3542
3536
|
});
|
|
3543
3537
|
}, [
|
|
3544
|
-
|
|
3538
|
+
Oe,
|
|
3545
3539
|
C,
|
|
3546
|
-
|
|
3540
|
+
Ae,
|
|
3547
3541
|
y,
|
|
3548
|
-
|
|
3549
|
-
]), [
|
|
3550
|
-
|
|
3542
|
+
De
|
|
3543
|
+
]), [k, A] = a({}), Me = t((e, t) => {
|
|
3544
|
+
A((n) => ({
|
|
3551
3545
|
...n,
|
|
3552
3546
|
[e]: t
|
|
3553
3547
|
}));
|
|
3554
|
-
}, []),
|
|
3555
|
-
let e = Object.entries(
|
|
3556
|
-
return e.length ?
|
|
3557
|
-
let r =
|
|
3548
|
+
}, []), j = t(() => A({}), []), Ne = r(() => {
|
|
3549
|
+
let e = Object.entries(k).filter(([, e]) => e.length > 0);
|
|
3550
|
+
return e.length ? xe.filter((t) => e.every(([e, n]) => {
|
|
3551
|
+
let r = De(t.data, e);
|
|
3558
3552
|
return r != null && n.includes(r);
|
|
3559
|
-
})) :
|
|
3553
|
+
})) : xe;
|
|
3560
3554
|
}, [
|
|
3561
|
-
|
|
3562
|
-
|
|
3563
|
-
|
|
3564
|
-
]),
|
|
3565
|
-
if (T?.autoZoomToFilter !== !1 || !
|
|
3566
|
-
let e =
|
|
3567
|
-
for (let n of
|
|
3555
|
+
xe,
|
|
3556
|
+
k,
|
|
3557
|
+
De
|
|
3558
|
+
]), M = r(() => {
|
|
3559
|
+
if (T?.autoZoomToFilter !== !1 || !xe.length) return null;
|
|
3560
|
+
let e = xe[0].start.getTime(), t = xe[0].end.getTime();
|
|
3561
|
+
for (let n of xe) e = Math.min(e, n.start.getTime()), t = Math.max(t, n.end.getTime());
|
|
3568
3562
|
return {
|
|
3569
3563
|
start: new Date(e),
|
|
3570
3564
|
end: new Date(t)
|
|
3571
3565
|
};
|
|
3572
|
-
}, [
|
|
3566
|
+
}, [xe, T?.autoZoomToFilter]), Pe = e.navigation ?? {
|
|
3573
3567
|
mode: "drawer",
|
|
3574
3568
|
width: "min(960px, 60vw)"
|
|
3575
|
-
},
|
|
3576
|
-
navigation:
|
|
3569
|
+
}, Fe = Pe.mode === "drawer" || Pe.mode === "modal" || Pe.mode === "split" || Pe.mode === "popover", N = u({
|
|
3570
|
+
navigation: Pe,
|
|
3577
3571
|
objectName: e.objectName,
|
|
3578
|
-
onRowClick:
|
|
3579
|
-
}),
|
|
3572
|
+
onRowClick: Fe ? void 0 : f
|
|
3573
|
+
}), P = t(async (t, n) => {
|
|
3580
3574
|
if (!T) return;
|
|
3581
3575
|
let r = w?.provider === "object" ? w.object : e.objectName;
|
|
3582
3576
|
if (!r || !i || typeof i.update != "function") return;
|
|
@@ -3600,18 +3594,18 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3600
3594
|
i,
|
|
3601
3595
|
e.objectName,
|
|
3602
3596
|
y
|
|
3603
|
-
]),
|
|
3597
|
+
]), Ie = (e, t) => {
|
|
3604
3598
|
let n = t.some((e) => typeof e == "object" && e.type && e.type !== "fs");
|
|
3605
3599
|
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" ? {
|
|
3606
3600
|
id: e.id,
|
|
3607
3601
|
type: e.type
|
|
3608
3602
|
} : e.id : e) : t.map((e) => typeof e == "object" ? e.id : e);
|
|
3609
|
-
},
|
|
3603
|
+
}, Le = t(async (t, n, r) => {
|
|
3610
3604
|
let a = T?.dependenciesField;
|
|
3611
3605
|
if (!a) return;
|
|
3612
3606
|
let o = w?.provider === "object" ? w.object : e.objectName;
|
|
3613
3607
|
if (!o || !i || typeof i.update != "function") return;
|
|
3614
|
-
let s =
|
|
3608
|
+
let s = Ie(n, r), c = y;
|
|
3615
3609
|
b((e) => e.map((e) => String(e.id ?? e._id) === String(t) ? {
|
|
3616
3610
|
...e,
|
|
3617
3611
|
[a]: s
|
|
@@ -3627,65 +3621,65 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3627
3621
|
i,
|
|
3628
3622
|
e.objectName,
|
|
3629
3623
|
y
|
|
3630
|
-
]),
|
|
3624
|
+
]), Re = t(async (e, t, n = "fs") => {
|
|
3631
3625
|
let r = e.data?.id ?? e.data?._id ?? e.id, i = t.data?.id ?? t.data?._id ?? t.id;
|
|
3632
3626
|
if (r == null || i == null) return;
|
|
3633
3627
|
let a = T?.dependenciesField;
|
|
3634
3628
|
if (!a) return;
|
|
3635
|
-
let o = y.find((e) => String(e.id ?? e._id) === String(i))?.[a], s =
|
|
3629
|
+
let o = y.find((e) => String(e.id ?? e._id) === String(i))?.[a], s = St(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";
|
|
3636
3630
|
if (l && u === n) return;
|
|
3637
3631
|
let d = n === "fs" ? r : {
|
|
3638
3632
|
id: r,
|
|
3639
3633
|
type: n
|
|
3640
3634
|
};
|
|
3641
|
-
await
|
|
3635
|
+
await Le(i, o, l ? s.map((e) => c(e) === String(r) ? d : e) : [...s, d]);
|
|
3642
3636
|
}, [
|
|
3643
3637
|
T,
|
|
3644
3638
|
y,
|
|
3645
|
-
|
|
3646
|
-
]),
|
|
3639
|
+
Le
|
|
3640
|
+
]), ze = t(async (e, t) => {
|
|
3647
3641
|
let n = e.data?.id ?? e.data?._id ?? e.id, r = t.data?.id ?? t.data?._id ?? t.id;
|
|
3648
3642
|
if (n == null || r == null) return;
|
|
3649
3643
|
let i = T?.dependenciesField;
|
|
3650
3644
|
if (!i) return;
|
|
3651
|
-
let a = y.find((e) => String(e.id ?? e._id) === String(r))?.[i], o =
|
|
3652
|
-
c.length !== o.length && await
|
|
3645
|
+
let a = y.find((e) => String(e.id ?? e._id) === String(r))?.[i], o = St(a), s = (e) => String(typeof e == "object" ? e.id : e), c = o.filter((e) => s(e) !== String(n));
|
|
3646
|
+
c.length !== o.length && await Le(r, a, c);
|
|
3653
3647
|
}, [
|
|
3654
3648
|
T,
|
|
3655
3649
|
y,
|
|
3656
|
-
|
|
3657
|
-
]), [
|
|
3658
|
-
|
|
3659
|
-
}, []),
|
|
3660
|
-
if (!
|
|
3650
|
+
Le
|
|
3651
|
+
]), [F, Ve] = a(null), [I, He] = a(!1), Ue = t((e) => {
|
|
3652
|
+
Ve(e);
|
|
3653
|
+
}, []), We = t(async () => {
|
|
3654
|
+
if (!F) return;
|
|
3661
3655
|
let t = w?.provider === "object" ? w.object : e.objectName;
|
|
3662
3656
|
if (!t || !i?.delete) {
|
|
3663
|
-
|
|
3657
|
+
Ve(null);
|
|
3664
3658
|
return;
|
|
3665
3659
|
}
|
|
3666
|
-
let n =
|
|
3660
|
+
let n = F.data?.id ?? F.data?._id ?? F.id;
|
|
3667
3661
|
if (n == null) {
|
|
3668
|
-
|
|
3662
|
+
Ve(null);
|
|
3669
3663
|
return;
|
|
3670
3664
|
}
|
|
3671
|
-
|
|
3665
|
+
He(!0);
|
|
3672
3666
|
let r = y;
|
|
3673
3667
|
b((e) => e.filter((e) => String(e.id ?? e._id) !== String(n)));
|
|
3674
3668
|
try {
|
|
3675
|
-
await i.delete(t, String(n)),
|
|
3669
|
+
await i.delete(t, String(n)), Ve(null);
|
|
3676
3670
|
} catch (e) {
|
|
3677
|
-
console.error("[ObjectGantt] Failed to delete:", e), b(r),
|
|
3671
|
+
console.error("[ObjectGantt] Failed to delete:", e), b(r), Ve(null);
|
|
3678
3672
|
} finally {
|
|
3679
|
-
|
|
3673
|
+
He(!1);
|
|
3680
3674
|
}
|
|
3681
3675
|
}, [
|
|
3682
|
-
|
|
3676
|
+
F,
|
|
3683
3677
|
w,
|
|
3684
3678
|
i,
|
|
3685
3679
|
e.objectName,
|
|
3686
3680
|
y
|
|
3687
3681
|
]);
|
|
3688
|
-
return
|
|
3682
|
+
return se ? /* @__PURE__ */ E("div", {
|
|
3689
3683
|
className: o,
|
|
3690
3684
|
children: /* @__PURE__ */ E("div", {
|
|
3691
3685
|
className: "flex items-center justify-center h-96",
|
|
@@ -3694,25 +3688,25 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3694
3688
|
children: "Loading Gantt chart..."
|
|
3695
3689
|
})
|
|
3696
3690
|
})
|
|
3697
|
-
}) :
|
|
3691
|
+
}) : he ? /* @__PURE__ */ E("div", {
|
|
3698
3692
|
className: o,
|
|
3699
3693
|
children: /* @__PURE__ */ E("div", {
|
|
3700
3694
|
className: "flex items-center justify-center h-96",
|
|
3701
3695
|
children: /* @__PURE__ */ D("div", {
|
|
3702
3696
|
className: "text-destructive",
|
|
3703
|
-
children: ["Error: ",
|
|
3697
|
+
children: ["Error: ", he.message]
|
|
3704
3698
|
})
|
|
3705
3699
|
})
|
|
3706
3700
|
}) : T ? /* @__PURE__ */ D("div", {
|
|
3707
3701
|
className: o,
|
|
3708
3702
|
children: [
|
|
3709
|
-
|
|
3710
|
-
filters:
|
|
3711
|
-
value:
|
|
3712
|
-
onChange:
|
|
3713
|
-
onClear:
|
|
3714
|
-
resultCount:
|
|
3715
|
-
totalCount:
|
|
3703
|
+
O.length > 0 && /* @__PURE__ */ E(yt, {
|
|
3704
|
+
filters: O,
|
|
3705
|
+
value: k,
|
|
3706
|
+
onChange: Me,
|
|
3707
|
+
onClear: j,
|
|
3708
|
+
resultCount: Ne.length,
|
|
3709
|
+
totalCount: xe.length,
|
|
3716
3710
|
labels: {
|
|
3717
3711
|
all: "全部",
|
|
3718
3712
|
clear: "清除筛选",
|
|
@@ -3722,53 +3716,53 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3722
3716
|
}),
|
|
3723
3717
|
/* @__PURE__ */ E("div", {
|
|
3724
3718
|
className: "h-[calc(100vh-200px)] min-h-[600px]",
|
|
3725
|
-
children: T?.resourceView &&
|
|
3726
|
-
tasks:
|
|
3727
|
-
assignee:
|
|
3728
|
-
effort:
|
|
3719
|
+
children: T?.resourceView && Ce ? /* @__PURE__ */ E(z, {
|
|
3720
|
+
tasks: Ne,
|
|
3721
|
+
assignee: Ce,
|
|
3722
|
+
effort: we,
|
|
3729
3723
|
capacity: T?.capacity ?? 1,
|
|
3730
3724
|
viewMode: e.viewMode || "day"
|
|
3731
|
-
}) : /* @__PURE__ */ E(
|
|
3732
|
-
tasks:
|
|
3733
|
-
startDate:
|
|
3734
|
-
endDate:
|
|
3725
|
+
}) : /* @__PURE__ */ E(st, {
|
|
3726
|
+
tasks: Ne,
|
|
3727
|
+
startDate: M?.start,
|
|
3728
|
+
endDate: M?.end,
|
|
3735
3729
|
onTaskClick: (e) => {
|
|
3736
|
-
|
|
3730
|
+
N.handleClick(e.data), d?.(e.data);
|
|
3737
3731
|
},
|
|
3738
|
-
onTaskUpdate:
|
|
3739
|
-
onTaskDelete:
|
|
3740
|
-
onDependencyCreate: T?.dependenciesField ?
|
|
3741
|
-
onDependencyDelete: T?.dependenciesField ?
|
|
3732
|
+
onTaskUpdate: P,
|
|
3733
|
+
onTaskDelete: Ue,
|
|
3734
|
+
onDependencyCreate: T?.dependenciesField ? Re : void 0,
|
|
3735
|
+
onDependencyDelete: T?.dependenciesField ? ze : void 0,
|
|
3742
3736
|
markers: e.markers,
|
|
3743
3737
|
autoSchedule: !!T?.dependenciesField,
|
|
3744
3738
|
rescheduleOnConflict: !!T?.dependenciesField,
|
|
3745
3739
|
criticalPathDefault: !!e.criticalPath,
|
|
3746
|
-
workingCalendar:
|
|
3747
|
-
shiftSegments:
|
|
3740
|
+
workingCalendar: Te,
|
|
3741
|
+
shiftSegments: Ee,
|
|
3748
3742
|
showBaselines: e.showBaselines !== !1,
|
|
3749
3743
|
readOnly: !!e.readOnly,
|
|
3750
3744
|
mobileReadOnly: e.mobileReadOnly !== !1,
|
|
3751
3745
|
persistLayoutKey: e.persistLayout === !1 ? void 0 : `${e.objectName || (w?.provider === "object" ? w.object : "") || "gantt"}:${e.viewName || "default"}`,
|
|
3752
|
-
groupBy:
|
|
3746
|
+
groupBy: Se,
|
|
3753
3747
|
defaultCollapsedDepth: T?.defaultCollapsedDepth,
|
|
3754
3748
|
inlineEdit: !0
|
|
3755
3749
|
})
|
|
3756
3750
|
}),
|
|
3757
|
-
|
|
3758
|
-
let t = w?.provider === "object" ? w.object : e.objectName, n =
|
|
3751
|
+
N.isOverlay && N.isOpen && N.selectedRecord && (() => {
|
|
3752
|
+
let t = w?.provider === "object" ? w.object : e.objectName, n = N.selectedRecord, r = n.id ?? n._id;
|
|
3759
3753
|
if (!t || r == null) return null;
|
|
3760
3754
|
let a = T?.titleField ? String(n[T.titleField] ?? "Task Details") : "Task Details";
|
|
3761
|
-
return /* @__PURE__ */ E(
|
|
3755
|
+
return /* @__PURE__ */ E(g, {
|
|
3762
3756
|
open: !0,
|
|
3763
|
-
onClose:
|
|
3757
|
+
onClose: N.close,
|
|
3764
3758
|
title: a,
|
|
3765
3759
|
record: n,
|
|
3766
3760
|
objectName: t,
|
|
3767
3761
|
recordId: r,
|
|
3768
3762
|
dataSource: i,
|
|
3769
3763
|
objectSchema: C,
|
|
3770
|
-
width:
|
|
3771
|
-
fullPageHref:
|
|
3764
|
+
width: N.width,
|
|
3765
|
+
fullPageHref: ee(t, r) ?? void 0,
|
|
3772
3766
|
onFieldSave: async (e, n) => {
|
|
3773
3767
|
i?.update && (await i.update(t, String(r), { [e]: n }), b((t) => t.map((t) => String(t.id ?? t._id) === String(r) ? {
|
|
3774
3768
|
...t,
|
|
@@ -3780,26 +3774,26 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3780
3774
|
}
|
|
3781
3775
|
});
|
|
3782
3776
|
})(),
|
|
3783
|
-
/* @__PURE__ */ E(
|
|
3784
|
-
open: !!
|
|
3777
|
+
/* @__PURE__ */ E(_, {
|
|
3778
|
+
open: !!F,
|
|
3785
3779
|
onOpenChange: (e) => {
|
|
3786
|
-
!e && !
|
|
3780
|
+
!e && !I && Ve(null);
|
|
3787
3781
|
},
|
|
3788
|
-
children: /* @__PURE__ */ D(
|
|
3782
|
+
children: /* @__PURE__ */ D(ne, { children: [/* @__PURE__ */ D(ae, { children: [/* @__PURE__ */ E(oe, { children: "Delete this task?" }), /* @__PURE__ */ E(re, { children: F ? /* @__PURE__ */ D(ke, { children: [
|
|
3789
3783
|
"\"",
|
|
3790
|
-
|
|
3784
|
+
F.title,
|
|
3791
3785
|
"\" will be permanently removed. This action cannot be undone."
|
|
3792
|
-
] }) : null })] }), /* @__PURE__ */ D(
|
|
3793
|
-
disabled:
|
|
3786
|
+
] }) : null })] }), /* @__PURE__ */ D(ie, { children: [/* @__PURE__ */ E(te, {
|
|
3787
|
+
disabled: I,
|
|
3794
3788
|
children: "Cancel"
|
|
3795
|
-
}), /* @__PURE__ */ E(
|
|
3789
|
+
}), /* @__PURE__ */ E(v, {
|
|
3796
3790
|
onClick: (e) => {
|
|
3797
|
-
e.preventDefault(),
|
|
3791
|
+
e.preventDefault(), We();
|
|
3798
3792
|
},
|
|
3799
|
-
disabled:
|
|
3793
|
+
disabled: I,
|
|
3800
3794
|
"data-testid": "gantt-delete-confirm",
|
|
3801
3795
|
className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
3802
|
-
children:
|
|
3796
|
+
children: I ? "Deleting…" : "Delete"
|
|
3803
3797
|
})] })] })
|
|
3804
3798
|
})
|
|
3805
3799
|
]
|
|
@@ -3813,14 +3807,14 @@ var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3813
3807
|
})
|
|
3814
3808
|
})
|
|
3815
3809
|
});
|
|
3816
|
-
},
|
|
3817
|
-
let { dataSource: t } =
|
|
3818
|
-
return /* @__PURE__ */ E(
|
|
3810
|
+
}, H = ({ schema: e }) => {
|
|
3811
|
+
let { dataSource: t } = f() || {};
|
|
3812
|
+
return /* @__PURE__ */ E(Tt, {
|
|
3819
3813
|
schema: e,
|
|
3820
3814
|
dataSource: t
|
|
3821
3815
|
});
|
|
3822
3816
|
};
|
|
3823
|
-
o.register("object-gantt",
|
|
3817
|
+
o.register("object-gantt", H, {
|
|
3824
3818
|
namespace: "plugin-gantt",
|
|
3825
3819
|
label: "Object Gantt",
|
|
3826
3820
|
category: "view",
|
|
@@ -3835,7 +3829,7 @@ o.register("object-gantt", Tt, {
|
|
|
3835
3829
|
label: "Gantt Config",
|
|
3836
3830
|
description: "startDateField, endDateField, titleField, progressField, percentageField, colorField, dependenciesField"
|
|
3837
3831
|
}]
|
|
3838
|
-
}), o.register("gantt",
|
|
3832
|
+
}), o.register("gantt", H, {
|
|
3839
3833
|
namespace: "view",
|
|
3840
3834
|
label: "Gantt View",
|
|
3841
3835
|
category: "view",
|
|
@@ -3852,4 +3846,4 @@ o.register("object-gantt", Tt, {
|
|
|
3852
3846
|
}]
|
|
3853
3847
|
});
|
|
3854
3848
|
//#endregion
|
|
3855
|
-
export {
|
|
3849
|
+
export { st as GanttView, Tt as ObjectGantt, H as ObjectGanttRenderer, yt as QuickFilterBar, z as ResourceWorkload, I as bandAt, lt as computeWorkload, St as normalizeDependencies, Be as normalizeShiftSegments, bt as normalizeTaskType, F as parseHHMM, Ve as shiftDayStart };
|