@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,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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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type ScheduleItem } from "./schedule.js";
|
|
3
|
+
import type { ScheduleEntry, timelineWindow } from "./timeline.js";
|
|
4
|
+
import type { CellCommit, DataViewConfig, DataViewPermissions, FieldDefinition, GanttDependencyState, ViewLocation, DataViewMetrics, DataViewGroupNode } from "./types.js";
|
|
5
|
+
export declare function GanttGrid<Row>({ entries, items, fields, getRowId, view, window: range, onLocationChange, onToggleGroup, renderLeftHeader, renderLeftRow, onOpen, onCommit, onMessage, busy, permissions, dependencies, metrics, getRowLabel, groupLabel, onLoadNearEnd }: {
|
|
6
|
+
metrics: DataViewMetrics;
|
|
7
|
+
getRowLabel: (row: Row) => string;
|
|
8
|
+
groupLabel: (node: DataViewGroupNode<Row>) => ReactNode;
|
|
9
|
+
onLoadNearEnd: (el: HTMLElement) => void;
|
|
10
|
+
entries: ScheduleEntry<Row>[];
|
|
11
|
+
items: ScheduleItem<Row>[];
|
|
12
|
+
fields: FieldDefinition<Row>[];
|
|
13
|
+
getRowId: (row: Row) => string;
|
|
14
|
+
view: DataViewConfig;
|
|
15
|
+
window: ReturnType<typeof timelineWindow>;
|
|
16
|
+
onLocationChange: (patch: ViewLocation) => void;
|
|
17
|
+
onToggleGroup?: (key: string) => void;
|
|
18
|
+
renderLeftHeader?: () => ReactNode;
|
|
19
|
+
renderLeftRow?: (row: Row) => ReactNode;
|
|
20
|
+
onOpen: (row: Row) => void;
|
|
21
|
+
onCommit?: (changes: CellCommit<Row>[]) => Promise<boolean | "cancelled">;
|
|
22
|
+
onMessage: (message: string) => void;
|
|
23
|
+
busy?: boolean;
|
|
24
|
+
permissions?: DataViewPermissions<Row>;
|
|
25
|
+
dependencies?: GanttDependencyState<Row>;
|
|
26
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
//# sourceMappingURL=gantt-grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gantt-grid.d.ts","sourceRoot":"","sources":["../src/gantt-grid.tsx"],"names":[],"mappings":"AACA,OAAO,EAA4D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjG,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7D,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC3K,wBAAgB,SAAS,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE;IACzQ,OAAO,EAAE,eAAe,CAAC;IAAC,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;IAAC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;IAAC,aAAa,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,CAAC;IAC/J,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAChJ,MAAM,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;IAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAClI,gBAAgB,CAAC,EAAE,MAAM,SAAS,CAAC;IAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,SAAS,CAAC;IAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IACxG,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC;IAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChH,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAAC,YAAY,CAAC,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC;CAClG,2CAgEA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
4
|
+
import { virtualWindow } from "./contracts.js";
|
|
5
|
+
import { visibleFields } from "./engine.js";
|
|
6
|
+
import { dayString } from "./schedule.js";
|
|
7
|
+
import { GanttBar } from "./gantt-bar.js";
|
|
8
|
+
import { GanttDependencyLines } from "./gantt-dependency-ui.js";
|
|
9
|
+
export function GanttGrid({ entries, items, fields, getRowId, view, window: range, onLocationChange, onToggleGroup, renderLeftHeader, renderLeftRow, onOpen, onCommit, onMessage, busy, permissions, dependencies, metrics, getRowLabel, groupLabel, onLoadNearEnd }) {
|
|
10
|
+
const left = useRef(null);
|
|
11
|
+
const right = useRef(null);
|
|
12
|
+
const root = useRef(null);
|
|
13
|
+
const location = useRef(view.location);
|
|
14
|
+
useEffect(() => { location.current = view.location; }, [view.location]);
|
|
15
|
+
const needsFocus = view.location?.timelineLeft === undefined;
|
|
16
|
+
const [split, setSplit] = useState(view.location?.splitWidth ?? 420);
|
|
17
|
+
const [available, setAvailable] = useState(1200);
|
|
18
|
+
useEffect(() => { const el = root.current; if (!el)
|
|
19
|
+
return; const observer = new ResizeObserver(() => setAvailable(el.clientWidth)); observer.observe(el); return () => observer.disconnect(); }, []);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (!left.current || !right.current)
|
|
22
|
+
return;
|
|
23
|
+
left.current.scrollTop = location.current?.ganttTop ?? 0;
|
|
24
|
+
right.current.scrollTop = left.current.scrollTop;
|
|
25
|
+
left.current.scrollLeft = location.current?.ganttLeft ?? 0;
|
|
26
|
+
right.current.scrollLeft = location.current?.timelineLeft ?? range.anchorOffset;
|
|
27
|
+
}, [range.start, range.dayWidth, range.anchorOffset, view.location?.schedulePage, needsFocus]);
|
|
28
|
+
const width = Math.min(split, Math.max(180, available - 240));
|
|
29
|
+
const columns = visibleFields(fields, view);
|
|
30
|
+
const tableWidth = 44 + columns.reduce((sum, v) => sum + v.column.width, 0);
|
|
31
|
+
const rowHeight = metrics.rowHeight;
|
|
32
|
+
const [scrollTop, setScrollTop] = useState(view.location?.ganttTop ?? 0);
|
|
33
|
+
const [height, setHeight] = useState(560);
|
|
34
|
+
useEffect(() => { const el = left.current; if (!el)
|
|
35
|
+
return; const observer = new ResizeObserver(() => setHeight(el.clientHeight)); observer.observe(el); return () => observer.disconnect(); }, []);
|
|
36
|
+
const heights = useMemo(() => entries.map((e) => e.kind === "group" ? metrics.groupHeight + (e.node.depth ? metrics.nestedGroupGap : metrics.groupGap) : rowHeight), [entries, metrics.groupHeight, metrics.groupGap, metrics.nestedGroupGap, rowHeight]);
|
|
37
|
+
const windowed = useMemo(() => virtualWindow(heights, scrollTop, height), [heights, scrollTop, height]);
|
|
38
|
+
const shown = entries.slice(windowed.start, windowed.end);
|
|
39
|
+
const map = new Map(items.map((item) => [item.id, item]));
|
|
40
|
+
const [today, setToday] = useState(() => Math.floor(Date.now() / 86400000));
|
|
41
|
+
useEffect(() => { const timer = window.setInterval(() => setToday(Math.floor(Date.now() / 86400000)), 60000); return () => window.clearInterval(timer); }, []);
|
|
42
|
+
const weekends = [];
|
|
43
|
+
for (let d = range.start; d <= range.end; d++)
|
|
44
|
+
if ([0, 6].includes(new Date(d * 86400000).getUTCDay()))
|
|
45
|
+
weekends.push(d);
|
|
46
|
+
const collapsed = new Set(view.collapsedGroups);
|
|
47
|
+
function group(entry) { return _jsxs("button", { style: { paddingLeft: 10 + 16 * entry.node.depth }, "aria-expanded": !collapsed.has(entry.node.key), onClick: () => onToggleGroup?.(entry.node.key), children: [collapsed.has(entry.node.key) ? "›" : "⌄", " ", groupLabel(entry.node)] }); }
|
|
48
|
+
function saveScroll(source) {
|
|
49
|
+
const a = source === "left" ? left.current : right.current;
|
|
50
|
+
const b = source === "left" ? right.current : left.current;
|
|
51
|
+
if (!a || !b)
|
|
52
|
+
return;
|
|
53
|
+
setScrollTop(a.scrollTop);
|
|
54
|
+
onLoadNearEnd(a);
|
|
55
|
+
if (Math.abs(a.scrollTop - b.scrollTop) > 1)
|
|
56
|
+
b.scrollTop = a.scrollTop;
|
|
57
|
+
onLocationChange({ ganttTop: a.scrollTop, ganttLeft: left.current.scrollLeft, timelineLeft: right.current.scrollLeft });
|
|
58
|
+
}
|
|
59
|
+
return _jsxs("div", { ref: root, className: "hy-dv-gantt-split", style: { gridTemplateColumns: `${width}px 8px minmax(0, 1fr)`, "--hy-row-height": `${rowHeight}px`, "--hy-month-days": range.end - range.start + 1 }, children: [_jsx("div", { ref: left, className: "hy-dv-gantt-pane hy-dv-gantt-left", onScroll: () => saveScroll("left"), children: _jsxs("table", { className: "hy-dv-table", style: { width: renderLeftRow ? tableWidth : 240 }, "aria-label": "\u7518\u7279\u5DE6\u5074\u8CC7\u6599", children: [renderLeftRow && _jsxs("colgroup", { children: [_jsx("col", { style: { width: 44 } }), columns.map(({ field, column }) => _jsx("col", { style: { width: column.width } }, field.id))] }), _jsx("thead", { children: renderLeftHeader?.() ?? _jsx("tr", { children: _jsx("th", { children: "\u6A19\u984C" }) }) }), _jsxs("tbody", { children: [windowed.before > 0 && _jsx("tr", { "aria-hidden": true, children: _jsx("td", { colSpan: columns.length + 1, style: { height: windowed.before, padding: 0, border: 0 } }) }), shown.map((entry, index) => entry.kind === "group" ? _jsx("tr", { className: "hy-dv-group", style: { height: heights[windowed.start + index] }, children: _jsx("td", { colSpan: columns.length + 1, children: group(entry) }) }, `g:${entry.node.key}`) : renderLeftRow?.(entry.row) ?? _jsx("tr", { children: _jsx("td", { children: _jsx("button", { onClick: () => onOpen(entry.row), children: getRowLabel(entry.row) }) }) }, getRowId(entry.row))), windowed.after > 0 && _jsx("tr", { "aria-hidden": true, children: _jsx("td", { colSpan: columns.length + 1, style: { height: windowed.after, padding: 0, border: 0 } }) })] })] }) }), _jsx("div", { className: "hy-dv-split-handle", role: "separator", "aria-label": "\u8ABF\u6574\u7518\u7279\u5DE6\u5074\u5BEC\u5EA6", "aria-orientation": "vertical", "aria-valuemin": 180, "aria-valuemax": 900, "aria-valuenow": Math.round(width), tabIndex: 0, onKeyDown: (e) => { if (!["ArrowLeft", "ArrowRight"].includes(e.key))
|
|
60
|
+
return; e.preventDefault(); const n = Math.max(180, Math.min(900, split + (e.key === "ArrowRight" ? 20 : -20))); setSplit(n); onLocationChange({ splitWidth: n }); }, onPointerDown: (e) => { e.preventDefault(); e.currentTarget.setPointerCapture(e.pointerId); }, onPointerMove: (e) => { if (!e.currentTarget.hasPointerCapture(e.pointerId))
|
|
61
|
+
return; const n = Math.max(180, Math.min(900, e.clientX - (root.current?.getBoundingClientRect().left ?? 0))); setSplit(n); }, onPointerUp: (e) => { if (e.currentTarget.hasPointerCapture(e.pointerId))
|
|
62
|
+
e.currentTarget.releasePointerCapture(e.pointerId); onLocationChange({ splitWidth: split }); }, onPointerCancel: () => setSplit(view.location?.splitWidth ?? 420) }), _jsx("div", { ref: right, className: "hy-dv-gantt-pane hy-dv-timeline-pane", onScroll: () => saveScroll("right"), children: _jsxs("div", { className: "hy-dv-timeline", style: { width: range.width }, children: [_jsx("div", { className: "hy-dv-timeline-header", children: range.ticks.map((tick) => _jsx("span", { style: { left: (tick.day - range.start) * range.dayWidth }, children: tick.label }, tick.day)) }), _jsxs("div", { className: "hy-dv-timeline-body", children: [_jsxs("div", { className: "hy-dv-time-background", "aria-hidden": true, children: [weekends.map((d) => _jsx("i", { style: { left: (d - range.start) * range.dayWidth, width: range.dayWidth } }, d)), today >= range.start && today <= range.end && _jsx("b", { className: "hy-dv-today-line", style: { left: (today - range.start) * range.dayWidth } })] }), _jsx("div", { "aria-hidden": true, style: { height: windowed.before } }), shown.map((entry, index) => entry.kind === "group" ? _jsx("div", { className: "hy-dv-timeline-group", style: { height: heights[windowed.start + index] } }, `g:${entry.node.key}`) : _jsx("div", { className: "hy-dv-gantt-track", style: { height: rowHeight }, children: renderBar(entry.row) }, getRowId(entry.row))), _jsx("div", { "aria-hidden": true, style: { height: windowed.after } }), dependencies && _jsx(GanttDependencyLines, { dayWidth: range.dayWidth, rowHeight: rowHeight, items: entries.flatMap((entry, i) => { const item = entry.kind === "row" ? map.get(getRowId(entry.row)) : undefined; return item ? [{ item, y: windowed.offsets[i] + rowHeight / 2 }] : []; }), state: dependencies, start: range.start, end: range.end, workdaysOnly: view.gantt?.workdaysOnly })] })] }) })] });
|
|
63
|
+
function renderBar(row) {
|
|
64
|
+
const item = map.get(getRowId(row));
|
|
65
|
+
if (!item)
|
|
66
|
+
return null;
|
|
67
|
+
if (item.end < range.start || item.start > range.end)
|
|
68
|
+
return _jsxs("button", { className: "hy-dv-gantt-outside", onClick: () => onLocationChange({ anchorDate: dayString(item.start), timelineLeft: undefined }), "aria-label": `定位 ${item.title} 的排程日期`, children: [item.end < range.start ? "←" : "→", " ", dayString(item.start)] });
|
|
69
|
+
return _jsx(GanttBar, { previewRequired: Boolean(dependencies), item: item, fields: fields, mapping: view.gantt, getRowId: getRowId, monthStart: range.start, monthEnd: range.end, permissions: permissions, busy: busy, onCommit: onCommit && !dependencies?.isDateLocked?.(row) ? onCommit : undefined, onOpen: onOpen, onMessage: onMessage });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=gantt-grid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gantt-grid.js","sourceRoot":"","sources":["../src/gantt-grid.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CellCommit, DataViewPermissions, FieldDefinition, GanttMapping } from "./types.js";
|
|
2
|
+
export type GanttAction = "move" | "start" | "end";
|
|
3
|
+
export type GanttRange = {
|
|
4
|
+
start: number;
|
|
5
|
+
end: number;
|
|
6
|
+
};
|
|
7
|
+
export declare function isWorkday(day: number): boolean;
|
|
8
|
+
export declare function ganttDuration(start: number, end: number, workdaysOnly?: boolean): number;
|
|
9
|
+
/** Drag uses whole wall-calendar days. Moving preserves the active duration rule. */
|
|
10
|
+
export declare function adjustGanttRange(range: GanttRange, action: GanttAction, delta: number, workdaysOnly?: boolean): GanttRange;
|
|
11
|
+
export declare function canDragGantt<Row>(row: Row, fields: FieldDefinition<Row>[], mapping: GanttMapping, permissions?: DataViewPermissions<Row>): boolean;
|
|
12
|
+
/** Both endpoints are sent atomically, even for a resize, to check both old values. */
|
|
13
|
+
export declare function createGanttChanges<Row>(row: Row, fields: FieldDefinition<Row>[], mapping: GanttMapping, getRowId: (row: Row) => string, action: GanttAction, delta: number, permissions?: DataViewPermissions<Row>): CellCommit<Row>[];
|
|
14
|
+
//# sourceMappingURL=gantt-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gantt-operations.d.ts","sourceRoot":"","sources":["../src/gantt-operations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjG,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AACnD,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AACxD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,WAAgG;AACrI,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,UAAQ,UAO7E;AAQD,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,UAAU,CAmBxH;AAOD,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,WAGxI;AAQD,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAiBtO"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { getFieldValue } from "./engine.js";
|
|
2
|
+
import { canWriteField, validateChanges } from "./operations.js";
|
|
3
|
+
import { dateDay, dayString, DAY_MS } from "./schedule.js";
|
|
4
|
+
export function isWorkday(day) { const weekday = new Date(day * DAY_MS).getUTCDay(); return weekday !== 0 && weekday !== 6; }
|
|
5
|
+
export function ganttDuration(start, end, workdaysOnly = false) {
|
|
6
|
+
if (!Number.isInteger(start) || !Number.isInteger(end) || end < start)
|
|
7
|
+
return 0;
|
|
8
|
+
const days = end - start + 1;
|
|
9
|
+
if (!workdaysOnly)
|
|
10
|
+
return days;
|
|
11
|
+
let count = Math.floor(days / 7) * 5;
|
|
12
|
+
for (let day = start; day < start + days % 7; day++)
|
|
13
|
+
if (isWorkday(day))
|
|
14
|
+
count++;
|
|
15
|
+
return count;
|
|
16
|
+
}
|
|
17
|
+
function snapWorkday(day, direction) { while (!isWorkday(day))
|
|
18
|
+
day += direction < 0 ? -1 : 1; return day; }
|
|
19
|
+
function endAfterWorkdays(start, count) {
|
|
20
|
+
let end = start + Math.floor((count - 1) / 5) * 7;
|
|
21
|
+
for (let remaining = (count - 1) % 5; remaining > 0; remaining--)
|
|
22
|
+
end = snapWorkday(end + 1, 1);
|
|
23
|
+
return end;
|
|
24
|
+
}
|
|
25
|
+
/** Drag uses whole wall-calendar days. Moving preserves the active duration rule. */
|
|
26
|
+
export function adjustGanttRange(range, action, delta, workdaysOnly = false) {
|
|
27
|
+
if (!Number.isSafeInteger(delta) || Math.abs(delta) > 3_652_058 || !Number.isInteger(range.start) || !Number.isInteger(range.end) || range.end < range.start)
|
|
28
|
+
throw new Error("無效日期區間");
|
|
29
|
+
if (!delta)
|
|
30
|
+
return range;
|
|
31
|
+
const count = ganttDuration(range.start, range.end, workdaysOnly);
|
|
32
|
+
if (!count)
|
|
33
|
+
throw new Error("此區間沒有工作天,請先調整日期或關閉僅計算工作天。");
|
|
34
|
+
let { start, end } = range;
|
|
35
|
+
if (action === "move") {
|
|
36
|
+
start += delta;
|
|
37
|
+
if (workdaysOnly) {
|
|
38
|
+
start = snapWorkday(start, delta);
|
|
39
|
+
end = endAfterWorkdays(start, count);
|
|
40
|
+
}
|
|
41
|
+
else
|
|
42
|
+
end += delta;
|
|
43
|
+
}
|
|
44
|
+
else if (action === "start") {
|
|
45
|
+
start = Math.min(start + delta, end);
|
|
46
|
+
if (workdaysOnly)
|
|
47
|
+
start = Math.min(snapWorkday(start, delta), snapWorkday(end, -1));
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
end = Math.max(end + delta, start);
|
|
51
|
+
if (workdaysOnly)
|
|
52
|
+
end = Math.max(snapWorkday(end, delta), snapWorkday(start, 1));
|
|
53
|
+
}
|
|
54
|
+
if (![start, end].every((day) => day >= dateDay("0001-01-01") && day <= dateDay("9999-12-31")))
|
|
55
|
+
throw new Error("日期超出支援範圍");
|
|
56
|
+
return { start, end };
|
|
57
|
+
}
|
|
58
|
+
function dateFields(fields, mapping) {
|
|
59
|
+
const start = fields.find((field) => field.id === mapping.startFieldId);
|
|
60
|
+
const end = fields.find((field) => field.id === mapping.endFieldId);
|
|
61
|
+
return { start, end };
|
|
62
|
+
}
|
|
63
|
+
export function canDragGantt(row, fields, mapping, permissions) {
|
|
64
|
+
const { start, end } = dateFields(fields, mapping);
|
|
65
|
+
return Boolean(start && end && start.id !== end.id && [start, end].every((field) => ["date", "dateTime"].includes(field.type) && canWriteField(row, field, permissions)));
|
|
66
|
+
}
|
|
67
|
+
function replaceDay(value, day, field) {
|
|
68
|
+
if (typeof value !== "string" || dateDay(value) === null)
|
|
69
|
+
throw new Error(`${field.label}不是有效日期`);
|
|
70
|
+
if (field.type === "date")
|
|
71
|
+
return dayString(day);
|
|
72
|
+
if (!/^\d{4}-\d{2}-\d{2}T(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d{1,3})?)?(?:Z|[+-](?:[01]\d|2[0-3]):[0-5]\d)?$/.test(value) || !Number.isFinite(Date.parse(value)))
|
|
73
|
+
throw new Error(`${field.label}不是有效日期時間`);
|
|
74
|
+
return dayString(day) + value.slice(10);
|
|
75
|
+
}
|
|
76
|
+
/** Both endpoints are sent atomically, even for a resize, to check both old values. */
|
|
77
|
+
export function createGanttChanges(row, fields, mapping, getRowId, action, delta, permissions) {
|
|
78
|
+
if (!canDragGantt(row, fields, mapping, permissions))
|
|
79
|
+
throw new Error("拖曳需要兩個不同且都可修改的日期欄位");
|
|
80
|
+
const { start: startField, end: endField } = dateFields(fields, mapping);
|
|
81
|
+
const startValue = getFieldValue(row, startField);
|
|
82
|
+
const endValue = getFieldValue(row, endField);
|
|
83
|
+
const start = dateDay(startValue);
|
|
84
|
+
const end = dateDay(endValue);
|
|
85
|
+
if (start === null || end === null || end < start)
|
|
86
|
+
throw new Error("請先修正開始與結束日期");
|
|
87
|
+
const next = adjustGanttRange({ start, end }, action, delta, mapping.workdaysOnly);
|
|
88
|
+
if (next.start === start && next.end === end)
|
|
89
|
+
return [];
|
|
90
|
+
const nextStart = replaceDay(startValue, next.start, startField);
|
|
91
|
+
const nextEnd = replaceDay(endValue, next.end, endField);
|
|
92
|
+
if (startField.type === "dateTime" && endField.type === "dateTime" && Date.parse(nextEnd) < Date.parse(nextStart))
|
|
93
|
+
throw new Error("結束時間不能早於開始時間");
|
|
94
|
+
const changes = [
|
|
95
|
+
{ row, rowId: getRowId(row), field: startField, previousValue: startValue, nextValue: nextStart },
|
|
96
|
+
{ row, rowId: getRowId(row), field: endField, previousValue: endValue, nextValue: nextEnd },
|
|
97
|
+
];
|
|
98
|
+
const error = validateChanges(changes, permissions);
|
|
99
|
+
if (error)
|
|
100
|
+
throw new Error(error);
|
|
101
|
+
return changes;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=gantt-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gantt-operations.js","sourceRoot":"","sources":["../src/gantt-operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type FieldMove } from "./field-order.js";
|
|
2
|
+
import type { GroupRule } from "./types.js";
|
|
3
|
+
export declare function normalizeGroupValueOrder(value: unknown): string[] | undefined;
|
|
4
|
+
/** Move visible values while retaining saved positions for temporarily absent groups. */
|
|
5
|
+
export declare function moveGroupValue(rule: GroupRule, visibleKeys: string[], source: string, move: FieldMove | {
|
|
6
|
+
before: string;
|
|
7
|
+
}): GroupRule;
|
|
8
|
+
//# sourceMappingURL=group-order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-order.d.ts","sourceRoot":"","sources":["../src/group-order.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAE7E;AAED,yFAAyF;AACzF,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CActI"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { moveFieldItem } from "./field-order.js";
|
|
2
|
+
export function normalizeGroupValueOrder(value) {
|
|
3
|
+
return Array.isArray(value) ? [...new Set(value.filter((key) => typeof key === "string"))] : undefined;
|
|
4
|
+
}
|
|
5
|
+
/** Move visible values while retaining saved positions for temporarily absent groups. */
|
|
6
|
+
export function moveGroupValue(rule, visibleKeys, source, move) {
|
|
7
|
+
const keys = [...new Set(visibleKeys)];
|
|
8
|
+
let next;
|
|
9
|
+
if (typeof move === "string")
|
|
10
|
+
next = moveFieldItem(keys, source, move, (key) => key);
|
|
11
|
+
else {
|
|
12
|
+
if (source === move.before || !keys.includes(source) || !keys.includes(move.before))
|
|
13
|
+
return rule;
|
|
14
|
+
next = keys.filter((key) => key !== source);
|
|
15
|
+
next.splice(next.indexOf(move.before), 0, source);
|
|
16
|
+
}
|
|
17
|
+
if (next === keys || next.every((key, index) => key === keys[index]))
|
|
18
|
+
return rule;
|
|
19
|
+
const saved = [...new Set([...(rule.valueOrder ?? []), ...keys])];
|
|
20
|
+
const visible = new Set(keys);
|
|
21
|
+
let index = 0;
|
|
22
|
+
return { ...rule, valueOrder: saved.map((key) => visible.has(key) ? next[index++] : key) };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=group-order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-order.js","sourceRoot":"","sources":["../src/group-order.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AAGjE,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxH,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAAC,IAAe,EAAE,WAAqB,EAAE,MAAc,EAAE,IAAoC;IACzH,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;IACvC,IAAI,IAAc,CAAC;IACnB,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;SAChF,CAAC;QACJ,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACjG,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAClF,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7F,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DataViewConfig, FieldDefinition, GroupRule } from "./types.js";
|
|
2
|
+
export declare function GroupValueOrder({ label, rule, values, onChange }: {
|
|
3
|
+
label: string;
|
|
4
|
+
rule: GroupRule;
|
|
5
|
+
values: Array<{
|
|
6
|
+
key: string;
|
|
7
|
+
label: string;
|
|
8
|
+
}>;
|
|
9
|
+
onChange: (rule: GroupRule) => void;
|
|
10
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare function GroupSettings<Row>({ fields, rows, view, onChange }: {
|
|
12
|
+
fields: FieldDefinition<Row>[];
|
|
13
|
+
rows: Row[];
|
|
14
|
+
view: DataViewConfig;
|
|
15
|
+
onChange: (view: DataViewConfig) => void;
|
|
16
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=group-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-settings.d.ts","sourceRoot":"","sources":["../src/group-settings.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI7E,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;IACjE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9E,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CACrC,2CAiCA;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IACnE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,IAAI,EAAE,GAAG,EAAE,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;CAC7G,2CAmBA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { buildGroupTree, MAX_GROUP_LEVELS } from "./engine.js";
|
|
3
|
+
import { moveGroupValue } from "./group-order.js";
|
|
4
|
+
const dragType = "application/x-hy-dv-group-value";
|
|
5
|
+
export function GroupValueOrder({ label, rule, values, onChange }) {
|
|
6
|
+
function move(key, direction) {
|
|
7
|
+
const next = moveGroupValue(rule, values.map((value) => value.key), key, direction);
|
|
8
|
+
if (next !== rule)
|
|
9
|
+
onChange(next);
|
|
10
|
+
}
|
|
11
|
+
return _jsxs("div", { className: "hy-dv-group-order", children: [_jsxs("header", { children: [_jsxs("h4", { children: [label, "\u7684\u5206\u7D44\u9806\u5E8F"] }), _jsx("button", { type: "button", disabled: !rule.valueOrder?.length, onClick: () => {
|
|
12
|
+
const { valueOrder: _valueOrder, ...defaults } = rule;
|
|
13
|
+
onChange(defaults);
|
|
14
|
+
}, children: "\u9084\u539F\u9810\u8A2D\u9806\u5E8F" })] }), _jsx("p", { children: "\u62D6\u66F3\u5230\u53E6\u4E00\u7D44\u524D\u65B9\uFF0C\u6216\u7528\u6309\u9215\u79FB\u52D5\u3002\u53EA\u8ABF\u6574\u76EE\u524D\u8996\u5716\uFF0C\u4E0D\u6539\u7D44\u5167\u8CC7\u6599\u6392\u5E8F\u3002" }), values.length === 0 ? _jsx("p", { children: "\u5C1A\u7121\u53EF\u6392\u5E8F\u7684\u5206\u7D44\u3002" }) : _jsx("ol", { className: "hy-dv-group-order-list", "aria-label": `${label}分組順序`, children: values.map((value, index) => _jsxs("li", { draggable: true, onDragStart: (event) => {
|
|
15
|
+
event.dataTransfer.effectAllowed = "move";
|
|
16
|
+
event.dataTransfer.setData(dragType, JSON.stringify({ fieldId: rule.fieldId, key: value.key }));
|
|
17
|
+
}, onDragOver: (event) => { event.preventDefault(); event.dataTransfer.dropEffect = "move"; }, onDrop: (event) => {
|
|
18
|
+
event.preventDefault();
|
|
19
|
+
event.stopPropagation();
|
|
20
|
+
let source;
|
|
21
|
+
try {
|
|
22
|
+
source = JSON.parse(event.dataTransfer.getData(dragType));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (source?.fieldId === rule.fieldId && typeof source.key === "string")
|
|
28
|
+
move(source.key, { before: value.key });
|
|
29
|
+
}, children: [_jsx("span", { className: "hy-dv-drag", "aria-hidden": "true", children: "\u283F" }), _jsx("span", { className: "hy-dv-group-order-label", children: value.label }), _jsxs("div", { className: "hy-dv-field-order-actions", children: [_jsx("button", { type: "button", title: "\u79FB\u5230\u6700\u4E0A", "aria-label": `移到最上 ${value.label}`, disabled: index === 0, onClick: () => move(value.key, "first"), children: "\u21C8" }), _jsx("button", { type: "button", title: "\u4E0A\u79FB", "aria-label": `上移 ${value.label}`, disabled: index === 0, onClick: () => move(value.key, "previous"), children: "\u2191" }), _jsx("button", { type: "button", title: "\u4E0B\u79FB", "aria-label": `下移 ${value.label}`, disabled: index === values.length - 1, onClick: () => move(value.key, "next"), children: "\u2193" }), _jsx("button", { type: "button", title: "\u79FB\u5230\u6700\u4E0B", "aria-label": `移到最下 ${value.label}`, disabled: index === values.length - 1, onClick: () => move(value.key, "last"), children: "\u21CA" })] })] }, value.key)) })] });
|
|
30
|
+
}
|
|
31
|
+
export function GroupSettings({ fields, rows, view, onChange }) {
|
|
32
|
+
return _jsxs(_Fragment, { children: [_jsx("p", { children: "\u6700\u591A\u4E09\u5C64\uFF1B\u7531\u4E0A\u5230\u4E0B\u5957\u7528\u3002\u6BCF\u5C64\u53EF\u8A2D\u5B9A\u5404\u7D44\u7684\u986F\u793A\u9806\u5E8F\u3002" }), _jsxs("div", { className: "hy-dv-rules", children: [view.groups.map((rule, index) => {
|
|
33
|
+
const field = fields.find((candidate) => candidate.id === rule.fieldId);
|
|
34
|
+
const label = field?.label ?? "未命名欄位";
|
|
35
|
+
// Use loaded rows before filtering; the engine enforces field read permission.
|
|
36
|
+
const values = buildGroupTree(rows, fields, [rule]).map((group) => ({ key: group.valueKey, label: group.label }));
|
|
37
|
+
return _jsxs("div", { className: "hy-dv-group-rule", children: [_jsxs("div", { className: "hy-dv-rule", children: [_jsx("span", { children: index + 1 }), _jsx("select", { "aria-label": `第 ${index + 1} 層分組欄位`, value: rule.fieldId, onChange: (event) => onChange({ ...view, groups: view.groups.map((item, i) => i === index ? { fieldId: event.target.value } : item) }), children: fields.map((item) => _jsx("option", { value: item.id, disabled: view.groups.some((group, i) => i !== index && group.fieldId === item.id), children: item.label }, item.id)) }), _jsx("button", { type: "button", "aria-label": `移除第 ${index + 1} 層分組`, onClick: () => onChange({ ...view, groups: view.groups.filter((_, i) => i !== index) }), children: "\u79FB\u9664" })] }), _jsx(GroupValueOrder, { label: label, rule: rule, values: values, onChange: (next) => onChange({ ...view, groups: view.groups.map((item, i) => i === index ? next : item) }) })] }, rule.fieldId);
|
|
38
|
+
}), _jsx("button", { type: "button", className: "hy-dv-add", disabled: view.groups.length >= Math.min(MAX_GROUP_LEVELS, fields.length), onClick: () => {
|
|
39
|
+
const field = fields.find((item) => !view.groups.some((rule) => rule.fieldId === item.id));
|
|
40
|
+
if (field)
|
|
41
|
+
onChange({ ...view, groups: [...view.groups, { fieldId: field.id }] });
|
|
42
|
+
}, children: "\uFF0B \u589E\u52A0\u5206\u7D44" })] })] });
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=group-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-settings.js","sourceRoot":"","sources":["../src/group-settings.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./engine.js";
|
|
3
|
+
export * from "./registry.js";
|
|
4
|
+
export * from "./data-view.js";
|
|
5
|
+
export * from "./operations.js";
|
|
6
|
+
export * from "./schedule.js";
|
|
7
|
+
export * from "./gantt-operations.js";
|
|
8
|
+
export * from "./gantt-dependencies.js";
|
|
9
|
+
export declare const DATA_VIEW_VERSION = "0.2.0-alpha.11";
|
|
10
|
+
export * from "./view-state.js";
|
|
11
|
+
export * from "./view-workspace.js";
|
|
12
|
+
export * from "./timeline.js";
|
|
13
|
+
export * from "./contracts.js";
|
|
14
|
+
export * from "./remote-data.js";
|
|
15
|
+
export * from "./use-remote-data.js";
|
|
16
|
+
export * from "./row-move.js";
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AAEtC,cAAc,yBAAyB,CAAC;AAExC,eAAO,MAAM,iBAAiB,mBAAmB,CAAC;AAElD,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,eAAe,CAAC;AAE9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./engine.js";
|
|
3
|
+
export * from "./registry.js";
|
|
4
|
+
export * from "./data-view.js";
|
|
5
|
+
export * from "./operations.js";
|
|
6
|
+
export * from "./schedule.js";
|
|
7
|
+
export * from "./gantt-operations.js";
|
|
8
|
+
export * from "./gantt-dependencies.js";
|
|
9
|
+
export const DATA_VIEW_VERSION = "0.2.0-alpha.11";
|
|
10
|
+
export * from "./view-state.js";
|
|
11
|
+
export * from "./view-workspace.js";
|
|
12
|
+
export * from "./timeline.js";
|
|
13
|
+
export * from "./contracts.js";
|
|
14
|
+
export * from "./remote-data.js";
|
|
15
|
+
export * from "./use-remote-data.js";
|
|
16
|
+
export * from "./row-move.js";
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AAEtC,cAAc,yBAAyB,CAAC;AAExC,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAElD,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,eAAe,CAAC;AAE9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CellCommit, DataViewPermissions, FieldChange, FieldDefinition } from "./types.js";
|
|
2
|
+
export declare const MAX_BATCH_CELLS = 1000;
|
|
3
|
+
export declare function canWriteField<Row>(row: Row, field: FieldDefinition<Row>, permissions?: DataViewPermissions<Row>): boolean;
|
|
4
|
+
export declare function validateChanges<Row>(changes: CellCommit<Row>[], permissions?: DataViewPermissions<Row>): string | null;
|
|
5
|
+
/** Quoted TSV supports tabs/newlines inside text. No formulas are evaluated. */
|
|
6
|
+
export declare function parseTSV(text: string): string[][];
|
|
7
|
+
export declare function encodeTSV(rows: string[][]): string;
|
|
8
|
+
export declare function createPasteChanges<Row>(text: string, rows: Row[], fields: FieldDefinition<Row>[], getRowId: (row: Row) => string, rowIndex: number, columnIndex: number): CellCommit<Row>[];
|
|
9
|
+
export declare function validateFieldChange<Row>(fields: FieldDefinition<Row>[], change: FieldChange<Row>, permissions?: DataViewPermissions<Row>): "沒有管理欄位的權限" | "欄位不存在" | "系統或受保護欄位不能修改結構" | "沒有變更此欄位的權限" | "請填欄位名稱" | "至少保留一個欄位" | "欄位 ID 格式不正確" | "欄位 ID 已存在" | "系統欄位只能由接入專案建立" | "有逐列讀取限制的欄位,請由專案管理員處理複製" | null;
|
|
10
|
+
export declare function newOperationId(): `${string}-${string}-${string}-${string}-${string}`;
|
|
11
|
+
//# sourceMappingURL=operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEhG,eAAO,MAAM,eAAe,OAAO,CAAC;AACpC,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,WAG/G;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,iBAatG;AAED,gFAAgF;AAChF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAmBjD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAMzC;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAO3L;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,qKAkBxI;AAED,wBAAgB,cAAc,wDAA6G"}
|