@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
package/README.md CHANGED
@@ -1,11 +1,79 @@
1
1
  # @keenaioc/data-view
2
2
 
3
- HomeYa 共用資料視圖的跨 Sites 引用驗證套件。
3
+ HomeYa 共用資料視圖引擎。以 既有工作台的既有表格成果為主要來源,集中管理欄位型別、表格操作、個人檢視與通用資料/權限介面。
4
4
 
5
- 目前的 `0.0.0-poc.*` 版本只驗證公開 npm 安裝、React/CSS 入口、固定版本升級與回退。它不是正式 V1,也不包含業務資料、資料庫連線或 HomeYa 專案設定。
5
+ 套件不包含資料庫、業務流程、報價公式、使用者帳號或專案資料。接入專案透過 `DataView` 的 callbacks 處理讀取、寫入、附件、權限與稽核。
6
6
 
7
- 正式版本將以 HomeYa 設計待辦工作台的既有表格成果為主要來源,抽出欄位註冊、表格操作、檢視設定與通用資料/權限介面。
7
+ 本文件版本:**`0.2.0-alpha.11`(公開 Alpha 測試版)**。新增欄位表頭操作選單與分組自訂順序;保留電腦/手機各自設定及既有欄位移動。程式、型別、建置及打包檢查已通過;修正後瀏覽器操作驗收尚未完成,接入時須重測。
8
8
 
