@keenaioc/data-view 0.0.0-poc.1 → 0.2.0-alpha.8

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.
Files changed (109) hide show
  1. package/CHANGELOG.md +105 -0
  2. package/DATA-PRIVACY.md +20 -0
  3. package/INTEGRATION.md +178 -0
  4. package/KNOWN-LIMITATIONS.md +34 -0
  5. package/LICENSE +21 -0
  6. package/README.md +67 -5
  7. package/dist/contracts.d.ts +33 -0
  8. package/dist/contracts.d.ts.map +1 -0
  9. package/dist/contracts.js +83 -0
  10. package/dist/contracts.js.map +1 -0
  11. package/dist/data-view.d.ts +3 -0
  12. package/dist/data-view.d.ts.map +1 -0
  13. package/dist/data-view.js +822 -0
  14. package/dist/data-view.js.map +1 -0
  15. package/dist/engine.d.ts +34 -0
  16. package/dist/engine.d.ts.map +1 -0
  17. package/dist/engine.js +307 -0
  18. package/dist/engine.js.map +1 -0
  19. package/dist/gantt-bar.d.ts +17 -0
  20. package/dist/gantt-bar.d.ts.map +1 -0
  21. package/dist/gantt-bar.js +142 -0
  22. package/dist/gantt-bar.js.map +1 -0
  23. package/dist/gantt-dependencies.d.ts +27 -0
  24. package/dist/gantt-dependencies.d.ts.map +1 -0
  25. package/dist/gantt-dependencies.js +218 -0
  26. package/dist/gantt-dependencies.js.map +1 -0
  27. package/dist/gantt-dependency-ui.d.ts +37 -0
  28. package/dist/gantt-dependency-ui.d.ts.map +1 -0
  29. package/dist/gantt-dependency-ui.js +79 -0
  30. package/dist/gantt-dependency-ui.js.map +1 -0
  31. package/dist/gantt-grid.d.ts +27 -0
  32. package/dist/gantt-grid.d.ts.map +1 -0
  33. package/dist/gantt-grid.js +72 -0
  34. package/dist/gantt-grid.js.map +1 -0
  35. package/dist/gantt-operations.d.ts +14 -0
  36. package/dist/gantt-operations.d.ts.map +1 -0
  37. package/dist/gantt-operations.js +103 -0
  38. package/dist/gantt-operations.js.map +1 -0
  39. package/dist/index.d.ts +17 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +17 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/operations.d.ts +11 -0
  44. package/dist/operations.d.ts.map +1 -0
  45. package/dist/operations.js +117 -0
  46. package/dist/operations.js.map +1 -0
  47. package/dist/registry.d.ts +13 -0
  48. package/dist/registry.d.ts.map +1 -0
  49. package/dist/registry.js +465 -0
  50. package/dist/registry.js.map +1 -0
  51. package/dist/remote-data.d.ts +19 -0
  52. package/dist/remote-data.d.ts.map +1 -0
  53. package/dist/remote-data.js +67 -0
  54. package/dist/remote-data.js.map +1 -0
  55. package/dist/row-move.d.ts +7 -0
  56. package/dist/row-move.d.ts.map +1 -0
  57. package/dist/row-move.js +27 -0
  58. package/dist/row-move.js.map +1 -0
  59. package/dist/schedule-view.d.ts +27 -0
  60. package/dist/schedule-view.d.ts.map +1 -0
  61. package/dist/schedule-view.js +122 -0
  62. package/dist/schedule-view.js.map +1 -0
  63. package/dist/schedule.d.ts +28 -0
  64. package/dist/schedule.d.ts.map +1 -0
  65. package/dist/schedule.js +97 -0
  66. package/dist/schedule.js.map +1 -0
  67. package/dist/style.css +986 -0
  68. package/dist/timeline.d.ts +25 -0
  69. package/dist/timeline.d.ts.map +1 -0
  70. package/dist/timeline.js +58 -0
  71. package/dist/timeline.js.map +1 -0
  72. package/dist/toolbar.d.ts +10 -0
  73. package/dist/toolbar.d.ts.map +1 -0
  74. package/dist/toolbar.js +31 -0
  75. package/dist/toolbar.js.map +1 -0
  76. package/dist/types.d.ts +472 -0
  77. package/dist/types.d.ts.map +1 -0
  78. package/dist/types.js +22 -0
  79. package/dist/types.js.map +1 -0
  80. package/dist/use-remote-data.d.ts +18 -0
  81. package/dist/use-remote-data.d.ts.map +1 -0
  82. package/dist/use-remote-data.js +12 -0
  83. package/dist/use-remote-data.js.map +1 -0
  84. package/dist/use-row-move.d.ts +12 -0
  85. package/dist/use-row-move.d.ts.map +1 -0
  86. package/dist/use-row-move.js +151 -0
  87. package/dist/use-row-move.js.map +1 -0
  88. package/dist/v2-panels.d.ts +37 -0
  89. package/dist/v2-panels.d.ts.map +1 -0
  90. package/dist/v2-panels.js +108 -0
  91. package/dist/v2-panels.js.map +1 -0
  92. package/dist/view-state.d.ts +30 -0
  93. package/dist/view-state.d.ts.map +1 -0
  94. package/dist/view-state.js +94 -0
  95. package/dist/view-state.js.map +1 -0
  96. package/dist/view-workspace.d.ts +3 -0
  97. package/dist/view-workspace.d.ts.map +1 -0
  98. package/dist/view-workspace.js +95 -0
  99. package/dist/view-workspace.js.map +1 -0
  100. package/dist/virtual-list.d.ts +12 -0
  101. package/dist/virtual-list.d.ts.map +1 -0
  102. package/dist/virtual-list.js +46 -0
  103. package/dist/virtual-list.js.map +1 -0
  104. package/package.json +19 -16
  105. package/index.d.ts +0 -2
  106. package/index.js +0 -5
  107. package/react.d.ts +0 -2
  108. package/react.js +0 -8
  109. package/style.css +0 -1
