@object-ui/plugin-gantt 17.3.0 → 17.5.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/dist/index.js CHANGED
@@ -1,15 +1,15 @@
1
1
  import * as e from "react";
2
2
  import { useCallback as t, useContext as n, useEffect as r, useMemo as i, useRef as a, useState as o } from "react";
3
3
  import { ComponentRegistry as s, buildExpandFields as c, extractRecords as l, getRecordDisplayName as u, resolveDataSource as d } from "@object-ui/core";
4
- import { SchemaRendererContext as f, useNavigationOverlay as p, useObjectTranslation as m, useSchemaContext as h } from "@object-ui/react";
5
- import { toast as g } from "sonner";
6
- import { GanttConfigSchema as ee } from "@objectstack/spec/ui";
7
- import { resolveFieldCurrency as te, useLocalization as _ } from "@object-ui/i18n";
8
- import { RecordDetailDrawer as v, deriveRecordPageHref as ne } from "@object-ui/plugin-detail";
9
- import { AlertDialog as re, AlertDialogAction as ie, AlertDialogCancel as ae, AlertDialogContent as oe, AlertDialogDescription as se, AlertDialogFooter as ce, AlertDialogHeader as le, AlertDialogTitle as ue, Button as y, cn as b, useResizeObserver as de } from "@object-ui/components";
10
- import { formatCurrency as fe, formatDate as pe, formatDateTime as me, formatNumber as he, formatPercent as ge, getSemanticColorName as _e, getSemanticHex as ve, humanizeLabel as x } from "@object-ui/fields";
11
- import { Activity as S, ArrowRight as ye, ChevronDown as be, ChevronLeft as xe, ChevronRight as Se, Download as Ce, FileDown as C, Lock as we, Maximize2 as Te, Minimize2 as w, PanelLeft as Ee, PanelLeftClose as De, Redo2 as T, RefreshCw as E, Save as Oe, Undo2 as ke, Wand2 as D, ZoomIn as O, ZoomOut as Ae } from "lucide-react";
12
- import { Fragment as je, jsx as k, jsxs as A } from "react/jsx-runtime";
4
+ import { ElementDataSourceGate as f, SchemaRendererContext as p, useNavigationOverlay as m, useObjectTranslation as h, useSchemaContext as g } from "@object-ui/react";
5
+ import { toast as ee } from "sonner";
6
+ import { GanttConfigSchema as te } from "@objectstack/spec/ui";
7
+ import { resolveFieldCurrency as ne, useDisplayLocale as _, useLocalization as v } from "@object-ui/i18n";
8
+ import { RecordDetailDrawer as re, deriveRecordPageHref as ie } from "@object-ui/plugin-detail";
9
+ import { AlertDialog as ae, AlertDialogAction as oe, AlertDialogCancel as se, AlertDialogContent as ce, AlertDialogDescription as le, AlertDialogFooter as ue, AlertDialogHeader as de, AlertDialogTitle as fe, Button as y, cn as pe, useResizeObserver as b } from "@object-ui/components";
10
+ import { formatCurrency as me, formatDate as he, formatDateTime as ge, formatNumber as _e, formatPercent as ve, getSemanticColorName as ye, getSemanticHex as x, humanizeLabel as S } from "@object-ui/fields";
11
+ import { Activity as be, ArrowRight as xe, ChevronDown as Se, ChevronLeft as Ce, ChevronRight as we, Download as C, FileDown as Te, Lock as Ee, Maximize2 as De, Minimize2 as w, PanelLeft as Oe, PanelLeftClose as ke, Redo2 as T, RefreshCw as E, Save as Ae, Undo2 as je, Wand2 as D, ZoomIn as O, ZoomOut as Me } from "lucide-react";
12
+ import { Fragment as Ne, jsx as k, jsxs as A } from "react/jsx-runtime";
13
13
  //#region src/scheduling.ts
14
14
  var j = 864e5, M = (e) => e.toISOString().slice(0, 10);
15
15
  function N(e, t) {
@@ -19,38 +19,38 @@ function N(e, t) {
19
19
  }
20
20
  return !(t.holidays && t.holidays.has(M(e)));
21
21
  }
