@affino/datagrid-vue-app 0.1.1

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 (153) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1062 -0
  3. package/dist/DataGrid.d.ts +430 -0
  4. package/dist/DataGrid.js +565 -0
  5. package/dist/DataGridDefaultRenderer.d.ts +2 -0
  6. package/dist/DataGridDefaultRenderer.js +2 -0
  7. package/dist/DataGridModuleHost.d.ts +2 -0
  8. package/dist/DataGridModuleHost.js +2 -0
  9. package/dist/DataGridRuntimeHost.d.ts +1 -0
  10. package/dist/DataGridRuntimeHost.js +1 -0
  11. package/dist/config/dataGridAdvancedFilter.d.ts +9 -0
  12. package/dist/config/dataGridAdvancedFilter.js +21 -0
  13. package/dist/config/dataGridAggregations.d.ts +17 -0
  14. package/dist/config/dataGridAggregations.js +21 -0
  15. package/dist/config/dataGridColumnLayout.d.ts +9 -0
  16. package/dist/config/dataGridColumnLayout.js +21 -0
  17. package/dist/config/dataGridFormulaOptions.d.ts +25 -0
  18. package/dist/config/dataGridFormulaOptions.js +137 -0
  19. package/dist/config/dataGridPublicProps.d.ts +6 -0
  20. package/dist/config/dataGridPublicProps.js +58 -0
  21. package/dist/config/dataGridSavedView.d.ts +17 -0
  22. package/dist/config/dataGridSavedView.js +73 -0
  23. package/dist/config/dataGridVirtualization.d.ts +14 -0
  24. package/dist/config/dataGridVirtualization.js +32 -0
  25. package/dist/dataGridAdvancedFilter.d.ts +1 -0
  26. package/dist/dataGridAdvancedFilter.js +1 -0
  27. package/dist/dataGridAggregations.d.ts +1 -0
  28. package/dist/dataGridAggregations.js +1 -0
  29. package/dist/dataGridAppContext.d.ts +2 -0
  30. package/dist/dataGridAppContext.js +1 -0
  31. package/dist/dataGridCellComboboxState.d.ts +10 -0
  32. package/dist/dataGridCellComboboxState.js +67 -0
  33. package/dist/dataGridColumnLayout.d.ts +1 -0
  34. package/dist/dataGridColumnLayout.js +1 -0
  35. package/dist/dataGridColumnMenu.d.ts +9 -0
  36. package/dist/dataGridColumnMenu.js +21 -0
  37. package/dist/dataGridEditability.d.ts +9 -0
  38. package/dist/dataGridEditability.js +1 -0
  39. package/dist/dataGridFilterableCombobox.d.ts +1 -0
  40. package/dist/dataGridFilterableCombobox.js +1 -0
  41. package/dist/dataGridFormulaOptions.d.ts +1 -0
  42. package/dist/dataGridFormulaOptions.js +1 -0
  43. package/dist/dataGridGantt.d.ts +3 -0
  44. package/dist/dataGridGantt.js +1 -0
  45. package/dist/dataGridGanttDependencySelection.d.ts +7 -0
  46. package/dist/dataGridGanttDependencySelection.js +46 -0
  47. package/dist/dataGridGanttLabel.d.ts +2 -0
  48. package/dist/dataGridGanttLabel.js +30 -0
  49. package/dist/dataGridGanttSplit.d.ts +20 -0
  50. package/dist/dataGridGanttSplit.js +31 -0
  51. package/dist/dataGridGanttWheel.d.ts +10 -0
  52. package/dist/dataGridGanttWheel.js +30 -0
  53. package/dist/dataGridOverlayThemeVars.d.ts +1 -0
  54. package/dist/dataGridOverlayThemeVars.js +32 -0
  55. package/dist/dataGridPublicProps.d.ts +1 -0
  56. package/dist/dataGridPublicProps.js +1 -0
  57. package/dist/dataGridTableStage.types.d.ts +1 -0
  58. package/dist/dataGridTableStage.types.js +1 -0
  59. package/dist/dataGridTableStageBody.types.d.ts +1 -0
  60. package/dist/dataGridTableStageBody.types.js +1 -0
  61. package/dist/dataGridTableStageContext.d.ts +1 -0
  62. package/dist/dataGridTableStageContext.js +1 -0
  63. package/dist/dataGridTheme.d.ts +1 -0
  64. package/dist/dataGridTheme.js +1 -0
  65. package/dist/dataGridVirtualization.d.ts +1 -0
  66. package/dist/dataGridVirtualization.js +1 -0
  67. package/dist/ensureDataGridAppStyles.d.ts +1 -0
  68. package/dist/ensureDataGridAppStyles.js +1 -0
  69. package/dist/gantt/dataGridGantt.d.ts +3 -0
  70. package/dist/gantt/dataGridGantt.js +1 -0
  71. package/dist/gantt/dataGridGanttDependencySelection.d.ts +7 -0
  72. package/dist/gantt/dataGridGanttDependencySelection.js +46 -0
  73. package/dist/gantt/dataGridGanttLabel.d.ts +2 -0
  74. package/dist/gantt/dataGridGanttLabel.js +30 -0
  75. package/dist/gantt/dataGridGanttSplit.d.ts +20 -0
  76. package/dist/gantt/dataGridGanttSplit.js +31 -0
  77. package/dist/gantt/dataGridGanttWheel.d.ts +10 -0
  78. package/dist/gantt/dataGridGanttWheel.js +30 -0
  79. package/dist/host/DataGridDefaultRenderer.d.ts +298 -0
  80. package/dist/host/DataGridDefaultRenderer.js +1847 -0
  81. package/dist/host/DataGridModuleHost.d.ts +24 -0
  82. package/dist/host/DataGridModuleHost.js +23 -0
  83. package/dist/host/DataGridRuntimeHost.d.ts +104 -0
  84. package/dist/host/DataGridRuntimeHost.js +174 -0
  85. package/dist/index.d.ts +16 -0
  86. package/dist/index.js +4 -0
  87. package/dist/internal.d.ts +21 -0
  88. package/dist/internal.js +14 -0
  89. package/dist/overlays/dataGridCellComboboxState.d.ts +10 -0
  90. package/dist/overlays/dataGridCellComboboxState.js +67 -0
  91. package/dist/overlays/dataGridColumnMenu.d.ts +47 -0
  92. package/dist/overlays/dataGridColumnMenu.js +190 -0
  93. package/dist/overlays/dataGridContextMenu.d.ts +80 -0
  94. package/dist/overlays/dataGridContextMenu.js +218 -0
  95. package/dist/overlays/dataGridFilterableCombobox.d.ts +5 -0
  96. package/dist/overlays/dataGridFilterableCombobox.js +74 -0
  97. package/dist/overlays/dataGridOverlayThemeVars.d.ts +1 -0
  98. package/dist/overlays/dataGridOverlayThemeVars.js +32 -0
  99. package/dist/stage/dataGridTableStage.types.d.ts +160 -0
  100. package/dist/stage/dataGridTableStage.types.js +1 -0
  101. package/dist/stage/dataGridTableStageBody.types.d.ts +105 -0
  102. package/dist/stage/dataGridTableStageBody.types.js +1 -0
  103. package/dist/stage/dataGridTableStageContext.d.ts +45 -0
  104. package/dist/stage/dataGridTableStageContext.js +88 -0
  105. package/dist/stage/useDataGridTableStageBindings.d.ts +11 -0
  106. package/dist/stage/useDataGridTableStageBindings.js +162 -0
  107. package/dist/stage/useDataGridTableStageCellIo.d.ts +28 -0
  108. package/dist/stage/useDataGridTableStageCellIo.js +62 -0
  109. package/dist/stage/useDataGridTableStageColumns.d.ts +22 -0
  110. package/dist/stage/useDataGridTableStageColumns.js +124 -0
  111. package/dist/stage/useDataGridTableStageFillAction.d.ts +19 -0
  112. package/dist/stage/useDataGridTableStageFillAction.js +28 -0
  113. package/dist/stage/useDataGridTableStageHistory.d.ts +31 -0
  114. package/dist/stage/useDataGridTableStageHistory.js +46 -0
  115. package/dist/stage/useDataGridTableStageRowSelection.d.ts +28 -0
  116. package/dist/stage/useDataGridTableStageRowSelection.js +107 -0
  117. package/dist/stage/useDataGridTableStageRuntime.d.ts +92 -0
  118. package/dist/stage/useDataGridTableStageRuntime.js +526 -0
  119. package/dist/stage/useDataGridTableStageScrollSync.d.ts +17 -0
  120. package/dist/stage/useDataGridTableStageScrollSync.js +49 -0
  121. package/dist/stage/useDataGridTableStageViewportKeyboard.d.ts +20 -0
  122. package/dist/stage/useDataGridTableStageViewportKeyboard.js +58 -0
  123. package/dist/stage/useDataGridTableStageVisualSelection.d.ts +24 -0
  124. package/dist/stage/useDataGridTableStageVisualSelection.js +83 -0
  125. package/dist/theme/dataGridTheme.d.ts +6 -0
  126. package/dist/theme/dataGridTheme.js +84 -0
  127. package/dist/theme/ensureDataGridAppStyles.d.ts +1 -0
  128. package/dist/theme/ensureDataGridAppStyles.js +2656 -0
  129. package/dist/useDataGridAppControlledState.d.ts +59 -0
  130. package/dist/useDataGridAppControlledState.js +390 -0
  131. package/dist/useDataGridAppRowModel.d.ts +14 -0
  132. package/dist/useDataGridAppRowModel.js +85 -0
  133. package/dist/useDataGridTableStageBindings.d.ts +1 -0
  134. package/dist/useDataGridTableStageBindings.js +1 -0
  135. package/dist/useDataGridTableStageCellIo.d.ts +28 -0
  136. package/dist/useDataGridTableStageCellIo.js +62 -0
  137. package/dist/useDataGridTableStageColumns.d.ts +21 -0
  138. package/dist/useDataGridTableStageColumns.js +122 -0
  139. package/dist/useDataGridTableStageFillAction.d.ts +19 -0
  140. package/dist/useDataGridTableStageFillAction.js +28 -0
  141. package/dist/useDataGridTableStageHistory.d.ts +31 -0
  142. package/dist/useDataGridTableStageHistory.js +46 -0
  143. package/dist/useDataGridTableStageRowSelection.d.ts +28 -0
  144. package/dist/useDataGridTableStageRowSelection.js +103 -0
  145. package/dist/useDataGridTableStageRuntime.d.ts +1 -0
  146. package/dist/useDataGridTableStageRuntime.js +1 -0
  147. package/dist/useDataGridTableStageScrollSync.d.ts +17 -0
  148. package/dist/useDataGridTableStageScrollSync.js +49 -0
  149. package/dist/useDataGridTableStageViewportKeyboard.d.ts +20 -0
  150. package/dist/useDataGridTableStageViewportKeyboard.js +58 -0
  151. package/dist/useDataGridTableStageVisualSelection.d.ts +24 -0
  152. package/dist/useDataGridTableStageVisualSelection.js +70 -0
  153. package/package.json +55 -0