@@ -0,0 +1,142 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useRef, useState } from "react";
4
+ import { adjustGanttRange, canDragGantt, createGanttChanges, ganttDuration } from "./gantt-operations.js";
5
+ import { dayString } from "./schedule.js";
6
+ export function GanttBar({ item, fields, mapping, getRowId, monthStart, monthEnd, permissions, busy, onCommit, onOpen, onMessage, previewRequired = false }) {
7
+ const dragRef = useRef(null);
8
+ const pendingRef = useRef(false);
9
+ const suppressClickUntil = useRef(0);
10
+ const [preview, setPreview] = useState(null);
11
+ const [saving, setSaving] = useState(false);
12
+ const writable = Boolean(onCommit && canDragGantt(item.row, fields, mapping, permissions));
13
+ const editable = writable && !busy && !saving;
14
+ const range = preview ?? item;
15
+ const duration = ganttDuration(range.start, range.end, mapping.workdaysOnly);
16
+ const durationText = `${duration}${mapping.workdaysOnly ? " 工作天" : " 天"}`;
17
+ const summary = `${item.title},${dayString(range.start)} 至 ${dayString(range.end)},${durationText}`;
18
+ const monthLength = monthEnd - monthStart + 1;
19
+ const left = Math.max(monthStart, Math.min(monthEnd, range.start));
20
+ const right = Math.min(monthEnd, Math.max(left, range.end));
21
+ const short = right - left < 3;
22
+ const color = item.color ?? "#316bff";
23
+ const rgb = /^#[0-9a-f]{6}$/i.test(color) ? color.slice(1).match(/../g).map((v) => parseInt(v, 16)) : [49, 107, 255];
24
+ const textColor = rgb[0] * .299 + rgb[1] * .587 + rgb[2] * .114 > 160 ? "#17251c" : "#ffffff";
25
+ const style = { left: `${100 * (left - monthStart) / monthLength}%`, width: `${100 * (right - left + 1) / monthLength}%`, backgroundColor: color, color: textColor };
26
+ function cancel(target) {
27
+ const drag = dragRef.current;
28
+ dragRef.current = null;
29
+ setPreview(null);
30
+ if (drag && target?.hasPointerCapture(drag.pointerId))
31
+ target.releasePointerCapture(drag.pointerId);
32
+ if (drag) {
33
+ suppressClickUntil.current = Date.now() + 500;
34
+ onMessage("已取消日期調整");
35
+ }
36
+ }
37
+ function begin(event, action) {
38
+ if (!editable || pendingRef.current || dragRef.current || event.button !== 0 || !event.isPrimary)
39
+ return;
40
+ const track = event.currentTarget.closest(".hy-dv-gantt-track");
41
+ const dayWidth = (track?.getBoundingClientRect().width ?? 0) / monthLength;
42
+ if (!dayWidth)
43
+ return;
44
+ dragRef.current = { pointerId: event.pointerId, x: event.clientX, y: event.clientY, dayWidth, action, item, mapping: { ...mapping }, delta: 0, moved: false };
45
+ event.currentTarget.setPointerCapture(event.pointerId);
46
+ event.currentTarget.focus();
47
+ onMessage("");
48
+ }
49
+ function move(event) {
50
+ const drag = dragRef.current;
51
+ if (!drag || drag.pointerId !== event.pointerId)
52
+ return;
53
+ const dx = event.clientX - drag.x;
54
+ const dy = event.clientY - drag.y;
55
+ if (event.pointerType === "touch" && !drag.moved && Math.abs(dy) > 8 && Math.abs(dy) > Math.abs(dx)) {
56
+ cancel(event.currentTarget);
57
+ return;
58
+ }
59
+ if (Math.abs(dx) < 4 && !drag.moved)
60
+ return;
61
+ event.preventDefault();
62
+ drag.moved = true;
63
+ drag.delta = Math.round(dx / drag.dayWidth);
64
+ try {
65
+ const next = adjustGanttRange(drag.item, drag.action, drag.delta, drag.mapping.workdaysOnly);
66
+ setPreview(next);
67
+ onMessage(`${dayString(next.start)} 至 ${dayString(next.end)} · ${ganttDuration(next.start, next.end, drag.mapping.workdaysOnly)}${drag.mapping.workdaysOnly ? " 工作天" : " 天"},${previewRequired ? "放開預覽" : "放開儲存"},Esc 取消`);
68
+ }
69
+ catch (error) {
70
+ onMessage(error instanceof Error ? error.message : "日期無法調整");
71
+ }
72
+ }
73
+ async function save(snapshot, originalMapping, action, delta) {
74
+ if (!onCommit || pendingRef.current || !editable) {
75
+ setPreview(null);
76
+ return;
77
+ }
78
+ if (originalMapping.startFieldId !== mapping.startFieldId || originalMapping.endFieldId !== mapping.endFieldId || originalMapping.workdaysOnly !== mapping.workdaysOnly) {
79
+ setPreview(null);
80
+ onMessage("日期設定已變更,請重新拖曳");
81
+ return;
82
+ }
83
+ try {
84
+ const changes = createGanttChanges(snapshot.row, fields, originalMapping, getRowId, action, delta, permissions);
85
+ if (!changes.length) {
86
+ setPreview(null);
87
+ onMessage("");
88
+ return;
89
+ }
90
+ pendingRef.current = true;
91
+ setSaving(true);
92
+ const next = adjustGanttRange(snapshot, action, delta, originalMapping.workdaysOnly);
93
+ setPreview(next);
94
+ const saved = await onCommit(changes);
95
+ onMessage(saved === "cancelled" ? "已取消日期調整" : saved ? `已儲存:${dayString(next.start)} 至 ${dayString(next.end)}` : "儲存失敗或版本衝突,日期維持原值。");
96
+ }
97
+ catch (error) {
98
+ onMessage(error instanceof Error ? error.message : "日期儲存失敗");
99
+ }
100
+ finally {
101
+ pendingRef.current = false;
102
+ setSaving(false);
103
+ setPreview(null);
104
+ }
105
+ }
106
+ function finish(event) {
107
+ const drag = dragRef.current;
108
+ if (!drag || drag.pointerId !== event.pointerId)
109
+ return;
110
+ drag.delta = Math.round((event.clientX - drag.x) / drag.dayWidth);
111
+ drag.moved = drag.moved || Math.abs(event.clientX - drag.x) >= 4;
112
+ dragRef.current = null;
113
+ if (event.currentTarget.hasPointerCapture(event.pointerId))
114
+ event.currentTarget.releasePointerCapture(event.pointerId);
115
+ if (drag.moved) {
116
+ suppressClickUntil.current = Date.now() + 500;
117
+ void save(drag.item, drag.mapping, drag.action, drag.delta);
118
+ }
119
+ else {
120
+ setPreview(null);
121
+ onMessage("");
122
+ }
123
+ }
124
+ function key(event, action) {
125
+ if (event.key === "Escape" && dragRef.current) {
126
+ event.preventDefault();
127
+ cancel(event.currentTarget);
128
+ return;
129
+ }
130
+ if ((event.key === "ArrowLeft" || event.key === "ArrowRight") && editable && !dragRef.current) {
131
+ event.preventDefault();
132
+ event.stopPropagation();
133
+ void save(item, mapping, action, event.key === "ArrowRight" ? 1 : -1);
134
+ }
135
+ }
136
+ return _jsxs("div", { className: `hy-dv-gantt-bar ${editable ? "is-editable" : ""} ${preview ? "is-preview" : ""} ${saving ? "is-saving" : ""}`, style: style, title: summary, children: [_jsxs("button", { type: "button", className: "hy-dv-gantt-move", "aria-label": `${summary}${editable ? ";拖曳或左右鍵平移日期" : ";開啟詳情"}`, "aria-busy": saving, onPointerDown: (event) => begin(event, "move"), onPointerMove: move, onPointerUp: finish, onPointerCancel: (event) => cancel(event.currentTarget), onLostPointerCapture: () => { if (dragRef.current)
137
+ cancel(); }, onKeyDown: (event) => key(event, "move"), onClick: () => { if (!pendingRef.current && Date.now() >= suppressClickUntil.current)
138
+ onOpen(item.row); }, children: [_jsx("span", { className: "hy-dv-gantt-progress", "aria-hidden": true, style: { width: `${(item.progress ?? 0) * 100}%` } }), mapping.showTitle !== false && !short && _jsx("span", { className: "hy-dv-gantt-title", children: item.title }), mapping.showDuration !== false && _jsxs("span", { className: "hy-dv-gantt-duration", children: [duration, "\u5929"] }), mapping.showDuration === false && item.progress !== undefined && _jsxs("span", { className: "hy-dv-gantt-duration", children: [Math.round(item.progress * 100), "%"] })] }), writable && item.start >= monthStart && _jsx("button", { type: "button", className: "hy-dv-gantt-handle is-start", "aria-disabled": !editable, "aria-label": `調整 ${item.title} 開始日期;拖曳或使用左右鍵`, onPointerDown: (event) => begin(event, "start"), onPointerMove: move, onPointerUp: finish, onPointerCancel: (event) => cancel(event.currentTarget), onLostPointerCapture: () => { if (dragRef.current)
139
+ cancel(); }, onKeyDown: (event) => key(event, "start"), onClick: (event) => event.stopPropagation() }), writable && item.end <= monthEnd && _jsx("button", { type: "button", className: "hy-dv-gantt-handle is-end", "aria-disabled": !editable, "aria-label": `調整 ${item.title} 結束日期;拖曳或使用左右鍵`, onPointerDown: (event) => begin(event, "end"), onPointerMove: move, onPointerUp: finish, onPointerCancel: (event) => cancel(event.currentTarget), onLostPointerCapture: () => { if (dragRef.current)
140
+ cancel(); }, onKeyDown: (event) => key(event, "end"), onClick: (event) => event.stopPropagation() }), mapping.showTitle !== false && short && _jsx("span", { className: "hy-dv-gantt-outside-title", "aria-hidden": true, children: item.title })] });
141
+ }
142
+ //# sourceMappingURL=gantt-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-bar.js","sourceRoot":"","sources":["../src/gantt-bar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { BatchCommit, CellCommit, FieldDefinition, GanttDependency, GanttDependencyChange, GanttDependencyState, GanttMapping, DataViewPermissions, GanttScheduleGuard } from "./types.js";
2
+ /** Bounded graph validation. This validates relationships, not business workflow policy. */
3
+ export declare function validateGanttDependencies(links: GanttDependency[]): string | null;
4
+ export declare function applyGanttDependencyChange<Row>(state: GanttDependencyState<Row>, change: GanttDependencyChange): GanttDependency[];
5
+ /** Day-granularity FS: zero lag means the next day (or next Mon–Fri workday). */
6
+ export declare function dependencyEarliestStart(end: number, lagDays: number, workdaysOnly?: boolean): number;
7
+ export type GanttReschedulePlan<Row> = {
8
+ request: BatchCommit<Row>;
9
+ rootRowId: string;
10
+ affectedRowIds: string[];
11
+ unplannedCount: number;
12
+ };
13
+ /** Pure preview: never mutates data. Only pushes descendants later when an FS constraint requires it. */
14
+ export declare function createGanttReschedulePlan<Row>({ rows, fields, mapping, getRowId, dependencies, changes, permissions }: {
15
+ rows: Row[];
16
+ fields: FieldDefinition<Row>[];
17
+ mapping: GanttMapping;
18
+ getRowId: (row: Row) => string;
19
+ dependencies: GanttDependencyState<Row>;
20
+ changes: CellCommit<Row>[];
21
+ permissions?: DataViewPermissions<Row>;
22
+ }): GanttReschedulePlan<Row>;
23
+ /** Repeat both client-side at confirmation and server-side in the write transaction. */
24
+ export declare function validateGanttScheduleGuard<Row>(guard: GanttScheduleGuard, rows: Row[], fields: FieldDefinition<Row>[], getRowId: (row: Row) => string, state?: GanttDependencyState<Row>): void;
25
+ /** History retains the read set, swapping expected values only for the cells actually changed. */
26
+ export declare function ganttHistoryGuard<Row>(guard: GanttScheduleGuard | undefined, changes: CellCommit<Row>[], undo: boolean): GanttScheduleGuard | undefined;
27
+ //# sourceMappingURL=gantt-dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-dependencies.d.ts","sourceRoot":"","sources":["../src/gantt-dependencies.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhM,4FAA4F;AAC5F,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,GAAG,IAAI,CAgBjF;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,qBAAqB,GAAG,eAAe,EAAE,CAOlI;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,UAAQ,UAMzF;AAED,MAAM,MAAM,mBAAmB,CAAC,GAAG,IAAI;IACrC,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,yGAAyG;AACzG,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;IACtH,IAAI,EAAE,GAAG,EAAE,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;IACnG,YAAY,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;CAC7G,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAuE3B;AAED,wFAAwF;AACxF,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,EAAE,KAAK,CAAC,EAAE,oBAAoB,CAAC,GAAG,CAAC,QASxL;AAED,kGAAkG;AAClG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,kBAAkB,GAAG,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAOvJ"}
@@ -0,0 +1,218 @@
1
+ import { DataViewConflictError, getFieldValue } from "./engine.js";
2
+ import { createGanttChanges, isWorkday } from "./gantt-operations.js";
3
+ import { newOperationId, validateChanges } from "./operations.js";
4
+ import { dateDay, dayString } from "./schedule.js";
5
+ /** Bounded graph validation. This validates relationships, not business workflow policy. */
6
+ export function validateGanttDependencies(links) {
7
+ if (links.length > 2000)
8
+ return "依賴連線最多 2,000 條";
9
+ const ids = new Set();
10
+ const pairs = new Set();
11
+ const degrees = new Map();
12
+ const edges = new Map();
13
+ for (const link of links) {
14
+ if (!link.id || !link.predecessorId || !link.successorId || link.predecessorId === link.successorId)
15
+ return "依賴必須連接兩筆不同的資料";
16
+ const pair = JSON.stringify([link.predecessorId, link.successorId]);
17
+ if (ids.has(link.id) || pairs.has(pair))
18
+ return "依賴連線不可重複";
19
+ if (!Number.isInteger(link.lagDays) || link.lagDays < 0 || link.lagDays > 365)
20
+ return "等待天數需介於 0–365";
21
+ ids.add(link.id);
22
+ pairs.add(pair);
23
+ degrees.set(link.predecessorId, degrees.get(link.predecessorId) ?? 0);
24
+ degrees.set(link.successorId, (degrees.get(link.successorId) ?? 0) + 1);
25
+ edges.set(link.predecessorId, [...(edges.get(link.predecessorId) ?? []), link.successorId]);
26
+ }
27
+ const queue = [...degrees].filter(([, count]) => count === 0).map(([id]) => id);
28
+ for (let i = 0; i < queue.length; i++)
29
+ for (const id of edges.get(queue[i]) ?? []) {
30
+ degrees.set(id, degrees.get(id) - 1);
31
+ if (degrees.get(id) === 0)
32
+ queue.push(id);
33
+ }
34
+ return queue.length !== degrees.size ? "依賴形成循環,請移除互相等待的連線" : null;
35
+ }
36
+ export function applyGanttDependencyChange(state, change) {
37
+ if (state.revision !== change.revision)
38
+ throw new DataViewConflictError("依賴已更新,請重新操作");
39
+ if (!state.complete)
40
+ throw new Error("需載入完整依賴關係後才能修改");
41
+ if (change.action === "delete" && !state.links.some((link) => link.id === change.linkId))
42
+ throw new DataViewConflictError("連線已不存在");
43
+ const next = change.action === "add" ? [...state.links, change.link] : state.links.filter((link) => link.id !== change.linkId);
44
+ const error = validateGanttDependencies(next);
45
+ if (error)
46
+ throw new Error(error);
47
+ return next;
48
+ }
49
+ /** Day-granularity FS: zero lag means the next day (or next Mon–Fri workday). */
50
+ export function dependencyEarliestStart(end, lagDays, workdaysOnly = false) {
51
+ if (!Number.isInteger(end) || !Number.isInteger(lagDays) || lagDays < 0 || lagDays > 365)
52
+ throw new Error("無效的依賴日期或等待天數");
53
+ let day = end;
54
+ for (let step = 0; step <= lagDays; step++) {
55
+ day++;
56
+ if (workdaysOnly)
57
+ while (!isWorkday(day))
58
+ day++;
59
+ }
60
+ if (day > dateDay("9999-12-31"))
61
+ throw new Error("日期超出支援範圍");
62
+ return day;
63
+ }
64
+ /** Pure preview: never mutates data. Only pushes descendants later when an FS constraint requires it. */
65
+ export function createGanttReschedulePlan({ rows, fields, mapping, getRowId, dependencies, changes, permissions }) {
66
+ if (!dependencies.complete || !dependencies.revision)
67
+ throw new Error("依賴資料尚未完整載入,無法預覽改期");
68
+ const graphError = validateGanttDependencies(dependencies.links);
69
+ if (graphError)
70
+ throw new Error(graphError);
71
+ const startField = fields.find((f) => f.id === mapping.startFieldId);
72
+ const endField = fields.find((f) => f.id === mapping.endFieldId);
73
+ if (!startField || !endField || startField.id === endField.id || ![startField, endField].every((f) => ["date", "dateTime"].includes(f.type)))
74
+ throw new Error("請先指定兩個不同的日期欄位");
75
+ const rootRowId = changes[0]?.rowId;
76
+ if (!rootRowId || changes.length !== 2 || !changes.every((c) => c.rowId === rootRowId) || ![startField, endField].every((f) => changes.filter((c) => c.field.id === f.id).length === 1))
77
+ throw new Error("改期預覽需包含同一筆資料的起訖日期");
78
+ const rowMap = new Map(rows.map((row) => [getRowId(row), row]));
79
+ if (rowMap.size !== rows.length)
80
+ throw new Error("資料 ID 不可重複");
81
+ // Whole connected component includes upstream guards and every branch, even filtered/offscreen rows.
82
+ const adjacent = new Map();
83
+ const incoming = new Map();
84
+ const outgoing = new Map();
85
+ for (const link of dependencies.links) {
86
+ adjacent.set(link.predecessorId, [...(adjacent.get(link.predecessorId) ?? []), link.successorId]);
87
+ adjacent.set(link.successorId, [...(adjacent.get(link.successorId) ?? []), link.predecessorId]);
88
+ incoming.set(link.successorId, [...(incoming.get(link.successorId) ?? []), link]);
89
+ outgoing.set(link.predecessorId, [...(outgoing.get(link.predecessorId) ?? []), link]);
90
+ }
91
+ const component = new Set([rootRowId]);
92
+ const queue = [rootRowId];
93
+ for (let i = 0; i < queue.length; i++)
94
+ for (const id of adjacent.get(queue[i]) ?? [])
95
+ if (!component.has(id)) {
96
+ component.add(id);
97
+ queue.push(id);
98
+ }
99
+ if (component.size > 500)
100
+ throw new Error("單次改期最多涵蓋 500 筆相關資料");
101
+ const ranges = new Map();
102
+ const checks = [];
103
+ for (const id of component) {
104
+ const row = rowMap.get(id);
105
+ if (!row || [startField, endField].some((field) => field.canRead?.({ row, field }) === false))
106
+ throw new Error("相關排程資料不完整或無讀取權限,請交由有權限的人員處理");
107
+ const startValue = getFieldValue(row, startField);
108
+ const endValue = getFieldValue(row, endField);
109
+ const start = dateDay(startValue);
110
+ const end = dateDay(endValue);
111
+ for (const [field, value] of [[startField, startValue], [endField, endValue]])
112
+ if (field.type === "dateTime" && value != null && value !== "" && (typeof value !== "string" || !Number.isFinite(Date.parse(value))))
113
+ throw new Error("相關排程含無效日期時間,請先修正後再預覽");
114
+ // Blank dates are normal unscheduled work. Invalid nonblank values require correction.
115
+ if ((startValue != null && startValue !== "" && start === null) || (endValue != null && endValue !== "" && end === null) || (start !== null && end !== null && end < start))
116
+ throw new Error("相關排程含無效日期,請先修正後再預覽");
117
+ ranges.set(id, start === null || end === null ? null : { start, end });
118
+ checks.push({ rowId: id, startValue: structuredClone(startValue), endValue: structuredClone(endValue) });
119
+ }
120
+ const root = rowMap.get(rootRowId);
121
+ if (dependencies.isDateLocked?.(root))
122
+ throw new Error("這筆日期已確認或鎖定,請先解除鎖定再改期");
123
+ for (const c of changes)
124
+ if (JSON.stringify(getFieldValue(root, c.field)) !== JSON.stringify(c.previousValue))
125
+ throw new DataViewConflictError();
126
+ const rootStart = dateDay(changes.find((c) => c.field.id === startField.id).nextValue);
127
+ const rootEnd = dateDay(changes.find((c) => c.field.id === endField.id).nextValue);
128
+ if (rootStart === null || rootEnd === null || rootEnd < rootStart)
129
+ throw new Error("無效的改期範圍");
130
+ const finalChanges = [...changes];
131
+ ranges.set(rootRowId, { start: rootStart, end: rootEnd });
132
+ const affected = [rootRowId];
133
+ const unplanned = new Set();
134
+ // Root may not move ahead of an existing predecessor.
135
+ for (const link of incoming.get(rootRowId) ?? []) {
136
+ const before = ranges.get(link.predecessorId);
137
+ if (!before) {
138
+ unplanned.add(link.predecessorId);
139
+ continue;
140
+ }
141
+ if (rootStart < dependencyEarliestStart(before.end, link.lagDays, mapping.workdaysOnly))
142
+ throw new Error(`改期早於前置工作的可開始日期 ${dayString(dependencyEarliestStart(before.end, link.lagDays, mapping.workdaysOnly))}`);
143
+ }
144
+ const descendants = new Set();
145
+ const descendQueue = [rootRowId];
146
+ for (let i = 0; i < descendQueue.length; i++)
147
+ for (const link of outgoing.get(descendQueue[i]) ?? [])
148
+ if (!descendants.has(link.successorId)) {
149
+ descendants.add(link.successorId);
150
+ descendQueue.push(link.successorId);
151
+ }
152
+ const degree = new Map([...component].map((id) => [id, (incoming.get(id) ?? []).length]));
153
+ const order = [...component].filter((id) => degree.get(id) === 0);
154
+ for (let i = 0; i < order.length; i++)
155
+ for (const link of outgoing.get(order[i]) ?? []) {
156
+ degree.set(link.successorId, degree.get(link.successorId) - 1);
157
+ if (degree.get(link.successorId) === 0)
158
+ order.push(link.successorId);
159
+ }
160
+ for (const id of order) {
161
+ if (!descendants.has(id))
162
+ continue;
163
+ const range = ranges.get(id);
164
+ if (!range) {
165
+ unplanned.add(id);
166
+ continue;
167
+ }
168
+ let minimum = range.start;
169
+ for (const link of incoming.get(id) ?? []) {
170
+ const before = ranges.get(link.predecessorId);
171
+ if (!before) {
172
+ unplanned.add(link.predecessorId);
173
+ continue;
174
+ }
175
+ minimum = Math.max(minimum, dependencyEarliestStart(before.end, link.lagDays, mapping.workdaysOnly));
176
+ }
177
+ if (minimum === range.start)
178
+ continue; // Keep existing buffer; no automatic pull-forward.
179
+ const row = rowMap.get(id);
180
+ if (dependencies.isDateLocked?.(row))
181
+ throw new Error("後續有已確認或鎖定的日期,需先協調後才能套用改期");
182
+ const next = createGanttChanges(row, fields, mapping, getRowId, "move", minimum - range.start, permissions);
183
+ finalChanges.push(...next);
184
+ affected.push(id);
185
+ ranges.set(id, { start: dateDay(next.find((c) => c.field.id === startField.id).nextValue), end: dateDay(next.find((c) => c.field.id === endField.id).nextValue) });
186
+ }
187
+ const error = validateChanges(finalChanges, permissions);
188
+ if (error)
189
+ throw new Error(error);
190
+ return { rootRowId, affectedRowIds: affected, unplannedCount: unplanned.size, request: { id: newOperationId(), reason: "edit", changes: finalChanges, scheduleGuard: { revision: dependencies.revision, startFieldId: startField.id, endFieldId: endField.id, workdaysOnly: mapping.workdaysOnly === true, checks } } };
191
+ }
192
+ /** Repeat both client-side at confirmation and server-side in the write transaction. */
193
+ export function validateGanttScheduleGuard(guard, rows, fields, getRowId, state) {
194
+ if (!state?.complete || state.revision !== guard.revision)
195
+ throw new DataViewConflictError("依賴關係已更新,請重新預覽");
196
+ const start = fields.find((f) => f.id === guard.startFieldId);
197
+ const end = fields.find((f) => f.id === guard.endFieldId);
198
+ if (!start || !end)
199
+ throw new DataViewConflictError("日期欄位已變更");
200
+ const rowMap = new Map(rows.map((row) => [getRowId(row), row]));
201
+ for (const check of guard.checks) {
202
+ const row = rowMap.get(check.rowId);
203
+ if (!row || [start, end].some((field) => field.canRead?.({ row, field }) === false) || JSON.stringify(getFieldValue(row, start)) !== JSON.stringify(check.startValue) || JSON.stringify(getFieldValue(row, end)) !== JSON.stringify(check.endValue))
204
+ throw new DataViewConflictError("預覽後相關日期已更新或無權限,請重新預覽");
205
+ }
206
+ }
207
+ /** History retains the read set, swapping expected values only for the cells actually changed. */
208
+ export function ganttHistoryGuard(guard, changes, undo) {
209
+ if (!guard)
210
+ return undefined;
211
+ const values = new Map(changes.map((c) => [JSON.stringify([c.rowId, c.field.id]), undo ? c.nextValue : c.previousValue]));
212
+ return { ...guard, checks: guard.checks.map((check) => {
213
+ const startKey = JSON.stringify([check.rowId, guard.startFieldId]);
214
+ const endKey = JSON.stringify([check.rowId, guard.endFieldId]);
215
+ return { ...check, startValue: values.has(startKey) ? values.get(startKey) : check.startValue, endValue: values.has(endKey) ? values.get(endKey) : check.endValue };
216
+ }) };
217
+ }
218
+ //# sourceMappingURL=gantt-dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-dependencies.js","sourceRoot":"","sources":["../src/gantt-dependencies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type GanttReschedulePlan } from "./gantt-dependencies.js";
2
+ import type { FieldDefinition, GanttDependencyChange, GanttDependencyState, GanttMapping } from "./types.js";
3
+ import type { ScheduleItem } from "./schedule.js";
4
+ export declare function scheduleRowLabel<Row>(row: Row, fields: FieldDefinition<Row>[], mapping: GanttMapping): string;
5
+ export declare function GanttDependencyPanel<Row>({ rows, fields, mapping, getRowId, state, onChange, onClose, busy }: {
6
+ rows: Row[];
7
+ fields: FieldDefinition<Row>[];
8
+ mapping: GanttMapping;
9
+ getRowId: (row: Row) => string;
10
+ state: GanttDependencyState<Row>;
11
+ onChange?: (change: GanttDependencyChange) => Promise<boolean>;
12
+ onClose: () => void;
13
+ busy: boolean;
14
+ }): import("react/jsx-runtime").JSX.Element;
15
+ export declare function GanttRescheduleReview<Row>({ plan, fields, mapping, onClose, onApply, busy, error }: {
16
+ plan: GanttReschedulePlan<Row>;
17
+ fields: FieldDefinition<Row>[];
18
+ mapping: GanttMapping;
19
+ onClose: () => void;
20
+ onApply: () => void;
21
+ busy: boolean;
22
+ error: string;
23
+ }): import("react/jsx-runtime").JSX.Element;
24
+ /** Draw only endpoints visible on this page and within the displayed time window. */
25
+ export declare function GanttDependencyLines<Row>({ items, state, start, end, workdaysOnly, dayWidth, rowHeight }: {
26
+ dayWidth?: number;
27
+ rowHeight?: number;
28
+ items: Array<{
29
+ item: ScheduleItem<Row>;
30
+ y: number;
31
+ }>;
32
+ state: GanttDependencyState<Row>;
33
+ start: number;
34
+ end: number;
35
+ workdaysOnly?: boolean;
36
+ }): import("react/jsx-runtime").JSX.Element;
37
+ //# sourceMappingURL=gantt-dependency-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-dependency-ui.d.ts","sourceRoot":"","sources":["../src/gantt-dependency-ui.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAuD,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGxH,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,YAAY,UAGpG;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAC7G,IAAI,EAAE,GAAG,EAAE,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;IACnG,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;CACtI,2CA8BA;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IACnG,IAAI,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IACtF,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;CACxE,2CAWA;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,QAAa,EAAE,SAAc,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,2CAezS"}
@@ -0,0 +1,79 @@
1
+ "use client";
2
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
+ import { useId, useRef, useState } from "react";
4
+ import { getFieldValue } from "./engine.js";
5
+ import { formatReadableValue } from "./registry.js";
6
+ import { applyGanttDependencyChange, dependencyEarliestStart } from "./gantt-dependencies.js";
7
+ import { newOperationId } from "./operations.js";
8
+ import { DataViewDialog } from "./v2-panels.js";
9
+ export function scheduleRowLabel(row, fields, mapping) {
10
+ const field = fields.find((f) => f.id === mapping.titleFieldId);
11
+ return field && !field.internal && field.canRead?.({ row, field }) !== false ? formatReadableValue(getFieldValue(row, field), { ...field, internal: false }, row) || "未命名" : "無權限";
12
+ }
13
+ export function GanttDependencyPanel({ rows, fields, mapping, getRowId, state, onChange, onClose, busy }) {
14
+ const [before, setBefore] = useState("");
15
+ const [after, setAfter] = useState("");
16
+ const [lag, setLag] = useState("0");
17
+ const [message, setMessage] = useState("");
18
+ const pending = useRef(false);
19
+ const readable = rows.filter((row) => [mapping.titleFieldId, mapping.startFieldId, mapping.endFieldId].every((id) => { const field = fields.find((f) => f.id === id); return field && !field.internal && field.canRead?.({ row, field }) !== false; }));
20
+ const labels = new Map(readable.map((row) => [getRowId(row), scheduleRowLabel(row, fields, mapping)]));
21
+ const visible = state.links.filter((link) => labels.has(link.predecessorId) && labels.has(link.successorId));
22
+ async function apply(change) {
23
+ if (!onChange || busy || pending.current)
24
+ return;
25
+ try {
26
+ applyGanttDependencyChange(state, change);
27
+ pending.current = true;
28
+ if (await onChange(change)) {
29
+ setMessage(change.action === "add" ? "依賴已新增,日期保持原值" : "依賴已移除,資料與日期保持原值");
30
+ if (change.action === "add") {
31
+ setBefore("");
32
+ setAfter("");
33
+ }
34
+ }
35
+ else
36
+ setMessage("依賴未儲存,請查看儲存提示");
37
+ }
38
+ catch (error) {
39
+ setMessage(error instanceof Error ? error.message : "依賴無法儲存");
40
+ }
41
+ finally {
42
+ pending.current = false;
43
+ }
44
+ }
45
+ return _jsxs(DataViewDialog, { title: "\u4F9D\u8CF4\u9023\u7DDA", onClose: onClose, busy: busy, children: [_jsxs("p", { children: ["\u524D\u9805\u5B8C\u6210\u5F8C\uFF0C\u5F8C\u9805\u6700\u65E9\u65BC\u4E0B\u4E00", mapping.workdaysOnly ? "工作" : "", "\u5929\u958B\u59CB\u3002\u7B49\u5F85\u5929\u6578\u6703\u518D\u5F80\u5F8C\u52A0\uFF1B\u65B0\u589E\u9023\u7DDA\u4E0D\u6703\u76F4\u63A5\u6539\u65E5\u671F\u3002"] }), onChange && _jsx("form", { className: "hy-dv-form", onSubmit: (e) => { e.preventDefault(); void apply({ action: "add", revision: state.revision, link: { id: newOperationId(), predecessorId: before, successorId: after, lagDays: Number(lag) } }); }, children: _jsxs("fieldset", { disabled: busy || !state.complete, children: [_jsx("legend", { children: "\u65B0\u589E\u4F9D\u8CF4" }), _jsxs("label", { children: ["\u524D\u7F6E\u5DE5\u4F5C", _jsxs("select", { required: true, value: before, onChange: (e) => setBefore(e.target.value), children: [_jsx("option", { value: "", children: "\u9078\u64C7\u524D\u7F6E\u5DE5\u4F5C" }), readable.map((row) => _jsx("option", { value: getRowId(row), children: labels.get(getRowId(row)) }, getRowId(row)))] })] }), _jsxs("label", { children: ["\u5F8C\u7E8C\u5DE5\u4F5C", _jsxs("select", { required: true, value: after, onChange: (e) => setAfter(e.target.value), children: [_jsx("option", { value: "", children: "\u9078\u64C7\u5F8C\u7E8C\u5DE5\u4F5C" }), readable.filter((row) => getRowId(row) !== before).map((row) => _jsx("option", { value: getRowId(row), children: labels.get(getRowId(row)) }, getRowId(row)))] })] }), _jsxs("label", { children: ["\u984D\u5916\u7B49\u5F85", mapping.workdaysOnly ? "工作天" : "天數", _jsx("input", { type: "number", min: "0", max: "365", step: "1", required: true, value: lag, onChange: (e) => setLag(e.target.value) })] }), _jsx("button", { className: "hy-dv-primary", type: "submit", disabled: !before || !after || before === after, children: "\u65B0\u589E\u9023\u7DDA" })] }) }), !state.complete && _jsx("p", { role: "status", children: "\u4F9D\u8CF4\u8CC7\u6599\u5C1A\u672A\u5B8C\u6574\u8F09\u5165\uFF0C\u76EE\u524D\u50C5\u4F9B\u67E5\u770B\u3002" }), _jsx("ul", { className: "hy-dv-dependency-list", children: visible.map((link) => _jsxs("li", { children: [_jsxs("span", { children: [labels.get(link.predecessorId), " \u2192 ", labels.get(link.successorId), _jsxs("small", { children: ["\u984D\u5916\u7B49\u5F85 ", link.lagDays, " ", mapping.workdaysOnly ? "工作天" : "天"] })] }), onChange && _jsx("button", { disabled: busy || !state.complete, "aria-label": `移除 ${labels.get(link.predecessorId)} 到 ${labels.get(link.successorId)} 的連線`, onClick: () => void apply({ action: "delete", revision: state.revision, linkId: link.id }), children: "\u79FB\u9664\u9023\u7DDA" })] }, link.id)) }), !visible.length && _jsx("p", { children: "\u76EE\u524D\u6C92\u6709\u53EF\u986F\u793A\u7684\u4F9D\u8CF4\u3002" }), message && _jsx("p", { role: "status", children: message })] });
46
+ }
47
+ export function GanttRescheduleReview({ plan, fields, mapping, onClose, onApply, busy, error }) {
48
+ return _jsxs(DataViewDialog, { title: "\u6539\u671F\u9810\u89BD", onClose: onClose, busy: busy, children: [_jsxs("p", { children: ["\u5C07\u8ABF\u6574 ", plan.affectedRowIds.length, " \u7B46\u3002\u5F8C\u7E8C\u5DE5\u4F5C\u4FDD\u7559\u539F\u5DE5\u671F\uFF1B\u5DF2\u6709\u7DE9\u885D\u6703\u4FDD\u7559\uFF0C\u65E5\u671F\u63D0\u65E9\u6642\u4E0D\u81EA\u52D5\u628A\u5F8C\u7E8C\u5DE5\u4F5C\u62C9\u524D\u3002"] }), _jsx("div", { className: "hy-dv-review-scroll", children: _jsxs("table", { className: "hy-dv-reschedule-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "\u5DE5\u4F5C" }), _jsx("th", { children: "\u539F\u65E5\u671F" }), _jsx("th", { children: "\u5EFA\u8B70\u65E5\u671F" }), _jsx("th", { children: "\u539F\u56E0" })] }) }), _jsx("tbody", { children: plan.affectedRowIds.map((id) => {
49
+ const pair = plan.request.changes.filter((c) => c.rowId === id);
50
+ const start = pair.find((c) => c.field.id === mapping.startFieldId);
51
+ const end = pair.find((c) => c.field.id === mapping.endFieldId);
52
+ return _jsxs("tr", { children: [_jsx("th", { children: scheduleRowLabel(pair[0].row, fields, mapping) }), _jsxs("td", { children: [String(start.previousValue), _jsx("br", {}), "\u81F3 ", String(end.previousValue)] }), _jsxs("td", { children: [String(start.nextValue), _jsx("br", {}), "\u81F3 ", String(end.nextValue)] }), _jsx("td", { children: id === plan.rootRowId ? "本次調整" : "前置工作影響" })] }, id);
53
+ }) })] }) }), plan.unplannedCount > 0 && _jsxs("p", { children: ["\u76F8\u95DC\u5DE5\u4F5C\u4E2D\u6709 ", plan.unplannedCount, " \u7B46\u5C1A\u672A\u6392\u5B9A\u5B8C\u6574\u65E5\u671F\uFF0C\u4FDD\u6301\u7A7A\u767D\uFF1B\u9019\u4E9B\u4F9D\u8CF4\u4ECD\u9700\u4E4B\u5F8C\u78BA\u8A8D\u3002"] }), error && _jsx("p", { role: "alert", children: error }), _jsxs("div", { className: "hy-dv-actions", children: [_jsx("button", { disabled: busy, onClick: onClose, children: "\u53D6\u6D88" }), _jsx("button", { className: "hy-dv-primary", disabled: busy || Boolean(error), onClick: onApply, children: busy ? "正在套用…" : "確認套用改期" })] })] });
54
+ }
55
+ /** Draw only endpoints visible on this page and within the displayed time window. */
56
+ export function GanttDependencyLines({ items, state, start, end, workdaysOnly, dayWidth = 36, rowHeight = 46 }) {
57
+ const marker = useId().replace(/[^a-z0-9_-]/gi, "");
58
+ const positions = new Map(items.map((entry) => [entry.item.id, entry]));
59
+ const width = (end - start + 1) * dayWidth;
60
+ const height = Math.max(0, ...items.map((entry) => entry.y + rowHeight / 2));
61
+ return _jsxs("svg", { className: "hy-dv-dependency-lines", viewBox: `0 0 ${width} ${Math.max(1, height)}`, preserveAspectRatio: "none", style: { height }, "aria-hidden": "true", children: [_jsx("defs", { children: _jsx("marker", { id: marker, markerWidth: "7", markerHeight: "7", refX: "6", refY: "3.5", orient: "auto", children: _jsx("path", { d: "M0,0 L7,3.5 L0,7 Z", fill: "context-stroke" }) }) }), state.links.map((link) => {
62
+ const a = positions.get(link.predecessorId);
63
+ const b = positions.get(link.successorId);
64
+ if (!a || !b || a.item.end < start || a.item.end > end || b.item.start < start || b.item.start > end)
65
+ return null;
66
+ let conflict = false;
67
+ try {
68
+ conflict = b.item.start < dependencyEarliestStart(a.item.end, link.lagDays, workdaysOnly);
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ const x1 = (a.item.end - start + 1) * dayWidth;
74
+ const x2 = (b.item.start - start) * dayWidth;
75
+ const middleY = a.y < b.y ? b.y - 19 : b.y + 19;
76
+ return _jsx("path", { d: `M ${x1} ${a.y} H ${x1 + 9} V ${middleY} H ${x2 - 9} V ${b.y} H ${x2 - 1}`, fill: "none", stroke: conflict ? "#c33a31" : "#61788c", strokeWidth: "1.5", vectorEffect: "non-scaling-stroke", markerEnd: `url(#${marker})` }, link.id);
77
+ })] });
78
+ }
79
+ //# sourceMappingURL=gantt-dependency-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-dependency-ui.js","sourceRoot":"","sources":["../src/gantt-dependency-ui.tsx"],"names":[],"mappings":"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"}