22
- function Me(e) {
22
+ function P(e) {
23
23
  let t = new Date(e);
24
24
  return t.setUTCHours(0, 0, 0, 0), t;
25
25
  }
26
- function P(e, t) {
27
- let n = Me(e);
26
+ function Pe(e, t) {
27
+ let n = P(e);
28
28
  for (; !N(n, t);) n = new Date(n.getTime() + j);
29
29
  return n.getTime();
30
30
  }
31
- function Ne(e, t, n) {
31
+ function F(e, t, n) {
32
32
  if (t <= e) return 0;
33
- let r = 0, i = Me(e), a = Me(t).getTime();
33
+ let r = 0, i = P(e), a = P(t).getTime();
34
34
  for (; i.getTime() < a;) N(i, n) && r++, i = new Date(i.getTime() + j);
35
35
  return r;
36
36
  }
37
- function F(e, t, n) {
38
- if (t <= 0) return Me(e).getTime();
39
- let r = Me(e), i = t;
37
+ function Fe(e, t, n) {
38
+ if (t <= 0) return P(e).getTime();
39
+ let r = P(e), i = t;
40
40
  for (; i > 0;) N(r, n) && i--, r = new Date(r.getTime() + j);
41
41
  return r.getTime();
42
42
  }
43
- function Pe(e, t, n) {
44
- if (t <= 0) return Me(e).getTime();
45
- let r = Me(e), i = t;
43
+ function Ie(e, t, n) {
44
+ if (t <= 0) return P(e).getTime();
45
+ let r = P(e), i = t;
46
46
  for (; i > 0;) r = /* @__PURE__ */ new Date(r.getTime() - j), N(r, n) && i--;
47
47
  return r.getTime();
48
48
  }
49
49
  var I = (e) => String(e);
50
- function Fe(e) {
50
+ function Le(e) {
51
51
  return e === "ss" || e === "ff" || e === "sf" ? e : "fs";
52
52
  }
53
- function Ie(e) {
53
+ function Re(e) {
54
54
  let t = new Set(e.map((e) => I(e.id))), n = [];
55
55
  for (let r of e) {
56
56
  let e = I(r.id);
@@ -61,18 +61,18 @@ function Ie(e) {
61
61
  o === e || !t.has(o) || n.push({
62
62
  pred: o,
63
63
  succ: e,
64
- type: Fe(r ? i.type : void 0)
64
+ type: Le(r ? i.type : void 0)
65
65
  });
66
66
  }
67
67
  }
68
68
  return n;
69
69
  }
70
- function Le(e) {
70
+ function ze(e) {
71
71
  let t = /* @__PURE__ */ new Set();
72
72
  for (let n of e) n.parent != null && n.parent !== "" && t.add(I(n.parent));
73
73
  return t;
74
74
  }
75
- function Re(e, t) {
75
+ function L(e, t) {
76
76
  let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
77
77
  for (let t of e) n.set(t, 0), r.set(t, []);
78
78
  for (let e of t) r.get(e.pred).push(e.succ), n.set(e.succ, (n.get(e.succ) ?? 0) + 1);
@@ -98,7 +98,7 @@ function Re(e, t) {
98
98
  hasCycle: !1
99
99
  };
100
100
  }
101
- function ze(e, t) {
101
+ function Be(e, t) {
102
102
  let n = {
103
103
  criticalIds: /* @__PURE__ */ new Set(),
104
104
  criticalEdges: /* @__PURE__ */ new Set()
@@ -106,10 +106,10 @@ function ze(e, t) {
106
106
  if (!e.length) return n;
107
107
  let r = /* @__PURE__ */ new Map();
108
108
  for (let n of e) {
109
- let e = t ? Ne(n.start.getTime(), n.end.getTime(), t) : (n.end.getTime() - n.start.getTime()) / j;
109
+ let e = t ? F(n.start.getTime(), n.end.getTime(), t) : (n.end.getTime() - n.start.getTime()) / j;
110
110
  r.set(I(n.id), Number.isFinite(e) && e > 0 ? e : 0);
111
111
  }
112
- let i = Ie(e), a = e.map((e) => I(e.id)), { order: o, hasCycle: s } = Re(a, i);
112
+ let i = Re(e), a = e.map((e) => I(e.id)), { order: o, hasCycle: s } = L(a, i);
113
113
  if (s) return n;
114
114
  let c = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map();
115
115
  for (let e of a) c.set(e, []), l.set(e, []);
@@ -140,17 +140,17 @@ function ze(e, t) {
140
140
  criticalEdges: te
141
141
  };
142
142
  }
143
- function Be(e, t, n) {
143
+ function Ve(e, t, n) {
144
144
  if (!e.length) return {
145
145
  changes: [],
146
146
  skippedLocked: []
147
147
  };
148
- let r = Ie(e), i = e.map((e) => I(e.id)), { order: a, hasCycle: o } = Re(i, r);
148
+ let r = Re(e), i = e.map((e) => I(e.id)), { order: a, hasCycle: o } = L(i, r);
149
149
  if (o) return {
150
150
  changes: [],
151
151
  skippedLocked: []
152
152
  };
153
- let s = Le(e), c = /* @__PURE__ */ new Map();
153
+ let s = ze(e), c = /* @__PURE__ */ new Map();
154
154
  for (let t of e) c.set(I(t.id), t);
155
155
  let l = /* @__PURE__ */ new Map();
156
156
  for (let t of e) {
@@ -167,7 +167,7 @@ function Be(e, t, n) {
167
167
  for (let e of a) {
168
168
  let r = c.get(e);
169
169
  if (!r) continue;
170
- let i = t ? Ne(p.get(e), m.get(e), t) : m.get(e) - p.get(e), a = r.start.getTime(), o = a;
170
+ let i = t ? F(p.get(e), m.get(e), t) : m.get(e) - p.get(e), a = r.start.getTime(), o = a;
171
171
  for (let n of f.get(e) ?? []) {
172
172
  let e = p.get(n.pred), r = m.get(n.pred), a;
173
173
  switch (n.type) {
@@ -175,10 +175,10 @@ function Be(e, t, n) {
175
175
  a = e;
176
176
  break;
177
177
  case "ff":
178
- a = t ? Pe(r, i, t) : r - i;
178
+ a = t ? Ie(r, i, t) : r - i;
179
179
  break;
180
180
  case "sf":
181
- a = t ? Pe(e, i, t) : e - i;
181
+ a = t ? Ie(e, i, t) : e - i;
182
182
  break;
183
183
  default: a = r;
184
184
  }
@@ -191,8 +191,8 @@ function Be(e, t, n) {
191
191
  continue;
192
192
  }
193
193
  if (l && !t && n?.snapStart && (o = Math.max(o, n.snapStart(o))), t) {
194
- let n = P(o, t);
195
- p.set(e, n), m.set(e, F(n, i, t));
194
+ let n = Pe(o, t);
195
+ p.set(e, n), m.set(e, Fe(n, i, t));
196
196
  } else p.set(e, o), m.set(e, o + i);
197
197
  }
198
198
  }
@@ -226,7 +226,7 @@ function Be(e, t, n) {
226
226
  skippedLocked: h
227
227
  };
228
228
  }
229
- function Ve(e, t, n) {
229
+ function He(e, t, n) {
230
230
  let r = String(t), i = String(n);
231
231
  if (r === i) return !0;
232
232
  let a = /* @__PURE__ */ new Map();
@@ -246,28 +246,28 @@ function Ve(e, t, n) {
246
246
  }
247
247
  //#endregion
248
248
  //#region src/shifts.ts
249
- var L = 6e4;
250
- 1440 * L;
251
- var He = 1440;
252
- function Ue(e) {
249
+ var Ue = 6e4;
250
+ 1440 * Ue;
251
+ var We = 1440;
252
+ function Ge(e) {
253
253
  if (typeof e != "string") return null;
254
254
  let t = /^(\d{1,2}):(\d{2})$/.exec(e.trim());
255
255
  if (!t) return null;
256
256
  let n = Number(t[1]), r = Number(t[2]);
257
257
  return n < 0 || n > 23 || r < 0 || r > 59 ? null : n * 60 + r;
258
258
  }
259
- function We(e) {
259
+ function Ke(e) {
260
260
  if (!e || !Array.isArray(e.bands) || e.bands.length === 0) return null;
261
- let t = Ue(e.dayStart) ?? 0, n = [];
261
+ let t = Ge(e.dayStart) ?? 0, n = [];
262
262
  for (let t = 0; t < e.bands.length; t++) {
263
- let r = e.bands[t], i = Ue(r.start), a = Ue(r.end);
263
+ let r = e.bands[t], i = Ge(r.start), a = Ge(r.end);
264
264
  if (i == null || a == null || !r.label) return null;
265
- let o = (a - i + He) % He || He;
265
+ let o = (a - i + We) % We || We;
266
266
  n.push({
267
267
  key: r.key ?? `band${t}`,
268
268
  label: r.label,
269
269
  color: r.color,
270
- durMs: o * L
270
+ durMs: o * Ue
271
271
  });
272
272
  }
273
273
  return {
@@ -276,19 +276,19 @@ function We(e) {
276
276
  showMidnight: e.showMidnight !== !1
277
277
  };
278
278
  }
279
- function Ge(e, t) {
279
+ function qe(e, t) {
280
280
  let n = new Date(e);
281
281
  return n.setHours(0, 0, 0, 0), n.setMinutes(t), n.getTime() > e.getTime() && n.setDate(n.getDate() - 1), n;
282
282
  }
283
- function Ke(e, t) {
283
+ function R(e, t) {
284
284
  if (t.bands.length === 0) return null;
285
- let n = Ge(e, t.dayStartMin).getTime(), r = e.getTime() - n, i = 0;
285
+ let n = qe(e, t.dayStartMin).getTime(), r = e.getTime() - n, i = 0;
286
286
  for (let e of t.bands) if (i += e.durMs, r < i) return e;
287
287
  return t.bands[t.bands.length - 1];
288
288
  }
289
289
  //#endregion
290
290
  //#region src/useGanttTranslation.ts
291
- var R = {
291
+ var Je = {
292
292
  "gantt.column.taskName": "Task Name",
293
293
  "gantt.column.start": "Start",
294
294
  "gantt.column.end": "End",
@@ -343,13 +343,17 @@ var R = {
343
343
  "gantt.linkType.sf": "Start → Finish",
344
344
  "gantt.linkEnd.start": "start",
345
345
  "gantt.linkEnd.end": "end",
346
+ "gantt.link.rejected.self": "A task cannot depend on itself.",
347
+ "gantt.link.rejected.locked": "This row is locked and cannot take a new dependency.",
348
+ "gantt.link.rejected.group": "A summary row cannot take a dependency — link one of its tasks instead.",
349
+ "gantt.link.rejected.cycle": "That link would create a circular dependency.",
346
350
  "gantt.conflict.title": "Schedule conflict",
347
- "gantt.conflict.body": "This move conflicts with dependency constraints. Auto-reschedule {count} affected task(s)?",
351
+ "gantt.conflict.body": "This move conflicts with dependency constraints. Auto-reschedule {{count}} affected task(s)?",
348
352
  "gantt.conflict.confirm": "Auto-reschedule",
349
353
  "gantt.conflict.cancel": "Keep as is",
350
354
  "gantt.autoScheduleDlg.title": "Auto-schedule",
351
- "gantt.autoScheduleDlg.body": "Shift {count} task(s) later to satisfy dependency links?",
352
- "gantt.autoScheduleDlg.skipped": "{count} locked task(s) also violate links and were skipped.",
355
+ "gantt.autoScheduleDlg.body": "Shift {{count}} task(s) later to satisfy dependency links?",
356
+ "gantt.autoScheduleDlg.skipped": "{{count}} locked task(s) also violate links and were skipped.",
353
357
  "gantt.autoScheduleDlg.confirm": "Apply",
354
358
  "gantt.autoScheduleDlg.cancel": "Cancel",
355
359
  "gantt.autoScheduleDlg.none": "All dependencies satisfied — nothing to reschedule.",
@@ -366,55 +370,55 @@ var R = {
366
370
  "gantt.lockedHint": "No edit permission",
367
371
  "gantt.writeFailed": "Save failed — the change was rolled back"
368
372
  };
369
- function qe(e, t) {
370
- let n = R[e] || e;
371
- if (t) for (let [e, r] of Object.entries(t)) n = n.replace(`{{${e}}}`, String(r));
373
+ function z(e, t) {
374
+ let n = Je[e] || e;
375
+ if (t) for (let [e, r] of Object.entries(t)) n = n.split(`{{${e}}}`).join(String(r));
372
376
  return n;
373
377
  }
374
- function Je() {
375
- let e = m();
378
+ function Ye() {
379
+ let e = h();
376
380
  return {
377
381
  t: (t, n) => {
378
382
  let r = e.t(t, n);
379
- return typeof r == "string" && r !== t ? r : qe(t, n);
383
+ return typeof r == "string" && r !== t ? r : z(t, n);
380
384
  },
381
385
  language: e.language
382
386
  };
383
387
  }
384
388
  //#endregion
385
389
  //#region src/GanttView.tsx
386
- var Ye = 8;
387
- function Xe(e, t) {
390
+ var Xe = 8;
391
+ function Ze(e, t) {
388
392
  if (t.width <= 0) return "move";
389
- let n = Math.min(Ye, t.width / 3), r = e - t.left;
393
+ let n = Math.min(Xe, t.width / 3), r = e - t.left;
390
394
  return r <= n ? "resize-left" : r >= t.width - n ? "resize-right" : "move";
391
395
  }
392
- function Ze(e) {
396
+ function Qe(e) {
393
397
  return 110;
394
398
  }
395
- function Qe(e) {
399
+ function $e(e) {
396
400
  return e < 640 ? 140 : e < 1024 ? 220 : 320;
397
401
  }
398
- function $e(e) {
402
+ function et(e) {
399
403
  return e >= 280;
400
404
  }
401
- function et(e) {
405
+ function tt(e) {
402
406
  return e < 640 ? 32 : 40;
403
407
  }
404
- var tt = [
408
+ var nt = [
405
409
  "day",
406
410
  "week",
407
411
  "month",
408
412
  "quarter",
409
413
  "year"
410
- ], nt = {
414
+ ], rt = {
411
415
  day: 1,
412
416
  week: 7,
413
417
  month: 30.44,
414
418
  quarter: 91.31,
415
419
  year: 365.25
416
- }, rt = 864e5;
417
- function z(e, t) {
420
+ }, it = 864e5;
421
+ function at(e, t) {
418
422
  let n = new Intl.DateTimeFormat("en-US", {
419
423
  timeZone: e,
420
424
  hour12: !1,
@@ -427,7 +431,7 @@ function z(e, t) {
427
431
  }), r = (e) => Number(n.formatToParts(t).find((t) => t.type === e)?.value ?? 0);
428
432
  return Date.UTC(r("year"), r("month") - 1, r("day"), r("hour") % 24, r("minute"), r("second")) - Math.floor(t.getTime() / 1e3) * 1e3;
429
433
  }
430
- function it(e) {
434
+ function ot(e) {
431
435
  let t = {
432
436
  delta: 0,
433
437
  to: (e) => e,
@@ -436,11 +440,11 @@ function it(e) {
436
440
  };
437
441
  if (!e) return t;
438
442
  try {
439
- z(e, /* @__PURE__ */ new Date());
443
+ at(e, /* @__PURE__ */ new Date());
440
444
  } catch {
441
445
  return console.warn(`[GanttView] invalid timeZone "${e}" — falling back to the browser zone`), t;
442
446
  }
443
- let n = (t) => z(e, t) - -t.getTimezoneOffset() * 6e4, r = n(/* @__PURE__ */ new Date());
447
+ let n = (t) => at(e, t) - -t.getTimezoneOffset() * 6e4, r = n(/* @__PURE__ */ new Date());
444
448
  return r === 0 ? t : {
445
449
  delta: r,
446
450
  to: (e) => new Date(e.getTime() + n(e)),
@@ -448,11 +452,11 @@ function it(e) {
448
452
  now: () => new Date(Date.now() + n(/* @__PURE__ */ new Date()))
449
453
  };
450
454
  }
451
- function at(e, t) {
455
+ function st(e, t) {
452
456
  let n = new Date(e);
453
457
  return n.setHours(0, 0, 0, 0), t === "week" ? n.setDate(n.getDate() - (n.getDay() + 6) % 7) : t === "month" ? n.setDate(1) : t === "quarter" ? n.setMonth(Math.floor(n.getMonth() / 3) * 3, 1) : t === "year" && n.setMonth(0, 1), n;
454
458
  }
455
- function ot(e, t, n) {
459
+ function ct(e, t, n) {
456
460
  let r = e.length - 1, i = 0;
457
461
  for (; i < r && e[i + 1] < t;) i++;
458
462
  let a = i;
@@ -462,7 +466,7 @@ function ot(e, t, n) {
462
466
  end: a
463
467
  };
464
468
  }
465
- function st(e, t, n) {
469
+ function lt(e, t, n) {
466
470
  let r = new Date(e);
467
471
  if (n === "day") r.setDate(r.getDate() + t);
468
472
  else if (n === "week") r.setDate(r.getDate() + t * 7);
@@ -474,7 +478,7 @@ function st(e, t, n) {
474
478
  }
475
479
  return r;
476
480
  }
477
- function ct(e, t, n, r = 2) {
481
+ function ut(e, t, n, r = 2) {
478
482
  return new Promise((i) => {
479
483
  let a = new Blob([e], { type: "image/svg+xml;charset=utf-8" }), o = URL.createObjectURL(a), s = new Image();
480
484
  s.onload = () => {
@@ -487,11 +491,11 @@ function ct(e, t, n, r = 2) {
487
491
  }, s.src = o;
488
492
  });
489
493
  }
490
- function lt(e, t) {
494
+ function dt(e, t) {
491
495
  let n = document.createElement("a");
492
496
  n.href = URL.createObjectURL(e), n.download = t, document.body.appendChild(n), n.click(), n.remove(), setTimeout(() => URL.revokeObjectURL(n.href), 1e3);
493
497
  }
494
- function ut(e, t, n) {
498
+ function ft(e, t, n) {
495
499
  let r = (e) => {
496
500
  let t = new Uint8Array(e.length);
497
501
  for (let n = 0; n < e.length; n++) t[n] = e.charCodeAt(n) & 255;
@@ -506,18 +510,18 @@ function ut(e, t, n) {
506
510
  for (let e of o) d += `${String(e).padStart(10, "0")} 00000 n \n`;
507
511
  return d += `trailer\n<< /Size 6 /Root 1 0 R >>\nstartxref\n${u}\n%%EOF\n`, c(r(d)), new Blob(a, { type: "application/pdf" });
508
512
  }
509
- function dt(e) {
513
+ function pt(e) {
510
514
  let t = e.slice(e.indexOf(",") + 1), n = atob(t), r = new Uint8Array(n.length);
511
515
  for (let e = 0; e < n.length; e++) r[e] = n.charCodeAt(e);
512
516
  return r;
513
517
  }
514
- var ft = "gantt-layout:";
515
- function pt(e) {
518
+ var mt = "gantt-layout:";
519
+ function ht(e) {
516
520
  if (!e || typeof window > "u") return null;
517
521
  try {
518
- let t = window.localStorage.getItem(ft + e);
522
+ let t = window.localStorage.getItem(mt + e);
519
523
  if (!t) return null;
520
- let n = JSON.parse(t), r = n.viewMode && tt.includes(n.viewMode) ? n.viewMode : null;
524
+ let n = JSON.parse(t), r = n.viewMode && nt.includes(n.viewMode) ? n.viewMode : null;
521
525
  if (!r) return null;
522
526
  let i = typeof n.columnWidth == "number" && isFinite(n.columnWidth) ? n.columnWidth : null, a = typeof n.taskListWidth == "number" && isFinite(n.taskListWidth) ? n.taskListWidth : null, o = Array.isArray(n.collapsedIds) ? n.collapsedIds.filter((e) => typeof e == "string") : void 0;
523
527
  return {
@@ -531,22 +535,22 @@ function pt(e) {
531
535
  return null;
532
536
  }
533
537
  }
534
- function mt(e, t) {
538
+ function gt(e, t) {
535
539
  if (!(typeof window > "u")) try {
536
- window.localStorage.setItem(ft + e, JSON.stringify(t));
540
+ window.localStorage.setItem(mt + e, JSON.stringify(t));
537
541
  } catch {}
538
542
  }
539
- function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTaskClick: o, onTaskUpdate: s, onTaskDelete: c, onViewChange: l, onDependencyCreate: u, onBeforeDependencyCreate: d, onDependencyDelete: f, onTaskReorder: p, className: m, inlineEdit: h = !1, autoSchedule: g = !1, rescheduleOnConflict: ee = !1, criticalPathDefault: te = !1, workingCalendar: _, shiftSegments: v, showBaselines: ne = !0, readOnly: re = !1, mobileReadOnly: ie = !1, groupBy: ae, ungroupedLabel: oe = "Ungrouped", defaultCollapsedDepth: se, summaryExtent: ce = "children", persistLayoutKey: le, onLayoutChange: ue, onRefresh: fe, refreshing: pe = !1, dependencyTypes: me = !0, timeZone: he, exportFileName: ge, interactions: _e, onBeforeTaskUpdate: ve }) {
540
- let x = e.useMemo(() => it(he), [he]), j = e.useMemo(() => x.delta === 0 ? t : t.map((e) => ({
543
+ function _t({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTaskClick: o, onTaskUpdate: s, onTaskDelete: c, onViewChange: l, onDependencyCreate: u, onBeforeDependencyCreate: d, onDependencyDelete: f, onTaskReorder: p, className: m, inlineEdit: h = !1, autoSchedule: g = !1, rescheduleOnConflict: te = !1, criticalPathDefault: ne = !1, workingCalendar: _, shiftSegments: v, showBaselines: re = !0, readOnly: ie = !1, mobileReadOnly: ae = !1, groupBy: oe, ungroupedLabel: se = "Ungrouped", defaultCollapsedDepth: ce, summaryExtent: le = "children", persistLayoutKey: ue, onLayoutChange: de, onRefresh: fe, refreshing: me = !1, dependencyTypes: he = !0, timeZone: ge, exportFileName: _e, interactions: ve, onBeforeTaskUpdate: ye }) {
544
+ let x = e.useMemo(() => ot(ge), [ge]), S = e.useMemo(() => x.delta === 0 ? t : t.map((e) => ({
541
545
  ...e,
542
546
  start: x.to(e.start),
543
547
  end: x.to(e.end),
544
548
  baselineStart: e.baselineStart ? x.to(e.baselineStart) : e.baselineStart,
545
549
  baselineEnd: e.baselineEnd ? x.to(e.baselineEnd) : e.baselineEnd
546
- })), [t, x]), M = e.useMemo(() => r && x.delta !== 0 ? x.to(r) : r, [r, x]), N = e.useMemo(() => i && x.delta !== 0 ? x.to(i) : i, [i, x]), Me = e.useMemo(() => !a || x.delta === 0 ? a : a.map((e) => ({
550
+ })), [t, x]), j = e.useMemo(() => r && x.delta !== 0 ? x.to(r) : r, [r, x]), M = e.useMemo(() => i && x.delta !== 0 ? x.to(i) : i, [i, x]), N = e.useMemo(() => !a || x.delta === 0 ? a : a.map((e) => ({
547
551
  ...e,
548
552
  date: x.to(new Date(e.date))
549
- })), [a, x]), { t: P, language: Ne } = Je(), F = Ne || void 0, [Pe, I] = e.useState(() => x.now()), Fe = e.useRef(null), { width: Ie } = de(Fe), Le = Ie || (typeof window < "u" ? window.innerWidth : 1024), Re = Le < 640, L = re || ie && Re, He = _e?.move !== !1, Ue = _e?.resize !== !1, We = _e?.progress !== !1, Ke = _e?.link !== !1, R = e.useMemo(() => {
553
+ })), [a, x]), { t: P, language: Pe } = Ye(), F = Pe || void 0, [Fe, Ie] = e.useState(() => x.now()), I = e.useRef(null), { width: Le } = b(I), Re = Le || (typeof window < "u" ? window.innerWidth : 1024), ze = Re < 640, L = ie || ae && ze, Ue = ve?.move !== !1, We = ve?.resize !== !1, Ge = ve?.progress !== !1, Ke = ve?.link !== !1, R = e.useMemo(() => {
550
554
  if (!(L || !s)) return x.delta === 0 ? s : (e, t) => {
551
555
  let n = { ...t };
552
556
  n.start instanceof Date && (n.start = x.from(n.start)), n.end instanceof Date && (n.end = x.from(n.end)), s(e, n);
@@ -555,46 +559,46 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
555
559
  L,
556
560
  s,
557
561
  x
558
- ]), qe = L ? void 0 : c, z = L || !Ke ? void 0 : u, ft = L || !Ke ? void 0 : f, ht = L ? void 0 : p, gt = !L && h, _t = !L && g, vt = !L && ee, B = et(Le), yt = Ze(Le), bt = e.useRef(void 0);
559
- bt.current === void 0 && (bt.current = pt(le));
560
- let xt = bt.current, [St, Ct] = e.useState(xt ? xt.columnWidth : null), [wt, Tt] = e.useState(xt ? xt.taskListWidth ?? null : null), [V, Et] = e.useState(n && tt.includes(n) ? n : xt?.viewMode ?? "day");
562
+ ]), Je = L ? void 0 : c, z = L || !Ke ? void 0 : u, at = L || !Ke ? void 0 : f, mt = L ? void 0 : p, _t = !L && h, vt = !L && g, yt = !L && te, B = tt(Re), bt = Qe(Re), xt = e.useRef(void 0);
563
+ xt.current === void 0 && (xt.current = ht(ue));
564
+ let St = xt.current, [Ct, wt] = e.useState(St ? St.columnWidth : null), [Tt, Et] = e.useState(St ? St.taskListWidth ?? null : null), [V, Dt] = e.useState(n && nt.includes(n) ? n : St?.viewMode ?? "day");
561
565
  e.useEffect(() => {
562
- n && tt.includes(n) && Et(n);
566
+ n && nt.includes(n) && Dt(n);
563
567
  }, [n]);
564
- let Dt = e.useRef(null), Ot = e.useRef(null), kt = e.useRef(!0), [At, jt] = e.useState(xt ? xt.taskListCollapsed : !1), Mt = e.useRef(!1);
568
+ let Ot = e.useRef(null), kt = e.useRef(null), At = e.useRef(!0), [jt, Mt] = e.useState(St ? St.taskListCollapsed : !1), Nt = e.useRef(!1);
565
569
  e.useEffect(() => {
566
- !Mt.current && Re && (jt(!0), Mt.current = !0);
567
- }, [Re]);
568
- let Nt = Math.max(160, Le - 200), H = At ? 0 : wt == null ? Qe(Le) : Math.max(160, Math.min(wt, Nt)), Pt = e.useMemo(() => {
569
- if (St != null || N || j.length === 0) return null;
570
- let e = M ? new Date(M) : new Date(Math.min(...j.map((e) => e.start.getTime()))), t = new Date(Math.max(...j.map((e) => e.end.getTime())));
571
- M || e.setDate(e.getDate() - 7), t.setDate(t.getDate() + 14), e = at(e, V), t.setHours(23, 59, 59, 999);
572
- let n = Math.max(1, (t.getTime() - e.getTime()) / rt), r = Math.max(0, Le - H);
570
+ !Nt.current && ze && (Mt(!0), Nt.current = !0);
571
+ }, [ze]);
572
+ let Pt = Math.max(160, Re - 200), H = jt ? 0 : Tt == null ? $e(Re) : Math.max(160, Math.min(Tt, Pt)), Ft = e.useMemo(() => {
573
+ if (Ct != null || M || S.length === 0) return null;
574
+ let e = j ? new Date(j) : new Date(Math.min(...S.map((e) => e.start.getTime()))), t = new Date(Math.max(...S.map((e) => e.end.getTime())));
575
+ j || e.setDate(e.getDate() - 7), t.setDate(t.getDate() + 14), e = st(e, V), t.setHours(23, 59, 59, 999);
576
+ let n = Math.max(1, (t.getTime() - e.getTime()) / it), r = Math.max(0, Re - H);
573
577
  if (r <= 0) return null;
574
- let i = r / n * nt[V];
575
- if (i <= yt) return null;
578
+ let i = r / n * rt[V];
579
+ if (i <= bt) return null;
576
580
  let a = Math.min(i, r * .6);
577
- return a > yt ? a : null;
581
+ return a > bt ? a : null;
578
582
  }, [
579
- St,
583
+ Ct,
584
+ S,
580
585
  j,
581
586
  M,
582
- N,
583
587
  V,
584
- Le,
588
+ Re,
585
589
  H,
586
- yt
587
- ]), Ft = St ?? Pt ?? yt, It = Ft / nt[V], Lt = $e(H), [Rt, zt] = e.useState(null), [Bt, Vt] = e.useState({}), [Ht, Ut] = e.useState(null), U = e.useMemo(() => {
588
- if (!ae) return j;
590
+ bt
591
+ ]), It = Ct ?? Ft ?? bt, Lt = It / rt[V], Rt = et(H), [zt, Bt] = e.useState(null), [Vt, Ht] = e.useState({}), [Ut, Wt] = e.useState(null), U = e.useMemo(() => {
592
+ if (!oe) return S;
589
593
  let e = /* @__PURE__ */ new Set();
590
- for (let t of j) {
594
+ for (let t of S) {
591
595
  let n = t.parent != null && t.parent !== "" ? String(t.parent) : null;
592
596
  n && e.add(n);
593
597
  }
594
598
  let t = /* @__PURE__ */ new Map();
595
- for (let n of j) {
599
+ for (let n of S) {
596
600
  if (e.has(String(n.id))) continue;
597
- let r = ae(n), i = r ? String(r.key) : "__ungrouped__", a = r ? r.label : oe, o = t.get(i);
601
+ let r = oe(n), i = r ? String(r.key) : "__ungrouped__", a = r ? r.label : se, o = t.get(i);
598
602
  o || (o = {
599
603
  key: i,
600
604
  label: a,
@@ -621,10 +625,10 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
621
625
  }
622
626
  return n;
623
627
  }, [
624
- ae,
625
- j,
626
- oe
627
- ]), Wt = e.useMemo(() => {
628
+ oe,
629
+ S,
630
+ se
631
+ ]), Gt = e.useMemo(() => {
628
632
  let e = new Set(U.map((e) => String(e.id))), t = /* @__PURE__ */ new Map();
629
633
  for (let n of U) {
630
634
  let r = n.parent != null && n.parent !== "" ? String(n.parent) : null;
@@ -634,41 +638,41 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
634
638
  }
635
639
  }
636
640
  return t;
637
- }, [U]), Gt = e.useMemo(() => {
641
+ }, [U]), Kt = e.useMemo(() => {
638
642
  let e = /* @__PURE__ */ new Map();
639
643
  for (let t of U) e.set(String(t.id), t);
640
644
  return e;
641
- }, [U]), Kt = e.useCallback((e) => {
645
+ }, [U]), qt = e.useCallback((e) => {
642
646
  let t = [], n = /* @__PURE__ */ new Set(), r = (e) => {
643
- for (let i of Wt.get(e) ?? []) {
647
+ for (let i of Gt.get(e) ?? []) {
644
648
  let e = String(i.id);
645
649
  n.has(e) || (n.add(e), t.push(i), r(e));
646
650
  }
647
651
  };
648
652
  return r(String(e)), t;
649
- }, [Wt]), [W, qt] = e.useState(null), Jt = e.useRef(null);
653
+ }, [Gt]), [W, Jt] = e.useState(null), Yt = e.useRef(null);
650
654
  e.useEffect(() => {
651
- Jt.current = W;
655
+ Yt.current = W;
652
656
  }, [W]);
653
- let Yt = e.useRef(!1), Xt = e.useCallback((e) => {
654
- let t = V === "day" && v && v.bands.length > 0 && v ? Math.min(...v.bands.map((e) => e.durMs)) : rt, n = (e, t) => er.current ? er.current(e, t) : st(e, t, "day"), r = new Date(e.originStart), i = new Date(e.originEnd);
657
+ let Xt = e.useRef(!1), Zt = e.useCallback((e) => {
658
+ let t = V === "day" && v && v.bands.length > 0 && v ? Math.min(...v.bands.map((e) => e.durMs)) : it, n = (e, t) => nr.current ? nr.current(e, t) : lt(e, t, "day"), r = new Date(e.originStart), i = new Date(e.originEnd);
655
659
  return e.mode === "move" ? (r = n(e.originStart, e.unitDelta), i = new Date(e.originEnd.getTime() + (r.getTime() - e.originStart.getTime()))) : e.mode === "resize-left" ? (r = n(e.originStart, e.unitDelta), i.getTime() - r.getTime() < t && (r = new Date(i.getTime() - t))) : e.mode === "resize-right" && (i = n(e.originEnd, e.unitDelta), i.getTime() - r.getTime() < t && (i = new Date(r.getTime() + t))), {
656
660
  start: r,
657
661
  end: i
658
662
  };
659
- }, [V, v]), Zt = e.useRef(j);
660
- Zt.current = j;
661
- let Qt = e.useRef([]), $t = e.useRef([]), [en, tn] = e.useState(0), nn = e.useCallback((e) => {
663
+ }, [V, v]), Qt = e.useRef(S);
664
+ Qt.current = S;
665
+ let $t = e.useRef([]), en = e.useRef([]), [tn, nn] = e.useState(0), rn = e.useCallback((e) => {
662
666
  if (!R) return;
663
667
  let t = e.filter((e) => !e.task.locked);
664
668
  (async () => {
665
669
  let e = t;
666
- if (ve) {
670
+ if (ye) {
667
671
  let n = [];
668
672
  for (let e of t) {
669
673
  let t;
670
674
  try {
671
- t = await ve(e.task, e.changes) !== !1;
675
+ t = await ye(e.task, e.changes) !== !1;
672
676
  } catch {
673
677
  t = !1;
674
678
  }
@@ -689,54 +693,54 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
689
693
  after: i
690
694
  });
691
695
  }
692
- n.length && (Qt.current.push(n), $t.current = [], tn((e) => e + 1));
696
+ n.length && ($t.current.push(n), en.current = [], nn((e) => e + 1));
693
697
  })();
694
- }, [R, ve]), [rn, an] = e.useState(null), on = e.useCallback((e) => {
698
+ }, [R, ye]), [an, on] = e.useState(null), sn = e.useCallback((e) => {
695
699
  if (!v) return e;
696
700
  let t = new Date(e);
697
701
  t.setHours(0, 0, 0, 0);
698
702
  for (let n = -1; n <= 1; n++) {
699
- let r = t.getTime() + n * rt + v.dayStartMin * 6e4;
703
+ let r = t.getTime() + n * it + v.dayStartMin * 6e4;
700
704
  for (let t of v.bands) {
701
705
  if (r >= e) return r;
702
706
  r += t.durMs;
703
707
  }
704
708
  }
705
709
  return e;
706
- }, [v]), sn = e.useMemo(() => ({
707
- summaryExtent: ce,
708
- snapStart: v ? on : void 0
710
+ }, [v]), cn = e.useMemo(() => ({
711
+ summaryExtent: le,
712
+ snapStart: v ? sn : void 0
709
713
  }), [
710
- ce,
714
+ le,
711
715
  v,
712
- on
713
- ]), cn = e.useCallback((e) => {
714
- if (!vt) return;
716
+ sn
717
+ ]), ln = e.useCallback((e) => {
718
+ if (!yt) return;
715
719
  let t = /* @__PURE__ */ new Map();
716
720
  for (let { task: n, changes: r } of e) t.set(String(n.id), {
717
721
  start: r.start ?? n.start,
718
722
  end: r.end ?? n.end
719
723
  });
720
- let { changes: n } = Be(Zt.current.map((e) => {
724
+ let { changes: n } = Ve(Qt.current.map((e) => {
721
725
  let n = t.get(String(e.id));
722
726
  return n ? {
723
727
  ...e,
724
728
  start: n.start,
725
729
  end: n.end
726
730
  } : e;
727
- }), _, sn), r = n.filter((e) => {
731
+ }), _, cn), r = n.filter((e) => {
728
732
  let n = t.get(e.id);
729
733
  return !n || e.start.getTime() !== n.start.getTime() || e.end.getTime() !== n.end.getTime();
730
734
  });
731
- r.length && an(r);
735
+ r.length && on(r);
732
736
  }, [
733
- vt,
737
+ yt,
734
738
  _,
735
- sn
736
- ]), ln = e.useCallback(() => {
737
- if (!rn) return;
738
- let e = rn.map((e) => {
739
- let t = Zt.current.find((t) => String(t.id) === e.id);
739
+ cn
740
+ ]), un = e.useCallback(() => {
741
+ if (!an) return;
742
+ let e = an.map((e) => {
743
+ let t = Qt.current.find((t) => String(t.id) === e.id);
740
744
  return t ? {
741
745
  task: t,
742
746
  changes: {
@@ -745,48 +749,48 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
745
749
  }
746
750
  } : null;
747
751
  }).filter(Boolean);
748
- e.length && nn(e), an(null);
749
- }, [rn, nn]), un = e.useCallback((e, t) => {
752
+ e.length && rn(e), on(null);
753
+ }, [an, rn]), dn = e.useCallback((e, t) => {
750
754
  if (R) for (let n of e) {
751
- let e = Zt.current.find((e) => String(e.id) === n.taskId);
755
+ let e = Qt.current.find((e) => String(e.id) === n.taskId);
752
756
  e && R(e, t === "undo" ? n.before : n.after);
753
757
  }
754
- }, [R]), dn = e.useCallback(() => {
755
- let e = Qt.current.pop();
756
- e && (un(e, "undo"), $t.current.push(e), tn((e) => e + 1));
757
- }, [un]), fn = e.useCallback(() => {
758
+ }, [R]), fn = e.useCallback(() => {
758
759
  let e = $t.current.pop();
759
- e && (un(e, "redo"), Qt.current.push(e), tn((e) => e + 1));
760
- }, [un]), { canUndo: pn, canRedo: mn } = e.useMemo(() => ({
761
- canUndo: Qt.current.length > 0,
762
- canRedo: $t.current.length > 0
763
- }), [en]);
760
+ e && (dn(e, "undo"), en.current.push(e), nn((e) => e + 1));
761
+ }, [dn]), pn = e.useCallback(() => {
762
+ let e = en.current.pop();
763
+ e && (dn(e, "redo"), $t.current.push(e), nn((e) => e + 1));
764
+ }, [dn]), { canUndo: mn, canRedo: hn } = e.useMemo(() => ({
765
+ canUndo: $t.current.length > 0,
766
+ canRedo: en.current.length > 0
767
+ }), [tn]);
764
768
  e.useEffect(() => {
765
769
  if (!W) return;
766
- let e = V === "day" && v && v.bands.length > 0 && v ? It * Math.min(...v.bands.map((e) => e.durMs)) / rt : It, t = (t) => {
767
- let n = Jt.current;
770
+ let e = V === "day" && v && v.bands.length > 0 && v ? Lt * Math.min(...v.bands.map((e) => e.durMs)) / it : Lt, t = (t) => {
771
+ let n = Yt.current;
768
772
  if (!n) return;
769
773
  let r = Math.round((t.clientX - n.originClientX) / Math.max(e, 1));
770
- r !== n.unitDelta && qt({
774
+ r !== n.unitDelta && Jt({
771
775
  ...n,
772
776
  unitDelta: r
773
777
  });
774
778
  }, n = () => {
775
- let e = Jt.current;
779
+ let e = Yt.current;
776
780
  if (e) {
777
781
  if (e.unitDelta !== 0) {
778
- let t = j.find((t) => t.id === e.taskId);
782
+ let t = S.find((t) => t.id === e.taskId);
779
783
  if (t && R) {
780
- let { start: n, end: r } = Xt(e);
784
+ let { start: n, end: r } = Zt(e);
781
785
  if (e.group) {
782
- let r = n.getTime() - e.originStart.getTime(), i = [t, ...Kt(t.id).filter((e) => !e.locked)].map((e) => ({
786
+ let r = n.getTime() - e.originStart.getTime(), i = [t, ...qt(t.id).filter((e) => !e.locked)].map((e) => ({
783
787
  task: e,
784
788
  changes: {
785
789
  start: new Date(e.start.getTime() + r),
786
790
  end: new Date(e.end.getTime() + r)
787
791
  }
788
792
  }));
789
- nn(i), cn(i);
793
+ rn(i), ln(i);
790
794
  } else {
791
795
  let e = [{
792
796
  task: t,
@@ -795,14 +799,14 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
795
799
  end: r
796
800
  }
797
801
  }];
798
- nn(e), cn(e);
802
+ rn(e), ln(e);
799
803
  }
800
804
  }
801
- Yt.current = !0, window.setTimeout(() => {
802
- Yt.current = !1;
805
+ Xt.current = !0, window.setTimeout(() => {
806
+ Xt.current = !1;
803
807
  }, 0);
804
808
  }
805
- qt(null);
809
+ Jt(null);
806
810
  }
807
811
  };
808
812
  return window.addEventListener("pointermove", t), window.addEventListener("pointerup", n), window.addEventListener("pointercancel", n), () => {
@@ -810,19 +814,19 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
810
814
  };
811
815
  }, [
812
816
  W,
813
- Ft,
814
817
  It,
818
+ Lt,
815
819
  V,
816
820
  v,
817
- j,
821
+ S,
818
822
  R,
819
- Xt,
820
- Kt,
821
- nn,
822
- cn
823
+ Zt,
824
+ qt,
825
+ rn,
826
+ ln
823
827
  ]);
824
- let hn = e.useCallback((e, t, n, r) => {
825
- !R || e.data?.__group || e.locked || (n.stopPropagation(), n.preventDefault(), qt({
828
+ let gn = e.useCallback((e, t, n, r) => {
829
+ !R || e.data?.__group || e.locked || (n.stopPropagation(), n.preventDefault(), Jt({
826
830
  taskId: e.id,
827
831
  mode: t,
828
832
  group: r?.group ?? !1,
@@ -831,144 +835,145 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
831
835
  originClientX: n.clientX,
832
836
  unitDelta: 0
833
837
  }));
834
- }, [R]), [gn, _n] = e.useState(null), vn = e.useRef(null);
838
+ }, [R]), [_n, vn] = e.useState(null), yn = e.useRef(null);
835
839
  e.useEffect(() => {
836
- vn.current = gn;
837
- }, [gn]), e.useEffect(() => {
838
- if (!gn) return;
840
+ yn.current = _n;
841
+ }, [_n]), e.useEffect(() => {
842
+ if (!_n) return;
839
843
  let e = (e) => {
840
- let t = vn.current;
844
+ let t = yn.current;
841
845
  if (!t) return;
842
846
  let n = Math.min(100, Math.max(0, Math.round(t.originProgress + (e.clientX - t.originClientX) / Math.max(t.barWidth, 1) * 100)));
843
- n !== t.value && _n({
847
+ n !== t.value && vn({
844
848
  ...t,
845
849
  value: n
846
850
  });
847
851
  }, t = () => {
848
- let e = vn.current;
852
+ let e = yn.current;
849
853
  if (e) {
850
854
  if (e.value !== e.originProgress) {
851
- let t = j.find((t) => t.id === e.taskId);
852
- t && R && nn([{
855
+ let t = S.find((t) => t.id === e.taskId);
856
+ t && R && rn([{
853
857
  task: t,
854
858
  changes: { progress: e.value }
855
- }]), Yt.current = !0, window.setTimeout(() => {
856
- Yt.current = !1;
859
+ }]), Xt.current = !0, window.setTimeout(() => {
860
+ Xt.current = !1;
857
861
  }, 0);
858
862
  }
859
- _n(null);
863
+ vn(null);
860
864
  }
861
865
  };
862
866
  return window.addEventListener("pointermove", e), window.addEventListener("pointerup", t), window.addEventListener("pointercancel", t), () => {
863
867
  window.removeEventListener("pointermove", e), window.removeEventListener("pointerup", t), window.removeEventListener("pointercancel", t);
864
868
  };
865
869
  }, [
866
- gn,
867
- j,
870
+ _n,
871
+ S,
868
872
  R,
869
- nn
873
+ rn
870
874
  ]);
871
- let yn = e.useMemo(() => {
875
+ let bn = e.useMemo(() => {
872
876
  let e = [];
873
- for (let t of j) for (let n of t.dependencies ?? []) {
877
+ for (let t of S) for (let n of t.dependencies ?? []) {
874
878
  let r = typeof n == "object" && n ? n.id : n;
875
879
  r != null && r !== "" && e.push([String(r), String(t.id)]);
876
880
  }
877
881
  return e;
878
- }, [j]), bn = e.useCallback((e, t) => String(t.id) !== String(e) && !t.locked && t.type !== "group" && !Ve(yn, e, t.id), [yn]), xn = e.useRef(null), [G, Sn] = e.useState(null), Cn = e.useRef(null);
882
+ }, [S]), xn = e.useCallback((e, t) => String(t.id) === String(e) ? "self" : t.locked ? "locked" : t.type === "group" ? "group" : He(bn, e, t.id) ? "cycle" : null, [bn]), Sn = e.useCallback((e, t) => xn(e, t) === null, [xn]), Cn = e.useRef(null), [G, wn] = e.useState(null), Tn = e.useRef(null);
879
883
  e.useEffect(() => {
880
- Cn.current = G;
884
+ Tn.current = G;
881
885
  }, [G]), e.useEffect(() => {
882
886
  if (!G) return;
883
887
  let e = (e) => {
884
- let t = xn.current?.getBoundingClientRect();
888
+ let t = Cn.current?.getBoundingClientRect();
885
889
  if (!t) return;
886
890
  let n = e.clientX - t.left, r = e.clientY - t.top;
887
- Sn((e) => e && {
891
+ wn((e) => e && {
888
892
  ...e,
889
893
  x: n,
890
894
  y: r
891
895
  });
892
896
  }, t = () => {
893
- let e = Cn.current;
897
+ let e = Tn.current;
894
898
  if (e && e.targetId != null && z) {
895
- let t = j.find((t) => String(t.id) === String(e.sourceId)), n = j.find((t) => String(t.id) === String(e.targetId)), r = e.targetEnd ?? "start", i = me ? `${e.sourceEnd === "end" ? "f" : "s"}${r === "end" ? "f" : "s"}` : "fs";
896
- t && n && bn(e.sourceId, n) && (d?.(t, n, i) ?? !0) && z(t, n, i);
897
- }
898
- Yt.current = !0, window.setTimeout(() => {
899
- Yt.current = !1;
900
- }, 0), Sn(null);
899
+ let t = S.find((t) => String(t.id) === String(e.sourceId)), n = S.find((t) => String(t.id) === String(e.targetId)), r = e.targetEnd ?? "start", i = he ? `${e.sourceEnd === "end" ? "f" : "s"}${r === "end" ? "f" : "s"}` : "fs";
900
+ t && n && Sn(e.sourceId, n) && (d?.(t, n, i) ?? !0) && z(t, n, i);
901
+ } else e && e.rejectedReason && z && ee.error(P(`gantt.link.rejected.${e.rejectedReason}`));
902
+ Xt.current = !0, window.setTimeout(() => {
903
+ Xt.current = !1;
904
+ }, 0), wn(null);
901
905
  };
902
906
  return window.addEventListener("pointermove", e), window.addEventListener("pointerup", t), window.addEventListener("pointercancel", t), () => {
903
907
  window.removeEventListener("pointermove", e), window.removeEventListener("pointerup", t), window.removeEventListener("pointercancel", t);
904
908
  };
905
909
  }, [
906
910
  G,
907
- j,
911
+ S,
908
912
  z,
909
913
  d,
910
- bn,
911
- me
914
+ Sn,
915
+ he,
916
+ P
912
917
  ]);
913
- let [wn, Tn] = e.useState(null), En = e.useRef(null);
918
+ let [En, Dn] = e.useState(null), On = e.useRef(null);
914
919
  e.useEffect(() => {
915
- if (!wn) return;
920
+ if (!En) return;
916
921
  let e = (e) => {
917
- En.current && e.target instanceof Node && En.current.contains(e.target) || Tn(null);
922
+ On.current && e.target instanceof Node && On.current.contains(e.target) || Dn(null);
918
923
  }, t = (e) => {
919
- e.key === "Escape" && Tn(null);
924
+ e.key === "Escape" && Dn(null);
920
925
  };
921
926
  return window.addEventListener("pointerdown", e, !0), window.addEventListener("keydown", t), () => {
922
927
  window.removeEventListener("pointerdown", e, !0), window.removeEventListener("keydown", t);
923
928
  };
924
- }, [wn]);
925
- let [Dn, On] = e.useState(null), kn = e.useRef(null);
929
+ }, [En]);
930
+ let [kn, An] = e.useState(null), jn = e.useRef(null);
926
931
  e.useEffect(() => {
927
- if (!Dn) return;
932
+ if (!kn) return;
928
933
  let e = (e) => {
929
- kn.current && e.target instanceof Node && kn.current.contains(e.target) || On(null);
934
+ jn.current && e.target instanceof Node && jn.current.contains(e.target) || An(null);
930
935
  }, t = (e) => {
931
- e.key === "Escape" && On(null);
936
+ e.key === "Escape" && An(null);
932
937
  };
933
938
  return window.addEventListener("pointerdown", e, !0), window.addEventListener("keydown", t), () => {
934
939
  window.removeEventListener("pointerdown", e, !0), window.removeEventListener("keydown", t);
935
940
  };
936
- }, [Dn]);
937
- let [An, jn] = e.useState(null), [Mn, Nn] = e.useState(""), Pn = e.useRef(null);
941
+ }, [kn]);
942
+ let [Mn, Nn] = e.useState(null), [Pn, Fn] = e.useState(""), In = e.useRef(null);
938
943
  e.useEffect(() => {
939
- if (!An) return;
944
+ if (!Mn) return;
940
945
  let e = (e) => {
941
- Pn.current && e.target instanceof Node && Pn.current.contains(e.target) || jn(null);
946
+ In.current && e.target instanceof Node && In.current.contains(e.target) || Nn(null);
942
947
  }, t = (e) => {
943
- e.key === "Escape" && jn(null);
948
+ e.key === "Escape" && Nn(null);
944
949
  };
945
950
  return window.addEventListener("pointerdown", e, !0), window.addEventListener("keydown", t), () => {
946
951
  window.removeEventListener("pointerdown", e, !0), window.removeEventListener("keydown", t);
947
952
  };
948
- }, [An]);
949
- let [Fn, In] = e.useState(null), Ln = !!(o || R || z || qe), Rn = e.useCallback((e, t) => {
950
- t.preventDefault(), t.stopPropagation(), In(e.id), Ln && Tn({
953
+ }, [Mn]);
954
+ let [Ln, Rn] = e.useState(null), zn = !!(o || R || z || Je), Bn = e.useCallback((e, t) => {
955
+ t.preventDefault(), t.stopPropagation(), Rn(e.id), zn && Dn({
951
956
  x: t.clientX,
952
957
  y: t.clientY,
953
958
  taskId: e.id
954
959
  });
955
- }, [Ln]), zn = e.useCallback((e, t, n, r) => {
956
- r.preventDefault(), r.stopPropagation(), !(!z && !ft) && On({
960
+ }, [zn]), Vn = e.useCallback((e, t, n, r) => {
961
+ r.preventDefault(), r.stopPropagation(), !(!z && !at) && An({
957
962
  x: r.clientX,
958
963
  y: r.clientY,
959
964
  sourceId: e,
960
965
  targetId: t,
961
966
  type: n
962
967
  });
963
- }, [z, ft]), [Bn, Vn] = e.useState(() => new Set(xt?.collapsedIds ?? [])), Hn = e.useCallback((e) => {
964
- Vn((t) => {
968
+ }, [z, at]), [Hn, Un] = e.useState(() => new Set(St?.collapsedIds ?? [])), Wn = e.useCallback((e) => {
969
+ Un((t) => {
965
970
  let n = new Set(t), r = String(e);
966
971
  return n.has(r) ? n.delete(r) : n.add(r), n;
967
972
  });
968
- }, []), Un = e.useRef(xt?.collapsedIds != null);
973
+ }, []), Gn = e.useRef(St?.collapsedIds != null);
969
974
  e.useEffect(() => {
970
- if (Un.current || se == null || U.length === 0) return;
971
- Un.current = !0;
975
+ if (Gn.current || ce == null || U.length === 0) return;
976
+ Gn.current = !0;
972
977
  let e = new Map(U.map((e) => [String(e.id), e])), t = /* @__PURE__ */ new Set();
973
978
  for (let n of U) {
974
979
  let r = n.parent != null && n.parent !== "" ? String(n.parent) : null;
@@ -981,10 +986,10 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
981
986
  }, r = /* @__PURE__ */ new Set();
982
987
  for (let e of U) {
983
988
  let i = String(e.id);
984
- t.has(i) && n(e) >= se && r.add(i);
989
+ t.has(i) && n(e) >= ce && r.add(i);
985
990
  }
986
- r.size && Vn((e) => e.size ? e : r);
987
- }, [se, U]);
991
+ r.size && Un((e) => e.size ? e : r);
992
+ }, [ce, U]);
988
993
  let K = e.useMemo(() => {
989
994
  let e = new Set(U.map((e) => String(e.id))), t = /* @__PURE__ */ new Map(), n = [];
990
995
  for (let r of U) {
@@ -1009,7 +1014,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1009
1014
  for (let a of s) {
1010
1015
  let s = i(a, n);
1011
1016
  (!e || s.start < e) && (e = s.start), (!t || s.end > t) && (t = s.end);
1012
- let c = Math.max(s.end.getTime() - s.start.getTime(), rt);
1017
+ let c = Math.max(s.end.getTime() - s.start.getTime(), it);
1013
1018
  r += c * s.progress, o += c;
1014
1019
  }
1015
1020
  n.delete(a), c = {
@@ -1025,7 +1030,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1025
1030
  let r = String(e.id);
1026
1031
  if (o.has(r)) return;
1027
1032
  o.add(r);
1028
- let l = t.get(r) ?? [], u = l.length > 0, d = u || e.type === "summary", f = u && ce === "self" && e.hasOwnDates !== !1, p = u && !f ? i(e, /* @__PURE__ */ new Set()) : {
1033
+ let l = t.get(r) ?? [], u = l.length > 0, d = u || e.type === "summary", f = u && le === "self" && e.hasOwnDates !== !1, p = u && !f ? i(e, /* @__PURE__ */ new Set()) : {
1029
1034
  start: e.start,
1030
1035
  end: e.end,
1031
1036
  progress: e.progress
@@ -1037,32 +1042,34 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1037
1042
  isSummary: d,
1038
1043
  isMilestone: m,
1039
1044
  ...p
1040
- }), u) if (Bn.has(r)) s(e);
1041
- else for (let e of l) c(e, n + 1);
1045
+ }), u) {
1046
+ if (Hn.has(r)) s(e);
1047
+ else for (let e of l) c(e, n + 1);
1048
+ }
1042
1049
  };
1043
1050
  for (let e of n) c(e, 0);
1044
1051
  for (let e of U) o.has(String(e.id)) || c(e, 0);
1045
1052
  return a;
1046
1053
  }, [
1047
1054
  U,
1048
- Bn,
1049
- ce
1050
- ]), Wn = e.useCallback((e) => {
1055
+ Hn,
1056
+ le
1057
+ ]), Kn = e.useCallback((e) => {
1051
1058
  if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;
1052
1059
  if ((e.ctrlKey || e.metaKey) && (e.key === "z" || e.key === "Z")) {
1053
- e.preventDefault(), e.shiftKey ? fn() : dn();
1060
+ e.preventDefault(), e.shiftKey ? pn() : fn();
1054
1061
  return;
1055
1062
  }
1056
1063
  if ((e.ctrlKey || e.metaKey) && (e.key === "y" || e.key === "Y")) {
1057
- e.preventDefault(), fn();
1064
+ e.preventDefault(), pn();
1058
1065
  return;
1059
1066
  }
1060
1067
  if (!K.length) return;
1061
- let t = Fn == null ? -1 : K.findIndex((e) => String(e.task.id) === String(Fn));
1068
+ let t = Ln == null ? -1 : K.findIndex((e) => String(e.task.id) === String(Ln));
1062
1069
  if (e.key === "ArrowDown" || e.key === "ArrowUp") {
1063
1070
  e.preventDefault();
1064
1071
  let n = e.key === "ArrowDown" ? Math.min(K.length - 1, t + 1) : Math.max(0, t <= 0 ? 0 : t - 1);
1065
- In(K[n].task.id);
1072
+ Rn(K[n].task.id);
1066
1073
  let r = Z.current;
1067
1074
  if (r) {
1068
1075
  let e = n * B;
@@ -1072,31 +1079,31 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1072
1079
  }
1073
1080
  if (t < 0) return;
1074
1081
  let n = K[t];
1075
- e.key === "Enter" ? (e.preventDefault(), o?.(n.task)) : e.key === "Delete" || e.key === "Backspace" ? qe && (e.preventDefault(), qe(n.task)) : (e.key === "ArrowRight" && n.hasChildren && Bn.has(String(n.task.id)) || e.key === "ArrowLeft" && n.hasChildren && !Bn.has(String(n.task.id))) && (e.preventDefault(), Hn(n.task.id));
1082
+ e.key === "Enter" ? (e.preventDefault(), o?.(n.task)) : e.key === "Delete" || e.key === "Backspace" ? Je && (e.preventDefault(), Je(n.task)) : (e.key === "ArrowRight" && n.hasChildren && Hn.has(String(n.task.id)) || e.key === "ArrowLeft" && n.hasChildren && !Hn.has(String(n.task.id))) && (e.preventDefault(), Wn(n.task.id));
1076
1083
  }, [
1077
1084
  K,
1078
- Fn,
1085
+ Ln,
1079
1086
  o,
1080
- qe,
1081
- Bn,
1087
+ Je,
1082
1088
  Hn,
1089
+ Wn,
1083
1090
  B,
1084
- dn,
1085
- fn
1091
+ fn,
1092
+ pn
1086
1093
  ]), q = e.useMemo(() => {
1087
- let e = M ? new Date(M) : x.now(), t = N ? new Date(N) : x.now();
1088
- return !M && j.length > 0 && (e = new Date(Math.min(...j.map((e) => e.start.getTime()))), e.setDate(e.getDate() - 7)), !N && j.length > 0 && (t = new Date(Math.max(...j.map((e) => e.end.getTime()))), t.setDate(t.getDate() + 14)), e = V === "day" && v && v.bands.length > 0 ? Ge(e, v.dayStartMin) : at(e, V), t.setHours(23, 59, 59, 999), {
1094
+ let e = j ? new Date(j) : x.now(), t = M ? new Date(M) : x.now();
1095
+ return !j && S.length > 0 && (e = new Date(Math.min(...S.map((e) => e.start.getTime()))), e.setDate(e.getDate() - 7)), !M && S.length > 0 && (t = new Date(Math.max(...S.map((e) => e.end.getTime()))), t.setDate(t.getDate() + 14)), e = V === "day" && v && v.bands.length > 0 ? qe(e, v.dayStartMin) : st(e, V), t.setHours(23, 59, 59, 999), {
1089
1096
  start: e,
1090
1097
  end: t
1091
1098
  };
1092
1099
  }, [
1093
- M,
1094
- N,
1095
1100
  j,
1101
+ M,
1102
+ S,
1096
1103
  V,
1097
1104
  v,
1098
1105
  x
1099
- ]), Gn = V === "day" && !!v && v.bands.length > 0, Kn = !Gn && V === "day" && !!_ && (!!_.skipWeekends || !!(_.holidays && _.holidays.size)), qn = e.useCallback((e) => {
1106
+ ]), qn = V === "day" && !!v && v.bands.length > 0, Jn = !qn && V === "day" && !!_ && (!!_.skipWeekends || !!(_.holidays && _.holidays.size)), Yn = e.useCallback((e) => {
1100
1107
  if (!_) return !0;
1101
1108
  if (_.skipWeekends) {
1102
1109
  let t = e.getDay();
@@ -1109,10 +1116,10 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1109
1116
  return !0;
1110
1117
  }, [_]), J = e.useMemo(() => {
1111
1118
  let e = [];
1112
- if (Gn && v) {
1119
+ if (qn && v) {
1113
1120
  let t = new Date(q.start);
1114
1121
  for (; t <= q.end;) for (let n of v.bands) {
1115
- let r = n.durMs / rt * It;
1122
+ let r = n.durMs / it * Lt;
1116
1123
  e.push({
1117
1124
  date: new Date(t),
1118
1125
  label: n.label,
@@ -1126,12 +1133,12 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1126
1133
  }
1127
1134
  let t = new Date(q.start);
1128
1135
  for (; t <= q.end;) {
1129
- let n = st(t, 1, V);
1130
- if (Kn && !qn(t)) {
1136
+ let n = lt(t, 1, V);
1137
+ if (Jn && !Yn(t)) {
1131
1138
  t = n;
1132
1139
  continue;
1133
1140
  }
1134
- let r = (n.getTime() - t.getTime()) / rt * It, i, a;
1141
+ let r = (n.getTime() - t.getTime()) / it * Lt, i, a;
1135
1142
  V === "day" ? (i = String(t.getDate()), a = t.toLocaleDateString(F, { weekday: "narrow" })) : i = V === "week" ? t.toLocaleDateString(F, {
1136
1143
  month: "numeric",
1137
1144
  day: "numeric"
@@ -1147,34 +1154,34 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1147
1154
  }, [
1148
1155
  q,
1149
1156
  V,
1150
- It,
1157
+ Lt,
1151
1158
  F,
1152
- Kn,
1159
+ Jn,
1160
+ Yn,
1153
1161
  qn,
1154
- Gn,
1155
1162
  v
1156
1163
  ]), Y = e.useMemo(() => {
1157
1164
  let e = Array(J.length + 1), t = 0;
1158
1165
  for (let n = 0; n < J.length; n++) e[n] = t, t += J[n].width;
1159
1166
  return e[J.length] = t, e;
1160
- }, [J]), Jn = Y[Y.length - 1], Yn = e.useMemo(() => J.map((e) => e.date.getTime()), [J]), Xn = e.useMemo(() => J.map((e) => e.realMs == null ? st(e.date, 1, V).getTime() - e.date.getTime() : e.realMs), [J, V]), X = e.useCallback((e) => {
1167
+ }, [J]), Xn = Y[Y.length - 1], Zn = e.useMemo(() => J.map((e) => e.date.getTime()), [J]), Qn = e.useMemo(() => J.map((e) => e.realMs == null ? lt(e.date, 1, V).getTime() - e.date.getTime() : e.realMs), [J, V]), X = e.useCallback((e) => {
1161
1168
  let t = J.length;
1162
1169
  if (t === 0) return 0;
1163
1170
  let n = e.getTime(), r = 0, i = t - 1, a = 0;
1164
1171
  for (; r <= i;) {
1165
1172
  let e = r + i >> 1;
1166
- Yn[e] <= n ? (a = e, r = e + 1) : i = e - 1;
1173
+ Zn[e] <= n ? (a = e, r = e + 1) : i = e - 1;
1167
1174
  }
1168
- let o = Xn[a] || 864e5, s = (n - Yn[a]) / o;
1169
- return (Kn || Gn) && (s = Math.max(0, Math.min(s, 1))), Y[a] + s * J[a].width;
1175
+ let o = Qn[a] || 864e5, s = (n - Zn[a]) / o;
1176
+ return (Jn || qn) && (s = Math.max(0, Math.min(s, 1))), Y[a] + s * J[a].width;
1170
1177
  }, [
1171
1178
  J,
1172
- Yn,
1173
- Xn,
1179
+ Zn,
1180
+ Qn,
1174
1181
  Y,
1175
- Kn,
1176
- Gn
1177
- ]), Zn = e.useCallback((e) => {
1182
+ Jn,
1183
+ qn
1184
+ ]), $n = e.useCallback((e) => {
1178
1185
  let t = J.length;
1179
1186
  if (t === 0) return new Date(q.start);
1180
1187
  let n = 0, r = t - 1, i = 0;
@@ -1183,44 +1190,44 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1183
1190
  Y[t] <= e ? (i = t, n = t + 1) : r = t - 1;
1184
1191
  }
1185
1192
  let a = J[i].width || 1, o = (e - Y[i]) / a;
1186
- return new Date(Yn[i] + o * (Xn[i] || 864e5));
1193
+ return new Date(Zn[i] + o * (Qn[i] || 864e5));
1187
1194
  }, [
1188
1195
  J,
1189
- Yn,
1190
- Xn,
1196
+ Zn,
1197
+ Qn,
1191
1198
  Y,
1192
1199
  q
1193
- ]), Qn = e.useCallback((e) => {
1200
+ ]), er = e.useCallback((e) => {
1194
1201
  let t = Z.current;
1195
- Ot.current == null && t && t.clientWidth > 0 && (Ot.current = Zn(t.scrollLeft)), Dt.current = Ot.current, kt.current = !0, Et(e), l?.(e);
1196
- }, [l, Zn]);
1202
+ kt.current == null && t && t.clientWidth > 0 && (kt.current = $n(t.scrollLeft)), Ot.current = kt.current, At.current = !0, Dt(e), l?.(e);
1203
+ }, [l, $n]);
1197
1204
  e.useLayoutEffect(() => {
1198
- let e = Dt.current;
1205
+ let e = Ot.current;
1199
1206
  if (e == null) return;
1200
- Dt.current = null;
1207
+ Ot.current = null;
1201
1208
  let t = Z.current;
1202
1209
  if (!t || t.clientWidth === 0) return;
1203
- let n = Math.max(0, t.scrollWidth - t.clientWidth), r = Math.max(0, Math.min(Math.round(X(at(e, V))), n));
1210
+ let n = Math.max(0, t.scrollWidth - t.clientWidth), r = Math.max(0, Math.min(Math.round(X(st(e, V))), n));
1204
1211
  t.scrollLeft !== r && (t.scrollLeft = r);
1205
1212
  }, [V, X]);
1206
- let $n = e.useCallback((e, t) => {
1213
+ let tr = e.useCallback((e, t) => {
1207
1214
  let n = J.length;
1208
1215
  if (n === 0 || t === 0) return new Date(e);
1209
1216
  let r = e.getTime(), i = 0, a = n - 1, o = 0;
1210
1217
  for (; i <= a;) {
1211
1218
  let e = i + a >> 1;
1212
- Yn[e] <= r ? (o = e, i = e + 1) : a = e - 1;
1219
+ Zn[e] <= r ? (o = e, i = e + 1) : a = e - 1;
1213
1220
  }
1214
- let s = Math.min(n - 1, Math.max(0, o + t)), c = r - Yn[o];
1215
- return new Date(Yn[s] + c);
1216
- }, [J, Yn]), er = e.useRef(null);
1217
- er.current = Kn || Gn ? $n : null;
1218
- let tr = e.useMemo(() => {
1221
+ let s = Math.min(n - 1, Math.max(0, o + t)), c = r - Zn[o];
1222
+ return new Date(Zn[s] + c);
1223
+ }, [J, Zn]), nr = e.useRef(null);
1224
+ nr.current = Jn || qn ? tr : null;
1225
+ let rr = e.useMemo(() => {
1219
1226
  let e = [];
1220
- if (Gn && v) {
1227
+ if (qn && v) {
1221
1228
  let t = 0;
1222
1229
  for (let n of J) {
1223
- let r = String(Ge(n.date, v.dayStartMin).getTime()), i = e[e.length - 1];
1230
+ let r = String(qe(n.date, v.dayStartMin).getTime()), i = e[e.length - 1];
1224
1231
  i && i.key === r ? i.width += n.width : e.push({
1225
1232
  key: r,
1226
1233
  label: n.date.toLocaleDateString(F, {
@@ -1251,9 +1258,9 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1251
1258
  J,
1252
1259
  V,
1253
1260
  F,
1254
- Gn,
1261
+ qn,
1255
1262
  v
1256
- ]), nr = e.useMemo(() => (Me ?? []).map((e, t) => {
1263
+ ]), ir = e.useMemo(() => (N ?? []).map((e, t) => {
1257
1264
  let n = e.date instanceof Date ? e.date : new Date(e.date);
1258
1265
  return {
1259
1266
  index: t,
@@ -1263,15 +1270,15 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1263
1270
  valid: !isNaN(n.getTime()) && n >= q.start && n <= q.end
1264
1271
  };
1265
1272
  }).filter((e) => e.valid), [
1266
- Me,
1273
+ N,
1267
1274
  q,
1268
1275
  X
1269
- ]), rr = e.useRef(null), ir = e.useRef(null), ar = e.useRef(null), Z = e.useRef(null);
1276
+ ]), ar = e.useRef(null), or = e.useRef(null), sr = e.useRef(null), Z = e.useRef(null);
1270
1277
  e.useEffect(() => {
1271
1278
  let e = Z.current;
1272
1279
  if (!e) return;
1273
1280
  let t = () => {
1274
- kt.current = !1;
1281
+ At.current = !1;
1275
1282
  }, n = /* @__PURE__ */ new Set([
1276
1283
  "ArrowLeft",
1277
1284
  "ArrowRight",
@@ -1290,103 +1297,103 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1290
1297
  e.removeEventListener("wheel", t), e.removeEventListener("touchstart", t), e.removeEventListener("pointerdown", t), e.removeEventListener("keydown", r);
1291
1298
  };
1292
1299
  }, []);
1293
- let [or, sr] = e.useState(null), cr = e.useRef([]), lr = e.useRef(null), [ur, dr] = e.useState({
1300
+ let [cr, lr] = e.useState(null), ur = e.useRef([]), dr = e.useRef(null), [fr, pr] = e.useState({
1294
1301
  top: 0,
1295
1302
  left: 0
1296
- }), [fr, pr] = e.useState({
1303
+ }), [mr, hr] = e.useState({
1297
1304
  width: 4e3,
1298
1305
  height: 600
1299
- }), mr = e.useCallback(() => {
1306
+ }), gr = e.useCallback(() => {
1300
1307
  let e = Z.current;
1301
1308
  if (!e) return;
1302
1309
  let t = e.clientWidth || 4e3, n = e.clientHeight || 600;
1303
- pr((e) => e.width === t && e.height === n ? e : {
1310
+ hr((e) => e.width === t && e.height === n ? e : {
1304
1311
  width: t,
1305
1312
  height: n
1306
1313
  });
1307
1314
  }, []);
1308
1315
  e.useLayoutEffect(() => {
1309
- mr();
1316
+ gr();
1310
1317
  let e = Z.current;
1311
1318
  if (!e || typeof ResizeObserver > "u") return;
1312
- let t = new ResizeObserver(mr);
1319
+ let t = new ResizeObserver(gr);
1313
1320
  return t.observe(e), () => t.disconnect();
1314
- }, [mr]);
1315
- let hr = e.useMemo(() => ot(Y, ur.left - 240, ur.left + fr.width + 240), [
1321
+ }, [gr]);
1322
+ let _r = e.useMemo(() => ct(Y, fr.left - 240, fr.left + mr.width + 240), [
1316
1323
  Y,
1317
- ur.left,
1318
- fr.width
1319
- ]), gr = e.useMemo(() => {
1320
- let e = tr.map((e) => e.offset);
1321
- return e.push(Jn), e;
1322
- }, [tr, Jn]), _r = e.useMemo(() => ot(gr, ur.left - 240, ur.left + fr.width + 240), [
1323
- gr,
1324
- ur.left,
1325
- fr.width
1324
+ fr.left,
1325
+ mr.width
1326
+ ]), vr = e.useMemo(() => {
1327
+ let e = rr.map((e) => e.offset);
1328
+ return e.push(Xn), e;
1329
+ }, [rr, Xn]), yr = e.useMemo(() => ct(vr, fr.left - 240, fr.left + mr.width + 240), [
1330
+ vr,
1331
+ fr.left,
1332
+ mr.width
1326
1333
  ]), Q = e.useMemo(() => ({
1327
- startIdx: Math.max(0, Math.floor(ur.top / B) - 6),
1328
- endIdx: Math.min(K.length, Math.ceil((ur.top + fr.height) / B) + 6)
1334
+ startIdx: Math.max(0, Math.floor(fr.top / B) - 6),
1335
+ endIdx: Math.min(K.length, Math.ceil((fr.top + mr.height) / B) + 6)
1329
1336
  }), [
1330
- ur.top,
1331
- fr.height,
1337
+ fr.top,
1338
+ mr.height,
1332
1339
  B,
1333
1340
  K.length
1334
- ]), vr = K.length * B, [yr, br] = e.useState(!1);
1341
+ ]), br = K.length * B, [xr, Sr] = e.useState(!1);
1335
1342
  e.useEffect(() => {
1336
- let e = () => br(!!document.fullscreenElement);
1343
+ let e = () => Sr(!!document.fullscreenElement);
1337
1344
  return document.addEventListener("fullscreenchange", e), () => document.removeEventListener("fullscreenchange", e);
1338
1345
  }, []);
1339
- let xr = e.useCallback(() => {
1340
- let e = Fe.current;
1346
+ let Cr = e.useCallback(() => {
1347
+ let e = I.current;
1341
1348
  e && (document.fullscreenElement ? document.exitFullscreen?.() : e.requestFullscreen?.());
1342
- }, []), Sr = e.useRef(null), Cr = e.useCallback((e) => {
1349
+ }, []), wr = e.useRef(null), Tr = e.useCallback((e) => {
1343
1350
  if (e.touches.length === 2) {
1344
1351
  let t = e.touches[0].clientX - e.touches[1].clientX, n = e.touches[0].clientY - e.touches[1].clientY;
1345
- Sr.current = {
1352
+ wr.current = {
1346
1353
  baseDistance: Math.max(1, Math.sqrt(t * t + n * n)),
1347
- baseColumn: Ft
1354
+ baseColumn: It
1348
1355
  };
1349
1356
  }
1350
- }, [Ft]), wr = e.useCallback((e) => {
1351
- if (e.touches.length !== 2 || !Sr.current) return;
1352
- 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)) / Sr.current.baseDistance, i = Math.max(15, Math.min(120, Math.round(Sr.current.baseColumn * r)));
1353
- Ct(i);
1354
- }, []), Tr = e.useCallback(() => {
1355
- Sr.current = null;
1356
- }, []), Er = e.useMemo(() => {
1357
+ }, [It]), Er = e.useCallback((e) => {
1358
+ if (e.touches.length !== 2 || !wr.current) return;
1359
+ 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)) / wr.current.baseDistance, i = Math.max(15, Math.min(120, Math.round(wr.current.baseColumn * r)));
1360
+ wt(i);
1361
+ }, []), Dr = e.useCallback(() => {
1362
+ wr.current = null;
1363
+ }, []), Or = e.useMemo(() => {
1357
1364
  let e = x.now();
1358
1365
  return e < q.start || e > q.end ? null : Math.round(X(e));
1359
1366
  }, [
1360
1367
  q,
1361
1368
  X,
1362
1369
  x
1363
- ]), Dr = e.useCallback(() => {
1364
- if (Er == null || !Z.current) return;
1365
- let e = Math.max(0, Er - Z.current.clientWidth / 2);
1370
+ ]), kr = e.useCallback(() => {
1371
+ if (Or == null || !Z.current) return;
1372
+ let e = Math.max(0, Or - Z.current.clientWidth / 2);
1366
1373
  Z.current.scrollTo({
1367
1374
  left: e,
1368
1375
  behavior: "smooth"
1369
1376
  });
1370
- }, [Er]), Or = e.useRef(!1);
1377
+ }, [Or]), Ar = e.useRef(!1);
1371
1378
  e.useEffect(() => {
1372
- if (Or.current || j.length === 0) return;
1379
+ if (Ar.current || S.length === 0) return;
1373
1380
  let e = window.requestAnimationFrame(() => {
1374
1381
  let e = Z.current;
1375
1382
  if (!e || e.clientWidth === 0) return;
1376
- let t = Er;
1383
+ let t = Or;
1377
1384
  if (t == null) {
1378
- let e = new Date(Math.min(...j.map((e) => e.start.getTime())));
1385
+ let e = new Date(Math.min(...S.map((e) => e.start.getTime())));
1379
1386
  t = Math.round(X(e));
1380
1387
  }
1381
- e.scrollLeft = Math.max(0, t - e.clientWidth / 2), Or.current = !0;
1388
+ e.scrollLeft = Math.max(0, t - e.clientWidth / 2), Ar.current = !0;
1382
1389
  });
1383
1390
  return () => window.cancelAnimationFrame(e);
1384
1391
  }, [
1385
- j,
1386
- Er,
1392
+ S,
1393
+ Or,
1387
1394
  X
1388
1395
  ]);
1389
- let kr = e.useCallback((e, t = "left") => {
1396
+ let jr = e.useCallback((e, t = "left") => {
1390
1397
  let n = Z.current;
1391
1398
  if (!n || e < q.start || e > q.end) return !1;
1392
1399
  let r = Math.round(X(e)), i = t === "center" ? r - n.clientWidth / 2 : r - 24;
@@ -1394,17 +1401,17 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1394
1401
  left: Math.max(0, i),
1395
1402
  behavior: "smooth"
1396
1403
  }), !0;
1397
- }, [q, X]), Ar = e.useCallback((e, t, n) => {
1404
+ }, [q, X]), Mr = e.useCallback((e, t, n) => {
1398
1405
  let r = Z.current;
1399
1406
  if (!r) return;
1400
1407
  let i = X(e), a = X(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));
1401
- cr.current.forEach((e) => window.clearTimeout(e)), cr.current = [], lr.current?.(), lr.current = null, sr(null);
1408
+ ur.current.forEach((e) => window.clearTimeout(e)), ur.current = [], dr.current?.(), dr.current = null, lr(null);
1402
1409
  let u = () => {
1403
1410
  if (n == null) return;
1404
1411
  let e = window.requestAnimationFrame(() => {
1405
- sr(n), cr.current.push(window.setTimeout(() => sr((e) => e === n ? null : e), 1500));
1412
+ lr(n), ur.current.push(window.setTimeout(() => lr((e) => e === n ? null : e), 1500));
1406
1413
  });
1407
- lr.current = () => window.cancelAnimationFrame(e);
1414
+ dr.current = () => window.cancelAnimationFrame(e);
1408
1415
  }, d = Math.abs(r.scrollLeft - l) > 2;
1409
1416
  if (r.scrollTo({
1410
1417
  left: l,
@@ -1416,13 +1423,13 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1416
1423
  let f = "onscrollend" in r, p = !1, m = () => {
1417
1424
  p || (p = !0, r.removeEventListener("scrollend", m), u());
1418
1425
  };
1419
- r.addEventListener("scrollend", m), cr.current.push(window.setTimeout(m, f ? 1500 : 500)), lr.current = () => r.removeEventListener("scrollend", m);
1426
+ r.addEventListener("scrollend", m), ur.current.push(window.setTimeout(m, f ? 1500 : 500)), dr.current = () => r.removeEventListener("scrollend", m);
1420
1427
  }, [X]);
1421
1428
  e.useEffect(() => () => {
1422
- cr.current.forEach((e) => window.clearTimeout(e)), lr.current?.();
1429
+ ur.current.forEach((e) => window.clearTimeout(e)), dr.current?.();
1423
1430
  }, []);
1424
- let jr = e.useCallback(() => kr(at(x.now(), "week")), [kr, x]), Mr = e.useCallback(() => kr(at(x.now(), "month")), [kr, x]), Nr = e.useRef(null), Pr = e.useRef(null), Fr = e.useRef(null), Ir = e.useRef(null), Lr = e.useRef(null), Rr = e.useRef(null), zr = e.useRef(null), Br = e.useRef(null), Vr = e.useCallback(() => {
1425
- let e = ar.current, t = Nr.current, n = Pr.current, r = Fr.current;
1431
+ let Nr = e.useCallback(() => jr(st(x.now(), "week")), [jr, x]), Pr = e.useCallback(() => jr(st(x.now(), "month")), [jr, x]), Fr = e.useRef(null), Ir = e.useRef(null), Lr = e.useRef(null), Rr = e.useRef(null), zr = e.useRef(null), Br = e.useRef(null), Vr = e.useRef(null), Hr = e.useRef(null), Ur = e.useCallback(() => {
1432
+ let e = sr.current, t = Fr.current, n = Ir.current, r = Lr.current;
1426
1433
  if (e && t && n && r) {
1427
1434
  let i = e.scrollWidth > e.clientWidth + 1;
1428
1435
  if (t.style.display = i ? "block" : "none", i) {
@@ -1433,7 +1440,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1433
1440
  }
1434
1441
  }
1435
1442
  }
1436
- let i = Lr.current, a = Rr.current, o = zr.current;
1443
+ let i = zr.current, a = Br.current, o = Vr.current;
1437
1444
  if (e && i && a && o) {
1438
1445
  let t = e.scrollHeight > e.clientHeight + 1;
1439
1446
  if (i.style.display = t ? "block" : "none", t) {
@@ -1446,106 +1453,106 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1446
1453
  }
1447
1454
  }, []);
1448
1455
  e.useEffect(() => {
1449
- Vr();
1456
+ Ur();
1450
1457
  });
1451
- let Hr = (e) => {
1458
+ let Wr = (e) => {
1452
1459
  if (e.button !== 0) return;
1453
1460
  e.preventDefault(), e.stopPropagation();
1454
- let t = ar.current, n = Pr.current, r = Fr.current;
1461
+ let t = sr.current, n = Ir.current, r = Lr.current;
1455
1462
  if (!t || !n || !r) return;
1456
- Ir.current = {
1463
+ Rr.current = {
1457
1464
  startX: e.clientX,
1458
1465
  startLeft: t.scrollLeft
1459
1466
  };
1460
1467
  let i = n.clientWidth, a = r.getBoundingClientRect().width, o = t.scrollWidth - t.clientWidth, s = i - a > 0 ? o / (i - a) : 0, c = (e) => {
1461
- let n = Ir.current;
1468
+ let n = Rr.current;
1462
1469
  n && (t.scrollLeft = n.startLeft + (e.clientX - n.startX) * s);
1463
1470
  }, l = () => {
1464
- Ir.current = null, window.removeEventListener("pointermove", c), window.removeEventListener("pointerup", l), window.removeEventListener("pointercancel", l);
1471
+ Rr.current = null, window.removeEventListener("pointermove", c), window.removeEventListener("pointerup", l), window.removeEventListener("pointercancel", l);
1465
1472
  };
1466
1473
  window.addEventListener("pointermove", c), window.addEventListener("pointerup", l), window.addEventListener("pointercancel", l);
1467
- }, Ur = (e) => {
1474
+ }, Gr = (e) => {
1468
1475
  if (e.button !== 0 || e.target !== e.currentTarget) return;
1469
- let t = ar.current, n = Pr.current, r = Fr.current;
1476
+ let t = sr.current, n = Ir.current, r = Lr.current;
1470
1477
  if (!t || !n || !r) return;
1471
1478
  let i = n.getBoundingClientRect(), a = r.getBoundingClientRect().width, o = t.scrollWidth - t.clientWidth, s = i.width - a;
1472
1479
  s <= 0 || (t.scrollLeft = Math.min(Math.max(e.clientX - i.x - a / 2, 0), s) / s * o);
1473
- }, Wr = (e) => {
1480
+ }, Kr = (e) => {
1474
1481
  if (e.button !== 0) return;
1475
1482
  e.preventDefault(), e.stopPropagation();
1476
- let t = ar.current, n = Rr.current, r = zr.current;
1483
+ let t = sr.current, n = Br.current, r = Vr.current;
1477
1484
  if (!t || !n || !r) return;
1478
- Br.current = {
1485
+ Hr.current = {
1479
1486
  startY: e.clientY,
1480
1487
  startTop: t.scrollTop
1481
1488
  };
1482
1489
  let i = n.clientHeight, a = r.getBoundingClientRect().height, o = t.scrollHeight - t.clientHeight, s = i - a > 0 ? o / (i - a) : 0, c = (e) => {
1483
- let n = Br.current;
1490
+ let n = Hr.current;
1484
1491
  n && (t.scrollTop = n.startTop + (e.clientY - n.startY) * s);
1485
1492
  }, l = () => {
1486
- Br.current = null, window.removeEventListener("pointermove", c), window.removeEventListener("pointerup", l), window.removeEventListener("pointercancel", l);
1493
+ Hr.current = null, window.removeEventListener("pointermove", c), window.removeEventListener("pointerup", l), window.removeEventListener("pointercancel", l);
1487
1494
  };
1488
1495
  window.addEventListener("pointermove", c), window.addEventListener("pointerup", l), window.addEventListener("pointercancel", l);
1489
- }, Gr = (e) => {
1496
+ }, qr = (e) => {
1490
1497
  if (e.button !== 0 || e.target !== e.currentTarget) return;
1491
- let t = ar.current, n = Rr.current, r = zr.current;
1498
+ let t = sr.current, n = Br.current, r = Vr.current;
1492
1499
  if (!t || !n || !r) return;
1493
1500
  let i = n.getBoundingClientRect(), a = r.getBoundingClientRect().height, o = t.scrollHeight - t.clientHeight, s = i.height - a;
1494
1501
  s <= 0 || (t.scrollTop = Math.min(Math.max(e.clientY - i.y - a / 2, 0), s) / s * o);
1495
- }, Kr = (e) => {
1502
+ }, Jr = (e) => {
1496
1503
  let t = e.currentTarget;
1497
- !kt.current && t.clientWidth > 0 && (Ot.current = Zn(t.scrollLeft)), rr.current && (rr.current.scrollLeft = t.scrollLeft), Vr(), ir.current && ir.current.scrollTop !== t.scrollTop && (ir.current.scrollTop = t.scrollTop), dr((e) => e.top === t.scrollTop && e.left === t.scrollLeft ? e : {
1504
+ !At.current && t.clientWidth > 0 && (kt.current = $n(t.scrollLeft)), ar.current && (ar.current.scrollLeft = t.scrollLeft), Ur(), or.current && or.current.scrollTop !== t.scrollTop && (or.current.scrollTop = t.scrollTop), pr((e) => e.top === t.scrollTop && e.left === t.scrollLeft ? e : {
1498
1505
  top: t.scrollTop,
1499
1506
  left: t.scrollLeft
1500
- }), mr();
1501
- }, qr = (e) => {
1507
+ }), gr();
1508
+ }, Yr = (e) => {
1502
1509
  let t = e.currentTarget, n = Z.current;
1503
- n && n.scrollTop !== t.scrollTop && (n.scrollTop = t.scrollTop), dr((e) => e.top === t.scrollTop ? e : {
1510
+ n && n.scrollTop !== t.scrollTop && (n.scrollTop = t.scrollTop), pr((e) => e.top === t.scrollTop ? e : {
1504
1511
  ...e,
1505
1512
  top: t.scrollTop
1506
1513
  });
1507
- }, Jr = (e, t) => {
1508
- let n = X(e), r = Gn && v ? It * Math.min(...v.bands.map((e) => e.durMs)) / rt : It;
1514
+ }, Xr = (e, t) => {
1515
+ let n = X(e), r = qn && v ? Lt * Math.min(...v.bands.map((e) => e.durMs)) / it : Lt;
1509
1516
  return {
1510
1517
  left: n,
1511
1518
  width: Math.max(X(t) - n, r, 3)
1512
1519
  };
1513
- }, Yr = W?.group ? W.taskId : null, Xr = e.useMemo(() => {
1514
- if (Yr == null) return null;
1515
- let e = /* @__PURE__ */ new Set([String(Yr)]);
1516
- for (let t of Kt(Yr)) t.locked || e.add(String(t.id));
1520
+ }, Zr = W?.group ? W.taskId : null, Qr = e.useMemo(() => {
1521
+ if (Zr == null) return null;
1522
+ let e = /* @__PURE__ */ new Set([String(Zr)]);
1523
+ for (let t of qt(Zr)) t.locked || e.add(String(t.id));
1517
1524
  return e;
1518
- }, [Yr, Kt]), Zr = e.useMemo(() => {
1525
+ }, [Zr, qt]), $r = e.useMemo(() => {
1519
1526
  if (!W || W.group) return null;
1520
- let e = /* @__PURE__ */ new Set(), t = /* @__PURE__ */ new Set(), n = Gt.get(String(W.taskId));
1527
+ let e = /* @__PURE__ */ new Set(), t = /* @__PURE__ */ new Set(), n = Kt.get(String(W.taskId));
1521
1528
  for (; n && n.parent != null && n.parent !== "";) {
1522
1529
  let r = String(n.parent);
1523
- if (t.has(r) || !Gt.has(r)) break;
1524
- t.add(r), e.add(r), n = Gt.get(r);
1530
+ if (t.has(r) || !Kt.has(r)) break;
1531
+ t.add(r), e.add(r), n = Kt.get(r);
1525
1532
  }
1526
1533
  return e.size ? e : null;
1527
- }, [W, Gt]), Qr = (e) => {
1534
+ }, [W, Kt]), ei = (e) => {
1528
1535
  if (W) {
1529
- if (Xr?.has(String(e.task.id))) {
1530
- let t = Xt(W).start.getTime() - W.originStart.getTime();
1531
- return Jr(new Date(e.start.getTime() + t), new Date(e.end.getTime() + t));
1536
+ if (Qr?.has(String(e.task.id))) {
1537
+ let t = Zt(W).start.getTime() - W.originStart.getTime();
1538
+ return Xr(new Date(e.start.getTime() + t), new Date(e.end.getTime() + t));
1532
1539
  }
1533
1540
  if (W.taskId === e.task.id && !W.group) {
1534
- let e = Xt(W);
1535
- return Jr(e.start, e.end);
1541
+ let e = Zt(W);
1542
+ return Xr(e.start, e.end);
1536
1543
  }
1537
- if (e.isSummary && Zr?.has(String(e.task.id)) && (ce !== "self" || e.task.hasOwnDates === !1)) {
1538
- let t = Xt(W), n = String(W.taskId), r = null, i = null;
1539
- for (let a of Kt(e.task.id)) {
1540
- if ((Wt.get(String(a.id)) ?? []).length !== 0) continue;
1544
+ if (e.isSummary && $r?.has(String(e.task.id)) && (le !== "self" || e.task.hasOwnDates === !1)) {
1545
+ let t = Zt(W), n = String(W.taskId), r = null, i = null;
1546
+ for (let a of qt(e.task.id)) {
1547
+ if ((Gt.get(String(a.id)) ?? []).length !== 0) continue;
1541
1548
  let e = String(a.id) === n ? t.start : a.start, o = String(a.id) === n ? t.end : a.end;
1542
1549
  (!r || e < r) && (r = e), (!i || o > i) && (i = o);
1543
1550
  }
1544
- if (r && i) return Jr(r, i);
1551
+ if (r && i) return Xr(r, i);
1545
1552
  }
1546
1553
  }
1547
- return Jr(e.start, e.end);
1548
- }, $r = e.useMemo(() => {
1554
+ return Xr(e.start, e.end);
1555
+ }, ti = e.useMemo(() => {
1549
1556
  let e = /* @__PURE__ */ new Map();
1550
1557
  K.forEach((t, n) => e.set(String(t.task.id), n));
1551
1558
  let t = [];
@@ -1566,47 +1573,47 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1566
1573
  });
1567
1574
  }
1568
1575
  }), t;
1569
- }, [K]), ei = Math.max(2, Math.round(B / 2) - 14), ti = B - ei * 2, ni = Math.round(ti / 2), ri = Math.max(Math.round(B * .4), 12), ii = ri * Math.SQRT2 / 2, ai = ti, oi = ei, si = Math.max(3, Math.round(B * .13)), ci = B - si - 1, li = "rgba(100, 116, 139, 0.35)", ui = "rgba(100, 116, 139, 0.6)", di = (e) => {
1576
+ }, [K]), ni = Math.max(2, Math.round(B / 2) - 14), ri = B - ni * 2, ii = Math.round(ri / 2), ai = Math.max(Math.round(B * .4), 12), oi = ai * Math.SQRT2 / 2, si = ri, ci = ni, li = Math.max(3, Math.round(B * .13)), ui = B - li - 1, di = "rgba(100, 116, 139, 0.35)", fi = "rgba(100, 116, 139, 0.6)", pi = (e) => {
1570
1577
  let t = K[e.sourceIndex], n = K[e.targetIndex];
1571
1578
  if (!t || !n) return null;
1572
- let r = Qr(t), i = Qr(n), a = (e) => e.isSummary ? oi + ai / 2 : B / 2, o = e.sourceIndex * B + a(t), s = e.targetIndex * B + a(n), c = e.type === "fs" || e.type === "ff", l = e.type === "ff" || e.type === "sf", u = t.isMilestone ? r.left + (c ? ii : -ii) : c ? r.left + r.width : r.left, d = n.isMilestone ? i.left + (l ? ii : -ii) : 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)}`];
1579
+ let r = ei(t), i = ei(n), a = (e) => e.isSummary ? ci + si / 2 : B / 2, o = e.sourceIndex * B + a(t), s = e.targetIndex * B + a(n), c = e.type === "fs" || e.type === "ff", l = e.type === "ff" || e.type === "sf", u = t.isMilestone ? r.left + (c ? oi : -oi) : c ? r.left + r.width : r.left, d = n.isMilestone ? i.left + (l ? oi : -oi) : 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)}`];
1573
1580
  if (l ? f >= p : f <= p) h.push(`L ${m(f)} ${m(s)}`, `L ${m(d)} ${m(s)}`);
1574
1581
  else {
1575
1582
  let t = s >= o ? (e.sourceIndex + 1) * B : e.sourceIndex * B;
1576
1583
  h.push(`L ${m(f)} ${m(t)}`, `L ${m(p)} ${m(t)}`, `L ${m(p)} ${m(s)}`, `L ${m(d)} ${m(s)}`);
1577
1584
  }
1578
1585
  return h.join(" ");
1579
- }, fi = W?.taskId ?? Ht, [pi, mi] = e.useState(te), hi = e.useMemo(() => pi ? ze(j, _) : null, [
1580
- pi,
1581
- j,
1586
+ }, mi = W?.taskId ?? Ut, [hi, gi] = e.useState(ne), _i = e.useMemo(() => hi ? Be(S, _) : null, [
1587
+ hi,
1588
+ S,
1582
1589
  _
1583
- ]), gi = e.useCallback((e) => hi?.criticalIds.has(String(e)) ?? !1, [hi]), $ = "#dc2626", [_i, vi] = e.useState(null), [yi, bi] = e.useState(!1);
1590
+ ]), vi = e.useCallback((e) => _i?.criticalIds.has(String(e)) ?? !1, [_i]), $ = "#dc2626", [yi, bi] = e.useState(null), [xi, Si] = e.useState(!1);
1584
1591
  e.useEffect(() => {
1585
- if (!yi) return;
1586
- let e = setTimeout(() => bi(!1), 2500);
1592
+ if (!xi) return;
1593
+ let e = setTimeout(() => Si(!1), 2500);
1587
1594
  return () => clearTimeout(e);
1588
- }, [yi]);
1589
- let xi = e.useCallback(() => {
1595
+ }, [xi]);
1596
+ let Ci = e.useCallback(() => {
1590
1597
  if (!R) return;
1591
- let { changes: e, skippedLocked: t } = Be(j, _, sn);
1598
+ let { changes: e, skippedLocked: t } = Ve(S, _, cn);
1592
1599
  if (!e.length) {
1593
- bi(!0);
1600
+ Si(!0);
1594
1601
  return;
1595
1602
  }
1596
- vi({
1603
+ bi({
1597
1604
  changes: e,
1598
1605
  skipped: t.length
1599
1606
  });
1600
1607
  }, [
1601
- j,
1608
+ S,
1602
1609
  R,
1603
1610
  _,
1604
- sn
1605
- ]), Si = e.useCallback(() => {
1606
- if (!_i) return;
1611
+ cn
1612
+ ]), wi = e.useCallback(() => {
1613
+ if (!yi) return;
1607
1614
  let e = [];
1608
- for (let t of _i.changes) {
1609
- let n = j.find((e) => String(e.id) === t.id);
1615
+ for (let t of yi.changes) {
1616
+ let n = S.find((e) => String(e.id) === t.id);
1610
1617
  n && e.push({
1611
1618
  task: n,
1612
1619
  changes: {
@@ -1615,20 +1622,20 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1615
1622
  }
1616
1623
  });
1617
1624
  }
1618
- e.length && nn(e), vi(null);
1625
+ e.length && rn(e), bi(null);
1619
1626
  }, [
1620
- _i,
1621
- j,
1622
- nn
1623
- ]), Ci = e.useCallback(() => {
1624
- if (typeof document > "u" || !j.length) return null;
1627
+ yi,
1628
+ S,
1629
+ rn
1630
+ ]), Ti = e.useCallback(() => {
1631
+ if (typeof document > "u" || !S.length) return null;
1625
1632
  let e = (e) => String(e).replace(/[&<>"]/g, (e) => ({
1626
1633
  "&": "&amp;",
1627
1634
  "<": "&lt;",
1628
1635
  ">": "&gt;",
1629
1636
  "\"": "&quot;"
1630
- })[e]), t = Math.max(H, 200), n = Math.ceil(t + Jn), r = Math.ceil(36 + K.length * B), i = hi?.criticalEdges ?? null, a = [];
1631
- a.push(`<rect x="0" y="0" width="${n}" height="${r}" fill="#ffffff"/>`), a.push(`<rect x="0" y="0" width="${n}" height="36" fill="#f8fafc"/>`), a.push(`<g transform="translate(${t},0)" font-family="sans-serif" font-size="10" fill="#475569">`), tr.forEach((t) => {
1637
+ })[e]), t = Math.max(H, 200), n = Math.ceil(t + Xn), r = Math.ceil(36 + K.length * B), i = _i?.criticalEdges ?? null, a = [];
1638
+ a.push(`<rect x="0" y="0" width="${n}" height="${r}" fill="#ffffff"/>`), a.push(`<rect x="0" y="0" width="${n}" height="36" fill="#f8fafc"/>`), a.push(`<g transform="translate(${t},0)" font-family="sans-serif" font-size="10" fill="#475569">`), rr.forEach((t) => {
1632
1639
  a.push(`<line x1="${t.offset.toFixed(1)}" y1="0" x2="${t.offset.toFixed(1)}" y2="36" stroke="#e2e8f0"/>`), a.push(`<text x="${(t.offset + t.width / 2).toFixed(1)}" y="12" text-anchor="middle" font-weight="600">${e(t.label)}</text>`);
1633
1640
  }), J.forEach((t, n) => {
1634
1641
  let i = Y[n];
@@ -1652,37 +1659,37 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1652
1659
  };
1653
1660
  a.push(`<g transform="translate(${t},36)" font-family="sans-serif" font-size="9">`), K.forEach((t, n) => {
1654
1661
  if (t.task.type === "group") return;
1655
- let r = n * B, { left: i, width: s } = Jr(t.start, t.end), c = gi(t.task.id), l = c ? ` stroke="${$}" stroke-width="2"` : "";
1656
- if (ne && t.task.baselineStart && t.task.baselineEnd) {
1657
- let e = Jr(t.task.baselineStart, t.task.baselineEnd);
1658
- a.push(`<rect x="${e.left.toFixed(1)}" y="${(r + ci).toFixed(1)}" width="${Math.max(2, e.width).toFixed(1)}" height="${si}" rx="1" fill="${li}" stroke="${ui}"/>`);
1662
+ let r = n * B, { left: i, width: s } = Xr(t.start, t.end), c = vi(t.task.id), l = c ? ` stroke="${$}" stroke-width="2"` : "";
1663
+ if (re && t.task.baselineStart && t.task.baselineEnd) {
1664
+ let e = Xr(t.task.baselineStart, t.task.baselineEnd);
1665
+ a.push(`<rect x="${e.left.toFixed(1)}" y="${(r + ui).toFixed(1)}" width="${Math.max(2, e.width).toFixed(1)}" height="${li}" rx="1" fill="${di}" stroke="${fi}"/>`);
1659
1666
  }
1660
1667
  if (t.isMilestone) {
1661
- let e = i, n = r + B / 2, o = ri / 2, s = c ? $ : t.task.color || "#3b82f6";
1668
+ let e = i, n = r + B / 2, o = ai / 2, s = c ? $ : t.task.color || "#3b82f6";
1662
1669
  a.push(`<polygon points="${e},${n - o} ${e + o},${n} ${e},${n + o} ${e - o},${n}" fill="${s}"/>`);
1663
1670
  } else if (t.isSummary) {
1664
1671
  let n = t.task.color || "#64748b";
1665
- a.push(`<rect x="${i.toFixed(1)}" y="${(r + oi).toFixed(1)}" width="${s.toFixed(1)}" height="${ai}" rx="3" fill="${n}"${l}/>`);
1672
+ a.push(`<rect x="${i.toFixed(1)}" y="${(r + ci).toFixed(1)}" width="${s.toFixed(1)}" height="${si}" rx="3" fill="${n}"${l}/>`);
1666
1673
  let c = s * Math.min(100, Math.max(0, t.progress)) / 100;
1667
- a.push(`<rect x="${i.toFixed(1)}" y="${(r + oi).toFixed(1)}" width="${c.toFixed(1)}" height="${ai}" rx="3" fill="rgba(0,0,0,0.2)"/>`);
1674
+ a.push(`<rect x="${i.toFixed(1)}" y="${(r + ci).toFixed(1)}" width="${c.toFixed(1)}" height="${si}" rx="3" fill="rgba(0,0,0,0.2)"/>`);
1668
1675
  let u = o(t.task.title, s);
1669
1676
  u && a.push(`<text x="${(i + 6).toFixed(1)}" y="${(r + B / 2 + 3).toFixed(1)}" fill="#ffffff" font-weight="500">${e(u)}</text>`);
1670
1677
  } else {
1671
1678
  let n = t.task.color || "#3b82f6";
1672
- a.push(`<rect x="${i.toFixed(1)}" y="${(r + ei).toFixed(1)}" width="${s.toFixed(1)}" height="${ti}" rx="3" fill="${n}"${l}/>`);
1679
+ a.push(`<rect x="${i.toFixed(1)}" y="${(r + ni).toFixed(1)}" width="${s.toFixed(1)}" height="${ri}" rx="3" fill="${n}"${l}/>`);
1673
1680
  let c = s * Math.min(100, Math.max(0, t.progress)) / 100;
1674
- a.push(`<rect x="${i.toFixed(1)}" y="${(r + ei).toFixed(1)}" width="${c.toFixed(1)}" height="${ti}" rx="3" fill="rgba(0,0,0,0.18)"/>`);
1681
+ a.push(`<rect x="${i.toFixed(1)}" y="${(r + ni).toFixed(1)}" width="${c.toFixed(1)}" height="${ri}" rx="3" fill="rgba(0,0,0,0.18)"/>`);
1675
1682
  let u = o(t.task.title, s);
1676
1683
  u ? a.push(`<text x="${(i + 6).toFixed(1)}" y="${(r + B / 2 + 3).toFixed(1)}" fill="#ffffff" font-weight="500">${e(u)}</text>`) : s >= 24 && a.push(`<text x="${(i + s / 2).toFixed(1)}" y="${(r + B / 2 + 3).toFixed(1)}" text-anchor="middle" fill="#ffffff">${Math.round(t.progress)}%</text>`);
1677
1684
  }
1678
- }), $r.forEach((e) => {
1679
- let t = di(e);
1685
+ }), ti.forEach((e) => {
1686
+ let t = pi(e);
1680
1687
  if (!t) return;
1681
1688
  let n = i?.has(`${String(e.sourceId)}->${String(e.targetId)}`) ?? !1, r = n ? $ : "#94a3b8";
1682
1689
  a.push(`<path d="${t}" fill="none" stroke="${r}" stroke-width="${n ? 2 : 1.5}"/>`);
1683
- }), Er != null && a.push(`<line x1="${Er.toFixed(1)}" y1="0" x2="${Er.toFixed(1)}" y2="${K.length * B}" stroke="#ef4444" stroke-width="1.5"/>`);
1690
+ }), Or != null && a.push(`<line x1="${Or.toFixed(1)}" y1="0" x2="${Or.toFixed(1)}" y2="${K.length * B}" stroke="#ef4444" stroke-width="1.5"/>`);
1684
1691
  let s = K.length * B;
1685
- return nr.forEach((t) => {
1692
+ return ir.forEach((t) => {
1686
1693
  let n = /var\(/.test(t.color) ? "#6366f1" : t.color;
1687
1694
  if (a.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) {
1688
1695
  let r = t.label.length * 6 + 8;
@@ -1694,74 +1701,74 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1694
1701
  H: r
1695
1702
  };
1696
1703
  }, [
1697
- j,
1704
+ S,
1698
1705
  K,
1699
- $r,
1700
- di,
1701
- Jr,
1702
- gi,
1703
- hi,
1706
+ ti,
1707
+ pi,
1708
+ Xr,
1709
+ vi,
1710
+ _i,
1704
1711
  J,
1705
1712
  Y,
1706
- Jn,
1713
+ Xn,
1707
1714
  H,
1708
1715
  B,
1709
- ei,
1710
- ti,
1711
- oi,
1712
- ai,
1716
+ ni,
1713
1717
  ri,
1714
- Er,
1715
- V,
1716
- ne,
1717
1718
  ci,
1718
1719
  si,
1719
- li,
1720
+ ai,
1721
+ Or,
1722
+ V,
1723
+ re,
1720
1724
  ui,
1721
- nr,
1722
- tr
1723
- ]), wi = e.useCallback(() => {
1724
- let e = (ge ?? "").replace(/[\\/:*?"<>|\s]+/g, " ").trim() || "gantt", t = /* @__PURE__ */ new Date(), n = (e) => String(e).padStart(2, "0");
1725
+ li,
1726
+ di,
1727
+ fi,
1728
+ ir,
1729
+ rr
1730
+ ]), Ei = e.useCallback(() => {
1731
+ let e = (_e ?? "").replace(/[\\/:*?"<>|\s]+/g, " ").trim() || "gantt", t = /* @__PURE__ */ new Date(), n = (e) => String(e).padStart(2, "0");
1725
1732
  return `${e}-${`${t.getFullYear()}${n(t.getMonth() + 1)}${n(t.getDate())}-${n(t.getHours())}${n(t.getMinutes())}`}`;
1726
- }, [ge]), Ti = e.useCallback(async () => {
1727
- let e = Ci();
1733
+ }, [_e]), Di = e.useCallback(async () => {
1734
+ let e = Ti();
1728
1735
  if (!e) return;
1729
- let t = await ct(e.svg, e.W, e.H);
1736
+ let t = await ut(e.svg, e.W, e.H);
1730
1737
  t && t.toBlob((e) => {
1731
- e && lt(e, `${wi()}.png`);
1738
+ e && dt(e, `${Ei()}.png`);
1732
1739
  }, "image/png");
1733
- }, [Ci, wi]), Ei = e.useCallback(async () => {
1734
- let e = Ci();
1740
+ }, [Ti, Ei]), Oi = e.useCallback(async () => {
1741
+ let e = Ti();
1735
1742
  if (!e) return;
1736
- let t = await ct(e.svg, e.W, e.H);
1737
- t && lt(ut(dt(t.toDataURL("image/jpeg", .92)), t.width, t.height), `${wi()}.pdf`);
1738
- }, [Ci, wi]), [Di, Oi] = e.useState(!1), ki = e.useCallback(() => {
1743
+ let t = await ut(e.svg, e.W, e.H);
1744
+ t && dt(ft(pt(t.toDataURL("image/jpeg", .92)), t.width, t.height), `${Ei()}.pdf`);
1745
+ }, [Ti, Ei]), [ki, Ai] = e.useState(!1), ji = e.useCallback(() => {
1739
1746
  let e = {
1740
1747
  viewMode: V,
1741
- columnWidth: St,
1742
- taskListCollapsed: At,
1743
- taskListWidth: wt,
1744
- collapsedIds: Array.from(Bn)
1748
+ columnWidth: Ct,
1749
+ taskListCollapsed: jt,
1750
+ taskListWidth: Tt,
1751
+ collapsedIds: Array.from(Hn)
1745
1752
  };
1746
- le && mt(le, e), ue?.(e), Oi(!0);
1753
+ ue && gt(ue, e), de?.(e), Ai(!0);
1747
1754
  }, [
1748
1755
  V,
1749
- St,
1750
- At,
1751
- wt,
1752
- Bn,
1753
- le,
1754
- ue
1756
+ Ct,
1757
+ jt,
1758
+ Tt,
1759
+ Hn,
1760
+ ue,
1761
+ de
1755
1762
  ]);
1756
1763
  return e.useEffect(() => {
1757
- if (!Di) return;
1758
- let e = setTimeout(() => Oi(!1), 1500);
1764
+ if (!ki) return;
1765
+ let e = setTimeout(() => Ai(!1), 1500);
1759
1766
  return () => clearTimeout(e);
1760
- }, [Di]), /* @__PURE__ */ A("div", {
1761
- ref: Fe,
1762
- className: b("flex flex-col h-full bg-background overflow-hidden min-w-0", m),
1767
+ }, [ki]), /* @__PURE__ */ A("div", {
1768
+ ref: I,
1769
+ className: pe("flex flex-col h-full bg-background overflow-hidden min-w-0", m),
1763
1770
  "data-readonly": L ? "true" : void 0,
1764
- "data-mobile-readonly": ie && Re ? "true" : void 0,
1771
+ "data-mobile-readonly": ae && ze ? "true" : void 0,
1765
1772
  children: [
1766
1773
  /* @__PURE__ */ k("style", { children: "\n .gantt-resize-handle:hover { background-color: rgba(255, 255, 255, 0.4); }\n .gantt-bar-hover:hover { filter: brightness(1.1); }\n .gantt-row-open-btn { opacity: 0; transition: opacity 0.15s ease; }\n /* :where keeps the row-hover reveal at zero specificity so the\n button's own :hover/:focus-visible full-opacity rule can win. */\n :where(.group\\/task-row:hover) .gantt-row-open-btn { opacity: 0.6; }\n .gantt-row-open-btn:hover, .gantt-row-open-btn:focus-visible { opacity: 1; }\n /* 定位闪烁: blink the located bar 3× with a thick ring + colored glow so\n it's hard to miss. The ring is an outline (not box-shadow) and the glow\n is a drop-shadow *filter* — both stay clear of the critical-path bar's\n inline box-shadow, which they'd otherwise clobber. */\n @keyframes gantt-flash {\n 0%, 25%, 50%, 100% {\n outline-color: rgba(37, 99, 235, 0);\n filter: drop-shadow(0 0 0 rgba(37, 99, 235, 0));\n }\n 12%, 37%, 62% {\n outline-color: rgba(37, 99, 235, 1);\n filter: drop-shadow(0 0 9px rgba(37, 99, 235, 0.9));\n }\n }\n .gantt-flash {\n outline: 3px solid transparent;\n outline-offset: 3px;\n border-radius: 2px;\n animation: gantt-flash 1.5s ease-in-out;\n }\n @media (min-width: 640px) {\n .gantt-sm-h50 { height: 50px; }\n .gantt-sm-w20 { width: 80px; }\n .gantt-sm-hidden { display: none; }\n }\n /* The timeline's NATIVE scrollbars are fully hidden — both axes are\n replaced by the self-drawn bars (水平底部 / 垂直右侧). Styling the\n native bar is a dead end: overlay-scrollbar engines (macOS \"show\n while scrolling\", embedded Chromium) ignore ::-webkit-scrollbar\n theming yet still flash their own auto-hiding bar on scroll, which\n doubled up with the self-drawn one (双滚动条). scrollbar-width:none\n is honored by overlay engines too; the ::-webkit rule covers older\n WebKit. Wheel/trackpad/programmatic scrolling is unaffected. */\n [data-testid=\"gantt-timeline\"] { scrollbar-width: none; }\n [data-testid=\"gantt-timeline\"]::-webkit-scrollbar { display: none; width: 0; height: 0; }\n /* The task-list pane scrolls in lockstep with the timeline, so its own\n vertical scrollbar (butted against the divider) was a confusing second\n bar. Hide it — the pane stays wheel/drag-scrollable and synced. */\n .gantt-task-list::-webkit-scrollbar { width: 0; height: 0; }\n .gantt-task-list { scrollbar-width: none; }\n " }),
1767
1774
  /* @__PURE__ */ A("div", {
@@ -1774,14 +1781,14 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1774
1781
  size: "icon",
1775
1782
  className: "h-8 w-8",
1776
1783
  "aria-label": P("gantt.toolbar.prevPeriod"),
1777
- children: /* @__PURE__ */ k(xe, { className: "h-4 w-4" })
1784
+ children: /* @__PURE__ */ k(Ce, { className: "h-4 w-4" })
1778
1785
  }),
1779
1786
  /* @__PURE__ */ k(y, {
1780
1787
  variant: "ghost",
1781
1788
  size: "icon",
1782
1789
  className: "h-8 w-8",
1783
1790
  "aria-label": P("gantt.toolbar.nextPeriod"),
1784
- children: /* @__PURE__ */ k(Se, { className: "h-4 w-4" })
1791
+ children: /* @__PURE__ */ k(we, { className: "h-4 w-4" })
1785
1792
  }),
1786
1793
  /* @__PURE__ */ k("span", {
1787
1794
  className: "font-semibold text-xs sm:text-sm",
@@ -1794,7 +1801,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1794
1801
  className: "inline-flex items-center gap-1 rounded-full border bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground",
1795
1802
  "data-testid": "gantt-readonly-badge",
1796
1803
  title: P("gantt.readOnlyHint"),
1797
- children: [/* @__PURE__ */ k(we, { className: "h-3 w-3" }), P("gantt.readOnly")]
1804
+ children: [/* @__PURE__ */ k(Ee, { className: "h-3 w-3" }), P("gantt.readOnly")]
1798
1805
  })
1799
1806
  ]
1800
1807
  }), /* @__PURE__ */ A("div", {
@@ -1804,11 +1811,11 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1804
1811
  className: "flex bg-muted rounded-md p-1",
1805
1812
  role: "group",
1806
1813
  "aria-label": P("gantt.toolbar.viewMode"),
1807
- children: tt.map((e) => /* @__PURE__ */ k(y, {
1814
+ children: nt.map((e) => /* @__PURE__ */ k(y, {
1808
1815
  variant: "ghost",
1809
1816
  size: "sm",
1810
- className: b("h-6 px-1.5 sm:px-2 text-xs", V === e && "bg-background shadow-sm hover:bg-background"),
1811
- onClick: () => Qn(e),
1817
+ className: pe("h-6 px-1.5 sm:px-2 text-xs", V === e && "bg-background shadow-sm hover:bg-background"),
1818
+ onClick: () => er(e),
1812
1819
  "aria-pressed": V === e,
1813
1820
  "data-testid": `gantt-view-mode-${e}`,
1814
1821
  children: P(`gantt.viewMode.${e}`)
@@ -1821,23 +1828,23 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1821
1828
  size: "icon",
1822
1829
  className: "h-6 w-6",
1823
1830
  onClick: () => {
1824
- if (Ft > 15) Ct(Math.max(15, Ft - 10));
1831
+ if (It > 15) wt(Math.max(15, It - 10));
1825
1832
  else {
1826
- let e = tt.indexOf(V);
1827
- e < tt.length - 1 && (Qn(tt[e + 1]), Ct(yt));
1833
+ let e = nt.indexOf(V);
1834
+ e < nt.length - 1 && (er(nt[e + 1]), wt(bt));
1828
1835
  }
1829
1836
  },
1830
1837
  "aria-label": P("gantt.toolbar.zoomOut"),
1831
- children: /* @__PURE__ */ k(Ae, { className: "h-3 w-3" })
1838
+ children: /* @__PURE__ */ k(Me, { className: "h-3 w-3" })
1832
1839
  }), /* @__PURE__ */ k(y, {
1833
1840
  variant: "ghost",
1834
1841
  size: "icon",
1835
1842
  className: "h-6 w-6",
1836
1843
  onClick: () => {
1837
- if (Ft < 120) Ct(Math.min(120, Ft + 10));
1844
+ if (It < 120) wt(Math.min(120, It + 10));
1838
1845
  else {
1839
- let e = tt.indexOf(V);
1840
- e > 0 && (Qn(tt[e - 1]), Ct(yt));
1846
+ let e = nt.indexOf(V);
1847
+ e > 0 && (er(nt[e - 1]), wt(bt));
1841
1848
  }
1842
1849
  },
1843
1850
  "aria-label": P("gantt.toolbar.zoomIn"),
@@ -1848,18 +1855,18 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1848
1855
  variant: "ghost",
1849
1856
  size: "icon",
1850
1857
  className: "h-8 w-8",
1851
- onClick: () => jt((e) => !e),
1852
- "aria-label": P(At ? "gantt.toolbar.showTaskList" : "gantt.toolbar.hideTaskList"),
1853
- "aria-pressed": At,
1858
+ onClick: () => Mt((e) => !e),
1859
+ "aria-label": P(jt ? "gantt.toolbar.showTaskList" : "gantt.toolbar.hideTaskList"),
1860
+ "aria-pressed": jt,
1854
1861
  "data-testid": "gantt-toggle-task-list",
1855
- children: k(At ? Ee : De, { className: "h-4 w-4" })
1862
+ children: k(jt ? Oe : ke, { className: "h-4 w-4" })
1856
1863
  }),
1857
1864
  /* @__PURE__ */ k(y, {
1858
1865
  variant: "ghost",
1859
1866
  size: "sm",
1860
1867
  className: "h-8 px-2 text-xs",
1861
- onClick: Dr,
1862
- disabled: Er == null,
1868
+ onClick: kr,
1869
+ disabled: Or == null,
1863
1870
  "aria-label": P("gantt.toolbar.jumpToToday"),
1864
1871
  "data-testid": "gantt-jump-today",
1865
1872
  children: P("gantt.toolbar.today")
@@ -1868,7 +1875,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1868
1875
  variant: "ghost",
1869
1876
  size: "sm",
1870
1877
  className: "h-8 px-2 text-xs",
1871
- onClick: jr,
1878
+ onClick: Nr,
1872
1879
  "aria-label": P("gantt.toolbar.thisWeek"),
1873
1880
  "data-testid": "gantt-jump-week",
1874
1881
  children: P("gantt.toolbar.thisWeek")
@@ -1877,7 +1884,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1877
1884
  variant: "ghost",
1878
1885
  size: "sm",
1879
1886
  className: "h-8 px-2 text-xs",
1880
- onClick: Mr,
1887
+ onClick: Pr,
1881
1888
  "aria-label": P("gantt.toolbar.thisMonth"),
1882
1889
  "data-testid": "gantt-jump-month",
1883
1890
  children: P("gantt.toolbar.thisMonth")
@@ -1887,27 +1894,27 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1887
1894
  size: "icon",
1888
1895
  className: "h-8 w-8",
1889
1896
  onClick: () => void fe(),
1890
- disabled: pe,
1897
+ disabled: me,
1891
1898
  "aria-label": P("gantt.toolbar.refresh"),
1892
- "aria-busy": pe,
1899
+ "aria-busy": me,
1893
1900
  "data-testid": "gantt-refresh",
1894
1901
  children: /* @__PURE__ */ k(E, { className: "h-4 w-4" })
1895
1902
  }) : null,
1896
- R ? /* @__PURE__ */ A(je, { children: [/* @__PURE__ */ k(y, {
1903
+ R ? /* @__PURE__ */ A(Ne, { children: [/* @__PURE__ */ k(y, {
1897
1904
  variant: "ghost",
1898
1905
  size: "icon",
1899
1906
  className: "h-8 w-8",
1900
- onClick: dn,
1901
- disabled: !pn,
1907
+ onClick: fn,
1908
+ disabled: !mn,
1902
1909
  "aria-label": P("gantt.toolbar.undo"),
1903
1910
  "data-testid": "gantt-undo",
1904
- children: /* @__PURE__ */ k(ke, { className: "h-4 w-4" })
1911
+ children: /* @__PURE__ */ k(je, { className: "h-4 w-4" })
1905
1912
  }), /* @__PURE__ */ k(y, {
1906
1913
  variant: "ghost",
1907
1914
  size: "icon",
1908
1915
  className: "h-8 w-8",
1909
- onClick: fn,
1910
- disabled: !mn,
1916
+ onClick: pn,
1917
+ disabled: !hn,
1911
1918
  "aria-label": P("gantt.toolbar.redo"),
1912
1919
  "data-testid": "gantt-redo",
1913
1920
  children: /* @__PURE__ */ k(T, { className: "h-4 w-4" })
@@ -1916,18 +1923,18 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1916
1923
  variant: "ghost",
1917
1924
  size: "icon",
1918
1925
  className: "h-8 w-8",
1919
- onClick: () => mi((e) => !e),
1926
+ onClick: () => gi((e) => !e),
1920
1927
  "aria-label": P("gantt.toolbar.criticalPath"),
1921
- "aria-pressed": pi,
1928
+ "aria-pressed": hi,
1922
1929
  "data-testid": "gantt-critical-path",
1923
- style: pi ? { color: $ } : void 0,
1924
- children: /* @__PURE__ */ k(S, { className: "h-4 w-4" })
1930
+ style: hi ? { color: $ } : void 0,
1931
+ children: /* @__PURE__ */ k(be, { className: "h-4 w-4" })
1925
1932
  }),
1926
- _t && R ? /* @__PURE__ */ k(y, {
1933
+ vt && R ? /* @__PURE__ */ k(y, {
1927
1934
  variant: "ghost",
1928
1935
  size: "icon",
1929
1936
  className: "h-8 w-8",
1930
- onClick: xi,
1937
+ onClick: Ci,
1931
1938
  "aria-label": P("gantt.toolbar.autoSchedule"),
1932
1939
  "data-testid": "gantt-auto-schedule",
1933
1940
  children: /* @__PURE__ */ k(D, { className: "h-4 w-4" })
@@ -1936,40 +1943,40 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1936
1943
  variant: "ghost",
1937
1944
  size: "icon",
1938
1945
  className: "h-8 w-8",
1939
- onClick: Ti,
1946
+ onClick: Di,
1940
1947
  "aria-label": P("gantt.toolbar.exportPng"),
1941
1948
  "data-testid": "gantt-export-png",
1942
- children: /* @__PURE__ */ k(Ce, { className: "h-4 w-4" })
1949
+ children: /* @__PURE__ */ k(C, { className: "h-4 w-4" })
1943
1950
  }),
1944
1951
  /* @__PURE__ */ k(y, {
1945
1952
  variant: "ghost",
1946
1953
  size: "icon",
1947
1954
  className: "h-8 w-8",
1948
- onClick: Ei,
1955
+ onClick: Oi,
1949
1956
  "aria-label": P("gantt.toolbar.exportPdf"),
1950
1957
  "data-testid": "gantt-export-pdf",
1951
- children: /* @__PURE__ */ k(C, { className: "h-4 w-4" })
1958
+ children: /* @__PURE__ */ k(Te, { className: "h-4 w-4" })
1952
1959
  }),
1953
- ue || le ? /* @__PURE__ */ k(y, {
1960
+ de || ue ? /* @__PURE__ */ k(y, {
1954
1961
  variant: "ghost",
1955
1962
  size: "icon",
1956
1963
  className: "h-8 w-8",
1957
- onClick: ki,
1964
+ onClick: ji,
1958
1965
  "aria-label": P("gantt.toolbar.saveLayout"),
1959
- "aria-pressed": Di,
1966
+ "aria-pressed": ki,
1960
1967
  "data-testid": "gantt-save-layout",
1961
- style: Di ? { color: $ } : void 0,
1962
- children: /* @__PURE__ */ k(Oe, { className: "h-4 w-4" })
1968
+ style: ki ? { color: $ } : void 0,
1969
+ children: /* @__PURE__ */ k(Ae, { className: "h-4 w-4" })
1963
1970
  }) : null,
1964
1971
  /* @__PURE__ */ k(y, {
1965
1972
  variant: "ghost",
1966
1973
  size: "icon",
1967
1974
  className: "h-8 w-8",
1968
- onClick: xr,
1969
- "aria-label": P(yr ? "gantt.toolbar.exitFullscreen" : "gantt.toolbar.enterFullscreen"),
1970
- "aria-pressed": yr,
1975
+ onClick: Cr,
1976
+ "aria-label": P(xr ? "gantt.toolbar.exitFullscreen" : "gantt.toolbar.enterFullscreen"),
1977
+ "aria-pressed": xr,
1971
1978
  "data-testid": "gantt-fullscreen",
1972
- children: k(yr ? w : Te, { className: "h-4 w-4" })
1979
+ children: k(xr ? w : De, { className: "h-4 w-4" })
1973
1980
  })
1974
1981
  ]
1975
1982
  })]
@@ -1977,10 +1984,10 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1977
1984
  /* @__PURE__ */ A("div", {
1978
1985
  className: "relative flex flex-col flex-1 overflow-hidden outline-none focus-visible:ring-1 focus-visible:ring-ring",
1979
1986
  tabIndex: 0,
1980
- onKeyDown: Wn,
1987
+ onKeyDown: Kn,
1981
1988
  "data-testid": "gantt-body",
1982
1989
  children: [
1983
- !At && H > 0 && /* @__PURE__ */ k("div", {
1990
+ !jt && H > 0 && /* @__PURE__ */ k("div", {
1984
1991
  className: "absolute top-0 bottom-0 z-30 group/splitter",
1985
1992
  style: {
1986
1993
  left: H - 3,
@@ -1993,15 +2000,15 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
1993
2000
  onPointerDown: (e) => {
1994
2001
  if (e.button !== 0) return;
1995
2002
  e.preventDefault();
1996
- let t = e.clientX, n = H, r = Math.max(160, Le - 200), i = (e) => {
2003
+ let t = e.clientX, n = H, r = Math.max(160, Re - 200), i = (e) => {
1997
2004
  let i = Math.max(160, Math.min(n + (e.clientX - t), r));
1998
- Tt(i);
2005
+ Et(i);
1999
2006
  }, a = () => {
2000
2007
  window.removeEventListener("pointermove", i), window.removeEventListener("pointerup", a), window.removeEventListener("pointercancel", a), document.body.style.cursor = "";
2001
2008
  };
2002
2009
  document.body.style.cursor = "col-resize", window.addEventListener("pointermove", i), window.addEventListener("pointerup", a), window.addEventListener("pointercancel", a);
2003
2010
  },
2004
- onDoubleClick: () => Tt(null),
2011
+ onDoubleClick: () => Et(null),
2005
2012
  children: /* @__PURE__ */ k("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" })
2006
2013
  }),
2007
2014
  /* @__PURE__ */ A("div", {
@@ -2017,7 +2024,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2017
2024
  className: "flex-1 truncate",
2018
2025
  children: P("gantt.column.taskName")
2019
2026
  }),
2020
- Lt && /* @__PURE__ */ A(je, { children: [/* @__PURE__ */ k("div", {
2027
+ Rt && /* @__PURE__ */ A(Ne, { children: [/* @__PURE__ */ k("div", {
2021
2028
  className: "w-16 gantt-sm-w20 text-right",
2022
2029
  children: P("gantt.column.start")
2023
2030
  }), /* @__PURE__ */ k("div", {
@@ -2033,15 +2040,15 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2033
2040
  ]
2034
2041
  }), /* @__PURE__ */ k("div", {
2035
2042
  className: "flex-1 overflow-hidden",
2036
- ref: rr,
2043
+ ref: ar,
2037
2044
  children: /* @__PURE__ */ A("div", {
2038
2045
  className: "flex flex-col h-full",
2039
- style: { width: Jn },
2046
+ style: { width: Xn },
2040
2047
  children: [/* @__PURE__ */ k("div", {
2041
2048
  className: "relative border-b",
2042
2049
  style: { height: "45%" },
2043
2050
  "data-testid": "gantt-header-groups",
2044
- children: tr.slice(_r.start, _r.end).map((e) => /* @__PURE__ */ k("div", {
2051
+ children: rr.slice(yr.start, yr.end).map((e) => /* @__PURE__ */ k("div", {
2045
2052
  className: "absolute top-0 bottom-0 flex items-center justify-center border-r text-[10px] font-medium text-muted-foreground overflow-hidden",
2046
2053
  style: {
2047
2054
  left: e.offset,
@@ -2055,10 +2062,10 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2055
2062
  }), /* @__PURE__ */ k("div", {
2056
2063
  className: "relative flex-1",
2057
2064
  "data-testid": "gantt-header-units",
2058
- children: J.slice(hr.start, hr.end).map((e, t) => {
2059
- let n = hr.start + t;
2065
+ children: J.slice(_r.start, _r.end).map((e, t) => {
2066
+ let n = _r.start + t;
2060
2067
  return /* @__PURE__ */ A("div", {
2061
- 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"),
2068
+ className: pe("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"),
2062
2069
  style: {
2063
2070
  left: Y[n],
2064
2071
  width: e.width,
@@ -2067,7 +2074,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2067
2074
  children: [/* @__PURE__ */ k("span", {
2068
2075
  className: "font-medium text-foreground truncate",
2069
2076
  children: e.label
2070
- }), e.sublabel && Ft >= 32 && /* @__PURE__ */ k("span", {
2077
+ }), e.sublabel && It >= 32 && /* @__PURE__ */ k("span", {
2071
2078
  className: "text-[10px] opacity-70",
2072
2079
  children: e.sublabel
2073
2080
  })]
@@ -2082,8 +2089,8 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2082
2089
  children: [
2083
2090
  /* @__PURE__ */ A("div", {
2084
2091
  className: "gantt-task-list overflow-y-auto overflow-x-hidden border-r bg-card z-10 shadow-sm",
2085
- ref: ir,
2086
- onScroll: qr,
2092
+ ref: or,
2093
+ onScroll: Yr,
2087
2094
  style: {
2088
2095
  width: H,
2089
2096
  minWidth: H
@@ -2096,9 +2103,9 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2096
2103
  "aria-hidden": "true"
2097
2104
  }),
2098
2105
  K.slice(Q.startIdx, Q.endIdx).map((e) => {
2099
- let t = e.task, n = gt && Rt === t.id, r = Bn.has(String(t.id)), i = Fn != null && String(Fn) === String(t.id);
2106
+ let t = e.task, n = _t && zt === t.id, r = Hn.has(String(t.id)), i = Ln != null && String(Ln) === String(t.id);
2100
2107
  return /* @__PURE__ */ A("div", {
2101
- 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"),
2108
+ className: pe("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"),
2102
2109
  style: {
2103
2110
  height: B,
2104
2111
  touchAction: "manipulation"
@@ -2108,26 +2115,26 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2108
2115
  "aria-level": e.depth + 1,
2109
2116
  "aria-selected": i,
2110
2117
  "aria-expanded": e.hasChildren ? !r : void 0,
2111
- draggable: !!ht && !n && !t.locked,
2112
- onDragStart: ht ? (e) => {
2118
+ draggable: !!mt && !n && !t.locked,
2119
+ onDragStart: mt ? (e) => {
2113
2120
  e.dataTransfer.setData("text/plain", String(t.id)), e.dataTransfer.effectAllowed = "move";
2114
2121
  } : void 0,
2115
- onDragOver: ht ? (e) => {
2122
+ onDragOver: mt ? (e) => {
2116
2123
  e.preventDefault(), e.dataTransfer.dropEffect = "move";
2117
2124
  } : void 0,
2118
- onDrop: ht ? (e) => {
2125
+ onDrop: mt ? (e) => {
2119
2126
  e.preventDefault();
2120
2127
  let n = e.dataTransfer.getData("text/plain");
2121
2128
  if (!n || n === String(t.id)) return;
2122
- let r = Gt.get(n);
2123
- r && String(r.parent ?? "") === String(t.parent ?? "") && ht(r, t);
2129
+ let r = Kt.get(n);
2130
+ r && String(r.parent ?? "") === String(t.parent ?? "") && mt(r, t);
2124
2131
  } : void 0,
2125
- onContextMenu: (e) => Rn(t, e),
2132
+ onContextMenu: (e) => Bn(t, e),
2126
2133
  onClick: () => {
2127
- In(t.id), n || Ar(e.start, e.end, t.id);
2134
+ Rn(t.id), n || Mr(e.start, e.end, t.id);
2128
2135
  },
2129
2136
  onDoubleClick: () => {
2130
- n || (gt && R && !e.isSummary && !t.locked ? (zt(t.id), Vt({
2137
+ n || (_t && R && !e.isSummary && !t.locked ? (Bt(t.id), Ht({
2131
2138
  title: t.title,
2132
2139
  start: t.start.toLocaleDateString("en-CA"),
2133
2140
  end: t.end.toLocaleDateString("en-CA"),
@@ -2144,12 +2151,12 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2144
2151
  className: "h-4 w-4 shrink-0 flex items-center justify-center text-muted-foreground hover:text-foreground",
2145
2152
  style: { marginLeft: -4 },
2146
2153
  onClick: (e) => {
2147
- e.stopPropagation(), Hn(t.id);
2154
+ e.stopPropagation(), Wn(t.id);
2148
2155
  },
2149
2156
  "aria-expanded": !r,
2150
2157
  "aria-label": P(r ? "gantt.row.expand" : "gantt.row.collapse"),
2151
2158
  "data-testid": `gantt-row-toggle-${t.id}`,
2152
- children: k(r ? Se : be, { className: "h-3.5 w-3.5" })
2159
+ children: k(r ? we : Se, { className: "h-3.5 w-3.5" })
2153
2160
  }) : /* @__PURE__ */ k("span", {
2154
2161
  className: "w-3 shrink-0",
2155
2162
  style: { marginLeft: -4 },
@@ -2161,28 +2168,28 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2161
2168
  }),
2162
2169
  n ? /* @__PURE__ */ k("input", {
2163
2170
  className: "border rounded px-1 py-0.5 text-xs w-full bg-background",
2164
- value: Bt.title || "",
2165
- onChange: (e) => Vt((t) => ({
2171
+ value: Vt.title || "",
2172
+ onChange: (e) => Ht((t) => ({
2166
2173
  ...t,
2167
2174
  title: e.target.value
2168
2175
  })),
2169
2176
  onKeyDown: (e) => {
2170
- e.key === "Enter" ? (nn([{
2177
+ e.key === "Enter" ? (rn([{
2171
2178
  task: t,
2172
2179
  changes: {
2173
- title: Bt.title,
2174
- start: new Date(Bt.start),
2175
- end: new Date(Bt.end),
2176
- progress: Number(Bt.progress) || 0
2180
+ title: Vt.title,
2181
+ start: new Date(Vt.start),
2182
+ end: new Date(Vt.end),
2183
+ progress: Number(Vt.progress) || 0
2177
2184
  }
2178
- }]), zt(null)) : e.key === "Escape" && zt(null);
2185
+ }]), Bt(null)) : e.key === "Escape" && Bt(null);
2179
2186
  },
2180
2187
  onClick: (e) => e.stopPropagation(),
2181
2188
  autoFocus: !0
2182
2189
  }) : /* @__PURE__ */ A("span", {
2183
2190
  className: "flex flex-col min-w-0",
2184
2191
  children: [/* @__PURE__ */ k("span", {
2185
- className: b("truncate", e.isSummary && "font-semibold"),
2192
+ className: pe("truncate", e.isSummary && "font-semibold"),
2186
2193
  children: t.title
2187
2194
  }), /* @__PURE__ */ A("span", {
2188
2195
  className: "text-[10px] text-muted-foreground gantt-sm-hidden",
@@ -2203,13 +2210,13 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2203
2210
  }),
2204
2211
  /* @__PURE__ */ k("div", {
2205
2212
  className: "w-16 gantt-sm-w20 text-right text-xs text-muted-foreground hidden sm:block",
2206
- hidden: !Lt,
2207
- style: Lt ? void 0 : { display: "none" },
2213
+ hidden: !Rt,
2214
+ style: Rt ? void 0 : { display: "none" },
2208
2215
  children: n ? /* @__PURE__ */ k("input", {
2209
2216
  type: "date",
2210
2217
  className: "border rounded px-1 py-0.5 text-xs w-full bg-background",
2211
- value: Bt.start || "",
2212
- onChange: (e) => Vt((t) => ({
2218
+ value: Vt.start || "",
2219
+ onChange: (e) => Ht((t) => ({
2213
2220
  ...t,
2214
2221
  start: e.target.value
2215
2222
  })),
@@ -2221,13 +2228,13 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2221
2228
  }),
2222
2229
  /* @__PURE__ */ k("div", {
2223
2230
  className: "w-16 gantt-sm-w20 text-right text-xs text-muted-foreground hidden sm:block",
2224
- hidden: !Lt,
2225
- style: Lt ? void 0 : { display: "none" },
2231
+ hidden: !Rt,
2232
+ style: Rt ? void 0 : { display: "none" },
2226
2233
  children: n ? /* @__PURE__ */ k("input", {
2227
2234
  type: "date",
2228
2235
  className: "border rounded px-1 py-0.5 text-xs w-full bg-background",
2229
- value: Bt.end || "",
2230
- onChange: (e) => Vt((t) => ({
2236
+ value: Vt.end || "",
2237
+ onChange: (e) => Ht((t) => ({
2231
2238
  ...t,
2232
2239
  end: e.target.value
2233
2240
  })),
@@ -2249,7 +2256,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2249
2256
  onClick: (e) => {
2250
2257
  e.stopPropagation(), o(t);
2251
2258
  },
2252
- children: /* @__PURE__ */ k(ye, { className: "h-3.5 w-3.5" })
2259
+ children: /* @__PURE__ */ k(xe, { className: "h-3.5 w-3.5" })
2253
2260
  })
2254
2261
  })
2255
2262
  ]
@@ -2264,21 +2271,21 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2264
2271
  /* @__PURE__ */ k("div", {
2265
2272
  className: "flex-1 overflow-auto bg-background/50 relative [-webkit-overflow-scrolling:touch]",
2266
2273
  ref: (e) => {
2267
- ar.current = e, Z.current = e;
2274
+ sr.current = e, Z.current = e;
2268
2275
  },
2269
- onScroll: Kr,
2270
- onTouchStart: Cr,
2271
- onTouchMove: wr,
2272
- onTouchEnd: Tr,
2276
+ onScroll: Jr,
2277
+ onTouchStart: Tr,
2278
+ onTouchMove: Er,
2279
+ onTouchEnd: Dr,
2273
2280
  "data-testid": "gantt-timeline",
2274
2281
  children: /* @__PURE__ */ A("div", {
2275
2282
  className: "relative",
2276
- style: { width: Jn },
2283
+ style: { width: Xn },
2277
2284
  children: [
2278
- Er != null && /* @__PURE__ */ k("div", {
2285
+ Or != null && /* @__PURE__ */ k("div", {
2279
2286
  className: "absolute top-0 bottom-0 w-px z-20 pointer-events-none",
2280
2287
  style: {
2281
- left: Er,
2288
+ left: Or,
2282
2289
  backgroundColor: "rgba(239, 68, 68, 0.8)"
2283
2290
  },
2284
2291
  "data-testid": "gantt-today-marker",
@@ -2292,7 +2299,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2292
2299
  children: P("gantt.toolbar.today")
2293
2300
  })
2294
2301
  }),
2295
- nr.map((e) => /* @__PURE__ */ k("div", {
2302
+ ir.map((e) => /* @__PURE__ */ k("div", {
2296
2303
  className: "absolute top-0 bottom-0 w-px z-20 pointer-events-none",
2297
2304
  style: {
2298
2305
  left: e.left,
@@ -2311,13 +2318,13 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2311
2318
  }, e.index)),
2312
2319
  /* @__PURE__ */ A("div", {
2313
2320
  className: "relative",
2314
- ref: xn,
2321
+ ref: Cn,
2315
2322
  children: [
2316
2323
  /* @__PURE__ */ k("div", {
2317
2324
  className: "absolute inset-0 pointer-events-none",
2318
2325
  style: { zIndex: 0 },
2319
- children: J.slice(hr.start, hr.end).map((e, t) => {
2320
- let n = hr.start + t;
2326
+ children: J.slice(_r.start, _r.end).map((e, t) => {
2327
+ let n = _r.start + t;
2321
2328
  return /* @__PURE__ */ k("div", {
2322
2329
  className: "absolute top-0 bottom-0 border-r",
2323
2330
  style: {
@@ -2328,11 +2335,11 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2328
2335
  }, n);
2329
2336
  })
2330
2337
  }),
2331
- Gn && v && v.showMidnight && /* @__PURE__ */ k("div", {
2338
+ qn && v && v.showMidnight && /* @__PURE__ */ k("div", {
2332
2339
  className: "absolute inset-0 pointer-events-none",
2333
2340
  style: { zIndex: 0 },
2334
- children: J.slice(hr.start, hr.end).map((e, t) => {
2335
- let n = hr.start + t, r = e.realMs ?? 0;
2341
+ children: J.slice(_r.start, _r.end).map((e, t) => {
2342
+ let n = _r.start + t, r = e.realMs ?? 0;
2336
2343
  if (!r) return null;
2337
2344
  let i = e.date.getTime(), a = e.date, o = new Date(a.getFullYear(), a.getMonth(), a.getDate() + 1, 0, 0, 0, 0).getTime();
2338
2345
  if (o <= i || o >= i + r) return null;
@@ -2353,36 +2360,53 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2353
2360
  "aria-hidden": "true"
2354
2361
  }),
2355
2362
  K.slice(Q.startIdx, Q.endIdx).map((t, n) => {
2356
- let r = t.task, i = Q.startIdx + n, a = gi(r.id), o = Jr(t.start, t.end), s = ne && r.baselineStart && r.baselineEnd ? Jr(r.baselineStart, r.baselineEnd) : null, c = s ? /* @__PURE__ */ k("div", {
2363
+ let r = t.task, i = Q.startIdx + n, a = vi(r.id), o = Xr(t.start, t.end), s = re && r.baselineStart && r.baselineEnd ? Xr(r.baselineStart, r.baselineEnd) : null, c = s ? /* @__PURE__ */ k("div", {
2357
2364
  className: "absolute pointer-events-none rounded-[1px]",
2358
2365
  style: {
2359
2366
  left: s.left,
2360
2367
  width: Math.max(2, s.width),
2361
- top: ci,
2362
- height: si,
2363
- backgroundColor: li,
2364
- border: `1px solid ${ui}`
2368
+ top: ui,
2369
+ height: li,
2370
+ backgroundColor: di,
2371
+ border: `1px solid ${fi}`
2365
2372
  },
2366
2373
  "data-testid": `gantt-baseline-${r.id}`,
2367
2374
  "aria-hidden": "true"
2368
- }) : null, l = W?.taskId === r.id, u = Xr?.has(String(r.id)) ?? !1, d = Zr?.has(String(r.id)) ?? !1, f = l || u || d ? Qr(t) : o, p = !!r.locked, m = !!R && !t.isSummary && !p, h = m && He, g = m && Ue, ee = m && We, te = h || g, _ = L || p, v = G != null && G.targetId != null && String(G.targetId) === String(r.id) && String(G.sourceId) !== String(r.id), re = G ? (e) => {
2369
- let t = e.currentTarget.getBoundingClientRect(), n = t.width > 0 && e.clientX - t.left > t.width / 2 ? "end" : "start";
2370
- Sn((e) => e && bn(e.sourceId, r) ? {
2371
- ...e,
2372
- targetId: r.id,
2373
- targetEnd: n
2374
- } : e);
2375
+ }) : null, l = W?.taskId === r.id, u = Qr?.has(String(r.id)) ?? !1, d = $r?.has(String(r.id)) ?? !1, f = l || u || d ? ei(t) : o, p = !!r.locked, m = !!R && !t.isSummary && !p, h = m && Ue, g = m && We, ee = m && Ge, te = h || g, ne = L || p, _ = G != null && G.targetId != null && String(G.targetId) === String(r.id) && String(G.sourceId) !== String(r.id), v = G != null && G.rejectedId != null && String(G.rejectedId) === String(r.id) ? {
2376
+ cursor: "not-allowed",
2377
+ boxShadow: "0 0 0 2px hsl(var(--destructive))"
2375
2378
  } : void 0, ie = G ? (e) => {
2376
- e.target === e.currentTarget && Sn((e) => e && {
2379
+ let t = e.currentTarget.getBoundingClientRect(), n = t.width > 0 && e.clientX - t.left > t.width / 2 ? "end" : "start";
2380
+ wn((e) => {
2381
+ if (!e) return e;
2382
+ let t = xn(e.sourceId, r);
2383
+ return t === null ? {
2384
+ ...e,
2385
+ targetId: r.id,
2386
+ targetEnd: n,
2387
+ rejectedId: null,
2388
+ rejectedReason: null
2389
+ } : {
2390
+ ...e,
2391
+ targetId: null,
2392
+ targetEnd: null,
2393
+ rejectedId: r.id,
2394
+ rejectedReason: t
2395
+ };
2396
+ });
2397
+ } : void 0, ae = G ? (e) => {
2398
+ e.target === e.currentTarget && wn((e) => e && {
2377
2399
  ...e,
2378
2400
  targetId: null,
2379
- targetEnd: null
2401
+ targetEnd: null,
2402
+ rejectedId: null,
2403
+ rejectedReason: null
2380
2404
  });
2381
- } : void 0, ae = Math.max(1, Math.round((t.end.getTime() - t.start.getTime()) / rt)), oe = (i + 1) * B + 300 > vr && i * B > 300, se = Ht === r.id && !W && !gn && !G ? /* @__PURE__ */ A("div", {
2405
+ } : void 0, oe = Math.max(1, Math.round((t.end.getTime() - t.start.getTime()) / it)), se = (i + 1) * B + 300 > br && i * B > 300, ce = Ut === r.id && !W && !_n && !G ? /* @__PURE__ */ A("div", {
2382
2406
  className: "absolute z-30 pointer-events-none rounded-md border bg-popover text-popover-foreground px-2.5 py-1.5 text-xs shadow-md whitespace-nowrap",
2383
2407
  style: {
2384
2408
  left: Math.max(f.left + 8, 4),
2385
- ...oe ? { bottom: B - 8 } : { top: B - 8 }
2409
+ ...se ? { bottom: B - 8 } : { top: B - 8 }
2386
2410
  },
2387
2411
  role: "tooltip",
2388
2412
  "data-testid": `gantt-tooltip-${r.id}`,
@@ -2419,7 +2443,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2419
2443
  day: "numeric"
2420
2444
  }),
2421
2445
  " · ",
2422
- ae,
2446
+ oe,
2423
2447
  P("gantt.tooltip.days"),
2424
2448
  " · ",
2425
2449
  Math.round(t.progress),
@@ -2437,45 +2461,46 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2437
2461
  if (r.type === "group") return /* @__PURE__ */ k("div", {
2438
2462
  className: "relative border-b hover:bg-accent/50",
2439
2463
  style: { height: B },
2440
- onPointerMove: ie,
2441
- children: se
2464
+ onPointerMove: ae,
2465
+ children: ce
2442
2466
  }, r.id);
2443
2467
  if (t.isSummary) {
2444
- let e = r.color || "#0d9488", n = ce === "self" && r.hasOwnDates !== !1, i = !!R && He && !p, o = !!R && Ue && n && !p;
2468
+ let e = r.color || "#0d9488", n = le === "self" && r.hasOwnDates !== !1, i = !!R && Ue && !p, o = !!R && We && n && !p;
2445
2469
  return /* @__PURE__ */ A("div", {
2446
2470
  className: "relative border-b hover:bg-accent/50",
2447
2471
  style: { height: B },
2448
- onPointerMove: ie,
2472
+ onPointerMove: ae,
2449
2473
  children: [
2450
2474
  c,
2451
2475
  /* @__PURE__ */ A("div", {
2452
- className: b("gantt-bar-hover absolute rounded-sm border shadow-sm flex items-center px-2 select-none group", i && "cursor-grab active:cursor-grabbing", l && "ring-2 ring-primary z-10", v && "ring-2 ring-primary", or === r.id && "gantt-flash z-10"),
2476
+ className: pe("gantt-bar-hover absolute rounded-sm border shadow-sm flex items-center px-2 select-none group", i && "cursor-grab active:cursor-grabbing", l && "ring-2 ring-primary z-10", _ && "ring-2 ring-primary", cr === r.id && "gantt-flash z-10"),
2453
2477
  style: {
2454
2478
  left: f.left,
2455
2479
  width: f.width,
2456
- top: oi,
2457
- height: ai,
2458
- cursor: i || o ? void 0 : _ ? "not-allowed" : "pointer",
2480
+ top: ci,
2481
+ height: si,
2482
+ cursor: i || o ? void 0 : ne ? "not-allowed" : "pointer",
2459
2483
  backgroundColor: e,
2460
2484
  borderColor: a ? $ : r.borderColor || "hsl(var(--primary-foreground) / 0.2)",
2461
- boxShadow: a ? `0 0 0 2px ${$}` : r.borderColor ? `0 0 0 2px ${r.borderColor}` : void 0
2485
+ boxShadow: a ? `0 0 0 2px ${$}` : r.borderColor ? `0 0 0 2px ${r.borderColor}` : void 0,
2486
+ ...v
2462
2487
  },
2463
2488
  "data-critical": a ? "true" : void 0,
2464
2489
  "data-testid": `gantt-summary-bar-${r.id}`,
2465
2490
  "data-progress": Math.round(t.progress),
2466
- onMouseEnter: () => Ut(r.id),
2467
- onMouseLeave: () => Ut((e) => e === r.id ? null : e),
2468
- onPointerMove: re,
2491
+ onMouseEnter: () => Wt(r.id),
2492
+ onMouseLeave: () => Wt((e) => e === r.id ? null : e),
2493
+ onPointerMove: ie,
2469
2494
  onPointerDown: (e) => {
2470
2495
  if (e.button === 0) {
2471
2496
  if (o) {
2472
- let t = Xe(e.clientX, e.currentTarget.getBoundingClientRect());
2497
+ let t = Ze(e.clientX, e.currentTarget.getBoundingClientRect());
2473
2498
  if (t !== "move") {
2474
- hn(r, t, e);
2499
+ gn(r, t, e);
2475
2500
  return;
2476
2501
  }
2477
2502
  }
2478
- i && hn(r, "move", e, {
2503
+ i && gn(r, "move", e, {
2479
2504
  group: !0,
2480
2505
  originStart: t.start,
2481
2506
  originEnd: t.end
@@ -2483,9 +2508,9 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2483
2508
  }
2484
2509
  },
2485
2510
  onClick: () => {
2486
- Yt.current || In(r.id);
2511
+ Xt.current || Rn(r.id);
2487
2512
  },
2488
- onContextMenu: (e) => Rn(r, e),
2513
+ onContextMenu: (e) => Bn(r, e),
2489
2514
  children: [
2490
2515
  /* @__PURE__ */ k("div", {
2491
2516
  className: "absolute left-0 top-0 bottom-0 pointer-events-none",
@@ -2496,28 +2521,28 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2496
2521
  borderBottomLeftRadius: "var(--radius-sm)"
2497
2522
  }
2498
2523
  }),
2499
- o && f.width >= 14 && /* @__PURE__ */ A(je, { children: [/* @__PURE__ */ k("div", {
2524
+ o && f.width >= 14 && /* @__PURE__ */ A(Ne, { children: [/* @__PURE__ */ k("div", {
2500
2525
  className: "gantt-resize-handle absolute left-0 top-0",
2501
2526
  style: {
2502
- width: Ye,
2503
- height: ni,
2527
+ width: Xe,
2528
+ height: ii,
2504
2529
  cursor: "ew-resize"
2505
2530
  },
2506
2531
  "data-testid": `gantt-task-resize-left-${r.id}`,
2507
2532
  onPointerDown: (e) => {
2508
- e.button === 0 && hn(r, "resize-left", e);
2533
+ e.button === 0 && gn(r, "resize-left", e);
2509
2534
  },
2510
2535
  onClick: (e) => e.stopPropagation()
2511
2536
  }), /* @__PURE__ */ k("div", {
2512
2537
  className: "gantt-resize-handle absolute right-0 top-0",
2513
2538
  style: {
2514
- width: Ye,
2515
- height: ni,
2539
+ width: Xe,
2540
+ height: ii,
2516
2541
  cursor: "ew-resize"
2517
2542
  },
2518
2543
  "data-testid": `gantt-task-resize-right-${r.id}`,
2519
2544
  onPointerDown: (e) => {
2520
- e.button === 0 && hn(r, "resize-right", e);
2545
+ e.button === 0 && gn(r, "resize-right", e);
2521
2546
  },
2522
2547
  onClick: (e) => e.stopPropagation()
2523
2548
  })] }),
@@ -2526,7 +2551,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2526
2551
  children: r.title
2527
2552
  }),
2528
2553
  z && !p && ["start", "end"].map((e) => {
2529
- let t = G != null && String(G.sourceId) === String(r.id) && G.sourceEnd === e, n = t || Ht === r.id, i = n && G == null;
2554
+ let t = G != null && String(G.sourceId) === String(r.id) && G.sourceEnd === e, n = t || Ut === r.id, i = n && G == null;
2530
2555
  return /* @__PURE__ */ k("div", {
2531
2556
  className: "absolute top-1/2 -translate-y-1/2 z-20 flex items-center transition-opacity",
2532
2557
  style: {
@@ -2544,14 +2569,16 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2544
2569
  onPointerDown: (t) => {
2545
2570
  if (t.button !== 0) return;
2546
2571
  t.stopPropagation(), t.preventDefault();
2547
- let n = xn.current?.getBoundingClientRect();
2548
- Sn({
2572
+ let n = Cn.current?.getBoundingClientRect();
2573
+ wn({
2549
2574
  sourceId: r.id,
2550
2575
  sourceEnd: e,
2551
2576
  x: n ? t.clientX - n.left : 0,
2552
2577
  y: n ? t.clientY - n.top : 0,
2553
2578
  targetId: null,
2554
- targetEnd: null
2579
+ targetEnd: null,
2580
+ rejectedId: null,
2581
+ rejectedReason: null
2555
2582
  });
2556
2583
  },
2557
2584
  onClick: (e) => e.stopPropagation(),
@@ -2573,77 +2600,78 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2573
2600
  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",
2574
2601
  style: {
2575
2602
  left: Math.max(f.left, 4),
2576
- top: oi + ai + 2
2603
+ top: ci + si + 2
2577
2604
  },
2578
2605
  "data-testid": `gantt-summary-drag-chip-${r.id}`,
2579
2606
  children: [
2580
- Xt(W).start.toLocaleDateString(F, {
2607
+ Zt(W).start.toLocaleDateString(F, {
2581
2608
  month: "numeric",
2582
2609
  day: "numeric"
2583
2610
  }),
2584
2611
  " → ",
2585
- Xt(W).end.toLocaleDateString(F, {
2612
+ Zt(W).end.toLocaleDateString(F, {
2586
2613
  month: "numeric",
2587
2614
  day: "numeric"
2588
2615
  })
2589
2616
  ]
2590
2617
  }),
2591
- se
2618
+ ce
2592
2619
  ]
2593
2620
  }, r.id);
2594
2621
  }
2595
2622
  if (t.isMilestone) {
2596
- let e = ri;
2623
+ let e = ai;
2597
2624
  return /* @__PURE__ */ A("div", {
2598
2625
  className: "relative border-b hover:bg-accent/50",
2599
2626
  style: { height: B },
2600
- onPointerMove: ie,
2627
+ onPointerMove: ae,
2601
2628
  children: [
2602
2629
  c,
2603
2630
  /* @__PURE__ */ k("div", {
2604
- className: b("gantt-bar-hover absolute rotate-45 rounded-[2px] border shadow-sm select-none", h && "cursor-grab active:cursor-grabbing", l && "ring-2 ring-primary z-10", v && "ring-2 ring-primary", or === r.id && "gantt-flash z-10"),
2631
+ className: pe("gantt-bar-hover absolute rotate-45 rounded-[2px] border shadow-sm select-none", h && "cursor-grab active:cursor-grabbing", l && "ring-2 ring-primary z-10", _ && "ring-2 ring-primary", cr === r.id && "gantt-flash z-10"),
2605
2632
  style: {
2606
2633
  left: f.left - e / 2,
2607
2634
  top: (B - e) / 2,
2608
2635
  width: e,
2609
2636
  height: e,
2610
- cursor: h ? void 0 : _ ? "not-allowed" : "pointer",
2637
+ cursor: h ? void 0 : ne ? "not-allowed" : "pointer",
2611
2638
  backgroundColor: a ? $ : r.color || "#3b82f6",
2612
2639
  borderColor: a ? $ : r.borderColor || "hsl(var(--primary-foreground) / 0.2)",
2613
- boxShadow: a ? `0 0 0 2px ${$}` : r.borderColor ? `0 0 0 2px ${r.borderColor}` : void 0
2640
+ boxShadow: a ? `0 0 0 2px ${$}` : r.borderColor ? `0 0 0 2px ${r.borderColor}` : void 0,
2641
+ ...v
2614
2642
  },
2615
2643
  "data-critical": a ? "true" : void 0,
2616
2644
  "data-testid": `gantt-milestone-${r.id}`,
2617
- onMouseEnter: () => Ut(r.id),
2618
- onMouseLeave: () => Ut((e) => e === r.id ? null : e),
2645
+ onMouseEnter: () => Wt(r.id),
2646
+ onMouseLeave: () => Wt((e) => e === r.id ? null : e),
2619
2647
  onClick: () => {
2620
- Yt.current || In(r.id);
2648
+ Xt.current || Rn(r.id);
2621
2649
  },
2622
- onContextMenu: (e) => Rn(r, e),
2623
- onPointerMove: re,
2650
+ onContextMenu: (e) => Bn(r, e),
2651
+ onPointerMove: ie,
2624
2652
  onPointerDown: h ? (e) => {
2625
- e.button === 0 && hn(r, "move", e);
2653
+ e.button === 0 && gn(r, "move", e);
2626
2654
  } : void 0
2627
2655
  }),
2628
- se
2656
+ ce
2629
2657
  ]
2630
2658
  }, r.id);
2631
2659
  }
2632
- let le = gn && gn.taskId === r.id ? gn.value : r.progress;
2660
+ let ue = _n && _n.taskId === r.id ? _n.value : r.progress;
2633
2661
  return /* @__PURE__ */ A("div", {
2634
2662
  className: "relative border-b hover:bg-accent/50",
2635
2663
  style: { height: B },
2636
- onPointerMove: ie,
2637
- onMouseEnter: () => Ut(r.id),
2638
- onMouseLeave: () => Ut((e) => e === r.id ? null : e),
2664
+ onPointerMove: ae,
2665
+ onMouseEnter: () => Wt(r.id),
2666
+ onMouseLeave: () => Wt((e) => e === r.id ? null : e),
2639
2667
  children: [
2640
2668
  l && /* @__PURE__ */ k("div", {
2641
2669
  className: "absolute rounded-sm border border-dashed pointer-events-none",
2642
2670
  style: {
2643
2671
  left: o.left,
2644
2672
  width: o.width,
2645
- top: ei,
2646
- height: ti,
2673
+ top: ni,
2674
+ height: ri,
2647
2675
  opacity: .35,
2648
2676
  borderColor: "hsl(var(--primary) / 0.6)"
2649
2677
  },
@@ -2651,70 +2679,71 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2651
2679
  }),
2652
2680
  c,
2653
2681
  /* @__PURE__ */ A("div", {
2654
- className: b("gantt-bar-hover absolute rounded-sm bg-primary border shadow-sm flex items-center px-2 group select-none", te && "cursor-grab active:cursor-grabbing", l && "ring-2 ring-primary z-10", v && "ring-2 ring-primary", or === r.id && "gantt-flash z-10"),
2682
+ className: pe("gantt-bar-hover absolute rounded-sm bg-primary border shadow-sm flex items-center px-2 group select-none", te && "cursor-grab active:cursor-grabbing", l && "ring-2 ring-primary z-10", _ && "ring-2 ring-primary", cr === r.id && "gantt-flash z-10"),
2655
2683
  style: {
2656
2684
  left: f.left,
2657
2685
  width: f.width,
2658
- top: ei,
2659
- height: ti,
2660
- cursor: te ? void 0 : _ ? "not-allowed" : "pointer",
2686
+ top: ni,
2687
+ height: ri,
2688
+ cursor: te ? void 0 : ne ? "not-allowed" : "pointer",
2661
2689
  backgroundColor: r.color || "#3b82f6",
2662
2690
  borderColor: a ? $ : r.borderColor || "hsl(var(--primary-foreground) / 0.2)",
2663
- boxShadow: a ? `0 0 0 2px ${$}` : r.borderColor ? `0 0 0 2px ${r.borderColor}` : void 0
2691
+ boxShadow: a ? `0 0 0 2px ${$}` : r.borderColor ? `0 0 0 2px ${r.borderColor}` : void 0,
2692
+ ...v
2664
2693
  },
2665
2694
  "data-critical": a ? "true" : void 0,
2666
2695
  "data-testid": `gantt-task-bar-${r.id}`,
2667
2696
  onClick: () => {
2668
- Yt.current || In(r.id);
2697
+ Xt.current || Rn(r.id);
2669
2698
  },
2670
- onContextMenu: (e) => Rn(r, e),
2671
- onPointerMove: re,
2699
+ onContextMenu: (e) => Bn(r, e),
2700
+ onPointerMove: ie,
2672
2701
  onPointerDown: te ? (e) => {
2673
2702
  if (e.button !== 0) return;
2674
- let t = Xe(e.clientX, e.currentTarget.getBoundingClientRect()), n = t !== "move" && g ? t : h ? "move" : null;
2675
- n && hn(r, n, e);
2703
+ let t = Ze(e.clientX, e.currentTarget.getBoundingClientRect()), n = t !== "move" && g ? t : h ? "move" : null;
2704
+ n && gn(r, n, e);
2676
2705
  } : void 0,
2677
2706
  children: [
2678
- g && f.width >= 14 && /* @__PURE__ */ A(je, { children: [/* @__PURE__ */ k("div", {
2707
+ g && f.width >= 14 && /* @__PURE__ */ A(Ne, { children: [/* @__PURE__ */ k("div", {
2679
2708
  className: "gantt-resize-handle absolute left-0 top-0",
2680
2709
  style: {
2681
- width: Ye,
2682
- height: ni,
2710
+ width: Xe,
2711
+ height: ii,
2683
2712
  cursor: "ew-resize"
2684
2713
  },
2685
2714
  "data-testid": `gantt-task-resize-left-${r.id}`,
2686
2715
  onPointerDown: (e) => {
2687
- e.button === 0 && hn(r, "resize-left", e);
2716
+ e.button === 0 && gn(r, "resize-left", e);
2688
2717
  },
2689
2718
  onClick: (e) => e.stopPropagation()
2690
2719
  }), /* @__PURE__ */ k("div", {
2691
2720
  className: "gantt-resize-handle absolute right-0 top-0",
2692
2721
  style: {
2693
- width: Ye,
2694
- height: ni,
2722
+ width: Xe,
2723
+ height: ii,
2695
2724
  cursor: "ew-resize"
2696
2725
  },
2697
2726
  "data-testid": `gantt-task-resize-right-${r.id}`,
2698
2727
  onPointerDown: (e) => {
2699
- e.button === 0 && hn(r, "resize-right", e);
2728
+ e.button === 0 && gn(r, "resize-right", e);
2700
2729
  },
2701
2730
  onClick: (e) => e.stopPropagation()
2702
2731
  })] }),
2703
- le > 0 && /* @__PURE__ */ k("div", {
2732
+ ue > 0 && /* @__PURE__ */ k("div", {
2704
2733
  className: "absolute left-0 top-0 bottom-0 pointer-events-none",
2705
2734
  style: {
2706
- width: `${le}%`,
2735
+ width: `${ue}%`,
2707
2736
  backgroundColor: "rgba(0, 0, 0, 0.2)",
2708
2737
  borderTopLeftRadius: "var(--radius-sm)",
2709
2738
  borderBottomLeftRadius: "var(--radius-sm)"
2710
2739
  }
2711
2740
  }),
2712
2741
  ee && f.width >= 30 && /* @__PURE__ */ k("div", {
2713
- className: b("absolute bottom-0 h-1/2 w-4 -translate-x-1/2 cursor-col-resize flex items-end justify-center pb-px", gn?.taskId === r.id ? "opacity-100" : "opacity-0 group-hover:opacity-100 transition-opacity"),
2714
- style: { left: `${le}%` },
2742
+ className: pe("absolute bottom-0 h-1/2 w-4 -translate-x-1/2 cursor-col-resize flex items-end justify-center pb-px", _n?.taskId === r.id ? "opacity-100" : "opacity-0 group-hover:opacity-100 transition-opacity"),
2743
+ style: { left: `${ue}%` },
2715
2744
  "data-testid": `gantt-progress-handle-${r.id}`,
2716
2745
  onPointerDown: (e) => {
2717
- e.button === 0 && (e.stopPropagation(), e.preventDefault(), _n({
2746
+ e.button === 0 && (e.stopPropagation(), e.preventDefault(), vn({
2718
2747
  taskId: r.id,
2719
2748
  originClientX: e.clientX,
2720
2749
  originProgress: r.progress,
@@ -2733,7 +2762,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2733
2762
  } })
2734
2763
  }),
2735
2764
  z && !p && ["start", "end"].map((e) => {
2736
- let t = G != null && String(G.sourceId) === String(r.id) && G.sourceEnd === e, n = t || Ht === r.id, i = n && G == null;
2765
+ let t = G != null && String(G.sourceId) === String(r.id) && G.sourceEnd === e, n = t || Ut === r.id, i = n && G == null;
2737
2766
  return /* @__PURE__ */ k("div", {
2738
2767
  className: "absolute top-1/2 -translate-y-1/2 z-20 flex items-center transition-opacity",
2739
2768
  style: {
@@ -2751,14 +2780,16 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2751
2780
  onPointerDown: (t) => {
2752
2781
  if (t.button !== 0) return;
2753
2782
  t.stopPropagation(), t.preventDefault();
2754
- let n = xn.current?.getBoundingClientRect();
2755
- Sn({
2783
+ let n = Cn.current?.getBoundingClientRect();
2784
+ wn({
2756
2785
  sourceId: r.id,
2757
2786
  sourceEnd: e,
2758
2787
  x: n ? t.clientX - n.left : 0,
2759
2788
  y: n ? t.clientY - n.top : 0,
2760
2789
  targetId: null,
2761
- targetEnd: null
2790
+ targetEnd: null,
2791
+ rejectedId: null,
2792
+ rejectedReason: null
2762
2793
  });
2763
2794
  },
2764
2795
  onClick: (e) => e.stopPropagation(),
@@ -2780,17 +2811,17 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2780
2811
  }),
2781
2812
  /* @__PURE__ */ k("span", {
2782
2813
  className: "absolute inset-0 flex items-center px-2 text-[10px] text-white font-medium truncate opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none",
2783
- children: l ? `${Xt(W).start.toLocaleDateString(F, {
2814
+ children: l ? `${Zt(W).start.toLocaleDateString(F, {
2784
2815
  month: "numeric",
2785
2816
  day: "numeric"
2786
- })} → ${Xt(W).end.toLocaleDateString(F, {
2817
+ })} → ${Zt(W).end.toLocaleDateString(F, {
2787
2818
  month: "numeric",
2788
2819
  day: "numeric"
2789
- })}` : `${Math.round(le)}%`
2820
+ })}` : `${Math.round(ue)}%`
2790
2821
  })
2791
2822
  ]
2792
2823
  }),
2793
- se
2824
+ ce
2794
2825
  ]
2795
2826
  }, r.id);
2796
2827
  }),
@@ -2798,10 +2829,10 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2798
2829
  style: { height: (K.length - Q.endIdx) * B },
2799
2830
  "aria-hidden": "true"
2800
2831
  }),
2801
- ($r.length > 0 || G) && /* @__PURE__ */ A("svg", {
2832
+ (ti.length > 0 || G) && /* @__PURE__ */ A("svg", {
2802
2833
  className: "absolute top-0 left-0 pointer-events-none z-10",
2803
- width: Jn,
2804
- height: vr,
2834
+ width: Xn,
2835
+ height: br,
2805
2836
  "data-testid": "gantt-links",
2806
2837
  "aria-hidden": "true",
2807
2838
  children: [
@@ -2846,12 +2877,12 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2846
2877
  })
2847
2878
  })
2848
2879
  ] }),
2849
- $r.map((t) => {
2880
+ ti.map((t) => {
2850
2881
  let n = Math.min(t.sourceIndex, t.targetIndex);
2851
2882
  if (Math.max(t.sourceIndex, t.targetIndex) < Q.startIdx - 6 || n > Q.endIdx + 6) return null;
2852
- let r = di(t);
2883
+ let r = pi(t);
2853
2884
  if (!r) return null;
2854
- let i = fi != null && (String(t.sourceId) === String(fi) || String(t.targetId) === String(fi)), a = hi?.criticalEdges.has(`${String(t.sourceId)}->${String(t.targetId)}`) ?? !1, o = a ? "gantt-link-arrow-critical" : i ? "gantt-link-arrow-active" : "gantt-link-arrow", s = !!(ft || z);
2885
+ let i = mi != null && (String(t.sourceId) === String(mi) || String(t.targetId) === String(mi)), a = _i?.criticalEdges.has(`${String(t.sourceId)}->${String(t.targetId)}`) ?? !1, o = a ? "gantt-link-arrow-critical" : i ? "gantt-link-arrow-active" : "gantt-link-arrow", s = !!(at || z);
2855
2886
  return /* @__PURE__ */ A(e.Fragment, { children: [/* @__PURE__ */ k("path", {
2856
2887
  d: r,
2857
2888
  fill: "none",
@@ -2873,13 +2904,13 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2873
2904
  cursor: "context-menu"
2874
2905
  },
2875
2906
  "data-testid": `gantt-link-hit-${t.sourceId}-${t.targetId}`,
2876
- onContextMenu: (e) => zn(t.sourceId, t.targetId, t.type, e)
2907
+ onContextMenu: (e) => Vn(t.sourceId, t.targetId, t.type, e)
2877
2908
  })] }, t.key);
2878
2909
  }),
2879
2910
  G && (() => {
2880
2911
  let e = K.findIndex((e) => String(e.task.id) === String(G.sourceId));
2881
2912
  if (e < 0) return null;
2882
- let t = Qr(K[e]), n = K[e].isMilestone ? t.left + (G.sourceEnd === "start" ? -ii : ii) : G.sourceEnd === "start" ? t.left : t.left + t.width, r = e * B + B / 2;
2913
+ let t = ei(K[e]), n = K[e].isMilestone ? t.left + (G.sourceEnd === "start" ? -oi : oi) : G.sourceEnd === "start" ? t.left : t.left + t.width, r = e * B + B / 2;
2883
2914
  return /* @__PURE__ */ k("path", {
2884
2915
  d: `M ${Math.round(n)} ${Math.round(r)} L ${Math.round(G.x)} ${Math.round(G.y)}`,
2885
2916
  fill: "none",
@@ -2892,9 +2923,9 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2892
2923
  ]
2893
2924
  }),
2894
2925
  G && (() => {
2895
- let e = j.find((e) => String(e.id) === String(G.sourceId));
2926
+ let e = S.find((e) => String(e.id) === String(G.sourceId));
2896
2927
  if (!e) return null;
2897
- let t = G.targetId == null ? null : j.find((e) => String(e.id) === String(G.targetId)), n = (e) => P(`gantt.linkEnd.${e}`), r = t ? `${e.title} (${n(G.sourceEnd)}) → ${t.title} (${n(G.targetEnd ?? "start")})` : `${e.title} (${n(G.sourceEnd)})`;
2928
+ let t = G.targetId == null ? null : S.find((e) => String(e.id) === String(G.targetId)), n = (e) => P(`gantt.linkEnd.${e}`), r = t ? `${e.title} (${n(G.sourceEnd)}) → ${t.title} (${n(G.targetEnd ?? "start")})` : `${e.title} (${n(G.sourceEnd)})`;
2898
2929
  return /* @__PURE__ */ k("div", {
2899
2930
  className: "absolute z-30 pointer-events-none rounded-md border bg-popover text-popover-foreground px-2 py-1 text-[11px] font-medium shadow-md whitespace-nowrap",
2900
2931
  style: {
@@ -2911,7 +2942,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2911
2942
  })
2912
2943
  }),
2913
2944
  /* @__PURE__ */ k("div", {
2914
- ref: Lr,
2945
+ ref: zr,
2915
2946
  className: "shrink-0 border-l bg-card/95 select-none",
2916
2947
  style: {
2917
2948
  width: 14,
@@ -2919,14 +2950,14 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2919
2950
  },
2920
2951
  "data-testid": "gantt-vscrollbar",
2921
2952
  children: /* @__PURE__ */ k("div", {
2922
- ref: Rr,
2953
+ ref: Br,
2923
2954
  className: "relative h-full",
2924
- onPointerDown: Gr,
2955
+ onPointerDown: qr,
2925
2956
  role: "scrollbar",
2926
2957
  "aria-controls": "gantt-timeline",
2927
2958
  "aria-orientation": "vertical",
2928
2959
  children: /* @__PURE__ */ k("div", {
2929
- ref: zr,
2960
+ ref: Vr,
2930
2961
  className: "absolute rounded-full",
2931
2962
  style: {
2932
2963
  left: 2,
@@ -2937,14 +2968,14 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2937
2968
  cursor: "grab"
2938
2969
  },
2939
2970
  "data-testid": "gantt-vscrollbar-thumb",
2940
- onPointerDown: Wr
2971
+ onPointerDown: Kr
2941
2972
  })
2942
2973
  })
2943
2974
  })
2944
2975
  ]
2945
2976
  }),
2946
2977
  /* @__PURE__ */ k("div", {
2947
- ref: Nr,
2978
+ ref: Fr,
2948
2979
  className: "shrink-0 border-t bg-card/95 select-none",
2949
2980
  style: {
2950
2981
  position: "sticky",
@@ -2954,18 +2985,18 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2954
2985
  },
2955
2986
  "data-testid": "gantt-hscrollbar",
2956
2987
  children: /* @__PURE__ */ k("div", {
2957
- ref: Pr,
2988
+ ref: Ir,
2958
2989
  className: "relative",
2959
2990
  style: {
2960
2991
  marginLeft: H,
2961
2992
  height: 14
2962
2993
  },
2963
- onPointerDown: Ur,
2994
+ onPointerDown: Gr,
2964
2995
  role: "scrollbar",
2965
2996
  "aria-controls": "gantt-timeline",
2966
2997
  "aria-orientation": "horizontal",
2967
2998
  children: /* @__PURE__ */ k("div", {
2968
- ref: Fr,
2999
+ ref: Lr,
2969
3000
  className: "absolute rounded-full",
2970
3001
  style: {
2971
3002
  top: 2,
@@ -2976,22 +3007,22 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
2976
3007
  cursor: "grab"
2977
3008
  },
2978
3009
  "data-testid": "gantt-hscrollbar-thumb",
2979
- onPointerDown: Hr
3010
+ onPointerDown: Wr
2980
3011
  })
2981
3012
  })
2982
3013
  })
2983
3014
  ]
2984
3015
  }),
2985
- wn && (() => {
2986
- let e = j.find((e) => String(e.id) === String(wn.taskId));
3016
+ En && (() => {
3017
+ let e = S.find((e) => String(e.id) === String(En.taskId));
2987
3018
  if (!e) return null;
2988
- let t = K.find((e) => String(e.task.id) === String(wn.taskId)), n = "w-full text-left px-3 py-1.5 hover:bg-accent focus:bg-accent outline-none";
3019
+ let t = K.find((e) => String(e.task.id) === String(En.taskId)), n = "w-full text-left px-3 py-1.5 hover:bg-accent focus:bg-accent outline-none";
2989
3020
  return /* @__PURE__ */ A("div", {
2990
- ref: En,
3021
+ ref: On,
2991
3022
  className: "fixed z-50 min-w-[160px] rounded-md border bg-popover text-popover-foreground shadow-md py-1 text-sm",
2992
3023
  style: {
2993
- left: wn.x,
2994
- top: wn.y
3024
+ left: En.x,
3025
+ top: En.y
2995
3026
  },
2996
3027
  role: "menu",
2997
3028
  "data-testid": "gantt-context-menu",
@@ -3002,17 +3033,17 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
3002
3033
  className: n,
3003
3034
  "data-testid": "gantt-context-menu-view",
3004
3035
  onClick: () => {
3005
- Tn(null), o(e);
3036
+ Dn(null), o(e);
3006
3037
  },
3007
3038
  children: P("gantt.menu.view")
3008
3039
  }),
3009
- gt && R && t && !t.isSummary && !e.locked && /* @__PURE__ */ k("button", {
3040
+ _t && R && t && !t.isSummary && !e.locked && /* @__PURE__ */ k("button", {
3010
3041
  type: "button",
3011
3042
  role: "menuitem",
3012
3043
  className: n,
3013
3044
  "data-testid": "gantt-context-menu-edit",
3014
3045
  onClick: () => {
3015
- Tn(null), zt(e.id), Vt({
3046
+ Dn(null), Bt(e.id), Ht({
3016
3047
  title: e.title,
3017
3048
  start: e.start.toLocaleDateString("en-CA"),
3018
3049
  end: e.end.toLocaleDateString("en-CA"),
@@ -3021,14 +3052,14 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
3021
3052
  },
3022
3053
  children: P("gantt.menu.edit")
3023
3054
  }),
3024
- z && t && !t.isMilestone && !e.locked && /* @__PURE__ */ A(je, { children: [/* @__PURE__ */ k("button", {
3055
+ z && t && !t.isMilestone && !e.locked && /* @__PURE__ */ A(Ne, { children: [/* @__PURE__ */ k("button", {
3025
3056
  type: "button",
3026
3057
  role: "menuitem",
3027
3058
  className: n,
3028
3059
  "data-testid": "gantt-context-menu-add-predecessor",
3029
3060
  onClick: () => {
3030
- let t = wn;
3031
- Tn(null), Nn(""), jn({
3061
+ let t = En;
3062
+ Dn(null), Fn(""), Nn({
3032
3063
  x: t.x,
3033
3064
  y: t.y,
3034
3065
  taskId: e.id,
@@ -3042,8 +3073,8 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
3042
3073
  className: n,
3043
3074
  "data-testid": "gantt-context-menu-add-successor",
3044
3075
  onClick: () => {
3045
- let t = wn;
3046
- Tn(null), Nn(""), jn({
3076
+ let t = En;
3077
+ Dn(null), Fn(""), Nn({
3047
3078
  x: t.x,
3048
3079
  y: t.y,
3049
3080
  taskId: e.id,
@@ -3052,21 +3083,21 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
3052
3083
  },
3053
3084
  children: P("gantt.menu.addSuccessor")
3054
3085
  })] }),
3055
- qe && !e.locked && /* @__PURE__ */ k("button", {
3086
+ Je && !e.locked && /* @__PURE__ */ k("button", {
3056
3087
  type: "button",
3057
3088
  role: "menuitem",
3058
- className: b(n, "text-destructive"),
3089
+ className: pe(n, "text-destructive"),
3059
3090
  "data-testid": "gantt-context-menu-delete",
3060
3091
  onClick: () => {
3061
- Tn(null), qe(e);
3092
+ Dn(null), Je(e);
3062
3093
  },
3063
3094
  children: P("gantt.menu.delete")
3064
3095
  })
3065
3096
  ]
3066
3097
  });
3067
3098
  })(),
3068
- Dn && (() => {
3069
- let e = j.find((e) => String(e.id) === String(Dn.sourceId)), t = j.find((e) => String(e.id) === String(Dn.targetId));
3099
+ kn && (() => {
3100
+ let e = S.find((e) => String(e.id) === String(kn.sourceId)), t = S.find((e) => String(e.id) === String(kn.targetId));
3070
3101
  if (!e || !t) return null;
3071
3102
  let n = "w-full text-left px-3 py-1.5 hover:bg-accent focus:bg-accent outline-none", r = [
3072
3103
  "fs",
@@ -3075,11 +3106,11 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
3075
3106
  "sf"
3076
3107
  ], i = !!t.locked;
3077
3108
  return /* @__PURE__ */ A("div", {
3078
- ref: kn,
3109
+ ref: jn,
3079
3110
  className: "fixed z-50 min-w-[180px] rounded-md border bg-popover text-popover-foreground shadow-md py-1 text-sm",
3080
3111
  style: {
3081
- left: Dn.x,
3082
- top: Dn.y
3112
+ left: kn.x,
3113
+ top: kn.y
3083
3114
  },
3084
3115
  role: "menu",
3085
3116
  "data-testid": "gantt-link-context-menu",
@@ -3097,60 +3128,60 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
3097
3128
  "data-testid": "gantt-link-menu-locked",
3098
3129
  children: ["🚫 ", P("gantt.lockedHint")]
3099
3130
  }),
3100
- z && me && r.map((r) => /* @__PURE__ */ A("button", {
3131
+ z && he && r.map((r) => /* @__PURE__ */ A("button", {
3101
3132
  type: "button",
3102
3133
  role: "menuitemradio",
3103
- "aria-checked": Dn.type === r,
3134
+ "aria-checked": kn.type === r,
3104
3135
  disabled: i,
3105
- className: b(n, Dn.type === r && "font-semibold", i && "opacity-50 cursor-not-allowed hover:bg-transparent"),
3136
+ className: pe(n, kn.type === r && "font-semibold", i && "opacity-50 cursor-not-allowed hover:bg-transparent"),
3106
3137
  "data-testid": `gantt-link-menu-type-${r}`,
3107
3138
  onClick: () => {
3108
- i || (On(null), r !== Dn.type && z(e, t, r));
3139
+ i || (An(null), r !== kn.type && z(e, t, r));
3109
3140
  },
3110
- children: [Dn.type === r ? "✓ " : "\xA0\xA0", P(`gantt.linkType.${r}`)]
3141
+ children: [kn.type === r ? "✓ " : "\xA0\xA0", P(`gantt.linkType.${r}`)]
3111
3142
  }, r)),
3112
- ft && /* @__PURE__ */ A(je, { children: [/* @__PURE__ */ k("div", { className: "my-1 border-t" }), /* @__PURE__ */ k("button", {
3143
+ at && /* @__PURE__ */ A(Ne, { children: [/* @__PURE__ */ k("div", { className: "my-1 border-t" }), /* @__PURE__ */ k("button", {
3113
3144
  type: "button",
3114
3145
  role: "menuitem",
3115
3146
  disabled: i,
3116
- className: b(n, "text-destructive", i && "opacity-50 cursor-not-allowed hover:bg-transparent"),
3147
+ className: pe(n, "text-destructive", i && "opacity-50 cursor-not-allowed hover:bg-transparent"),
3117
3148
  "data-testid": "gantt-link-menu-remove",
3118
3149
  onClick: () => {
3119
- i || (On(null), ft(e, t));
3150
+ i || (An(null), at(e, t));
3120
3151
  },
3121
3152
  children: P("gantt.menu.removeDependency")
3122
3153
  })] })
3123
3154
  ]
3124
3155
  });
3125
3156
  })(),
3126
- An && z && (() => {
3127
- let e = j.find((e) => String(e.id) === String(An.taskId));
3157
+ Mn && z && (() => {
3158
+ let e = S.find((e) => String(e.id) === String(Mn.taskId));
3128
3159
  if (!e) return null;
3129
- let t = new Set($r.map((e) => `${String(e.sourceId)}->${String(e.targetId)}`)), n = j.filter((n) => {
3160
+ let t = new Set(ti.map((e) => `${String(e.sourceId)}->${String(e.targetId)}`)), n = S.filter((n) => {
3130
3161
  if (String(n.id) === String(e.id) || n.type === "group" || n.locked) return !1;
3131
- let r = An.relation === "pred" ? `${String(n.id)}->${String(e.id)}` : `${String(e.id)}->${String(n.id)}`;
3162
+ let r = Mn.relation === "pred" ? `${String(n.id)}->${String(e.id)}` : `${String(e.id)}->${String(n.id)}`;
3132
3163
  return !t.has(r);
3133
- }), r = Mn.trim().toLowerCase(), i = r ? n.filter((e) => String(e.title ?? "").toLowerCase().includes(r)) : n;
3164
+ }), r = Pn.trim().toLowerCase(), i = r ? n.filter((e) => String(e.title ?? "").toLowerCase().includes(r)) : n;
3134
3165
  return /* @__PURE__ */ A("div", {
3135
- ref: Pn,
3166
+ ref: In,
3136
3167
  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",
3137
3168
  style: {
3138
- left: An.x,
3139
- top: An.y
3169
+ left: Mn.x,
3170
+ top: Mn.y
3140
3171
  },
3141
3172
  role: "menu",
3142
3173
  "data-testid": "gantt-dep-picker",
3143
3174
  children: [
3144
3175
  /* @__PURE__ */ k("div", {
3145
3176
  className: "px-3 py-1 text-xs text-muted-foreground",
3146
- children: An.relation === "pred" ? P("gantt.menu.addPredecessor") : P("gantt.menu.addSuccessor")
3177
+ children: Mn.relation === "pred" ? P("gantt.menu.addPredecessor") : P("gantt.menu.addSuccessor")
3147
3178
  }),
3148
3179
  /* @__PURE__ */ k("div", {
3149
3180
  className: "px-2 pb-1",
3150
3181
  children: /* @__PURE__ */ k("input", {
3151
3182
  className: "border rounded px-2 py-1 text-sm w-full bg-background",
3152
- value: Mn,
3153
- onChange: (e) => Nn(e.target.value),
3183
+ value: Pn,
3184
+ onChange: (e) => Fn(e.target.value),
3154
3185
  placeholder: P("gantt.menu.searchTasks"),
3155
3186
  "data-testid": "gantt-dep-picker-search",
3156
3187
  autoFocus: !0
@@ -3165,17 +3196,17 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
3165
3196
  className: "w-full text-left px-3 py-1.5 hover:bg-accent focus:bg-accent outline-none truncate",
3166
3197
  "data-testid": `gantt-dep-picker-option-${t.id}`,
3167
3198
  onClick: () => {
3168
- jn(null), An.relation === "pred" ? z(t, e, "fs") : z(e, t, "fs");
3199
+ Nn(null), Mn.relation === "pred" ? z(t, e, "fs") : z(e, t, "fs");
3169
3200
  },
3170
3201
  children: t.title
3171
3202
  }, String(t.id)))
3172
3203
  ]
3173
3204
  });
3174
3205
  })(),
3175
- _i && /* @__PURE__ */ k("div", {
3206
+ yi && /* @__PURE__ */ k("div", {
3176
3207
  className: "fixed inset-0 z-[60] flex items-center justify-center bg-black/30",
3177
3208
  "data-testid": "gantt-autoschedule-overlay",
3178
- onClick: () => vi(null),
3209
+ onClick: () => bi(null),
3179
3210
  children: /* @__PURE__ */ A("div", {
3180
3211
  className: "min-w-[280px] max-w-[360px] rounded-lg border bg-popover text-popover-foreground shadow-lg p-4",
3181
3212
  role: "alertdialog",
@@ -3190,9 +3221,9 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
3190
3221
  }),
3191
3222
  /* @__PURE__ */ A("div", {
3192
3223
  className: "text-sm text-muted-foreground mb-3",
3193
- children: [P("gantt.autoScheduleDlg.body").replace("{count}", String(_i.changes.length)), _i.skipped > 0 && /* @__PURE__ */ A(je, { children: [" ", /* @__PURE__ */ k("span", {
3224
+ children: [P("gantt.autoScheduleDlg.body", { count: yi.changes.length }), yi.skipped > 0 && /* @__PURE__ */ A(Ne, { children: [" ", /* @__PURE__ */ k("span", {
3194
3225
  "data-testid": "gantt-autoschedule-skipped",
3195
- children: P("gantt.autoScheduleDlg.skipped").replace("{count}", String(_i.skipped))
3226
+ children: P("gantt.autoScheduleDlg.skipped", { count: yi.skipped })
3196
3227
  })] })]
3197
3228
  }),
3198
3229
  /* @__PURE__ */ A("div", {
@@ -3201,29 +3232,29 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
3201
3232
  type: "button",
3202
3233
  className: "px-3 py-1.5 text-sm rounded-md border hover:bg-accent outline-none",
3203
3234
  "data-testid": "gantt-autoschedule-cancel",
3204
- onClick: () => vi(null),
3235
+ onClick: () => bi(null),
3205
3236
  children: P("gantt.autoScheduleDlg.cancel")
3206
3237
  }), /* @__PURE__ */ k("button", {
3207
3238
  type: "button",
3208
3239
  className: "px-3 py-1.5 text-sm rounded-md bg-primary text-primary-foreground hover:opacity-90 outline-none",
3209
3240
  "data-testid": "gantt-autoschedule-confirm",
3210
- onClick: Si,
3241
+ onClick: wi,
3211
3242
  children: P("gantt.autoScheduleDlg.confirm")
3212
3243
  })]
3213
3244
  })
3214
3245
  ]
3215
3246
  })
3216
3247
  }),
3217
- yi && /* @__PURE__ */ k("div", {
3248
+ xi && /* @__PURE__ */ k("div", {
3218
3249
  className: "fixed bottom-6 left-1/2 -translate-x-1/2 z-[60] rounded-md border bg-popover text-popover-foreground px-3 py-1.5 text-sm shadow-md",
3219
3250
  role: "status",
3220
3251
  "data-testid": "gantt-autoschedule-clean",
3221
3252
  children: P("gantt.autoScheduleDlg.none")
3222
3253
  }),
3223
- rn && /* @__PURE__ */ k("div", {
3254
+ an && /* @__PURE__ */ k("div", {
3224
3255
  className: "fixed inset-0 z-[60] flex items-center justify-center bg-black/30",
3225
3256
  "data-testid": "gantt-conflict-overlay",
3226
- onClick: () => an(null),
3257
+ onClick: () => on(null),
3227
3258
  children: /* @__PURE__ */ A("div", {
3228
3259
  className: "min-w-[280px] max-w-[360px] rounded-lg border bg-popover text-popover-foreground shadow-lg p-4",
3229
3260
  role: "alertdialog",
@@ -3238,7 +3269,7 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
3238
3269
  }),
3239
3270
  /* @__PURE__ */ k("div", {
3240
3271
  className: "text-sm text-muted-foreground mb-3",
3241
- children: P("gantt.conflict.body").replace("{count}", String(rn.length))
3272
+ children: P("gantt.conflict.body", { count: an.length })
3242
3273
  }),
3243
3274
  /* @__PURE__ */ A("div", {
3244
3275
  className: "flex justify-end gap-2",
@@ -3246,13 +3277,13 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
3246
3277
  type: "button",
3247
3278
  className: "px-3 py-1.5 text-sm rounded-md border hover:bg-accent outline-none",
3248
3279
  "data-testid": "gantt-conflict-cancel",
3249
- onClick: () => an(null),
3280
+ onClick: () => on(null),
3250
3281
  children: P("gantt.conflict.cancel")
3251
3282
  }), /* @__PURE__ */ k("button", {
3252
3283
  type: "button",
3253
3284
  className: "px-3 py-1.5 text-sm rounded-md bg-primary text-primary-foreground hover:opacity-90 outline-none",
3254
3285
  "data-testid": "gantt-conflict-confirm",
3255
- onClick: ln,
3286
+ onClick: un,
3256
3287
  children: P("gantt.conflict.confirm")
3257
3288
  })]
3258
3289
  })
@@ -3264,10 +3295,10 @@ function ht({ tasks: t, viewMode: n, startDate: r, endDate: i, markers: a, onTas
3264
3295
  }
3265
3296
  //#endregion
3266
3297
  //#region src/workload.ts
3267
- function gt(e, t, n, r) {
3298
+ function vt(e, t, n, r) {
3268
3299
  return t.getTime() === e.getTime() ? e.getTime() >= n.getTime() && e.getTime() < r.getTime() : e.getTime() < r.getTime() && t.getTime() > n.getTime();
3269
3300
  }
3270
- function _t(e, t, n) {
3301
+ function yt(e, t, n) {
3271
3302
  let { assignee: r, effort: i, capacity: a = 1, unassignedLabel: o = "Unassigned" } = n, s = (e) => typeof a == "function" ? a(e) : a, c = (e) => {
3272
3303
  let t = i ? i(e) : 1;
3273
3304
  return Number.isFinite(t) && t > 0 ? t : 0;
@@ -3284,7 +3315,7 @@ function _t(e, t, n) {
3284
3315
  for (let e of l.values()) {
3285
3316
  let n = s(e.key), r = 0, i = 0, a = t.map((t) => {
3286
3317
  let a = 0;
3287
- for (let n of e.items) gt(n.start, n.end, t.start, t.end) && (a += c(n));
3318
+ for (let n of e.items) vt(n.start, n.end, t.start, t.end) && (a += c(n));
3288
3319
  a > r && (r = a);
3289
3320
  let o = a > n + 1e-9;
3290
3321
  return o && i++, {
@@ -3306,32 +3337,32 @@ function _t(e, t, n) {
3306
3337
  }
3307
3338
  //#endregion
3308
3339
  //#region src/ResourceWorkload.tsx
3309
- var vt = {
3340
+ var B = {
3310
3341
  day: 26,
3311
3342
  week: 56,
3312
3343
  month: 76,
3313
3344
  quarter: 88,
3314
3345
  year: 104
3315
- }, B = 48, yt = 34, bt = 180;
3316
- function xt(e, t, n) {
3346
+ }, bt = 48, xt = 34, St = 180;
3347
+ function Ct(e, t, n) {
3317
3348
  return t === "day" ? String(e.getDate()) : t === "week" ? e.toLocaleDateString(n, {
3318
3349
  month: "numeric",
3319
3350
  day: "numeric"
3320
3351
  }) : t === "month" ? e.toLocaleDateString(n, { month: "short" }) : t === "year" ? String(e.getFullYear()) : `Q${Math.floor(e.getMonth() / 3) + 1}`;
3321
3352
  }
3322
- function St({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "day", unassignedLabel: o = "Unassigned", className: s }) {
3323
- let { t: c, language: l } = Je(), u = l || void 0, d = vt[a], f = e.useMemo(() => {
3353
+ function wt({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "day", unassignedLabel: o = "Unassigned", className: s }) {
3354
+ let { t: c, language: l } = Ye(), u = l || void 0, d = B[a], f = e.useMemo(() => {
3324
3355
  if (!t.length) return [];
3325
- let e = new Date(Math.min(...t.map((e) => e.start.getTime()))), n = new Date(Math.max(...t.map((e) => e.end.getTime()))), r = at(e, a), i = st(at(n, a), 1, a), o = [], s = 0;
3356
+ let e = new Date(Math.min(...t.map((e) => e.start.getTime()))), n = new Date(Math.max(...t.map((e) => e.end.getTime()))), r = st(e, a), i = lt(st(n, a), 1, a), o = [], s = 0;
3326
3357
  for (; r < i && s++ < 4e3;) {
3327
- let e = st(r, 1, a);
3358
+ let e = lt(r, 1, a);
3328
3359
  o.push({
3329
3360
  date: new Date(r),
3330
3361
  col: {
3331
3362
  start: new Date(r),
3332
3363
  end: new Date(e)
3333
3364
  },
3334
- label: xt(r, a, u)
3365
+ label: Ct(r, a, u)
3335
3366
  }), r = e;
3336
3367
  }
3337
3368
  return o;
@@ -3339,7 +3370,7 @@ function St({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
3339
3370
  t,
3340
3371
  a,
3341
3372
  u
3342
- ]), p = e.useMemo(() => _t(t, f.map((e) => e.col), {
3373
+ ]), p = e.useMemo(() => yt(t, f.map((e) => e.col), {
3343
3374
  assignee: n,
3344
3375
  effort: r,
3345
3376
  capacity: i,
@@ -3368,11 +3399,11 @@ function St({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
3368
3399
  children: /* @__PURE__ */ A("div", {
3369
3400
  style: {
3370
3401
  display: "flex",
3371
- minWidth: bt + h
3402
+ minWidth: St + h
3372
3403
  },
3373
3404
  children: [/* @__PURE__ */ A("div", {
3374
3405
  style: {
3375
- width: bt,
3406
+ width: St,
3376
3407
  flexShrink: 0
3377
3408
  },
3378
3409
  children: [/* @__PURE__ */ k("div", {
@@ -3389,7 +3420,7 @@ function St({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
3389
3420
  }), p.map((e) => /* @__PURE__ */ A("div", {
3390
3421
  "data-testid": `resource-row-${e.key}`,
3391
3422
  style: {
3392
- height: B,
3423
+ height: bt,
3393
3424
  display: "flex",
3394
3425
  flexDirection: "column",
3395
3426
  justifyContent: "center",
@@ -3445,12 +3476,12 @@ function St({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
3445
3476
  children: e.label
3446
3477
  }, t))
3447
3478
  }), p.map((e) => {
3448
- let t = yt * (1 - Math.min(e.capacity / m, 1));
3479
+ let t = xt * (1 - Math.min(e.capacity / m, 1));
3449
3480
  return /* @__PURE__ */ A("div", {
3450
3481
  style: {
3451
3482
  position: "relative",
3452
3483
  display: "flex",
3453
- height: B,
3484
+ height: bt,
3454
3485
  borderBottom: "1px solid hsl(var(--border) / 0.5)"
3455
3486
  },
3456
3487
  children: [/* @__PURE__ */ k("div", {
@@ -3459,13 +3490,13 @@ function St({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
3459
3490
  position: "absolute",
3460
3491
  left: 0,
3461
3492
  right: 0,
3462
- top: 14 / 2 + t,
3493
+ top: 7 + t,
3463
3494
  borderTop: "1px dashed hsl(var(--muted-foreground) / 0.6)",
3464
3495
  pointerEvents: "none",
3465
3496
  zIndex: 1
3466
3497
  }
3467
3498
  }), e.cells.map((t, n) => {
3468
- let r = Math.max(t.load > 0 ? 2 : 0, yt * Math.min(t.load / m, 1));
3499
+ let r = Math.max(t.load > 0 ? 2 : 0, xt * Math.min(t.load / m, 1));
3469
3500
  return /* @__PURE__ */ k("div", {
3470
3501
  "data-testid": `resource-cell-${e.key}-${n}`,
3471
3502
  "data-load": t.load,
@@ -3479,7 +3510,7 @@ function St({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
3479
3510
  display: "flex",
3480
3511
  alignItems: "flex-end",
3481
3512
  justifyContent: "center",
3482
- paddingBottom: 14 / 2
3513
+ paddingBottom: 7
3483
3514
  },
3484
3515
  children: t.load > 0 && /* @__PURE__ */ k("div", { style: {
3485
3516
  width: d - 6,
@@ -3505,7 +3536,7 @@ function St({ tasks: t, assignee: n, effort: r, capacity: i = 1, viewMode: a = "
3505
3536
  }
3506
3537
  //#endregion
3507
3538
  //#region src/QuickFilterBar.tsx
3508
- var Ct = {
3539
+ var Tt = {
3509
3540
  display: "flex",
3510
3541
  flexWrap: "wrap",
3511
3542
  alignItems: "center",
@@ -3514,7 +3545,7 @@ var Ct = {
3514
3545
  borderBottom: "1px solid hsl(var(--border))",
3515
3546
  background: "hsl(var(--background))",
3516
3547
  fontSize: 13
3517
- }, wt = {
3548
+ }, Et = {
3518
3549
  display: "inline-flex",
3519
3550
  alignItems: "center",
3520
3551
  gap: 6,
@@ -3527,7 +3558,7 @@ var Ct = {
3527
3558
  cursor: "pointer",
3528
3559
  whiteSpace: "nowrap",
3529
3560
  lineHeight: "28px"
3530
- }, Tt = {
3561
+ }, V = {
3531
3562
  position: "absolute",
3532
3563
  top: "calc(100% + 4px)",
3533
3564
  left: 0,
@@ -3541,7 +3572,7 @@ var Ct = {
3541
3572
  background: "hsl(var(--popover, var(--background)))",
3542
3573
  color: "hsl(var(--popover-foreground, var(--foreground)))",
3543
3574
  boxShadow: "0 8px 24px rgba(0,0,0,0.18)"
3544
- }, V = {
3575
+ }, Dt = {
3545
3576
  display: "flex",
3546
3577
  alignItems: "center",
3547
3578
  gap: 8,
@@ -3550,7 +3581,7 @@ var Ct = {
3550
3581
  cursor: "pointer",
3551
3582
  userSelect: "none"
3552
3583
  };
3553
- function Et({ checked: e }) {
3584
+ function Ot({ checked: e }) {
3554
3585
  return /* @__PURE__ */ k("span", {
3555
3586
  "aria-hidden": !0,
3556
3587
  style: {
@@ -3570,7 +3601,7 @@ function Et({ checked: e }) {
3570
3601
  children: e ? "✓" : ""
3571
3602
  });
3572
3603
  }
3573
- function Dt({ filter: e, selected: t, onChange: n, labels: i }) {
3604
+ function kt({ filter: e, selected: t, onChange: n, labels: i }) {
3574
3605
  let [s, c] = o(!1), l = a(null);
3575
3606
  r(() => {
3576
3607
  if (!s) return;
@@ -3596,7 +3627,7 @@ function Dt({ filter: e, selected: t, onChange: n, labels: i }) {
3596
3627
  children: [/* @__PURE__ */ A("button", {
3597
3628
  type: "button",
3598
3629
  style: {
3599
- ...wt,
3630
+ ...Et,
3600
3631
  borderColor: d > 0 ? "hsl(var(--primary))" : "hsl(var(--border))",
3601
3632
  color: d > 0 ? "hsl(var(--primary))" : "hsl(var(--foreground))"
3602
3633
  },
@@ -3614,26 +3645,26 @@ function Dt({ filter: e, selected: t, onChange: n, labels: i }) {
3614
3645
  })]
3615
3646
  }), s && /* @__PURE__ */ k("div", {
3616
3647
  role: "listbox",
3617
- style: Tt,
3648
+ style: V,
3618
3649
  "data-testid": `quick-filter-panel-${e.field}`,
3619
3650
  children: e.options.length === 0 ? /* @__PURE__ */ k("div", {
3620
3651
  style: {
3621
- ...V,
3652
+ ...Dt,
3622
3653
  cursor: "default",
3623
3654
  opacity: .6
3624
3655
  },
3625
3656
  children: i.empty
3626
- }) : /* @__PURE__ */ A(je, { children: [
3657
+ }) : /* @__PURE__ */ A(Ne, { children: [
3627
3658
  /* @__PURE__ */ A("div", {
3628
3659
  role: "option",
3629
3660
  "aria-selected": f,
3630
3661
  style: {
3631
- ...V,
3662
+ ...Dt,
3632
3663
  fontWeight: 600
3633
3664
  },
3634
3665
  "data-testid": `quick-filter-all-${e.field}`,
3635
3666
  onClick: () => m(),
3636
- children: [/* @__PURE__ */ k(Et, { checked: f }), /* @__PURE__ */ k("span", { children: i.all })]
3667
+ children: [/* @__PURE__ */ k(Ot, { checked: f }), /* @__PURE__ */ k("span", { children: i.all })]
3637
3668
  }),
3638
3669
  /* @__PURE__ */ k("div", { style: {
3639
3670
  height: 1,
@@ -3646,27 +3677,27 @@ function Dt({ filter: e, selected: t, onChange: n, labels: i }) {
3646
3677
  role: "option",
3647
3678
  "aria-selected": n,
3648
3679
  style: {
3649
- ...V,
3680
+ ...Dt,
3650
3681
  background: n ? "hsl(var(--accent, var(--muted)))" : "transparent"
3651
3682
  },
3652
3683
  "data-testid": `quick-filter-option-${e.field}-${t.value}`,
3653
3684
  onClick: () => p(t.value),
3654
- children: [/* @__PURE__ */ k(Et, { checked: n }), /* @__PURE__ */ k("span", { children: t.label })]
3685
+ children: [/* @__PURE__ */ k(Ot, { checked: n }), /* @__PURE__ */ k("span", { children: t.label })]
3655
3686
  }, t.value);
3656
3687
  })
3657
3688
  ] })
3658
3689
  })]
3659
3690
  });
3660
3691
  }
3661
- var Ot = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, totalCount: a, labels: o, className: s }) => {
3692
+ var At = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, totalCount: a, labels: o, className: s }) => {
3662
3693
  if (!e.length) return null;
3663
3694
  let c = o?.all ?? "All", l = o?.empty ?? "No options", u = o?.clear ?? "Clear", d = e.some((e) => (t[e.field]?.length ?? 0) > 0);
3664
3695
  return /* @__PURE__ */ A("div", {
3665
- style: Ct,
3696
+ style: Tt,
3666
3697
  className: s,
3667
3698
  "data-testid": "quick-filter-bar",
3668
3699
  children: [
3669
- e.map((e) => /* @__PURE__ */ k(Dt, {
3700
+ e.map((e) => /* @__PURE__ */ k(kt, {
3670
3701
  filter: e,
3671
3702
  selected: t[e.field] ?? [],
3672
3703
  onChange: (t) => n(e.field, t),
@@ -3678,7 +3709,7 @@ var Ot = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, total
3678
3709
  d && /* @__PURE__ */ k("button", {
3679
3710
  type: "button",
3680
3711
  style: {
3681
- ...wt,
3712
+ ...Et,
3682
3713
  height: 28,
3683
3714
  color: "hsl(var(--muted-foreground))"
3684
3715
  },
@@ -3699,7 +3730,7 @@ var Ot = ({ filters: e, value: t, onChange: n, onClear: r, resultCount: i, total
3699
3730
  };
3700
3731
  //#endregion
3701
3732
  //#region src/ObjectGantt.tsx
3702
- function kt(e) {
3733
+ function jt(e) {
3703
3734
  if (e == null) return;
3704
3735
  let t = String(e).toLowerCase().trim();
3705
3736
  if (t === "milestone") return "milestone";
@@ -3707,7 +3738,7 @@ function kt(e) {
3707
3738
  if (t === "summary" || t === "project" || t === "phase") return "summary";
3708
3739
  if (t === "task") return "task";
3709
3740
  }
3710
- var At = {
3741
+ var Mt = {
3711
3742
  fs: "fs",
3712
3743
  ss: "ss",
3713
3744
  ff: "ff",
@@ -3720,24 +3751,26 @@ var At = {
3720
3751
  end_to_end: "ff",
3721
3752
  start_to_end: "sf"
3722
3753
  };
3723
- function jt(e) {
3754
+ function Nt(e) {
3724
3755
  if (e == null || e === "") return [];
3725
3756
  if (typeof e == "string") return e.split(",").map((e) => e.trim()).filter(Boolean);
3726
3757
  if (typeof e == "number") return [e];
3727
3758
  if (!Array.isArray(e)) return [];
3728
3759
  let t = [];
3729
- for (let n of e) if (n != null && n !== "") if (typeof n == "object") {
3730
- let e = n.id ?? n._id ?? n.task ?? n.target;
3731
- if (e == null || e === "") continue;
3732
- let r = At[String(n.type ?? "").toLowerCase().replace(/-/g, "_")];
3733
- t.push(r ? {
3734
- id: e,
3735
- type: r
3736
- } : { id: e });
3737
- } else t.push(n);
3760
+ for (let n of e) if (n != null && n !== "") {
3761
+ if (typeof n == "object") {
3762
+ let e = n.id ?? n._id ?? n.task ?? n.target;
3763
+ if (e == null || e === "") continue;
3764
+ let r = Mt[String(n.type ?? "").toLowerCase().replace(/-/g, "_")];
3765
+ t.push(r ? {
3766
+ id: e,
3767
+ type: r
3768
+ } : { id: e });
3769
+ } else t.push(n);
3770
+ }
3738
3771
  return t;
3739
3772
  }
3740
- function Mt(e) {
3773
+ function Pt(e) {
3741
3774
  return e.data ? e.data : e.staticData ? {
3742
3775
  provider: "value",
3743
3776
  items: e.staticData
@@ -3746,7 +3779,7 @@ function Mt(e) {
3746
3779
  object: e.objectName
3747
3780
  } : null;
3748
3781
  }
3749
- function Nt(e) {
3782
+ function H(e) {
3750
3783
  if (e) {
3751
3784
  if (typeof e == "string") {
3752
3785
  let t = e.split(" "), n = t[0], r = t[1]?.toLowerCase() === "desc" ? "desc" : "asc";
@@ -3755,7 +3788,7 @@ function Nt(e) {
3755
3788
  if (Array.isArray(e)) return e.reduce((e, t) => (t.field && t.order && (e[t.field] = t.order), e), {});
3756
3789
  }
3757
3790
  }
3758
- function H(e) {
3791
+ function Ft(e) {
3759
3792
  let t = e instanceof Error ? e.message : String(e ?? ""), n = t.indexOf("{");
3760
3793
  if (n >= 0) try {
3761
3794
  let e = JSON.parse(t.slice(n)), r = e?.message ?? e?.error;
@@ -3763,7 +3796,7 @@ function H(e) {
3763
3796
  } catch {}
3764
3797
  return null;
3765
3798
  }
3766
- function Pt(e) {
3799
+ function It(e) {
3767
3800
  let t = null;
3768
3801
  if (e.startDateField && e.endDateField) return t = {
3769
3802
  startDateField: e.startDateField,
@@ -3796,45 +3829,45 @@ function Pt(e) {
3796
3829
  dependencyTypes: e.dependencyTypes
3797
3830
  }, t;
3798
3831
  if (e.gantt && (t = e.gantt), t) {
3799
- let e = ee.safeParse(t);
3832
+ let e = te.safeParse(t);
3800
3833
  return e.success || console.warn("[ObjectGantt] Invalid gantt configuration:", e.error.format()), t;
3801
3834
  }
3802
3835
  return null;
3803
3836
  }
3804
- var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick: ee, onBeforeTaskUpdate: y, ...de }) => {
3805
- let [S, ye] = o([]), [be, xe] = o(!0), [Se, Ce] = o(null), [C, we] = o(null), { currency: Te } = _(), { t: w } = Je(), Ee = t((e) => {
3806
- g.error(w("gantt.writeFailed"), { description: H(e) ?? void 0 });
3807
- }, [w]), De = Mt(e), T = i(() => De, [JSON.stringify(De)]), E = Pt(e), Oe = T?.provider === "value", ke = n(f)?.apiFetch, D = i(() => d(T, s ?? null, { fetch: ke }), [
3837
+ var Lt = ({ schema: e, dataSource: s, className: f, onTaskClick: h, onRowClick: g, onBeforeTaskUpdate: te, ...y }) => {
3838
+ let [b, be] = o([]), [xe, Se] = o(!0), [Ce, we] = o(null), [C, Te] = o(null), { currency: Ee } = v(), De = _(), { t: w } = Ye(), Oe = t((e) => {
3839
+ ee.error(w("gantt.writeFailed"), { description: Ft(e) ?? void 0 });
3840
+ }, [w]), ke = Pt(e), T = i(() => ke, [JSON.stringify(ke)]), E = It(e), Ae = T?.provider === "value", je = n(p)?.apiFetch, D = i(() => d(T, s ?? null, { fetch: je }), [
3808
3841
  T,
3809
3842
  s,
3810
- ke
3811
- ]), O = T?.provider === "object" ? T.object : e.objectName ?? "", [Ae, je] = o(!1), j = a(0), M = t(async ({ silent: t = !1 } = {}) => {
3843
+ je
3844
+ ]), O = T?.provider === "object" ? T.object : e.objectName ?? "", [Me, Ne] = o(!1), j = a(0), M = t(async ({ silent: t = !1 } = {}) => {
3812
3845
  let n = ++j.current, r = () => j.current === n;
3813
3846
  try {
3814
- if (t ? je(!0) : xe(!0), de.data && Array.isArray(de.data)) {
3815
- r() && ye(de.data);
3847
+ if (t ? Ne(!0) : Se(!0), y.data && Array.isArray(y.data)) {
3848
+ r() && be(y.data);
3816
3849
  return;
3817
3850
  }
3818
- if (Oe && T?.provider === "value") {
3819
- r() && ye(T.items);
3851
+ if (Ae && T?.provider === "value") {
3852
+ r() && be(T.items);
3820
3853
  return;
3821
3854
  }
3822
3855
  if (!D || typeof D.find != "function") throw Error("DataSource required for object/api providers");
3823
3856
  let n = c(C?.fields), i = await D.find(O, {
3824
3857
  $filter: e.filter,
3825
- $orderby: Nt(e.sort),
3858
+ $orderby: H(e.sort),
3826
3859
  ...n.length > 0 ? { $expand: n } : {}
3827
3860
  });
3828
- r() && ye(l(i));
3861
+ r() && be(l(i));
3829
3862
  } catch (e) {
3830
- t ? console.error("[ObjectGantt] Failed to refresh data:", e) : r() && Ce(e);
3863
+ t ? console.error("[ObjectGantt] Failed to refresh data:", e) : r() && we(e);
3831
3864
  } finally {
3832
- t ? je(!1) : xe(!1);
3865
+ t ? Ne(!1) : Se(!1);
3833
3866
  }
3834
3867
  }, [
3835
3868
  D,
3836
3869
  O,
3837
- Oe,
3870
+ Ae,
3838
3871
  T,
3839
3872
  e.filter,
3840
3873
  e.sort,
@@ -3843,11 +3876,11 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
3843
3876
  r(() => {
3844
3877
  M();
3845
3878
  }, [M]), r(() => {
3846
- !Oe && D && (async () => {
3879
+ !Ae && D && (async () => {
3847
3880
  try {
3848
3881
  if (!D || !O) return;
3849
3882
  let e = await D.getObjectSchema(O);
3850
- we(e);
3883
+ Te(e);
3851
3884
  } catch (e) {
3852
3885
  console.error("Failed to fetch object schema:", e);
3853
3886
  }
@@ -3855,11 +3888,11 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
3855
3888
  }, [
3856
3889
  O,
3857
3890
  D,
3858
- Oe,
3891
+ Ae,
3859
3892
  T
3860
3893
  ]);
3861
3894
  let N = i(() => {
3862
- if (!E || !S.length) return [];
3895
+ if (!E || !b.length) return [];
3863
3896
  let { startDateField: e, endDateField: t, titleField: n, progressField: r, dependenciesField: i, colorField: a, borderColorField: o, parentField: s, typeField: c, lockField: l, tooltipFields: d, baselineStartField: f, baselineEndField: p, quickFilters: m } = E, h = C?.fields ?? {}, g = /* @__PURE__ */ new Map();
3864
3897
  for (let e of m ?? []) {
3865
3898
  if (!e?.field || !Array.isArray(e.options) || !e.options.length) continue;
@@ -3875,7 +3908,7 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
3875
3908
  r = r[e];
3876
3909
  }
3877
3910
  return r;
3878
- }, _ = (e) => {
3911
+ }, te = (e) => {
3879
3912
  let t = [
3880
3913
  ee(e, n),
3881
3914
  e?.account?.name,
@@ -3884,11 +3917,11 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
3884
3917
  ];
3885
3918
  for (let e of t) if (e != null && String(e).trim() !== "") return String(e);
3886
3919
  return u(C, e);
3887
- }, v = (e, t) => {
3920
+ }, _ = (e, t) => {
3888
3921
  if (t) return t;
3889
3922
  let n = h[e] ?? h[e.split(".")[0]];
3890
- return n?.label ? n.label : x(e);
3891
- }, ne = (e, t) => {
3923
+ return n?.label ? n.label : S(e);
3924
+ }, v = (e, t) => {
3892
3925
  if (e == null || e === "") return "—";
3893
3926
  let n = h[t] ?? h[t.split(".")[0]], r = n?.type, i = n?.options;
3894
3927
  if (Array.isArray(i) && i.length) {
@@ -3900,18 +3933,18 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
3900
3933
  if (n != null) return n;
3901
3934
  }
3902
3935
  if (r == null && typeof e == "string") {
3903
- if (/^\d{4}-\d{2}-\d{2}$/.test(e)) return pe(e);
3904
- if (/^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}/.test(e) && !isNaN(new Date(e).getTime())) return me(e);
3936
+ if (/^\d{4}-\d{2}-\d{2}$/.test(e)) return he(e, void 0, { locale: De });
3937
+ if (/^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}/.test(e) && !isNaN(new Date(e).getTime())) return ge(e, { locale: De });
3905
3938
  }
3906
3939
  switch (r) {
3907
- case "date": return pe(e);
3908
- case "datetime": return me(e);
3940
+ case "date": return he(e, void 0, { locale: De });
3941
+ case "datetime": return ge(e, { locale: De });
3909
3942
  case "number":
3910
3943
  case "integer":
3911
3944
  case "float":
3912
- case "decimal": return he(Number(e));
3913
- case "currency": return fe(Number(e), te(n, Te));
3914
- case "percent": return ge(Number(e));
3945
+ case "decimal": return _e(Number(e), void 0, De);
3946
+ case "currency": return me(Number(e), ne(n, Ee), De);
3947
+ case "percent": return ve(Number(e), void 0, De);
3915
3948
  case "boolean":
3916
3949
  case "checkbox": return e ? "Yes" : "No";
3917
3950
  default:
@@ -3940,46 +3973,48 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
3940
3973
  if (!r) continue;
3941
3974
  let i = typeof n == "object" ? n.label : void 0, a = ee(e, r);
3942
3975
  a == null || a === "" || Array.isArray(a) && a.length === 0 || t.push({
3943
- label: v(r, i),
3944
- value: ne(a, r)
3976
+ label: _(r, i),
3977
+ value: v(a, r)
3945
3978
  });
3946
3979
  }
3947
3980
  return t.length ? t : void 0;
3948
3981
  };
3949
- return S.map((n, u) => {
3950
- let d = n[e], m = n[t], h = f ? n[f] : void 0, g = p ? n[p] : void 0, ee = h ? new Date(h) : void 0, te = g ? new Date(g) : void 0, v = _(n), ne = r ? n[r] : 0, ie = i ? n[i] : [], ae = a ? n[a] : void 0;
3982
+ return b.map((n, u) => {
3983
+ let d = n[e], m = n[t], h = f ? n[f] : void 0, g = p ? n[p] : void 0, ee = h ? new Date(h) : void 0, ne = g ? new Date(g) : void 0, _ = te(n), v = r ? n[r] : 0, ie = i ? n[i] : [], ae = a ? n[a] : void 0;
3951
3984
  if (!ae) {
3952
3985
  let e = n.status ?? n.state ?? n.priority ?? n.severity;
3953
3986
  if (e != null && e !== "") {
3954
- let t = _e(void 0, e);
3955
- t && (ae = ve(t));
3987
+ let t = ye(void 0, e);
3988
+ t && (ae = x(t));
3956
3989
  }
3957
3990
  }
3958
- let oe = o ? n[o] : void 0, se = oe != null && oe !== "" ? ve(String(oe), String(oe)) : void 0;
3991
+ let oe = o ? n[o] : void 0, se = oe != null && oe !== "" ? x(String(oe), String(oe)) : void 0;
3959
3992
  return {
3960
3993
  id: n.id || n._id || `task-${u}`,
3961
- title: v,
3994
+ title: _,
3962
3995
  start: d ? new Date(d) : /* @__PURE__ */ new Date(),
3963
3996
  end: m ? new Date(m) : /* @__PURE__ */ new Date(),
3964
3997
  hasOwnDates: !!(d && m),
3965
- progress: Math.min(100, Math.max(0, ne || 0)),
3966
- dependencies: jt(ie),
3998
+ progress: Math.min(100, Math.max(0, v || 0)),
3999
+ dependencies: Nt(ie),
3967
4000
  parent: s ? n[s] ?? null : void 0,
3968
- type: c ? kt(n[c]) : void 0,
4001
+ type: c ? jt(n[c]) : void 0,
3969
4002
  locked: l ? !!n[l] : void 0,
3970
4003
  color: ae,
3971
4004
  borderColor: se,
3972
4005
  baselineStart: ee && !isNaN(ee.getTime()) ? ee : void 0,
3973
- baselineEnd: te && !isNaN(te.getTime()) ? te : void 0,
4006
+ baselineEnd: ne && !isNaN(ne.getTime()) ? ne : void 0,
3974
4007
  fields: re(n),
3975
4008
  data: n
3976
4009
  };
3977
4010
  }).filter((e) => !isNaN(e.start.getTime()) && !isNaN(e.end.getTime()));
3978
4011
  }, [
3979
- S,
4012
+ b,
3980
4013
  E,
3981
- C
3982
- ]), Me = i(() => {
4014
+ C,
4015
+ De,
4016
+ Ee
4017
+ ]), P = i(() => {
3983
4018
  let e = E?.groupByField;
3984
4019
  if (!e) return;
3985
4020
  let t = C?.fields ?? {}, n = (e, t) => {
@@ -4009,7 +4044,7 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
4009
4044
  label: r(i)
4010
4045
  };
4011
4046
  };
4012
- }, [E?.groupByField, C]), P = i(() => {
4047
+ }, [E?.groupByField, C]), Pe = i(() => {
4013
4048
  let e = E?.assigneeField;
4014
4049
  if (!e) return;
4015
4050
  let t = C?.fields ?? {}, n = (e, t) => {
@@ -4039,19 +4074,19 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
4039
4074
  label: r(i)
4040
4075
  };
4041
4076
  };
4042
- }, [E?.assigneeField, C]), Ne = i(() => {
4077
+ }, [E?.assigneeField, C]), F = i(() => {
4043
4078
  let e = E?.effortField;
4044
4079
  if (e) return (t) => {
4045
4080
  let n = t.data?.[e], r = Number(n);
4046
4081
  return Number.isFinite(r) && r > 0 ? r : 1;
4047
4082
  };
4048
- }, [E?.effortField]), F = i(() => {
4083
+ }, [E?.effortField]), Fe = i(() => {
4049
4084
  let t = e.skipWeekends, n = e.holidays;
4050
4085
  if (!(!t && (!n || n.length === 0))) return {
4051
4086
  skipWeekends: !!t,
4052
4087
  holidays: n && n.length ? new Set(n) : void 0
4053
4088
  };
4054
- }, [e]), Pe = i(() => We(E?.timeSegments), [E?.timeSegments]), I = t((e, t) => {
4089
+ }, [e]), Ie = i(() => Ke(E?.timeSegments), [E?.timeSegments]), I = t((e, t) => {
4055
4090
  if (!e || !t) return null;
4056
4091
  let n = e;
4057
4092
  for (let e of t.split(".")) {
@@ -4064,13 +4099,13 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
4064
4099
  return String(e.id ?? e._id ?? e.value ?? e.name ?? "");
4065
4100
  }
4066
4101
  return String(n);
4067
- }, []), Fe = E?.quickFilters, [Ie, Le] = o({});
4102
+ }, []), Le = E?.quickFilters, [Re, ze] = o({});
4068
4103
  r(() => {
4069
- if (!Fe?.length || !s || typeof s.find != "function") return;
4104
+ if (!Le?.length || !s || typeof s.find != "function") return;
4070
4105
  let e = C?.fields ?? {}, t = !1;
4071
4106
  return (async () => {
4072
4107
  let n = {};
4073
- for (let t of Fe) {
4108
+ for (let t of Le) {
4074
4109
  if (t.options) continue;
4075
4110
  let r = e[t.field] ?? e[t.field.split(".")[0]], i = r?.type;
4076
4111
  if (i !== "lookup" && i !== "master_detail") continue;
@@ -4085,7 +4120,7 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
4085
4120
  console.warn(`[ObjectGantt] Failed to load quick-filter options for "${t.field}":`, e);
4086
4121
  }
4087
4122
  }
4088
- t || Le((e) => ({
4123
+ t || ze((e) => ({
4089
4124
  ...e,
4090
4125
  ...n
4091
4126
  }));
@@ -4093,15 +4128,15 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
4093
4128
  t = !0;
4094
4129
  };
4095
4130
  }, [
4096
- JSON.stringify(Fe),
4131
+ JSON.stringify(Le),
4097
4132
  s,
4098
4133
  C
4099
4134
  ]);
4100
- let Re = i(() => {
4101
- if (!Fe?.length) return [];
4135
+ let L = i(() => {
4136
+ if (!Le?.length) return [];
4102
4137
  let e = C?.fields ?? {};
4103
- return Fe.map((t) => {
4104
- let n = e[t.field] ?? e[t.field.split(".")[0]], r = t.label ?? n?.label ?? x(t.field), i;
4138
+ return Le.map((t) => {
4139
+ let n = e[t.field] ?? e[t.field.split(".")[0]], r = t.label ?? n?.label ?? S(t.field), i;
4105
4140
  if (t.options?.length) i = t.options.map((e) => typeof e == "object" ? {
4106
4141
  value: String(e.value),
4107
4142
  label: String(e.label ?? e.value)
@@ -4113,10 +4148,10 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
4113
4148
  value: String(e.value ?? e),
4114
4149
  label: String(e.label ?? e.value ?? e)
4115
4150
  }));
4116
- else if (Ie[t.field]?.length) i = Ie[t.field];
4151
+ else if (Re[t.field]?.length) i = Re[t.field];
4117
4152
  else {
4118
4153
  let e = /* @__PURE__ */ new Map();
4119
- for (let n of S) {
4154
+ for (let n of b) {
4120
4155
  let r = I(n, t.field);
4121
4156
  if (r != null && !e.has(r)) {
4122
4157
  let i = n;
@@ -4137,15 +4172,15 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
4137
4172
  };
4138
4173
  });
4139
4174
  }, [
4140
- Fe,
4175
+ Le,
4141
4176
  C,
4142
- Ie,
4143
- S,
4177
+ Re,
4178
+ b,
4144
4179
  I
4145
- ]), ze = e.persistLayout === !1 ? void 0 : `${e.objectName || (T?.provider === "object" ? T.object : "") || "gantt"}:${e.viewName || "default"}`, Be = ze ? `gantt-layout:${ze}:filters` : null, [Ve, L] = o(() => {
4146
- if (!Be || typeof window > "u") return {};
4180
+ ]), Be = e.persistLayout === !1 ? void 0 : `${e.objectName || (T?.provider === "object" ? T.object : "") || "gantt"}:${e.viewName || "default"}`, Ve = Be ? `gantt-layout:${Be}:filters` : null, [He, Ue] = o(() => {
4181
+ if (!Ve || typeof window > "u") return {};
4147
4182
  try {
4148
- let e = JSON.parse(window.localStorage.getItem(Be) || "null");
4183
+ let e = JSON.parse(window.localStorage.getItem(Ve) || "null");
4149
4184
  if (!e || typeof e != "object" || Array.isArray(e)) return {};
4150
4185
  let t = {};
4151
4186
  for (let [n, r] of Object.entries(e)) Array.isArray(r) && (t[n] = r.filter((e) => typeof e == "string"));
@@ -4153,26 +4188,26 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
4153
4188
  } catch {
4154
4189
  return {};
4155
4190
  }
4156
- }), He = t(() => {
4157
- if (!(!Be || typeof window > "u")) try {
4158
- window.localStorage.setItem(Be, JSON.stringify(Ve));
4191
+ }), We = t(() => {
4192
+ if (!(!Ve || typeof window > "u")) try {
4193
+ window.localStorage.setItem(Ve, JSON.stringify(He));
4159
4194
  } catch {}
4160
- }, [Be, Ve]), Ue = t((e, t) => {
4161
- L((n) => ({
4195
+ }, [Ve, He]), Ge = t((e, t) => {
4196
+ Ue((n) => ({
4162
4197
  ...n,
4163
4198
  [e]: t
4164
4199
  }));
4165
- }, []), Ge = t(() => L({}), []), Ke = t((e) => !!E?.objectField && !String(e?.[E.objectField] ?? "").trim(), [E?.objectField]), R = t((e) => {
4200
+ }, []), qe = t(() => Ue({}), []), R = t((e) => !!E?.objectField && !String(e?.[E.objectField] ?? "").trim(), [E?.objectField]), Je = t((e) => {
4166
4201
  let t = (E?.objectField ? String(e[E.objectField] ?? "").trim() : "") || O, n = e.id ?? e._id;
4167
4202
  if (!t || n == null) return null;
4168
- let r = O ? ne(O, n) : null;
4203
+ let r = O ? ie(O, n) : null;
4169
4204
  return {
4170
4205
  objectName: t,
4171
4206
  recordId: n,
4172
4207
  href: !O || t === O ? r : r?.replace(`/${O}/record/`, `/${t}/record/`) ?? null
4173
4208
  };
4174
- }, [E?.objectField, O]), qe = i(() => {
4175
- let e = Object.entries(Ve).filter(([, e]) => e.length > 0);
4209
+ }, [E?.objectField, O]), z = i(() => {
4210
+ let e = Object.entries(He).filter(([, e]) => e.length > 0);
4176
4211
  if (!e.length) return N;
4177
4212
  let t = new Map(N.map((e) => [String(e.id), e])), n = /* @__PURE__ */ new Set();
4178
4213
  for (let r of N) {
@@ -4186,9 +4221,9 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
4186
4221
  return N.filter((e) => n.has(String(e.id)));
4187
4222
  }, [
4188
4223
  N,
4189
- Ve,
4224
+ He,
4190
4225
  I
4191
- ]), Ye = i(() => {
4226
+ ]), Xe = i(() => {
4192
4227
  if (E?.autoZoomToFilter !== !1 || !N.length) return null;
4193
4228
  let e = N[0].start.getTime(), t = N[0].end.getTime();
4194
4229
  for (let n of N) e = Math.min(e, n.start.getTime()), t = Math.max(t, n.end.getTime());
@@ -4196,162 +4231,162 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
4196
4231
  start: new Date(e),
4197
4232
  end: new Date(t)
4198
4233
  };
4199
- }, [N, E?.autoZoomToFilter]), Xe = e.navigation ?? {
4234
+ }, [N, E?.autoZoomToFilter]), Ze = e.navigation ?? {
4200
4235
  mode: "drawer",
4201
4236
  width: "min(960px, 60vw)"
4202
- }, Ze = Xe.mode === "drawer" || Xe.mode === "modal" || Xe.mode === "split" || Xe.mode === "popover", Qe = p({
4203
- navigation: Xe,
4237
+ }, Qe = Ze.mode === "drawer" || Ze.mode === "modal" || Ze.mode === "split" || Ze.mode === "popover", $e = m({
4238
+ navigation: Ze,
4204
4239
  objectName: e.objectName,
4205
- onRowClick: Ze ? void 0 : ee
4206
- }), [$e, et] = o(null), tt = Qe.isOverlay && Qe.isOpen ? Qe.selectedRecord : null;
4240
+ onRowClick: Qe ? void 0 : g
4241
+ }), [et, tt] = o(null), nt = $e.isOverlay && $e.isOpen ? $e.selectedRecord : null;
4207
4242
  r(() => {
4208
- if (!tt) {
4209
- et(null);
4243
+ if (!nt) {
4244
+ tt(null);
4210
4245
  return;
4211
4246
  }
4212
- let e = R(tt);
4247
+ let e = Je(nt);
4213
4248
  if (!e) {
4214
- et(null);
4249
+ tt(null);
4215
4250
  return;
4216
4251
  }
4217
4252
  let { objectName: t, recordId: n } = e;
4218
4253
  if (T?.provider !== "api" && t === O || !s || typeof s.findOne != "function") {
4219
- et(null);
4254
+ tt(null);
4220
4255
  return;
4221
4256
  }
4222
4257
  let r = `${t}:${n}`, i = !1;
4223
4258
  return (async () => {
4224
4259
  try {
4225
4260
  let [e, a] = await Promise.all([s.findOne(t, String(n)), typeof s.getObjectSchema == "function" ? s.getObjectSchema(t).catch(() => null) : Promise.resolve(null)]);
4226
- i || et(e ? {
4261
+ i || tt(e ? {
4227
4262
  key: r,
4228
4263
  record: e,
4229
4264
  schema: a
4230
4265
  } : null);
4231
4266
  } catch (e) {
4232
- console.error("[ObjectGantt] Failed to fetch drawer record, falling back to row payload:", e), i || et(null);
4267
+ console.error("[ObjectGantt] Failed to fetch drawer record, falling back to row payload:", e), i || tt(null);
4233
4268
  }
4234
4269
  })(), () => {
4235
4270
  i = !0;
4236
4271
  };
4237
4272
  }, [
4238
- tt,
4239
- R,
4273
+ nt,
4274
+ Je,
4240
4275
  T?.provider,
4241
4276
  O,
4242
4277
  s
4243
4278
  ]);
4244
- let nt = t(async (e, t) => {
4279
+ let rt = t(async (e, t) => {
4245
4280
  if (!E || !D || typeof D.update != "function") return;
4246
4281
  let { startDateField: n, endDateField: r, titleField: i, progressField: a } = E, o = {};
4247
4282
  if (t.start instanceof Date && (o[n] = t.start.toISOString()), t.end instanceof Date && (o[r] = t.end.toISOString()), typeof t.title == "string" && i && (o[i] = t.title), typeof t.progress == "number" && a && (o[a] = t.progress), Object.keys(o).length === 0) return;
4248
4283
  let s = e.data?.id ?? e.data?._id ?? e.id;
4249
4284
  if (s == null) return;
4250
- let c = S;
4251
- ye((e) => e.map((e) => String(e.id ?? e._id) === String(s) ? {
4285
+ let c = b;
4286
+ be((e) => e.map((e) => String(e.id ?? e._id) === String(s) ? {
4252
4287
  ...e,
4253
4288
  ...o
4254
4289
  } : e));
4255
4290
  try {
4256
4291
  await D.update(O, String(s), o), M({ silent: !0 });
4257
4292
  } catch (e) {
4258
- console.error("[ObjectGantt] Failed to persist task update:", e), ye(c), Ee(e);
4293
+ console.error("[ObjectGantt] Failed to persist task update:", e), be(c), Oe(e);
4259
4294
  }
4260
4295
  }, [
4261
4296
  E,
4262
4297
  D,
4263
4298
  O,
4264
- S,
4299
+ b,
4265
4300
  M,
4266
- Ee
4267
- ]), rt = (e, t) => {
4301
+ Oe
4302
+ ]), it = (e, t) => {
4268
4303
  let n = t.some((e) => typeof e == "object" && e.type && e.type !== "fs");
4269
4304
  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" ? {
4270
4305
  id: e.id,
4271
4306
  type: e.type
4272
4307
  } : e.id : e) : t.map((e) => typeof e == "object" ? e.id : e);
4273
- }, z = t(async (e, t, n) => {
4308
+ }, at = t(async (e, t, n) => {
4274
4309
  let r = E?.dependenciesField;
4275
4310
  if (!r || !D || typeof D.update != "function") return;
4276
- let i = rt(t, n), a = S;
4277
- ye((t) => t.map((t) => String(t.id ?? t._id) === String(e) ? {
4311
+ let i = it(t, n), a = b;
4312
+ be((t) => t.map((t) => String(t.id ?? t._id) === String(e) ? {
4278
4313
  ...t,
4279
4314
  [r]: i
4280
4315
  } : t));
4281
4316
  try {
4282
4317
  await D.update(O, String(e), { [r]: i }), M({ silent: !0 });
4283
4318
  } catch (e) {
4284
- console.error("[ObjectGantt] Failed to persist dependency:", e), ye(a), Ee(e);
4319
+ console.error("[ObjectGantt] Failed to persist dependency:", e), be(a), Oe(e);
4285
4320
  }
4286
4321
  }, [
4287
4322
  E,
4288
4323
  D,
4289
4324
  O,
4290
- S,
4325
+ b,
4291
4326
  M,
4292
- Ee
4293
- ]), it = t(async (e, t, n = "fs") => {
4327
+ Oe
4328
+ ]), ot = t(async (e, t, n = "fs") => {
4294
4329
  let r = e.data?.id ?? e.data?._id ?? e.id, i = t.data?.id ?? t.data?._id ?? t.id;
4295
4330
  if (r == null || i == null) return;
4296
4331
  let a = E?.dependenciesField;
4297
4332
  if (!a) return;
4298
- let o = S.find((e) => String(e.id ?? e._id) === String(i))?.[a], s = jt(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";
4333
+ let o = b.find((e) => String(e.id ?? e._id) === String(i))?.[a], s = Nt(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";
4299
4334
  if (l && u === n) return;
4300
4335
  let d = n === "fs" ? r : {
4301
4336
  id: r,
4302
4337
  type: n
4303
4338
  }, f = l ? s.map((e) => c(e) === String(r) ? d : e) : [...s, d];
4304
- await z(i, o, f);
4339
+ await at(i, o, f);
4305
4340
  }, [
4306
4341
  E,
4307
- S,
4308
- z
4309
- ]), at = t(async (e, t) => {
4342
+ b,
4343
+ at
4344
+ ]), st = t(async (e, t) => {
4310
4345
  let n = e.data?.id ?? e.data?._id ?? e.id, r = t.data?.id ?? t.data?._id ?? t.id;
4311
4346
  if (n == null || r == null) return;
4312
4347
  let i = E?.dependenciesField;
4313
4348
  if (!i) return;
4314
- let a = S.find((e) => String(e.id ?? e._id) === String(r))?.[i], o = jt(a), s = (e) => String(typeof e == "object" ? e.id : e), c = o.filter((e) => s(e) !== String(n));
4315
- c.length !== o.length && await z(r, a, c);
4349
+ let a = b.find((e) => String(e.id ?? e._id) === String(r))?.[i], o = Nt(a), s = (e) => String(typeof e == "object" ? e.id : e), c = o.filter((e) => s(e) !== String(n));
4350
+ c.length !== o.length && await at(r, a, c);
4316
4351
  }, [
4317
4352
  E,
4318
- S,
4319
- z
4320
- ]), [ot, st] = o(null), [ct, lt] = o(!1), ut = t((e) => {
4321
- st(e);
4322
- }, []), dt = t(async () => {
4323
- if (!ot) return;
4353
+ b,
4354
+ at
4355
+ ]), [ct, lt] = o(null), [ut, dt] = o(!1), ft = t((e) => {
4356
+ lt(e);
4357
+ }, []), pt = t(async () => {
4358
+ if (!ct) return;
4324
4359
  if (!D?.delete) {
4325
- st(null);
4360
+ lt(null);
4326
4361
  return;
4327
4362
  }
4328
- let e = ot.data?.id ?? ot.data?._id ?? ot.id;
4363
+ let e = ct.data?.id ?? ct.data?._id ?? ct.id;
4329
4364
  if (e == null) {
4330
- st(null);
4365
+ lt(null);
4331
4366
  return;
4332
4367
  }
4333
- lt(!0);
4334
- let t = S;
4335
- ye((t) => t.filter((t) => String(t.id ?? t._id) !== String(e)));
4368
+ dt(!0);
4369
+ let t = b;
4370
+ be((t) => t.filter((t) => String(t.id ?? t._id) !== String(e)));
4336
4371
  try {
4337
4372
  if (await D.delete(O, String(e)) === !1) throw Error(w("gantt.writeFailed"));
4338
- st(null), M({ silent: !0 });
4373
+ lt(null), M({ silent: !0 });
4339
4374
  } catch (e) {
4340
- console.error("[ObjectGantt] Failed to delete:", e), ye(t), st(null), Ee(e);
4375
+ console.error("[ObjectGantt] Failed to delete:", e), be(t), lt(null), Oe(e);
4341
4376
  } finally {
4342
- lt(!1);
4377
+ dt(!1);
4343
4378
  }
4344
4379
  }, [
4345
- ot,
4380
+ ct,
4346
4381
  D,
4347
4382
  O,
4348
- S,
4383
+ b,
4349
4384
  M,
4350
- Ee,
4385
+ Oe,
4351
4386
  w
4352
4387
  ]);
4353
- return be ? /* @__PURE__ */ k("div", {
4354
- className: m,
4388
+ return xe ? /* @__PURE__ */ k("div", {
4389
+ className: f,
4355
4390
  children: /* @__PURE__ */ k("div", {
4356
4391
  className: "flex items-center justify-center h-96",
4357
4392
  children: /* @__PURE__ */ k("div", {
@@ -4359,24 +4394,24 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
4359
4394
  children: "Loading Gantt chart..."
4360
4395
  })
4361
4396
  })
4362
- }) : Se ? /* @__PURE__ */ k("div", {
4363
- className: m,
4397
+ }) : Ce ? /* @__PURE__ */ k("div", {
4398
+ className: f,
4364
4399
  children: /* @__PURE__ */ k("div", {
4365
4400
  className: "flex items-center justify-center h-96",
4366
4401
  children: /* @__PURE__ */ A("div", {
4367
4402
  className: "text-destructive",
4368
- children: ["Error: ", Se.message]
4403
+ children: ["Error: ", Ce.message]
4369
4404
  })
4370
4405
  })
4371
4406
  }) : E ? /* @__PURE__ */ A("div", {
4372
- className: b("flex h-full min-h-0 flex-col", m),
4407
+ className: pe("flex h-full min-h-0 flex-col", f),
4373
4408
  children: [
4374
- Re.length > 0 && /* @__PURE__ */ k(Ot, {
4375
- filters: Re,
4376
- value: Ve,
4377
- onChange: Ue,
4378
- onClear: Ge,
4379
- resultCount: qe.length,
4409
+ L.length > 0 && /* @__PURE__ */ k(At, {
4410
+ filters: L,
4411
+ value: He,
4412
+ onChange: Ge,
4413
+ onClear: qe,
4414
+ resultCount: z.length,
4380
4415
  totalCount: N.length,
4381
4416
  labels: {
4382
4417
  all: w("gantt.quickFilter.all"),
@@ -4387,77 +4422,77 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
4387
4422
  }),
4388
4423
  /* @__PURE__ */ k("div", {
4389
4424
  className: "flex-1 min-h-[420px]",
4390
- children: E?.resourceView && P ? /* @__PURE__ */ k(St, {
4391
- tasks: qe,
4392
- assignee: P,
4393
- effort: Ne,
4425
+ children: E?.resourceView && Pe ? /* @__PURE__ */ k(wt, {
4426
+ tasks: z,
4427
+ assignee: Pe,
4428
+ effort: F,
4394
4429
  capacity: E?.capacity ?? 1,
4395
4430
  viewMode: e.viewMode || "day"
4396
- }) : /* @__PURE__ */ k(ht, {
4397
- tasks: qe,
4398
- startDate: Ye?.start,
4399
- endDate: Ye?.end,
4431
+ }) : /* @__PURE__ */ k(_t, {
4432
+ tasks: z,
4433
+ startDate: Xe?.start,
4434
+ endDate: Xe?.end,
4400
4435
  onTaskClick: (e) => {
4401
- Ke(e.data) || Qe.handleClick(e.data), h?.(e.data);
4436
+ R(e.data) || $e.handleClick(e.data), h?.(e.data);
4402
4437
  },
4403
- onTaskUpdate: nt,
4404
- onTaskDelete: ut,
4405
- onDependencyCreate: E?.dependenciesField ? it : void 0,
4406
- onDependencyDelete: E?.dependenciesField ? at : void 0,
4438
+ onTaskUpdate: rt,
4439
+ onTaskDelete: ft,
4440
+ onDependencyCreate: E?.dependenciesField ? ot : void 0,
4441
+ onDependencyDelete: E?.dependenciesField ? st : void 0,
4407
4442
  markers: e.markers,
4408
4443
  autoSchedule: !!E?.dependenciesField,
4409
4444
  rescheduleOnConflict: !!E?.dependenciesField,
4410
4445
  criticalPathDefault: !!e.criticalPath,
4411
- workingCalendar: F,
4412
- shiftSegments: Pe,
4446
+ workingCalendar: Fe,
4447
+ shiftSegments: Ie,
4413
4448
  showBaselines: e.showBaselines !== !1,
4414
4449
  readOnly: !!e.readOnly,
4415
4450
  mobileReadOnly: e.mobileReadOnly !== !1,
4416
- persistLayoutKey: ze,
4417
- onLayoutChange: Be ? He : void 0,
4418
- groupBy: Me,
4451
+ persistLayoutKey: Be,
4452
+ onLayoutChange: Ve ? We : void 0,
4453
+ groupBy: P,
4419
4454
  defaultCollapsedDepth: E?.defaultCollapsedDepth,
4420
4455
  summaryExtent: E?.summaryExtent,
4421
4456
  interactions: E?.interactions,
4422
4457
  dependencyTypes: E?.dependencyTypes,
4423
4458
  timeZone: E?.timeZone,
4424
- onBeforeTaskUpdate: y,
4459
+ onBeforeTaskUpdate: te,
4425
4460
  exportFileName: String(E?.exportFileName ?? e.label ?? C?.label ?? e.objectName ?? "") || void 0,
4426
4461
  inlineEdit: !0,
4427
4462
  onRefresh: (T?.provider === "object" || T?.provider === "api") && typeof D?.find == "function" ? () => M({ silent: !0 }) : void 0,
4428
- refreshing: Ae
4463
+ refreshing: Me
4429
4464
  })
4430
4465
  }),
4431
- Qe.isOverlay && Qe.isOpen && Qe.selectedRecord && (() => {
4432
- let t = Qe.selectedRecord, n = R(t);
4433
- if (!n || Ke(t)) return null;
4434
- let { objectName: r, recordId: i } = n, a = n.href ?? void 0, o = E?.titleField ? String(t[E.titleField] ?? w("gantt.drawer.fallbackTitle")) : w("gantt.drawer.fallbackTitle"), c = !!e.readOnly || (E?.lockField ? !!t[E.lockField] : !1), l = $e?.key === `${r}:${i}` ? $e : null, u = l?.record ?? t, d = l?.schema ?? (r === O ? C : void 0), f = l && s ? s : D;
4435
- return /* @__PURE__ */ k(v, {
4466
+ $e.isOverlay && $e.isOpen && $e.selectedRecord && (() => {
4467
+ let t = $e.selectedRecord, n = Je(t);
4468
+ if (!n || R(t)) return null;
4469
+ let { objectName: r, recordId: i } = n, a = n.href ?? void 0, o = E?.titleField ? String(t[E.titleField] ?? w("gantt.drawer.fallbackTitle")) : w("gantt.drawer.fallbackTitle"), c = !!e.readOnly || (E?.lockField ? !!t[E.lockField] : !1), l = et?.key === `${r}:${i}` ? et : null, u = l?.record ?? t, d = l?.schema ?? (r === O ? C : void 0), f = l && s ? s : D;
4470
+ return /* @__PURE__ */ k(re, {
4436
4471
  open: !0,
4437
- onClose: Qe.close,
4472
+ onClose: $e.close,
4438
4473
  title: o,
4439
4474
  record: u,
4440
4475
  objectName: r,
4441
4476
  recordId: i,
4442
4477
  dataSource: f ?? void 0,
4443
4478
  objectSchema: d,
4444
- width: Qe.width,
4479
+ width: $e.width,
4445
4480
  fullPageHref: a,
4446
4481
  onFieldSave: c ? void 0 : async (e, t) => {
4447
4482
  if (f?.update) {
4448
4483
  try {
4449
4484
  await f.update(r, String(i), { [e]: t });
4450
4485
  } catch (e) {
4451
- let t = H(e);
4486
+ let t = Ft(e);
4452
4487
  throw t ? Error(t) : e;
4453
4488
  }
4454
- l && et((n) => n && n.key === l.key ? {
4489
+ l && tt((n) => n && n.key === l.key ? {
4455
4490
  ...n,
4456
4491
  record: {
4457
4492
  ...n.record,
4458
4493
  [e]: t
4459
4494
  }
4460
- } : n), ye((n) => n.map((n) => String(n.id ?? n._id) === String(i) ? {
4495
+ } : n), be((n) => n.map((n) => String(n.id ?? n._id) === String(i) ? {
4461
4496
  ...n,
4462
4497
  [e]: t
4463
4498
  } : n)), M({ silent: !0 });
@@ -4468,34 +4503,34 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
4468
4503
  try {
4469
4504
  if (await D.delete(r, String(i)) === !1) throw Error(w("gantt.writeFailed"));
4470
4505
  } catch (e) {
4471
- throw Ee(e), e;
4506
+ throw Oe(e), e;
4472
4507
  }
4473
- ye((e) => e.filter((e) => String(e.id ?? e._id) !== String(i)));
4508
+ be((e) => e.filter((e) => String(e.id ?? e._id) !== String(i)));
4474
4509
  }
4475
4510
  }
4476
4511
  });
4477
4512
  })(),
4478
- /* @__PURE__ */ k(re, {
4479
- open: !!ot,
4513
+ /* @__PURE__ */ k(ae, {
4514
+ open: !!ct,
4480
4515
  onOpenChange: (e) => {
4481
- !e && !ct && st(null);
4516
+ !e && !ut && lt(null);
4482
4517
  },
4483
- children: /* @__PURE__ */ A(oe, { children: [/* @__PURE__ */ A(le, { children: [/* @__PURE__ */ k(ue, { children: w("gantt.delete.title") }), /* @__PURE__ */ k(se, { children: ot ? w("gantt.delete.body", { title: ot.title }) : null })] }), /* @__PURE__ */ A(ce, { children: [/* @__PURE__ */ k(ae, {
4484
- disabled: ct,
4518
+ children: /* @__PURE__ */ A(ce, { children: [/* @__PURE__ */ A(de, { children: [/* @__PURE__ */ k(fe, { children: w("gantt.delete.title") }), /* @__PURE__ */ k(le, { children: ct ? w("gantt.delete.body", { title: ct.title }) : null })] }), /* @__PURE__ */ A(ue, { children: [/* @__PURE__ */ k(se, {
4519
+ disabled: ut,
4485
4520
  children: w("gantt.delete.cancel")
4486
- }), /* @__PURE__ */ k(ie, {
4521
+ }), /* @__PURE__ */ k(oe, {
4487
4522
  onClick: (e) => {
4488
- e.preventDefault(), dt();
4523
+ e.preventDefault(), pt();
4489
4524
  },
4490
- disabled: ct,
4525
+ disabled: ut,
4491
4526
  "data-testid": "gantt-delete-confirm",
4492
4527
  className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
4493
- children: w(ct ? "gantt.delete.deleting" : "gantt.delete.confirm")
4528
+ children: w(ut ? "gantt.delete.deleting" : "gantt.delete.confirm")
4494
4529
  })] })] })
4495
4530
  })
4496
4531
  ]
4497
4532
  }) : /* @__PURE__ */ k("div", {
4498
- className: m,
4533
+ className: f,
4499
4534
  children: /* @__PURE__ */ k("div", {
4500
4535
  className: "flex items-center justify-center h-96",
4501
4536
  children: /* @__PURE__ */ k("div", {
@@ -4504,14 +4539,24 @@ var Ft = ({ schema: e, dataSource: s, className: m, onTaskClick: h, onRowClick:
4504
4539
  })
4505
4540
  })
4506
4541
  });
4507
- }, It = ({ schema: e }) => {
4508
- let { dataSource: t } = h() || {};
4509
- return /* @__PURE__ */ k(Ft, {
4542
+ }, Rt = {
4543
+ filter: !0,
4544
+ sort: !0
4545
+ }, zt = ({ schema: e }) => {
4546
+ let { dataSource: t } = g() || {};
4547
+ return /* @__PURE__ */ k(f, {
4510
4548
  schema: e,
4511
- dataSource: t
4549
+ mapping: Rt,
4550
+ dataSource: t,
4551
+ testId: "object-gantt",
4552
+ errorTitle: "This gantt chart’s data source could not be resolved",
4553
+ children: (e) => /* @__PURE__ */ k(Lt, {
4554
+ schema: e,
4555
+ dataSource: t
4556
+ })
4512
4557
  });
4513
4558
  };
4514
- s.register("object-gantt", It, {
4559
+ s.register("object-gantt", zt, {
4515
4560
  namespace: "plugin-gantt",
4516
4561
  label: "Object Gantt",
4517
4562
  category: "view",
@@ -4526,7 +4571,7 @@ s.register("object-gantt", It, {
4526
4571
  label: "Gantt Config",
4527
4572
  description: "startDateField, endDateField, titleField, progressField, percentageField, colorField, dependenciesField"
4528
4573
  }]
4529
- }), s.register("gantt", It, {
4574
+ }), s.register("gantt", zt, {
4530
4575
  namespace: "view",
4531
4576
  label: "Gantt View",
4532
4577
  category: "view",
@@ -4543,4 +4588,4 @@ s.register("object-gantt", It, {
4543
4588
  }]
4544
4589
  });
4545
4590
  //#endregion
4546
- export { ht as GanttView, Ft as ObjectGantt, It as ObjectGanttRenderer, Ot as QuickFilterBar, St as ResourceWorkload, Ke as bandAt, _t as computeWorkload, jt as normalizeDependencies, We as normalizeShiftSegments, kt as normalizeTaskType, Ue as parseHHMM, Ge as shiftDayStart };
4591
+ export { _t as GanttView, Lt as ObjectGantt, zt as ObjectGanttRenderer, At as QuickFilterBar, wt as ResourceWorkload, R as bandAt, yt as computeWorkload, Nt as normalizeDependencies, Ke as normalizeShiftSegments, jt as normalizeTaskType, Ge as parseHHMM, qe as shiftDayStart };