@@ -0,0 +1,62 @@
1
+ import { resolveDataGridCellClickAction, toggleDataGridCellValue, } from "@affino/datagrid-vue";
2
+ export function useDataGridTableStageCellIo(options) {
3
+ const readStageCell = (row, columnKey) => {
4
+ if (options.isRowSelectionColumnKey(columnKey)) {
5
+ return options.readRowSelectionCell(row);
6
+ }
7
+ return options.readCell(row, columnKey);
8
+ };
9
+ const readStageDisplayCell = (row, columnKey) => {
10
+ if (options.isRowSelectionColumnKey(columnKey)) {
11
+ return options.readRowSelectionDisplayCell(row);
12
+ }
13
+ return options.readDisplayCell(row, columnKey);
14
+ };
15
+ const handleCellClick = (row, rowOffset, column, columnIndex) => {
16
+ if (options.isRowSelectionColumn(column)) {
17
+ options.toggleRowCheckboxSelected(row);
18
+ return;
19
+ }
20
+ const rowIndex = options.viewportRowStart.value + rowOffset;
21
+ const editable = options.isCellEditableByKey(row, rowIndex, column.key, columnIndex);
22
+ const clickAction = resolveDataGridCellClickAction({
23
+ column: column.column,
24
+ row: row.kind !== "group" ? row.data : undefined,
25
+ editable,
26
+ });
27
+ if (clickAction !== "toggle") {
28
+ return;
29
+ }
30
+ if (row.kind === "group" || row.rowId == null) {
31
+ return;
32
+ }
33
+ const beforeSnapshot = options.captureHistorySnapshot();
34
+ options.runtime.api.rows.applyEdits([
35
+ {
36
+ rowId: row.rowId,
37
+ data: {
38
+ [column.key]: toggleDataGridCellValue({
39
+ column: column.column,
40
+ row: row.data,
41
+ }),
42
+ },
43
+ },
44
+ ]);
45
+ options.recordHistoryIntentTransaction({
46
+ intent: "edit",
47
+ label: `Toggle ${column.key}`,
48
+ affectedRange: {
49
+ startRow: rowIndex,
50
+ endRow: rowIndex,
51
+ startColumn: columnIndex,
52
+ endColumn: columnIndex,
53
+ },
54
+ }, beforeSnapshot);
55
+ options.syncViewport();
56
+ };
57
+ return {
58
+ readStageCell,
59
+ readStageDisplayCell,
60
+ handleCellClick,
61
+ };
62
+ }
@@ -0,0 +1,22 @@
1
+ import { type ComputedRef, type Ref } from "vue";
2
+ import type { DataGridColumnSnapshot } from "@affino/datagrid-vue";
3
+ import type { DataGridCellEditablePredicate } from "../dataGridEditability";
4
+ import type { DataGridTableRow } from "./dataGridTableStage.types";
5
+ export interface UseDataGridTableStageColumnsOptions<TRow extends Record<string, unknown>> {
6
+ runtime: Pick<import("@affino/datagrid-vue").UseDataGridRuntimeResult<TRow>, "api">;
7
+ visibleColumns: Ref<readonly DataGridColumnSnapshot[]>;
8
+ showRowSelection?: Ref<boolean>;
9
+ isCellEditable?: DataGridCellEditablePredicate<TRow>;
10
+ }
11
+ export interface UseDataGridTableStageColumnsResult<TRow extends Record<string, unknown>> {
12
+ orderedVisibleColumns: ComputedRef<readonly DataGridColumnSnapshot[]>;
13
+ centerColumns: ComputedRef<readonly DataGridColumnSnapshot[]>;
14
+ resolveColumnWidth: (column: DataGridColumnSnapshot) => number;
15
+ stageColumnStyle: (columnKey: string) => Record<string, string>;
16
+ isRowSelectionColumnKey: (columnKey: string) => boolean;
17
+ isRowSelectionColumn: (column: DataGridColumnSnapshot) => boolean;
18
+ isCellEditable: (row: DataGridTableRow<TRow>, rowIndex: number, column: DataGridColumnSnapshot) => boolean;
19
+ isCellEditableByKey: (row: DataGridTableRow<TRow>, rowIndex: number, columnKey: string, columnIndex: number) => boolean;
20
+ rowSelectionColumn: ComputedRef<DataGridColumnSnapshot | null>;
21
+ }
22
+ export declare function useDataGridTableStageColumns<TRow extends Record<string, unknown>>(options: UseDataGridTableStageColumnsOptions<TRow>): UseDataGridTableStageColumnsResult<TRow>;
@@ -0,0 +1,124 @@
1
+ import { computed } from "vue";
2
+ const DEFAULT_COLUMN_WIDTH = 140;
3
+ const ROW_SELECTION_COLUMN_WIDTH = 108;
4
+ const ROW_SELECTION_COLUMN_KEY = "__datagrid_row_selection__";
5
+ export function useDataGridTableStageColumns(options) {
6
+ const hasRowSelectionSupport = computed(() => {
7
+ return (options.showRowSelection?.value ?? true) && options.runtime.api.rowSelection.hasSupport();
8
+ });
9
+ const rowSelectionColumn = computed(() => {
10
+ if (!hasRowSelectionSupport.value) {
11
+ return null;
12
+ }
13
+ return {
14
+ key: ROW_SELECTION_COLUMN_KEY,
15
+ state: {
16
+ visible: true,
17
+ pin: "left",
18
+ width: ROW_SELECTION_COLUMN_WIDTH,
19
+ },
20
+ visible: true,
21
+ pin: "left",
22
+ width: ROW_SELECTION_COLUMN_WIDTH,
23
+ column: {
24
+ key: ROW_SELECTION_COLUMN_KEY,
25
+ label: "",
26
+ cellType: "checkbox",
27
+ minWidth: ROW_SELECTION_COLUMN_WIDTH,
28
+ maxWidth: ROW_SELECTION_COLUMN_WIDTH,
29
+ capabilities: {
30
+ editable: true,
31
+ sortable: false,
32
+ filterable: false,
33
+ groupable: false,
34
+ pivotable: false,
35
+ aggregatable: false,
36
+ },
37
+ presentation: {
38
+ align: "center",
39
+ headerAlign: "center",
40
+ },
41
+ meta: {
42
+ isSystem: true,
43
+ rowSelection: true,
44
+ },
45
+ },
46
+ };
47
+ });
48
+ const isRowSelectionColumnKey = (columnKey) => columnKey === ROW_SELECTION_COLUMN_KEY;
49
+ const isRowSelectionColumn = (column) => isRowSelectionColumnKey(column.key);
50
+ const orderedVisibleColumns = computed(() => {
51
+ const selectionColumn = rowSelectionColumn.value;
52
+ const left = options.visibleColumns.value.filter((column) => column.pin === "left");
53
+ const center = options.visibleColumns.value.filter((column) => column.pin !== "left" && column.pin !== "right");
54
+ const right = options.visibleColumns.value.filter((column) => column.pin === "right");
55
+ return selectionColumn ? [selectionColumn, ...left, ...center, ...right] : [...left, ...center, ...right];
56
+ });
57
+ const centerColumns = computed(() => (orderedVisibleColumns.value.filter((column) => column.pin !== "left" && column.pin !== "right")));
58
+ const resolveColumnWidth = (column) => {
59
+ return column.width ?? DEFAULT_COLUMN_WIDTH;
60
+ };
61
+ const stageColumnStyle = (columnKey) => {
62
+ const column = orderedVisibleColumns.value.find((candidate) => candidate.key === columnKey);
63
+ const width = column ? resolveColumnWidth(column) : DEFAULT_COLUMN_WIDTH;
64
+ const px = `${width}px`;
65
+ return {
66
+ width: px,
67
+ minWidth: px,
68
+ maxWidth: px,
69
+ };
70
+ };
71
+ const isColumnEditable = (column) => {
72
+ return column.column.capabilities?.editable !== false;
73
+ };
74
+ const isCellEditable = (row, rowIndex, column) => {
75
+ if (isRowSelectionColumn(column)) {
76
+ return row.kind !== "group" && row.rowId != null;
77
+ }
78
+ if (row.kind === "group" || row.rowId == null || !isColumnEditable(column)) {
79
+ return false;
80
+ }
81
+ if (!options.isCellEditable) {
82
+ return true;
83
+ }
84
+ return options.isCellEditable({
85
+ row: row.data,
86
+ rowId: row.rowId,
87
+ rowIndex,
88
+ column: column.column,
89
+ columnKey: column.key,
90
+ });
91
+ };
92
+ const resolveEditableColumn = (columnKey, columnIndex) => {
93
+ const columnAtIndex = orderedVisibleColumns.value[columnIndex];
94
+ if (columnAtIndex?.key === columnKey) {
95
+ return { column: columnAtIndex, columnIndex };
96
+ }
97
+ const resolvedColumnIndex = orderedVisibleColumns.value.findIndex((column) => column.key === columnKey);
98
+ if (resolvedColumnIndex < 0) {
99
+ return null;
100
+ }
101
+ return {
102
+ column: orderedVisibleColumns.value[resolvedColumnIndex],
103
+ columnIndex: resolvedColumnIndex,
104
+ };
105
+ };
106
+ const isCellEditableByKey = (row, rowIndex, columnKey, columnIndex) => {
107
+ const resolved = resolveEditableColumn(columnKey, columnIndex);
108
+ if (!resolved) {
109
+ return false;
110
+ }
111
+ return isCellEditable(row, rowIndex, resolved.column);
112
+ };
113
+ return {
114
+ orderedVisibleColumns,
115
+ centerColumns,
116
+ resolveColumnWidth,
117
+ stageColumnStyle,
118
+ isRowSelectionColumnKey,
119
+ isRowSelectionColumn,
120
+ isCellEditable,
121
+ isCellEditableByKey,
122
+ rowSelectionColumn,
123
+ };
124
+ }
@@ -0,0 +1,19 @@
1
+ import { type ComputedRef, type Ref } from "vue";
2
+ import type { DataGridCopyRange, DataGridFillBehavior } from "@affino/datagrid-vue/advanced";
3
+ import type { DataGridTableStageAnchorCell } from "./dataGridTableStage.types";
4
+ interface DataGridTableStageLastAppliedFillSession {
5
+ previewRange: DataGridCopyRange;
6
+ behavior: DataGridFillBehavior;
7
+ allowBehaviorToggle: boolean;
8
+ }
9
+ export interface UseDataGridTableStageFillActionOptions {
10
+ lastAppliedFill: Ref<DataGridTableStageLastAppliedFillSession | null>;
11
+ selectionRange: ComputedRef<DataGridCopyRange | null>;
12
+ isFillDragging: Ref<boolean>;
13
+ }
14
+ export interface UseDataGridTableStageFillActionResult {
15
+ fillActionAnchorCell: ComputedRef<DataGridTableStageAnchorCell | null>;
16
+ fillActionBehavior: ComputedRef<DataGridFillBehavior | null>;
17
+ }
18
+ export declare function useDataGridTableStageFillAction(options: UseDataGridTableStageFillActionOptions): UseDataGridTableStageFillActionResult;
19
+ export {};
@@ -0,0 +1,28 @@
1
+ import { computed } from "vue";
2
+ export function useDataGridTableStageFillAction(options) {
3
+ const fillActionAnchorCell = computed(() => {
4
+ const session = options.lastAppliedFill.value;
5
+ const activeSelectionRange = options.selectionRange.value;
6
+ if (!session || !activeSelectionRange || options.isFillDragging.value) {
7
+ return null;
8
+ }
9
+ if (session.allowBehaviorToggle === false) {
10
+ return null;
11
+ }
12
+ if (session.previewRange.startRow !== activeSelectionRange.startRow
13
+ || session.previewRange.endRow !== activeSelectionRange.endRow
14
+ || session.previewRange.startColumn !== activeSelectionRange.startColumn
15
+ || session.previewRange.endColumn !== activeSelectionRange.endColumn) {
16
+ return null;
17
+ }
18
+ return {
19
+ rowIndex: session.previewRange.endRow,
20
+ columnIndex: session.previewRange.endColumn,
21
+ };
22
+ });
23
+ const fillActionBehavior = computed(() => options.lastAppliedFill.value?.behavior ?? null);
24
+ return {
25
+ fillActionAnchorCell,
26
+ fillActionBehavior,
27
+ };
28
+ }
@@ -0,0 +1,31 @@
1
+ import type { DataGridCopyRange } from "@affino/datagrid-vue/advanced";
2
+ export interface DataGridTableStageHistoryAdapter {
3
+ captureSnapshot: () => unknown;
4
+ recordIntentTransaction: (descriptor: {
5
+ intent: string;
6
+ label: string;
7
+ affectedRange?: DataGridCopyRange | null;
8
+ }, beforeSnapshot: unknown) => void | Promise<void>;
9
+ canUndo: () => boolean;
10
+ canRedo: () => boolean;
11
+ runHistoryAction: (direction: "undo" | "redo") => Promise<string | null>;
12
+ }
13
+ export interface UseDataGridTableStageHistoryOptions<TRow extends Record<string, unknown>> {
14
+ runtime: Pick<import("@affino/datagrid-vue").UseDataGridRuntimeResult<TRow>, "api">;
15
+ cloneRowData: (row: TRow) => TRow;
16
+ syncViewport: () => void;
17
+ history?: DataGridTableStageHistoryAdapter;
18
+ }
19
+ export interface UseDataGridTableStageHistoryResult {
20
+ captureHistorySnapshot: () => unknown;
21
+ recordHistoryIntentTransaction: (descriptor: {
22
+ intent: string;
23
+ label: string;
24
+ affectedRange?: DataGridCopyRange | null;
25
+ }, beforeSnapshot: unknown) => void;
26
+ canUndoHistory: () => boolean;
27
+ canRedoHistory: () => boolean;
28
+ runHistoryAction: (direction: "undo" | "redo") => Promise<string | null>;
29
+ disposeIntentHistory: () => void;
30
+ }
31
+ export declare function useDataGridTableStageHistory<TRow extends Record<string, unknown>>(options: UseDataGridTableStageHistoryOptions<TRow>): UseDataGridTableStageHistoryResult;
@@ -0,0 +1,46 @@
1
+ import { useDataGridAppIntentHistory } from "@affino/datagrid-vue";
2
+ export function useDataGridTableStageHistory(options) {
3
+ const internalIntentHistory = options.history
4
+ ? null
5
+ : useDataGridAppIntentHistory({
6
+ runtime: options.runtime,
7
+ cloneRowData: options.cloneRowData,
8
+ syncViewport: options.syncViewport,
9
+ });
10
+ const captureHistorySnapshot = () => {
11
+ if (options.history) {
12
+ return options.history.captureSnapshot();
13
+ }
14
+ return internalIntentHistory?.captureRowsSnapshot() ?? null;
15
+ };
16
+ const recordHistoryIntentTransaction = (descriptor, beforeSnapshot) => {
17
+ if (options.history) {
18
+ void options.history.recordIntentTransaction(descriptor, beforeSnapshot);
19
+ return;
20
+ }
21
+ void internalIntentHistory?.recordIntentTransaction(descriptor, beforeSnapshot);
22
+ };
23
+ const canUndoHistory = () => {
24
+ return options.history ? options.history.canUndo() : (internalIntentHistory?.canUndo.value ?? false);
25
+ };
26
+ const canRedoHistory = () => {
27
+ return options.history ? options.history.canRedo() : (internalIntentHistory?.canRedo.value ?? false);
28
+ };
29
+ const runHistoryAction = (direction) => {
30
+ if (options.history) {
31
+ return options.history.runHistoryAction(direction);
32
+ }
33
+ return internalIntentHistory?.runHistoryAction(direction) ?? Promise.resolve(null);
34
+ };
35
+ const disposeIntentHistory = () => {
36
+ internalIntentHistory?.dispose();
37
+ };
38
+ return {
39
+ captureHistorySnapshot,
40
+ recordHistoryIntentTransaction,
41
+ canUndoHistory,
42
+ canRedoHistory,
43
+ runHistoryAction,
44
+ disposeIntentHistory,
45
+ };
46
+ }
@@ -0,0 +1,28 @@
1
+ import type { DataGridColumnSnapshot, DataGridRowId, DataGridRowSelectionSnapshot } from "@affino/datagrid-vue";
2
+ import { type ComputedRef, type Ref } from "vue";
3
+ import type { DataGridCopyRange } from "@affino/datagrid-vue/advanced";
4
+ import type { DataGridTableRow, DataGridTableStageAnchorCell } from "./dataGridTableStage.types";
5
+ export interface UseDataGridTableStageRowSelectionOptions<TRow extends Record<string, unknown>> {
6
+ runtime: Pick<import("@affino/datagrid-vue").UseDataGridRuntimeResult<TRow>, "api">;
7
+ rowSelectionColumn: ComputedRef<DataGridColumnSnapshot | null>;
8
+ orderedVisibleColumns: ComputedRef<readonly DataGridColumnSnapshot[]>;
9
+ displayRows: Ref<readonly DataGridTableRow<TRow>[]>;
10
+ rowSelectionSnapshot: Ref<DataGridRowSelectionSnapshot | null>;
11
+ viewportRowStart: Ref<number>;
12
+ selectionAnchorCell: ComputedRef<DataGridTableStageAnchorCell | null>;
13
+ applySelectionRange: (range: DataGridCopyRange) => void;
14
+ }
15
+ export interface UseDataGridTableStageRowSelectionResult<TRow extends Record<string, unknown>> {
16
+ rowSelectionSet: ComputedRef<Set<DataGridRowId>>;
17
+ isRowFocused: (row: DataGridTableRow<TRow>) => boolean;
18
+ isRowCheckboxSelected: (row: DataGridTableRow<TRow>) => boolean;
19
+ readRowSelectionCell: (row: DataGridTableRow<TRow>) => string;
20
+ readRowSelectionDisplayCell: (row: DataGridTableRow<TRow>) => string;
21
+ areAllVisibleRowsSelected: ComputedRef<boolean>;
22
+ areSomeVisibleRowsSelected: ComputedRef<boolean>;
23
+ focusRow: (row: DataGridTableRow<TRow>) => void;
24
+ toggleRowCheckboxSelected: (row: DataGridTableRow<TRow>) => void;
25
+ toggleVisibleRowsSelected: () => void;
26
+ selectRowRange: (row: DataGridTableRow<TRow>, rowOffset: number, extend: boolean) => void;
27
+ }
28
+ export declare function useDataGridTableStageRowSelection<TRow extends Record<string, unknown>>(options: UseDataGridTableStageRowSelectionOptions<TRow>): UseDataGridTableStageRowSelectionResult<TRow>;
@@ -0,0 +1,107 @@
1
+ import { buildDataGridCellRenderModel } from "@affino/datagrid-vue";
2
+ import { computed } from "vue";
3
+ export function useDataGridTableStageRowSelection(options) {
4
+ const rowSelectionSet = computed(() => new Set(options.rowSelectionSnapshot.value?.selectedRows ?? []));
5
+ const isRowFocused = (row) => {
6
+ return row.rowId != null && options.rowSelectionSnapshot.value?.focusedRow === row.rowId;
7
+ };
8
+ const isRowCheckboxSelected = (row) => {
9
+ return row.kind !== "group" && row.rowId != null && rowSelectionSet.value.has(row.rowId);
10
+ };
11
+ const readRowSelectionValue = (row) => {
12
+ return isRowCheckboxSelected(row);
13
+ };
14
+ const readRowSelectionCell = (row) => {
15
+ return readRowSelectionValue(row) ? "true" : "false";
16
+ };
17
+ const readRowSelectionDisplayCell = (row) => {
18
+ const column = options.rowSelectionColumn.value?.column;
19
+ if (!column || row.kind === "group") {
20
+ return "";
21
+ }
22
+ return buildDataGridCellRenderModel({
23
+ column,
24
+ value: readRowSelectionValue(row),
25
+ }).displayValue;
26
+ };
27
+ const selectableRowIds = computed(() => {
28
+ const rowCount = options.runtime.api.rows.getCount();
29
+ const rowIds = [];
30
+ for (let rowIndex = 0; rowIndex < rowCount; rowIndex += 1) {
31
+ const row = options.runtime.api.rows.get(rowIndex);
32
+ if (!row || row.kind === "group" || row.rowId == null) {
33
+ continue;
34
+ }
35
+ rowIds.push(row.rowId);
36
+ }
37
+ return rowIds;
38
+ });
39
+ const areAllVisibleRowsSelected = computed(() => {
40
+ const rowIds = selectableRowIds.value;
41
+ return rowIds.length > 0 && rowIds.every(rowId => rowSelectionSet.value.has(rowId));
42
+ });
43
+ const areSomeVisibleRowsSelected = computed(() => {
44
+ const rowIds = selectableRowIds.value;
45
+ return rowIds.some(rowId => rowSelectionSet.value.has(rowId));
46
+ });
47
+ const focusRow = (row) => {
48
+ if (row.rowId == null || !options.runtime.api.rowSelection.hasSupport()) {
49
+ return;
50
+ }
51
+ options.runtime.api.rowSelection.setFocusedRow(row.rowId);
52
+ };
53
+ const toggleRowCheckboxSelected = (row) => {
54
+ if (row.kind === "group" || row.rowId == null || !options.runtime.api.rowSelection.hasSupport()) {
55
+ return;
56
+ }
57
+ options.runtime.api.rowSelection.setSelected(row.rowId, !rowSelectionSet.value.has(row.rowId));
58
+ };
59
+ const toggleVisibleRowsSelected = () => {
60
+ if (!options.runtime.api.rowSelection.hasSupport()) {
61
+ return;
62
+ }
63
+ const rowIds = selectableRowIds.value;
64
+ if (!areAllVisibleRowsSelected.value) {
65
+ options.runtime.api.rowSelection.selectRows(rowIds);
66
+ return;
67
+ }
68
+ options.runtime.api.rowSelection.deselectRows(rowIds);
69
+ };
70
+ const selectRowRange = (row, rowOffset, extend) => {
71
+ focusRow(row);
72
+ const lastColumnIndex = options.orderedVisibleColumns.value.length - 1;
73
+ if (lastColumnIndex < 0) {
74
+ return;
75
+ }
76
+ const rowIndex = options.viewportRowStart.value + rowOffset;
77
+ if (!extend) {
78
+ options.applySelectionRange({
79
+ startRow: rowIndex,
80
+ endRow: rowIndex,
81
+ startColumn: 0,
82
+ endColumn: lastColumnIndex,
83
+ });
84
+ return;
85
+ }
86
+ const anchorRowIndex = options.selectionAnchorCell.value?.rowIndex ?? rowIndex;
87
+ options.applySelectionRange({
88
+ startRow: Math.min(anchorRowIndex, rowIndex),
89
+ endRow: Math.max(anchorRowIndex, rowIndex),
90
+ startColumn: 0,
91
+ endColumn: lastColumnIndex,
92
+ });
93
+ };
94
+ return {
95
+ rowSelectionSet,
96
+ isRowFocused,
97
+ isRowCheckboxSelected,
98
+ readRowSelectionCell,
99
+ readRowSelectionDisplayCell,
100
+ areAllVisibleRowsSelected,
101
+ areSomeVisibleRowsSelected,
102
+ focusRow,
103
+ toggleRowCheckboxSelected,
104
+ toggleVisibleRowsSelected,
105
+ selectRowRange,
106
+ };
107
+ }
@@ -0,0 +1,92 @@
1
+ import { type ComputedRef, type Ref } from "vue";
2
+ import type { DataGridColumnSnapshot, DataGridRowSelectionSnapshot, DataGridSelectionSnapshot } from "@affino/datagrid-vue";
3
+ import type { DataGridCopyRange } from "@affino/datagrid-vue/advanced";
4
+ import type { DataGridCellEditablePredicate } from "../dataGridEditability";
5
+ import type { DataGridColumnMenuActionOptions, DataGridColumnMenuDisabledReasons, DataGridColumnMenuItemKey, DataGridColumnMenuItemLabels } from "../overlays/dataGridColumnMenu";
6
+ import type { DataGridVirtualizationOptions } from "../config/dataGridVirtualization";
7
+ import type { DataGridTableStageContext } from "./dataGridTableStageContext";
8
+ import type { DataGridTableStageHistoryAdapter } from "./useDataGridTableStageHistory";
9
+ import type { DataGridTableStageProps } from "./dataGridTableStage.types";
10
+ export type { DataGridTableStageHistoryAdapter } from "./useDataGridTableStageHistory";
11
+ type DataGridTableStageBodyRuntime<TRow extends Record<string, unknown>> = Pick<import("@affino/datagrid-vue").UseDataGridRuntimeResult<TRow>, "api" | "syncBodyRowsInRange" | "rowPartition" | "virtualWindow" | "columnSnapshot"> & {
12
+ getBodyRowAtIndex: (rowIndex: number) => import("@affino/datagrid-vue").DataGridRowNode<TRow> | null;
13
+ resolveBodyRowIndexById: (rowId: string | number) => number;
14
+ };
15
+ export interface UseDataGridTableStageRuntimeOptions<TRow extends Record<string, unknown>> {
16
+ mode: Ref<"base" | "tree" | "pivot" | "worker">;
17
+ rows: Ref<readonly TRow[]>;
18
+ sourceRows?: Ref<readonly TRow[]>;
19
+ runtime: DataGridTableStageBodyRuntime<TRow>;
20
+ rowVersion: Ref<number>;
21
+ totalRuntimeRows: Ref<number>;
22
+ visibleColumns: Ref<readonly DataGridColumnSnapshot[]>;
23
+ rowRenderMode: Ref<"virtualization" | "pagination">;
24
+ rowHeightMode: Ref<"fixed" | "auto">;
25
+ normalizedBaseRowHeight: Ref<number>;
26
+ selectionSnapshot: Ref<DataGridSelectionSnapshot | null>;
27
+ selectionAnchor: Ref<unknown>;
28
+ syncSelectionSnapshotFromRuntime: () => void;
29
+ rowSelectionSnapshot: Ref<DataGridRowSelectionSnapshot | null>;
30
+ rowHover?: Ref<boolean>;
31
+ stripedRows?: Ref<boolean>;
32
+ showRowIndex?: Ref<boolean>;
33
+ showRowSelection?: Ref<boolean>;
34
+ isRowInPendingClipboardCut?: (row: import("@affino/datagrid-vue").DataGridRowNode<TRow>) => boolean;
35
+ syncRowSelectionSnapshotFromRuntime?: () => void;
36
+ firstColumnKey: Ref<string>;
37
+ columnFilterTextByKey: Ref<Record<string, string>>;
38
+ virtualization: Ref<DataGridVirtualizationOptions>;
39
+ toggleSortForColumn: (columnKey: string, additive?: boolean) => void;
40
+ sortIndicator: (columnKey: string) => string;
41
+ setColumnFilterText: (columnKey: string, value: string) => void;
42
+ columnMenuEnabled?: Ref<boolean>;
43
+ columnMenuValueFilterEnabled?: Ref<boolean>;
44
+ columnMenuValueFilterRowLimit?: Ref<number>;
45
+ columnMenuMaxFilterValues?: Ref<number>;
46
+ resolveColumnMenuItems?: (columnKey: string) => readonly DataGridColumnMenuItemKey[];
47
+ resolveColumnMenuDisabledItems?: (columnKey: string) => readonly DataGridColumnMenuItemKey[];
48
+ resolveColumnMenuDisabledReasons?: (columnKey: string) => DataGridColumnMenuDisabledReasons;
49
+ resolveColumnMenuLabels?: (columnKey: string) => DataGridColumnMenuItemLabels;
50
+ resolveColumnMenuActionOptions?: (columnKey: string) => DataGridColumnMenuActionOptions;
51
+ isColumnFilterActive?: (columnKey: string) => boolean;
52
+ isColumnGrouped?: (columnKey: string) => boolean;
53
+ resolveColumnGroupOrder?: (columnKey: string) => number | null;
54
+ resolveColumnMenuSortDirection?: (columnKey: string) => "asc" | "desc" | null;
55
+ resolveColumnMenuSelectedTokens?: (columnKey: string) => readonly string[];
56
+ applyColumnMenuSort?: (columnKey: string, direction: "asc" | "desc" | null) => void;
57
+ applyColumnMenuPin?: (columnKey: string, pin: import("@affino/datagrid-vue").DataGridColumnPin) => void;
58
+ applyColumnMenuGroupBy?: (columnKey: string, grouped: boolean) => void;
59
+ applyColumnMenuFilter?: (columnKey: string, tokens: readonly string[]) => void;
60
+ clearColumnMenuFilter?: (columnKey: string) => void;
61
+ applyRowHeightSettings: () => void;
62
+ cloneRowData: (row: TRow) => TRow;
63
+ readClipboardCell?: (row: import("@affino/datagrid-core").DataGridRowNode<TRow>, columnKey: string) => string;
64
+ applyClipboardEdits?: (range: DataGridCopyRange, matrix: string[][], options?: {
65
+ recordHistory?: boolean;
66
+ }) => number;
67
+ buildFillMatrixFromRange?: (range: DataGridCopyRange) => string[][];
68
+ applyRangeMove?: (baseRange: DataGridCopyRange, targetRange: DataGridCopyRange) => boolean;
69
+ isCellEditable?: DataGridCellEditablePredicate<TRow>;
70
+ history?: DataGridTableStageHistoryAdapter;
71
+ isContextMenuVisible?: () => boolean;
72
+ closeContextMenu?: () => void;
73
+ openContextMenuFromCurrentCell?: () => void;
74
+ clearExternalPendingClipboardOperation?: () => boolean;
75
+ runRowIndexKeyboardAction?: (action: "insert-row-above" | "copy-row" | "cut-row" | "paste-row" | "delete-selected-rows" | "open-row-menu", rowId: string | number) => Promise<boolean> | boolean;
76
+ }
77
+ export interface UseDataGridTableStageRuntimeResult<TRow extends Record<string, unknown>> {
78
+ tableStageProps: ComputedRef<DataGridTableStageProps<TRow>>;
79
+ tableStageContext: DataGridTableStageContext<TRow>;
80
+ syncViewportFromDom: () => void;
81
+ copySelectedCells: (trigger?: "keyboard" | "context-menu") => Promise<boolean>;
82
+ pasteSelectedCells: (trigger?: "keyboard" | "context-menu") => Promise<boolean>;
83
+ cutSelectedCells: (trigger?: "keyboard" | "context-menu") => Promise<boolean>;
84
+ clearSelectedCells: (trigger?: "keyboard" | "context-menu") => Promise<boolean>;
85
+ captureHistorySnapshot: () => unknown;
86
+ recordHistoryIntentTransaction: (descriptor: {
87
+ intent: string;
88
+ label: string;
89
+ affectedRange?: DataGridCopyRange | null;
90
+ }, beforeSnapshot: unknown) => void;
91
+ }
92
+ export declare function useDataGridTableStageRuntime<TRow extends Record<string, unknown>>(options: UseDataGridTableStageRuntimeOptions<TRow>): UseDataGridTableStageRuntimeResult<TRow>;