@keenaioc/data-view 0.0.0-poc.1 → 0.2.0-alpha.11
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 +138 -0
- package/DATA-PRIVACY.md +20 -0
- package/INTEGRATION.md +258 -0
- package/KNOWN-LIMITATIONS.md +63 -0
- package/LICENSE +41 -0
- package/README.md +73 -5
- package/dist/column-actions.d.ts +47 -0
- package/dist/column-actions.d.ts.map +1 -0
- package/dist/column-actions.js +92 -0
- package/dist/column-actions.js.map +1 -0
- package/dist/column-menu.d.ts +25 -0
- package/dist/column-menu.d.ts.map +1 -0
- package/dist/column-menu.js +64 -0
- package/dist/column-menu.js.map +1 -0
- package/dist/contracts.d.ts +33 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +84 -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 +883 -0
- package/dist/data-view.js.map +1 -0
- package/dist/engine.d.ts +35 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +315 -0
- package/dist/engine.js.map +1 -0
- package/dist/field-order.d.ts +8 -0
- package/dist/field-order.d.ts.map +1 -0
- package/dist/field-order.js +28 -0
- package/dist/field-order.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/group-order.d.ts +8 -0
- package/dist/group-order.d.ts.map +1 -0
- package/dist/group-order.js +24 -0
- package/dist/group-order.js.map +1 -0
- package/dist/group-settings.d.ts +17 -0
- package/dist/group-settings.d.ts.map +1 -0
- package/dist/group-settings.js +44 -0
- package/dist/group-settings.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 +17 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +482 -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 +1028 -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 +474 -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 +118 -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 @@
|
|
|
1
|
+
{"version":3,"file":"field-order.d.ts","sourceRoot":"","sources":["../src/field-order.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAE/D,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,CAAC,EAAE,CASnH;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,MAAM,uBAG5E;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,uBAOpG"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Reorder by stable ID; retain each item's settings and leave the input untouched. */
|
|
2
|
+
export function moveFieldItem(items, fieldId, direction, getId) {
|
|
3
|
+
const from = items.findIndex((item) => getId(item) === fieldId);
|
|
4
|
+
if (from < 0 || items.length < 2)
|
|
5
|
+
return items;
|
|
6
|
+
const to = direction === "first" ? 0 : direction === "last" ? items.length - 1 : direction === "previous" ? from - 1 : from + 1;
|
|
7
|
+
if (to < 0 || to >= items.length || to === from)
|
|
8
|
+
return items;
|
|
9
|
+
const next = [...items];
|
|
10
|
+
const [item] = next.splice(from, 1);
|
|
11
|
+
next.splice(to, 0, item);
|
|
12
|
+
return next;
|
|
13
|
+
}
|
|
14
|
+
/** Pinned regions retain the engine's left / unpinned / right ordering. */
|
|
15
|
+
export function columnMovePeers(columns, fieldId) {
|
|
16
|
+
const current = columns.find((column) => column.fieldId === fieldId);
|
|
17
|
+
return current ? columns.filter((column) => (column.pinned ?? null) === (current.pinned ?? null)) : [];
|
|
18
|
+
}
|
|
19
|
+
export function moveColumnSetting(columns, fieldId, direction) {
|
|
20
|
+
const peers = columnMovePeers(columns, fieldId);
|
|
21
|
+
const moved = moveFieldItem(peers, fieldId, direction, (column) => column.fieldId);
|
|
22
|
+
if (moved === peers)
|
|
23
|
+
return columns;
|
|
24
|
+
const ids = new Set(peers.map((column) => column.fieldId));
|
|
25
|
+
let index = 0;
|
|
26
|
+
return columns.map((column) => ids.has(column.fieldId) ? moved[index++] : column);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=field-order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-order.js","sourceRoot":"","sources":["../src/field-order.ts"],"names":[],"mappings":"AAIA,uFAAuF;AACvF,MAAM,UAAU,aAAa,CAAI,KAAU,EAAE,OAAe,EAAE,SAAoB,EAAE,KAA0B;IAC5G,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC;IAChE,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,EAAE,GAAG,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAChI,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACxB,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,OAA4B,EAAE,OAAe;IAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IACrE,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAA4B,EAAE,OAAe,EAAE,SAAoB;IACnG,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnF,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,OAAO,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ScheduleItem } from "./schedule.js";
|
|
2
|
+
import type { CellCommit, DataViewPermissions, FieldDefinition, GanttMapping } from "./types.js";
|
|
3
|
+
export declare function GanttBar<Row>({ item, fields, mapping, getRowId, monthStart, monthEnd, permissions, busy, onCommit, onOpen, onMessage, previewRequired }: {
|
|
4
|
+
item: ScheduleItem<Row>;
|
|
5
|
+
fields: FieldDefinition<Row>[];
|
|
6
|
+
mapping: GanttMapping;
|
|
7
|
+
getRowId: (row: Row) => string;
|
|
8
|
+
monthStart: number;
|
|
9
|
+
monthEnd: number;
|
|
10
|
+
permissions?: DataViewPermissions<Row>;
|
|
11
|
+
busy?: boolean;
|
|
12
|
+
previewRequired?: boolean;
|
|
13
|
+
onCommit?: (changes: CellCommit<Row>[]) => Promise<boolean | "cancelled">;
|
|
14
|
+
onOpen: (row: Row) => void;
|
|
15
|
+
onMessage: (message: string) => void;
|
|
16
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=gantt-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gantt-bar.d.ts","sourceRoot":"","sources":["../src/gantt-bar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGjG,wBAAgB,QAAQ,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,eAAuB,EAAE,EAAE;IAChK,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,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;IAC/G,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACxH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC;IAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7I,2CAyFA"}
|
|
@@ -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"}
|