@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.
- package/CHANGELOG.md +105 -0
- package/DATA-PRIVACY.md +20 -0
- package/INTEGRATION.md +178 -0
- package/KNOWN-LIMITATIONS.md +34 -0
- package/LICENSE +21 -0
- package/README.md +67 -5
- package/dist/contracts.d.ts +33 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +83 -0
- package/dist/contracts.js.map +1 -0
- package/dist/data-view.d.ts +3 -0
- package/dist/data-view.d.ts.map +1 -0
- package/dist/data-view.js +822 -0
- package/dist/data-view.js.map +1 -0
- package/dist/engine.d.ts +34 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +307 -0
- package/dist/engine.js.map +1 -0
- package/dist/gantt-bar.d.ts +17 -0
- package/dist/gantt-bar.d.ts.map +1 -0
- package/dist/gantt-bar.js +142 -0
- package/dist/gantt-bar.js.map +1 -0
- package/dist/gantt-dependencies.d.ts +27 -0
- package/dist/gantt-dependencies.d.ts.map +1 -0
- package/dist/gantt-dependencies.js +218 -0
- package/dist/gantt-dependencies.js.map +1 -0
- package/dist/gantt-dependency-ui.d.ts +37 -0
- package/dist/gantt-dependency-ui.d.ts.map +1 -0
- package/dist/gantt-dependency-ui.js +79 -0
- package/dist/gantt-dependency-ui.js.map +1 -0
- package/dist/gantt-grid.d.ts +27 -0
- package/dist/gantt-grid.d.ts.map +1 -0
- package/dist/gantt-grid.js +72 -0
- package/dist/gantt-grid.js.map +1 -0
- package/dist/gantt-operations.d.ts +14 -0
- package/dist/gantt-operations.d.ts.map +1 -0
- package/dist/gantt-operations.js +103 -0
- package/dist/gantt-operations.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/operations.d.ts +11 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +117 -0
- package/dist/operations.js.map +1 -0
- package/dist/registry.d.ts +13 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +465 -0
- package/dist/registry.js.map +1 -0
- package/dist/remote-data.d.ts +19 -0
- package/dist/remote-data.d.ts.map +1 -0
- package/dist/remote-data.js +67 -0
- package/dist/remote-data.js.map +1 -0
- package/dist/row-move.d.ts +7 -0
- package/dist/row-move.d.ts.map +1 -0
- package/dist/row-move.js +27 -0
- package/dist/row-move.js.map +1 -0
- package/dist/schedule-view.d.ts +27 -0
- package/dist/schedule-view.d.ts.map +1 -0
- package/dist/schedule-view.js +122 -0
- package/dist/schedule-view.js.map +1 -0
- package/dist/schedule.d.ts +28 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/schedule.js +97 -0
- package/dist/schedule.js.map +1 -0
- package/dist/style.css +986 -0
- package/dist/timeline.d.ts +25 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +58 -0
- package/dist/timeline.js.map +1 -0
- package/dist/toolbar.d.ts +10 -0
- package/dist/toolbar.d.ts.map +1 -0
- package/dist/toolbar.js +31 -0
- package/dist/toolbar.js.map +1 -0
- package/dist/types.d.ts +472 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -0
- package/dist/use-remote-data.d.ts +18 -0
- package/dist/use-remote-data.d.ts.map +1 -0
- package/dist/use-remote-data.js +12 -0
- package/dist/use-remote-data.js.map +1 -0
- package/dist/use-row-move.d.ts +12 -0
- package/dist/use-row-move.d.ts.map +1 -0
- package/dist/use-row-move.js +151 -0
- package/dist/use-row-move.js.map +1 -0
- package/dist/v2-panels.d.ts +37 -0
- package/dist/v2-panels.d.ts.map +1 -0
- package/dist/v2-panels.js +108 -0
- package/dist/v2-panels.js.map +1 -0
- package/dist/view-state.d.ts +30 -0
- package/dist/view-state.d.ts.map +1 -0
- package/dist/view-state.js +94 -0
- package/dist/view-state.js.map +1 -0
- package/dist/view-workspace.d.ts +3 -0
- package/dist/view-workspace.d.ts.map +1 -0
- package/dist/view-workspace.js +95 -0
- package/dist/view-workspace.js.map +1 -0
- package/dist/virtual-list.d.ts +12 -0
- package/dist/virtual-list.d.ts.map +1 -0
- package/dist/virtual-list.js +46 -0
- package/dist/virtual-list.js.map +1 -0
- package/package.json +19 -16
- package/index.d.ts +0 -2
- package/index.js +0 -5
- package/react.d.ts +0 -2
- package/react.js +0 -8
- 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":"AAAA,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGnD,4FAA4F;AAC5F,MAAM,UAAU,yBAAyB,CAAC,KAAwB;IAChE,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;QAAE,OAAO,gBAAgB,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAAC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAAC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAAC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IACrJ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,WAAW;YAAE,OAAO,eAAe,CAAC;QAC5H,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QACpE,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,UAAU,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,GAAG;YAAE,OAAO,eAAe,CAAC;QACtG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAChF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,GAAG,CAAC,CAAC,CAAC;YAAC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IACxK,OAAO,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAM,KAAgC,EAAE,MAA6B;IAC7G,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;QAAE,MAAM,IAAI,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACvF,IAAI,CAAC,KAAK,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACpI,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/H,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAAC,IAAI,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,uBAAuB,CAAC,GAAW,EAAE,OAAe,EAAE,YAAY,GAAG,KAAK;IACxF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1H,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAAC,GAAG,EAAE,CAAC;QAAC,IAAI,YAAY;YAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;gBAAE,GAAG,EAAE,CAAC;IAAC,CAAC;IACvG,IAAI,GAAG,GAAG,OAAO,CAAC,YAAY,CAAE;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9D,OAAO,GAAG,CAAC;AACb,CAAC;AASD,yGAAyG;AACzG,MAAM,UAAU,yBAAyB,CAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAGnH;IACC,IAAI,CAAC,YAAY,CAAC,QAAQ,IAAI,CAAC,YAAY,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC3F,MAAM,UAAU,GAAG,yBAAyB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAAC,IAAI,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9G,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACvI,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/K,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;IACpC,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC9N,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAC/D,qGAAqG;IACrG,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAAC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IAAC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC3J,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;QACtC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAClG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAChG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAClF,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAAC,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC;IAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;IACpJ,IAAI,SAAS,CAAC,IAAI,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiD,CAAC;IACxE,MAAM,MAAM,GAAiC,EAAE,CAAC;IAChD,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,KAAK,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC9I,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAAC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACjG,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAAC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjE,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAU;YAAE,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACtQ,uFAAuF;QACvF,IAAI,CAAC,UAAU,IAAI,IAAI,IAAI,UAAU,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK,EAAE,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACnN,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,eAAe,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;IACpC,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC/E,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;YAAE,MAAM,IAAI,qBAAqB,EAAE,CAAC;IACjJ,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAE,CAAC,SAAS,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAE,CAAC,SAAS,CAAC,CAAC;IACpF,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,GAAG,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9F,MAAM,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7F,MAAM,QAAQ,GAAG,CAAC,SAAS,CAAC,CAAC;IAAC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAClE,sDAAsD;IACtD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC7D,IAAI,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,CAAC,uBAAuB,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IACnN,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAAC,MAAM,YAAY,GAAG,CAAC,SAAS,CAAC,CAAC;IACxE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAAC,CAAC;IACzN,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAE,GAAG,CAAC,CAAC,CAAC;YAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAAC,CAAC;IAClO,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC5C,IAAI,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;gBAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC7D,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,uBAAuB,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,CAAC,KAAK;YAAE,SAAS,CAAC,mDAAmD;QAC1F,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QAC5B,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC5G,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAE,CAAC,SAAS,CAAE,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAE,CAAC,SAAS,CAAE,EAAE,CAAC,CAAC;IACzK,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAAC,IAAI,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5F,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,KAAK,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAC1T,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,0BAA0B,CAAM,KAAyB,EAAE,IAAW,EAAE,MAA8B,EAAE,QAA8B,EAAE,KAAiC;IACvL,IAAI,CAAC,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;QAAE,MAAM,IAAI,qBAAqB,CAAC,eAAe,CAAC,CAAC;IAC5G,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,YAAY,CAAC,CAAC;IAAC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;IACzH,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAChE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,qBAAqB,CAAC,sBAAsB,CAAC,CAAC;IAC/S,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,iBAAiB,CAAM,KAAqC,EAAE,OAA0B,EAAE,IAAa;IACrH,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC1H,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;YAAC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YACnI,OAAO,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACtK,CAAC,CAAC,EAAE,CAAC;AACP,CAAC"}
|
|
@@ -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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"}
|