@keenaioc/data-view 0.0.0-poc.1 → 0.2.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +105 -0
- package/DATA-PRIVACY.md +20 -0
- package/INTEGRATION.md +178 -0
- package/KNOWN-LIMITATIONS.md +34 -0
- package/LICENSE +21 -0
- package/README.md +67 -5
- package/dist/contracts.d.ts +33 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +83 -0
- package/dist/contracts.js.map +1 -0
- package/dist/data-view.d.ts +3 -0
- package/dist/data-view.d.ts.map +1 -0
- package/dist/data-view.js +822 -0
- package/dist/data-view.js.map +1 -0
- package/dist/engine.d.ts +34 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +307 -0
- package/dist/engine.js.map +1 -0
- package/dist/gantt-bar.d.ts +17 -0
- package/dist/gantt-bar.d.ts.map +1 -0
- package/dist/gantt-bar.js +142 -0
- package/dist/gantt-bar.js.map +1 -0
- package/dist/gantt-dependencies.d.ts +27 -0
- package/dist/gantt-dependencies.d.ts.map +1 -0
- package/dist/gantt-dependencies.js +218 -0
- package/dist/gantt-dependencies.js.map +1 -0
- package/dist/gantt-dependency-ui.d.ts +37 -0
- package/dist/gantt-dependency-ui.d.ts.map +1 -0
- package/dist/gantt-dependency-ui.js +79 -0
- package/dist/gantt-dependency-ui.js.map +1 -0
- package/dist/gantt-grid.d.ts +27 -0
- package/dist/gantt-grid.d.ts.map +1 -0
- package/dist/gantt-grid.js +72 -0
- package/dist/gantt-grid.js.map +1 -0
- package/dist/gantt-operations.d.ts +14 -0
- package/dist/gantt-operations.d.ts.map +1 -0
- package/dist/gantt-operations.js +103 -0
- package/dist/gantt-operations.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/operations.d.ts +11 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +117 -0
- package/dist/operations.js.map +1 -0
- package/dist/registry.d.ts +13 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +465 -0
- package/dist/registry.js.map +1 -0
- package/dist/remote-data.d.ts +19 -0
- package/dist/remote-data.d.ts.map +1 -0
- package/dist/remote-data.js +67 -0
- package/dist/remote-data.js.map +1 -0
- package/dist/row-move.d.ts +7 -0
- package/dist/row-move.d.ts.map +1 -0
- package/dist/row-move.js +27 -0
- package/dist/row-move.js.map +1 -0
- package/dist/schedule-view.d.ts +27 -0
- package/dist/schedule-view.d.ts.map +1 -0
- package/dist/schedule-view.js +122 -0
- package/dist/schedule-view.js.map +1 -0
- package/dist/schedule.d.ts +28 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/schedule.js +97 -0
- package/dist/schedule.js.map +1 -0
- package/dist/style.css +986 -0
- package/dist/timeline.d.ts +25 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +58 -0
- package/dist/timeline.js.map +1 -0
- package/dist/toolbar.d.ts +10 -0
- package/dist/toolbar.d.ts.map +1 -0
- package/dist/toolbar.js +31 -0
- package/dist/toolbar.js.map +1 -0
- package/dist/types.d.ts +472 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -0
- package/dist/use-remote-data.d.ts +18 -0
- package/dist/use-remote-data.d.ts.map +1 -0
- package/dist/use-remote-data.js +12 -0
- package/dist/use-remote-data.js.map +1 -0
- package/dist/use-row-move.d.ts +12 -0
- package/dist/use-row-move.d.ts.map +1 -0
- package/dist/use-row-move.js +151 -0
- package/dist/use-row-move.js.map +1 -0
- package/dist/v2-panels.d.ts +37 -0
- package/dist/v2-panels.d.ts.map +1 -0
- package/dist/v2-panels.js +108 -0
- package/dist/v2-panels.js.map +1 -0
- package/dist/view-state.d.ts +30 -0
- package/dist/view-state.d.ts.map +1 -0
- package/dist/view-state.js +94 -0
- package/dist/view-state.js.map +1 -0
- package/dist/view-workspace.d.ts +3 -0
- package/dist/view-workspace.d.ts.map +1 -0
- package/dist/view-workspace.js +95 -0
- package/dist/view-workspace.js.map +1 -0
- package/dist/virtual-list.d.ts +12 -0
- package/dist/virtual-list.d.ts.map +1 -0
- package/dist/virtual-list.js +46 -0
- package/dist/virtual-list.js.map +1 -0
- package/package.json +19 -16
- package/index.d.ts +0 -2
- package/index.js +0 -5
- package/react.d.ts +0 -2
- package/react.js +0 -8
- package/style.css +0 -1
|
@@ -0,0 +1,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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"}
|
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.8";
|
|
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,kBAAkB,CAAC;AAEjD,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.8";
|
|
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,eAAe,CAAC;AAEjD,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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { getFieldValue, validateValue } from "./engine.js";
|
|
2
|
+
import { getFieldTypeDefinition, parseClipboardValue } from "./registry.js";
|
|
3
|
+
export const MAX_BATCH_CELLS = 1000;
|
|
4
|
+
export function canWriteField(row, field, permissions) {
|
|
5
|
+
return !field.internal && !field.renderAction && getFieldTypeDefinition(field.type).editable && !field.readOnly && !field.system &&
|
|
6
|
+
field.canRead?.({ row, field }) !== false && field.canEdit?.({ row, field }) !== false && permissions?.canEditRow?.(row) !== false;
|
|
7
|
+
}
|
|
8
|
+
export function validateChanges(changes, permissions) {
|
|
9
|
+
if (!changes.length)
|
|
10
|
+
return "沒有可修改的儲存格";
|
|
11
|
+
if (changes.length > MAX_BATCH_CELLS)
|
|
12
|
+
return `一次最多 ${MAX_BATCH_CELLS} 格,請縮小範圍`;
|
|
13
|
+
const seen = new Set();
|
|
14
|
+
for (const c of changes) {
|
|
15
|
+
const key = JSON.stringify([c.rowId, c.field.id]);
|
|
16
|
+
if (seen.has(key))
|
|
17
|
+
return "同一批次不可重複修改同一格";
|
|
18
|
+
seen.add(key);
|
|
19
|
+
if (!canWriteField(c.row, c.field, permissions))
|
|
20
|
+
return `${c.rowId}/${c.field.label}:無修改權限`;
|
|
21
|
+
const error = validateValue(c.nextValue, c.field, c.row);
|
|
22
|
+
if (error)
|
|
23
|
+
return `${c.rowId}/${c.field.label}:${error}`;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
/** Quoted TSV supports tabs/newlines inside text. No formulas are evaluated. */
|
|
28
|
+
export function parseTSV(text) {
|
|
29
|
+
if (text.length > 1_000_000)
|
|
30
|
+
throw new Error("貼上內容過大");
|
|
31
|
+
const result = [];
|
|
32
|
+
let row = [];
|
|
33
|
+
let cell = "";
|
|
34
|
+
let quoted = false;
|
|
35
|
+
const input = text.replace(/\r\n?/g, "\n");
|
|
36
|
+
for (let i = 0; i < input.length; i++) {
|
|
37
|
+
const c = input[i];
|
|
38
|
+
if (c === '"') {
|
|
39
|
+
if (quoted && input[i + 1] === '"') {
|
|
40
|
+
cell += '"';
|
|
41
|
+
i++;
|
|
42
|
+
}
|
|
43
|
+
else if (quoted || cell === "")
|
|
44
|
+
quoted = !quoted;
|
|
45
|
+
else
|
|
46
|
+
cell += c;
|
|
47
|
+
}
|
|
48
|
+
else if (!quoted && (c === "\t" || c === "\n")) {
|
|
49
|
+
row.push(cell);
|
|
50
|
+
cell = "";
|
|
51
|
+
if (c === "\n") {
|
|
52
|
+
result.push(row);
|
|
53
|
+
row = [];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else
|
|
57
|
+
cell += c;
|
|
58
|
+
}
|
|
59
|
+
if (quoted)
|
|
60
|
+
throw new Error("貼上內容的引號未關閉");
|
|
61
|
+
if (cell || row.length || !input.endsWith("\n")) {
|
|
62
|
+
row.push(cell);
|
|
63
|
+
result.push(row);
|
|
64
|
+
}
|
|
65
|
+
if (result.reduce((n, r) => n + r.length, 0) > MAX_BATCH_CELLS)
|
|
66
|
+
throw new Error(`一次最多 ${MAX_BATCH_CELLS} 格`);
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
export function encodeTSV(rows) {
|
|
70
|
+
return rows.map((r) => r.map((value) => {
|
|
71
|
+
// Spreadsheet-safe export: prefix formula-leading text, never execute it.
|
|
72
|
+
const safe = /^[=+@\-]/.test(value) && !/^-?\d+(\.\d+)?$/.test(value) ? `'${value}` : value;
|
|
73
|
+
return /["\t\n\r]/.test(safe) ? `"${safe.replace(/"/g, '""')}"` : safe;
|
|
74
|
+
}).join("\t")).join("\n");
|
|
75
|
+
}
|
|
76
|
+
export function createPasteChanges(text, rows, fields, getRowId, rowIndex, columnIndex) {
|
|
77
|
+
const grid = parseTSV(text);
|
|
78
|
+
if (rowIndex < 0 || columnIndex < 0 || rowIndex + grid.length > rows.length || grid.some((r) => columnIndex + r.length > fields.length))
|
|
79
|
+
throw new Error("貼上範圍超出目前顯示的資料列或欄位");
|
|
80
|
+
return grid.flatMap((r, offset) => r.map((textValue, x) => {
|
|
81
|
+
const row = rows[rowIndex + offset];
|
|
82
|
+
const field = fields[columnIndex + x];
|
|
83
|
+
return { row, rowId: getRowId(row), field, previousValue: getFieldValue(row, field), nextValue: parseClipboardValue(textValue, field) };
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
export function validateFieldChange(fields, change, permissions) {
|
|
87
|
+
if (permissions?.canManageFields !== true)
|
|
88
|
+
return "沒有管理欄位的權限";
|
|
89
|
+
const id = "fieldId" in change ? change.fieldId : change.action === "copy" ? change.sourceFieldId : null;
|
|
90
|
+
const existing = fields.find((f) => f.id === id);
|
|
91
|
+
if (change.action !== "add") {
|
|
92
|
+
if (!existing)
|
|
93
|
+
return "欄位不存在";
|
|
94
|
+
if (existing.internal || existing.renderAction || existing.system || !getFieldTypeDefinition(existing.type).deletable || existing.deletable === false)
|
|
95
|
+
return "系統或受保護欄位不能修改結構";
|
|
96
|
+
if (permissions?.canChangeField?.(existing, change.action) === false)
|
|
97
|
+
return "沒有變更此欄位的權限";
|
|
98
|
+
}
|
|
99
|
+
if (change.action === "rename")
|
|
100
|
+
return change.label.trim() ? null : "請填欄位名稱";
|
|
101
|
+
if (change.action === "delete")
|
|
102
|
+
return fields.length > 1 ? null : "至少保留一個欄位";
|
|
103
|
+
const field = change.field;
|
|
104
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_\-]{0,79}$/.test(field.id) || ["__proto__", "constructor", "prototype"].includes(field.id))
|
|
105
|
+
return "欄位 ID 格式不正確";
|
|
106
|
+
if (fields.some((f) => f.id === field.id))
|
|
107
|
+
return "欄位 ID 已存在";
|
|
108
|
+
if (!field.label.trim())
|
|
109
|
+
return "請填欄位名稱";
|
|
110
|
+
if (!getFieldTypeDefinition(field.type)?.editable || field.internal || field.system || field.readOnly || field.renderAction)
|
|
111
|
+
return "系統欄位只能由接入專案建立";
|
|
112
|
+
if (change.action === "copy" && existing?.canRead)
|
|
113
|
+
return "有逐列讀取限制的欄位,請由專案管理員處理複製";
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
export function newOperationId() { return globalThis.crypto?.randomUUID?.() ?? `hy-${Date.now()}-${Math.random().toString(36).slice(2)}`; }
|
|
117
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { FieldDefinition, FieldEditorProps, FieldType, FieldTypeDefinition, FilterOperator } from "./types.js";
|
|
3
|
+
export declare const FILTER_OPERATOR_LABELS: Record<FilterOperator, string>;
|
|
4
|
+
export declare function ReferenceEditor<Row>({ value, field, onCommit, onCancel }: FieldEditorProps<Row>): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export declare const FIELD_TYPE_REGISTRY: Record<FieldType, FieldTypeDefinition>;
|
|
6
|
+
export declare function getFieldTypeDefinition(type: FieldType): FieldTypeDefinition;
|
|
7
|
+
export declare function renderFieldValue<Row>(value: unknown, field: FieldDefinition<Row>, row: Row): ReactNode;
|
|
8
|
+
/** The registry owns clipboard conversion too, so every view uses the same types. */
|
|
9
|
+
export declare function formatClipboardValue<Row>(value: unknown, field: FieldDefinition<Row>): string;
|
|
10
|
+
export declare function parseClipboardValue<Row>(text: string, field: FieldDefinition<Row>): unknown;
|
|
11
|
+
export declare function formatReadableValue<Row>(value: unknown, field: FieldDefinition<Row>, row: Row): string;
|
|
12
|
+
export declare function formatReadableRow<Row>(row: Row, fields: FieldDefinition<Row>[]): string;
|
|
13
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/F,OAAO,KAAK,EAEV,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,mBAAmB,EACnB,cAAc,EAIf,MAAM,YAAY,CAAC;AAOpB,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAgBjE,CAAC;AAwNF,wBAAgB,eAAe,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,gBAAgB,CAAC,GAAG,CAAC,2CAe/F;AAgCD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAsDtE,CAAC;AAcF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,uBAErD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,SAAS,CAMtG;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,MAAM,CAI7F;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAiC3F;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,CAMtG;AACD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,UAE9E"}
|