9
- ```bash
10
- npm install --save-exact @keenaioc/data-view@0.0.0-poc.1
9
+ 既有基底:整合 T01~T19:工作台密度與 renderer、權限及狀態分離、資料列拖曳、並行寫入、手機獨立版面、排程空值、無分頁與遠端查詢契約。原先規劃的 alpha.6/alpha.7 合併為本版;alpha.6 未另行發布。
10
+
11
+ 本版保留 Alpha 限制:自動測試與建置通過,完整桌機/手機操作驗收尚未完成。先在測試專案接入,再決定是否升級正式系統。
12
+
13
+ ```sh
14
+ npm install --save-exact @keenaioc/data-view@0.2.0-alpha.11
11
15
  ```
16
+
17
+ 必須固定精確版本;不要使用無版本安裝、`latest`、`next` 或範圍版本。
18
+
19
+ 公開範圍及所有接入專案的資料隔離規則見 [資料保護說明](./DATA-PRIVACY.md)。
20
+
21
+ 詳見 [接入說明](./INTEGRATION.md)、[已知限制](./KNOWN-LIMITATIONS.md) 與 [更新紀錄](./CHANGELOG.md)。
22
+
23
+ 需要 React >=18.2 且 <20;已實測 React 19.2.6。套件是 ESM,並包含 TypeScript 定義;必須引用 CSS。Next.js/Sites 請在 client component 使用 DataView。
24
+
25
+ 以下是可直接使用的唯讀接入;加入寫入 callback 後才開放編輯。
26
+
27
+ ```tsx
28
+ "use client";
29
+ import { DataView, DATA_VIEW_VERSION, type FieldDefinition } from "@keenaioc/data-view";
30
+ import "@keenaioc/data-view/style.css";
31
+
32
+ type Project = { id: string; name: string; hidden: boolean };
33
+ const fields: FieldDefinition<Project>[] = [
34
+ { id: "name", label: "案件", type: "singleLineText", pinned: "left" },
35
+ { id: "hidden", label: "完成隱藏", type: "checkbox" },
36
+ ];
37
+
38
+ export function ProjectView({ rows }: { rows: Project[] }) {
39
+ return <>
40
+ <small>HomeYa 共用資料視圖 {DATA_VIEW_VERSION}</small>
41
+ <DataView fields={fields} rows={rows} getRowId={(row) => row.id}
42
+ initialView={{ filters: { conjunction: "and", rules: [
43
+ { id: "open-only", fieldId: "hidden", operator: "isFalse" },
44
+ ] } }} />
45
+ </>;
46
+ }
47
+ ```
48
+
49
+ 完成隱藏只是一般 checkbox 欄位;是否隱藏由檢視篩選決定,不刪除資料。新增欄位需要同時提供 `onFieldChange` 與 `permissions.canManageFields: true`。寫入後由 host 更新 `rows`/`fields`,否則畫面不會保存新值。
50
+
51
+ ## V2 相容擴充
52
+
53
+ `DataViewConfig.schemaVersion` 維持 `1`。`viewType` 可選 `table`/`gantt`/`calendar`;三者共用同一份 `rows`、`fields`、篩選、排序、分組、收合與權限。多數新介面為選填;分頁移除、人員/關聯篩選與分組改用 ID、排程日期分類為行為變更,必須先依接入說明檢查相容性。
54
+
55
+ - `gantt`:指定 `titleFieldId`、`startFieldId`、`endFieldId`,選填 `groupFieldId`、`progressFieldId`。分組同步共用第一層,進度為 0–1。
56
+ - `calendar`:指定 `titleFieldId`、`dateFieldId`;選填 `startTimeFieldId`、`endTimeFieldId`(完整日期時間)、`colorFieldId`(選項顏色)。排程以傳入 ISO 日期呈現,adapter 統一時區。
57
+ - `onBatchCommit`:整批 `CellCommit[]`,用於編輯、批次、貼上、清空、復原與重做。專案必須重新驗證身分、schema、權限、前值/revision,以 transaction 保證全成功或全失敗,並用 request id 防止重複寫入。不能逐格寫入後假裝整批成功。
58
+ - `onFieldChange`:新增、複製、重新命名、刪除欄位的意圖。需 `canManageFields: true`;專案自行管理持久化/軟刪/稽核,再更新 `fields`。系統欄位不能由使用者建立或變更。
59
+ - `density`:workbench/compact/standard/comfortable;`virtualize`:桌機資料列與手機表格卡片虛擬化;`colorRules`:個人條件式整列/儲存格填色,不寫入資料。
60
+
61
+ 沒有 `onBatchCommit` 的接入專案保留 V1 單格回呼,不啟用批次或歷史。復原/重做只限目前掛載最近 20 次成功資料操作,最多 1,000 格/次,遇衝突拒絕覆寫;不包含附件、欄位結構或外部副作用。
62
+
63
+ 每個 Sites 固定精確版本及 lockfile,按 Lab → 一個試點 → 其他專案逐一升級。保留 dependency、ViewConfig 與 schema 快照供回退;回退套件不會自動回復資料修改。不要引用 `latest`、`next` 或範圍版本作自動更新。
64
+
65
+ ## 共用修改規則
66
+
67
+ 本專案使用 HomeYa 共用資料視圖。遇到表格修改需求時,先判斷是「專案設定」或「共用能力」。專案設定可在本專案修改;共用能力與共用錯誤不得在本專案另行實作,必須整理成共用表格修改單,交由 HomeYa 共用資料視圖專案修改及發布新版本。本專案只在確認相容後升級版本。
68
+
69
+ ## 命名視圖(alpha.5)
70
+
71
+ 需要多個命名視圖時用 `DataViewWorkspace`,單一視圖原有 `DataView` API 保留。`initialViews` 只在掛載時讀取,必須先載入個人設定再掛載;切換使用者或資料集時由 host 改 `key`。所有視圖共用同一組 `rows`、`fields` 與資料寫入 callbacks。完整範例及回退方法見 [接入說明](./INTEGRATION.md)。
72
+
73
+ 不要求第一欄為特殊主欄位,不新增公式引擎。一般欄位仍可依既有規則固定、拖曳或隱藏。
74
+
75
+ alpha.10 同時提供附件迴紋針入口與預設單一關聯的直接選單;選項、永久 ID 與保存由 host adapter 提供,詳見 INTEGRATION.md。
76
+
77
+ alpha.11 加入依視圖保存的分組順序:拖曳、逐格或頂底移動、還原預設;空白分組也可移動。詳見 INTEGRATION.md。
78
+
79
+ alpha.11 的表頭懸浮選單可直接重新命名、複製、隱藏、固定、排序、篩選、分組與確認刪除。結構修改需要 host 的 `onFieldChange` 與管理權限;可用 `features.columnMenu: false` 關閉入口。
@@ -0,0 +1,47 @@
1
+ import type { DataViewConfig, DataViewFeatures, DataViewPermissions, FieldChange, FieldDefinition, FilterGroup, FilterRule } from "./types.js";
2
+ export type FieldAction = "rename" | "copy" | "delete";
3
+ export type HeaderAction = FieldAction | "hide" | "pin-left" | "pin-right" | "unpin" | "sort-asc" | "sort-desc" | "clear-sort" | "group" | "filter" | "columns";
4
+ export type HeaderItem = {
5
+ action: HeaderAction;
6
+ label: string;
7
+ icon: string;
8
+ disabled?: boolean;
9
+ reason?: string;
10
+ danger?: boolean;
11
+ separator?: boolean;
12
+ };
13
+ export declare function copyFieldChange<Row>(source: FieldDefinition<Row>, label?: string): FieldChange<Row> & {
14
+ action: "copy";
15
+ };
16
+ export declare function headerItems<Row>({ field, fields, view, permissions, features, hasFieldCallback, busy }: {
17
+ field: FieldDefinition<Row>;
18
+ fields: FieldDefinition<Row>[];
19
+ view: DataViewConfig;
20
+ permissions?: DataViewPermissions<Row>;
21
+ features?: DataViewFeatures;
22
+ hasFieldCallback: boolean;
23
+ busy: boolean;
24
+ }): HeaderItem[];
25
+ export declare function changeHeaderView(view: DataViewConfig, fieldId: string, action: HeaderAction): DataViewConfig;
26
+ export declare function FieldActionForm<Row>({ action, field, fields, permissions, busy, onApply, onCancel }: {
27
+ action: FieldAction;
28
+ field: FieldDefinition<Row>;
29
+ fields: FieldDefinition<Row>[];
30
+ permissions?: DataViewPermissions<Row>;
31
+ busy: boolean;
32
+ onApply: (change: FieldChange<Row>) => Promise<boolean>;
33
+ onCancel: () => void;
34
+ }): import("react/jsx-runtime").JSX.Element;
35
+ export declare function FilterValueInput<Row>({ field, rule, onChange }: {
36
+ field: FieldDefinition<Row>;
37
+ rule: FilterRule;
38
+ onChange: (value: unknown) => void;
39
+ }): import("react/jsx-runtime").JSX.Element;
40
+ export declare function ColumnFilterForm<Row>({ field, filters, disabled, onApply, onCancel }: {
41
+ field: FieldDefinition<Row>;
42
+ filters: FilterGroup;
43
+ disabled?: boolean;
44
+ onApply: (rule: FilterRule) => void;
45
+ onCancel: () => void;
46
+ }): import("react/jsx-runtime").JSX.Element;
47
+ //# sourceMappingURL=column-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-actions.d.ts","sourceRoot":"","sources":["../src/column-actions.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useRef, useState } from "react";
3
+ import { getFieldTypeDefinition, FILTER_OPERATOR_LABELS } from "./registry.js";
4
+ import { newOperationId, validateFieldChange } from "./operations.js";
5
+ export function copyFieldChange(source, label = `${source.label}(副本)`) {
6
+ const { getValue: _getValue, ...definition } = source;
7
+ return { action: "copy", sourceFieldId: source.id, field: { ...definition, id: `field_${newOperationId()}`, label, pinned: null, required: false, options: source.options?.map((option) => ({ ...option })) } };
8
+ }
9
+ export function headerItems({ field, fields, view, permissions, features = {}, hasFieldCallback, busy }) {
10
+ const configurable = permissions?.canConfigureView !== false;
11
+ const column = view.columns.find((item) => item.fieldId === field.id);
12
+ const visibleCount = view.columns.filter((item) => item.visible && fields.some((f) => f.id === item.fieldId && !f.internal)).length;
13
+ const structural = (action) => !hasFieldCallback ? "此專案未開放欄位結構修改" : validateFieldChange(fields, action === "copy" ? copyFieldChange(field) : action === "rename" ? { action, fieldId: field.id, label: field.label } : { action, fieldId: field.id }, permissions) ?? undefined;
14
+ const items = [
15
+ { action: "rename", label: "重新命名欄位…", icon: "✎", reason: structural("rename") },
16
+ { action: "copy", label: "複製欄位與值…", icon: "⧉", reason: structural("copy") },
17
+ { action: "hide", label: "隱藏欄位", icon: "−", reason: !configurable || features.columns === false ? "沒有調整欄位顯示的權限" : visibleCount <= 1 ? "至少保留一個顯示欄位" : undefined },
18
+ { action: "pin-left", label: "固定在左側", icon: "⇤", separator: true, reason: !configurable || features.columns === false ? "沒有調整欄位位置的權限" : column?.pinned === "left" ? "已固定在左側" : undefined },
19
+ { action: "pin-right", label: "固定在右側", icon: "⇥", reason: !configurable || features.columns === false ? "沒有調整欄位位置的權限" : column?.pinned === "right" ? "已固定在右側" : undefined },
20
+ { action: "unpin", label: "取消固定", icon: "↔", reason: !configurable || features.columns === false ? "沒有調整欄位位置的權限" : !column?.pinned ? "此欄位未固定" : undefined },
21
+ { action: "sort-asc", label: "依此欄升冪排序", icon: "↑", separator: true, reason: !(permissions?.canSort ?? configurable) || features.sort === false ? "未開放排序" : undefined },
22
+ { action: "sort-desc", label: "依此欄降冪排序", icon: "↓", reason: !(permissions?.canSort ?? configurable) || features.sort === false ? "未開放排序" : undefined },
23
+ { action: "clear-sort", label: "取消此欄排序", icon: "↕", reason: !(permissions?.canSort ?? configurable) || features.sort === false ? "未開放排序" : !view.sorts.some((item) => item.fieldId === field.id) ? "此欄位未設定排序" : undefined },
24
+ { action: "filter", label: "篩選此欄…", icon: "▽", reason: !(permissions?.canFilter ?? configurable) || features.filter === false ? "未開放篩選" : view.filters.rules.length >= 20 && !view.filters.rules.some((rule) => rule.fieldId === field.id) ? "最多二十個篩選條件" : undefined },
25
+ { action: "group", label: view.groups.some((item) => item.fieldId === field.id) ? "調整此欄分組…" : "依此欄分組", icon: "▤", reason: !configurable || features.group === false ? "未開放分組" : view.groups.length >= 3 && !view.groups.some((item) => item.fieldId === field.id) ? "最多三層分組" : undefined },
26
+ { action: "columns", label: "電腦表格欄位…", icon: "▥", separator: true, reason: !configurable || features.columns === false ? "未開放欄位設定" : undefined },
27
+ { action: "delete", label: "刪除欄位…", icon: "×", danger: true, reason: structural("delete") },
28
+ ];
29
+ return items.map((item) => ({ ...item, disabled: busy || !!item.reason, reason: busy ? "正在儲存,請稍候" : item.reason }));
30
+ }
31
+ export function changeHeaderView(view, fieldId, action) {
32
+ if (!view.columns.some((column) => column.fieldId === fieldId))
33
+ return view;
34
+ if (action === "hide") {
35
+ if (view.columns.filter((column) => column.visible).length <= 1)
36
+ return view;
37
+ return { ...view, columns: view.columns.map((column) => column.fieldId === fieldId ? { ...column, visible: false } : column) };
38
+ }
39
+ if (action === "pin-left" || action === "pin-right" || action === "unpin")
40
+ return { ...view, columns: view.columns.map((column) => column.fieldId === fieldId ? { ...column, pinned: action === "pin-left" ? "left" : action === "pin-right" ? "right" : null } : column) };
41
+ if (action === "sort-asc" || action === "sort-desc")
42
+ return { ...view, sorts: [{ fieldId, direction: action === "sort-asc" ? "asc" : "desc" }, ...view.sorts.filter((rule) => rule.fieldId !== fieldId)] };
43
+ if (action === "clear-sort")
44
+ return { ...view, sorts: view.sorts.filter((rule) => rule.fieldId !== fieldId) };
45
+ if (action === "group" && view.groups.length < 3 && !view.groups.some((rule) => rule.fieldId === fieldId))
46
+ return { ...view, groups: [...view.groups, { fieldId }] };
47
+ return view;
48
+ }
49
+ export function FieldActionForm({ action, field, fields, permissions, busy, onApply, onCancel }) {
50
+ const [label, setLabel] = useState(action === "copy" ? `${field.label}(副本)` : field.label);
51
+ const [message, setMessage] = useState("");
52
+ const submitting = useRef(false);
53
+ async function submit() {
54
+ if (busy || submitting.current)
55
+ return;
56
+ const change = action === "copy" ? copyFieldChange(field, label.trim()) : action === "rename" ? { action, fieldId: field.id, label: label.trim() } : { action, fieldId: field.id };
57
+ const error = validateFieldChange(fields, change, permissions);
58
+ if (error) {
59
+ setMessage(error);
60
+ return;
61
+ }
62
+ submitting.current = true;
63
+ try {
64
+ if (await onApply(change))
65
+ onCancel();
66
+ else
67
+ setMessage("未完成,請查看儲存提示後重試。");
68
+ }
69
+ finally {
70
+ submitting.current = false;
71
+ }
72
+ }
73
+ return _jsxs("form", { className: "hy-dv-form", onSubmit: (event) => { event.preventDefault(); void submit(); }, children: [_jsxs("fieldset", { disabled: busy || permissions?.canManageFields !== true, children: [_jsx("legend", { children: field.label }), action === "delete" ? _jsxs("p", { children: ["\u78BA\u8A8D\u522A\u9664\u300C", field.label, "\u300D\uFF1F\u5F15\u7528\u5B83\u7684\u7BE9\u9078\u3001\u6392\u5E8F\u3001\u586B\u8272\u8207\u8996\u5716\u6620\u5C04\u5C07\u88AB\u6E05\u9664\u3002\u8CC7\u6599\u4FDD\u7559\u65B9\u5F0F\u7531\u5C08\u6848\u6C7A\u5B9A\uFF0C\u6B64\u64CD\u4F5C\u4E0D\u5728\u8CC7\u6599\u5FA9\u539F\u7BC4\u570D\u5167\u3002"] }) : _jsxs("label", { children: [action === "copy" ? "新欄位名稱" : "欄位名稱", _jsx("input", { autoFocus: true, required: true, maxLength: 80, value: label, onChange: (event) => setLabel(event.target.value) })] }), action === "copy" && _jsx("p", { children: "\u5C07\u5EFA\u7ACB\u65B0\u6B04\u4F4D\uFF0C\u4E26\u8907\u88FD\u539F\u6B04\u4F4D\u7684\u8CC7\u6599\u503C\u3002" }), _jsxs("div", { className: "hy-dv-actions", children: [_jsx("button", { type: "button", autoFocus: action === "delete", onClick: onCancel, children: "\u53D6\u6D88" }), _jsx("button", { type: "submit", className: action === "delete" ? "hy-dv-danger" : "hy-dv-primary", disabled: action !== "delete" && (!label.trim() || action === "rename" && label.trim() === field.label), children: action === "delete" ? "確認刪除欄位" : action === "copy" ? "確認複製" : "儲存名稱" })] })] }), message && _jsx("p", { role: "alert", children: message })] });
74
+ }
75
+ export function FilterValueInput({ field, rule, onChange }) {
76
+ if (["isEmpty", "isNotEmpty", "isTrue", "isFalse"].includes(rule.operator))
77
+ return _jsx("span", { className: "hy-dv-no-value", children: "\u4E0D\u9700\u586B\u503C" });
78
+ if (field.options?.length)
79
+ return _jsxs("select", { value: String(rule.value ?? ""), onChange: (event) => onChange(event.target.value), children: [_jsx("option", { value: "", children: "\u8ACB\u9078\u64C7" }), field.options.map((option) => _jsx("option", { value: option.value, children: option.label }, option.value))] });
80
+ if (["number", "currency", "percentage", "autoNumber"].includes(field.type))
81
+ return _jsx("input", { type: "number", value: String(rule.value ?? ""), onChange: (event) => onChange(event.target.value === "" ? undefined : Number(event.target.value)) });
82
+ if (["date", "dateTime", "createdAt", "updatedAt"].includes(field.type))
83
+ return _jsx("input", { type: "date", value: String(rule.value ?? "").slice(0, 10), onChange: (event) => onChange(event.target.value) });
84
+ return _jsx("input", { value: String(rule.value ?? ""), onChange: (event) => onChange(event.target.value), placeholder: "\u8F38\u5165\u689D\u4EF6" });
85
+ }
86
+ export function ColumnFilterForm({ field, filters, disabled = false, onApply, onCancel }) {
87
+ const operators = getFieldTypeDefinition(field.type).operators;
88
+ const [rule, setRule] = useState(() => filters.rules.find((item) => item.fieldId === field.id) ?? { id: newOperationId(), fieldId: field.id, operator: operators[0] });
89
+ return _jsx("form", { className: "hy-dv-form", onSubmit: (event) => { event.preventDefault(); if (!disabled)
90
+ onApply(rule); }, children: _jsxs("fieldset", { disabled: disabled, children: [_jsx("legend", { children: field.label }), _jsxs("label", { children: ["\u689D\u4EF6", _jsx("select", { autoFocus: true, value: rule.operator, onChange: (event) => setRule({ ...rule, operator: event.target.value, value: undefined }), children: operators.map((operator) => _jsx("option", { value: operator, children: FILTER_OPERATOR_LABELS[operator] }, operator)) })] }), _jsxs("label", { children: ["\u689D\u4EF6\u503C", _jsx(FilterValueInput, { field: field, rule: rule, onChange: (value) => setRule({ ...rule, value }) })] }), _jsxs("div", { className: "hy-dv-actions", children: [_jsx("button", { type: "button", onClick: onCancel, children: "\u53D6\u6D88" }), _jsx("button", { type: "submit", children: "\u5957\u7528\u7BE9\u9078" })] })] }) });
91
+ }
92
+ //# sourceMappingURL=column-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-actions.js","sourceRoot":"","sources":["../src/column-actions.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { HeaderAction, HeaderItem } from "./column-actions.js";
2
+ export declare function columnMenuPosition(anchor: {
3
+ left: number;
4
+ right: number;
5
+ top: number;
6
+ bottom: number;
7
+ }, menu: {
8
+ width: number;
9
+ height: number;
10
+ }, viewport: {
11
+ width: number;
12
+ height: number;
13
+ }): {
14
+ left: number;
15
+ top: number;
16
+ };
17
+ export declare function ColumnMenu({ id, label, anchor, items, onChoose, onClose }: {
18
+ id: string;
19
+ label: string;
20
+ anchor: HTMLButtonElement;
21
+ items: HeaderItem[];
22
+ onChoose: (action: HeaderAction) => void;
23
+ onClose: () => void;
24
+ }): import("react/jsx-runtime").JSX.Element;
25
+ //# sourceMappingURL=column-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-menu.d.ts","sourceRoot":"","sources":["../src/column-menu.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;;;EAE5L;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,2CAkCvN"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { DataViewDialog } from "./v2-panels.js";
4
+ export function columnMenuPosition(anchor, menu, viewport) {
5
+ return { left: Math.max(8, Math.min(anchor.right - menu.width, viewport.width - menu.width - 8)), top: Math.max(8, Math.min(anchor.bottom + 4 + menu.height <= viewport.height - 8 ? anchor.bottom + 4 : anchor.top - menu.height - 4, viewport.height - menu.height - 8)) };
6
+ }
7
+ export function ColumnMenu({ id, label, anchor, items, onChoose, onClose }) {
8
+ const ref = useRef(null);
9
+ const close = useRef(onClose);
10
+ close.current = onClose;
11
+ const [fallback, setFallback] = useState(false);
12
+ useEffect(() => {
13
+ const menu = ref.current;
14
+ if (!menu)
15
+ return;
16
+ if (typeof menu.showPopover !== "function") {
17
+ setFallback(true);
18
+ return;
19
+ }
20
+ const dismiss = (event) => { if (event.newState === "closed")
21
+ close.current(); };
22
+ const moved = (event) => { if (!(event.target instanceof Node) || !menu.contains(event.target))
23
+ close.current(); };
24
+ menu.addEventListener("toggle", dismiss);
25
+ menu.showPopover();
26
+ const position = columnMenuPosition(anchor.getBoundingClientRect(), menu.getBoundingClientRect(), { width: window.innerWidth, height: window.innerHeight });
27
+ menu.style.left = `${position.left}px`;
28
+ menu.style.top = `${position.top}px`;
29
+ (menu.querySelector("button:not(:disabled)") ?? menu).focus();
30
+ window.addEventListener("scroll", moved, true);
31
+ window.addEventListener("resize", moved);
32
+ return () => { menu.removeEventListener("toggle", dismiss); window.removeEventListener("scroll", moved, true); window.removeEventListener("resize", moved); if (menu.matches(":popover-open"))
33
+ menu.hidePopover(); };
34
+ }, [anchor]);
35
+ function keyDown(event) {
36
+ const menu = event.currentTarget;
37
+ if (event.key === "Tab" && !fallback) {
38
+ anchor.focus();
39
+ onClose();
40
+ return;
41
+ }
42
+ if (event.key === "Escape") {
43
+ event.preventDefault();
44
+ event.stopPropagation();
45
+ anchor.focus();
46
+ onClose();
47
+ return;
48
+ }
49
+ const buttons = [...menu.querySelectorAll("button:not(:disabled)")];
50
+ if (!buttons.length || !["ArrowDown", "ArrowUp", "Home", "End"].includes(event.key))
51
+ return;
52
+ event.preventDefault();
53
+ event.stopPropagation();
54
+ const index = buttons.indexOf(document.activeElement);
55
+ const target = event.key === "Home" ? 0 : event.key === "End" ? buttons.length - 1 : (index + (event.key === "ArrowDown" ? 1 : -1) + buttons.length) % buttons.length;
56
+ buttons[target].focus();
57
+ }
58
+ const body = _jsx("div", { id: fallback ? id : undefined, role: fallback ? "menu" : undefined, "aria-label": fallback ? `${label}欄位操作` : undefined, onKeyDown: keyDown, children: items.map((item) => _jsxs("button", { type: "button", role: "menuitem", tabIndex: fallback ? 0 : -1, disabled: item.disabled, title: item.reason, className: `${item.danger ? "hy-dv-danger" : ""} ${item.separator ? "has-separator" : ""}`, onClick: () => { anchor.focus(); onChoose(item.action); }, children: [_jsx("span", { "aria-hidden": "true", children: item.icon }), _jsx("span", { children: item.label })] }, item.action)) });
59
+ if (fallback)
60
+ return _jsx(DataViewDialog, { title: `${label}欄位操作`, onClose: () => { anchor.focus(); onClose(); }, children: _jsx("div", { className: "hy-dv-header-menu-fallback", children: body }) });
61
+ return _jsx("div", { id: id, ref: ref, popover: "auto", role: "menu", tabIndex: -1, "aria-label": `${label}欄位操作`, className: "hy-dv-header-menu", onBlur: (event) => { if (event.relatedTarget instanceof Node && event.relatedTarget !== anchor && !event.currentTarget.contains(event.relatedTarget))
62
+ onClose(); }, children: body });
63
+ }
64
+ //# sourceMappingURL=column-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-menu.js","sourceRoot":"","sources":["../src/column-menu.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAsB,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,UAAU,kBAAkB,CAAC,MAAoE,EAAE,IAAuC,EAAE,QAA2C;IAC3L,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/Q,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAgJ;IACtN,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IACvD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE,GAAG,IAAK,KAAqB,CAAC,QAAQ,KAAK,QAAQ;YAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACzG,MAAM,KAAK,GAAG,CAAC,KAAY,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1H,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,qBAAqB,EAAE,EAAE,IAAI,CAAC,qBAAqB,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5J,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,IAAI,CAAC;QAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC;QAC7E,CAAC,IAAI,CAAC,aAAa,CAAoB,uBAAuB,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACjF,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACzF,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;YAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACvN,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACb,SAAS,OAAO,CAAC,KAAoC;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC;QACjC,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAC5E,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QACnH,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAoB,uBAAuB,CAAC,CAAC,CAAC;QACvF,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO;QAC5F,KAAK,CAAC,cAAc,EAAE,CAAC;QAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAkC,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QACtK,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,GAAG,cAAK,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,gBAAc,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,YACxJ,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAA0B,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAC,UAAU,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAE,8BAAkB,MAAM,YAAE,IAAI,CAAC,IAAI,GAAQ,EAAA,yBAAO,IAAI,CAAC,KAAK,GAAQ,KAAhV,IAAI,CAAC,MAAM,CAA8U,CAAC,GACxX,CAAC;IACP,IAAI,QAAQ;QAAE,OAAO,KAAC,cAAc,IAAC,KAAK,EAAE,GAAG,KAAK,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,YAAE,cAAK,SAAS,EAAC,4BAA4B,YAAE,IAAI,GAAO,GAAiB,CAAC;IACrL,OAAO,cAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,CAAC,gBAAc,GAAG,KAAK,MAAM,EAAE,SAAS,EAAC,mBAAmB,EAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,KAAK,CAAC,aAAa,YAAY,IAAI,IAAI,KAAK,CAAC,aAAa,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;YAAE,OAAO,EAAE,CAAC,CAAC,CAAC,YAAG,IAAI,GAAO,CAAC;AACpT,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { DataViewConfig, DataViewMetrics, DataViewQuery, FieldDefinition, ViewRuntimeState } from "./types.js";
2
+ export declare const WORKBENCH_METRICS: DataViewMetrics;
3
+ export declare function resolveMetrics(density: DataViewConfig["density"], input?: Partial<DataViewMetrics>): DataViewMetrics;
4
+ export declare function splitViewState(view: DataViewConfig): {
5
+ layout: DataViewConfig;
6
+ runtime: ViewRuntimeState;
7
+ };
8
+ export declare function mergeViewState(layout: DataViewConfig, runtime?: ViewRuntimeState): DataViewConfig;
9
+ export declare function createDataViewQuery(view: DataViewConfig): DataViewQuery;
10
+ /** JSON-safe canonical key: callers must reset remote rows whenever this changes. */
11
+ export declare function dataViewQueryKey(query: DataViewQuery): string;
12
+ /** Diagnostics do not silently rewrite or infer business field mappings. */
13
+ export declare function inspectViewMigration<Row>(fields: FieldDefinition<Row>[], view: Partial<DataViewConfig>): {
14
+ code: string;
15
+ fieldId?: string;
16
+ message: string;
17
+ }[];
18
+ /** Locks intersecting rows; independent rows run concurrently. '*' is a schema barrier. */
19
+ export declare function createWriteQueue(): {
20
+ readonly pending: number;
21
+ dispose(): void;
22
+ run<T>(resources: string[], action: () => Promise<T> | T): Promise<T>;
23
+ };
24
+ /** Prefix offsets support independently sized group rows without virtual scroll drift. */
25
+ export declare function virtualWindow(heights: number[], top: number, viewport: number, overscan?: number): {
26
+ offsets: number[];
27
+ start: number;
28
+ end: number;
29
+ before: number;
30
+ after: number;
31
+ total: number;
32
+ };
33
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpH,eAAO,MAAM,iBAAiB,EAAE,eAK/B,CAAC;AACF,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAQpH;AACD,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,CAG1G;AACD,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,cAAc,CAEjG;AACD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,aAAa,CAGvE;AACD,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,UAAmC;AAExF,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC;UAEpE,MAAM;cAAY,MAAM;aAAW,MAAM;IAO3E;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB;;;QAOxB,CAAC,aAAa,MAAM,EAAE,UAAU,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;EAUxE;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAI;;;;;;;EAM3F"}
@@ -0,0 +1,84 @@
1
+ export const WORKBENCH_METRICS = {
2
+ rowHeight: 32, headerHeight: 32, groupHeight: 28, groupGap: 8, nestedGroupGap: 4,
3
+ cellFontSize: 13, cellLineHeight: 16, headerFontSize: 12, cellPadding: 6,
4
+ headerPaddingLeft: 6, headerPaddingRight: 12, controlHeight: 28, actionHeight: 24,
5
+ badgeHeight: 20, badgeFontSize: 11, badgePadding: 8, scrollbarHeight: 16, scrollbarThumb: 12,
6
+ };
7
+ export function resolveMetrics(density, input) {
8
+ const base = density === "workbench" ? WORKBENCH_METRICS : { ...WORKBENCH_METRICS, rowHeight: density === "compact" ? 36 : density === "comfortable" ? 72 : 52, headerHeight: 36, cellFontSize: 14, headerFontSize: 13, badgeFontSize: 12 };
9
+ const out = { ...base };
10
+ for (const key of Object.keys(base)) {
11
+ const value = input?.[key];
12
+ if (typeof value === "number" && Number.isFinite(value) && value >= (key.endsWith("Gap") ? 0 : 1) && value <= 500)
13
+ out[key] = value;
14
+ }
15
+ return out;
16
+ }
17
+ export function splitViewState(view) {
18
+ const { location, collapsedGroups, ...layout } = view;
19
+ return { layout: { ...layout, collapsedGroups: [] }, runtime: { location, collapsedGroups } };
20
+ }
21
+ export function mergeViewState(layout, runtime) {
22
+ return { ...layout, ...runtime, location: { ...layout.location, ...runtime?.location } };
23
+ }
24
+ export function createDataViewQuery(view) {
25
+ // Group display order is a local layout preference, not a remote data query change.
26
+ return { version: 1, search: view.location?.search ?? "", filters: view.filters, sorts: view.sorts, groups: view.groups.map(({ fieldId }) => ({ fieldId })) };
27
+ }
28
+ /** JSON-safe canonical key: callers must reset remote rows whenever this changes. */
29
+ export function dataViewQueryKey(query) { return JSON.stringify(query); }
30
+ /** Diagnostics do not silently rewrite or infer business field mappings. */
31
+ export function inspectViewMigration(fields, view) {
32
+ const ids = new Set(fields.map((f) => f.id));
33
+ const diagnostics = [];
34
+ for (const id of new Set([...(view.columns ?? []).map((c) => c.fieldId), ...(view.sorts ?? []).map((s) => s.fieldId), ...(view.groups ?? []).map((g) => g.fieldId), ...(view.filters?.rules ?? []).map((r) => r.fieldId)])) {
35
+ if (!ids.has(id))
36
+ diagnostics.push({ code: "unknown-field", fieldId: id, message: "欄位不存在,請由專案提供舊 ID 映射後再正規化" });
37
+ }
38
+ if (view.pageSize !== undefined || (view.location?.page ?? 1) > 1)
39
+ diagnostics.push({ code: "pagination-removed", message: "分頁已移除;保留原始設定備份,使用連續捲動" });
40
+ if (view.collapsedGroups?.length && view.groups?.some((g) => fields.some((f) => f.id === g.fieldId && ["person", "relation", "multiSelect", "createdBy", "updatedBy"].includes(f.type))))
41
+ diagnostics.push({ code: "stable-group-keys", message: "人員/關聯/多選改用穩定 ID;舊收合鍵須由舊資料對照轉換,否則這些分組首次展開" });
42
+ return diagnostics;
43
+ }
44
+ /** Locks intersecting rows; independent rows run concurrently. '*' is a schema barrier. */
45
+ export function createWriteQueue() {
46
+ const tails = new Map();
47
+ const all = new Set();
48
+ let disposed = false;
49
+ return {
50
+ get pending() { return all.size; },
51
+ dispose() { disposed = true; },
52
+ run(resources, action) {
53
+ const keys = [...new Set(resources)];
54
+ const waiting = keys.includes("*") ? [...all] : [tails.get("*"), ...keys.map((key) => tails.get(key))].filter(Boolean);
55
+ const result = Promise.all(waiting.map((p) => p.catch(() => { }))).then(() => { if (disposed)
56
+ throw new Error("檢視身分已切換,尚未送出的操作已取消"); return action(); });
57
+ all.add(result);
58
+ for (const key of keys)
59
+ tails.set(key, result);
60
+ const clear = () => { all.delete(result); for (const key of keys)
61
+ if (tails.get(key) === result)
62
+ tails.delete(key); };
63
+ void result.then(clear, clear);
64
+ return result;
65
+ },
66
+ };
67
+ }
68
+ /** Prefix offsets support independently sized group rows without virtual scroll drift. */
69
+ export function virtualWindow(heights, top, viewport, overscan = 5) {
70
+ const offsets = [0];
71
+ for (const height of heights)
72
+ offsets.push(offsets.at(-1) + height);
73
+ const lower = (value) => { let lo = 0, hi = heights.length; while (lo < hi) {
74
+ const mid = (lo + hi) >>> 1;
75
+ if (offsets[mid + 1] <= value)
76
+ lo = mid + 1;
77
+ else
78
+ hi = mid;
79
+ } return lo; };
80
+ const start = Math.max(0, lower(Math.max(0, top)) - overscan);
81
+ const end = Math.min(heights.length, lower(Math.max(0, top) + Math.max(1, viewport)) + overscan + 1);
82
+ return { offsets, start, end, before: offsets[start], after: offsets.at(-1) - offsets[end], total: offsets.at(-1) };
83
+ }
84
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DataViewProps } from "./types.js";
2
+ export declare function DataView<Row>(props: DataViewProps<Row>): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=data-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-view.d.ts","sourceRoot":"","sources":["../src/data-view.tsx"],"names":[],"mappings":"AA8CA,OAAO,KAAK,EAIV,aAAa,EAWd,MAAM,YAAY,CAAC;AAQpB,wBAAgB,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,2CAEtD"}