@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.
Files changed (109) hide show
  1. package/CHANGELOG.md +105 -0
  2. package/DATA-PRIVACY.md +20 -0
  3. package/INTEGRATION.md +178 -0
  4. package/KNOWN-LIMITATIONS.md +34 -0
  5. package/LICENSE +21 -0
  6. package/README.md +67 -5
  7. package/dist/contracts.d.ts +33 -0
  8. package/dist/contracts.d.ts.map +1 -0
  9. package/dist/contracts.js +83 -0
  10. package/dist/contracts.js.map +1 -0
  11. package/dist/data-view.d.ts +3 -0
  12. package/dist/data-view.d.ts.map +1 -0
  13. package/dist/data-view.js +822 -0
  14. package/dist/data-view.js.map +1 -0
  15. package/dist/engine.d.ts +34 -0
  16. package/dist/engine.d.ts.map +1 -0
  17. package/dist/engine.js +307 -0
  18. package/dist/engine.js.map +1 -0
  19. package/dist/gantt-bar.d.ts +17 -0
  20. package/dist/gantt-bar.d.ts.map +1 -0
  21. package/dist/gantt-bar.js +142 -0
  22. package/dist/gantt-bar.js.map +1 -0
  23. package/dist/gantt-dependencies.d.ts +27 -0
  24. package/dist/gantt-dependencies.d.ts.map +1 -0
  25. package/dist/gantt-dependencies.js +218 -0
  26. package/dist/gantt-dependencies.js.map +1 -0
  27. package/dist/gantt-dependency-ui.d.ts +37 -0
  28. package/dist/gantt-dependency-ui.d.ts.map +1 -0
  29. package/dist/gantt-dependency-ui.js +79 -0
  30. package/dist/gantt-dependency-ui.js.map +1 -0
  31. package/dist/gantt-grid.d.ts +27 -0
  32. package/dist/gantt-grid.d.ts.map +1 -0
  33. package/dist/gantt-grid.js +72 -0
  34. package/dist/gantt-grid.js.map +1 -0
  35. package/dist/gantt-operations.d.ts +14 -0
  36. package/dist/gantt-operations.d.ts.map +1 -0
  37. package/dist/gantt-operations.js +103 -0
  38. package/dist/gantt-operations.js.map +1 -0
  39. package/dist/index.d.ts +17 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +17 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/operations.d.ts +11 -0
  44. package/dist/operations.d.ts.map +1 -0
  45. package/dist/operations.js +117 -0
  46. package/dist/operations.js.map +1 -0
  47. package/dist/registry.d.ts +13 -0
  48. package/dist/registry.d.ts.map +1 -0
  49. package/dist/registry.js +465 -0
  50. package/dist/registry.js.map +1 -0
  51. package/dist/remote-data.d.ts +19 -0
  52. package/dist/remote-data.d.ts.map +1 -0
  53. package/dist/remote-data.js +67 -0
  54. package/dist/remote-data.js.map +1 -0
  55. package/dist/row-move.d.ts +7 -0
  56. package/dist/row-move.d.ts.map +1 -0
  57. package/dist/row-move.js +27 -0
  58. package/dist/row-move.js.map +1 -0
  59. package/dist/schedule-view.d.ts +27 -0
  60. package/dist/schedule-view.d.ts.map +1 -0
  61. package/dist/schedule-view.js +122 -0
  62. package/dist/schedule-view.js.map +1 -0
  63. package/dist/schedule.d.ts +28 -0
  64. package/dist/schedule.d.ts.map +1 -0
  65. package/dist/schedule.js +97 -0
  66. package/dist/schedule.js.map +1 -0
  67. package/dist/style.css +986 -0
  68. package/dist/timeline.d.ts +25 -0
  69. package/dist/timeline.d.ts.map +1 -0
  70. package/dist/timeline.js +58 -0
  71. package/dist/timeline.js.map +1 -0
  72. package/dist/toolbar.d.ts +10 -0
  73. package/dist/toolbar.d.ts.map +1 -0
  74. package/dist/toolbar.js +31 -0
  75. package/dist/toolbar.js.map +1 -0
  76. package/dist/types.d.ts +472 -0
  77. package/dist/types.d.ts.map +1 -0
  78. package/dist/types.js +22 -0
  79. package/dist/types.js.map +1 -0
  80. package/dist/use-remote-data.d.ts +18 -0
  81. package/dist/use-remote-data.d.ts.map +1 -0
  82. package/dist/use-remote-data.js +12 -0
  83. package/dist/use-remote-data.js.map +1 -0
  84. package/dist/use-row-move.d.ts +12 -0
  85. package/dist/use-row-move.d.ts.map +1 -0
  86. package/dist/use-row-move.js +151 -0
  87. package/dist/use-row-move.js.map +1 -0
  88. package/dist/v2-panels.d.ts +37 -0
  89. package/dist/v2-panels.d.ts.map +1 -0
  90. package/dist/v2-panels.js +108 -0
  91. package/dist/v2-panels.js.map +1 -0
  92. package/dist/view-state.d.ts +30 -0
  93. package/dist/view-state.d.ts.map +1 -0
  94. package/dist/view-state.js +94 -0
  95. package/dist/view-state.js.map +1 -0
  96. package/dist/view-workspace.d.ts +3 -0
  97. package/dist/view-workspace.d.ts.map +1 -0
  98. package/dist/view-workspace.js +95 -0
  99. package/dist/view-workspace.js.map +1 -0
  100. package/dist/virtual-list.d.ts +12 -0
  101. package/dist/virtual-list.d.ts.map +1 -0
  102. package/dist/virtual-list.js +46 -0
  103. package/dist/virtual-list.js.map +1 -0
  104. package/package.json +19 -16
  105. package/index.d.ts +0 -2
  106. package/index.js +0 -5
  107. package/react.d.ts +0 -2
  108. package/react.js +0 -8
  109. package/style.css +0 -1
