@object-ui/plugin-gantt 7.1.0 → 7.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 +27 -0
- package/dist/GanttView.d.ts +11 -1
- package/dist/GanttView.d.ts.map +1 -1
- package/dist/ObjectGantt.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1013 -908
- package/dist/index.umd.cjs +3 -3
- package/dist/shifts.d.ts +94 -0
- package/dist/shifts.d.ts.map +1 -0
- package/package.json +8 -8
package/dist/index.js
CHANGED
|
@@ -5,44 +5,44 @@ import { useNavigationOverlay as l, useObjectTranslation as u, useSchemaContext
|
|
|
5
5
|
import { GanttConfigSchema as f } from "@objectstack/spec/ui";
|
|
6
6
|
import { resolveFieldCurrency as p, useLocalization as m } from "@object-ui/i18n";
|
|
7
7
|
import { RecordDetailDrawer as h, deriveRecordPageHref as g } from "@object-ui/plugin-detail";
|
|
8
|
-
import { AlertDialog as
|
|
9
|
-
import { formatCurrency as se, formatDate as ce, formatDateTime as
|
|
10
|
-
import { Activity as pe, ChevronDown as me, ChevronLeft as he, ChevronRight as C, Crosshair as ge, Download as _e, FileDown as ve, Lock as w, Maximize2 as T, Minimize2 as ye, PanelLeft as
|
|
11
|
-
import { Fragment as
|
|
8
|
+
import { AlertDialog as ee, AlertDialogAction as _, AlertDialogCancel as v, AlertDialogContent as te, AlertDialogDescription as ne, AlertDialogFooter as re, AlertDialogHeader as ie, AlertDialogTitle as ae, Button as y, cn as b, useResizeObserver as oe } from "@object-ui/components";
|
|
9
|
+
import { formatCurrency as se, formatDate as ce, formatDateTime as le, formatNumber as x, formatPercent as ue, getSemanticColorName as S, getSemanticHex as de, humanizeLabel as fe } from "@object-ui/fields";
|
|
10
|
+
import { Activity as pe, ChevronDown as me, ChevronLeft as he, ChevronRight as C, Crosshair as ge, Download as _e, FileDown as ve, Lock as w, Maximize2 as T, Minimize2 as ye, PanelLeft as be, PanelLeftClose as xe, Redo2 as Se, Save as Ce, Undo2 as we, Wand2 as Te, ZoomIn as Ee, ZoomOut as De } from "lucide-react";
|
|
11
|
+
import { Fragment as Oe, jsx as E, jsxs as D } from "react/jsx-runtime";
|
|
12
12
|
//#region src/scheduling.ts
|
|
13
|
-
var
|
|
14
|
-
function
|
|
13
|
+
var O = 1e3 * 60 * 60 * 24, ke = (e) => e.toISOString().slice(0, 10);
|
|
14
|
+
function k(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(ke(e)));
|
|
20
20
|
}
|
|
21
|
-
function
|
|
21
|
+
function A(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 j(e, t) {
|
|
26
|
+
let n = A(e);
|
|
27
|
+
for (; !k(n, t);) n = new Date(n.getTime() + O);
|
|
28
28
|
return n.getTime();
|
|
29
29
|
}
|
|
30
|
-
function
|
|
30
|
+
function M(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 = A(e), a = A(t).getTime();
|
|
33
|
+
for (; i.getTime() < a;) k(i, n) && r++, i = new Date(i.getTime() + O);
|
|
34
34
|
return r;
|
|
35
35
|
}
|
|
36
|
-
function
|
|
37
|
-
if (t <= 0) return
|
|
38
|
-
let r =
|
|
39
|
-
for (; i > 0;)
|
|
36
|
+
function Ae(e, t, n) {
|
|
37
|
+
if (t <= 0) return A(e).getTime();
|
|
38
|
+
let r = A(e), i = t;
|
|
39
|
+
for (; i > 0;) k(r, n) && i--, r = new Date(r.getTime() + O);
|
|
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 N(e, t, n) {
|
|
43
|
+
if (t <= 0) return A(e).getTime();
|
|
44
|
+
let r = A(e), i = t;
|
|
45
|
+
for (; i > 0;) r = /* @__PURE__ */ new Date(r.getTime() - O), k(r, n) && i--;
|
|
46
46
|
return r.getTime();
|
|
47
47
|
}
|
|
48
48
|
var P = (e) => String(e);
|
|
@@ -71,7 +71,7 @@ function Ne(e) {
|
|
|
71
71
|
for (let n of e) n.parent != null && n.parent !== "" && t.add(P(n.parent));
|
|
72
72
|
return t;
|
|
73
73
|
}
|
|
74
|
-
function
|
|
74
|
+
function Pe(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 F(e, t) {
|
|
|
97
97
|
hasCycle: !1
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
|
-
function
|
|
100
|
+
function Fe(e, t) {
|
|
101
101
|
let n = {
|
|
102
102
|
criticalIds: /* @__PURE__ */ new Set(),
|
|
103
103
|
criticalEdges: /* @__PURE__ */ new Set()
|
|
@@ -105,10 +105,10 @@ function Pe(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 ?
|
|
108
|
+
let e = t ? M(n.start.getTime(), n.end.getTime(), t) : (n.end.getTime() - n.start.getTime()) / O;
|
|
109
109
|
r.set(P(n.id), Number.isFinite(e) && e > 0 ? e : 0);
|
|
110
110
|
}
|
|
111
|
-
let i = Me(e), a = e.map((e) => P(e.id)), { order: o, hasCycle: s } =
|
|
111
|
+
let i = Me(e), a = e.map((e) => P(e.id)), { order: o, hasCycle: s } = Pe(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, []);
|
|
@@ -129,19 +129,19 @@ function Pe(e, t) {
|
|
|
129
129
|
let t = (m.get(e) ?? 0) - (u.get(e) ?? 0);
|
|
130
130
|
Math.abs(t) <= h && g.add(e);
|
|
131
131
|
}
|
|
132
|
+
let ee = /* @__PURE__ */ new Set();
|
|
133
|
+
for (let e of i) ee.add(e.pred), ee.add(e.succ);
|
|
134
|
+
for (let e of [...g]) !ee.has(e) && (r.get(e) ?? 0) === 0 && g.delete(e);
|
|
132
135
|
let _ = /* @__PURE__ */ new Set();
|
|
133
|
-
for (let e of i)
|
|
134
|
-
for (let e of [...g]) !_.has(e) && (r.get(e) ?? 0) === 0 && g.delete(e);
|
|
135
|
-
let v = /* @__PURE__ */ new Set();
|
|
136
|
-
for (let e of i) !g.has(e.pred) || !g.has(e.succ) || Math.abs((d.get(e.pred) ?? 0) - (u.get(e.succ) ?? 0)) <= h && v.add(`${e.pred}->${e.succ}`);
|
|
136
|
+
for (let e of i) !g.has(e.pred) || !g.has(e.succ) || Math.abs((d.get(e.pred) ?? 0) - (u.get(e.succ) ?? 0)) <= h && _.add(`${e.pred}->${e.succ}`);
|
|
137
137
|
return {
|
|
138
138
|
criticalIds: g,
|
|
139
|
-
criticalEdges:
|
|
139
|
+
criticalEdges: _
|
|
140
140
|
};
|
|
141
141
|
}
|
|
142
|
-
function
|
|
142
|
+
function Ie(e, t) {
|
|
143
143
|
if (!e.length) return [];
|
|
144
|
-
let n = Me(e), r = e.map((e) => P(e.id)), { order: i, hasCycle: a } =
|
|
144
|
+
let n = Me(e), r = e.map((e) => P(e.id)), { order: i, hasCycle: a } = Pe(r, n);
|
|
145
145
|
if (a) return [];
|
|
146
146
|
let o = Ne(e), s = /* @__PURE__ */ new Map();
|
|
147
147
|
for (let t of e) s.set(P(t.id), t);
|
|
@@ -153,7 +153,7 @@ function Fe(e, t) {
|
|
|
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 ? M(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 Fe(e, t) {
|
|
|
161
161
|
o = e;
|
|
162
162
|
break;
|
|
163
163
|
case "ff":
|
|
164
|
-
o = t ?
|
|
164
|
+
o = t ? N(a, r, t) : a - r;
|
|
165
165
|
break;
|
|
166
166
|
case "sf":
|
|
167
|
-
o = t ?
|
|
167
|
+
o = t ? N(e, r, t) : e - r;
|
|
168
168
|
break;
|
|
169
169
|
default:
|
|
170
170
|
o = a;
|
|
@@ -173,8 +173,8 @@ function Fe(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 = j(i, t);
|
|
177
|
+
l.set(e, n), u.set(e, Ae(n, r, t));
|
|
178
178
|
} else l.set(e, i), u.set(e, i + r);
|
|
179
179
|
}
|
|
180
180
|
let d = [];
|
|
@@ -191,8 +191,50 @@ function Fe(e, t) {
|
|
|
191
191
|
return d;
|
|
192
192
|
}
|
|
193
193
|
//#endregion
|
|
194
|
+
//#region src/shifts.ts
|
|
195
|
+
var F = 6e4;
|
|
196
|
+
1440 * F;
|
|
197
|
+
var Le = 1440;
|
|
198
|
+
function I(e) {
|
|
199
|
+
if (typeof e != "string") return null;
|
|
200
|
+
let t = /^(\d{1,2}):(\d{2})$/.exec(e.trim());
|
|
201
|
+
if (!t) return null;
|
|
202
|
+
let n = Number(t[1]), r = Number(t[2]);
|
|
203
|
+
return n < 0 || n > 23 || r < 0 || r > 59 ? null : n * 60 + r;
|
|
204
|
+
}
|
|
205
|
+
function Re(e) {
|
|
206
|
+
if (!e || !Array.isArray(e.bands) || e.bands.length === 0) return null;
|
|
207
|
+
let t = I(e.dayStart) ?? 0, n = [];
|
|
208
|
+
for (let t = 0; t < e.bands.length; t++) {
|
|
209
|
+
let r = e.bands[t], i = I(r.start), a = I(r.end);
|
|
210
|
+
if (i == null || a == null || !r.label) return null;
|
|
211
|
+
let o = (a - i + Le) % Le || Le;
|
|
212
|
+
n.push({
|
|
213
|
+
key: r.key ?? `band${t}`,
|
|
214
|
+
label: r.label,
|
|
215
|
+
color: r.color,
|
|
216
|
+
durMs: o * F
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
dayStartMin: t,
|
|
221
|
+
bands: n,
|
|
222
|
+
showMidnight: e.showMidnight !== !1
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
function ze(e, t) {
|
|
226
|
+
let n = new Date(e);
|
|
227
|
+
return n.setHours(0, 0, 0, 0), n.setMinutes(t), n.getTime() > e.getTime() && n.setDate(n.getDate() - 1), n;
|
|
228
|
+
}
|
|
229
|
+
function Be(e, t) {
|
|
230
|
+
if (t.bands.length === 0) return null;
|
|
231
|
+
let n = ze(e, t.dayStartMin).getTime(), r = e.getTime() - n, i = 0;
|
|
232
|
+
for (let e of t.bands) if (i += e.durMs, r < i) return e;
|
|
233
|
+
return t.bands[t.bands.length - 1];
|
|
234
|
+
}
|
|
235
|
+
//#endregion
|
|
194
236
|
//#region src/useGanttTranslation.ts
|
|
195
|
-
var
|
|
237
|
+
var Ve = {
|
|
196
238
|
"gantt.column.taskName": "Task Name",
|
|
197
239
|
"gantt.column.start": "Start",
|
|
198
240
|
"gantt.column.end": "End",
|
|
@@ -250,60 +292,60 @@ var Ie = {
|
|
|
250
292
|
"gantt.readOnly": "Read-only",
|
|
251
293
|
"gantt.readOnlyHint": "Editing is disabled for this view."
|
|
252
294
|
};
|
|
253
|
-
function
|
|
254
|
-
let n =
|
|
295
|
+
function He(e, t) {
|
|
296
|
+
let n = Ve[e] || e;
|
|
255
297
|
if (t) for (let [e, r] of Object.entries(t)) n = n.replace(`{{${e}}}`, String(r));
|
|
256
298
|
return n;
|
|
257
299
|
}
|
|
258
|
-
function
|
|
300
|
+
function Ue() {
|
|
259
301
|
try {
|
|
260
302
|
let e = u();
|
|
261
303
|
return {
|
|
262
304
|
t: (t, n) => {
|
|
263
305
|
let r = e.t(t, n);
|
|
264
|
-
return typeof r == "string" && r !== t ? r :
|
|
306
|
+
return typeof r == "string" && r !== t ? r : He(t, n);
|
|
265
307
|
},
|
|
266
308
|
language: e.language
|
|
267
309
|
};
|
|
268
310
|
} catch {
|
|
269
311
|
return {
|
|
270
|
-
t:
|
|
312
|
+
t: He,
|
|
271
313
|
language: void 0
|
|
272
314
|
};
|
|
273
315
|
}
|
|
274
316
|
}
|
|
275
317
|
//#endregion
|
|
276
318
|
//#region src/GanttView.tsx
|
|
277
|
-
function
|
|
319
|
+
function We(e) {
|
|
278
320
|
return 110;
|
|
279
321
|
}
|
|
280
|
-
function
|
|
322
|
+
function Ge(e) {
|
|
281
323
|
return e < 640 ? 140 : e < 1024 ? 220 : 320;
|
|
282
324
|
}
|
|
283
|
-
function
|
|
325
|
+
function Ke(e) {
|
|
284
326
|
return e >= 280;
|
|
285
327
|
}
|
|
286
|
-
function
|
|
328
|
+
function qe(e) {
|
|
287
329
|
return e < 640 ? 32 : 40;
|
|
288
330
|
}
|
|
289
|
-
var
|
|
331
|
+
var Je = [
|
|
290
332
|
"day",
|
|
291
333
|
"week",
|
|
292
334
|
"month",
|
|
293
335
|
"quarter",
|
|
294
336
|
"year"
|
|
295
|
-
],
|
|
337
|
+
], Ye = {
|
|
296
338
|
day: 1,
|
|
297
339
|
week: 7,
|
|
298
340
|
month: 30.44,
|
|
299
341
|
quarter: 91.31,
|
|
300
342
|
year: 365.25
|
|
301
|
-
},
|
|
302
|
-
function
|
|
343
|
+
}, Xe = 1e3 * 60 * 60 * 24;
|
|
344
|
+
function Ze(e, t) {
|
|
303
345
|
let n = new Date(e);
|
|
304
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;
|
|
305
347
|
}
|
|
306
|
-
function
|
|
348
|
+
function Qe(e, t, n) {
|
|
307
349
|
let r = e.length - 1, i = 0;
|
|
308
350
|
for (; i < r && e[i + 1] < t;) i++;
|
|
309
351
|
let a = i;
|
|
@@ -313,7 +355,7 @@ function Ke(e, t, n) {
|
|
|
313
355
|
end: a
|
|
314
356
|
};
|
|
315
357
|
}
|
|
316
|
-
function
|
|
358
|
+
function $e(e, t, n) {
|
|
317
359
|
let r = new Date(e);
|
|
318
360
|
if (n === "day") r.setDate(r.getDate() + t);
|
|
319
361
|
else if (n === "week") r.setDate(r.getDate() + t * 7);
|
|
@@ -325,7 +367,7 @@ function qe(e, t, n) {
|
|
|
325
367
|
}
|
|
326
368
|
return r;
|
|
327
369
|
}
|
|
328
|
-
function
|
|
370
|
+
function et(e, t, n, r = 2) {
|
|
329
371
|
return new Promise((i) => {
|
|
330
372
|
let a = new Blob([e], { type: "image/svg+xml;charset=utf-8" }), o = URL.createObjectURL(a), s = new Image();
|
|
331
373
|
s.onload = () => {
|
|
@@ -338,11 +380,11 @@ function Je(e, t, n, r = 2) {
|
|
|
338
380
|
}, s.src = o;
|
|
339
381
|
});
|
|
340
382
|
}
|
|
341
|
-
function
|
|
383
|
+
function tt(e, t) {
|
|
342
384
|
let n = document.createElement("a");
|
|
343
385
|
n.href = URL.createObjectURL(e), n.download = t, document.body.appendChild(n), n.click(), n.remove(), setTimeout(() => URL.revokeObjectURL(n.href), 1e3);
|
|
344
386
|
}
|
|
345
|
-
function
|
|
387
|
+
function nt(e, t, n) {
|
|
346
388
|
let r = (e) => {
|
|
347
389
|
let t = new Uint8Array(e.length);
|
|
348
390
|
for (let n = 0; n < e.length; n++) t[n] = e.charCodeAt(n) & 255;
|
|
@@ -357,18 +399,18 @@ function Xe(e, t, n) {
|
|
|
357
399
|
for (let e of o) d += `${String(e).padStart(10, "0")} 00000 n \n`;
|
|
358
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" });
|
|
359
401
|
}
|
|
360
|
-
function
|
|
402
|
+
function rt(e) {
|
|
361
403
|
let t = e.slice(e.indexOf(",") + 1), n = atob(t), r = new Uint8Array(n.length);
|
|
362
404
|
for (let e = 0; e < n.length; e++) r[e] = n.charCodeAt(e);
|
|
363
405
|
return r;
|
|
364
406
|
}
|
|
365
|
-
var
|
|
366
|
-
function
|
|
407
|
+
var it = "gantt-layout:";
|
|
408
|
+
function at(e) {
|
|
367
409
|
if (!e || typeof window > "u") return null;
|
|
368
410
|
try {
|
|
369
|
-
let t = window.localStorage.getItem(
|
|
411
|
+
let t = window.localStorage.getItem(it + e);
|
|
370
412
|
if (!t) return null;
|
|
371
|
-
let n = JSON.parse(t), r = n.viewMode &&
|
|
413
|
+
let n = JSON.parse(t), r = n.viewMode && Je.includes(n.viewMode) ? n.viewMode : null;
|
|
372
414
|
if (!r) return null;
|
|
373
415
|
let i = typeof n.columnWidth == "number" && isFinite(n.columnWidth) ? n.columnWidth : null, a = typeof n.taskListWidth == "number" && isFinite(n.taskListWidth) ? n.taskListWidth : null;
|
|
374
416
|
return {
|
|
@@ -381,43 +423,43 @@ function $e(e) {
|
|
|
381
423
|
return null;
|
|
382
424
|
}
|
|
383
425
|
}
|
|
384
|
-
function
|
|
426
|
+
function ot(e, t) {
|
|
385
427
|
if (!(typeof window > "u")) try {
|
|
386
|
-
window.localStorage.setItem(
|
|
428
|
+
window.localStorage.setItem(it + e, JSON.stringify(t));
|
|
387
429
|
} catch {}
|
|
388
430
|
}
|
|
389
|
-
function
|
|
390
|
-
let { t: x, language:
|
|
391
|
-
I.current === void 0 && (I.current =
|
|
392
|
-
let
|
|
431
|
+
function L({ 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: se, persistLayoutKey: ce, onLayoutChange: le }) {
|
|
432
|
+
let { t: x, language: ue } = Ue(), S = ue || void 0, [de, fe] = e.useState(/* @__PURE__ */ new Date()), O = e.useRef(null), { width: ke } = oe(O), k = ke || (typeof window < "u" ? window.innerWidth : 1024), A = k < 640, j = ne || re && A, M = j ? void 0 : s, Ae = j ? void 0 : c, N = j ? void 0 : u, P = j ? void 0 : d, je = j ? void 0 : f, Me = j ? !1 : m, Ne = j ? !1 : h, Pe = j ? !1 : g, F = qe(k), Le = We(k), I = e.useRef(void 0);
|
|
433
|
+
I.current === void 0 && (I.current = at(ce));
|
|
434
|
+
let Re = I.current, [Be, Ve] = e.useState(Re ? Re.columnWidth : null), [He, it] = e.useState(Re ? Re.taskListWidth ?? null : null), [L, st] = e.useState(n && Je.includes(n) ? n : Re?.viewMode ?? "day");
|
|
393
435
|
e.useEffect(() => {
|
|
394
|
-
n &&
|
|
436
|
+
n && Je.includes(n) && st(n);
|
|
395
437
|
}, [n]);
|
|
396
|
-
let
|
|
438
|
+
let ct = e.useRef(null), lt = e.useRef(null), ut = e.useRef(!0), [R, dt] = e.useState(Re ? Re.taskListCollapsed : !1), ft = e.useRef(!1);
|
|
397
439
|
e.useEffect(() => {
|
|
398
|
-
!
|
|
440
|
+
!ft.current && A && (dt(!0), ft.current = !0);
|
|
399
441
|
}, [A]);
|
|
400
|
-
let
|
|
401
|
-
if (
|
|
442
|
+
let pt = Math.max(160, k - 200), z = R ? 0 : He == null ? Ge(k) : Math.max(160, Math.min(He, pt)), mt = e.useMemo(() => {
|
|
443
|
+
if (Be != null || i || t.length === 0) return null;
|
|
402
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())));
|
|
403
|
-
r || e.setDate(e.getDate() - 7), n.setDate(n.getDate() + 14), e =
|
|
404
|
-
let a = Math.max(1, (n.getTime() - e.getTime()) /
|
|
445
|
+
r || e.setDate(e.getDate() - 7), n.setDate(n.getDate() + 14), e = Ze(e, L), n.setHours(23, 59, 59, 999);
|
|
446
|
+
let a = Math.max(1, (n.getTime() - e.getTime()) / Xe), o = Math.max(0, k - z);
|
|
405
447
|
if (o <= 0) return null;
|
|
406
|
-
let s = o / a *
|
|
407
|
-
if (s <=
|
|
448
|
+
let s = o / a * Ye[L];
|
|
449
|
+
if (s <= Le) return null;
|
|
408
450
|
let c = Math.min(s, o * .6);
|
|
409
|
-
return c >
|
|
451
|
+
return c > Le ? c : null;
|
|
410
452
|
}, [
|
|
411
|
-
|
|
453
|
+
Be,
|
|
412
454
|
t,
|
|
413
455
|
r,
|
|
414
456
|
i,
|
|
415
457
|
L,
|
|
416
458
|
k,
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
]),
|
|
420
|
-
if (!
|
|
459
|
+
z,
|
|
460
|
+
Le
|
|
461
|
+
]), B = Be ?? mt ?? Le, ht = B / Ye[L], gt = Ke(z), [_t, vt] = e.useState(null), [yt, bt] = e.useState({}), [xt, St] = e.useState(null), V = e.useMemo(() => {
|
|
462
|
+
if (!ie) return t;
|
|
421
463
|
let e = /* @__PURE__ */ new Set();
|
|
422
464
|
for (let n of t) {
|
|
423
465
|
let t = n.parent != null && n.parent !== "" ? String(n.parent) : null;
|
|
@@ -426,7 +468,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
426
468
|
let n = /* @__PURE__ */ new Map();
|
|
427
469
|
for (let r of t) {
|
|
428
470
|
if (e.has(String(r.id))) continue;
|
|
429
|
-
let t =
|
|
471
|
+
let t = ie(r), i = t ? String(t.key) : "__ungrouped__", a = t ? t.label : ae, o = n.get(i);
|
|
430
472
|
o || (o = {
|
|
431
473
|
key: i,
|
|
432
474
|
label: a,
|
|
@@ -453,12 +495,12 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
453
495
|
}
|
|
454
496
|
return r;
|
|
455
497
|
}, [
|
|
456
|
-
|
|
498
|
+
ie,
|
|
457
499
|
t,
|
|
458
|
-
|
|
459
|
-
]),
|
|
460
|
-
let e = new Set(
|
|
461
|
-
for (let n of
|
|
500
|
+
ae
|
|
501
|
+
]), Ct = e.useMemo(() => {
|
|
502
|
+
let e = new Set(V.map((e) => String(e.id))), t = /* @__PURE__ */ new Map();
|
|
503
|
+
for (let n of V) {
|
|
462
504
|
let r = n.parent != null && n.parent !== "" ? String(n.parent) : null;
|
|
463
505
|
if (r && r !== String(n.id) && e.has(r)) {
|
|
464
506
|
let e = t.get(r);
|
|
@@ -466,31 +508,31 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
466
508
|
}
|
|
467
509
|
}
|
|
468
510
|
return t;
|
|
469
|
-
}, [
|
|
511
|
+
}, [V]), wt = e.useMemo(() => {
|
|
470
512
|
let e = /* @__PURE__ */ new Map();
|
|
471
|
-
for (let t of
|
|
513
|
+
for (let t of V) e.set(String(t.id), t);
|
|
472
514
|
return e;
|
|
473
|
-
}, [
|
|
515
|
+
}, [V]), Tt = e.useCallback((e) => {
|
|
474
516
|
let t = [], n = /* @__PURE__ */ new Set(), r = (e) => {
|
|
475
|
-
for (let i of
|
|
517
|
+
for (let i of Ct.get(e) ?? []) {
|
|
476
518
|
let e = String(i.id);
|
|
477
519
|
n.has(e) || (n.add(e), t.push(i), r(e));
|
|
478
520
|
}
|
|
479
521
|
};
|
|
480
522
|
return r(String(e)), t;
|
|
481
|
-
}, [
|
|
523
|
+
}, [Ct]), [H, Et] = e.useState(null), Dt = e.useRef(null);
|
|
482
524
|
e.useEffect(() => {
|
|
483
|
-
|
|
484
|
-
}, [
|
|
485
|
-
let
|
|
486
|
-
let t =
|
|
487
|
-
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 =
|
|
525
|
+
Dt.current = H;
|
|
526
|
+
}, [H]);
|
|
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)) : Xe, n = (e, t) => En.current ? En.current(e, t) : $e(e, t, L), r = new Date(e.originStart), i = new Date(e.originEnd);
|
|
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))), {
|
|
488
530
|
start: r,
|
|
489
531
|
end: i
|
|
490
532
|
};
|
|
491
|
-
}, [L]),
|
|
492
|
-
|
|
493
|
-
let
|
|
533
|
+
}, [L, v]), At = e.useRef(t);
|
|
534
|
+
At.current = t;
|
|
535
|
+
let jt = e.useRef([]), Mt = e.useRef([]), [Nt, Pt] = e.useState(0), Ft = e.useCallback((e) => {
|
|
494
536
|
if (!M) return;
|
|
495
537
|
let t = [];
|
|
496
538
|
for (let { task: n, changes: r } of e) {
|
|
@@ -505,30 +547,30 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
505
547
|
after: i
|
|
506
548
|
});
|
|
507
549
|
}
|
|
508
|
-
t.length && (
|
|
509
|
-
}, [M]), [
|
|
510
|
-
if (!
|
|
550
|
+
t.length && (jt.current.push(t), Mt.current = [], Pt((e) => e + 1));
|
|
551
|
+
}, [M]), [It, Lt] = e.useState(null), Rt = e.useCallback((e) => {
|
|
552
|
+
if (!Pe) return;
|
|
511
553
|
let t = /* @__PURE__ */ new Map();
|
|
512
554
|
for (let { task: n, changes: r } of e) t.set(String(n.id), {
|
|
513
555
|
start: r.start ?? n.start,
|
|
514
556
|
end: r.end ?? n.end
|
|
515
557
|
});
|
|
516
|
-
let n =
|
|
558
|
+
let n = Ie(At.current.map((e) => {
|
|
517
559
|
let n = t.get(String(e.id));
|
|
518
560
|
return n ? {
|
|
519
561
|
...e,
|
|
520
562
|
start: n.start,
|
|
521
563
|
end: n.end
|
|
522
564
|
} : e;
|
|
523
|
-
}),
|
|
565
|
+
}), _).filter((e) => {
|
|
524
566
|
let n = t.get(e.id);
|
|
525
567
|
return !n || e.start.getTime() !== n.start.getTime() || e.end.getTime() !== n.end.getTime();
|
|
526
568
|
});
|
|
527
|
-
n.length &&
|
|
528
|
-
}, [
|
|
529
|
-
if (!
|
|
530
|
-
let e =
|
|
531
|
-
let t =
|
|
569
|
+
n.length && Lt(n);
|
|
570
|
+
}, [Pe, _]), zt = e.useCallback(() => {
|
|
571
|
+
if (!It) return;
|
|
572
|
+
let e = It.map((e) => {
|
|
573
|
+
let t = At.current.find((t) => String(t.id) === e.id);
|
|
532
574
|
return t ? {
|
|
533
575
|
task: t,
|
|
534
576
|
changes: {
|
|
@@ -537,48 +579,48 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
537
579
|
}
|
|
538
580
|
} : null;
|
|
539
581
|
}).filter(Boolean);
|
|
540
|
-
e.length &&
|
|
541
|
-
}, [
|
|
582
|
+
e.length && Ft(e), Lt(null);
|
|
583
|
+
}, [It, Ft]), Bt = e.useCallback((e, t) => {
|
|
542
584
|
if (M) for (let n of e) {
|
|
543
|
-
let e =
|
|
585
|
+
let e = At.current.find((e) => String(e.id) === n.taskId);
|
|
544
586
|
e && M(e, t === "undo" ? n.before : n.after);
|
|
545
587
|
}
|
|
546
|
-
}, [M]),
|
|
547
|
-
let e = At.current.pop();
|
|
548
|
-
e && (Rt(e, "undo"), jt.current.push(e), Nt((e) => e + 1));
|
|
549
|
-
}, [Rt]), Bt = e.useCallback(() => {
|
|
588
|
+
}, [M]), Vt = e.useCallback(() => {
|
|
550
589
|
let e = jt.current.pop();
|
|
551
|
-
e && (
|
|
552
|
-
}, [
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
}
|
|
590
|
+
e && (Bt(e, "undo"), Mt.current.push(e), Pt((e) => e + 1));
|
|
591
|
+
}, [Bt]), Ht = e.useCallback(() => {
|
|
592
|
+
let e = Mt.current.pop();
|
|
593
|
+
e && (Bt(e, "redo"), jt.current.push(e), Pt((e) => e + 1));
|
|
594
|
+
}, [Bt]), { canUndo: Ut, canRedo: Wt } = e.useMemo(() => ({
|
|
595
|
+
canUndo: jt.current.length > 0,
|
|
596
|
+
canRedo: Mt.current.length > 0
|
|
597
|
+
}), [Nt]);
|
|
556
598
|
e.useEffect(() => {
|
|
557
|
-
if (!
|
|
558
|
-
let e = (e) => {
|
|
559
|
-
let
|
|
560
|
-
if (!
|
|
561
|
-
let
|
|
562
|
-
|
|
563
|
-
...
|
|
564
|
-
unitDelta:
|
|
599
|
+
if (!H) return;
|
|
600
|
+
let e = L === "day" && v && v.bands.length > 0 && v ? ht * Math.min(...v.bands.map((e) => e.durMs)) / Xe : B, n = (t) => {
|
|
601
|
+
let n = Dt.current;
|
|
602
|
+
if (!n) return;
|
|
603
|
+
let r = Math.round((t.clientX - n.originClientX) / Math.max(e, 1));
|
|
604
|
+
r !== n.unitDelta && Et({
|
|
605
|
+
...n,
|
|
606
|
+
unitDelta: r
|
|
565
607
|
});
|
|
566
|
-
},
|
|
567
|
-
let e =
|
|
608
|
+
}, r = () => {
|
|
609
|
+
let e = Dt.current;
|
|
568
610
|
if (e) {
|
|
569
611
|
if (e.unitDelta !== 0) {
|
|
570
612
|
let n = t.find((t) => t.id === e.taskId);
|
|
571
613
|
if (n && M) {
|
|
572
|
-
let { start: t, end: r } =
|
|
614
|
+
let { start: t, end: r } = kt(e);
|
|
573
615
|
if (e.group) {
|
|
574
|
-
let r = t.getTime() - e.originStart.getTime(), i = [n, ...
|
|
616
|
+
let r = t.getTime() - e.originStart.getTime(), i = [n, ...Tt(n.id)].map((e) => ({
|
|
575
617
|
task: e,
|
|
576
618
|
changes: {
|
|
577
619
|
start: new Date(e.start.getTime() + r),
|
|
578
620
|
end: new Date(e.end.getTime() + r)
|
|
579
621
|
}
|
|
580
622
|
}));
|
|
581
|
-
|
|
623
|
+
Ft(i), Rt(i);
|
|
582
624
|
} else {
|
|
583
625
|
let e = [{
|
|
584
626
|
task: n,
|
|
@@ -587,31 +629,34 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
587
629
|
end: r
|
|
588
630
|
}
|
|
589
631
|
}];
|
|
590
|
-
|
|
632
|
+
Ft(e), Rt(e);
|
|
591
633
|
}
|
|
592
634
|
}
|
|
593
|
-
|
|
594
|
-
|
|
635
|
+
Ot.current = !0, window.setTimeout(() => {
|
|
636
|
+
Ot.current = !1;
|
|
595
637
|
}, 0);
|
|
596
638
|
}
|
|
597
|
-
|
|
639
|
+
Et(null);
|
|
598
640
|
}
|
|
599
641
|
};
|
|
600
|
-
return window.addEventListener("pointermove",
|
|
601
|
-
window.removeEventListener("pointermove",
|
|
642
|
+
return window.addEventListener("pointermove", n), window.addEventListener("pointerup", r), window.addEventListener("pointercancel", r), () => {
|
|
643
|
+
window.removeEventListener("pointermove", n), window.removeEventListener("pointerup", r), window.removeEventListener("pointercancel", r);
|
|
602
644
|
};
|
|
603
645
|
}, [
|
|
604
|
-
|
|
605
|
-
|
|
646
|
+
H,
|
|
647
|
+
B,
|
|
648
|
+
ht,
|
|
649
|
+
L,
|
|
650
|
+
v,
|
|
606
651
|
t,
|
|
607
652
|
M,
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
653
|
+
kt,
|
|
654
|
+
Tt,
|
|
655
|
+
Ft,
|
|
656
|
+
Rt
|
|
612
657
|
]);
|
|
613
|
-
let
|
|
614
|
-
!M || e.data?.__group || (n.stopPropagation(), n.preventDefault(),
|
|
658
|
+
let Gt = e.useCallback((e, t, n, r) => {
|
|
659
|
+
!M || e.data?.__group || (n.stopPropagation(), n.preventDefault(), Et({
|
|
615
660
|
taskId: e.id,
|
|
616
661
|
mode: t,
|
|
617
662
|
group: r?.group ?? !1,
|
|
@@ -620,66 +665,66 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
620
665
|
originClientX: n.clientX,
|
|
621
666
|
unitDelta: 0
|
|
622
667
|
}));
|
|
623
|
-
}, [M]), [
|
|
668
|
+
}, [M]), [Kt, qt] = e.useState(null), Jt = e.useRef(null);
|
|
624
669
|
e.useEffect(() => {
|
|
625
|
-
|
|
626
|
-
}, [
|
|
627
|
-
if (!
|
|
670
|
+
Jt.current = Kt;
|
|
671
|
+
}, [Kt]), e.useEffect(() => {
|
|
672
|
+
if (!Kt) return;
|
|
628
673
|
let e = (e) => {
|
|
629
|
-
let t =
|
|
674
|
+
let t = Jt.current;
|
|
630
675
|
if (!t) return;
|
|
631
676
|
let n = Math.min(100, Math.max(0, Math.round(t.originProgress + (e.clientX - t.originClientX) / Math.max(t.barWidth, 1) * 100)));
|
|
632
|
-
n !== t.value &&
|
|
677
|
+
n !== t.value && qt({
|
|
633
678
|
...t,
|
|
634
679
|
value: n
|
|
635
680
|
});
|
|
636
681
|
}, n = () => {
|
|
637
|
-
let e =
|
|
682
|
+
let e = Jt.current;
|
|
638
683
|
if (e) {
|
|
639
684
|
if (e.value !== e.originProgress) {
|
|
640
685
|
let n = t.find((t) => t.id === e.taskId);
|
|
641
|
-
n && M &&
|
|
686
|
+
n && M && Ft([{
|
|
642
687
|
task: n,
|
|
643
688
|
changes: { progress: e.value }
|
|
644
|
-
}]),
|
|
645
|
-
|
|
689
|
+
}]), Ot.current = !0, window.setTimeout(() => {
|
|
690
|
+
Ot.current = !1;
|
|
646
691
|
}, 0);
|
|
647
692
|
}
|
|
648
|
-
|
|
693
|
+
qt(null);
|
|
649
694
|
}
|
|
650
695
|
};
|
|
651
696
|
return window.addEventListener("pointermove", e), window.addEventListener("pointerup", n), window.addEventListener("pointercancel", n), () => {
|
|
652
697
|
window.removeEventListener("pointermove", e), window.removeEventListener("pointerup", n), window.removeEventListener("pointercancel", n);
|
|
653
698
|
};
|
|
654
699
|
}, [
|
|
655
|
-
|
|
700
|
+
Kt,
|
|
656
701
|
t,
|
|
657
702
|
M,
|
|
658
|
-
|
|
703
|
+
Ft
|
|
659
704
|
]);
|
|
660
|
-
let
|
|
705
|
+
let Yt = e.useRef(null), [U, Xt] = e.useState(null), Zt = e.useRef(null);
|
|
661
706
|
e.useEffect(() => {
|
|
662
|
-
|
|
707
|
+
Zt.current = U;
|
|
663
708
|
}, [U]), e.useEffect(() => {
|
|
664
709
|
if (!U) return;
|
|
665
710
|
let e = (e) => {
|
|
666
|
-
let t =
|
|
711
|
+
let t = Yt.current?.getBoundingClientRect();
|
|
667
712
|
if (!t) return;
|
|
668
713
|
let n = e.clientX - t.left, r = e.clientY - t.top;
|
|
669
|
-
|
|
714
|
+
Xt((e) => e && {
|
|
670
715
|
...e,
|
|
671
716
|
x: n,
|
|
672
717
|
y: r
|
|
673
718
|
});
|
|
674
719
|
}, n = () => {
|
|
675
|
-
let e =
|
|
720
|
+
let e = Zt.current;
|
|
676
721
|
if (e && e.targetId != null && String(e.targetId) !== String(e.sourceId) && N) {
|
|
677
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"}`;
|
|
678
723
|
n && r && N(n, r, a);
|
|
679
724
|
}
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
}, 0),
|
|
725
|
+
Ot.current = !0, window.setTimeout(() => {
|
|
726
|
+
Ot.current = !1;
|
|
727
|
+
}, 0), Xt(null);
|
|
683
728
|
};
|
|
684
729
|
return window.addEventListener("pointermove", e), window.addEventListener("pointerup", n), window.addEventListener("pointercancel", n), () => {
|
|
685
730
|
window.removeEventListener("pointermove", e), window.removeEventListener("pointerup", n), window.removeEventListener("pointercancel", n);
|
|
@@ -689,67 +734,67 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
689
734
|
t,
|
|
690
735
|
N
|
|
691
736
|
]);
|
|
692
|
-
let [
|
|
737
|
+
let [Qt, $t] = e.useState(null), en = e.useRef(null);
|
|
693
738
|
e.useEffect(() => {
|
|
694
|
-
if (!
|
|
739
|
+
if (!Qt) return;
|
|
695
740
|
let e = (e) => {
|
|
696
|
-
|
|
741
|
+
en.current && e.target instanceof Node && en.current.contains(e.target) || $t(null);
|
|
697
742
|
}, t = (e) => {
|
|
698
|
-
e.key === "Escape" &&
|
|
743
|
+
e.key === "Escape" && $t(null);
|
|
699
744
|
};
|
|
700
745
|
return window.addEventListener("pointerdown", e, !0), window.addEventListener("keydown", t), () => {
|
|
701
746
|
window.removeEventListener("pointerdown", e, !0), window.removeEventListener("keydown", t);
|
|
702
747
|
};
|
|
703
|
-
}, [
|
|
704
|
-
let [W,
|
|
748
|
+
}, [Qt]);
|
|
749
|
+
let [W, tn] = e.useState(null), nn = e.useRef(null);
|
|
705
750
|
e.useEffect(() => {
|
|
706
751
|
if (!W) return;
|
|
707
752
|
let e = (e) => {
|
|
708
|
-
|
|
753
|
+
nn.current && e.target instanceof Node && nn.current.contains(e.target) || tn(null);
|
|
709
754
|
}, t = (e) => {
|
|
710
|
-
e.key === "Escape" &&
|
|
755
|
+
e.key === "Escape" && tn(null);
|
|
711
756
|
};
|
|
712
757
|
return window.addEventListener("pointerdown", e, !0), window.addEventListener("keydown", t), () => {
|
|
713
758
|
window.removeEventListener("pointerdown", e, !0), window.removeEventListener("keydown", t);
|
|
714
759
|
};
|
|
715
760
|
}, [W]);
|
|
716
|
-
let [
|
|
761
|
+
let [rn, an] = e.useState(null), on = e.useRef(null);
|
|
717
762
|
e.useEffect(() => {
|
|
718
|
-
if (!
|
|
763
|
+
if (!rn) return;
|
|
719
764
|
let e = (e) => {
|
|
720
|
-
|
|
765
|
+
on.current && e.target instanceof Node && on.current.contains(e.target) || an(null);
|
|
721
766
|
}, t = (e) => {
|
|
722
|
-
e.key === "Escape" &&
|
|
767
|
+
e.key === "Escape" && an(null);
|
|
723
768
|
};
|
|
724
769
|
return window.addEventListener("pointerdown", e, !0), window.addEventListener("keydown", t), () => {
|
|
725
770
|
window.removeEventListener("pointerdown", e, !0), window.removeEventListener("keydown", t);
|
|
726
771
|
};
|
|
727
|
-
}, [
|
|
728
|
-
let [
|
|
729
|
-
t.preventDefault(), t.stopPropagation(),
|
|
772
|
+
}, [rn]);
|
|
773
|
+
let [sn, cn] = e.useState(null), ln = !!(o || M || N || Ae), un = e.useCallback((e, t) => {
|
|
774
|
+
t.preventDefault(), t.stopPropagation(), cn(e.id), ln && $t({
|
|
730
775
|
x: t.clientX,
|
|
731
776
|
y: t.clientY,
|
|
732
777
|
taskId: e.id
|
|
733
778
|
});
|
|
734
|
-
}, [
|
|
735
|
-
r.preventDefault(), r.stopPropagation(), !(!N && !
|
|
779
|
+
}, [ln]), dn = e.useCallback((e, t, n, r) => {
|
|
780
|
+
r.preventDefault(), r.stopPropagation(), !(!N && !P) && tn({
|
|
736
781
|
x: r.clientX,
|
|
737
782
|
y: r.clientY,
|
|
738
783
|
sourceId: e,
|
|
739
784
|
targetId: t,
|
|
740
785
|
type: n
|
|
741
786
|
});
|
|
742
|
-
}, [N,
|
|
743
|
-
|
|
787
|
+
}, [N, P]), [fn, pn] = e.useState(() => /* @__PURE__ */ new Set()), mn = e.useCallback((e) => {
|
|
788
|
+
pn((t) => {
|
|
744
789
|
let n = new Set(t), r = String(e);
|
|
745
790
|
return n.has(r) ? n.delete(r) : n.add(r), n;
|
|
746
791
|
});
|
|
747
|
-
}, []),
|
|
792
|
+
}, []), hn = e.useRef(!1);
|
|
748
793
|
e.useEffect(() => {
|
|
749
|
-
if (
|
|
750
|
-
|
|
751
|
-
let e = new Map(
|
|
752
|
-
for (let n of
|
|
794
|
+
if (hn.current || se == null || V.length === 0) return;
|
|
795
|
+
hn.current = !0;
|
|
796
|
+
let e = new Map(V.map((e) => [String(e.id), e])), t = /* @__PURE__ */ new Set();
|
|
797
|
+
for (let n of V) {
|
|
753
798
|
let r = n.parent != null && n.parent !== "" ? String(n.parent) : null;
|
|
754
799
|
r && r !== String(n.id) && e.has(r) && t.add(r);
|
|
755
800
|
}
|
|
@@ -758,15 +803,15 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
758
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;
|
|
759
804
|
return n;
|
|
760
805
|
}, r = /* @__PURE__ */ new Set();
|
|
761
|
-
for (let e of
|
|
806
|
+
for (let e of V) {
|
|
762
807
|
let i = String(e.id);
|
|
763
|
-
t.has(i) && n(e) >=
|
|
808
|
+
t.has(i) && n(e) >= se && r.add(i);
|
|
764
809
|
}
|
|
765
|
-
r.size &&
|
|
766
|
-
}, [
|
|
810
|
+
r.size && pn((e) => e.size ? e : r);
|
|
811
|
+
}, [se, V]);
|
|
767
812
|
let G = e.useMemo(() => {
|
|
768
|
-
let e = new Set(
|
|
769
|
-
for (let r of
|
|
813
|
+
let e = new Set(V.map((e) => String(e.id))), t = /* @__PURE__ */ new Map(), n = [];
|
|
814
|
+
for (let r of V) {
|
|
770
815
|
let i = r.parent != null && r.parent !== "" ? String(r.parent) : null;
|
|
771
816
|
if (i && i !== String(r.id) && e.has(i)) {
|
|
772
817
|
let e = t.get(i);
|
|
@@ -788,7 +833,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
788
833
|
for (let a of s) {
|
|
789
834
|
let s = i(a, n);
|
|
790
835
|
(!e || s.start < e) && (e = s.start), (!t || s.end > t) && (t = s.end);
|
|
791
|
-
let c = Math.max(s.end.getTime() - s.start.getTime(),
|
|
836
|
+
let c = Math.max(s.end.getTime() - s.start.getTime(), Xe);
|
|
792
837
|
r += c * s.progress, o += c;
|
|
793
838
|
}
|
|
794
839
|
n.delete(a), c = {
|
|
@@ -816,28 +861,28 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
816
861
|
isSummary: d,
|
|
817
862
|
isMilestone: p,
|
|
818
863
|
...f
|
|
819
|
-
}), u) if (
|
|
864
|
+
}), u) if (fn.has(r)) s(e);
|
|
820
865
|
else for (let e of l) c(e, n + 1);
|
|
821
866
|
};
|
|
822
867
|
for (let e of n) c(e, 0);
|
|
823
|
-
for (let e of
|
|
868
|
+
for (let e of V) o.has(String(e.id)) || c(e, 0);
|
|
824
869
|
return a;
|
|
825
|
-
}, [
|
|
870
|
+
}, [V, fn]), gn = e.useCallback((e) => {
|
|
826
871
|
if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;
|
|
827
872
|
if ((e.ctrlKey || e.metaKey) && (e.key === "z" || e.key === "Z")) {
|
|
828
|
-
e.preventDefault(), e.shiftKey ?
|
|
873
|
+
e.preventDefault(), e.shiftKey ? Ht() : Vt();
|
|
829
874
|
return;
|
|
830
875
|
}
|
|
831
876
|
if ((e.ctrlKey || e.metaKey) && (e.key === "y" || e.key === "Y")) {
|
|
832
|
-
e.preventDefault(),
|
|
877
|
+
e.preventDefault(), Ht();
|
|
833
878
|
return;
|
|
834
879
|
}
|
|
835
880
|
if (!G.length) return;
|
|
836
|
-
let t =
|
|
881
|
+
let t = sn == null ? -1 : G.findIndex((e) => String(e.task.id) === String(sn));
|
|
837
882
|
if (e.key === "ArrowDown" || e.key === "ArrowUp") {
|
|
838
883
|
e.preventDefault();
|
|
839
884
|
let n = e.key === "ArrowDown" ? Math.min(G.length - 1, t + 1) : Math.max(0, t <= 0 ? 0 : t - 1);
|
|
840
|
-
|
|
885
|
+
cn(G[n].task.id);
|
|
841
886
|
let r = X.current;
|
|
842
887
|
if (r) {
|
|
843
888
|
let e = n * F;
|
|
@@ -847,20 +892,20 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
847
892
|
}
|
|
848
893
|
if (t < 0) return;
|
|
849
894
|
let n = G[t];
|
|
850
|
-
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" ? Ae && (e.preventDefault(), Ae(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));
|
|
851
896
|
}, [
|
|
852
897
|
G,
|
|
853
|
-
|
|
898
|
+
sn,
|
|
854
899
|
o,
|
|
855
|
-
|
|
856
|
-
un,
|
|
900
|
+
Ae,
|
|
857
901
|
fn,
|
|
902
|
+
mn,
|
|
858
903
|
F,
|
|
859
|
-
|
|
860
|
-
|
|
904
|
+
Vt,
|
|
905
|
+
Ht
|
|
861
906
|
]), K = e.useMemo(() => {
|
|
862
907
|
let e = r ? new Date(r) : /* @__PURE__ */ new Date(), n = i ? new Date(i) : /* @__PURE__ */ new Date();
|
|
863
|
-
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 =
|
|
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 ? ze(e, v.dayStartMin) : Ze(e, L), n.setHours(23, 59, 59, 999), {
|
|
864
909
|
start: e,
|
|
865
910
|
end: n
|
|
866
911
|
};
|
|
@@ -868,27 +913,44 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
868
913
|
r,
|
|
869
914
|
i,
|
|
870
915
|
t,
|
|
871
|
-
L
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
if (
|
|
916
|
+
L,
|
|
917
|
+
v
|
|
918
|
+
]), _n = L === "day" && !!v && v.bands.length > 0, vn = !_n && L === "day" && !!_ && (!!_.skipWeekends || !!(_.holidays && _.holidays.size)), yn = e.useCallback((e) => {
|
|
919
|
+
if (!_) return !0;
|
|
920
|
+
if (_.skipWeekends) {
|
|
875
921
|
let t = e.getDay();
|
|
876
922
|
if (t === 0 || t === 6) return !1;
|
|
877
923
|
}
|
|
878
|
-
if (
|
|
924
|
+
if (_.holidays && _.holidays.size) {
|
|
879
925
|
let t = `${e.getFullYear()}-${String(e.getMonth() + 1).padStart(2, "0")}-${String(e.getDate()).padStart(2, "0")}`;
|
|
880
|
-
if (
|
|
926
|
+
if (_.holidays.has(t)) return !1;
|
|
881
927
|
}
|
|
882
928
|
return !0;
|
|
883
|
-
}, [
|
|
884
|
-
let e = []
|
|
929
|
+
}, [_]), q = e.useMemo(() => {
|
|
930
|
+
let e = [];
|
|
931
|
+
if (_n && v) {
|
|
932
|
+
let t = new Date(K.start);
|
|
933
|
+
for (; t <= K.end;) for (let n of v.bands) {
|
|
934
|
+
let r = n.durMs / Xe * ht;
|
|
935
|
+
e.push({
|
|
936
|
+
date: new Date(t),
|
|
937
|
+
label: n.label,
|
|
938
|
+
isWeekend: !1,
|
|
939
|
+
width: r,
|
|
940
|
+
realMs: n.durMs,
|
|
941
|
+
bandColor: n.color
|
|
942
|
+
}), t = new Date(t.getTime() + n.durMs);
|
|
943
|
+
}
|
|
944
|
+
return e;
|
|
945
|
+
}
|
|
946
|
+
let t = new Date(K.start);
|
|
885
947
|
for (; t <= K.end;) {
|
|
886
|
-
let n =
|
|
887
|
-
if (
|
|
948
|
+
let n = $e(t, 1, L);
|
|
949
|
+
if (vn && !yn(t)) {
|
|
888
950
|
t = n;
|
|
889
951
|
continue;
|
|
890
952
|
}
|
|
891
|
-
let r = (n.getTime() - t.getTime()) /
|
|
953
|
+
let r = (n.getTime() - t.getTime()) / Xe * ht, i, a;
|
|
892
954
|
L === "day" ? (i = String(t.getDate()), a = t.toLocaleDateString(S, { weekday: "narrow" })) : i = L === "week" ? t.toLocaleDateString(S, {
|
|
893
955
|
month: "numeric",
|
|
894
956
|
day: "numeric"
|
|
@@ -904,31 +966,34 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
904
966
|
}, [
|
|
905
967
|
K,
|
|
906
968
|
L,
|
|
907
|
-
|
|
969
|
+
ht,
|
|
908
970
|
S,
|
|
909
|
-
|
|
910
|
-
|
|
971
|
+
vn,
|
|
972
|
+
yn,
|
|
973
|
+
_n,
|
|
974
|
+
v
|
|
911
975
|
]), J = e.useMemo(() => {
|
|
912
976
|
let e = Array(q.length + 1), t = 0;
|
|
913
977
|
for (let n = 0; n < q.length; n++) e[n] = t, t += q[n].width;
|
|
914
978
|
return e[q.length] = t, e;
|
|
915
|
-
}, [q]),
|
|
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 ? $e(e.date, 1, L).getTime() - e.date.getTime() : e.realMs), [q, L]), Y = e.useCallback((e) => {
|
|
916
980
|
let t = q.length;
|
|
917
981
|
if (t === 0) return 0;
|
|
918
982
|
let n = e.getTime(), r = 0, i = t - 1, a = 0;
|
|
919
983
|
for (; r <= i;) {
|
|
920
984
|
let e = r + i >> 1;
|
|
921
|
-
|
|
985
|
+
xn[e] <= n ? (a = e, r = e + 1) : i = e - 1;
|
|
922
986
|
}
|
|
923
|
-
let o =
|
|
924
|
-
return
|
|
987
|
+
let o = Sn[a] || 864e5, s = (n - xn[a]) / o;
|
|
988
|
+
return (vn || _n) && (s = Math.max(0, Math.min(s, 1))), J[a] + s * q[a].width;
|
|
925
989
|
}, [
|
|
926
990
|
q,
|
|
927
|
-
|
|
928
|
-
|
|
991
|
+
xn,
|
|
992
|
+
Sn,
|
|
929
993
|
J,
|
|
930
|
-
|
|
931
|
-
|
|
994
|
+
vn,
|
|
995
|
+
_n
|
|
996
|
+
]), Cn = e.useCallback((e) => {
|
|
932
997
|
let t = q.length;
|
|
933
998
|
if (t === 0) return new Date(K.start);
|
|
934
999
|
let n = 0, r = t - 1, i = 0;
|
|
@@ -937,40 +1002,57 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
937
1002
|
J[t] <= e ? (i = t, n = t + 1) : r = t - 1;
|
|
938
1003
|
}
|
|
939
1004
|
let a = q[i].width || 1, o = (e - J[i]) / a;
|
|
940
|
-
return new Date(
|
|
1005
|
+
return new Date(xn[i] + o * (Sn[i] || 864e5));
|
|
941
1006
|
}, [
|
|
942
1007
|
q,
|
|
943
|
-
|
|
944
|
-
|
|
1008
|
+
xn,
|
|
1009
|
+
Sn,
|
|
945
1010
|
J,
|
|
946
1011
|
K
|
|
947
|
-
]),
|
|
1012
|
+
]), wn = e.useCallback((e) => {
|
|
948
1013
|
let t = X.current;
|
|
949
|
-
|
|
950
|
-
}, [l,
|
|
1014
|
+
lt.current == null && t && t.clientWidth > 0 && (lt.current = Cn(t.scrollLeft)), ct.current = lt.current, ut.current = !0, st(e), l?.(e);
|
|
1015
|
+
}, [l, Cn]);
|
|
951
1016
|
e.useLayoutEffect(() => {
|
|
952
|
-
let e =
|
|
1017
|
+
let e = ct.current;
|
|
953
1018
|
if (e == null) return;
|
|
954
|
-
|
|
1019
|
+
ct.current = null;
|
|
955
1020
|
let t = X.current;
|
|
956
1021
|
if (!t || t.clientWidth === 0) return;
|
|
957
|
-
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(Ze(e, L))), n));
|
|
958
1023
|
t.scrollLeft !== r && (t.scrollLeft = r);
|
|
959
1024
|
}, [L, Y]);
|
|
960
|
-
let
|
|
1025
|
+
let Tn = e.useCallback((e, t) => {
|
|
961
1026
|
let n = q.length;
|
|
962
1027
|
if (n === 0 || t === 0) return new Date(e);
|
|
963
1028
|
let r = e.getTime(), i = 0, a = n - 1, o = 0;
|
|
964
1029
|
for (; i <= a;) {
|
|
965
1030
|
let e = i + a >> 1;
|
|
966
|
-
|
|
1031
|
+
xn[e] <= r ? (o = e, i = e + 1) : a = e - 1;
|
|
967
1032
|
}
|
|
968
|
-
let s = Math.min(n - 1, Math.max(0, o + t)), c = r -
|
|
969
|
-
return new Date(
|
|
970
|
-
}, [q,
|
|
971
|
-
|
|
972
|
-
let
|
|
973
|
-
let e = []
|
|
1033
|
+
let s = Math.min(n - 1, Math.max(0, o + t)), c = r - xn[o];
|
|
1034
|
+
return new Date(xn[s] + c);
|
|
1035
|
+
}, [q, xn]), En = e.useRef(null);
|
|
1036
|
+
En.current = vn || _n ? Tn : null;
|
|
1037
|
+
let Dn = e.useMemo(() => {
|
|
1038
|
+
let e = [];
|
|
1039
|
+
if (_n && v) {
|
|
1040
|
+
let t = 0;
|
|
1041
|
+
for (let n of q) {
|
|
1042
|
+
let r = String(ze(n.date, v.dayStartMin).getTime()), i = e[e.length - 1];
|
|
1043
|
+
i && i.key === r ? i.width += n.width : e.push({
|
|
1044
|
+
key: r,
|
|
1045
|
+
label: n.date.toLocaleDateString(S, {
|
|
1046
|
+
month: "short",
|
|
1047
|
+
day: "numeric"
|
|
1048
|
+
}),
|
|
1049
|
+
width: n.width,
|
|
1050
|
+
offset: t
|
|
1051
|
+
}), t += n.width;
|
|
1052
|
+
}
|
|
1053
|
+
return e;
|
|
1054
|
+
}
|
|
1055
|
+
let t = L === "year" ? "decade" : L === "month" || L === "quarter" ? "year" : "month", n = 0;
|
|
974
1056
|
for (let r of q) {
|
|
975
1057
|
let i = r.date.getFullYear(), a = Math.floor(i / 10) * 10, o = t === "decade" ? String(a) : t === "year" ? String(i) : `${i}-${r.date.getMonth()}`, s = e[e.length - 1];
|
|
976
1058
|
s && s.key === o ? s.width += r.width : e.push({
|
|
@@ -987,8 +1069,10 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
987
1069
|
}, [
|
|
988
1070
|
q,
|
|
989
1071
|
L,
|
|
990
|
-
S
|
|
991
|
-
|
|
1072
|
+
S,
|
|
1073
|
+
_n,
|
|
1074
|
+
v
|
|
1075
|
+
]), On = e.useMemo(() => (a ?? []).map((e, t) => {
|
|
992
1076
|
let n = e.date instanceof Date ? e.date : new Date(e.date);
|
|
993
1077
|
return {
|
|
994
1078
|
index: t,
|
|
@@ -1001,12 +1085,12 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1001
1085
|
a,
|
|
1002
1086
|
K,
|
|
1003
1087
|
Y
|
|
1004
|
-
]),
|
|
1088
|
+
]), kn = e.useRef(null), An = e.useRef(null), jn = e.useRef(null), X = e.useRef(null);
|
|
1005
1089
|
e.useEffect(() => {
|
|
1006
1090
|
let e = X.current;
|
|
1007
1091
|
if (!e) return;
|
|
1008
1092
|
let t = () => {
|
|
1009
|
-
|
|
1093
|
+
ut.current = !1;
|
|
1010
1094
|
}, n = new Set([
|
|
1011
1095
|
"ArrowLeft",
|
|
1012
1096
|
"ArrowRight",
|
|
@@ -1025,82 +1109,82 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1025
1109
|
e.removeEventListener("wheel", t), e.removeEventListener("touchstart", t), e.removeEventListener("pointerdown", t), e.removeEventListener("keydown", r);
|
|
1026
1110
|
};
|
|
1027
1111
|
}, []);
|
|
1028
|
-
let [
|
|
1112
|
+
let [Mn, Nn] = e.useState(null), Pn = e.useRef([]), Fn = e.useRef(null), [In, Ln] = e.useState({
|
|
1029
1113
|
top: 0,
|
|
1030
1114
|
left: 0
|
|
1031
|
-
}), [
|
|
1115
|
+
}), [Rn, zn] = e.useState({
|
|
1032
1116
|
width: 4e3,
|
|
1033
1117
|
height: 600
|
|
1034
|
-
}),
|
|
1118
|
+
}), Bn = e.useCallback(() => {
|
|
1035
1119
|
let e = X.current;
|
|
1036
1120
|
if (!e) return;
|
|
1037
1121
|
let t = e.clientWidth || 4e3, n = e.clientHeight || 600;
|
|
1038
|
-
|
|
1122
|
+
zn((e) => e.width === t && e.height === n ? e : {
|
|
1039
1123
|
width: t,
|
|
1040
1124
|
height: n
|
|
1041
1125
|
});
|
|
1042
1126
|
}, []);
|
|
1043
1127
|
e.useLayoutEffect(() => {
|
|
1044
|
-
|
|
1128
|
+
Bn();
|
|
1045
1129
|
let e = X.current;
|
|
1046
1130
|
if (!e || typeof ResizeObserver > "u") return;
|
|
1047
|
-
let t = new ResizeObserver(
|
|
1131
|
+
let t = new ResizeObserver(Bn);
|
|
1048
1132
|
return t.observe(e), () => t.disconnect();
|
|
1049
|
-
}, [
|
|
1050
|
-
let
|
|
1133
|
+
}, [Bn]);
|
|
1134
|
+
let Vn = e.useMemo(() => Qe(J, In.left - 240, In.left + Rn.width + 240), [
|
|
1051
1135
|
J,
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
]),
|
|
1055
|
-
let e =
|
|
1056
|
-
return e.push(
|
|
1057
|
-
}, [
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1136
|
+
In.left,
|
|
1137
|
+
Rn.width
|
|
1138
|
+
]), Hn = e.useMemo(() => {
|
|
1139
|
+
let e = Dn.map((e) => e.offset);
|
|
1140
|
+
return e.push(bn), e;
|
|
1141
|
+
}, [Dn, bn]), Un = e.useMemo(() => Qe(Hn, In.left - 240, In.left + Rn.width + 240), [
|
|
1142
|
+
Hn,
|
|
1143
|
+
In.left,
|
|
1144
|
+
Rn.width
|
|
1061
1145
|
]), Z = e.useMemo(() => ({
|
|
1062
|
-
startIdx: Math.max(0, Math.floor(
|
|
1063
|
-
endIdx: Math.min(G.length, Math.ceil((
|
|
1146
|
+
startIdx: Math.max(0, Math.floor(In.top / F) - 6),
|
|
1147
|
+
endIdx: Math.min(G.length, Math.ceil((In.top + Rn.height) / F) + 6)
|
|
1064
1148
|
}), [
|
|
1065
|
-
|
|
1066
|
-
|
|
1149
|
+
In.top,
|
|
1150
|
+
Rn.height,
|
|
1067
1151
|
F,
|
|
1068
1152
|
G.length
|
|
1069
|
-
]),
|
|
1153
|
+
]), Wn = G.length * F, [Gn, Kn] = e.useState(!1);
|
|
1070
1154
|
e.useEffect(() => {
|
|
1071
|
-
let e = () =>
|
|
1155
|
+
let e = () => Kn(!!document.fullscreenElement);
|
|
1072
1156
|
return document.addEventListener("fullscreenchange", e), () => document.removeEventListener("fullscreenchange", e);
|
|
1073
1157
|
}, []);
|
|
1074
|
-
let
|
|
1075
|
-
let e =
|
|
1158
|
+
let qn = e.useCallback(() => {
|
|
1159
|
+
let e = O.current;
|
|
1076
1160
|
e && (document.fullscreenElement ? document.exitFullscreen?.() : e.requestFullscreen?.());
|
|
1077
|
-
}, []),
|
|
1161
|
+
}, []), Jn = e.useRef(null), Yn = e.useCallback((e) => {
|
|
1078
1162
|
if (e.touches.length === 2) {
|
|
1079
1163
|
let t = e.touches[0].clientX - e.touches[1].clientX, n = e.touches[0].clientY - e.touches[1].clientY;
|
|
1080
|
-
|
|
1164
|
+
Jn.current = {
|
|
1081
1165
|
baseDistance: Math.max(1, Math.sqrt(t * t + n * n)),
|
|
1082
|
-
baseColumn:
|
|
1166
|
+
baseColumn: B
|
|
1083
1167
|
};
|
|
1084
1168
|
}
|
|
1085
|
-
}, [
|
|
1086
|
-
if (e.touches.length !== 2 || !
|
|
1087
|
-
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)) /
|
|
1088
|
-
|
|
1089
|
-
}, []),
|
|
1090
|
-
|
|
1169
|
+
}, [B]), Xn = e.useCallback((e) => {
|
|
1170
|
+
if (e.touches.length !== 2 || !Jn.current) return;
|
|
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
|
+
Ve(Math.max(15, Math.min(120, Math.round(Jn.current.baseColumn * r))));
|
|
1173
|
+
}, []), Zn = e.useCallback(() => {
|
|
1174
|
+
Jn.current = null;
|
|
1091
1175
|
}, []), Q = e.useMemo(() => {
|
|
1092
1176
|
let e = /* @__PURE__ */ new Date();
|
|
1093
1177
|
return e < K.start || e > K.end ? null : Math.round(Y(e));
|
|
1094
|
-
}, [K, Y]),
|
|
1178
|
+
}, [K, Y]), Qn = e.useCallback(() => {
|
|
1095
1179
|
if (Q == null || !X.current) return;
|
|
1096
1180
|
let e = Math.max(0, Q - X.current.clientWidth / 2);
|
|
1097
1181
|
X.current.scrollTo({
|
|
1098
1182
|
left: e,
|
|
1099
1183
|
behavior: "smooth"
|
|
1100
1184
|
});
|
|
1101
|
-
}, [Q]),
|
|
1185
|
+
}, [Q]), $n = e.useRef(!1);
|
|
1102
1186
|
e.useEffect(() => {
|
|
1103
|
-
if (
|
|
1187
|
+
if ($n.current || t.length === 0) return;
|
|
1104
1188
|
let e = window.requestAnimationFrame(() => {
|
|
1105
1189
|
let e = X.current;
|
|
1106
1190
|
if (!e || e.clientWidth === 0) return;
|
|
@@ -1109,7 +1193,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1109
1193
|
let e = new Date(Math.min(...t.map((e) => e.start.getTime())));
|
|
1110
1194
|
n = Math.round(Y(e));
|
|
1111
1195
|
}
|
|
1112
|
-
e.scrollLeft = Math.max(0, n - e.clientWidth / 2),
|
|
1196
|
+
e.scrollLeft = Math.max(0, n - e.clientWidth / 2), $n.current = !0;
|
|
1113
1197
|
});
|
|
1114
1198
|
return () => window.cancelAnimationFrame(e);
|
|
1115
1199
|
}, [
|
|
@@ -1117,7 +1201,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1117
1201
|
Q,
|
|
1118
1202
|
Y
|
|
1119
1203
|
]);
|
|
1120
|
-
let
|
|
1204
|
+
let er = e.useCallback((e, t = "left") => {
|
|
1121
1205
|
let n = X.current;
|
|
1122
1206
|
if (!n || e < K.start || e > K.end) return !1;
|
|
1123
1207
|
let r = Math.round(Y(e)), i = t === "center" ? r - n.clientWidth / 2 : r - 24;
|
|
@@ -1125,17 +1209,17 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1125
1209
|
left: Math.max(0, i),
|
|
1126
1210
|
behavior: "smooth"
|
|
1127
1211
|
}), !0;
|
|
1128
|
-
}, [K, Y]),
|
|
1212
|
+
}, [K, Y]), tr = e.useCallback((e, t, n) => {
|
|
1129
1213
|
let r = X.current;
|
|
1130
1214
|
if (!r) return;
|
|
1131
1215
|
let i = Y(e), a = Y(t), o = Math.max(0, r.scrollWidth - r.clientWidth), s = Math.min(96, r.clientWidth * .15), c = a - i <= r.clientWidth - s ? (i + a) / 2 - r.clientWidth / 2 : i - s, l = Math.max(0, Math.min(c, o));
|
|
1132
|
-
|
|
1216
|
+
Pn.current.forEach((e) => window.clearTimeout(e)), Pn.current = [], Fn.current?.(), Fn.current = null, Nn(null);
|
|
1133
1217
|
let u = () => {
|
|
1134
1218
|
if (n == null) return;
|
|
1135
1219
|
let e = window.requestAnimationFrame(() => {
|
|
1136
|
-
|
|
1220
|
+
Nn(n), Pn.current.push(window.setTimeout(() => Nn((e) => e === n ? null : e), 1500));
|
|
1137
1221
|
});
|
|
1138
|
-
|
|
1222
|
+
Fn.current = () => window.cancelAnimationFrame(e);
|
|
1139
1223
|
}, d = Math.abs(r.scrollLeft - l) > 2;
|
|
1140
1224
|
if (r.scrollTo({
|
|
1141
1225
|
left: l,
|
|
@@ -1147,65 +1231,65 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1147
1231
|
let f = "onscrollend" in r, p = !1, m = () => {
|
|
1148
1232
|
p || (p = !0, r.removeEventListener("scrollend", m), u());
|
|
1149
1233
|
};
|
|
1150
|
-
r.addEventListener("scrollend", m),
|
|
1234
|
+
r.addEventListener("scrollend", m), Pn.current.push(window.setTimeout(m, f ? 1500 : 500)), Fn.current = () => r.removeEventListener("scrollend", m);
|
|
1151
1235
|
}, [Y]);
|
|
1152
1236
|
e.useEffect(() => () => {
|
|
1153
|
-
|
|
1237
|
+
Pn.current.forEach((e) => window.clearTimeout(e)), Fn.current?.();
|
|
1154
1238
|
}, []);
|
|
1155
|
-
let
|
|
1239
|
+
let nr = e.useCallback(() => er(Ze(/* @__PURE__ */ new Date(), "week")), [er]), rr = e.useCallback(() => er(Ze(/* @__PURE__ */ new Date(), "month")), [er]), ir = (e) => {
|
|
1156
1240
|
let t = e.currentTarget;
|
|
1157
|
-
!
|
|
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 : {
|
|
1158
1242
|
top: t.scrollTop,
|
|
1159
1243
|
left: t.scrollLeft
|
|
1160
|
-
}),
|
|
1161
|
-
},
|
|
1244
|
+
}), Bn();
|
|
1245
|
+
}, ar = (e) => {
|
|
1162
1246
|
let t = e.currentTarget, n = X.current;
|
|
1163
|
-
n && n.scrollTop !== t.scrollTop && (n.scrollTop = t.scrollTop),
|
|
1247
|
+
n && n.scrollTop !== t.scrollTop && (n.scrollTop = t.scrollTop), Ln((e) => e.top === t.scrollTop ? e : {
|
|
1164
1248
|
...e,
|
|
1165
1249
|
top: t.scrollTop
|
|
1166
1250
|
});
|
|
1167
|
-
},
|
|
1168
|
-
let n = Y(e);
|
|
1251
|
+
}, or = (e, t) => {
|
|
1252
|
+
let n = Y(e), r = _n && v ? ht * Math.min(...v.bands.map((e) => e.durMs)) / Xe : ht;
|
|
1169
1253
|
return {
|
|
1170
1254
|
left: n,
|
|
1171
|
-
width: Math.max(Y(t) - n,
|
|
1255
|
+
width: Math.max(Y(t) - n, r, 3)
|
|
1172
1256
|
};
|
|
1173
|
-
},
|
|
1174
|
-
if (
|
|
1175
|
-
let e = new Set([String(
|
|
1176
|
-
for (let t of
|
|
1257
|
+
}, sr = H?.group ? H.taskId : null, cr = e.useMemo(() => {
|
|
1258
|
+
if (sr == null) return null;
|
|
1259
|
+
let e = new Set([String(sr)]);
|
|
1260
|
+
for (let t of Tt(sr)) e.add(String(t.id));
|
|
1177
1261
|
return e;
|
|
1178
|
-
}, [
|
|
1179
|
-
if (!
|
|
1180
|
-
let e = /* @__PURE__ */ new Set(), t = /* @__PURE__ */ new Set(), n =
|
|
1262
|
+
}, [sr, Tt]), lr = e.useMemo(() => {
|
|
1263
|
+
if (!H || H.group) return null;
|
|
1264
|
+
let e = /* @__PURE__ */ new Set(), t = /* @__PURE__ */ new Set(), n = wt.get(String(H.taskId));
|
|
1181
1265
|
for (; n && n.parent != null && n.parent !== "";) {
|
|
1182
1266
|
let r = String(n.parent);
|
|
1183
|
-
if (t.has(r) || !
|
|
1184
|
-
t.add(r), e.add(r), n =
|
|
1267
|
+
if (t.has(r) || !wt.has(r)) break;
|
|
1268
|
+
t.add(r), e.add(r), n = wt.get(r);
|
|
1185
1269
|
}
|
|
1186
1270
|
return e.size ? e : null;
|
|
1187
|
-
}, [
|
|
1188
|
-
if (
|
|
1189
|
-
if (
|
|
1190
|
-
let t =
|
|
1191
|
-
return
|
|
1271
|
+
}, [H, wt]), ur = (e) => {
|
|
1272
|
+
if (H) {
|
|
1273
|
+
if (cr?.has(String(e.task.id))) {
|
|
1274
|
+
let t = kt(H).start.getTime() - H.originStart.getTime();
|
|
1275
|
+
return or(new Date(e.start.getTime() + t), new Date(e.end.getTime() + t));
|
|
1192
1276
|
}
|
|
1193
|
-
if (!e.isSummary &&
|
|
1194
|
-
let e =
|
|
1195
|
-
return
|
|
1277
|
+
if (!e.isSummary && H.taskId === e.task.id) {
|
|
1278
|
+
let e = kt(H);
|
|
1279
|
+
return or(e.start, e.end);
|
|
1196
1280
|
}
|
|
1197
|
-
if (e.isSummary &&
|
|
1198
|
-
let t =
|
|
1199
|
-
for (let a of
|
|
1200
|
-
if ((
|
|
1281
|
+
if (e.isSummary && lr?.has(String(e.task.id))) {
|
|
1282
|
+
let t = kt(H), n = String(H.taskId), r = null, i = null;
|
|
1283
|
+
for (let a of Tt(e.task.id)) {
|
|
1284
|
+
if ((Ct.get(String(a.id)) ?? []).length !== 0) continue;
|
|
1201
1285
|
let e = String(a.id) === n ? t.start : a.start, o = String(a.id) === n ? t.end : a.end;
|
|
1202
1286
|
(!r || e < r) && (r = e), (!i || o > i) && (i = o);
|
|
1203
1287
|
}
|
|
1204
|
-
if (r && i) return
|
|
1288
|
+
if (r && i) return or(r, i);
|
|
1205
1289
|
}
|
|
1206
1290
|
}
|
|
1207
|
-
return
|
|
1208
|
-
},
|
|
1291
|
+
return or(e.start, e.end);
|
|
1292
|
+
}, dr = e.useMemo(() => {
|
|
1209
1293
|
let e = /* @__PURE__ */ new Map();
|
|
1210
1294
|
G.forEach((t, n) => e.set(String(t.task.id), n));
|
|
1211
1295
|
let t = [];
|
|
@@ -1226,23 +1310,23 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1226
1310
|
});
|
|
1227
1311
|
}
|
|
1228
1312
|
}), t;
|
|
1229
|
-
}, [G]),
|
|
1313
|
+
}, [G]), fr = Math.round(F * .2), pr = F - fr * 2, mr = Math.max(Math.round(F * .4), 12), hr = mr * Math.SQRT2 / 2, gr = pr, _r = fr, vr = Math.max(3, Math.round(F * .13)), yr = F - vr - 1, br = "rgba(100, 116, 139, 0.35)", xr = "rgba(100, 116, 139, 0.6)", Sr = (e) => {
|
|
1230
1314
|
let t = G[e.sourceIndex], n = G[e.targetIndex];
|
|
1231
1315
|
if (!t || !n) return null;
|
|
1232
|
-
let r =
|
|
1316
|
+
let r = ur(t), i = ur(n), a = (e) => e.isSummary ? _r + gr / 2 : F / 2, o = e.sourceIndex * F + a(t), s = e.targetIndex * F + 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)}`];
|
|
1233
1317
|
if (l ? f >= p : f <= p) h.push(`L ${m(f)} ${m(s)}`, `L ${m(d)} ${m(s)}`);
|
|
1234
1318
|
else {
|
|
1235
1319
|
let t = s >= o ? (e.sourceIndex + 1) * F : e.sourceIndex * F;
|
|
1236
1320
|
h.push(`L ${m(f)} ${m(t)}`, `L ${m(p)} ${m(t)}`, `L ${m(p)} ${m(s)}`, `L ${m(d)} ${m(s)}`);
|
|
1237
1321
|
}
|
|
1238
1322
|
return h.join(" ");
|
|
1239
|
-
},
|
|
1240
|
-
|
|
1323
|
+
}, Cr = H?.taskId ?? xt, [wr, Tr] = e.useState(ee), Er = e.useMemo(() => wr ? Fe(t, _) : null, [
|
|
1324
|
+
wr,
|
|
1241
1325
|
t,
|
|
1242
|
-
|
|
1243
|
-
]),
|
|
1326
|
+
_
|
|
1327
|
+
]), Dr = e.useCallback((e) => Er?.criticalIds.has(String(e)) ?? !1, [Er]), $ = "#dc2626", Or = e.useCallback(() => {
|
|
1244
1328
|
if (!M) return;
|
|
1245
|
-
let e =
|
|
1329
|
+
let e = Ie(t, _), n = [];
|
|
1246
1330
|
for (let r of e) {
|
|
1247
1331
|
let e = t.find((e) => String(e.id) === r.id);
|
|
1248
1332
|
e && n.push({
|
|
@@ -1253,21 +1337,21 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1253
1337
|
}
|
|
1254
1338
|
});
|
|
1255
1339
|
}
|
|
1256
|
-
|
|
1340
|
+
Ft(n);
|
|
1257
1341
|
}, [
|
|
1258
1342
|
t,
|
|
1259
1343
|
M,
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
]),
|
|
1344
|
+
_,
|
|
1345
|
+
Ft
|
|
1346
|
+
]), kr = e.useCallback(() => {
|
|
1263
1347
|
if (typeof document > "u" || !t.length) return null;
|
|
1264
1348
|
let e = (e) => String(e).replace(/[&<>"]/g, (e) => ({
|
|
1265
1349
|
"&": "&",
|
|
1266
1350
|
"<": "<",
|
|
1267
1351
|
">": ">",
|
|
1268
1352
|
"\"": """
|
|
1269
|
-
})[e]), n = Math.max(
|
|
1270
|
-
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">`),
|
|
1353
|
+
})[e]), n = Math.max(z, 200), r = Math.ceil(n + bn), i = Math.ceil(36 + G.length * F), a = Er?.criticalEdges ?? null, o = [];
|
|
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) => {
|
|
1271
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>`);
|
|
1272
1356
|
}), q.forEach((t, n) => {
|
|
1273
1357
|
let r = J[n];
|
|
@@ -1278,33 +1362,33 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1278
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\"" : "";
|
|
1279
1363
|
o.push(`<text x="${a}" y="${(i + F / 2 + 4).toFixed(1)}"${l}>${e(c)}</text>`);
|
|
1280
1364
|
}), o.push("</g>"), o.push(`<g transform="translate(${n},36)" font-family="sans-serif" font-size="9">`), G.forEach((e, t) => {
|
|
1281
|
-
let n = t * F, { left: r, width: i } =
|
|
1282
|
-
if (
|
|
1283
|
-
let t =
|
|
1284
|
-
o.push(`<rect x="${t.left.toFixed(1)}" y="${(n +
|
|
1365
|
+
let n = t * F, { left: r, width: i } = or(e.start, e.end), a = Dr(e.task.id), s = a ? ` stroke="${$}" stroke-width="2"` : "";
|
|
1366
|
+
if (te && e.task.baselineStart && e.task.baselineEnd) {
|
|
1367
|
+
let t = or(e.task.baselineStart, e.task.baselineEnd);
|
|
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}"/>`);
|
|
1285
1369
|
}
|
|
1286
1370
|
if (e.isMilestone) {
|
|
1287
|
-
let t = r, i = n + F / 2, s =
|
|
1371
|
+
let t = r, i = n + F / 2, s = mr / 2, c = a ? $ : e.task.color || "#3b82f6";
|
|
1288
1372
|
o.push(`<polygon points="${t},${i - s} ${t + s},${i} ${t},${i + s} ${t - s},${i}" fill="${c}"/>`);
|
|
1289
1373
|
} else if (e.isSummary) {
|
|
1290
1374
|
let t = e.task.color || "#64748b";
|
|
1291
|
-
o.push(`<rect x="${r.toFixed(1)}" y="${(n +
|
|
1375
|
+
o.push(`<rect x="${r.toFixed(1)}" y="${(n + _r).toFixed(1)}" width="${i.toFixed(1)}" height="${gr}" rx="3" fill="${t}"${s}/>`);
|
|
1292
1376
|
let a = i * Math.min(100, Math.max(0, e.progress)) / 100;
|
|
1293
|
-
o.push(`<rect x="${r.toFixed(1)}" y="${(n +
|
|
1377
|
+
o.push(`<rect x="${r.toFixed(1)}" y="${(n + _r).toFixed(1)}" width="${a.toFixed(1)}" height="${gr}" rx="3" fill="rgba(0,0,0,0.2)"/>`);
|
|
1294
1378
|
} else {
|
|
1295
1379
|
let t = e.task.color || "#3b82f6";
|
|
1296
|
-
o.push(`<rect x="${r.toFixed(1)}" y="${(n +
|
|
1380
|
+
o.push(`<rect x="${r.toFixed(1)}" y="${(n + fr).toFixed(1)}" width="${i.toFixed(1)}" height="${pr}" rx="3" fill="${t}"${s}/>`);
|
|
1297
1381
|
let a = i * Math.min(100, Math.max(0, e.progress)) / 100;
|
|
1298
|
-
o.push(`<rect x="${r.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 + F / 2 + 3).toFixed(1)}" text-anchor="middle" fill="#ffffff">${Math.round(e.progress)}%</text>`);
|
|
1299
1383
|
}
|
|
1300
|
-
}),
|
|
1301
|
-
let t =
|
|
1384
|
+
}), dr.forEach((e) => {
|
|
1385
|
+
let t = Sr(e);
|
|
1302
1386
|
if (!t) return;
|
|
1303
1387
|
let n = a?.has(`${String(e.sourceId)}->${String(e.targetId)}`) ?? !1, r = n ? $ : "#94a3b8";
|
|
1304
1388
|
o.push(`<path d="${t}" fill="none" stroke="${r}" stroke-width="${n ? 2 : 1.5}"/>`);
|
|
1305
1389
|
}), Q != null && o.push(`<line x1="${Q.toFixed(1)}" y1="0" x2="${Q.toFixed(1)}" y2="${G.length * F}" stroke="#ef4444" stroke-width="1.5"/>`);
|
|
1306
1390
|
let s = G.length * F;
|
|
1307
|
-
return
|
|
1391
|
+
return On.forEach((t) => {
|
|
1308
1392
|
let n = /var\(/.test(t.color) ? "#6366f1" : t.color;
|
|
1309
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) {
|
|
1310
1394
|
let r = t.label.length * 6 + 8;
|
|
@@ -1318,278 +1402,278 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1318
1402
|
}, [
|
|
1319
1403
|
t,
|
|
1320
1404
|
G,
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1405
|
+
dr,
|
|
1406
|
+
Sr,
|
|
1407
|
+
or,
|
|
1408
|
+
Dr,
|
|
1409
|
+
Er,
|
|
1326
1410
|
q,
|
|
1327
1411
|
J,
|
|
1328
|
-
|
|
1329
|
-
|
|
1412
|
+
bn,
|
|
1413
|
+
z,
|
|
1330
1414
|
F,
|
|
1331
|
-
|
|
1332
|
-
ur,
|
|
1333
|
-
mr,
|
|
1415
|
+
fr,
|
|
1334
1416
|
pr,
|
|
1335
|
-
|
|
1417
|
+
_r,
|
|
1418
|
+
gr,
|
|
1419
|
+
mr,
|
|
1336
1420
|
Q,
|
|
1337
1421
|
L,
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
hr,
|
|
1341
|
-
_r,
|
|
1422
|
+
te,
|
|
1423
|
+
yr,
|
|
1342
1424
|
vr,
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1425
|
+
br,
|
|
1426
|
+
xr,
|
|
1427
|
+
On,
|
|
1428
|
+
Dn
|
|
1429
|
+
]), Ar = e.useCallback(async () => {
|
|
1430
|
+
let e = kr();
|
|
1347
1431
|
if (!e) return;
|
|
1348
|
-
let t = await
|
|
1432
|
+
let t = await et(e.svg, e.W, e.H);
|
|
1349
1433
|
t && t.toBlob((e) => {
|
|
1350
|
-
e &&
|
|
1434
|
+
e && tt(e, `gantt-${L}.png`);
|
|
1351
1435
|
}, "image/png");
|
|
1352
|
-
}, [
|
|
1353
|
-
let e =
|
|
1436
|
+
}, [kr, L]), jr = e.useCallback(async () => {
|
|
1437
|
+
let e = kr();
|
|
1354
1438
|
if (!e) return;
|
|
1355
|
-
let t = await
|
|
1356
|
-
t &&
|
|
1357
|
-
}, [
|
|
1439
|
+
let t = await et(e.svg, e.W, e.H);
|
|
1440
|
+
t && tt(nt(rt(t.toDataURL("image/jpeg", .92)), t.width, t.height), `gantt-${L}.pdf`);
|
|
1441
|
+
}, [kr, L]), [Mr, Nr] = e.useState(!1), Pr = e.useCallback(() => {
|
|
1358
1442
|
let e = {
|
|
1359
1443
|
viewMode: L,
|
|
1360
|
-
columnWidth:
|
|
1361
|
-
taskListCollapsed:
|
|
1362
|
-
taskListWidth:
|
|
1444
|
+
columnWidth: Be,
|
|
1445
|
+
taskListCollapsed: R,
|
|
1446
|
+
taskListWidth: He
|
|
1363
1447
|
};
|
|
1364
|
-
|
|
1448
|
+
ce && ot(ce, e), le?.(e), Nr(!0);
|
|
1365
1449
|
}, [
|
|
1366
1450
|
L,
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1451
|
+
Be,
|
|
1452
|
+
R,
|
|
1453
|
+
He,
|
|
1454
|
+
ce,
|
|
1455
|
+
le
|
|
1372
1456
|
]);
|
|
1373
1457
|
return e.useEffect(() => {
|
|
1374
|
-
if (!
|
|
1375
|
-
let e = setTimeout(() =>
|
|
1458
|
+
if (!Mr) return;
|
|
1459
|
+
let e = setTimeout(() => Nr(!1), 1500);
|
|
1376
1460
|
return () => clearTimeout(e);
|
|
1377
|
-
}, [
|
|
1378
|
-
ref:
|
|
1461
|
+
}, [Mr]), /* @__PURE__ */ D("div", {
|
|
1462
|
+
ref: O,
|
|
1379
1463
|
className: b("flex flex-col h-full bg-background overflow-hidden min-w-0", p),
|
|
1380
1464
|
"data-readonly": j ? "true" : void 0,
|
|
1381
|
-
"data-mobile-readonly":
|
|
1465
|
+
"data-mobile-readonly": re && A ? "true" : void 0,
|
|
1382
1466
|
children: [
|
|
1383
|
-
/* @__PURE__ */
|
|
1384
|
-
/* @__PURE__ */
|
|
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
|
+
/* @__PURE__ */ D("div", {
|
|
1385
1469
|
className: "flex flex-col sm:flex-row items-start sm:items-center justify-between gap-2 p-2 border-b bg-card",
|
|
1386
|
-
children: [/* @__PURE__ */
|
|
1470
|
+
children: [/* @__PURE__ */ D("div", {
|
|
1387
1471
|
className: "flex items-center gap-2",
|
|
1388
1472
|
children: [
|
|
1389
|
-
/* @__PURE__ */
|
|
1473
|
+
/* @__PURE__ */ E(y, {
|
|
1390
1474
|
variant: "ghost",
|
|
1391
1475
|
size: "icon",
|
|
1392
1476
|
className: "h-8 w-8",
|
|
1393
1477
|
"aria-label": x("gantt.toolbar.prevPeriod"),
|
|
1394
|
-
children: /* @__PURE__ */
|
|
1478
|
+
children: /* @__PURE__ */ E(he, { className: "h-4 w-4" })
|
|
1395
1479
|
}),
|
|
1396
|
-
/* @__PURE__ */
|
|
1480
|
+
/* @__PURE__ */ E(y, {
|
|
1397
1481
|
variant: "ghost",
|
|
1398
1482
|
size: "icon",
|
|
1399
1483
|
className: "h-8 w-8",
|
|
1400
1484
|
"aria-label": x("gantt.toolbar.nextPeriod"),
|
|
1401
|
-
children: /* @__PURE__ */
|
|
1485
|
+
children: /* @__PURE__ */ E(C, { className: "h-4 w-4" })
|
|
1402
1486
|
}),
|
|
1403
|
-
/* @__PURE__ */
|
|
1487
|
+
/* @__PURE__ */ E("span", {
|
|
1404
1488
|
className: "font-semibold text-xs sm:text-sm",
|
|
1405
1489
|
children: K.start.toLocaleDateString(S, {
|
|
1406
1490
|
month: "long",
|
|
1407
1491
|
year: "numeric"
|
|
1408
1492
|
})
|
|
1409
1493
|
}),
|
|
1410
|
-
j && /* @__PURE__ */
|
|
1494
|
+
j && /* @__PURE__ */ D("span", {
|
|
1411
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",
|
|
1412
1496
|
"data-testid": "gantt-readonly-badge",
|
|
1413
1497
|
title: x("gantt.readOnlyHint"),
|
|
1414
|
-
children: [/* @__PURE__ */
|
|
1498
|
+
children: [/* @__PURE__ */ E(w, { className: "h-3 w-3" }), x("gantt.readOnly")]
|
|
1415
1499
|
})
|
|
1416
1500
|
]
|
|
1417
|
-
}), /* @__PURE__ */
|
|
1501
|
+
}), /* @__PURE__ */ D("div", {
|
|
1418
1502
|
className: "flex items-center gap-2",
|
|
1419
1503
|
children: [
|
|
1420
|
-
/* @__PURE__ */
|
|
1504
|
+
/* @__PURE__ */ E("div", {
|
|
1421
1505
|
className: "flex bg-muted rounded-md p-1",
|
|
1422
1506
|
role: "group",
|
|
1423
1507
|
"aria-label": x("gantt.toolbar.viewMode"),
|
|
1424
|
-
children:
|
|
1508
|
+
children: Je.map((e) => /* @__PURE__ */ E(y, {
|
|
1425
1509
|
variant: "ghost",
|
|
1426
1510
|
size: "sm",
|
|
1427
1511
|
className: b("h-6 px-1.5 sm:px-2 text-xs", L === e && "bg-background shadow-sm hover:bg-background"),
|
|
1428
|
-
onClick: () =>
|
|
1512
|
+
onClick: () => wn(e),
|
|
1429
1513
|
"aria-pressed": L === e,
|
|
1430
1514
|
"data-testid": `gantt-view-mode-${e}`,
|
|
1431
1515
|
children: x(`gantt.viewMode.${e}`)
|
|
1432
1516
|
}, e))
|
|
1433
1517
|
}),
|
|
1434
|
-
/* @__PURE__ */
|
|
1518
|
+
/* @__PURE__ */ D("div", {
|
|
1435
1519
|
className: "flex bg-muted rounded-md p-1",
|
|
1436
|
-
children: [/* @__PURE__ */
|
|
1520
|
+
children: [/* @__PURE__ */ E(y, {
|
|
1437
1521
|
variant: "ghost",
|
|
1438
1522
|
size: "icon",
|
|
1439
1523
|
className: "h-6 w-6",
|
|
1440
1524
|
onClick: () => {
|
|
1441
|
-
if (
|
|
1525
|
+
if (B > 15) Ve(Math.max(15, B - 10));
|
|
1442
1526
|
else {
|
|
1443
|
-
let e =
|
|
1444
|
-
e <
|
|
1527
|
+
let e = Je.indexOf(L);
|
|
1528
|
+
e < Je.length - 1 && (wn(Je[e + 1]), Ve(Le));
|
|
1445
1529
|
}
|
|
1446
1530
|
},
|
|
1447
1531
|
"aria-label": x("gantt.toolbar.zoomOut"),
|
|
1448
|
-
children: /* @__PURE__ */
|
|
1449
|
-
}), /* @__PURE__ */
|
|
1532
|
+
children: /* @__PURE__ */ E(De, { className: "h-3 w-3" })
|
|
1533
|
+
}), /* @__PURE__ */ E(y, {
|
|
1450
1534
|
variant: "ghost",
|
|
1451
1535
|
size: "icon",
|
|
1452
1536
|
className: "h-6 w-6",
|
|
1453
1537
|
onClick: () => {
|
|
1454
|
-
if (
|
|
1538
|
+
if (B < 120) Ve(Math.min(120, B + 10));
|
|
1455
1539
|
else {
|
|
1456
|
-
let e =
|
|
1457
|
-
e > 0 && (
|
|
1540
|
+
let e = Je.indexOf(L);
|
|
1541
|
+
e > 0 && (wn(Je[e - 1]), Ve(Le));
|
|
1458
1542
|
}
|
|
1459
1543
|
},
|
|
1460
1544
|
"aria-label": x("gantt.toolbar.zoomIn"),
|
|
1461
|
-
children: /* @__PURE__ */
|
|
1545
|
+
children: /* @__PURE__ */ E(Ee, { className: "h-3 w-3" })
|
|
1462
1546
|
})]
|
|
1463
1547
|
}),
|
|
1464
|
-
/* @__PURE__ */
|
|
1548
|
+
/* @__PURE__ */ E(y, {
|
|
1465
1549
|
variant: "ghost",
|
|
1466
1550
|
size: "icon",
|
|
1467
1551
|
className: "h-8 w-8",
|
|
1468
|
-
onClick: () =>
|
|
1469
|
-
"aria-label": x(
|
|
1470
|
-
"aria-pressed":
|
|
1552
|
+
onClick: () => dt((e) => !e),
|
|
1553
|
+
"aria-label": x(R ? "gantt.toolbar.showTaskList" : "gantt.toolbar.hideTaskList"),
|
|
1554
|
+
"aria-pressed": R,
|
|
1471
1555
|
"data-testid": "gantt-toggle-task-list",
|
|
1472
|
-
children:
|
|
1556
|
+
children: E(R ? be : xe, { className: "h-4 w-4" })
|
|
1473
1557
|
}),
|
|
1474
|
-
/* @__PURE__ */
|
|
1558
|
+
/* @__PURE__ */ E(y, {
|
|
1475
1559
|
variant: "ghost",
|
|
1476
1560
|
size: "sm",
|
|
1477
1561
|
className: "h-8 px-2 text-xs",
|
|
1478
|
-
onClick:
|
|
1562
|
+
onClick: Qn,
|
|
1479
1563
|
disabled: Q == null,
|
|
1480
1564
|
"aria-label": x("gantt.toolbar.jumpToToday"),
|
|
1481
1565
|
"data-testid": "gantt-jump-today",
|
|
1482
1566
|
children: x("gantt.toolbar.today")
|
|
1483
1567
|
}),
|
|
1484
|
-
/* @__PURE__ */
|
|
1568
|
+
/* @__PURE__ */ E(y, {
|
|
1485
1569
|
variant: "ghost",
|
|
1486
1570
|
size: "sm",
|
|
1487
1571
|
className: "h-8 px-2 text-xs",
|
|
1488
|
-
onClick:
|
|
1572
|
+
onClick: nr,
|
|
1489
1573
|
"aria-label": x("gantt.toolbar.thisWeek"),
|
|
1490
1574
|
"data-testid": "gantt-jump-week",
|
|
1491
1575
|
children: x("gantt.toolbar.thisWeek")
|
|
1492
1576
|
}),
|
|
1493
|
-
/* @__PURE__ */
|
|
1577
|
+
/* @__PURE__ */ E(y, {
|
|
1494
1578
|
variant: "ghost",
|
|
1495
1579
|
size: "sm",
|
|
1496
1580
|
className: "h-8 px-2 text-xs",
|
|
1497
|
-
onClick:
|
|
1581
|
+
onClick: rr,
|
|
1498
1582
|
"aria-label": x("gantt.toolbar.thisMonth"),
|
|
1499
1583
|
"data-testid": "gantt-jump-month",
|
|
1500
1584
|
children: x("gantt.toolbar.thisMonth")
|
|
1501
1585
|
}),
|
|
1502
|
-
M ? /* @__PURE__ */
|
|
1586
|
+
M ? /* @__PURE__ */ D(Oe, { children: [/* @__PURE__ */ E(y, {
|
|
1503
1587
|
variant: "ghost",
|
|
1504
1588
|
size: "icon",
|
|
1505
1589
|
className: "h-8 w-8",
|
|
1506
|
-
onClick:
|
|
1507
|
-
disabled: !
|
|
1590
|
+
onClick: Vt,
|
|
1591
|
+
disabled: !Ut,
|
|
1508
1592
|
"aria-label": x("gantt.toolbar.undo"),
|
|
1509
1593
|
"data-testid": "gantt-undo",
|
|
1510
|
-
children: /* @__PURE__ */
|
|
1511
|
-
}), /* @__PURE__ */
|
|
1594
|
+
children: /* @__PURE__ */ E(we, { className: "h-4 w-4" })
|
|
1595
|
+
}), /* @__PURE__ */ E(y, {
|
|
1512
1596
|
variant: "ghost",
|
|
1513
1597
|
size: "icon",
|
|
1514
1598
|
className: "h-8 w-8",
|
|
1515
|
-
onClick:
|
|
1516
|
-
disabled: !
|
|
1599
|
+
onClick: Ht,
|
|
1600
|
+
disabled: !Wt,
|
|
1517
1601
|
"aria-label": x("gantt.toolbar.redo"),
|
|
1518
1602
|
"data-testid": "gantt-redo",
|
|
1519
|
-
children: /* @__PURE__ */
|
|
1603
|
+
children: /* @__PURE__ */ E(Se, { className: "h-4 w-4" })
|
|
1520
1604
|
})] }) : null,
|
|
1521
|
-
/* @__PURE__ */
|
|
1605
|
+
/* @__PURE__ */ E(y, {
|
|
1522
1606
|
variant: "ghost",
|
|
1523
1607
|
size: "icon",
|
|
1524
1608
|
className: "h-8 w-8",
|
|
1525
|
-
onClick: () =>
|
|
1609
|
+
onClick: () => Tr((e) => !e),
|
|
1526
1610
|
"aria-label": x("gantt.toolbar.criticalPath"),
|
|
1527
|
-
"aria-pressed":
|
|
1611
|
+
"aria-pressed": wr,
|
|
1528
1612
|
"data-testid": "gantt-critical-path",
|
|
1529
|
-
style:
|
|
1530
|
-
children: /* @__PURE__ */
|
|
1613
|
+
style: wr ? { color: $ } : void 0,
|
|
1614
|
+
children: /* @__PURE__ */ E(pe, { className: "h-4 w-4" })
|
|
1531
1615
|
}),
|
|
1532
|
-
|
|
1616
|
+
Ne && M ? /* @__PURE__ */ E(y, {
|
|
1533
1617
|
variant: "ghost",
|
|
1534
1618
|
size: "icon",
|
|
1535
1619
|
className: "h-8 w-8",
|
|
1536
|
-
onClick:
|
|
1620
|
+
onClick: Or,
|
|
1537
1621
|
"aria-label": x("gantt.toolbar.autoSchedule"),
|
|
1538
1622
|
"data-testid": "gantt-auto-schedule",
|
|
1539
|
-
children: /* @__PURE__ */
|
|
1623
|
+
children: /* @__PURE__ */ E(Te, { className: "h-4 w-4" })
|
|
1540
1624
|
}) : null,
|
|
1541
|
-
/* @__PURE__ */
|
|
1625
|
+
/* @__PURE__ */ E(y, {
|
|
1542
1626
|
variant: "ghost",
|
|
1543
1627
|
size: "icon",
|
|
1544
1628
|
className: "h-8 w-8",
|
|
1545
|
-
onClick:
|
|
1629
|
+
onClick: Ar,
|
|
1546
1630
|
"aria-label": x("gantt.toolbar.exportPng"),
|
|
1547
1631
|
"data-testid": "gantt-export-png",
|
|
1548
|
-
children: /* @__PURE__ */
|
|
1632
|
+
children: /* @__PURE__ */ E(_e, { className: "h-4 w-4" })
|
|
1549
1633
|
}),
|
|
1550
|
-
/* @__PURE__ */
|
|
1634
|
+
/* @__PURE__ */ E(y, {
|
|
1551
1635
|
variant: "ghost",
|
|
1552
1636
|
size: "icon",
|
|
1553
1637
|
className: "h-8 w-8",
|
|
1554
|
-
onClick:
|
|
1638
|
+
onClick: jr,
|
|
1555
1639
|
"aria-label": x("gantt.toolbar.exportPdf"),
|
|
1556
1640
|
"data-testid": "gantt-export-pdf",
|
|
1557
|
-
children: /* @__PURE__ */
|
|
1641
|
+
children: /* @__PURE__ */ E(ve, { className: "h-4 w-4" })
|
|
1558
1642
|
}),
|
|
1559
|
-
|
|
1643
|
+
le || ce ? /* @__PURE__ */ E(y, {
|
|
1560
1644
|
variant: "ghost",
|
|
1561
1645
|
size: "icon",
|
|
1562
1646
|
className: "h-8 w-8",
|
|
1563
|
-
onClick:
|
|
1647
|
+
onClick: Pr,
|
|
1564
1648
|
"aria-label": x("gantt.toolbar.saveLayout"),
|
|
1565
|
-
"aria-pressed":
|
|
1649
|
+
"aria-pressed": Mr,
|
|
1566
1650
|
"data-testid": "gantt-save-layout",
|
|
1567
|
-
style:
|
|
1568
|
-
children: /* @__PURE__ */
|
|
1651
|
+
style: Mr ? { color: $ } : void 0,
|
|
1652
|
+
children: /* @__PURE__ */ E(Ce, { className: "h-4 w-4" })
|
|
1569
1653
|
}) : null,
|
|
1570
|
-
/* @__PURE__ */
|
|
1654
|
+
/* @__PURE__ */ E(y, {
|
|
1571
1655
|
variant: "ghost",
|
|
1572
1656
|
size: "icon",
|
|
1573
1657
|
className: "h-8 w-8",
|
|
1574
|
-
onClick:
|
|
1575
|
-
"aria-label": x(
|
|
1576
|
-
"aria-pressed":
|
|
1658
|
+
onClick: qn,
|
|
1659
|
+
"aria-label": x(Gn ? "gantt.toolbar.exitFullscreen" : "gantt.toolbar.enterFullscreen"),
|
|
1660
|
+
"aria-pressed": Gn,
|
|
1577
1661
|
"data-testid": "gantt-fullscreen",
|
|
1578
|
-
children:
|
|
1662
|
+
children: E(Gn ? ye : T, { className: "h-4 w-4" })
|
|
1579
1663
|
})
|
|
1580
1664
|
]
|
|
1581
1665
|
})]
|
|
1582
1666
|
}),
|
|
1583
|
-
/* @__PURE__ */
|
|
1667
|
+
/* @__PURE__ */ D("div", {
|
|
1584
1668
|
className: "relative flex flex-col flex-1 overflow-hidden outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
1585
1669
|
tabIndex: 0,
|
|
1586
|
-
onKeyDown:
|
|
1670
|
+
onKeyDown: gn,
|
|
1587
1671
|
"data-testid": "gantt-body",
|
|
1588
1672
|
children: [
|
|
1589
|
-
!
|
|
1673
|
+
!R && z > 0 && /* @__PURE__ */ E("div", {
|
|
1590
1674
|
className: "absolute top-0 bottom-0 z-30 group/splitter",
|
|
1591
1675
|
style: {
|
|
1592
|
-
left:
|
|
1676
|
+
left: z - 3,
|
|
1593
1677
|
width: 7,
|
|
1594
1678
|
cursor: "col-resize"
|
|
1595
1679
|
},
|
|
@@ -1599,7 +1683,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1599
1683
|
onPointerDown: (e) => {
|
|
1600
1684
|
if (e.button !== 0) return;
|
|
1601
1685
|
e.preventDefault();
|
|
1602
|
-
let t = e.clientX, n =
|
|
1686
|
+
let t = e.clientX, n = z, r = Math.max(160, k - 200), i = (e) => {
|
|
1603
1687
|
it(Math.max(160, Math.min(n + (e.clientX - t), r)));
|
|
1604
1688
|
}, a = () => {
|
|
1605
1689
|
window.removeEventListener("pointermove", i), window.removeEventListener("pointerup", a), window.removeEventListener("pointercancel", a), document.body.style.cursor = "";
|
|
@@ -1607,62 +1691,63 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1607
1691
|
document.body.style.cursor = "col-resize", window.addEventListener("pointermove", i), window.addEventListener("pointerup", a), window.addEventListener("pointercancel", a);
|
|
1608
1692
|
},
|
|
1609
1693
|
onDoubleClick: () => it(null),
|
|
1610
|
-
children: /* @__PURE__ */
|
|
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" })
|
|
1611
1695
|
}),
|
|
1612
|
-
/* @__PURE__ */
|
|
1696
|
+
/* @__PURE__ */ D("div", {
|
|
1613
1697
|
className: "flex border-b bg-muted/30 shrink-0 h-10 gantt-sm-h50",
|
|
1614
|
-
children: [/* @__PURE__ */
|
|
1698
|
+
children: [/* @__PURE__ */ D("div", {
|
|
1615
1699
|
className: "flex items-center font-medium text-xs text-muted-foreground px-2 sm:px-4 border-r bg-card z-20 shadow-sm",
|
|
1616
1700
|
style: {
|
|
1617
|
-
width:
|
|
1618
|
-
minWidth:
|
|
1701
|
+
width: z,
|
|
1702
|
+
minWidth: z
|
|
1619
1703
|
},
|
|
1620
|
-
children: [/* @__PURE__ */
|
|
1704
|
+
children: [/* @__PURE__ */ E("div", {
|
|
1621
1705
|
className: "flex-1 truncate",
|
|
1622
1706
|
children: x("gantt.column.taskName")
|
|
1623
|
-
}),
|
|
1707
|
+
}), gt && /* @__PURE__ */ D(Oe, { children: [/* @__PURE__ */ E("div", {
|
|
1624
1708
|
className: "w-16 gantt-sm-w20 text-right",
|
|
1625
1709
|
children: x("gantt.column.start")
|
|
1626
|
-
}), /* @__PURE__ */
|
|
1710
|
+
}), /* @__PURE__ */ E("div", {
|
|
1627
1711
|
className: "w-16 gantt-sm-w20 text-right",
|
|
1628
1712
|
children: x("gantt.column.end")
|
|
1629
1713
|
})] })]
|
|
1630
|
-
}), /* @__PURE__ */
|
|
1714
|
+
}), /* @__PURE__ */ E("div", {
|
|
1631
1715
|
className: "flex-1 overflow-hidden",
|
|
1632
|
-
ref:
|
|
1633
|
-
children: /* @__PURE__ */
|
|
1716
|
+
ref: kn,
|
|
1717
|
+
children: /* @__PURE__ */ D("div", {
|
|
1634
1718
|
className: "flex flex-col h-full",
|
|
1635
|
-
style: { width:
|
|
1636
|
-
children: [/* @__PURE__ */
|
|
1719
|
+
style: { width: bn },
|
|
1720
|
+
children: [/* @__PURE__ */ E("div", {
|
|
1637
1721
|
className: "relative border-b",
|
|
1638
1722
|
style: { height: "45%" },
|
|
1639
1723
|
"data-testid": "gantt-header-groups",
|
|
1640
|
-
children:
|
|
1724
|
+
children: Dn.slice(Un.start, Un.end).map((e) => /* @__PURE__ */ E("div", {
|
|
1641
1725
|
className: "absolute top-0 bottom-0 flex items-center justify-center border-r text-[10px] font-medium text-muted-foreground overflow-hidden",
|
|
1642
1726
|
style: {
|
|
1643
1727
|
left: e.offset,
|
|
1644
1728
|
width: e.width
|
|
1645
1729
|
},
|
|
1646
|
-
children: /* @__PURE__ */
|
|
1730
|
+
children: /* @__PURE__ */ E("span", {
|
|
1647
1731
|
className: "truncate px-1",
|
|
1648
1732
|
children: e.label
|
|
1649
1733
|
})
|
|
1650
1734
|
}, e.key))
|
|
1651
|
-
}), /* @__PURE__ */
|
|
1735
|
+
}), /* @__PURE__ */ E("div", {
|
|
1652
1736
|
className: "relative flex-1",
|
|
1653
1737
|
"data-testid": "gantt-header-units",
|
|
1654
|
-
children: q.slice(
|
|
1655
|
-
let n =
|
|
1656
|
-
return /* @__PURE__ */
|
|
1738
|
+
children: q.slice(Vn.start, Vn.end).map((e, t) => {
|
|
1739
|
+
let n = Vn.start + t;
|
|
1740
|
+
return /* @__PURE__ */ D("div", {
|
|
1657
1741
|
className: b("absolute top-0 bottom-0 flex items-center justify-center gap-1 border-r text-xs text-muted-foreground overflow-hidden", e.isWeekend && "bg-muted/50"),
|
|
1658
1742
|
style: {
|
|
1659
1743
|
left: J[n],
|
|
1660
|
-
width: e.width
|
|
1744
|
+
width: e.width,
|
|
1745
|
+
backgroundColor: e.bandColor ? `color-mix(in srgb, ${e.bandColor} 16%, transparent)` : void 0
|
|
1661
1746
|
},
|
|
1662
|
-
children: [/* @__PURE__ */
|
|
1747
|
+
children: [/* @__PURE__ */ E("span", {
|
|
1663
1748
|
className: "font-medium text-foreground truncate",
|
|
1664
1749
|
children: e.label
|
|
1665
|
-
}), e.sublabel &&
|
|
1750
|
+
}), e.sublabel && B >= 32 && /* @__PURE__ */ E("span", {
|
|
1666
1751
|
className: "text-[10px] opacity-70",
|
|
1667
1752
|
children: e.sublabel
|
|
1668
1753
|
})]
|
|
@@ -1672,26 +1757,26 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1672
1757
|
})
|
|
1673
1758
|
})]
|
|
1674
1759
|
}),
|
|
1675
|
-
/* @__PURE__ */
|
|
1760
|
+
/* @__PURE__ */ D("div", {
|
|
1676
1761
|
className: "flex flex-1 overflow-hidden",
|
|
1677
|
-
children: [/* @__PURE__ */
|
|
1762
|
+
children: [/* @__PURE__ */ D("div", {
|
|
1678
1763
|
className: "gantt-task-list overflow-y-auto overflow-x-hidden border-r bg-card z-10 shadow-sm",
|
|
1679
|
-
ref:
|
|
1680
|
-
onScroll:
|
|
1764
|
+
ref: An,
|
|
1765
|
+
onScroll: ar,
|
|
1681
1766
|
style: {
|
|
1682
|
-
width:
|
|
1683
|
-
minWidth:
|
|
1767
|
+
width: z,
|
|
1768
|
+
minWidth: z
|
|
1684
1769
|
},
|
|
1685
1770
|
role: "tree",
|
|
1686
1771
|
"aria-label": x("gantt.aria.taskList"),
|
|
1687
1772
|
children: [
|
|
1688
|
-
Z.startIdx > 0 && /* @__PURE__ */
|
|
1773
|
+
Z.startIdx > 0 && /* @__PURE__ */ E("div", {
|
|
1689
1774
|
style: { height: Z.startIdx * F },
|
|
1690
1775
|
"aria-hidden": "true"
|
|
1691
1776
|
}),
|
|
1692
1777
|
G.slice(Z.startIdx, Z.endIdx).map((e) => {
|
|
1693
|
-
let t = e.task, n =
|
|
1694
|
-
return /* @__PURE__ */
|
|
1778
|
+
let t = e.task, n = Me && _t === t.id, r = fn.has(String(t.id)), i = sn != null && String(sn) === String(t.id);
|
|
1779
|
+
return /* @__PURE__ */ D("div", {
|
|
1695
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"),
|
|
1696
1781
|
style: {
|
|
1697
1782
|
height: F,
|
|
@@ -1701,26 +1786,26 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1701
1786
|
"aria-level": e.depth + 1,
|
|
1702
1787
|
"aria-selected": i,
|
|
1703
1788
|
"aria-expanded": e.hasChildren ? !r : void 0,
|
|
1704
|
-
draggable: !!
|
|
1705
|
-
onDragStart:
|
|
1789
|
+
draggable: !!je && !n && !t.locked,
|
|
1790
|
+
onDragStart: je ? (e) => {
|
|
1706
1791
|
e.dataTransfer.setData("text/plain", String(t.id)), e.dataTransfer.effectAllowed = "move";
|
|
1707
1792
|
} : void 0,
|
|
1708
|
-
onDragOver:
|
|
1793
|
+
onDragOver: je ? (e) => {
|
|
1709
1794
|
e.preventDefault(), e.dataTransfer.dropEffect = "move";
|
|
1710
1795
|
} : void 0,
|
|
1711
|
-
onDrop:
|
|
1796
|
+
onDrop: je ? (e) => {
|
|
1712
1797
|
e.preventDefault();
|
|
1713
1798
|
let n = e.dataTransfer.getData("text/plain");
|
|
1714
1799
|
if (!n || n === String(t.id)) return;
|
|
1715
|
-
let r =
|
|
1716
|
-
r && String(r.parent ?? "") === String(t.parent ?? "") &&
|
|
1800
|
+
let r = wt.get(n);
|
|
1801
|
+
r && String(r.parent ?? "") === String(t.parent ?? "") && je(r, t);
|
|
1717
1802
|
} : void 0,
|
|
1718
|
-
onContextMenu: (e) =>
|
|
1803
|
+
onContextMenu: (e) => un(t, e),
|
|
1719
1804
|
onClick: () => {
|
|
1720
|
-
|
|
1805
|
+
cn(t.id), n || o?.(t);
|
|
1721
1806
|
},
|
|
1722
1807
|
onDoubleClick: () => {
|
|
1723
|
-
|
|
1808
|
+
Me && M && !e.isSummary && !t.locked && (vt(t.id), bt({
|
|
1724
1809
|
title: t.title,
|
|
1725
1810
|
start: t.start.toLocaleDateString("en-CA"),
|
|
1726
1811
|
end: t.end.toLocaleDateString("en-CA"),
|
|
@@ -1728,56 +1813,56 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1728
1813
|
}));
|
|
1729
1814
|
},
|
|
1730
1815
|
children: [
|
|
1731
|
-
/* @__PURE__ */
|
|
1816
|
+
/* @__PURE__ */ D("div", {
|
|
1732
1817
|
className: "flex-1 truncate font-medium text-xs sm:text-sm flex items-center gap-2",
|
|
1733
1818
|
style: e.depth > 0 ? { paddingLeft: e.depth * 14 } : void 0,
|
|
1734
1819
|
children: [
|
|
1735
|
-
e.hasChildren ? /* @__PURE__ */
|
|
1820
|
+
e.hasChildren ? /* @__PURE__ */ E("button", {
|
|
1736
1821
|
type: "button",
|
|
1737
1822
|
className: "h-4 w-4 shrink-0 flex items-center justify-center text-muted-foreground hover:text-foreground",
|
|
1738
1823
|
style: { marginLeft: -4 },
|
|
1739
1824
|
onClick: (e) => {
|
|
1740
|
-
e.stopPropagation(),
|
|
1825
|
+
e.stopPropagation(), mn(t.id);
|
|
1741
1826
|
},
|
|
1742
1827
|
"aria-expanded": !r,
|
|
1743
1828
|
"aria-label": x(r ? "gantt.row.expand" : "gantt.row.collapse"),
|
|
1744
1829
|
"data-testid": `gantt-row-toggle-${t.id}`,
|
|
1745
|
-
children:
|
|
1746
|
-
}) : /* @__PURE__ */
|
|
1830
|
+
children: E(r ? C : me, { className: "h-3.5 w-3.5" })
|
|
1831
|
+
}) : /* @__PURE__ */ E("span", {
|
|
1747
1832
|
className: "w-3 shrink-0",
|
|
1748
1833
|
style: { marginLeft: -4 },
|
|
1749
1834
|
"aria-hidden": "true"
|
|
1750
1835
|
}),
|
|
1751
|
-
/* @__PURE__ */
|
|
1836
|
+
/* @__PURE__ */ E("div", {
|
|
1752
1837
|
className: "w-2 h-2 rounded-full shrink-0",
|
|
1753
1838
|
style: { backgroundColor: t.color || "#3b82f6" }
|
|
1754
1839
|
}),
|
|
1755
|
-
n ? /* @__PURE__ */
|
|
1840
|
+
n ? /* @__PURE__ */ E("input", {
|
|
1756
1841
|
className: "border rounded px-1 py-0.5 text-xs w-full bg-background",
|
|
1757
|
-
value:
|
|
1758
|
-
onChange: (e) =>
|
|
1842
|
+
value: yt.title || "",
|
|
1843
|
+
onChange: (e) => bt((t) => ({
|
|
1759
1844
|
...t,
|
|
1760
1845
|
title: e.target.value
|
|
1761
1846
|
})),
|
|
1762
1847
|
onKeyDown: (e) => {
|
|
1763
|
-
e.key === "Enter" ? (
|
|
1848
|
+
e.key === "Enter" ? (Ft([{
|
|
1764
1849
|
task: t,
|
|
1765
1850
|
changes: {
|
|
1766
|
-
title:
|
|
1767
|
-
start: new Date(
|
|
1768
|
-
end: new Date(
|
|
1769
|
-
progress: Number(
|
|
1851
|
+
title: yt.title,
|
|
1852
|
+
start: new Date(yt.start),
|
|
1853
|
+
end: new Date(yt.end),
|
|
1854
|
+
progress: Number(yt.progress) || 0
|
|
1770
1855
|
}
|
|
1771
|
-
}]),
|
|
1856
|
+
}]), vt(null)) : e.key === "Escape" && vt(null);
|
|
1772
1857
|
},
|
|
1773
1858
|
onClick: (e) => e.stopPropagation(),
|
|
1774
1859
|
autoFocus: !0
|
|
1775
|
-
}) : /* @__PURE__ */
|
|
1860
|
+
}) : /* @__PURE__ */ D("span", {
|
|
1776
1861
|
className: "flex flex-col min-w-0",
|
|
1777
|
-
children: [/* @__PURE__ */
|
|
1862
|
+
children: [/* @__PURE__ */ E("span", {
|
|
1778
1863
|
className: b("truncate", e.isSummary && "font-semibold"),
|
|
1779
1864
|
children: t.title
|
|
1780
|
-
}), /* @__PURE__ */
|
|
1865
|
+
}), /* @__PURE__ */ D("span", {
|
|
1781
1866
|
className: "text-[10px] text-muted-foreground gantt-sm-hidden",
|
|
1782
1867
|
children: [
|
|
1783
1868
|
e.start.toLocaleDateString(S, {
|
|
@@ -1794,15 +1879,15 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1794
1879
|
})
|
|
1795
1880
|
]
|
|
1796
1881
|
}),
|
|
1797
|
-
/* @__PURE__ */
|
|
1882
|
+
/* @__PURE__ */ E("div", {
|
|
1798
1883
|
className: "w-16 gantt-sm-w20 text-right text-xs text-muted-foreground hidden sm:block",
|
|
1799
|
-
hidden: !
|
|
1800
|
-
style:
|
|
1801
|
-
children: n ? /* @__PURE__ */
|
|
1884
|
+
hidden: !gt,
|
|
1885
|
+
style: gt ? void 0 : { display: "none" },
|
|
1886
|
+
children: n ? /* @__PURE__ */ E("input", {
|
|
1802
1887
|
type: "date",
|
|
1803
1888
|
className: "border rounded px-1 py-0.5 text-xs w-full bg-background",
|
|
1804
|
-
value:
|
|
1805
|
-
onChange: (e) =>
|
|
1889
|
+
value: yt.start || "",
|
|
1890
|
+
onChange: (e) => bt((t) => ({
|
|
1806
1891
|
...t,
|
|
1807
1892
|
start: e.target.value
|
|
1808
1893
|
})),
|
|
@@ -1812,15 +1897,15 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1812
1897
|
day: "numeric"
|
|
1813
1898
|
})
|
|
1814
1899
|
}),
|
|
1815
|
-
/* @__PURE__ */
|
|
1900
|
+
/* @__PURE__ */ E("div", {
|
|
1816
1901
|
className: "w-16 gantt-sm-w20 text-right text-xs text-muted-foreground hidden sm:block",
|
|
1817
|
-
hidden: !
|
|
1818
|
-
style:
|
|
1819
|
-
children: n ? /* @__PURE__ */
|
|
1902
|
+
hidden: !gt,
|
|
1903
|
+
style: gt ? void 0 : { display: "none" },
|
|
1904
|
+
children: n ? /* @__PURE__ */ E("input", {
|
|
1820
1905
|
type: "date",
|
|
1821
1906
|
className: "border rounded px-1 py-0.5 text-xs w-full bg-background",
|
|
1822
|
-
value:
|
|
1823
|
-
onChange: (e) =>
|
|
1907
|
+
value: yt.end || "",
|
|
1908
|
+
onChange: (e) => bt((t) => ({
|
|
1824
1909
|
...t,
|
|
1825
1910
|
end: e.target.value
|
|
1826
1911
|
})),
|
|
@@ -1830,40 +1915,40 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1830
1915
|
day: "numeric"
|
|
1831
1916
|
})
|
|
1832
1917
|
}),
|
|
1833
|
-
!n && /* @__PURE__ */
|
|
1918
|
+
!n && /* @__PURE__ */ E("button", {
|
|
1834
1919
|
type: "button",
|
|
1835
1920
|
title: x("gantt.row.locate"),
|
|
1836
1921
|
"aria-label": x("gantt.row.locate"),
|
|
1837
1922
|
className: "gantt-locate-btn hidden sm:block absolute top-1/2 -translate-y-1/2",
|
|
1838
1923
|
style: { right: 1 },
|
|
1839
1924
|
onClick: (t) => {
|
|
1840
|
-
t.stopPropagation(),
|
|
1925
|
+
t.stopPropagation(), tr(e.start, e.end, e.task.id);
|
|
1841
1926
|
},
|
|
1842
|
-
children: /* @__PURE__ */
|
|
1927
|
+
children: /* @__PURE__ */ E(ge, { className: "w-3 h-3" })
|
|
1843
1928
|
})
|
|
1844
1929
|
]
|
|
1845
1930
|
}, t.id);
|
|
1846
1931
|
}),
|
|
1847
|
-
Z.endIdx < G.length && /* @__PURE__ */
|
|
1932
|
+
Z.endIdx < G.length && /* @__PURE__ */ E("div", {
|
|
1848
1933
|
style: { height: (G.length - Z.endIdx) * F },
|
|
1849
1934
|
"aria-hidden": "true"
|
|
1850
1935
|
})
|
|
1851
1936
|
]
|
|
1852
|
-
}), /* @__PURE__ */
|
|
1937
|
+
}), /* @__PURE__ */ E("div", {
|
|
1853
1938
|
className: "flex-1 overflow-auto bg-background/50 relative [-webkit-overflow-scrolling:touch]",
|
|
1854
1939
|
ref: (e) => {
|
|
1855
|
-
|
|
1940
|
+
jn.current = e, X.current = e;
|
|
1856
1941
|
},
|
|
1857
|
-
onScroll:
|
|
1858
|
-
onTouchStart:
|
|
1859
|
-
onTouchMove:
|
|
1860
|
-
onTouchEnd:
|
|
1942
|
+
onScroll: ir,
|
|
1943
|
+
onTouchStart: Yn,
|
|
1944
|
+
onTouchMove: Xn,
|
|
1945
|
+
onTouchEnd: Zn,
|
|
1861
1946
|
"data-testid": "gantt-timeline",
|
|
1862
|
-
children: /* @__PURE__ */
|
|
1947
|
+
children: /* @__PURE__ */ D("div", {
|
|
1863
1948
|
className: "relative",
|
|
1864
|
-
style: { width:
|
|
1949
|
+
style: { width: bn },
|
|
1865
1950
|
children: [
|
|
1866
|
-
Q != null && /* @__PURE__ */
|
|
1951
|
+
Q != null && /* @__PURE__ */ E("div", {
|
|
1867
1952
|
className: "absolute top-0 bottom-0 w-px z-20 pointer-events-none",
|
|
1868
1953
|
style: {
|
|
1869
1954
|
left: Q,
|
|
@@ -1871,7 +1956,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1871
1956
|
},
|
|
1872
1957
|
"data-testid": "gantt-today-marker",
|
|
1873
1958
|
"aria-label": x("gantt.toolbar.today"),
|
|
1874
|
-
children: /* @__PURE__ */
|
|
1959
|
+
children: /* @__PURE__ */ E("div", {
|
|
1875
1960
|
className: "absolute -translate-x-1/2 left-0 text-[10px] font-semibold text-white rounded-sm px-1 py-0.5 whitespace-nowrap z-30",
|
|
1876
1961
|
style: {
|
|
1877
1962
|
top: 2,
|
|
@@ -1880,7 +1965,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1880
1965
|
children: x("gantt.toolbar.today")
|
|
1881
1966
|
})
|
|
1882
1967
|
}),
|
|
1883
|
-
|
|
1968
|
+
On.map((e) => /* @__PURE__ */ E("div", {
|
|
1884
1969
|
className: "absolute top-0 bottom-0 w-px z-20 pointer-events-none",
|
|
1885
1970
|
style: {
|
|
1886
1971
|
left: e.left,
|
|
@@ -1888,7 +1973,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1888
1973
|
},
|
|
1889
1974
|
"data-testid": `gantt-marker-${e.index}`,
|
|
1890
1975
|
"aria-label": e.label,
|
|
1891
|
-
children: e.label && /* @__PURE__ */
|
|
1976
|
+
children: e.label && /* @__PURE__ */ E("div", {
|
|
1892
1977
|
className: "absolute -translate-x-1/2 left-0 text-[10px] font-semibold text-white rounded-sm px-1 py-0.5 whitespace-nowrap z-30",
|
|
1893
1978
|
style: {
|
|
1894
1979
|
top: 2,
|
|
@@ -1897,56 +1982,74 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1897
1982
|
children: e.label
|
|
1898
1983
|
})
|
|
1899
1984
|
}, e.index)),
|
|
1900
|
-
/* @__PURE__ */
|
|
1985
|
+
/* @__PURE__ */ D("div", {
|
|
1901
1986
|
className: "relative",
|
|
1902
|
-
ref:
|
|
1987
|
+
ref: Yt,
|
|
1903
1988
|
children: [
|
|
1904
|
-
/* @__PURE__ */
|
|
1989
|
+
/* @__PURE__ */ E("div", {
|
|
1905
1990
|
className: "absolute inset-0 pointer-events-none",
|
|
1906
1991
|
style: { zIndex: 0 },
|
|
1907
|
-
children: q.slice(
|
|
1908
|
-
let n =
|
|
1909
|
-
return /* @__PURE__ */
|
|
1992
|
+
children: q.slice(Vn.start, Vn.end).map((e, t) => {
|
|
1993
|
+
let n = Vn.start + t;
|
|
1994
|
+
return /* @__PURE__ */ E("div", {
|
|
1910
1995
|
className: "absolute top-0 bottom-0 border-r",
|
|
1911
1996
|
style: {
|
|
1912
1997
|
left: J[n],
|
|
1913
1998
|
width: e.width,
|
|
1914
|
-
backgroundColor: e.isWeekend ? "hsl(var(--muted) / 0.4)" : void 0
|
|
1999
|
+
backgroundColor: e.bandColor ? `color-mix(in srgb, ${e.bandColor} 8%, transparent)` : e.isWeekend ? "hsl(var(--muted) / 0.4)" : void 0
|
|
1915
2000
|
}
|
|
1916
2001
|
}, n);
|
|
1917
2002
|
})
|
|
1918
2003
|
}),
|
|
1919
|
-
|
|
2004
|
+
_n && v && v.showMidnight && /* @__PURE__ */ E("div", {
|
|
2005
|
+
className: "absolute inset-0 pointer-events-none",
|
|
2006
|
+
style: { zIndex: 0 },
|
|
2007
|
+
children: q.slice(Vn.start, Vn.end).map((e, t) => {
|
|
2008
|
+
let n = Vn.start + t, r = e.realMs ?? 0;
|
|
2009
|
+
if (!r) return null;
|
|
2010
|
+
let i = e.date.getTime(), a = e.date, o = new Date(a.getFullYear(), a.getMonth(), a.getDate() + 1, 0, 0, 0, 0).getTime();
|
|
2011
|
+
return o <= i || o >= i + r ? null : /* @__PURE__ */ E("div", {
|
|
2012
|
+
className: "absolute top-0 bottom-0",
|
|
2013
|
+
style: {
|
|
2014
|
+
left: J[n] + (o - i) / r * e.width,
|
|
2015
|
+
borderLeft: "1px dashed hsl(var(--muted-foreground) / 0.4)"
|
|
2016
|
+
},
|
|
2017
|
+
"data-testid": `gantt-midnight-${n}`,
|
|
2018
|
+
"aria-hidden": "true"
|
|
2019
|
+
}, `midnight-${n}`);
|
|
2020
|
+
})
|
|
2021
|
+
}),
|
|
2022
|
+
Z.startIdx > 0 && /* @__PURE__ */ E("div", {
|
|
1920
2023
|
style: { height: Z.startIdx * F },
|
|
1921
2024
|
"aria-hidden": "true"
|
|
1922
2025
|
}),
|
|
1923
2026
|
G.slice(Z.startIdx, Z.endIdx).map((t) => {
|
|
1924
|
-
let n = t.task, r =
|
|
2027
|
+
let n = t.task, r = Dr(n.id), i = or(t.start, t.end), a = te && n.baselineStart && n.baselineEnd ? or(n.baselineStart, n.baselineEnd) : null, s = a ? /* @__PURE__ */ E("div", {
|
|
1925
2028
|
className: "absolute pointer-events-none rounded-[1px]",
|
|
1926
2029
|
style: {
|
|
1927
2030
|
left: a.left,
|
|
1928
2031
|
width: Math.max(2, a.width),
|
|
1929
|
-
top:
|
|
1930
|
-
height:
|
|
1931
|
-
backgroundColor:
|
|
1932
|
-
border: `1px solid ${
|
|
2032
|
+
top: yr,
|
|
2033
|
+
height: vr,
|
|
2034
|
+
backgroundColor: br,
|
|
2035
|
+
border: `1px solid ${xr}`
|
|
1933
2036
|
},
|
|
1934
2037
|
"data-testid": `gantt-baseline-${n.id}`,
|
|
1935
2038
|
"aria-hidden": "true"
|
|
1936
|
-
}) : null, c =
|
|
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 = !!M && !t.isSummary && !f, m = U != null && U.targetId != null && String(U.targetId) === String(n.id) && String(U.sourceId) !== String(n.id), h = U ? (e) => {
|
|
1937
2040
|
let t = e.currentTarget.getBoundingClientRect(), r = t.width > 0 && e.clientX - t.left > t.width / 2 ? "end" : "start";
|
|
1938
|
-
|
|
2041
|
+
Xt((e) => e && String(e.sourceId) !== String(n.id) ? {
|
|
1939
2042
|
...e,
|
|
1940
2043
|
targetId: n.id,
|
|
1941
2044
|
targetEnd: r
|
|
1942
2045
|
} : e);
|
|
1943
2046
|
} : void 0, g = U ? (e) => {
|
|
1944
|
-
e.target === e.currentTarget &&
|
|
2047
|
+
e.target === e.currentTarget && Xt((e) => e && {
|
|
1945
2048
|
...e,
|
|
1946
2049
|
targetId: null,
|
|
1947
2050
|
targetEnd: null
|
|
1948
2051
|
});
|
|
1949
|
-
} : void 0,
|
|
2052
|
+
} : void 0, ee = Math.max(1, Math.round((t.end.getTime() - t.start.getTime()) / Xe)), _ = xt === n.id && !H && !Kt && !U ? /* @__PURE__ */ D("div", {
|
|
1950
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",
|
|
1951
2054
|
style: {
|
|
1952
2055
|
left: Math.max(d.left + 8, 4),
|
|
@@ -1954,10 +2057,10 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1954
2057
|
},
|
|
1955
2058
|
role: "tooltip",
|
|
1956
2059
|
"data-testid": `gantt-tooltip-${n.id}`,
|
|
1957
|
-
children: [/* @__PURE__ */
|
|
2060
|
+
children: [/* @__PURE__ */ E("div", {
|
|
1958
2061
|
className: "font-semibold",
|
|
1959
2062
|
children: n.title
|
|
1960
|
-
}), n.fields && n.fields.length > 0 ? /* @__PURE__ */
|
|
2063
|
+
}), n.fields && n.fields.length > 0 ? /* @__PURE__ */ E("div", {
|
|
1961
2064
|
style: {
|
|
1962
2065
|
display: "grid",
|
|
1963
2066
|
gridTemplateColumns: "auto 1fr",
|
|
@@ -1965,14 +2068,14 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1965
2068
|
rowGap: 2,
|
|
1966
2069
|
marginTop: 4
|
|
1967
2070
|
},
|
|
1968
|
-
children: n.fields.map((t, n) => /* @__PURE__ */
|
|
2071
|
+
children: n.fields.map((t, n) => /* @__PURE__ */ D(e.Fragment, { children: [/* @__PURE__ */ E("span", {
|
|
1969
2072
|
className: "text-muted-foreground",
|
|
1970
2073
|
children: t.label
|
|
1971
|
-
}), /* @__PURE__ */
|
|
2074
|
+
}), /* @__PURE__ */ E("span", {
|
|
1972
2075
|
style: { fontWeight: 500 },
|
|
1973
2076
|
children: t.value
|
|
1974
2077
|
})] }, n))
|
|
1975
|
-
}) : /* @__PURE__ */
|
|
2078
|
+
}) : /* @__PURE__ */ D("div", {
|
|
1976
2079
|
className: "text-muted-foreground",
|
|
1977
2080
|
children: [
|
|
1978
2081
|
t.start.toLocaleDateString(S, {
|
|
@@ -1985,7 +2088,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1985
2088
|
day: "numeric"
|
|
1986
2089
|
}),
|
|
1987
2090
|
" · ",
|
|
1988
|
-
|
|
2091
|
+
ee,
|
|
1989
2092
|
x("gantt.tooltip.days"),
|
|
1990
2093
|
" · ",
|
|
1991
2094
|
Math.round(t.progress),
|
|
@@ -1993,27 +2096,27 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
1993
2096
|
]
|
|
1994
2097
|
})]
|
|
1995
2098
|
}) : null;
|
|
1996
|
-
if (n.type === "group") return /* @__PURE__ */
|
|
2099
|
+
if (n.type === "group") return /* @__PURE__ */ E("div", {
|
|
1997
2100
|
className: "relative border-b hover:bg-accent/50",
|
|
1998
2101
|
style: { height: F },
|
|
1999
2102
|
onPointerMove: g,
|
|
2000
|
-
children:
|
|
2103
|
+
children: _
|
|
2001
2104
|
}, n.id);
|
|
2002
2105
|
if (t.isSummary) {
|
|
2003
2106
|
let e = n.color || "#0d9488";
|
|
2004
|
-
return /* @__PURE__ */
|
|
2107
|
+
return /* @__PURE__ */ D("div", {
|
|
2005
2108
|
className: "relative border-b hover:bg-accent/50",
|
|
2006
2109
|
style: { height: F },
|
|
2007
2110
|
onPointerMove: g,
|
|
2008
2111
|
children: [
|
|
2009
2112
|
s,
|
|
2010
|
-
/* @__PURE__ */
|
|
2011
|
-
className: b("gantt-bar-hover absolute rounded-sm border shadow-sm flex items-center px-2 select-none", M ? "cursor-grab active:cursor-grabbing" : "cursor-pointer", c && "ring-2 ring-primary z-10",
|
|
2113
|
+
/* @__PURE__ */ D("div", {
|
|
2114
|
+
className: b("gantt-bar-hover absolute rounded-sm border shadow-sm flex items-center px-2 select-none", M ? "cursor-grab active:cursor-grabbing" : "cursor-pointer", c && "ring-2 ring-primary z-10", Mn === n.id && "gantt-flash z-10"),
|
|
2012
2115
|
style: {
|
|
2013
2116
|
left: d.left,
|
|
2014
2117
|
width: d.width,
|
|
2015
|
-
top:
|
|
2016
|
-
height:
|
|
2118
|
+
top: _r,
|
|
2119
|
+
height: gr,
|
|
2017
2120
|
backgroundColor: e,
|
|
2018
2121
|
borderColor: r ? $ : "hsl(var(--primary-foreground) / 0.2)",
|
|
2019
2122
|
boxShadow: r ? `0 0 0 2px ${$}` : void 0
|
|
@@ -2021,20 +2124,20 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2021
2124
|
"data-critical": r ? "true" : void 0,
|
|
2022
2125
|
"data-testid": `gantt-summary-bar-${n.id}`,
|
|
2023
2126
|
"data-progress": Math.round(t.progress),
|
|
2024
|
-
onMouseEnter: () =>
|
|
2025
|
-
onMouseLeave: () =>
|
|
2127
|
+
onMouseEnter: () => St(n.id),
|
|
2128
|
+
onMouseLeave: () => St((e) => e === n.id ? null : e),
|
|
2026
2129
|
onPointerDown: (e) => {
|
|
2027
|
-
e.button === 0 &&
|
|
2130
|
+
e.button === 0 && Gt(n, "move", e, {
|
|
2028
2131
|
group: !0,
|
|
2029
2132
|
originStart: t.start,
|
|
2030
2133
|
originEnd: t.end
|
|
2031
2134
|
});
|
|
2032
2135
|
},
|
|
2033
2136
|
onClick: () => {
|
|
2034
|
-
|
|
2137
|
+
Ot.current || o?.(n);
|
|
2035
2138
|
},
|
|
2036
|
-
onContextMenu: (e) =>
|
|
2037
|
-
children: [/* @__PURE__ */
|
|
2139
|
+
onContextMenu: (e) => un(n, e),
|
|
2140
|
+
children: [/* @__PURE__ */ E("div", {
|
|
2038
2141
|
className: "absolute left-0 top-0 bottom-0 pointer-events-none",
|
|
2039
2142
|
style: {
|
|
2040
2143
|
width: `${Math.round(t.progress)}%`,
|
|
@@ -2042,44 +2145,44 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2042
2145
|
borderTopLeftRadius: "var(--radius-sm)",
|
|
2043
2146
|
borderBottomLeftRadius: "var(--radius-sm)"
|
|
2044
2147
|
}
|
|
2045
|
-
}), /* @__PURE__ */
|
|
2148
|
+
}), /* @__PURE__ */ E("span", {
|
|
2046
2149
|
className: "relative text-[10px] text-white font-medium truncate pointer-events-none",
|
|
2047
2150
|
children: n.title
|
|
2048
2151
|
})]
|
|
2049
2152
|
}),
|
|
2050
|
-
c &&
|
|
2153
|
+
c && H && /* @__PURE__ */ D("div", {
|
|
2051
2154
|
className: "absolute z-30 pointer-events-none rounded border bg-popover text-popover-foreground px-1.5 py-0.5 text-[10px] shadow whitespace-nowrap",
|
|
2052
2155
|
style: {
|
|
2053
2156
|
left: Math.max(d.left, 4),
|
|
2054
|
-
top:
|
|
2157
|
+
top: _r + gr + 2
|
|
2055
2158
|
},
|
|
2056
2159
|
"data-testid": `gantt-summary-drag-chip-${n.id}`,
|
|
2057
2160
|
children: [
|
|
2058
|
-
|
|
2161
|
+
kt(H).start.toLocaleDateString(S, {
|
|
2059
2162
|
month: "numeric",
|
|
2060
2163
|
day: "numeric"
|
|
2061
2164
|
}),
|
|
2062
2165
|
" → ",
|
|
2063
|
-
|
|
2166
|
+
kt(H).end.toLocaleDateString(S, {
|
|
2064
2167
|
month: "numeric",
|
|
2065
2168
|
day: "numeric"
|
|
2066
2169
|
})
|
|
2067
2170
|
]
|
|
2068
2171
|
}),
|
|
2069
|
-
|
|
2172
|
+
_
|
|
2070
2173
|
]
|
|
2071
2174
|
}, n.id);
|
|
2072
2175
|
}
|
|
2073
2176
|
if (t.isMilestone) {
|
|
2074
|
-
let e =
|
|
2075
|
-
return /* @__PURE__ */
|
|
2177
|
+
let e = mr;
|
|
2178
|
+
return /* @__PURE__ */ D("div", {
|
|
2076
2179
|
className: "relative border-b hover:bg-accent/50",
|
|
2077
2180
|
style: { height: F },
|
|
2078
2181
|
onPointerMove: g,
|
|
2079
2182
|
children: [
|
|
2080
2183
|
s,
|
|
2081
|
-
/* @__PURE__ */
|
|
2082
|
-
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",
|
|
2184
|
+
/* @__PURE__ */ E("div", {
|
|
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"),
|
|
2083
2186
|
style: {
|
|
2084
2187
|
left: d.left - e / 2,
|
|
2085
2188
|
top: (F - e) / 2,
|
|
@@ -2091,49 +2194,49 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2091
2194
|
},
|
|
2092
2195
|
"data-critical": r ? "true" : void 0,
|
|
2093
2196
|
"data-testid": `gantt-milestone-${n.id}`,
|
|
2094
|
-
onMouseEnter: () =>
|
|
2095
|
-
onMouseLeave: () =>
|
|
2197
|
+
onMouseEnter: () => St(n.id),
|
|
2198
|
+
onMouseLeave: () => St((e) => e === n.id ? null : e),
|
|
2096
2199
|
onClick: () => {
|
|
2097
|
-
|
|
2200
|
+
Ot.current || o?.(n);
|
|
2098
2201
|
},
|
|
2099
|
-
onContextMenu: (e) =>
|
|
2202
|
+
onContextMenu: (e) => un(n, e),
|
|
2100
2203
|
onPointerMove: h,
|
|
2101
2204
|
onPointerDown: p ? (e) => {
|
|
2102
|
-
e.button === 0 &&
|
|
2205
|
+
e.button === 0 && Gt(n, "move", e);
|
|
2103
2206
|
} : void 0
|
|
2104
2207
|
}),
|
|
2105
|
-
|
|
2208
|
+
_
|
|
2106
2209
|
]
|
|
2107
2210
|
}, n.id);
|
|
2108
2211
|
}
|
|
2109
|
-
let
|
|
2110
|
-
return /* @__PURE__ */
|
|
2212
|
+
let v = Kt && Kt.taskId === n.id ? Kt.value : n.progress;
|
|
2213
|
+
return /* @__PURE__ */ D("div", {
|
|
2111
2214
|
className: "relative border-b hover:bg-accent/50",
|
|
2112
2215
|
style: { height: F },
|
|
2113
2216
|
onPointerMove: g,
|
|
2114
|
-
onMouseEnter: () =>
|
|
2115
|
-
onMouseLeave: () =>
|
|
2217
|
+
onMouseEnter: () => St(n.id),
|
|
2218
|
+
onMouseLeave: () => St((e) => e === n.id ? null : e),
|
|
2116
2219
|
children: [
|
|
2117
|
-
c && /* @__PURE__ */
|
|
2220
|
+
c && /* @__PURE__ */ E("div", {
|
|
2118
2221
|
className: "absolute rounded-sm border border-dashed pointer-events-none",
|
|
2119
2222
|
style: {
|
|
2120
2223
|
left: i.left,
|
|
2121
2224
|
width: i.width,
|
|
2122
|
-
top:
|
|
2123
|
-
height:
|
|
2225
|
+
top: fr,
|
|
2226
|
+
height: pr,
|
|
2124
2227
|
opacity: .35,
|
|
2125
2228
|
borderColor: "hsl(var(--primary) / 0.6)"
|
|
2126
2229
|
},
|
|
2127
2230
|
"aria-hidden": "true"
|
|
2128
2231
|
}),
|
|
2129
2232
|
s,
|
|
2130
|
-
/* @__PURE__ */
|
|
2131
|
-
className: b("gantt-bar-hover absolute rounded-sm bg-primary border shadow-sm flex items-center px-2 group select-none", p ? "cursor-grab active:cursor-grabbing" : "cursor-pointer", c && "ring-2 ring-primary z-10", m && "ring-2 ring-primary",
|
|
2233
|
+
/* @__PURE__ */ D("div", {
|
|
2234
|
+
className: b("gantt-bar-hover absolute rounded-sm bg-primary border shadow-sm flex items-center px-2 group 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"),
|
|
2132
2235
|
style: {
|
|
2133
2236
|
left: d.left,
|
|
2134
2237
|
width: d.width,
|
|
2135
|
-
top:
|
|
2136
|
-
height:
|
|
2238
|
+
top: fr,
|
|
2239
|
+
height: pr,
|
|
2137
2240
|
backgroundColor: n.color || "#3b82f6",
|
|
2138
2241
|
borderColor: r ? $ : "hsl(var(--primary-foreground) / 0.2)",
|
|
2139
2242
|
boxShadow: r ? `0 0 0 2px ${$}` : void 0
|
|
@@ -2141,15 +2244,15 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2141
2244
|
"data-critical": r ? "true" : void 0,
|
|
2142
2245
|
"data-testid": `gantt-task-bar-${n.id}`,
|
|
2143
2246
|
onClick: () => {
|
|
2144
|
-
|
|
2247
|
+
Ot.current || o?.(n);
|
|
2145
2248
|
},
|
|
2146
|
-
onContextMenu: (e) =>
|
|
2249
|
+
onContextMenu: (e) => un(n, e),
|
|
2147
2250
|
onPointerMove: h,
|
|
2148
2251
|
onPointerDown: p ? (e) => {
|
|
2149
|
-
e.button === 0 &&
|
|
2252
|
+
e.button === 0 && Gt(n, "move", e);
|
|
2150
2253
|
} : void 0,
|
|
2151
2254
|
children: [
|
|
2152
|
-
p && d.width >= 14 && /* @__PURE__ */
|
|
2255
|
+
p && d.width >= 14 && /* @__PURE__ */ D(Oe, { children: [/* @__PURE__ */ E("div", {
|
|
2153
2256
|
className: "gantt-resize-handle absolute left-0 top-0 bottom-0",
|
|
2154
2257
|
style: {
|
|
2155
2258
|
width: 6,
|
|
@@ -2157,10 +2260,10 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2157
2260
|
},
|
|
2158
2261
|
"data-testid": `gantt-task-resize-left-${n.id}`,
|
|
2159
2262
|
onPointerDown: (e) => {
|
|
2160
|
-
e.button === 0 &&
|
|
2263
|
+
e.button === 0 && Gt(n, "resize-left", e);
|
|
2161
2264
|
},
|
|
2162
2265
|
onClick: (e) => e.stopPropagation()
|
|
2163
|
-
}), /* @__PURE__ */
|
|
2266
|
+
}), /* @__PURE__ */ E("div", {
|
|
2164
2267
|
className: "gantt-resize-handle absolute right-0 top-0 bottom-0",
|
|
2165
2268
|
style: {
|
|
2166
2269
|
width: 6,
|
|
@@ -2168,25 +2271,25 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2168
2271
|
},
|
|
2169
2272
|
"data-testid": `gantt-task-resize-right-${n.id}`,
|
|
2170
2273
|
onPointerDown: (e) => {
|
|
2171
|
-
e.button === 0 &&
|
|
2274
|
+
e.button === 0 && Gt(n, "resize-right", e);
|
|
2172
2275
|
},
|
|
2173
2276
|
onClick: (e) => e.stopPropagation()
|
|
2174
2277
|
})] }),
|
|
2175
|
-
|
|
2278
|
+
v > 0 && /* @__PURE__ */ E("div", {
|
|
2176
2279
|
className: "absolute left-0 top-0 bottom-0 pointer-events-none",
|
|
2177
2280
|
style: {
|
|
2178
|
-
width: `${
|
|
2281
|
+
width: `${v}%`,
|
|
2179
2282
|
backgroundColor: "rgba(0, 0, 0, 0.2)",
|
|
2180
2283
|
borderTopLeftRadius: "var(--radius-sm)",
|
|
2181
2284
|
borderBottomLeftRadius: "var(--radius-sm)"
|
|
2182
2285
|
}
|
|
2183
2286
|
}),
|
|
2184
|
-
p && d.width >= 30 && /* @__PURE__ */
|
|
2185
|
-
className: b("absolute bottom-0 h-1/2 w-4 -translate-x-1/2 cursor-col-resize flex items-end justify-center pb-px",
|
|
2186
|
-
style: { left: `${
|
|
2287
|
+
p && d.width >= 30 && /* @__PURE__ */ E("div", {
|
|
2288
|
+
className: b("absolute bottom-0 h-1/2 w-4 -translate-x-1/2 cursor-col-resize flex items-end justify-center pb-px", Kt?.taskId === n.id ? "opacity-100" : "opacity-0 group-hover:opacity-100 transition-opacity"),
|
|
2289
|
+
style: { left: `${v}%` },
|
|
2187
2290
|
"data-testid": `gantt-progress-handle-${n.id}`,
|
|
2188
2291
|
onPointerDown: (e) => {
|
|
2189
|
-
e.button === 0 && (e.stopPropagation(), e.preventDefault(),
|
|
2292
|
+
e.button === 0 && (e.stopPropagation(), e.preventDefault(), qt({
|
|
2190
2293
|
taskId: n.id,
|
|
2191
2294
|
originClientX: e.clientX,
|
|
2192
2295
|
originProgress: n.progress,
|
|
@@ -2195,7 +2298,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2195
2298
|
}));
|
|
2196
2299
|
},
|
|
2197
2300
|
onClick: (e) => e.stopPropagation(),
|
|
2198
|
-
children: /* @__PURE__ */
|
|
2301
|
+
children: /* @__PURE__ */ E("div", { style: {
|
|
2199
2302
|
width: 0,
|
|
2200
2303
|
height: 0,
|
|
2201
2304
|
borderLeft: "5px solid transparent",
|
|
@@ -2205,8 +2308,8 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2205
2308
|
} })
|
|
2206
2309
|
}),
|
|
2207
2310
|
N && !f && ["start", "end"].map((e) => {
|
|
2208
|
-
let t = U != null && String(U.sourceId) === String(n.id) && U.sourceEnd === e, r = t ||
|
|
2209
|
-
return /* @__PURE__ */
|
|
2311
|
+
let t = U != null && String(U.sourceId) === String(n.id) && U.sourceEnd === e, r = t || xt === n.id, i = r && U == null;
|
|
2312
|
+
return /* @__PURE__ */ E("div", {
|
|
2210
2313
|
className: "absolute top-1/2 -translate-y-1/2 z-20 flex items-center transition-opacity",
|
|
2211
2314
|
style: {
|
|
2212
2315
|
[e === "start" ? "left" : "right"]: -28,
|
|
@@ -2223,8 +2326,8 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2223
2326
|
onPointerDown: (t) => {
|
|
2224
2327
|
if (t.button !== 0) return;
|
|
2225
2328
|
t.stopPropagation(), t.preventDefault();
|
|
2226
|
-
let r =
|
|
2227
|
-
|
|
2329
|
+
let r = Yt.current?.getBoundingClientRect();
|
|
2330
|
+
Xt({
|
|
2228
2331
|
sourceId: n.id,
|
|
2229
2332
|
sourceEnd: e,
|
|
2230
2333
|
x: r ? t.clientX - r.left : 0,
|
|
@@ -2234,7 +2337,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2234
2337
|
});
|
|
2235
2338
|
},
|
|
2236
2339
|
onClick: (e) => e.stopPropagation(),
|
|
2237
|
-
children: /* @__PURE__ */
|
|
2340
|
+
children: /* @__PURE__ */ E("div", {
|
|
2238
2341
|
className: "rounded-full",
|
|
2239
2342
|
style: {
|
|
2240
2343
|
height: 12,
|
|
@@ -2246,39 +2349,39 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2246
2349
|
})
|
|
2247
2350
|
}, e);
|
|
2248
2351
|
}),
|
|
2249
|
-
/* @__PURE__ */
|
|
2352
|
+
/* @__PURE__ */ E("span", {
|
|
2250
2353
|
className: "relative text-[10px] text-white font-medium truncate pointer-events-none group-hover:opacity-0 transition-opacity",
|
|
2251
2354
|
children: n.title
|
|
2252
2355
|
}),
|
|
2253
|
-
/* @__PURE__ */
|
|
2356
|
+
/* @__PURE__ */ E("span", {
|
|
2254
2357
|
className: "absolute inset-0 flex items-center px-2 text-[10px] text-white font-medium truncate opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none",
|
|
2255
|
-
children: c ? `${
|
|
2358
|
+
children: c ? `${kt(H).start.toLocaleDateString(S, {
|
|
2256
2359
|
month: "numeric",
|
|
2257
2360
|
day: "numeric"
|
|
2258
|
-
})} → ${
|
|
2361
|
+
})} → ${kt(H).end.toLocaleDateString(S, {
|
|
2259
2362
|
month: "numeric",
|
|
2260
2363
|
day: "numeric"
|
|
2261
|
-
})}` : `${Math.round(
|
|
2364
|
+
})}` : `${Math.round(v)}%`
|
|
2262
2365
|
})
|
|
2263
2366
|
]
|
|
2264
2367
|
}),
|
|
2265
|
-
|
|
2368
|
+
_
|
|
2266
2369
|
]
|
|
2267
2370
|
}, n.id);
|
|
2268
2371
|
}),
|
|
2269
|
-
Z.endIdx < G.length && /* @__PURE__ */
|
|
2372
|
+
Z.endIdx < G.length && /* @__PURE__ */ E("div", {
|
|
2270
2373
|
style: { height: (G.length - Z.endIdx) * F },
|
|
2271
2374
|
"aria-hidden": "true"
|
|
2272
2375
|
}),
|
|
2273
|
-
(
|
|
2376
|
+
(dr.length > 0 || U) && /* @__PURE__ */ D("svg", {
|
|
2274
2377
|
className: "absolute top-0 left-0 pointer-events-none z-10",
|
|
2275
|
-
width:
|
|
2276
|
-
height:
|
|
2378
|
+
width: bn,
|
|
2379
|
+
height: Wn,
|
|
2277
2380
|
"data-testid": "gantt-links",
|
|
2278
2381
|
"aria-hidden": "true",
|
|
2279
2382
|
children: [
|
|
2280
|
-
/* @__PURE__ */
|
|
2281
|
-
/* @__PURE__ */
|
|
2383
|
+
/* @__PURE__ */ D("defs", { children: [
|
|
2384
|
+
/* @__PURE__ */ E("marker", {
|
|
2282
2385
|
id: "gantt-link-arrow",
|
|
2283
2386
|
viewBox: "0 0 8 8",
|
|
2284
2387
|
refX: "7",
|
|
@@ -2286,12 +2389,12 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2286
2389
|
markerWidth: "6",
|
|
2287
2390
|
markerHeight: "6",
|
|
2288
2391
|
orient: "auto",
|
|
2289
|
-
children: /* @__PURE__ */
|
|
2392
|
+
children: /* @__PURE__ */ E("path", {
|
|
2290
2393
|
d: "M 0 0 L 8 4 L 0 8 z",
|
|
2291
2394
|
fill: "hsl(var(--muted-foreground))"
|
|
2292
2395
|
})
|
|
2293
2396
|
}),
|
|
2294
|
-
/* @__PURE__ */
|
|
2397
|
+
/* @__PURE__ */ E("marker", {
|
|
2295
2398
|
id: "gantt-link-arrow-active",
|
|
2296
2399
|
viewBox: "0 0 8 8",
|
|
2297
2400
|
refX: "7",
|
|
@@ -2299,12 +2402,12 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2299
2402
|
markerWidth: "6",
|
|
2300
2403
|
markerHeight: "6",
|
|
2301
2404
|
orient: "auto",
|
|
2302
|
-
children: /* @__PURE__ */
|
|
2405
|
+
children: /* @__PURE__ */ E("path", {
|
|
2303
2406
|
d: "M 0 0 L 8 4 L 0 8 z",
|
|
2304
2407
|
fill: "hsl(var(--primary))"
|
|
2305
2408
|
})
|
|
2306
2409
|
}),
|
|
2307
|
-
/* @__PURE__ */
|
|
2410
|
+
/* @__PURE__ */ E("marker", {
|
|
2308
2411
|
id: "gantt-link-arrow-critical",
|
|
2309
2412
|
viewBox: "0 0 8 8",
|
|
2310
2413
|
refX: "7",
|
|
@@ -2312,19 +2415,19 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2312
2415
|
markerWidth: "6",
|
|
2313
2416
|
markerHeight: "6",
|
|
2314
2417
|
orient: "auto",
|
|
2315
|
-
children: /* @__PURE__ */
|
|
2418
|
+
children: /* @__PURE__ */ E("path", {
|
|
2316
2419
|
d: "M 0 0 L 8 4 L 0 8 z",
|
|
2317
2420
|
fill: $
|
|
2318
2421
|
})
|
|
2319
2422
|
})
|
|
2320
2423
|
] }),
|
|
2321
|
-
|
|
2424
|
+
dr.map((t) => {
|
|
2322
2425
|
let n = Math.min(t.sourceIndex, t.targetIndex);
|
|
2323
2426
|
if (Math.max(t.sourceIndex, t.targetIndex) < Z.startIdx - 6 || n > Z.endIdx + 6) return null;
|
|
2324
|
-
let r =
|
|
2427
|
+
let r = Sr(t);
|
|
2325
2428
|
if (!r) return null;
|
|
2326
|
-
let i =
|
|
2327
|
-
return /* @__PURE__ */
|
|
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 = !!(P || N);
|
|
2430
|
+
return /* @__PURE__ */ D(e.Fragment, { children: [/* @__PURE__ */ E("path", {
|
|
2328
2431
|
d: r,
|
|
2329
2432
|
fill: "none",
|
|
2330
2433
|
stroke: a ? $ : i ? "hsl(var(--primary))" : "hsl(var(--muted-foreground))",
|
|
@@ -2335,7 +2438,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2335
2438
|
"data-link-type": t.type,
|
|
2336
2439
|
"data-active": i ? "true" : "false",
|
|
2337
2440
|
"data-critical": a ? "true" : void 0
|
|
2338
|
-
}), s && /* @__PURE__ */
|
|
2441
|
+
}), s && /* @__PURE__ */ E("path", {
|
|
2339
2442
|
d: r,
|
|
2340
2443
|
fill: "none",
|
|
2341
2444
|
stroke: "transparent",
|
|
@@ -2345,14 +2448,14 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2345
2448
|
cursor: "context-menu"
|
|
2346
2449
|
},
|
|
2347
2450
|
"data-testid": `gantt-link-hit-${t.sourceId}-${t.targetId}`,
|
|
2348
|
-
onContextMenu: (e) =>
|
|
2451
|
+
onContextMenu: (e) => dn(t.sourceId, t.targetId, t.type, e)
|
|
2349
2452
|
})] }, t.key);
|
|
2350
2453
|
}),
|
|
2351
2454
|
U && (() => {
|
|
2352
2455
|
let e = G.findIndex((e) => String(e.task.id) === String(U.sourceId));
|
|
2353
2456
|
if (e < 0) return null;
|
|
2354
|
-
let t =
|
|
2355
|
-
return /* @__PURE__ */
|
|
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 * F + F / 2;
|
|
2458
|
+
return /* @__PURE__ */ E("path", {
|
|
2356
2459
|
d: `M ${Math.round(n)} ${Math.round(r)} L ${Math.round(U.x)} ${Math.round(U.y)}`,
|
|
2357
2460
|
fill: "none",
|
|
2358
2461
|
stroke: "hsl(var(--primary))",
|
|
@@ -2367,7 +2470,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2367
2470
|
let e = t.find((e) => String(e.id) === String(U.sourceId));
|
|
2368
2471
|
if (!e) return null;
|
|
2369
2472
|
let n = U.targetId == null ? null : t.find((e) => String(e.id) === String(U.targetId)), r = (e) => x(`gantt.linkEnd.${e}`), i = n ? `${e.title} (${r(U.sourceEnd)}) → ${n.title} (${r(U.targetEnd ?? "start")})` : `${e.title} (${r(U.sourceEnd)})`;
|
|
2370
|
-
return /* @__PURE__ */
|
|
2473
|
+
return /* @__PURE__ */ E("div", {
|
|
2371
2474
|
className: "absolute z-30 pointer-events-none rounded-md border bg-popover text-popover-foreground px-2 py-1 text-[11px] font-medium shadow-md whitespace-nowrap",
|
|
2372
2475
|
style: {
|
|
2373
2476
|
left: U.x + 12,
|
|
@@ -2385,37 +2488,37 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2385
2488
|
})
|
|
2386
2489
|
]
|
|
2387
2490
|
}),
|
|
2388
|
-
|
|
2389
|
-
let e = t.find((e) => String(e.id) === String(
|
|
2491
|
+
Qt && (() => {
|
|
2492
|
+
let e = t.find((e) => String(e.id) === String(Qt.taskId));
|
|
2390
2493
|
if (!e) return null;
|
|
2391
|
-
let n = G.find((e) => String(e.task.id) === String(
|
|
2392
|
-
return /* @__PURE__ */
|
|
2393
|
-
ref:
|
|
2494
|
+
let n = G.find((e) => String(e.task.id) === String(Qt.taskId)), r = "w-full text-left px-3 py-1.5 hover:bg-accent focus:bg-accent outline-none";
|
|
2495
|
+
return /* @__PURE__ */ D("div", {
|
|
2496
|
+
ref: en,
|
|
2394
2497
|
className: "fixed z-50 min-w-[160px] rounded-md border bg-popover text-popover-foreground shadow-md py-1 text-sm",
|
|
2395
2498
|
style: {
|
|
2396
|
-
left:
|
|
2397
|
-
top:
|
|
2499
|
+
left: Qt.x,
|
|
2500
|
+
top: Qt.y
|
|
2398
2501
|
},
|
|
2399
2502
|
role: "menu",
|
|
2400
2503
|
"data-testid": "gantt-context-menu",
|
|
2401
2504
|
children: [
|
|
2402
|
-
o && /* @__PURE__ */
|
|
2505
|
+
o && /* @__PURE__ */ E("button", {
|
|
2403
2506
|
type: "button",
|
|
2404
2507
|
role: "menuitem",
|
|
2405
2508
|
className: r,
|
|
2406
2509
|
"data-testid": "gantt-context-menu-view",
|
|
2407
2510
|
onClick: () => {
|
|
2408
|
-
|
|
2511
|
+
$t(null), o(e);
|
|
2409
2512
|
},
|
|
2410
2513
|
children: x("gantt.menu.view")
|
|
2411
2514
|
}),
|
|
2412
|
-
|
|
2515
|
+
Me && M && n && !n.isSummary && !e.locked && /* @__PURE__ */ E("button", {
|
|
2413
2516
|
type: "button",
|
|
2414
2517
|
role: "menuitem",
|
|
2415
2518
|
className: r,
|
|
2416
2519
|
"data-testid": "gantt-context-menu-edit",
|
|
2417
2520
|
onClick: () => {
|
|
2418
|
-
|
|
2521
|
+
$t(null), vt(e.id), bt({
|
|
2419
2522
|
title: e.title,
|
|
2420
2523
|
start: e.start.toLocaleDateString("en-CA"),
|
|
2421
2524
|
end: e.end.toLocaleDateString("en-CA"),
|
|
@@ -2424,14 +2527,14 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2424
2527
|
},
|
|
2425
2528
|
children: x("gantt.menu.edit")
|
|
2426
2529
|
}),
|
|
2427
|
-
N && n && !n.isMilestone && !e.locked && /* @__PURE__ */
|
|
2530
|
+
N && n && !n.isMilestone && !e.locked && /* @__PURE__ */ D(Oe, { children: [/* @__PURE__ */ E("button", {
|
|
2428
2531
|
type: "button",
|
|
2429
2532
|
role: "menuitem",
|
|
2430
2533
|
className: r,
|
|
2431
2534
|
"data-testid": "gantt-context-menu-add-predecessor",
|
|
2432
2535
|
onClick: () => {
|
|
2433
|
-
let t =
|
|
2434
|
-
|
|
2536
|
+
let t = Qt;
|
|
2537
|
+
$t(null), an({
|
|
2435
2538
|
x: t.x,
|
|
2436
2539
|
y: t.y,
|
|
2437
2540
|
taskId: e.id,
|
|
@@ -2439,14 +2542,14 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2439
2542
|
});
|
|
2440
2543
|
},
|
|
2441
2544
|
children: x("gantt.menu.addPredecessor")
|
|
2442
|
-
}), /* @__PURE__ */
|
|
2545
|
+
}), /* @__PURE__ */ E("button", {
|
|
2443
2546
|
type: "button",
|
|
2444
2547
|
role: "menuitem",
|
|
2445
2548
|
className: r,
|
|
2446
2549
|
"data-testid": "gantt-context-menu-add-successor",
|
|
2447
2550
|
onClick: () => {
|
|
2448
|
-
let t =
|
|
2449
|
-
|
|
2551
|
+
let t = Qt;
|
|
2552
|
+
$t(null), an({
|
|
2450
2553
|
x: t.x,
|
|
2451
2554
|
y: t.y,
|
|
2452
2555
|
taskId: e.id,
|
|
@@ -2455,13 +2558,13 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2455
2558
|
},
|
|
2456
2559
|
children: x("gantt.menu.addSuccessor")
|
|
2457
2560
|
})] }),
|
|
2458
|
-
|
|
2561
|
+
Ae && !e.locked && /* @__PURE__ */ E("button", {
|
|
2459
2562
|
type: "button",
|
|
2460
2563
|
role: "menuitem",
|
|
2461
2564
|
className: b(r, "text-destructive"),
|
|
2462
2565
|
"data-testid": "gantt-context-menu-delete",
|
|
2463
2566
|
onClick: () => {
|
|
2464
|
-
|
|
2567
|
+
$t(null), Ae(e);
|
|
2465
2568
|
},
|
|
2466
2569
|
children: x("gantt.menu.delete")
|
|
2467
2570
|
})
|
|
@@ -2472,8 +2575,8 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2472
2575
|
let e = t.find((e) => String(e.id) === String(W.sourceId)), n = t.find((e) => String(e.id) === String(W.targetId));
|
|
2473
2576
|
if (!e || !n) return null;
|
|
2474
2577
|
let r = "w-full text-left px-3 py-1.5 hover:bg-accent focus:bg-accent outline-none";
|
|
2475
|
-
return /* @__PURE__ */
|
|
2476
|
-
ref:
|
|
2578
|
+
return /* @__PURE__ */ D("div", {
|
|
2579
|
+
ref: nn,
|
|
2477
2580
|
className: "fixed z-50 min-w-[180px] rounded-md border bg-popover text-popover-foreground shadow-md py-1 text-sm",
|
|
2478
2581
|
style: {
|
|
2479
2582
|
left: W.x,
|
|
@@ -2482,7 +2585,7 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2482
2585
|
role: "menu",
|
|
2483
2586
|
"data-testid": "gantt-link-context-menu",
|
|
2484
2587
|
children: [
|
|
2485
|
-
/* @__PURE__ */
|
|
2588
|
+
/* @__PURE__ */ D("div", {
|
|
2486
2589
|
className: "px-3 py-1 text-xs text-muted-foreground truncate",
|
|
2487
2590
|
children: [
|
|
2488
2591
|
e.title,
|
|
@@ -2495,98 +2598,98 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2495
2598
|
"ss",
|
|
2496
2599
|
"ff",
|
|
2497
2600
|
"sf"
|
|
2498
|
-
].map((t) => /* @__PURE__ */
|
|
2601
|
+
].map((t) => /* @__PURE__ */ D("button", {
|
|
2499
2602
|
type: "button",
|
|
2500
2603
|
role: "menuitemradio",
|
|
2501
2604
|
"aria-checked": W.type === t,
|
|
2502
2605
|
className: b(r, W.type === t && "font-semibold"),
|
|
2503
2606
|
"data-testid": `gantt-link-menu-type-${t}`,
|
|
2504
2607
|
onClick: () => {
|
|
2505
|
-
|
|
2608
|
+
tn(null), t !== W.type && N(e, n, t);
|
|
2506
2609
|
},
|
|
2507
2610
|
children: [W.type === t ? "✓ " : "\xA0\xA0", x(`gantt.linkType.${t}`)]
|
|
2508
2611
|
}, t)),
|
|
2509
|
-
|
|
2612
|
+
P && /* @__PURE__ */ D(Oe, { children: [/* @__PURE__ */ E("div", { className: "my-1 border-t" }), /* @__PURE__ */ E("button", {
|
|
2510
2613
|
type: "button",
|
|
2511
2614
|
role: "menuitem",
|
|
2512
2615
|
className: b(r, "text-destructive"),
|
|
2513
2616
|
"data-testid": "gantt-link-menu-remove",
|
|
2514
2617
|
onClick: () => {
|
|
2515
|
-
|
|
2618
|
+
tn(null), P(e, n);
|
|
2516
2619
|
},
|
|
2517
2620
|
children: x("gantt.menu.removeDependency")
|
|
2518
2621
|
})] })
|
|
2519
2622
|
]
|
|
2520
2623
|
});
|
|
2521
2624
|
})(),
|
|
2522
|
-
|
|
2523
|
-
let e = t.find((e) => String(e.id) === String(
|
|
2625
|
+
rn && N && (() => {
|
|
2626
|
+
let e = t.find((e) => String(e.id) === String(rn.taskId));
|
|
2524
2627
|
if (!e) return null;
|
|
2525
|
-
let n = new Set(
|
|
2628
|
+
let n = new Set(dr.map((e) => `${String(e.sourceId)}->${String(e.targetId)}`)), r = t.filter((t) => {
|
|
2526
2629
|
if (String(t.id) === String(e.id) || t.type === "summary") return !1;
|
|
2527
|
-
let r =
|
|
2630
|
+
let r = rn.relation === "pred" ? `${String(t.id)}->${String(e.id)}` : `${String(e.id)}->${String(t.id)}`;
|
|
2528
2631
|
return !n.has(r);
|
|
2529
2632
|
});
|
|
2530
|
-
return /* @__PURE__ */
|
|
2531
|
-
ref:
|
|
2633
|
+
return /* @__PURE__ */ D("div", {
|
|
2634
|
+
ref: on,
|
|
2532
2635
|
className: "fixed z-50 min-w-[200px] max-h-[280px] overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md py-1 text-sm",
|
|
2533
2636
|
style: {
|
|
2534
|
-
left:
|
|
2535
|
-
top:
|
|
2637
|
+
left: rn.x,
|
|
2638
|
+
top: rn.y
|
|
2536
2639
|
},
|
|
2537
2640
|
role: "menu",
|
|
2538
2641
|
"data-testid": "gantt-dep-picker",
|
|
2539
|
-
children: [/* @__PURE__ */
|
|
2642
|
+
children: [/* @__PURE__ */ E("div", {
|
|
2540
2643
|
className: "px-3 py-1 text-xs text-muted-foreground",
|
|
2541
|
-
children:
|
|
2542
|
-
}), r.length === 0 ? /* @__PURE__ */
|
|
2644
|
+
children: rn.relation === "pred" ? x("gantt.menu.addPredecessor") : x("gantt.menu.addSuccessor")
|
|
2645
|
+
}), r.length === 0 ? /* @__PURE__ */ E("div", {
|
|
2543
2646
|
className: "px-3 py-1.5 text-muted-foreground",
|
|
2544
2647
|
children: x("gantt.menu.noCandidates")
|
|
2545
|
-
}) : r.map((t) => /* @__PURE__ */
|
|
2648
|
+
}) : r.map((t) => /* @__PURE__ */ E("button", {
|
|
2546
2649
|
type: "button",
|
|
2547
2650
|
role: "menuitem",
|
|
2548
2651
|
className: "w-full text-left px-3 py-1.5 hover:bg-accent focus:bg-accent outline-none truncate",
|
|
2549
2652
|
"data-testid": `gantt-dep-picker-option-${t.id}`,
|
|
2550
2653
|
onClick: () => {
|
|
2551
|
-
|
|
2654
|
+
an(null), rn.relation === "pred" ? N(t, e, "fs") : N(e, t, "fs");
|
|
2552
2655
|
},
|
|
2553
2656
|
children: t.title
|
|
2554
2657
|
}, String(t.id)))]
|
|
2555
2658
|
});
|
|
2556
2659
|
})(),
|
|
2557
|
-
|
|
2660
|
+
It && /* @__PURE__ */ E("div", {
|
|
2558
2661
|
className: "fixed inset-0 z-[60] flex items-center justify-center bg-black/30",
|
|
2559
2662
|
"data-testid": "gantt-conflict-overlay",
|
|
2560
|
-
onClick: () =>
|
|
2561
|
-
children: /* @__PURE__ */
|
|
2663
|
+
onClick: () => Lt(null),
|
|
2664
|
+
children: /* @__PURE__ */ D("div", {
|
|
2562
2665
|
className: "min-w-[280px] max-w-[360px] rounded-lg border bg-popover text-popover-foreground shadow-lg p-4",
|
|
2563
2666
|
role: "alertdialog",
|
|
2564
2667
|
"aria-modal": "true",
|
|
2565
2668
|
"data-testid": "gantt-conflict-dialog",
|
|
2566
2669
|
onClick: (e) => e.stopPropagation(),
|
|
2567
2670
|
children: [
|
|
2568
|
-
/* @__PURE__ */
|
|
2671
|
+
/* @__PURE__ */ E("div", {
|
|
2569
2672
|
className: "text-sm font-semibold mb-1",
|
|
2570
2673
|
"data-testid": "gantt-conflict-title",
|
|
2571
2674
|
children: x("gantt.conflict.title")
|
|
2572
2675
|
}),
|
|
2573
|
-
/* @__PURE__ */
|
|
2676
|
+
/* @__PURE__ */ E("div", {
|
|
2574
2677
|
className: "text-sm text-muted-foreground mb-3",
|
|
2575
|
-
children: x("gantt.conflict.body").replace("{count}", String(
|
|
2678
|
+
children: x("gantt.conflict.body").replace("{count}", String(It.length))
|
|
2576
2679
|
}),
|
|
2577
|
-
/* @__PURE__ */
|
|
2680
|
+
/* @__PURE__ */ D("div", {
|
|
2578
2681
|
className: "flex justify-end gap-2",
|
|
2579
|
-
children: [/* @__PURE__ */
|
|
2682
|
+
children: [/* @__PURE__ */ E("button", {
|
|
2580
2683
|
type: "button",
|
|
2581
2684
|
className: "px-3 py-1.5 text-sm rounded-md border hover:bg-accent outline-none",
|
|
2582
2685
|
"data-testid": "gantt-conflict-cancel",
|
|
2583
|
-
onClick: () =>
|
|
2686
|
+
onClick: () => Lt(null),
|
|
2584
2687
|
children: x("gantt.conflict.cancel")
|
|
2585
|
-
}), /* @__PURE__ */
|
|
2688
|
+
}), /* @__PURE__ */ E("button", {
|
|
2586
2689
|
type: "button",
|
|
2587
2690
|
className: "px-3 py-1.5 text-sm rounded-md bg-primary text-primary-foreground hover:opacity-90 outline-none",
|
|
2588
2691
|
"data-testid": "gantt-conflict-confirm",
|
|
2589
|
-
onClick:
|
|
2692
|
+
onClick: zt,
|
|
2590
2693
|
children: x("gantt.conflict.confirm")
|
|
2591
2694
|
})]
|
|
2592
2695
|
})
|
|
@@ -2598,10 +2701,10 @@ function tt({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
|
|
|
2598
2701
|
}
|
|
2599
2702
|
//#endregion
|
|
2600
2703
|
//#region src/workload.ts
|
|
2601
|
-
function
|
|
2704
|
+
function st(e, t, n, r) {
|
|
2602
2705
|
return t.getTime() === e.getTime() ? e.getTime() >= n.getTime() && e.getTime() < r.getTime() : e.getTime() < r.getTime() && t.getTime() > n.getTime();
|
|
2603
2706
|
}
|
|
2604
|
-
function
|
|
2707
|
+
function ct(e, t, n) {
|
|
2605
2708
|
let { assignee: r, effort: i, capacity: a = 1, unassignedLabel: o = "Unassigned" } = n, s = (e) => typeof a == "function" ? a(e) : a, c = (e) => {
|
|
2606
2709
|
let t = i ? i(e) : 1;
|
|
2607
2710
|
return Number.isFinite(t) && t > 0 ? t : 0;
|
|
@@ -2618,7 +2721,7 @@ function rt(e, t, n) {
|
|
|
2618
2721
|
for (let e of l.values()) {
|
|
2619
2722
|
let n = s(e.key), r = 0, i = 0, a = t.map((t) => {
|
|
2620
2723
|
let a = 0;
|
|
2621
|
-
for (let n of e.items)
|
|
2724
|
+
for (let n of e.items) st(n.start, n.end, t.start, t.end) && (a += c(n));
|
|
2622
2725
|
a > r && (r = a);
|
|
2623
2726
|
let o = a > n + 1e-9;
|
|
2624
2727
|
return o && i++, {
|
|
@@ -2640,32 +2743,32 @@ function rt(e, t, n) {
|
|
|
2640
2743
|
}
|
|
2641
2744
|
//#endregion
|
|
2642
2745
|
//#region src/ResourceWorkload.tsx
|
|
2643
|
-
var
|
|
2746
|
+
var lt = {
|
|
2644
2747
|
day: 26,
|
|
2645
2748
|
week: 56,
|
|
2646
2749
|
month: 76,
|
|
2647
2750
|
quarter: 88,
|
|
2648
2751
|
year: 104
|
|
2649
|
-
},
|
|
2650
|
-
function
|
|
2752
|
+
}, ut = 48, R = 34, dt = 180;
|
|
2753
|
+
function ft(e, t, n) {
|
|
2651
2754
|
return t === "day" ? String(e.getDate()) : t === "week" ? e.toLocaleDateString(n, {
|
|
2652
2755
|
month: "numeric",
|
|
2653
2756
|
day: "numeric"
|
|
2654
2757
|
}) : t === "month" ? e.toLocaleDateString(n, { month: "short" }) : t === "year" ? String(e.getFullYear()) : `Q${Math.floor(e.getMonth() / 3) + 1}`;
|
|
2655
2758
|
}
|
|
2656
|
-
function
|
|
2657
|
-
let { t: c, language: l } =
|
|
2759
|
+
function pt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "day", unassignedLabel: o = "Unassigned", className: s }) {
|
|
2760
|
+
let { t: c, language: l } = Ue(), u = l || void 0, d = lt[a], f = e.useMemo(() => {
|
|
2658
2761
|
if (!t.length) return [];
|
|
2659
|
-
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 = Ze(e, a), i = $e(Ze(n, a), 1, a), o = [], s = 0;
|
|
2660
2763
|
for (; r < i && s++ < 4e3;) {
|
|
2661
|
-
let e =
|
|
2764
|
+
let e = $e(r, 1, a);
|
|
2662
2765
|
o.push({
|
|
2663
2766
|
date: new Date(r),
|
|
2664
2767
|
col: {
|
|
2665
2768
|
start: new Date(r),
|
|
2666
2769
|
end: new Date(e)
|
|
2667
2770
|
},
|
|
2668
|
-
label:
|
|
2771
|
+
label: ft(r, a, u)
|
|
2669
2772
|
}), r = e;
|
|
2670
2773
|
}
|
|
2671
2774
|
return o;
|
|
@@ -2673,7 +2776,7 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2673
2776
|
t,
|
|
2674
2777
|
a,
|
|
2675
2778
|
u
|
|
2676
|
-
]), p = e.useMemo(() =>
|
|
2779
|
+
]), p = e.useMemo(() => ct(t, f.map((e) => e.col), {
|
|
2677
2780
|
assignee: n,
|
|
2678
2781
|
effort: r,
|
|
2679
2782
|
capacity: i,
|
|
@@ -2690,7 +2793,7 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2690
2793
|
for (let t of p) e = Math.max(e, t.peak, t.capacity);
|
|
2691
2794
|
return e || 1;
|
|
2692
2795
|
}, [p]), h = f.length * d;
|
|
2693
|
-
return t.length ? /* @__PURE__ */
|
|
2796
|
+
return t.length ? /* @__PURE__ */ E("div", {
|
|
2694
2797
|
className: s,
|
|
2695
2798
|
"data-testid": "resource-workload",
|
|
2696
2799
|
style: {
|
|
@@ -2699,17 +2802,17 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2699
2802
|
height: "100%",
|
|
2700
2803
|
overflow: "auto"
|
|
2701
2804
|
},
|
|
2702
|
-
children: /* @__PURE__ */
|
|
2805
|
+
children: /* @__PURE__ */ D("div", {
|
|
2703
2806
|
style: {
|
|
2704
2807
|
display: "flex",
|
|
2705
|
-
minWidth:
|
|
2808
|
+
minWidth: dt + h
|
|
2706
2809
|
},
|
|
2707
|
-
children: [/* @__PURE__ */
|
|
2810
|
+
children: [/* @__PURE__ */ D("div", {
|
|
2708
2811
|
style: {
|
|
2709
|
-
width:
|
|
2812
|
+
width: dt,
|
|
2710
2813
|
flexShrink: 0
|
|
2711
2814
|
},
|
|
2712
|
-
children: [/* @__PURE__ */
|
|
2815
|
+
children: [/* @__PURE__ */ E("div", {
|
|
2713
2816
|
style: {
|
|
2714
2817
|
height: 28,
|
|
2715
2818
|
display: "flex",
|
|
@@ -2720,17 +2823,17 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2720
2823
|
borderBottom: "1px solid hsl(var(--border))"
|
|
2721
2824
|
},
|
|
2722
2825
|
children: c("gantt.resource.header")
|
|
2723
|
-
}), p.map((e) => /* @__PURE__ */
|
|
2826
|
+
}), p.map((e) => /* @__PURE__ */ D("div", {
|
|
2724
2827
|
"data-testid": `resource-row-${e.key}`,
|
|
2725
2828
|
style: {
|
|
2726
|
-
height:
|
|
2829
|
+
height: ut,
|
|
2727
2830
|
display: "flex",
|
|
2728
2831
|
flexDirection: "column",
|
|
2729
2832
|
justifyContent: "center",
|
|
2730
2833
|
padding: "0 12px",
|
|
2731
2834
|
borderBottom: "1px solid hsl(var(--border) / 0.5)"
|
|
2732
2835
|
},
|
|
2733
|
-
children: [/* @__PURE__ */
|
|
2836
|
+
children: [/* @__PURE__ */ E("span", {
|
|
2734
2837
|
style: {
|
|
2735
2838
|
fontSize: 13,
|
|
2736
2839
|
fontWeight: 500,
|
|
@@ -2739,7 +2842,7 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2739
2842
|
textOverflow: "ellipsis"
|
|
2740
2843
|
},
|
|
2741
2844
|
children: e.label
|
|
2742
|
-
}), /* @__PURE__ */
|
|
2845
|
+
}), /* @__PURE__ */ D("span", {
|
|
2743
2846
|
"data-testid": `resource-peak-${e.key}`,
|
|
2744
2847
|
"data-overloaded": e.overloadedCount > 0 ? "true" : void 0,
|
|
2745
2848
|
style: {
|
|
@@ -2756,15 +2859,15 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2756
2859
|
]
|
|
2757
2860
|
})]
|
|
2758
2861
|
}, e.key))]
|
|
2759
|
-
}), /* @__PURE__ */
|
|
2862
|
+
}), /* @__PURE__ */ D("div", {
|
|
2760
2863
|
style: { flex: 1 },
|
|
2761
|
-
children: [/* @__PURE__ */
|
|
2864
|
+
children: [/* @__PURE__ */ E("div", {
|
|
2762
2865
|
style: {
|
|
2763
2866
|
display: "flex",
|
|
2764
2867
|
height: 28,
|
|
2765
2868
|
borderBottom: "1px solid hsl(var(--border))"
|
|
2766
2869
|
},
|
|
2767
|
-
children: f.map((e, t) => /* @__PURE__ */
|
|
2870
|
+
children: f.map((e, t) => /* @__PURE__ */ E("div", {
|
|
2768
2871
|
style: {
|
|
2769
2872
|
width: d,
|
|
2770
2873
|
flexShrink: 0,
|
|
@@ -2779,28 +2882,28 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2779
2882
|
children: e.label
|
|
2780
2883
|
}, t))
|
|
2781
2884
|
}), p.map((e) => {
|
|
2782
|
-
let t =
|
|
2783
|
-
return /* @__PURE__ */
|
|
2885
|
+
let t = R * (1 - Math.min(e.capacity / m, 1));
|
|
2886
|
+
return /* @__PURE__ */ D("div", {
|
|
2784
2887
|
style: {
|
|
2785
2888
|
position: "relative",
|
|
2786
2889
|
display: "flex",
|
|
2787
|
-
height:
|
|
2890
|
+
height: ut,
|
|
2788
2891
|
borderBottom: "1px solid hsl(var(--border) / 0.5)"
|
|
2789
2892
|
},
|
|
2790
|
-
children: [/* @__PURE__ */
|
|
2893
|
+
children: [/* @__PURE__ */ E("div", {
|
|
2791
2894
|
"aria-hidden": "true",
|
|
2792
2895
|
style: {
|
|
2793
2896
|
position: "absolute",
|
|
2794
2897
|
left: 0,
|
|
2795
2898
|
right: 0,
|
|
2796
|
-
top: (
|
|
2899
|
+
top: (ut - R) / 2 + t,
|
|
2797
2900
|
borderTop: "1px dashed hsl(var(--muted-foreground) / 0.6)",
|
|
2798
2901
|
pointerEvents: "none",
|
|
2799
2902
|
zIndex: 1
|
|
2800
2903
|
}
|
|
2801
2904
|
}), e.cells.map((t, n) => {
|
|
2802
|
-
let r = Math.max(t.load > 0 ? 2 : 0,
|
|
2803
|
-
return /* @__PURE__ */
|
|
2905
|
+
let r = Math.max(t.load > 0 ? 2 : 0, R * Math.min(t.load / m, 1));
|
|
2906
|
+
return /* @__PURE__ */ E("div", {
|
|
2804
2907
|
"data-testid": `resource-cell-${e.key}-${n}`,
|
|
2805
2908
|
"data-load": t.load,
|
|
2806
2909
|
"data-overloaded": t.overloaded ? "true" : void 0,
|
|
@@ -2813,9 +2916,9 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2813
2916
|
display: "flex",
|
|
2814
2917
|
alignItems: "flex-end",
|
|
2815
2918
|
justifyContent: "center",
|
|
2816
|
-
paddingBottom: (
|
|
2919
|
+
paddingBottom: (ut - R) / 2
|
|
2817
2920
|
},
|
|
2818
|
-
children: t.load > 0 && /* @__PURE__ */
|
|
2921
|
+
children: t.load > 0 && /* @__PURE__ */ E("div", { style: {
|
|
2819
2922
|
width: d - 6,
|
|
2820
2923
|
height: r,
|
|
2821
2924
|
borderRadius: 2,
|
|
@@ -2828,10 +2931,10 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2828
2931
|
})]
|
|
2829
2932
|
})]
|
|
2830
2933
|
})
|
|
2831
|
-
}) : /* @__PURE__ */
|
|
2934
|
+
}) : /* @__PURE__ */ E("div", {
|
|
2832
2935
|
className: s,
|
|
2833
2936
|
"data-testid": "resource-workload",
|
|
2834
|
-
children: /* @__PURE__ */
|
|
2937
|
+
children: /* @__PURE__ */ E("div", {
|
|
2835
2938
|
className: "flex items-center justify-center h-40 text-sm text-muted-foreground",
|
|
2836
2939
|
children: c("gantt.resource.empty")
|
|
2837
2940
|
})
|
|
@@ -2839,7 +2942,7 @@ function ct({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
|
|
|
2839
2942
|
}
|
|
2840
2943
|
//#endregion
|
|
2841
2944
|
//#region src/QuickFilterBar.tsx
|
|
2842
|
-
var
|
|
2945
|
+
var z = {
|
|
2843
2946
|
display: "flex",
|
|
2844
2947
|
flexWrap: "wrap",
|
|
2845
2948
|
alignItems: "center",
|
|
@@ -2848,7 +2951,7 @@ var lt = {
|
|
|
2848
2951
|
borderBottom: "1px solid hsl(var(--border))",
|
|
2849
2952
|
background: "hsl(var(--background))",
|
|
2850
2953
|
fontSize: 13
|
|
2851
|
-
},
|
|
2954
|
+
}, mt = {
|
|
2852
2955
|
display: "inline-flex",
|
|
2853
2956
|
alignItems: "center",
|
|
2854
2957
|
gap: 6,
|
|
@@ -2861,7 +2964,7 @@ var lt = {
|
|
|
2861
2964
|
cursor: "pointer",
|
|
2862
2965
|
whiteSpace: "nowrap",
|
|
2863
2966
|
lineHeight: "28px"
|
|
2864
|
-
},
|
|
2967
|
+
}, B = {
|
|
2865
2968
|
position: "absolute",
|
|
2866
2969
|
top: "calc(100% + 4px)",
|
|
2867
2970
|
left: 0,
|
|
@@ -2875,7 +2978,7 @@ var lt = {
|
|
|
2875
2978
|
background: "hsl(var(--popover, var(--background)))",
|
|
2876
2979
|
color: "hsl(var(--popover-foreground, var(--foreground)))",
|
|
2877
2980
|
boxShadow: "0 8px 24px rgba(0,0,0,0.18)"
|
|
2878
|
-
},
|
|
2981
|
+
}, ht = {
|
|
2879
2982
|
display: "flex",
|
|
2880
2983
|
alignItems: "center",
|
|
2881
2984
|
gap: 8,
|
|
@@ -2884,8 +2987,8 @@ var lt = {
|
|
|
2884
2987
|
cursor: "pointer",
|
|
2885
2988
|
userSelect: "none"
|
|
2886
2989
|
};
|
|
2887
|
-
function
|
|
2888
|
-
return /* @__PURE__ */
|
|
2990
|
+
function gt({ checked: e }) {
|
|
2991
|
+
return /* @__PURE__ */ E("span", {
|
|
2889
2992
|
"aria-hidden": !0,
|
|
2890
2993
|
style: {
|
|
2891
2994
|
display: "inline-flex",
|
|
@@ -2904,7 +3007,7 @@ function R({ checked: e }) {
|
|
|
2904
3007
|
children: e ? "✓" : ""
|
|
2905
3008
|
});
|
|
2906
3009
|
}
|
|
2907
|
-
function
|
|
3010
|
+
function _t({ filter: e, selected: t, onChange: r, labels: o }) {
|
|
2908
3011
|
let [s, c] = a(!1), l = i(null);
|
|
2909
3012
|
n(() => {
|
|
2910
3013
|
if (!s) return;
|
|
@@ -2923,14 +3026,14 @@ function pt({ filter: e, selected: t, onChange: r, labels: o }) {
|
|
|
2923
3026
|
}, m = () => {
|
|
2924
3027
|
r(d > 0 ? [] : e.options.map((e) => e.value));
|
|
2925
3028
|
}, h = d === 0 ? e.label : d === 1 ? `${e.label}: ${e.options.find((e) => e.value === t[0])?.label ?? t[0]}` : `${e.label} · ${d}`;
|
|
2926
|
-
return /* @__PURE__ */
|
|
3029
|
+
return /* @__PURE__ */ D("div", {
|
|
2927
3030
|
ref: l,
|
|
2928
3031
|
style: { position: "relative" },
|
|
2929
3032
|
"data-testid": `quick-filter-${e.field}`,
|
|
2930
|
-
children: [/* @__PURE__ */
|
|
3033
|
+
children: [/* @__PURE__ */ D("button", {
|
|
2931
3034
|
type: "button",
|
|
2932
3035
|
style: {
|
|
2933
|
-
...
|
|
3036
|
+
...mt,
|
|
2934
3037
|
borderColor: d > 0 ? "hsl(var(--primary))" : "hsl(var(--border))",
|
|
2935
3038
|
color: d > 0 ? "hsl(var(--primary))" : "hsl(var(--foreground))"
|
|
2936
3039
|
},
|
|
@@ -2938,7 +3041,7 @@ function pt({ filter: e, selected: t, onChange: r, labels: o }) {
|
|
|
2938
3041
|
"aria-expanded": s,
|
|
2939
3042
|
"data-testid": `quick-filter-trigger-${e.field}`,
|
|
2940
3043
|
onClick: () => c((e) => !e),
|
|
2941
|
-
children: [/* @__PURE__ */
|
|
3044
|
+
children: [/* @__PURE__ */ E("span", { children: h }), /* @__PURE__ */ E("span", {
|
|
2942
3045
|
"aria-hidden": !0,
|
|
2943
3046
|
style: {
|
|
2944
3047
|
fontSize: 10,
|
|
@@ -2946,61 +3049,61 @@ function pt({ filter: e, selected: t, onChange: r, labels: o }) {
|
|
|
2946
3049
|
},
|
|
2947
3050
|
children: "▾"
|
|
2948
3051
|
})]
|
|
2949
|
-
}), s && /* @__PURE__ */
|
|
3052
|
+
}), s && /* @__PURE__ */ E("div", {
|
|
2950
3053
|
role: "listbox",
|
|
2951
|
-
style:
|
|
3054
|
+
style: B,
|
|
2952
3055
|
"data-testid": `quick-filter-panel-${e.field}`,
|
|
2953
|
-
children: e.options.length === 0 ? /* @__PURE__ */
|
|
3056
|
+
children: e.options.length === 0 ? /* @__PURE__ */ E("div", {
|
|
2954
3057
|
style: {
|
|
2955
|
-
...
|
|
3058
|
+
...ht,
|
|
2956
3059
|
cursor: "default",
|
|
2957
3060
|
opacity: .6
|
|
2958
3061
|
},
|
|
2959
3062
|
children: o.empty
|
|
2960
|
-
}) : /* @__PURE__ */
|
|
2961
|
-
/* @__PURE__ */
|
|
3063
|
+
}) : /* @__PURE__ */ D(Oe, { children: [
|
|
3064
|
+
/* @__PURE__ */ D("div", {
|
|
2962
3065
|
role: "option",
|
|
2963
3066
|
"aria-selected": f,
|
|
2964
3067
|
style: {
|
|
2965
|
-
...
|
|
3068
|
+
...ht,
|
|
2966
3069
|
fontWeight: 600
|
|
2967
3070
|
},
|
|
2968
3071
|
"data-testid": `quick-filter-all-${e.field}`,
|
|
2969
3072
|
onClick: () => m(),
|
|
2970
|
-
children: [/* @__PURE__ */
|
|
3073
|
+
children: [/* @__PURE__ */ E(gt, { checked: f }), /* @__PURE__ */ E("span", { children: o.all })]
|
|
2971
3074
|
}),
|
|
2972
|
-
/* @__PURE__ */
|
|
3075
|
+
/* @__PURE__ */ E("div", { style: {
|
|
2973
3076
|
height: 1,
|
|
2974
3077
|
background: "hsl(var(--border))",
|
|
2975
3078
|
margin: "2px 0"
|
|
2976
3079
|
} }),
|
|
2977
3080
|
e.options.map((t) => {
|
|
2978
3081
|
let n = u.has(t.value);
|
|
2979
|
-
return /* @__PURE__ */
|
|
3082
|
+
return /* @__PURE__ */ D("div", {
|
|
2980
3083
|
role: "option",
|
|
2981
3084
|
"aria-selected": n,
|
|
2982
3085
|
style: {
|
|
2983
|
-
...
|
|
3086
|
+
...ht,
|
|
2984
3087
|
background: n ? "hsl(var(--accent, var(--muted)))" : "transparent"
|
|
2985
3088
|
},
|
|
2986
3089
|
"data-testid": `quick-filter-option-${e.field}-${t.value}`,
|
|
2987
3090
|
onClick: () => p(t.value),
|
|
2988
|
-
children: [/* @__PURE__ */
|
|
3091
|
+
children: [/* @__PURE__ */ E(gt, { checked: n }), /* @__PURE__ */ E("span", { children: t.label })]
|
|
2989
3092
|
}, t.value);
|
|
2990
3093
|
})
|
|
2991
3094
|
] })
|
|
2992
3095
|
})]
|
|
2993
3096
|
});
|
|
2994
3097
|
}
|
|
2995
|
-
var
|
|
3098
|
+
var vt = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, totalCount: a, labels: o, className: s }) => {
|
|
2996
3099
|
if (!e.length) return null;
|
|
2997
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);
|
|
2998
|
-
return /* @__PURE__ */
|
|
2999
|
-
style:
|
|
3101
|
+
return /* @__PURE__ */ D("div", {
|
|
3102
|
+
style: z,
|
|
3000
3103
|
className: s,
|
|
3001
3104
|
"data-testid": "quick-filter-bar",
|
|
3002
3105
|
children: [
|
|
3003
|
-
e.map((e) => /* @__PURE__ */
|
|
3106
|
+
e.map((e) => /* @__PURE__ */ E(_t, {
|
|
3004
3107
|
filter: e,
|
|
3005
3108
|
selected: t[e.field] ?? [],
|
|
3006
3109
|
onChange: (t) => n(e.field, t),
|
|
@@ -3009,10 +3112,10 @@ var z = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, totalC
|
|
|
3009
3112
|
empty: l
|
|
3010
3113
|
}
|
|
3011
3114
|
}, e.field)),
|
|
3012
|
-
d && /* @__PURE__ */
|
|
3115
|
+
d && /* @__PURE__ */ E("button", {
|
|
3013
3116
|
type: "button",
|
|
3014
3117
|
style: {
|
|
3015
|
-
...
|
|
3118
|
+
...mt,
|
|
3016
3119
|
height: 28,
|
|
3017
3120
|
color: "hsl(var(--muted-foreground))"
|
|
3018
3121
|
},
|
|
@@ -3020,7 +3123,7 @@ var z = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, totalC
|
|
|
3020
3123
|
onClick: r,
|
|
3021
3124
|
children: u
|
|
3022
3125
|
}),
|
|
3023
|
-
o?.resultSummary && i != null && a != null && /* @__PURE__ */
|
|
3126
|
+
o?.resultSummary && i != null && a != null && /* @__PURE__ */ E("span", {
|
|
3024
3127
|
"data-testid": "quick-filter-summary",
|
|
3025
3128
|
style: {
|
|
3026
3129
|
marginLeft: "auto",
|
|
@@ -3033,7 +3136,7 @@ var z = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, totalC
|
|
|
3033
3136
|
};
|
|
3034
3137
|
//#endregion
|
|
3035
3138
|
//#region src/ObjectGantt.tsx
|
|
3036
|
-
function
|
|
3139
|
+
function yt(e) {
|
|
3037
3140
|
if (e == null) return;
|
|
3038
3141
|
let t = String(e).toLowerCase().trim();
|
|
3039
3142
|
if (t === "milestone") return "milestone";
|
|
@@ -3041,7 +3144,7 @@ function mt(e) {
|
|
|
3041
3144
|
if (t === "summary" || t === "project" || t === "phase") return "summary";
|
|
3042
3145
|
if (t === "task") return "task";
|
|
3043
3146
|
}
|
|
3044
|
-
var
|
|
3147
|
+
var bt = {
|
|
3045
3148
|
fs: "fs",
|
|
3046
3149
|
ss: "ss",
|
|
3047
3150
|
ff: "ff",
|
|
@@ -3054,7 +3157,7 @@ var ht = {
|
|
|
3054
3157
|
end_to_end: "ff",
|
|
3055
3158
|
start_to_end: "sf"
|
|
3056
3159
|
};
|
|
3057
|
-
function
|
|
3160
|
+
function xt(e) {
|
|
3058
3161
|
if (e == null || e === "") return [];
|
|
3059
3162
|
if (typeof e == "string") return e.split(",").map((e) => e.trim()).filter(Boolean);
|
|
3060
3163
|
if (typeof e == "number") return [e];
|
|
@@ -3063,7 +3166,7 @@ function gt(e) {
|
|
|
3063
3166
|
for (let n of e) if (!(n == null || n === "")) if (typeof n == "object") {
|
|
3064
3167
|
let e = n.id ?? n._id ?? n.task ?? n.target;
|
|
3065
3168
|
if (e == null || e === "") continue;
|
|
3066
|
-
let r =
|
|
3169
|
+
let r = bt[String(n.type ?? "").toLowerCase().replace(/-/g, "_")];
|
|
3067
3170
|
t.push(r ? {
|
|
3068
3171
|
id: e,
|
|
3069
3172
|
type: r
|
|
@@ -3071,7 +3174,7 @@ function gt(e) {
|
|
|
3071
3174
|
} else t.push(n);
|
|
3072
3175
|
return t;
|
|
3073
3176
|
}
|
|
3074
|
-
function
|
|
3177
|
+
function St(e) {
|
|
3075
3178
|
return e.data ? e.data : e.staticData ? {
|
|
3076
3179
|
provider: "value",
|
|
3077
3180
|
items: e.staticData
|
|
@@ -3080,7 +3183,7 @@ function _t(e) {
|
|
|
3080
3183
|
object: e.objectName
|
|
3081
3184
|
} : null;
|
|
3082
3185
|
}
|
|
3083
|
-
function
|
|
3186
|
+
function V(e) {
|
|
3084
3187
|
if (e) {
|
|
3085
3188
|
if (typeof e == "string") {
|
|
3086
3189
|
let t = e.split(" "), n = t[0], r = t[1]?.toLowerCase() === "desc" ? "desc" : "asc";
|
|
@@ -3089,7 +3192,7 @@ function vt(e) {
|
|
|
3089
3192
|
if (Array.isArray(e)) return e.reduce((e, t) => (t.field && t.order && (e[t.field] = t.order), e), {});
|
|
3090
3193
|
}
|
|
3091
3194
|
}
|
|
3092
|
-
function
|
|
3195
|
+
function Ct(e) {
|
|
3093
3196
|
let t = null;
|
|
3094
3197
|
if (e.startDateField && e.endDateField) return t = {
|
|
3095
3198
|
startDateField: e.startDateField,
|
|
@@ -3111,7 +3214,8 @@ function yt(e) {
|
|
|
3111
3214
|
effortField: e.effortField,
|
|
3112
3215
|
capacity: e.capacity,
|
|
3113
3216
|
quickFilters: e.quickFilters,
|
|
3114
|
-
autoZoomToFilter: e.autoZoomToFilter
|
|
3217
|
+
autoZoomToFilter: e.autoZoomToFilter,
|
|
3218
|
+
timeSegments: e.timeSegments
|
|
3115
3219
|
}, t;
|
|
3116
3220
|
if (e.gantt && (t = e.gantt), t) {
|
|
3117
3221
|
let e = f.safeParse(t);
|
|
@@ -3119,8 +3223,8 @@ function yt(e) {
|
|
|
3119
3223
|
}
|
|
3120
3224
|
return null;
|
|
3121
3225
|
}
|
|
3122
|
-
var
|
|
3123
|
-
let [y, b] = a([]), [oe, pe] = a(!0), [me, he] = a(null), [C, ge] = a(null), { currency: _e } = m(), ve =
|
|
3226
|
+
var wt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick: d, ...f }) => {
|
|
3227
|
+
let [y, b] = a([]), [oe, pe] = a(!0), [me, he] = a(null), [C, ge] = a(null), { currency: _e } = m(), ve = St(e), w = r(() => ve, [JSON.stringify(ve)]), T = Ct(e), ye = w?.provider === "value";
|
|
3124
3228
|
n(() => {
|
|
3125
3229
|
(async () => {
|
|
3126
3230
|
try {
|
|
@@ -3137,7 +3241,7 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3137
3241
|
let t = w.object, n = s(C?.fields);
|
|
3138
3242
|
b(c(await i.find(t, {
|
|
3139
3243
|
$filter: e.filter,
|
|
3140
|
-
$orderby:
|
|
3244
|
+
$orderby: V(e.sort),
|
|
3141
3245
|
...n.length > 0 ? { $expand: n } : {}
|
|
3142
3246
|
})));
|
|
3143
3247
|
} else w?.provider === "api" && (console.warn("API provider not yet implemented for ObjectGantt"), b([]));
|
|
@@ -3170,7 +3274,7 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3170
3274
|
ye,
|
|
3171
3275
|
w
|
|
3172
3276
|
]);
|
|
3173
|
-
let
|
|
3277
|
+
let be = r(() => {
|
|
3174
3278
|
if (!T || !y.length) return [];
|
|
3175
3279
|
let { startDateField: e, endDateField: t, titleField: n, progressField: r, dependenciesField: i, colorField: a, parentField: o, typeField: s, lockField: c, tooltipFields: l, baselineStartField: u, baselineEndField: d } = T, f = C?.fields ?? {}, m = (e, t) => {
|
|
3176
3280
|
if (!t) return;
|
|
@@ -3199,7 +3303,7 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3199
3303
|
if (t) return t;
|
|
3200
3304
|
let n = f[e] ?? f[e.split(".")[0]];
|
|
3201
3305
|
return n?.label ? n.label : fe(e);
|
|
3202
|
-
},
|
|
3306
|
+
}, ee = (e, t) => {
|
|
3203
3307
|
if (e == null || e === "") return "—";
|
|
3204
3308
|
let n = f[t] ?? f[t.split(".")[0]], r = n?.type, i = n?.options;
|
|
3205
3309
|
if (Array.isArray(i) && i.length) {
|
|
@@ -3208,13 +3312,13 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3208
3312
|
}
|
|
3209
3313
|
switch (r) {
|
|
3210
3314
|
case "date": return ce(e);
|
|
3211
|
-
case "datetime": return
|
|
3315
|
+
case "datetime": return le(e);
|
|
3212
3316
|
case "number":
|
|
3213
3317
|
case "integer":
|
|
3214
3318
|
case "float":
|
|
3215
|
-
case "decimal": return
|
|
3319
|
+
case "decimal": return x(Number(e));
|
|
3216
3320
|
case "currency": return se(Number(e), p(n, _e));
|
|
3217
|
-
case "percent": return
|
|
3321
|
+
case "percent": return ue(Number(e));
|
|
3218
3322
|
case "boolean":
|
|
3219
3323
|
case "checkbox": return e ? "Yes" : "No";
|
|
3220
3324
|
default:
|
|
@@ -3235,7 +3339,7 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3235
3339
|
}
|
|
3236
3340
|
return String(e);
|
|
3237
3341
|
}
|
|
3238
|
-
},
|
|
3342
|
+
}, _ = (e) => {
|
|
3239
3343
|
if (!l || !l.length) return;
|
|
3240
3344
|
let t = [];
|
|
3241
3345
|
for (let n of l) {
|
|
@@ -3244,17 +3348,17 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3244
3348
|
let i = typeof n == "object" ? n.label : void 0;
|
|
3245
3349
|
t.push({
|
|
3246
3350
|
label: g(r, i),
|
|
3247
|
-
value:
|
|
3351
|
+
value: ee(m(e, r), r)
|
|
3248
3352
|
});
|
|
3249
3353
|
}
|
|
3250
3354
|
return t.length ? t : void 0;
|
|
3251
3355
|
};
|
|
3252
3356
|
return y.map((n, l) => {
|
|
3253
|
-
let f = n[e], p = n[t], m = u ? n[u] : void 0, g = d ? n[d] : void 0,
|
|
3357
|
+
let f = n[e], p = n[t], m = u ? n[u] : void 0, g = d ? n[d] : void 0, ee = m ? new Date(m) : void 0, v = g ? new Date(g) : void 0, te = h(n), ne = r ? n[r] : 0, re = i ? n[i] : [], ie = a ? n[a] : void 0;
|
|
3254
3358
|
if (!ie) {
|
|
3255
3359
|
let e = n.status ?? n.state ?? n.priority ?? n.severity;
|
|
3256
3360
|
if (e != null && e !== "") {
|
|
3257
|
-
let t =
|
|
3361
|
+
let t = S(void 0, e);
|
|
3258
3362
|
t && (ie = de(t));
|
|
3259
3363
|
}
|
|
3260
3364
|
}
|
|
@@ -3264,14 +3368,14 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3264
3368
|
start: f ? new Date(f) : /* @__PURE__ */ new Date(),
|
|
3265
3369
|
end: p ? new Date(p) : /* @__PURE__ */ new Date(),
|
|
3266
3370
|
progress: Math.min(100, Math.max(0, ne || 0)),
|
|
3267
|
-
dependencies:
|
|
3371
|
+
dependencies: xt(re),
|
|
3268
3372
|
parent: o ? n[o] ?? null : void 0,
|
|
3269
|
-
type: s ?
|
|
3373
|
+
type: s ? yt(n[s]) : void 0,
|
|
3270
3374
|
locked: c ? !!n[c] : void 0,
|
|
3271
3375
|
color: ie,
|
|
3272
|
-
baselineStart:
|
|
3273
|
-
baselineEnd:
|
|
3274
|
-
fields:
|
|
3376
|
+
baselineStart: ee && !isNaN(ee.getTime()) ? ee : void 0,
|
|
3377
|
+
baselineEnd: v && !isNaN(v.getTime()) ? v : void 0,
|
|
3378
|
+
fields: _(n),
|
|
3275
3379
|
data: n
|
|
3276
3380
|
};
|
|
3277
3381
|
}).filter((e) => !isNaN(e.start.getTime()) && !isNaN(e.end.getTime()));
|
|
@@ -3279,7 +3383,7 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3279
3383
|
y,
|
|
3280
3384
|
T,
|
|
3281
3385
|
C
|
|
3282
|
-
]),
|
|
3386
|
+
]), xe = r(() => {
|
|
3283
3387
|
let e = T?.groupByField;
|
|
3284
3388
|
if (!e) return;
|
|
3285
3389
|
let t = C?.fields ?? {}, n = (e, t) => {
|
|
@@ -3309,7 +3413,7 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3309
3413
|
label: r(i)
|
|
3310
3414
|
};
|
|
3311
3415
|
};
|
|
3312
|
-
}, [T?.groupByField, C]),
|
|
3416
|
+
}, [T?.groupByField, C]), Se = r(() => {
|
|
3313
3417
|
let e = T?.assigneeField;
|
|
3314
3418
|
if (!e) return;
|
|
3315
3419
|
let t = C?.fields ?? {}, n = (e, t) => {
|
|
@@ -3339,19 +3443,19 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3339
3443
|
label: r(i)
|
|
3340
3444
|
};
|
|
3341
3445
|
};
|
|
3342
|
-
}, [T?.assigneeField, C]),
|
|
3446
|
+
}, [T?.assigneeField, C]), Ce = r(() => {
|
|
3343
3447
|
let e = T?.effortField;
|
|
3344
3448
|
if (e) return (t) => {
|
|
3345
3449
|
let n = t.data?.[e], r = Number(n);
|
|
3346
3450
|
return Number.isFinite(r) && r > 0 ? r : 1;
|
|
3347
3451
|
};
|
|
3348
|
-
}, [T?.effortField]),
|
|
3452
|
+
}, [T?.effortField]), we = r(() => {
|
|
3349
3453
|
let t = e.skipWeekends, n = e.holidays;
|
|
3350
3454
|
if (!(!t && (!n || n.length === 0))) return {
|
|
3351
3455
|
skipWeekends: !!t,
|
|
3352
3456
|
holidays: n && n.length ? new Set(n) : void 0
|
|
3353
3457
|
};
|
|
3354
|
-
}, [e]),
|
|
3458
|
+
}, [e]), Te = r(() => Re(T?.timeSegments), [T?.timeSegments]), Ee = t((e, t) => {
|
|
3355
3459
|
if (!e || !t) return null;
|
|
3356
3460
|
let n = e;
|
|
3357
3461
|
for (let e of t.split(".")) {
|
|
@@ -3364,13 +3468,13 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3364
3468
|
return String(e.id ?? e._id ?? e.value ?? e.name ?? "");
|
|
3365
3469
|
}
|
|
3366
3470
|
return String(n);
|
|
3367
|
-
}, []),
|
|
3471
|
+
}, []), De = T?.quickFilters, [O, ke] = a({});
|
|
3368
3472
|
n(() => {
|
|
3369
|
-
if (!
|
|
3473
|
+
if (!De?.length || !i || typeof i.find != "function") return;
|
|
3370
3474
|
let e = C?.fields ?? {}, t = !1;
|
|
3371
3475
|
return (async () => {
|
|
3372
3476
|
let n = {};
|
|
3373
|
-
for (let t of
|
|
3477
|
+
for (let t of De) {
|
|
3374
3478
|
if (t.options) continue;
|
|
3375
3479
|
let r = e[t.field] ?? e[t.field.split(".")[0]], a = r?.type;
|
|
3376
3480
|
if (a !== "lookup" && a !== "master_detail") continue;
|
|
@@ -3385,7 +3489,7 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3385
3489
|
console.warn(`[ObjectGantt] Failed to load quick-filter options for "${t.field}":`, e);
|
|
3386
3490
|
}
|
|
3387
3491
|
}
|
|
3388
|
-
t ||
|
|
3492
|
+
t || ke((e) => ({
|
|
3389
3493
|
...e,
|
|
3390
3494
|
...n
|
|
3391
3495
|
}));
|
|
@@ -3393,14 +3497,14 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3393
3497
|
t = !0;
|
|
3394
3498
|
};
|
|
3395
3499
|
}, [
|
|
3396
|
-
JSON.stringify(
|
|
3500
|
+
JSON.stringify(De),
|
|
3397
3501
|
i,
|
|
3398
3502
|
C
|
|
3399
3503
|
]);
|
|
3400
3504
|
let k = r(() => {
|
|
3401
|
-
if (!
|
|
3505
|
+
if (!De?.length) return [];
|
|
3402
3506
|
let e = C?.fields ?? {};
|
|
3403
|
-
return
|
|
3507
|
+
return De.map((t) => {
|
|
3404
3508
|
let n = e[t.field] ?? e[t.field.split(".")[0]], r = t.label ?? n?.label ?? fe(t.field), i = [];
|
|
3405
3509
|
if (t.options?.length) i = t.options.map((e) => typeof e == "object" ? {
|
|
3406
3510
|
value: String(e.value),
|
|
@@ -3413,11 +3517,11 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3413
3517
|
value: String(e.value ?? e),
|
|
3414
3518
|
label: String(e.label ?? e.value ?? e)
|
|
3415
3519
|
}));
|
|
3416
|
-
else if (
|
|
3520
|
+
else if (O[t.field]?.length) i = O[t.field];
|
|
3417
3521
|
else {
|
|
3418
3522
|
let e = /* @__PURE__ */ new Map();
|
|
3419
3523
|
for (let n of y) {
|
|
3420
|
-
let r =
|
|
3524
|
+
let r = Ee(n, t.field);
|
|
3421
3525
|
if (r != null && !e.has(r)) {
|
|
3422
3526
|
let i = n;
|
|
3423
3527
|
for (let e of t.field.split(".")) i = i?.[e];
|
|
@@ -3437,42 +3541,42 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3437
3541
|
};
|
|
3438
3542
|
});
|
|
3439
3543
|
}, [
|
|
3440
|
-
|
|
3544
|
+
De,
|
|
3441
3545
|
C,
|
|
3442
|
-
|
|
3546
|
+
O,
|
|
3443
3547
|
y,
|
|
3444
|
-
|
|
3548
|
+
Ee
|
|
3445
3549
|
]), [A, j] = a({}), M = t((e, t) => {
|
|
3446
3550
|
j((n) => ({
|
|
3447
3551
|
...n,
|
|
3448
3552
|
[e]: t
|
|
3449
3553
|
}));
|
|
3450
|
-
}, []),
|
|
3554
|
+
}, []), Ae = t(() => j({}), []), N = r(() => {
|
|
3451
3555
|
let e = Object.entries(A).filter(([, e]) => e.length > 0);
|
|
3452
|
-
return e.length ?
|
|
3453
|
-
let r =
|
|
3556
|
+
return e.length ? be.filter((t) => e.every(([e, n]) => {
|
|
3557
|
+
let r = Ee(t.data, e);
|
|
3454
3558
|
return r != null && n.includes(r);
|
|
3455
|
-
})) :
|
|
3559
|
+
})) : be;
|
|
3456
3560
|
}, [
|
|
3457
|
-
|
|
3561
|
+
be,
|
|
3458
3562
|
A,
|
|
3459
|
-
|
|
3460
|
-
]),
|
|
3461
|
-
if (T?.autoZoomToFilter !== !1 || !
|
|
3462
|
-
let e =
|
|
3463
|
-
for (let n of
|
|
3563
|
+
Ee
|
|
3564
|
+
]), P = r(() => {
|
|
3565
|
+
if (T?.autoZoomToFilter !== !1 || !be.length) return null;
|
|
3566
|
+
let e = be[0].start.getTime(), t = be[0].end.getTime();
|
|
3567
|
+
for (let n of be) e = Math.min(e, n.start.getTime()), t = Math.max(t, n.end.getTime());
|
|
3464
3568
|
return {
|
|
3465
3569
|
start: new Date(e),
|
|
3466
3570
|
end: new Date(t)
|
|
3467
3571
|
};
|
|
3468
|
-
}, [
|
|
3572
|
+
}, [be, T?.autoZoomToFilter]), je = e.navigation ?? {
|
|
3469
3573
|
mode: "drawer",
|
|
3470
3574
|
width: "min(960px, 60vw)"
|
|
3471
|
-
},
|
|
3472
|
-
navigation:
|
|
3575
|
+
}, Me = je.mode === "drawer" || je.mode === "modal" || je.mode === "split" || je.mode === "popover", Ne = l({
|
|
3576
|
+
navigation: je,
|
|
3473
3577
|
objectName: e.objectName,
|
|
3474
|
-
onRowClick:
|
|
3475
|
-
}),
|
|
3578
|
+
onRowClick: Me ? void 0 : d
|
|
3579
|
+
}), Pe = t(async (t, n) => {
|
|
3476
3580
|
if (!T) return;
|
|
3477
3581
|
let r = w?.provider === "object" ? w.object : e.objectName;
|
|
3478
3582
|
if (!r || !i || typeof i.update != "function") return;
|
|
@@ -3496,18 +3600,18 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3496
3600
|
i,
|
|
3497
3601
|
e.objectName,
|
|
3498
3602
|
y
|
|
3499
|
-
]),
|
|
3603
|
+
]), Fe = (e, t) => {
|
|
3500
3604
|
let n = t.some((e) => typeof e == "object" && e.type && e.type !== "fs");
|
|
3501
3605
|
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" ? {
|
|
3502
3606
|
id: e.id,
|
|
3503
3607
|
type: e.type
|
|
3504
3608
|
} : e.id : e) : t.map((e) => typeof e == "object" ? e.id : e);
|
|
3505
|
-
},
|
|
3609
|
+
}, Ie = t(async (t, n, r) => {
|
|
3506
3610
|
let a = T?.dependenciesField;
|
|
3507
3611
|
if (!a) return;
|
|
3508
3612
|
let o = w?.provider === "object" ? w.object : e.objectName;
|
|
3509
3613
|
if (!o || !i || typeof i.update != "function") return;
|
|
3510
|
-
let s =
|
|
3614
|
+
let s = Fe(n, r), c = y;
|
|
3511
3615
|
b((e) => e.map((e) => String(e.id ?? e._id) === String(t) ? {
|
|
3512
3616
|
...e,
|
|
3513
3617
|
[a]: s
|
|
@@ -3523,56 +3627,56 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3523
3627
|
i,
|
|
3524
3628
|
e.objectName,
|
|
3525
3629
|
y
|
|
3526
|
-
]),
|
|
3630
|
+
]), F = t(async (e, t, n = "fs") => {
|
|
3527
3631
|
let r = e.data?.id ?? e.data?._id ?? e.id, i = t.data?.id ?? t.data?._id ?? t.id;
|
|
3528
3632
|
if (r == null || i == null) return;
|
|
3529
3633
|
let a = T?.dependenciesField;
|
|
3530
3634
|
if (!a) return;
|
|
3531
|
-
let o = y.find((e) => String(e.id ?? e._id) === String(i))?.[a], s =
|
|
3635
|
+
let o = y.find((e) => String(e.id ?? e._id) === String(i))?.[a], s = xt(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";
|
|
3532
3636
|
if (l && u === n) return;
|
|
3533
3637
|
let d = n === "fs" ? r : {
|
|
3534
3638
|
id: r,
|
|
3535
3639
|
type: n
|
|
3536
3640
|
};
|
|
3537
|
-
await
|
|
3641
|
+
await Ie(i, o, l ? s.map((e) => c(e) === String(r) ? d : e) : [...s, d]);
|
|
3538
3642
|
}, [
|
|
3539
3643
|
T,
|
|
3540
3644
|
y,
|
|
3541
|
-
|
|
3542
|
-
]),
|
|
3645
|
+
Ie
|
|
3646
|
+
]), Le = t(async (e, t) => {
|
|
3543
3647
|
let n = e.data?.id ?? e.data?._id ?? e.id, r = t.data?.id ?? t.data?._id ?? t.id;
|
|
3544
3648
|
if (n == null || r == null) return;
|
|
3545
3649
|
let i = T?.dependenciesField;
|
|
3546
3650
|
if (!i) return;
|
|
3547
|
-
let a = y.find((e) => String(e.id ?? e._id) === String(r))?.[i], o =
|
|
3548
|
-
c.length !== o.length && await
|
|
3651
|
+
let a = y.find((e) => String(e.id ?? e._id) === String(r))?.[i], o = xt(a), s = (e) => String(typeof e == "object" ? e.id : e), c = o.filter((e) => s(e) !== String(n));
|
|
3652
|
+
c.length !== o.length && await Ie(r, a, c);
|
|
3549
3653
|
}, [
|
|
3550
3654
|
T,
|
|
3551
3655
|
y,
|
|
3552
|
-
|
|
3553
|
-
]), [I,
|
|
3554
|
-
|
|
3555
|
-
}, []),
|
|
3656
|
+
Ie
|
|
3657
|
+
]), [I, ze] = a(null), [Be, Ve] = a(!1), He = t((e) => {
|
|
3658
|
+
ze(e);
|
|
3659
|
+
}, []), Ue = t(async () => {
|
|
3556
3660
|
if (!I) return;
|
|
3557
3661
|
let t = w?.provider === "object" ? w.object : e.objectName;
|
|
3558
3662
|
if (!t || !i?.delete) {
|
|
3559
|
-
|
|
3663
|
+
ze(null);
|
|
3560
3664
|
return;
|
|
3561
3665
|
}
|
|
3562
3666
|
let n = I.data?.id ?? I.data?._id ?? I.id;
|
|
3563
3667
|
if (n == null) {
|
|
3564
|
-
|
|
3668
|
+
ze(null);
|
|
3565
3669
|
return;
|
|
3566
3670
|
}
|
|
3567
|
-
|
|
3671
|
+
Ve(!0);
|
|
3568
3672
|
let r = y;
|
|
3569
3673
|
b((e) => e.filter((e) => String(e.id ?? e._id) !== String(n)));
|
|
3570
3674
|
try {
|
|
3571
|
-
await i.delete(t, String(n)),
|
|
3675
|
+
await i.delete(t, String(n)), ze(null);
|
|
3572
3676
|
} catch (e) {
|
|
3573
|
-
console.error("[ObjectGantt] Failed to delete:", e), b(r),
|
|
3677
|
+
console.error("[ObjectGantt] Failed to delete:", e), b(r), ze(null);
|
|
3574
3678
|
} finally {
|
|
3575
|
-
|
|
3679
|
+
Ve(!1);
|
|
3576
3680
|
}
|
|
3577
3681
|
}, [
|
|
3578
3682
|
I,
|
|
@@ -3581,34 +3685,34 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3581
3685
|
e.objectName,
|
|
3582
3686
|
y
|
|
3583
3687
|
]);
|
|
3584
|
-
return oe ? /* @__PURE__ */
|
|
3688
|
+
return oe ? /* @__PURE__ */ E("div", {
|
|
3585
3689
|
className: o,
|
|
3586
|
-
children: /* @__PURE__ */
|
|
3690
|
+
children: /* @__PURE__ */ E("div", {
|
|
3587
3691
|
className: "flex items-center justify-center h-96",
|
|
3588
|
-
children: /* @__PURE__ */
|
|
3692
|
+
children: /* @__PURE__ */ E("div", {
|
|
3589
3693
|
className: "text-muted-foreground",
|
|
3590
3694
|
children: "Loading Gantt chart..."
|
|
3591
3695
|
})
|
|
3592
3696
|
})
|
|
3593
|
-
}) : me ? /* @__PURE__ */
|
|
3697
|
+
}) : me ? /* @__PURE__ */ E("div", {
|
|
3594
3698
|
className: o,
|
|
3595
|
-
children: /* @__PURE__ */
|
|
3699
|
+
children: /* @__PURE__ */ E("div", {
|
|
3596
3700
|
className: "flex items-center justify-center h-96",
|
|
3597
|
-
children: /* @__PURE__ */
|
|
3701
|
+
children: /* @__PURE__ */ D("div", {
|
|
3598
3702
|
className: "text-destructive",
|
|
3599
3703
|
children: ["Error: ", me.message]
|
|
3600
3704
|
})
|
|
3601
3705
|
})
|
|
3602
|
-
}) : T ? /* @__PURE__ */
|
|
3706
|
+
}) : T ? /* @__PURE__ */ D("div", {
|
|
3603
3707
|
className: o,
|
|
3604
3708
|
children: [
|
|
3605
|
-
k.length > 0 && /* @__PURE__ */
|
|
3709
|
+
k.length > 0 && /* @__PURE__ */ E(vt, {
|
|
3606
3710
|
filters: k,
|
|
3607
3711
|
value: A,
|
|
3608
3712
|
onChange: M,
|
|
3609
|
-
onClear:
|
|
3713
|
+
onClear: Ae,
|
|
3610
3714
|
resultCount: N.length,
|
|
3611
|
-
totalCount:
|
|
3715
|
+
totalCount: be.length,
|
|
3612
3716
|
labels: {
|
|
3613
3717
|
all: "全部",
|
|
3614
3718
|
clear: "清除筛选",
|
|
@@ -3616,53 +3720,54 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3616
3720
|
resultSummary: (e, t) => `显示 ${e} / ${t} 项任务`
|
|
3617
3721
|
}
|
|
3618
3722
|
}),
|
|
3619
|
-
/* @__PURE__ */
|
|
3723
|
+
/* @__PURE__ */ E("div", {
|
|
3620
3724
|
className: "h-[calc(100vh-200px)] min-h-[600px]",
|
|
3621
|
-
children: T?.resourceView &&
|
|
3725
|
+
children: T?.resourceView && Se ? /* @__PURE__ */ E(pt, {
|
|
3622
3726
|
tasks: N,
|
|
3623
|
-
assignee:
|
|
3624
|
-
effort:
|
|
3727
|
+
assignee: Se,
|
|
3728
|
+
effort: Ce,
|
|
3625
3729
|
capacity: T?.capacity ?? 1,
|
|
3626
3730
|
viewMode: e.viewMode || "day"
|
|
3627
|
-
}) : /* @__PURE__ */
|
|
3731
|
+
}) : /* @__PURE__ */ E(L, {
|
|
3628
3732
|
tasks: N,
|
|
3629
|
-
startDate:
|
|
3630
|
-
endDate:
|
|
3733
|
+
startDate: P?.start,
|
|
3734
|
+
endDate: P?.end,
|
|
3631
3735
|
onTaskClick: (e) => {
|
|
3632
|
-
|
|
3736
|
+
Ne.handleClick(e.data), u?.(e.data);
|
|
3633
3737
|
},
|
|
3634
|
-
onTaskUpdate:
|
|
3635
|
-
onTaskDelete:
|
|
3636
|
-
onDependencyCreate: T?.dependenciesField ?
|
|
3637
|
-
onDependencyDelete: T?.dependenciesField ?
|
|
3738
|
+
onTaskUpdate: Pe,
|
|
3739
|
+
onTaskDelete: He,
|
|
3740
|
+
onDependencyCreate: T?.dependenciesField ? F : void 0,
|
|
3741
|
+
onDependencyDelete: T?.dependenciesField ? Le : void 0,
|
|
3638
3742
|
markers: e.markers,
|
|
3639
3743
|
autoSchedule: !!T?.dependenciesField,
|
|
3640
3744
|
rescheduleOnConflict: !!T?.dependenciesField,
|
|
3641
3745
|
criticalPathDefault: !!e.criticalPath,
|
|
3642
|
-
workingCalendar:
|
|
3746
|
+
workingCalendar: we,
|
|
3747
|
+
shiftSegments: Te,
|
|
3643
3748
|
showBaselines: e.showBaselines !== !1,
|
|
3644
3749
|
readOnly: !!e.readOnly,
|
|
3645
3750
|
mobileReadOnly: e.mobileReadOnly !== !1,
|
|
3646
3751
|
persistLayoutKey: e.persistLayout === !1 ? void 0 : `${e.objectName || (w?.provider === "object" ? w.object : "") || "gantt"}:${e.viewName || "default"}`,
|
|
3647
|
-
groupBy:
|
|
3752
|
+
groupBy: xe,
|
|
3648
3753
|
defaultCollapsedDepth: T?.defaultCollapsedDepth,
|
|
3649
3754
|
inlineEdit: !0
|
|
3650
3755
|
})
|
|
3651
3756
|
}),
|
|
3652
|
-
|
|
3653
|
-
let t = w?.provider === "object" ? w.object : e.objectName, n =
|
|
3757
|
+
Ne.isOverlay && Ne.isOpen && Ne.selectedRecord && (() => {
|
|
3758
|
+
let t = w?.provider === "object" ? w.object : e.objectName, n = Ne.selectedRecord, r = n.id ?? n._id;
|
|
3654
3759
|
if (!t || r == null) return null;
|
|
3655
3760
|
let a = T?.titleField ? String(n[T.titleField] ?? "Task Details") : "Task Details";
|
|
3656
|
-
return /* @__PURE__ */
|
|
3761
|
+
return /* @__PURE__ */ E(h, {
|
|
3657
3762
|
open: !0,
|
|
3658
|
-
onClose:
|
|
3763
|
+
onClose: Ne.close,
|
|
3659
3764
|
title: a,
|
|
3660
3765
|
record: n,
|
|
3661
3766
|
objectName: t,
|
|
3662
3767
|
recordId: r,
|
|
3663
3768
|
dataSource: i,
|
|
3664
3769
|
objectSchema: C,
|
|
3665
|
-
width:
|
|
3770
|
+
width: Ne.width,
|
|
3666
3771
|
fullPageHref: g(t, r) ?? void 0,
|
|
3667
3772
|
onFieldSave: async (e, n) => {
|
|
3668
3773
|
i?.update && (await i.update(t, String(r), { [e]: n }), b((t) => t.map((t) => String(t.id ?? t._id) === String(r) ? {
|
|
@@ -3675,47 +3780,47 @@ var bt = ({ schema: e, dataSource: i, className: o, onTaskClick: u, onRowClick:
|
|
|
3675
3780
|
}
|
|
3676
3781
|
});
|
|
3677
3782
|
})(),
|
|
3678
|
-
/* @__PURE__ */
|
|
3783
|
+
/* @__PURE__ */ E(ee, {
|
|
3679
3784
|
open: !!I,
|
|
3680
3785
|
onOpenChange: (e) => {
|
|
3681
|
-
!e && !
|
|
3786
|
+
!e && !Be && ze(null);
|
|
3682
3787
|
},
|
|
3683
|
-
children: /* @__PURE__ */
|
|
3788
|
+
children: /* @__PURE__ */ D(te, { children: [/* @__PURE__ */ D(ie, { children: [/* @__PURE__ */ E(ae, { children: "Delete this task?" }), /* @__PURE__ */ E(ne, { children: I ? /* @__PURE__ */ D(Oe, { children: [
|
|
3684
3789
|
"\"",
|
|
3685
3790
|
I.title,
|
|
3686
3791
|
"\" will be permanently removed. This action cannot be undone."
|
|
3687
|
-
] }) : null })] }), /* @__PURE__ */
|
|
3688
|
-
disabled:
|
|
3792
|
+
] }) : null })] }), /* @__PURE__ */ D(re, { children: [/* @__PURE__ */ E(v, {
|
|
3793
|
+
disabled: Be,
|
|
3689
3794
|
children: "Cancel"
|
|
3690
|
-
}), /* @__PURE__ */
|
|
3795
|
+
}), /* @__PURE__ */ E(_, {
|
|
3691
3796
|
onClick: (e) => {
|
|
3692
|
-
e.preventDefault(),
|
|
3797
|
+
e.preventDefault(), Ue();
|
|
3693
3798
|
},
|
|
3694
|
-
disabled:
|
|
3799
|
+
disabled: Be,
|
|
3695
3800
|
"data-testid": "gantt-delete-confirm",
|
|
3696
3801
|
className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
3697
|
-
children:
|
|
3802
|
+
children: Be ? "Deleting…" : "Delete"
|
|
3698
3803
|
})] })] })
|
|
3699
3804
|
})
|
|
3700
3805
|
]
|
|
3701
|
-
}) : /* @__PURE__ */
|
|
3806
|
+
}) : /* @__PURE__ */ E("div", {
|
|
3702
3807
|
className: o,
|
|
3703
|
-
children: /* @__PURE__ */
|
|
3808
|
+
children: /* @__PURE__ */ E("div", {
|
|
3704
3809
|
className: "flex items-center justify-center h-96",
|
|
3705
|
-
children: /* @__PURE__ */
|
|
3810
|
+
children: /* @__PURE__ */ E("div", {
|
|
3706
3811
|
className: "text-muted-foreground",
|
|
3707
3812
|
children: "Gantt configuration required. Please specify startDateField, endDateField, and titleField."
|
|
3708
3813
|
})
|
|
3709
3814
|
})
|
|
3710
3815
|
});
|
|
3711
|
-
},
|
|
3816
|
+
}, Tt = ({ schema: e }) => {
|
|
3712
3817
|
let { dataSource: t } = d() || {};
|
|
3713
|
-
return /* @__PURE__ */
|
|
3818
|
+
return /* @__PURE__ */ E(wt, {
|
|
3714
3819
|
schema: e,
|
|
3715
3820
|
dataSource: t
|
|
3716
3821
|
});
|
|
3717
3822
|
};
|
|
3718
|
-
o.register("object-gantt",
|
|
3823
|
+
o.register("object-gantt", Tt, {
|
|
3719
3824
|
namespace: "plugin-gantt",
|
|
3720
3825
|
label: "Object Gantt",
|
|
3721
3826
|
category: "view",
|
|
@@ -3730,7 +3835,7 @@ o.register("object-gantt", xt, {
|
|
|
3730
3835
|
label: "Gantt Config",
|
|
3731
3836
|
description: "startDateField, endDateField, titleField, progressField, percentageField, colorField, dependenciesField"
|
|
3732
3837
|
}]
|
|
3733
|
-
}), o.register("gantt",
|
|
3838
|
+
}), o.register("gantt", Tt, {
|
|
3734
3839
|
namespace: "view",
|
|
3735
3840
|
label: "Gantt View",
|
|
3736
3841
|
category: "view",
|
|
@@ -3747,4 +3852,4 @@ o.register("object-gantt", xt, {
|
|
|
3747
3852
|
}]
|
|
3748
3853
|
});
|
|
3749
3854
|
//#endregion
|
|
3750
|
-
export {
|
|
3855
|
+
export { L as GanttView, wt as ObjectGantt, Tt as ObjectGanttRenderer, vt as QuickFilterBar, pt as ResourceWorkload, Be as bandAt, ct as computeWorkload, xt as normalizeDependencies, Re as normalizeShiftSegments, yt as normalizeTaskType, I as parseHHMM, ze as shiftDayStart };
|