@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.
Files changed (129) hide show
  1. package/CHANGELOG.md +138 -0
  2. package/DATA-PRIVACY.md +20 -0
  3. package/INTEGRATION.md +258 -0
  4. package/KNOWN-LIMITATIONS.md +63 -0
  5. package/LICENSE +41 -0
  6. package/README.md +73 -5
  7. package/dist/column-actions.d.ts +47 -0
  8. package/dist/column-actions.d.ts.map +1 -0
  9. package/dist/column-actions.js +92 -0
  10. package/dist/column-actions.js.map +1 -0
  11. package/dist/column-menu.d.ts +25 -0
  12. package/dist/column-menu.d.ts.map +1 -0
  13. package/dist/column-menu.js +64 -0
  14. package/dist/column-menu.js.map +1 -0
  15. package/dist/contracts.d.ts +33 -0
  16. package/dist/contracts.d.ts.map +1 -0
  17. package/dist/contracts.js +84 -0
  18. package/dist/contracts.js.map +1 -0
  19. package/dist/data-view.d.ts +3 -0
  20. package/dist/data-view.d.ts.map +1 -0
  21. package/dist/data-view.js +883 -0
  22. package/dist/data-view.js.map +1 -0
  23. package/dist/engine.d.ts +35 -0
  24. package/dist/engine.d.ts.map +1 -0
  25. package/dist/engine.js +315 -0
  26. package/dist/engine.js.map +1 -0
  27. package/dist/field-order.d.ts +8 -0
  28. package/dist/field-order.d.ts.map +1 -0
  29. package/dist/field-order.js +28 -0
  30. package/dist/field-order.js.map +1 -0
  31. package/dist/gantt-bar.d.ts +17 -0
  32. package/dist/gantt-bar.d.ts.map +1 -0
  33. package/dist/gantt-bar.js +142 -0
  34. package/dist/gantt-bar.js.map +1 -0
  35. package/dist/gantt-dependencies.d.ts +27 -0
  36. package/dist/gantt-dependencies.d.ts.map +1 -0
  37. package/dist/gantt-dependencies.js +218 -0
  38. package/dist/gantt-dependencies.js.map +1 -0
  39. package/dist/gantt-dependency-ui.d.ts +37 -0
  40. package/dist/gantt-dependency-ui.d.ts.map +1 -0
  41. package/dist/gantt-dependency-ui.js +79 -0
  42. package/dist/gantt-dependency-ui.js.map +1 -0
  43. package/dist/gantt-grid.d.ts +27 -0
  44. package/dist/gantt-grid.d.ts.map +1 -0
  45. package/dist/gantt-grid.js +72 -0
  46. package/dist/gantt-grid.js.map +1 -0
  47. package/dist/gantt-operations.d.ts +14 -0
  48. package/dist/gantt-operations.d.ts.map +1 -0
  49. package/dist/gantt-operations.js +103 -0
  50. package/dist/gantt-operations.js.map +1 -0
  51. package/dist/group-order.d.ts +8 -0
  52. package/dist/group-order.d.ts.map +1 -0
  53. package/dist/group-order.js +24 -0
  54. package/dist/group-order.js.map +1 -0
  55. package/dist/group-settings.d.ts +17 -0
  56. package/dist/group-settings.d.ts.map +1 -0
  57. package/dist/group-settings.js +44 -0
  58. package/dist/group-settings.js.map +1 -0
  59. package/dist/index.d.ts +17 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +17 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/operations.d.ts +11 -0
  64. package/dist/operations.d.ts.map +1 -0
  65. package/dist/operations.js +117 -0
  66. package/dist/operations.js.map +1 -0
  67. package/dist/registry.d.ts +17 -0
  68. package/dist/registry.d.ts.map +1 -0
  69. package/dist/registry.js +482 -0
  70. package/dist/registry.js.map +1 -0
  71. package/dist/remote-data.d.ts +19 -0
  72. package/dist/remote-data.d.ts.map +1 -0
  73. package/dist/remote-data.js +67 -0
  74. package/dist/remote-data.js.map +1 -0
  75. package/dist/row-move.d.ts +7 -0
  76. package/dist/row-move.d.ts.map +1 -0
  77. package/dist/row-move.js +27 -0
  78. package/dist/row-move.js.map +1 -0
  79. package/dist/schedule-view.d.ts +27 -0
  80. package/dist/schedule-view.d.ts.map +1 -0
  81. package/dist/schedule-view.js +122 -0
  82. package/dist/schedule-view.js.map +1 -0
  83. package/dist/schedule.d.ts +28 -0
  84. package/dist/schedule.d.ts.map +1 -0
  85. package/dist/schedule.js +97 -0
  86. package/dist/schedule.js.map +1 -0
  87. package/dist/style.css +1028 -0
  88. package/dist/timeline.d.ts +25 -0
  89. package/dist/timeline.d.ts.map +1 -0
  90. package/dist/timeline.js +58 -0
  91. package/dist/timeline.js.map +1 -0
  92. package/dist/toolbar.d.ts +10 -0
  93. package/dist/toolbar.d.ts.map +1 -0
  94. package/dist/toolbar.js +31 -0
  95. package/dist/toolbar.js.map +1 -0
  96. package/dist/types.d.ts +474 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +22 -0
  99. package/dist/types.js.map +1 -0
  100. package/dist/use-remote-data.d.ts +18 -0
  101. package/dist/use-remote-data.d.ts.map +1 -0
  102. package/dist/use-remote-data.js +12 -0
  103. package/dist/use-remote-data.js.map +1 -0
  104. package/dist/use-row-move.d.ts +12 -0
  105. package/dist/use-row-move.d.ts.map +1 -0
  106. package/dist/use-row-move.js +151 -0
  107. package/dist/use-row-move.js.map +1 -0
  108. package/dist/v2-panels.d.ts +37 -0
  109. package/dist/v2-panels.d.ts.map +1 -0
  110. package/dist/v2-panels.js +118 -0
  111. package/dist/v2-panels.js.map +1 -0
  112. package/dist/view-state.d.ts +30 -0
  113. package/dist/view-state.d.ts.map +1 -0
  114. package/dist/view-state.js +94 -0
  115. package/dist/view-state.js.map +1 -0
  116. package/dist/view-workspace.d.ts +3 -0
  117. package/dist/view-workspace.d.ts.map +1 -0
  118. package/dist/view-workspace.js +95 -0
  119. package/dist/view-workspace.js.map +1 -0
  120. package/dist/virtual-list.d.ts +12 -0
  121. package/dist/virtual-list.d.ts.map +1 -0
  122. package/dist/virtual-list.js +46 -0
  123. package/dist/virtual-list.js.map +1 -0
  124. package/package.json +19 -16
  125. package/index.d.ts +0 -2
  126. package/index.js +0 -5
  127. package/react.d.ts +0 -2
  128. package/react.js +0 -8
  129. 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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"}
@@ -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"}