@@ -0,0 +1,7 @@
1
+ import type { FieldDefinition, GroupPathPart, GroupRule, RowMoveRequest } from "./types.js";
2
+ export declare function rowGroupPaths<Row>(rows: Row[], fields: FieldDefinition<Row>[], groups: GroupRule[], getRowId: (row: Row) => string): {
3
+ rowPaths: Map<string, GroupPathPart[]>;
4
+ groupPaths: Map<string, GroupPathPart[]>;
5
+ };
6
+ export declare function validateRowMove<Row>(request: RowMoveRequest<Row>, groups: GroupRule[]): "不能移動到自己" | "請選擇完整且可讀的分組落點" | "缺少落點資料 ID" | null;
7
+ //# sourceMappingURL=row-move.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row-move.d.ts","sourceRoot":"","sources":["../src/row-move.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqB,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/G,wBAAgB,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM;;;EAYlI;AACD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,oDAKrF"}
@@ -0,0 +1,27 @@
1
+ import { buildGroupTree } from "./engine.js";
2
+ export function rowGroupPaths(rows, fields, groups, getRowId) {
3
+ const rowPaths = new Map(), groupPaths = new Map();
4
+ function visit(nodes, parent) {
5
+ for (const node of nodes) {
6
+ const path = node.fieldId ? [...parent, { fieldId: node.fieldId, key: node.key, valueKey: node.valueKey ?? "" }] : parent;
7
+ groupPaths.set(node.key, path);
8
+ if (node.children.length)
9
+ visit(node.children, path);
10
+ else
11
+ for (const row of node.rows)
12
+ rowPaths.set(getRowId(row), path);
13
+ }
14
+ }
15
+ visit(buildGroupTree(rows, fields, groups), []);
16
+ return { rowPaths, groupPaths };
17
+ }
18
+ export function validateRowMove(request, groups) {
19
+ if (request.targetRowId === request.rowId)
20
+ return "不能移動到自己";
21
+ if (request.targetGroupPath.length !== groups.length || request.targetGroupPath.some((part, index) => part.fieldId !== groups[index].fieldId || part.valueKey === "__restricted__"))
22
+ return "請選擇完整且可讀的分組落點";
23
+ if (request.position !== "groupEnd" && !request.targetRowId)
24
+ return "缺少落點資料 ID";
25
+ return null;
26
+ }
27
+ //# sourceMappingURL=row-move.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row-move.js","sourceRoot":"","sources":["../src/row-move.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,MAAM,UAAU,aAAa,CAAM,IAAW,EAAE,MAA8B,EAAE,MAAmB,EAAE,QAA8B;IACjI,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,EAAE,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;IACrG,SAAS,KAAK,CAAC,KAA+B,EAAE,MAAuB;QACrE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC1H,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;;gBAChD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI;oBAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IACD,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC;AACD,MAAM,UAAU,eAAe,CAAM,OAA4B,EAAE,MAAmB;IACpF,IAAI,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,gBAAgB,CAAC;QAAE,OAAO,eAAe,CAAC;IAC5M,IAAI,OAAO,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,OAAO,CAAC,WAAW;QAAE,OAAO,WAAW,CAAC;IAChF,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { type ReactNode } from "react";
2
+ import type { BatchCommit, GanttDependencyChange, GanttDependencyState, CellCommit, DataViewConfig, DataViewPermissions, FieldDefinition, ViewLocation, DataViewMetrics, DataViewGroupNode } from "./types.js";
3
+ export declare function ScheduleView<Row>({ rows, fields, getRowId, view, onOpen, compact, permissions, busy, onCommit, allRows, dependencies, onDependencyChange, onScheduleCommit, onLocationChange, onToggleGroup, renderLeftHeader, renderLeftRow, renderMobileRow, metrics, getRowLabel, groupLabel, onLoadNearEnd }: {
4
+ metrics?: DataViewMetrics;
5
+ getRowLabel?: (row: Row) => string;
6
+ groupLabel?: (node: DataViewGroupNode<Row>) => ReactNode;
7
+ onLoadNearEnd?: (el: HTMLElement) => void;
8
+ onLocationChange?: (patch: ViewLocation) => void;
9
+ onToggleGroup?: (key: string) => void;
10
+ renderLeftHeader?: () => ReactNode;
11
+ renderLeftRow?: (row: Row) => ReactNode;
12
+ renderMobileRow?: (row: Row) => ReactNode;
13
+ rows: Row[];
14
+ fields: FieldDefinition<Row>[];
15
+ getRowId: (row: Row) => string;
16
+ view: DataViewConfig;
17
+ onOpen: (row: Row) => void;
18
+ compact?: boolean;
19
+ permissions?: DataViewPermissions<Row>;
20
+ busy?: boolean;
21
+ onCommit?: (changes: CellCommit<Row>[]) => Promise<boolean>;
22
+ allRows?: Row[];
23
+ dependencies?: GanttDependencyState<Row>;
24
+ onDependencyChange?: (change: GanttDependencyChange) => Promise<boolean>;
25
+ onScheduleCommit?: (request: BatchCommit<Row>) => Promise<boolean>;
26
+ }): import("react/jsx-runtime").JSX.Element;
27
+ //# sourceMappingURL=schedule-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-view.d.ts","sourceRoot":"","sources":["../src/schedule-view.tsx"],"names":[],"mappings":"AACA,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAQ7E,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,oBAAoB,EAAgB,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE7N,wBAAgB,YAAY,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAe,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,OAAsC,EAAE,WAA2J,EAAE,UAA4D,EAAE,aAAwB,EAAE,EAAE;IAAE,OAAO,CAAC,EAAE,eAAe,CAAC;IAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;IAAC,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,CAAC;IAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,SAAS,CAAC;IAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,SAAS,CAAC;IAAC,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,SAAS,CAAC;IAAC,IAAI,EAAE,GAAG,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;IAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAAC,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,2CA2Fp3C"}
@@ -0,0 +1,122 @@
1
+ "use client";
2
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useEffect, useMemo, useRef, useState } from "react";
4
+ import { dateDay, dayString, monthDays, scheduleRows, shiftMonth } from "./schedule.js";
5
+ import { resolveMetrics } from "./contracts.js";
6
+ import { GanttGrid } from "./gantt-grid.js";
7
+ import { scheduleEntries, timelineWindow } from "./timeline.js";
8
+ import { createGanttReschedulePlan, validateGanttScheduleGuard } from "./gantt-dependencies.js";
9
+ import { GanttDependencyPanel, GanttRescheduleReview, scheduleRowLabel } from "./gantt-dependency-ui.js";
10
+ import { ganttDuration } from "./gantt-operations.js";
11
+ export function ScheduleView({ rows, fields, getRowId, view, onOpen, compact = false, permissions, busy, onCommit, allRows = rows, dependencies, onDependencyChange, onScheduleCommit, onLocationChange, onToggleGroup, renderLeftHeader, renderLeftRow, renderMobileRow, metrics = resolveMetrics(view.density), getRowLabel = (row) => scheduleRowLabel(row, fields, { titleFieldId: (view.gantt ?? view.calendar)?.titleFieldId ?? "", startFieldId: "", endFieldId: "" }), groupLabel = (node) => `${node.label} · ${node.rows.length}`, onLoadNearEnd = () => { } }) {
12
+ const type = view.viewType === "gantt" ? "gantt" : "calendar";
13
+ const mapping = type === "gantt" ? view.gantt : view.calendar;
14
+ const [localLocation, setLocalLocation] = useState(view.location ?? {});
15
+ const loc = useMemo(() => onLocationChange ? view.location ?? {} : localLocation, [onLocationChange, view.location, localLocation]);
16
+ const mobileRef = useRef(null);
17
+ const locRef = useRef(loc);
18
+ useEffect(() => { locRef.current = loc; }, [loc]);
19
+ useEffect(() => { if (mobileRef.current)
20
+ mobileRef.current.scrollTop = locRef.current.mobileTop ?? 0; }, [type]);
21
+ function patch(p) { if (onLocationChange)
22
+ onLocationChange(p);
23
+ else {
24
+ locRef.current = { ...locRef.current, ...p };
25
+ setLocalLocation(locRef.current);
26
+ } }
27
+ const month = loc.month ?? new Date().toISOString().slice(0, 7);
28
+ const day = loc.calendarDay ?? null;
29
+ const showUnscheduled = view.schedulePolicy?.showUnscheduled === true && (loc.showUnscheduled ?? false);
30
+ const [showInvalid, setShowInvalid] = useState(false);
31
+ const anchorDate = loc.anchorDate ?? `${month}-01`;
32
+ const scale = loc.scale ?? "month";
33
+ const range = timelineWindow(anchorDate, scale);
34
+ function setMonth(value) { patch({ month: value, anchorDate: `${value}-01`, timelineLeft: undefined }); }
35
+ function setDay(value) { patch({ calendarDay: value }); }
36
+ function setShowUnscheduled(value) { patch({ showUnscheduled: value }); }
37
+ const [message, setMessage] = useState("");
38
+ const [dependencyPanel, setDependencyPanel] = useState(false);
39
+ const [proposal, setProposal] = useState(null);
40
+ const [reviewError, setReviewError] = useState("");
41
+ const resolveProposal = useRef(null);
42
+ const applying = useRef(false);
43
+ useEffect(() => () => { resolveProposal.current?.("cancelled"); resolveProposal.current = null; }, []);
44
+ async function requestSchedule(changes) {
45
+ if (!dependencies)
46
+ return onCommit ? onCommit(changes) : false;
47
+ if (!onScheduleCommit || resolveProposal.current || !view.gantt)
48
+ return false;
49
+ const plan = createGanttReschedulePlan({ rows: allRows, fields, mapping: view.gantt, getRowId, dependencies, changes, permissions });
50
+ setReviewError("");
51
+ setProposal({ plan, mapping: { ...view.gantt } });
52
+ return new Promise((resolve) => { resolveProposal.current = resolve; });
53
+ }
54
+ function closeProposal() {
55
+ if (busy || applying.current)
56
+ return;
57
+ resolveProposal.current?.("cancelled");
58
+ resolveProposal.current = null;
59
+ setProposal(null);
60
+ setReviewError("");
61
+ }
62
+ async function applyProposal() {
63
+ if (!proposal || !onScheduleCommit || busy || applying.current)
64
+ return;
65
+ applying.current = true;
66
+ try {
67
+ if (proposal.mapping.startFieldId !== view.gantt?.startFieldId || proposal.mapping.endFieldId !== view.gantt?.endFieldId || proposal.mapping.workdaysOnly !== view.gantt?.workdaysOnly)
68
+ throw new Error("日期設定已變更,請取消後重新預覽");
69
+ validateGanttScheduleGuard(proposal.plan.request.scheduleGuard, allRows, fields, getRowId, dependencies);
70
+ const saved = await onScheduleCommit(proposal.plan.request);
71
+ if (!saved) {
72
+ setReviewError("未套用改期。請取消後確認儲存提示,再重新預覽。");
73
+ return;
74
+ }
75
+ resolveProposal.current?.(true);
76
+ resolveProposal.current = null;
77
+ setProposal(null);
78
+ }
79
+ catch (error) {
80
+ setReviewError(error instanceof Error ? error.message : "改期未完成");
81
+ }
82
+ finally {
83
+ applying.current = false;
84
+ }
85
+ }
86
+ const data = useMemo(() => mapping ? scheduleRows(rows, fields, getRowId, type, mapping) : { items: [], unscheduled: rows, invalid: [] }, [rows, fields, getRowId, type, mapping]);
87
+ const days = monthDays(month);
88
+ const inMonth = data.items.filter((item) => item.start <= days.end && item.end >= days.start);
89
+ const pageItems = day === null ? inMonth : data.items.filter((item) => item.start <= day && item.end >= day);
90
+ const entries = useMemo(() => scheduleEntries(rows, fields, { groups: view.groups, collapsedGroups: view.collapsedGroups }), [rows, fields, view.groups, view.collapsedGroups]);
91
+ const count = type === "gantt" ? entries.length : showUnscheduled ? data.unscheduled.length : pageItems.length;
92
+ const paged = pageItems;
93
+ const ganttEntries = entries;
94
+ const itemMap = new Map(data.items.map((item) => [item.id, item]));
95
+ const configured = mapping?.titleFieldId && (type === "gantt" ? view.gantt?.startFieldId && view.gantt.endFieldId : view.calendar?.dateFieldId);
96
+ if (!configured)
97
+ return _jsxs("div", { className: "hy-dv-state", children: [_jsxs("strong", { children: ["\u5148\u8A2D\u5B9A", type === "gantt" ? "甘特圖" : "行事曆", "\u6B04\u4F4D"] }), _jsx("p", { children: "\u958B\u555F\u4E0A\u65B9\u8A2D\u5B9A\uFF0C\u9078\u64C7\u6A19\u984C\u53CA\u65E5\u671F\u4F86\u6E90\uFF1B\u4E0D\u6703\u5EFA\u7ACB\u53E6\u4E00\u4EFD\u8CC7\u6599\u3002" })] });
98
+ return _jsxs("div", { className: `hy-dv-schedule ${compact ? "is-compact" : ""}`, style: { "--hy-month-days": days.end - days.start + 1 }, children: [_jsxs("div", { className: "hy-dv-schedule-nav", children: [type === "gantt" && _jsxs(_Fragment, { children: [_jsxs("label", { children: ["\u6642\u9593\u5C3A\u5EA6", _jsx("select", { "aria-label": "\u6642\u9593\u5C3A\u5EA6", value: scale, onChange: (e) => patch({ scale: e.target.value, timelineLeft: undefined }), children: [["week", "週"], ["month", "月"], ["quarter", "季"], ["year", "年"]].map(([v, name]) => _jsx("option", { value: v, children: name }, v)) })] }), _jsxs("label", { children: ["\u5B9A\u4F4D\u65E5\u671F", _jsx("input", { type: "date", value: anchorDate, onChange: (e) => { if (dateDay(e.target.value) !== null)
99
+ patch({ anchorDate: e.target.value, timelineLeft: undefined }); } })] })] }), _jsx("button", { onClick: () => navigate(-1), "aria-label": "\u4E0A\u4E00\u500B\u671F\u9593", children: "\u2190" }), type !== "gantt" && _jsxs("label", { children: ["\u6708\u4EFD ", _jsx("input", { type: "month", value: month, onChange: (e) => { if (dateDay(`${e.target.value}-01`) !== null) {
100
+ setMonth(e.target.value);
101
+ setDay(null);
102
+ } } })] }), _jsx("button", { onClick: () => navigate(1), "aria-label": "\u4E0B\u4E00\u500B\u671F\u9593", children: "\u2192" }), _jsx("button", { onClick: () => { patch({ month: new Date().toISOString().slice(0, 7), anchorDate: new Date().toISOString().slice(0, 10), timelineLeft: undefined, calendarDay: null }); }, children: "\u4ECA\u5929" }), _jsx("span", { children: type === "gantt" ? `${dayString(range.start)} ~ ${dayString(range.end)}` : `本月 ${inMonth.length} 筆` }), view.schedulePolicy?.showUnscheduled === true && type !== "gantt" && _jsxs("button", { "aria-pressed": showUnscheduled, onClick: () => { setShowUnscheduled(!showUnscheduled); }, children: ["\u5C1A\u672A\u6392\u5B9A ", data.unscheduled.length] }), view.schedulePolicy?.showInvalidDates === true && _jsxs("button", { "aria-pressed": showInvalid, onClick: () => setShowInvalid(!showInvalid), children: ["\u65E5\u671F\u683C\u5F0F\u9700\u4FEE\u6B63 ", data.invalid.length] }), type === "gantt" && dependencies && _jsx("button", { onClick: () => setDependencyPanel(true), disabled: Boolean(proposal), children: "\u4F9D\u8CF4\u9023\u7DDA" })] }), type === "gantt" && _jsxs("div", { className: "hy-dv-gantt-help", children: [_jsxs("span", { className: "hy-dv-schedule-wide", children: [onCommit ? "可拖曳整條移動日期,左右端調整天數;點一下開啟詳情。" : "點排程查看詳情。", dependencies ? " 放開後先預覽,確認才會改期。" : "", view.gantt?.workdaysOnly ? " 工作天以週一至週五計算。" : " 天數包含開始與結束當日。"] }), _jsx("span", { className: "hy-dv-schedule-narrow", children: "\u9EDE\u5361\u7247\u67E5\u770B\u8207\u7DE8\u8F2F\u65E5\u671F\uFF1B\u6B04\u4F4D\u8A2D\u5B9A\u53EF\u8ABF\u6574\u5361\u7247\u986F\u793A\u5167\u5BB9\u3002" }), _jsx("span", { role: "status", "aria-live": "polite", children: message })] }), (view.schedulePolicy?.showInvalidDates === true && showInvalid) || type !== "gantt" && showUnscheduled ? _jsx("div", { className: "hy-dv-agenda", children: (view.schedulePolicy?.showInvalidDates === true && showInvalid ? data.invalid : data.unscheduled).map((row) => _jsx("button", { onClick: () => onOpen(row), children: getRowLabel(row) }, getRowId(row))) }) : _jsxs(_Fragment, { children: [type === "gantt" ? _jsxs(_Fragment, { children: [_jsx("div", { className: "hy-dv-schedule-wide", children: _jsx(GanttGrid, { metrics: metrics, groupLabel: groupLabel, onLoadNearEnd: onLoadNearEnd, getRowLabel: getRowLabel, entries: ganttEntries, items: data.items, fields: fields, getRowId: getRowId, view: view, window: range, onLocationChange: patch, onToggleGroup: onToggleGroup, renderLeftHeader: renderLeftHeader, renderLeftRow: renderLeftRow, onOpen: onOpen, onCommit: onCommit ? requestSchedule : undefined, onMessage: setMessage, busy: busy || Boolean(proposal), permissions: permissions, dependencies: dependencies }) }), _jsx("div", { ref: mobileRef, className: "hy-dv-schedule-narrow hy-dv-agenda hy-dv-mobile-scroll", onScroll: (e) => { onLoadNearEnd(e.currentTarget); patch({ mobileTop: e.currentTarget.scrollTop }); }, children: ganttEntries.map((entry) => {
103
+ if (entry.kind === "group")
104
+ return _jsxs("button", { className: "hy-dv-mobile-group-title", style: { paddingLeft: 10 + 16 * entry.node.depth }, "aria-expanded": !view.collapsedGroups.includes(entry.node.key), onClick: () => onToggleGroup?.(entry.node.key), children: [view.collapsedGroups.includes(entry.node.key) ? "›" : "⌄", " ", groupLabel(entry.node)] }, `g:${entry.node.key}`);
105
+ const item = itemMap.get(getRowId(entry.row));
106
+ return _jsxs("div", { className: "hy-dv-schedule-card", children: [item ? agendaItem(item) : _jsx("button", { onClick: () => onOpen(entry.row), children: getRowLabel(entry.row) }), renderMobileRow?.(entry.row)] }, getRowId(entry.row));
107
+ }) })] }) : _jsxs(_Fragment, { children: [_jsxs("div", { className: "hy-dv-calendar hy-dv-schedule-wide", children: [["日", "一", "二", "三", "四", "五", "六"].map((d) => _jsx("strong", { className: "hy-dv-weekday", children: d }, d)), days.grid.map((d) => {
108
+ const events = data.items.filter((item) => item.start <= d && item.end >= d);
109
+ return _jsxs("div", { className: `hy-dv-calendar-day ${d < days.start || d > days.end ? "is-outside" : ""}`, children: [_jsx("button", { className: "hy-dv-day-number", "aria-label": `查看 ${dayString(d)}`, onClick: () => { setDay(d); }, children: Number(dayString(d).slice(-2)) }), events.slice(0, 3).map((item) => _jsxs("button", { className: "hy-dv-event", style: { backgroundColor: item.color }, onClick: () => onOpen(item.row), title: `${item.time} ${item.title}`, children: [item.time !== "全天" && _jsxs("small", { children: [item.time, " "] }), item.title] }, item.id)), events.length > 3 && _jsxs("button", { className: "hy-dv-more", onClick: () => { setDay(d); }, children: ["\u53E6 ", events.length - 3, " \u7B46"] })] }, d);
110
+ })] }), _jsxs("div", { className: day === null ? "hy-dv-schedule-narrow" : "", children: [day !== null && _jsxs("div", { className: "hy-dv-schedule-nav", children: [_jsx("strong", { children: dayString(day) }), _jsx("button", { onClick: () => { setDay(null); }, children: "\u56DE\u5230\u5168\u6708" })] }), _jsx("div", { className: "hy-dv-agenda", children: paged.map(agendaItem) })] })] }), !count && _jsx("p", { className: "hy-dv-state", children: "\u6B64\u65E5\u671F\u7BC4\u570D\u6C92\u6709\u6392\u7A0B\u3002" })] }), _jsx("p", { className: "hy-dv-keyboard-help", children: "\u65E5\u671F\u4F9D\u8CC7\u6599\u7684 ISO \u65E5\u671F\u5448\u73FE\uFF1B\u6642\u5340\u7531\u63A5\u5165\u5C08\u6848\u7D71\u4E00\u3002" }), dependencyPanel && dependencies && view.gantt && _jsx(GanttDependencyPanel, { rows: allRows, fields: fields, mapping: view.gantt, getRowId: getRowId, state: dependencies, onChange: onDependencyChange, onClose: () => setDependencyPanel(false), busy: busy === true }), proposal && _jsx(GanttRescheduleReview, { plan: proposal.plan, fields: fields, mapping: proposal.mapping, onClose: closeProposal, onApply: () => void applyProposal(), busy: busy === true, error: reviewError })] });
111
+ function navigate(delta) {
112
+ if (type !== "gantt") {
113
+ setMonth(shiftMonth(month, delta));
114
+ setDay(null);
115
+ return;
116
+ }
117
+ const value = scale === "week" ? dayString(dateDay(anchorDate) + delta * 7) : `${shiftMonth(anchorDate.slice(0, 7), delta * (scale === "quarter" ? 3 : scale === "year" ? 12 : 1))}-01`;
118
+ patch({ anchorDate: value, timelineLeft: undefined });
119
+ }
120
+ function agendaItem(item) { return _jsxs("button", { onClick: () => onOpen(item.row), style: { borderLeftColor: item.color }, children: [_jsx("strong", { children: item.title }), _jsxs("span", { children: [dayString(item.start), item.end !== item.start ? ` 至 ${dayString(item.end)}` : "", type === "gantt" && view.gantt?.showDuration !== false ? ` · ${ganttDuration(item.start, item.end, view.gantt?.workdaysOnly)}${view.gantt?.workdaysOnly ? " 工作天" : " 天"}` : "", " \u00B7 ", item.time || item.group || "排程", item.progress === undefined ? "" : ` · ${Math.round(item.progress * 100)}%`] })] }, item.id); }
121
+ }
122
+ //# sourceMappingURL=schedule-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-view.js","sourceRoot":"","sources":["../src/schedule-view.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { CalendarMapping, FieldDefinition, GanttMapping } from "./types.js";
2
+ export declare const DAY_MS = 86400000;
3
+ /** Use the supplied ISO wall date, not the browser timezone. Adapters convert zones. */
4
+ export declare function dateDay(value: unknown): number | null;
5
+ export declare function dayString(day: number): string;
6
+ export declare function monthDays(month: string): {
7
+ start: number;
8
+ end: number;
9
+ grid: number[];
10
+ };
11
+ export declare function shiftMonth(month: string, direction: number): string;
12
+ export type ScheduleItem<Row> = {
13
+ row: Row;
14
+ id: string;
15
+ title: string;
16
+ start: number;
17
+ end: number;
18
+ time: string;
19
+ color?: string;
20
+ group?: string;
21
+ progress?: number;
22
+ };
23
+ export declare function scheduleRows<Row>(rows: Row[], fields: FieldDefinition<Row>[], getRowId: (row: Row) => string, type: "gantt" | "calendar", mapping: GanttMapping | CalendarMapping): {
24
+ items: ScheduleItem<Row>[];
25
+ unscheduled: Row[];
26
+ invalid: Row[];
27
+ };
28
+ //# sourceMappingURL=schedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjF,eAAO,MAAM,MAAM,WAAa,CAAC;AACjC,wFAAwF;AACxF,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIrD;AACD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,UAA+D;AACpG,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM;;;;EAOtC;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,UAG1D;AACD,MAAM,MAAM,YAAY,CAAC,GAAG,IAAI;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAErK,wBAAgB,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,eAAe;;;;EAgDjL"}
@@ -0,0 +1,97 @@
1
+ import { getFieldValue } from "./engine.js";
2
+ import { getFieldTypeDefinition, formatReadableValue } from "./registry.js";
3
+ export const DAY_MS = 86_400_000;
4
+ /** Use the supplied ISO wall date, not the browser timezone. Adapters convert zones. */
5
+ export function dateDay(value) {
6
+ if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}(?:$|T)/.test(value))
7
+ return null;
8
+ const day = value.slice(0, 10);
9
+ const timestamp = Date.parse(`${day}T00:00:00Z`);
10
+ return Number.isFinite(timestamp) && new Date(timestamp).toISOString().slice(0, 10) === day ? timestamp / DAY_MS : null;
11
+ }
12
+ export function dayString(day) { return new Date(day * DAY_MS).toISOString().slice(0, 10); }
13
+ export function monthDays(month) {
14
+ const start = dateDay(`${month}-01`);
15
+ if (start === null)
16
+ throw new Error("無效月份");
17
+ const date = new Date(start * DAY_MS);
18
+ const end = Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1, 1) / DAY_MS - 1;
19
+ const gridStart = start - date.getUTCDay();
20
+ return { start, end, grid: Array.from({ length: 42 }, (_, i) => gridStart + i) };
21
+ }
22
+ export function shiftMonth(month, direction) {
23
+ const date = new Date(`${month}-01T00:00:00Z`);
24
+ date.setUTCMonth(date.getUTCMonth() + direction);
25
+ return date.toISOString().slice(0, 7);
26
+ }
27
+ export function scheduleRows(rows, fields, getRowId, type, mapping) {
28
+ const definitions = new Map(fields.map((f) => [f.id, f]));
29
+ function read(row, id) {
30
+ const field = definitions.get(id ?? "");
31
+ return field && !field.internal && field.canRead?.({ row, field }) !== false ? getFieldValue(row, field) : undefined;
32
+ }
33
+ const items = [];
34
+ const unscheduled = [];
35
+ const invalid = [];
36
+ for (const row of rows) {
37
+ const titleField = definitions.get(mapping.titleFieldId);
38
+ const titleValue = read(row, mapping.titleFieldId);
39
+ const title = titleField?.internal || titleField?.canRead?.({ row, field: titleField }) === false ? "無權限" : titleField ? formatReadableValue(titleValue, { ...titleField, internal: false }, row) || "未命名" : "未命名";
40
+ if (type === "gantt") {
41
+ const m = mapping;
42
+ const startValue = read(row, m.startFieldId);
43
+ const endValue = read(row, m.endFieldId);
44
+ const start = dateDay(startValue);
45
+ const end = dateDay(endValue);
46
+ const empty = (v) => v == null || v === "";
47
+ if ((!empty(startValue) && start === null) || (!empty(endValue) && end === null) || (start !== null && end !== null && end < start)) {
48
+ invalid.push(row);
49
+ continue;
50
+ }
51
+ if (start === null || end === null) {
52
+ unscheduled.push(row);
53
+ continue;
54
+ }
55
+ const field = definitions.get(m.groupFieldId ?? "");
56
+ const value = read(row, m.groupFieldId);
57
+ const group = field ? field.canRead?.({ row, field }) === false ? "無權限" : getFieldTypeDefinition(field.type).group(value, field).label : undefined;
58
+ const progressValue = read(row, m.progressFieldId);
59
+ const progress = progressValue == null || progressValue === "" || !Number.isFinite(Number(progressValue)) ? undefined : Math.max(0, Math.min(1, Number(progressValue)));
60
+ const colorField = definitions.get(m.colorFieldId ?? "");
61
+ const colorValue = read(row, m.colorFieldId);
62
+ const candidateColor = m.colorMode === "field" ? colorValue == null ? undefined : colorField?.options?.find((o) => o.value === String(colorValue))?.color : m.color;
63
+ const color = candidateColor && /^#[0-9a-f]{6}$/i.test(candidateColor) ? candidateColor : "#316bff";
64
+ items.push({ row, id: getRowId(row), title, start, end, time: "", group, progress, color });
65
+ }
66
+ else {
67
+ const m = mapping;
68
+ const dateValue = read(row, m.dateFieldId);
69
+ const day = dateDay(dateValue);
70
+ if (dateValue == null || dateValue === "") {
71
+ unscheduled.push(row);
72
+ continue;
73
+ }
74
+ const startValue = read(row, m.startTimeFieldId);
75
+ const endValue = read(row, m.endTimeFieldId);
76
+ const hasStart = startValue != null && startValue !== "";
77
+ const hasEnd = endValue != null && endValue !== "";
78
+ // Optional time fields are complete dateTime values. Date field remains the anchor.
79
+ const startTime = hasStart && typeof startValue === "string" ? startValue.slice(11, 16) : "";
80
+ const endTime = hasEnd && typeof endValue === "string" ? endValue.slice(11, 16) : "";
81
+ const end = hasEnd ? dateDay(endValue) : day;
82
+ if (day === null || end === null || end < day ||
83
+ (hasStart && (dateDay(startValue) !== day || !/^([01]\d|2[0-3]):[0-5]\d$/.test(startTime))) ||
84
+ (hasEnd && !/^([01]\d|2[0-3]):[0-5]\d$/.test(endTime)) ||
85
+ (end === day && startTime && endTime && endTime < startTime)) {
86
+ invalid.push(row);
87
+ continue;
88
+ }
89
+ const colorField = definitions.get(m.colorFieldId ?? "");
90
+ const colorValue = read(row, m.colorFieldId);
91
+ const color = colorValue == null ? undefined : colorField?.options?.find((o) => o.value === String(colorValue))?.color;
92
+ items.push({ row, id: getRowId(row), title, start: day, end, time: startTime ? `${startTime}${endTime ? `–${endTime}` : ""}` : "全天", color: color && /^#[0-9a-f]{6}$/i.test(color) ? color : undefined });
93
+ }
94
+ }
95
+ return { items, unscheduled, invalid };
96
+ }
97
+ //# sourceMappingURL=schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"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"}