persian-data-grid 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/OFL.txt +93 -0
- package/README.md +179 -22
- package/dist/ERPTableGroupRow-J5Z2LRC5.cjs +131 -0
- package/dist/ERPTableGroupRow-J5Z2LRC5.cjs.map +1 -0
- package/dist/ERPTableGroupRow-PSAPAHGL.js +125 -0
- package/dist/ERPTableGroupRow-PSAPAHGL.js.map +1 -0
- package/dist/GridPlugin-CJCaYnlw.d.ts +57 -0
- package/dist/GridPlugin-oxhq8AsM.d.cts +57 -0
- package/dist/GridPresenceService-GEH6535Q.js +3 -0
- package/dist/GridPresenceService-GEH6535Q.js.map +1 -0
- package/dist/GridPresenceService-RDN5FXHQ.cjs +12 -0
- package/dist/GridPresenceService-RDN5FXHQ.cjs.map +1 -0
- package/dist/GridSession-B-9lLcoB.d.cts +2492 -0
- package/dist/GridSession-Bc7UIawO.d.ts +2492 -0
- package/dist/GridSyncService-KTLB4KP3.js +3 -0
- package/dist/GridSyncService-KTLB4KP3.js.map +1 -0
- package/dist/GridSyncService-TAPAHABV.cjs +12 -0
- package/dist/GridSyncService-TAPAHABV.cjs.map +1 -0
- package/dist/PdfRenderer-1HFh6UeR.d.ts +22 -0
- package/dist/PdfRenderer-CBg7hWNS.d.cts +22 -0
- package/dist/RemoteApi-CCQxiSf1.d.cts +28 -0
- package/dist/RemoteApi-CCQxiSf1.d.ts +28 -0
- package/dist/SelectImpl-NM4O4IGW.js +447 -0
- package/dist/SelectImpl-NM4O4IGW.js.map +1 -0
- package/dist/SelectImpl-W2EI4T7O.cjs +453 -0
- package/dist/SelectImpl-W2EI4T7O.cjs.map +1 -0
- package/dist/UITableController-Cuwq481K.d.cts +632 -0
- package/dist/UITableController-DU8RopUM.d.ts +632 -0
- package/dist/VazirmatnPdfRenderer-BCMpC1zy.d.cts +96 -0
- package/dist/VazirmatnPdfRenderer-Dz_G-m3c.d.ts +96 -0
- package/dist/adapters/arian-erp.cjs +77 -0
- package/dist/adapters/arian-erp.cjs.map +1 -0
- package/dist/adapters/arian-erp.d.cts +60 -0
- package/dist/adapters/arian-erp.d.ts +60 -0
- package/dist/adapters/arian-erp.js +71 -0
- package/dist/adapters/arian-erp.js.map +1 -0
- package/dist/appendAtEnd-RHIQRG2W.cjs +35 -0
- package/dist/appendAtEnd-RHIQRG2W.cjs.map +1 -0
- package/dist/appendAtEnd-TJEABLGD.js +33 -0
- package/dist/appendAtEnd-TJEABLGD.js.map +1 -0
- package/dist/applyImportedRows-BO6yxoAN.d.cts +135 -0
- package/dist/applyImportedRows-D4zVY8uD.d.ts +135 -0
- package/dist/applyRowVisibilityHandler-KS6TMCBN.js +83 -0
- package/dist/applyRowVisibilityHandler-KS6TMCBN.js.map +1 -0
- package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs +85 -0
- package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs.map +1 -0
- package/dist/broadcastChannelTransport-FHUMV76O.cjs +12 -0
- package/dist/broadcastChannelTransport-FHUMV76O.cjs.map +1 -0
- package/dist/broadcastChannelTransport-MIH53VNZ.js +3 -0
- package/dist/broadcastChannelTransport-MIH53VNZ.js.map +1 -0
- package/dist/callbackRemoteApi-BlXO5NJz.d.ts +30 -0
- package/dist/callbackRemoteApi-DgnXH-i0.d.cts +30 -0
- package/dist/cellRenderContext-DB7V_mlu.d.ts +42 -0
- package/dist/cellRenderContext-DG5BOlxK.d.cts +42 -0
- package/dist/chunk-2BJCRYOS.cjs +936 -0
- package/dist/chunk-2BJCRYOS.cjs.map +1 -0
- package/dist/chunk-3Y3KKGEC.js +3 -0
- package/dist/chunk-3Y3KKGEC.js.map +1 -0
- package/dist/chunk-5ALMNLUR.cjs +1408 -0
- package/dist/chunk-5ALMNLUR.cjs.map +1 -0
- package/dist/chunk-5HKVMPBD.js +937 -0
- package/dist/chunk-5HKVMPBD.js.map +1 -0
- package/dist/chunk-633KP74Z.js +189 -0
- package/dist/chunk-633KP74Z.js.map +1 -0
- package/dist/chunk-6XBXZPBW.js +298 -0
- package/dist/chunk-6XBXZPBW.js.map +1 -0
- package/dist/chunk-77UXAJII.js +112 -0
- package/dist/chunk-77UXAJII.js.map +1 -0
- package/dist/chunk-ASPTRYRD.cjs +21 -0
- package/dist/chunk-ASPTRYRD.cjs.map +1 -0
- package/dist/chunk-AU3RDJYQ.js +243 -0
- package/dist/chunk-AU3RDJYQ.js.map +1 -0
- package/dist/chunk-BHDRUZH5.cjs +33 -0
- package/dist/chunk-BHDRUZH5.cjs.map +1 -0
- package/dist/chunk-BLYVOV3G.cjs +191 -0
- package/dist/chunk-BLYVOV3G.cjs.map +1 -0
- package/dist/chunk-CILNIWYW.cjs +100 -0
- package/dist/chunk-CILNIWYW.cjs.map +1 -0
- package/dist/chunk-DFFP7SJ6.cjs +257 -0
- package/dist/chunk-DFFP7SJ6.cjs.map +1 -0
- package/dist/chunk-DXRCYW42.cjs +568 -0
- package/dist/chunk-DXRCYW42.cjs.map +1 -0
- package/dist/chunk-EBV6HGZB.cjs +33 -0
- package/dist/chunk-EBV6HGZB.cjs.map +1 -0
- package/dist/chunk-EHHHC5JV.js +832 -0
- package/dist/chunk-EHHHC5JV.js.map +1 -0
- package/dist/chunk-F4PYOYHR.js +112 -0
- package/dist/chunk-F4PYOYHR.js.map +1 -0
- package/dist/chunk-GQEDLUMB.js +168 -0
- package/dist/chunk-GQEDLUMB.js.map +1 -0
- package/dist/chunk-H2LESGMX.cjs +319 -0
- package/dist/chunk-H2LESGMX.cjs.map +1 -0
- package/dist/chunk-HTNJT2QU.js +11674 -0
- package/dist/chunk-HTNJT2QU.js.map +1 -0
- package/dist/chunk-IIISFUW4.cjs +11786 -0
- package/dist/chunk-IIISFUW4.cjs.map +1 -0
- package/dist/chunk-IMPCRWYP.cjs +251 -0
- package/dist/chunk-IMPCRWYP.cjs.map +1 -0
- package/dist/chunk-IPPIXOVQ.js +317 -0
- package/dist/chunk-IPPIXOVQ.js.map +1 -0
- package/dist/chunk-J4XJ4UBC.js +1404 -0
- package/dist/chunk-J4XJ4UBC.js.map +1 -0
- package/dist/chunk-J7CPPFXT.cjs +89 -0
- package/dist/chunk-J7CPPFXT.cjs.map +1 -0
- package/dist/chunk-JOICD47Q.cjs +41 -0
- package/dist/chunk-JOICD47Q.cjs.map +1 -0
- package/dist/chunk-KHMG6EI2.js +13 -0
- package/dist/chunk-KHMG6EI2.js.map +1 -0
- package/dist/chunk-KMRURD5J.cjs +15 -0
- package/dist/chunk-KMRURD5J.cjs.map +1 -0
- package/dist/chunk-KRJG3KMP.cjs +174 -0
- package/dist/chunk-KRJG3KMP.cjs.map +1 -0
- package/dist/chunk-KUBVDIF7.cjs +653 -0
- package/dist/chunk-KUBVDIF7.cjs.map +1 -0
- package/dist/chunk-KYAOSBQN.js +31 -0
- package/dist/chunk-KYAOSBQN.js.map +1 -0
- package/dist/chunk-LJ7LMEXO.js +36 -0
- package/dist/chunk-LJ7LMEXO.js.map +1 -0
- package/dist/chunk-MT3KLB2Q.cjs +944 -0
- package/dist/chunk-MT3KLB2Q.cjs.map +1 -0
- package/dist/chunk-MU3RY46O.js +932 -0
- package/dist/chunk-MU3RY46O.js.map +1 -0
- package/dist/chunk-MUQQKPWR.js +84 -0
- package/dist/chunk-MUQQKPWR.js.map +1 -0
- package/dist/chunk-N7SJTINL.cjs +4 -0
- package/dist/chunk-N7SJTINL.cjs.map +1 -0
- package/dist/chunk-NTV2UUAJ.cjs +149 -0
- package/dist/chunk-NTV2UUAJ.cjs.map +1 -0
- package/dist/chunk-PJQWHF6T.js +31 -0
- package/dist/chunk-PJQWHF6T.js.map +1 -0
- package/dist/chunk-PQY54EL5.js +248 -0
- package/dist/chunk-PQY54EL5.js.map +1 -0
- package/dist/chunk-PXCHPZTP.cjs +839 -0
- package/dist/chunk-PXCHPZTP.cjs.map +1 -0
- package/dist/chunk-Q7TBBUTX.cjs +110 -0
- package/dist/chunk-Q7TBBUTX.cjs.map +1 -0
- package/dist/chunk-QQMU44KJ.js +612 -0
- package/dist/chunk-QQMU44KJ.js.map +1 -0
- package/dist/chunk-QZN7R2WP.cjs +114 -0
- package/dist/chunk-QZN7R2WP.cjs.map +1 -0
- package/dist/chunk-RKVSJU46.js +35 -0
- package/dist/chunk-RKVSJU46.js.map +1 -0
- package/dist/chunk-RM6ZWNT3.js +561 -0
- package/dist/chunk-RM6ZWNT3.js.map +1 -0
- package/dist/chunk-SX4VQXAA.cjs +114 -0
- package/dist/chunk-SX4VQXAA.cjs.map +1 -0
- package/dist/chunk-SZ7BLAY3.js +92 -0
- package/dist/chunk-SZ7BLAY3.js.map +1 -0
- package/dist/chunk-TN4MG6FY.js +112 -0
- package/dist/chunk-TN4MG6FY.js.map +1 -0
- package/dist/chunk-UC7PHDM6.cjs +331 -0
- package/dist/chunk-UC7PHDM6.cjs.map +1 -0
- package/dist/chunk-UXVLYUUW.js +108 -0
- package/dist/chunk-UXVLYUUW.js.map +1 -0
- package/dist/chunk-VVGYRZ7S.cjs +38 -0
- package/dist/chunk-VVGYRZ7S.cjs.map +1 -0
- package/dist/chunk-W5256BJ4.js +56 -0
- package/dist/chunk-W5256BJ4.js.map +1 -0
- package/dist/chunk-WUMOSOEK.cjs +62 -0
- package/dist/chunk-WUMOSOEK.cjs.map +1 -0
- package/dist/chunk-XLRE2J25.js +140 -0
- package/dist/chunk-XLRE2J25.js.map +1 -0
- package/dist/chunk-Y6W5V2CI.js +19 -0
- package/dist/chunk-Y6W5V2CI.js.map +1 -0
- package/dist/chunk-Z4QPZ3Z3.cjs +114 -0
- package/dist/chunk-Z4QPZ3Z3.cjs.map +1 -0
- package/dist/createEngineGridQuery-Dmq3i5v3.d.cts +884 -0
- package/dist/createEngineGridQuery-Mt1hc33m.d.ts +884 -0
- package/dist/date-picker-jalali.cjs +263 -0
- package/dist/date-picker-jalali.cjs.map +1 -0
- package/dist/date-picker-jalali.d.cts +62 -0
- package/dist/date-picker-jalali.d.ts +62 -0
- package/dist/date-picker-jalali.js +256 -0
- package/dist/date-picker-jalali.js.map +1 -0
- package/dist/finance.cjs +205 -0
- package/dist/finance.cjs.map +1 -0
- package/dist/finance.d.cts +90 -0
- package/dist/finance.d.ts +90 -0
- package/dist/finance.js +157 -0
- package/dist/finance.js.map +1 -0
- package/dist/foldedColumn-IHDT4ARZ.cjs +66 -0
- package/dist/foldedColumn-IHDT4ARZ.cjs.map +1 -0
- package/dist/foldedColumn-TFURUKFG.js +64 -0
- package/dist/foldedColumn-TFURUKFG.js.map +1 -0
- package/dist/headless.cjs +729 -0
- package/dist/headless.cjs.map +1 -0
- package/dist/headless.d.cts +504 -0
- package/dist/headless.d.ts +504 -0
- package/dist/headless.js +226 -0
- package/dist/headless.js.map +1 -0
- package/dist/index-DN8M8Jkq.d.cts +14 -0
- package/dist/index-DmzL-F_o.d.ts +14 -0
- package/dist/index.cjs +8002 -11409
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +437 -2305
- package/dist/index.d.ts +437 -2305
- package/dist/index.js +7244 -11083
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.cjs +12 -0
- package/dist/locales/ar.cjs.map +1 -0
- package/dist/locales/ar.d.cts +6 -0
- package/dist/locales/ar.d.ts +6 -0
- package/dist/locales/ar.js +3 -0
- package/dist/locales/ar.js.map +1 -0
- package/dist/locales/en.cjs +12 -0
- package/dist/locales/en.cjs.map +1 -0
- package/dist/locales/en.d.cts +6 -0
- package/dist/locales/en.d.ts +6 -0
- package/dist/locales/en.js +3 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/locales/fa.cjs +12 -0
- package/dist/locales/fa.cjs.map +1 -0
- package/dist/locales/fa.d.cts +6 -0
- package/dist/locales/fa.d.ts +6 -0
- package/dist/locales/fa.js +3 -0
- package/dist/locales/fa.js.map +1 -0
- package/dist/locales/index.cjs +51 -0
- package/dist/locales/index.cjs.map +1 -0
- package/dist/locales/index.d.cts +5 -0
- package/dist/locales/index.d.ts +5 -0
- package/dist/locales/index.js +6 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/memoryRecords-AWDKUJ2F.cjs +50 -0
- package/dist/memoryRecords-AWDKUJ2F.cjs.map +1 -0
- package/dist/memoryRecords-OJTGXLRH.js +47 -0
- package/dist/memoryRecords-OJTGXLRH.js.map +1 -0
- package/dist/pagedFooterTotals-DXCGDO6F.cjs +27 -0
- package/dist/pagedFooterTotals-DXCGDO6F.cjs.map +1 -0
- package/dist/pagedFooterTotals-ORWKUNE7.js +25 -0
- package/dist/pagedFooterTotals-ORWKUNE7.js.map +1 -0
- package/dist/pagedKit-MFGAJFSK.cjs +134 -0
- package/dist/pagedKit-MFGAJFSK.cjs.map +1 -0
- package/dist/pagedKit-WYWY4LRV.js +127 -0
- package/dist/pagedKit-WYWY4LRV.js.map +1 -0
- package/dist/pagedSearch-HCPJW7VM.js +38 -0
- package/dist/pagedSearch-HCPJW7VM.js.map +1 -0
- package/dist/pagedSearch-U3WCG4GN.cjs +42 -0
- package/dist/pagedSearch-U3WCG4GN.cjs.map +1 -0
- package/dist/plugins/csv.cjs +124 -0
- package/dist/plugins/csv.cjs.map +1 -0
- package/dist/plugins/csv.d.cts +44 -0
- package/dist/plugins/csv.d.ts +44 -0
- package/dist/plugins/csv.js +120 -0
- package/dist/plugins/csv.js.map +1 -0
- package/dist/plugins/excel.cjs +52 -0
- package/dist/plugins/excel.cjs.map +1 -0
- package/dist/plugins/excel.d.cts +14 -0
- package/dist/plugins/excel.d.ts +14 -0
- package/dist/plugins/excel.js +7 -0
- package/dist/plugins/excel.js.map +1 -0
- package/dist/plugins/pdf/fonts/vazirmatn.cjs +50 -0
- package/dist/plugins/pdf/fonts/vazirmatn.cjs.map +1 -0
- package/dist/plugins/pdf/fonts/vazirmatn.d.cts +24 -0
- package/dist/plugins/pdf/fonts/vazirmatn.d.ts +24 -0
- package/dist/plugins/pdf/fonts/vazirmatn.js +39 -0
- package/dist/plugins/pdf/fonts/vazirmatn.js.map +1 -0
- package/dist/plugins/pdf.cjs +24 -0
- package/dist/plugins/pdf.cjs.map +1 -0
- package/dist/plugins/pdf.d.cts +21 -0
- package/dist/plugins/pdf.d.ts +21 -0
- package/dist/plugins/pdf.js +7 -0
- package/dist/plugins/pdf.js.map +1 -0
- package/dist/presence.cjs +56 -0
- package/dist/presence.cjs.map +1 -0
- package/dist/presence.d.cts +17 -0
- package/dist/presence.d.ts +17 -0
- package/dist/presence.js +54 -0
- package/dist/presence.js.map +1 -0
- package/dist/rebuildRowVisibility-66EAZ356.cjs +21 -0
- package/dist/rebuildRowVisibility-66EAZ356.cjs.map +1 -0
- package/dist/rebuildRowVisibility-6TYM5BP2.js +19 -0
- package/dist/rebuildRowVisibility-6TYM5BP2.js.map +1 -0
- package/dist/styles.css +1440 -0
- package/dist/sync.cjs +148 -0
- package/dist/sync.cjs.map +1 -0
- package/dist/sync.d.cts +17 -0
- package/dist/sync.d.ts +17 -0
- package/dist/sync.js +146 -0
- package/dist/sync.js.map +1 -0
- package/dist/types-D__47BKv.d.cts +23 -0
- package/dist/types-D__47BKv.d.ts +23 -0
- package/package.json +184 -28
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../engine/selection/cellRange.ts","../engine/selection/cellRangePresentation.ts","../engine/dataOps/cellValueCoercion.ts","../engine/selection/fillHandle.ts","../engine/selection/clipboardCopy.ts","../engine/selection/clipboardPaste.ts","../engine/selection/clipboardCut.ts","../infrastructure/ui/gridClipboard.ts","../infrastructure/ui/gridFillHandle.ts","../engine/dataOps/filterModel.ts","../engine/SparseRowIndex.ts","../application/ports/TableRepository.ts","../engine/dataOps/quickFilter.ts","../engine/dataOps/rowModel.ts","../engine/dataOps/aggregation.ts","../domain/types/ColumnGroupDef.ts","../infrastructure/columns/flattenColumnDefs.ts","../infrastructure/columns/mapColumnDef.ts","../infrastructure/rows/mapRowData.ts","../application/commands/index.ts","../engine/EngineErrorHandler.ts","../engine/managers/CellRangeManager.ts","../engine/managers/NavigationManager.ts","../engine/managers/RowManager.ts","../engine/managers/SelectionManager.ts","../engine/dataOps/columnVisibility.ts","../engine/dataOps/columnPinPolicy.ts","../engine/tableStore.ts","../engine/dataOps/cellEditSession.ts","../engine/dataOps/columnGroups.ts","../engine/dataOps/rowGrouping.ts","../engine/type.ts","../engine/ViewStateBuilder.ts","../engine/tableEngine.ts","../infrastructure/Repositories/noopRemoteApi.ts","../infrastructure/eventStore/InMemoryEventStore.ts","../infrastructure/eventStore/KvDatabase.ts","../infrastructure/eventStore/eventStoreName.ts","../infrastructure/eventStore/IndexedDbEventStore.ts","../application/offline/OfflineStatus.ts","../infrastructure/offline/browserConnectivity.ts","../infrastructure/offline/localStorageWatermark.ts","../infrastructure/snapshot/SnapshotStrategy.ts","../engine/dataOps/columnState.ts","../infrastructure/ui/createGridApi.ts","../engine/dataOps/columnAutoSize.ts","../infrastructure/ui/columnMeasure.ts","../infrastructure/ui/UITableController.ts","../application/plugins/createEngineGridQuery.ts","../application/plugins/PluginHost.ts","../infrastructure/columns/mapColumnSchema.ts","../bootstrap/defaults.ts","../infrastructure/Repositories/indexedDbTableRepository.ts","../infrastructure/Repositories/localTableRepository.ts","../infrastructure/Repositories/cachedTableRepository.ts","../infrastructure/Repositories/consoleAuditLogger.ts","../infrastructure/history/HistoryPanelViewModel.ts","../infrastructure/projections/ChangelogProjection.ts","../infrastructure/ui/columnStatePersist.ts","../application/undo/CellUndoStack.ts","../engine/dataOps/blockCache.ts","../application/rowModel/attachServerRowModel.ts","../infrastructure/ui/focusTrap.ts","../infrastructure/ui/UITableKeyboardHandler.ts","../infrastructure/session/DefaultGridSession.ts","../application/handlers/rowCommandsHandler.ts","../application/handlers/tableCommandHandler.ts","../application/TableAppService.ts","../application/handlers/pasteCellsCommandsHandler.ts","../bootstrap/builders/index.ts","../bootstrap/index.ts","../infrastructure/snapshot/InMemorySnapshotStore.ts","../application/events/eventCatalog.ts"],"names":["colIndex","normalizeDigits","isBlankSortValue","formatPrice","n","Cell","ColumnId","RowId","Row","RowState","DomainError","CellValue","isIndexColumn","resolveColumnPinned","id","findSortedInsertIndex","applySort","pageWindow","hasMeaningfulValue","clampColumnWidth","resolveColumnWidth","sizeColumnsToFitWidths","ctx","Collection","Table","Pagination","Viewport","ViewportCalculator","event","RowRemoved","MinimumRowConstraintViolated","CellDisplay","allowRoles","denyRoles","rule","ChangeCellValueHandler","ApplyDynamicProjectionHandler","ChangeCellDisplayValueHandler","SaveDescriptionHandler"],"mappings":"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","file":"chunk-IIISFUW4.cjs","sourcesContent":["/**\r\n * Pure cell-range selection model (PR-104).\r\n * No React/DOM — keyboard/UI wiring lands in PR-105+.\r\n */\r\n\r\nexport type CellAddress = {\r\n /** 0-based index in the visible/sorted row list. */\r\n rowIndex: number;\r\n colId: string;\r\n};\r\n\r\n/** Inclusive rectangular range in UI row/column space. */\r\nexport type CellRange = {\r\n startRow: number;\r\n endRow: number;\r\n /** Column ids in document order (inclusive span). */\r\n colIds: readonly string[];\r\n};\r\n\r\nexport type CellRangeSelection = {\r\n ranges: readonly CellRange[];\r\n anchor: CellAddress | null;\r\n focus: CellAddress | null;\r\n};\r\n\r\nexport type CellRangeBounds = {\r\n rowCount: number;\r\n /** Visible/selectable columns in document order. */\r\n columnOrder: readonly string[];\r\n};\r\n\r\nexport type ArrowDirection = 'up' | 'down' | 'left' | 'right';\r\n\r\nexport function createEmptyCellRangeSelection(): CellRangeSelection {\r\n return { ranges: [], anchor: null, focus: null };\r\n}\r\n\r\nexport function colIndex(\r\n colId: string,\r\n columnOrder: readonly string[],\r\n): number {\r\n return columnOrder.indexOf(colId);\r\n}\r\n\r\nexport function clampRowIndex(rowIndex: number, rowCount: number): number {\r\n if (rowCount <= 0) return 0;\r\n return Math.max(0, Math.min(rowCount - 1, rowIndex));\r\n}\r\n\r\nexport function clampColIndex(colIndex: number, colCount: number): number {\r\n if (colCount <= 0) return 0;\r\n return Math.max(0, Math.min(colCount - 1, colIndex));\r\n}\r\n\r\nfunction columnSpan(\r\n colIds: readonly string[],\r\n columnOrder: readonly string[],\r\n): { start: number; end: number } | null {\r\n if (colIds.length === 0 || columnOrder.length === 0) return null;\r\n let start = Infinity;\r\n let end = -Infinity;\r\n for (const id of colIds) {\r\n const idx = colIndex(id, columnOrder);\r\n if (idx < 0) continue;\r\n start = Math.min(start, idx);\r\n end = Math.max(end, idx);\r\n }\r\n if (!Number.isFinite(start) || end < 0) return null;\r\n return { start, end };\r\n}\r\n\r\nfunction colIdsFromSpan(\r\n start: number,\r\n end: number,\r\n columnOrder: readonly string[],\r\n): readonly string[] {\r\n const from = Math.max(0, Math.min(start, end));\r\n const to = Math.min(columnOrder.length - 1, Math.max(start, end));\r\n if (columnOrder.length === 0 || from > to) return [];\r\n return columnOrder.slice(from, to + 1);\r\n}\r\n\r\n/**\r\n * Clamp rows/columns to bounds and sort `colIds` by `columnOrder`.\r\n */\r\nexport function normalizeCellRange(\r\n range: CellRange,\r\n bounds: CellRangeBounds,\r\n): CellRange {\r\n const { rowCount, columnOrder } = bounds;\r\n if (rowCount <= 0 || columnOrder.length === 0) {\r\n return { startRow: 0, endRow: -1, colIds: [] };\r\n }\r\n\r\n const startRow = clampRowIndex(\r\n Math.min(range.startRow, range.endRow),\r\n rowCount,\r\n );\r\n const endRow = clampRowIndex(\r\n Math.max(range.startRow, range.endRow),\r\n rowCount,\r\n );\r\n\r\n const span = columnSpan(range.colIds, columnOrder);\r\n const colIds = span\r\n ? colIdsFromSpan(span.start, span.end, columnOrder)\r\n : colIdsFromSpan(0, columnOrder.length - 1, columnOrder);\r\n\r\n return { startRow, endRow, colIds };\r\n}\r\n\r\nexport function rangeFromAnchorFocus(\r\n anchor: CellAddress,\r\n focus: CellAddress,\r\n bounds: CellRangeBounds,\r\n): CellRange {\r\n const { rowCount, columnOrder } = bounds;\r\n const aCol = colIndex(anchor.colId, columnOrder);\r\n const fCol = colIndex(focus.colId, columnOrder);\r\n const safeACol = aCol >= 0 ? aCol : 0;\r\n const safeFCol = fCol >= 0 ? fCol : safeACol;\r\n\r\n return normalizeCellRange(\r\n {\r\n startRow: anchor.rowIndex,\r\n endRow: focus.rowIndex,\r\n colIds: colIdsFromSpan(safeACol, safeFCol, columnOrder),\r\n },\r\n { rowCount, columnOrder },\r\n );\r\n}\r\n\r\nexport function isCellInRange(\r\n cell: CellAddress,\r\n range: CellRange,\r\n): boolean {\r\n if (\r\n cell.rowIndex < range.startRow ||\r\n cell.rowIndex > range.endRow\r\n ) {\r\n return false;\r\n }\r\n return range.colIds.includes(cell.colId);\r\n}\r\n\r\nexport function rangesOverlap(a: CellRange, b: CellRange): boolean {\r\n const rowOverlap =\r\n a.startRow <= b.endRow && b.startRow <= a.endRow;\r\n if (!rowOverlap) return false;\r\n\r\n const aCols = new Set(a.colIds);\r\n for (const col of b.colIds) {\r\n if (aCols.has(col)) return true;\r\n }\r\n return false;\r\n}\r\n\r\nfunction unionRange(a: CellRange, b: CellRange, columnOrder: readonly string[]): CellRange {\r\n const aSpan = columnSpan(a.colIds, columnOrder);\r\n const bSpan = columnSpan(b.colIds, columnOrder);\r\n const colStart = Math.min(aSpan?.start ?? 0, bSpan?.start ?? 0);\r\n const colEnd = Math.max(\r\n aSpan?.end ?? columnOrder.length - 1,\r\n bSpan?.end ?? columnOrder.length - 1,\r\n );\r\n return {\r\n startRow: Math.min(a.startRow, b.startRow),\r\n endRow: Math.max(a.endRow, b.endRow),\r\n colIds: colIdsFromSpan(colStart, colEnd, columnOrder),\r\n };\r\n}\r\n\r\n/**\r\n * Merge overlapping/adjacent rectangles into a minimal set.\r\n */\r\nexport function mergeCellRanges(\r\n ranges: readonly CellRange[],\r\n columnOrder: readonly string[],\r\n): CellRange[] {\r\n if (ranges.length <= 1) return [...ranges];\r\n\r\n let merged: CellRange[] = ranges.map((r) => ({\r\n ...r,\r\n colIds: [...r.colIds],\r\n }));\r\n let changed = true;\r\n while (changed) {\r\n changed = false;\r\n outer: for (let i = 0; i < merged.length; i += 1) {\r\n for (let j = i + 1; j < merged.length; j += 1) {\r\n if (rangesOverlap(merged[i], merged[j])) {\r\n const next = unionRange(merged[i], merged[j], columnOrder);\r\n merged = merged.filter((_, idx) => idx !== i && idx !== j);\r\n merged.push(next);\r\n changed = true;\r\n break outer;\r\n }\r\n }\r\n }\r\n }\r\n return merged;\r\n}\r\n\r\nexport function moveCellAddress(\r\n cell: CellAddress,\r\n direction: ArrowDirection,\r\n bounds: CellRangeBounds,\r\n): CellAddress {\r\n const { rowCount, columnOrder } = bounds;\r\n const colIdx = colIndex(cell.colId, columnOrder);\r\n const safeColIdx = colIdx >= 0 ? colIdx : 0;\r\n\r\n let nextRow = cell.rowIndex;\r\n let nextColIdx = safeColIdx;\r\n\r\n switch (direction) {\r\n case 'up':\r\n nextRow = cell.rowIndex - 1;\r\n break;\r\n case 'down':\r\n nextRow = cell.rowIndex + 1;\r\n break;\r\n case 'left':\r\n nextColIdx = safeColIdx - 1;\r\n break;\r\n case 'right':\r\n nextColIdx = safeColIdx + 1;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return {\r\n rowIndex: clampRowIndex(nextRow, rowCount),\r\n colId: columnOrder[clampColIndex(nextColIdx, columnOrder.length)] ?? cell.colId,\r\n };\r\n}\r\n\r\nfunction singleCellRange(cell: CellAddress, bounds: CellRangeBounds): CellRange {\r\n return normalizeCellRange(\r\n {\r\n startRow: cell.rowIndex,\r\n endRow: cell.rowIndex,\r\n colIds: [cell.colId],\r\n },\r\n bounds,\r\n );\r\n}\r\n\r\nfunction withPrimaryRange(\r\n selection: CellRangeSelection,\r\n range: CellRange,\r\n anchor: CellAddress,\r\n focus: CellAddress,\r\n keepOthers: boolean,\r\n): CellRangeSelection {\r\n const ranges = keepOthers\r\n ? [...selection.ranges.slice(0, -1), range]\r\n : [range];\r\n return {\r\n ranges,\r\n anchor,\r\n focus,\r\n };\r\n}\r\n\r\n/** Plain click — single 1×1 range. */\r\nexport function clickCell(\r\n selection: CellRangeSelection,\r\n cell: CellAddress,\r\n bounds: CellRangeBounds,\r\n): CellRangeSelection {\r\n const range = singleCellRange(cell, bounds);\r\n return {\r\n ranges: [range],\r\n anchor: cell,\r\n focus: cell,\r\n };\r\n}\r\n\r\n/** Shift+Click — extend from anchor to clicked cell (replace primary range). */\r\nexport function shiftClickCell(\r\n selection: CellRangeSelection,\r\n cell: CellAddress,\r\n bounds: CellRangeBounds,\r\n): CellRangeSelection {\r\n const anchor = selection.anchor ?? selection.focus ?? cell;\r\n const range = rangeFromAnchorFocus(anchor, cell, bounds);\r\n return {\r\n ranges: [range],\r\n anchor,\r\n focus: cell,\r\n };\r\n}\r\n\r\n/** Ctrl+Click — add a new 1×1 range; anchor/focus move to the new cell. */\r\nexport function ctrlClickCell(\r\n selection: CellRangeSelection,\r\n cell: CellAddress,\r\n bounds: CellRangeBounds,\r\n): CellRangeSelection {\r\n const range = singleCellRange(cell, bounds);\r\n return {\r\n ranges: [...selection.ranges, range],\r\n anchor: cell,\r\n focus: cell,\r\n };\r\n}\r\n\r\n/** Shift+Arrow — extend primary range from anchor to moved focus. */\r\nexport function shiftArrowCell(\r\n selection: CellRangeSelection,\r\n direction: ArrowDirection,\r\n bounds: CellRangeBounds,\r\n): CellRangeSelection {\r\n const focus = selection.focus ?? selection.anchor;\r\n if (!focus) return selection;\r\n\r\n const anchor = selection.anchor ?? focus;\r\n const nextFocus = moveCellAddress(focus, direction, bounds);\r\n const range = rangeFromAnchorFocus(anchor, nextFocus, bounds);\r\n\r\n const keepOthers = selection.ranges.length > 1;\r\n return withPrimaryRange(selection, range, anchor, nextFocus, keepOthers);\r\n}\r\n\r\n/** Jump focus to the row edge (first/last column) or grid corner. */\r\nexport function jumpCellAddress(\r\n cell: CellAddress,\r\n target: 'rowStart' | 'rowEnd' | 'gridFirst' | 'gridLast',\r\n bounds: CellRangeBounds,\r\n): CellAddress {\r\n const { rowCount, columnOrder } = bounds;\r\n if (rowCount <= 0 || columnOrder.length === 0) return cell;\r\n\r\n switch (target) {\r\n case 'rowStart':\r\n return { rowIndex: cell.rowIndex, colId: columnOrder[0] };\r\n case 'rowEnd':\r\n return {\r\n rowIndex: cell.rowIndex,\r\n colId: columnOrder[columnOrder.length - 1],\r\n };\r\n case 'gridFirst':\r\n return { rowIndex: 0, colId: columnOrder[0] };\r\n case 'gridLast':\r\n return {\r\n rowIndex: rowCount - 1,\r\n colId: columnOrder[columnOrder.length - 1],\r\n };\r\n default:\r\n return cell;\r\n }\r\n}\r\n\r\n/** Ctrl+Shift+Arrow — extend primary range from anchor to the grid edge. */\r\nexport function extendCellRangeToEdge(\r\n selection: CellRangeSelection,\r\n direction: ArrowDirection,\r\n bounds: CellRangeBounds,\r\n): CellRangeSelection {\r\n const anchor = selection.anchor ?? selection.focus;\r\n if (!anchor) return selection;\r\n\r\n const focus = selection.focus ?? anchor;\r\n let edgeFocus: CellAddress;\r\n\r\n switch (direction) {\r\n case 'up':\r\n edgeFocus = { rowIndex: 0, colId: focus.colId };\r\n break;\r\n case 'down':\r\n edgeFocus = {\r\n rowIndex: Math.max(0, bounds.rowCount - 1),\r\n colId: focus.colId,\r\n };\r\n break;\r\n case 'left':\r\n edgeFocus = {\r\n rowIndex: focus.rowIndex,\r\n colId: bounds.columnOrder[0] ?? focus.colId,\r\n };\r\n break;\r\n case 'right':\r\n edgeFocus = {\r\n rowIndex: focus.rowIndex,\r\n colId:\r\n bounds.columnOrder[bounds.columnOrder.length - 1] ?? focus.colId,\r\n };\r\n break;\r\n default:\r\n edgeFocus = focus;\r\n }\r\n\r\n const range = rangeFromAnchorFocus(anchor, edgeFocus, bounds);\r\n const keepOthers = selection.ranges.length > 1;\r\n return withPrimaryRange(selection, range, anchor, edgeFocus, keepOthers);\r\n}\r\n\r\n/** Ctrl+A — one range over the full grid body. */\r\nexport function selectAllCellRanges(\r\n bounds: CellRangeBounds,\r\n): CellRangeSelection {\r\n const { rowCount, columnOrder } = bounds;\r\n if (rowCount <= 0 || columnOrder.length === 0) {\r\n return createEmptyCellRangeSelection();\r\n }\r\n\r\n const range = normalizeCellRange(\r\n {\r\n startRow: 0,\r\n endRow: rowCount - 1,\r\n colIds: [...columnOrder],\r\n },\r\n bounds,\r\n );\r\n\r\n const anchor: CellAddress = {\r\n rowIndex: 0,\r\n colId: columnOrder[0],\r\n };\r\n const focus: CellAddress = {\r\n rowIndex: rowCount - 1,\r\n colId: columnOrder[columnOrder.length - 1],\r\n };\r\n\r\n return { ranges: [range], anchor, focus };\r\n}\r\n","import {\r\n isCellInRange,\r\n type CellAddress,\r\n type CellRange,\r\n} from './cellRange';\r\n\r\nexport type CellRangeEdgeFlags = {\r\n inRange: boolean;\r\n top: boolean;\r\n bottom: boolean;\r\n left: boolean;\r\n right: boolean;\r\n};\r\n\r\nconst EMPTY_FLAGS: CellRangeEdgeFlags = {\r\n inRange: false,\r\n top: false,\r\n bottom: false,\r\n left: false,\r\n right: false,\r\n};\r\n\r\n/** Which edges of a cell should show range chrome (PR-105). */\r\nexport function resolveCellRangePresentation(\r\n cell: CellAddress,\r\n ranges: readonly CellRange[],\r\n): CellRangeEdgeFlags {\r\n if (ranges.length === 0) return EMPTY_FLAGS;\r\n\r\n const flags: CellRangeEdgeFlags = { ...EMPTY_FLAGS, inRange: false };\r\n\r\n for (const range of ranges) {\r\n if (!isCellInRange(cell, range)) continue;\r\n flags.inRange = true;\r\n if (cell.rowIndex === range.startRow) flags.top = true;\r\n if (cell.rowIndex === range.endRow) flags.bottom = true;\r\n if (range.colIds.length > 0) {\r\n if (cell.colId === range.colIds[0]) flags.left = true;\r\n if (cell.colId === range.colIds[range.colIds.length - 1]) {\r\n flags.right = true;\r\n }\r\n }\r\n }\r\n\r\n return flags;\r\n}\r\n\r\nexport function cellRangeEdgeAttr(\r\n flags: CellRangeEdgeFlags,\r\n): string | undefined {\r\n if (!flags.inRange) return undefined;\r\n const parts: string[] = [];\r\n if (flags.top) parts.push('top');\r\n if (flags.bottom) parts.push('bottom');\r\n if (flags.left) parts.push('left');\r\n if (flags.right) parts.push('right');\r\n return parts.length > 0 ? parts.join(' ') : undefined;\r\n}\r\n\r\nexport function cellRangeClassName(flags: CellRangeEdgeFlags): string {\r\n if (!flags.inRange) return '';\r\n return 'pdg-cell-range';\r\n}\r\n","import type { FieldType } from '../../domain/types/ColumnSchema';\r\nimport { normalizeDigits } from './sortModel';\r\n\r\n/** Strip grouping separators and normalize Persian decimal (٫) to `.`. */\r\nexport function normalizePersianNumberText(text: string): string {\r\n let s = normalizeDigits(text.trim());\r\n s = s.replace(/[,٬\\s]/g, '');\r\n s = s.replace(/\\u066B/g, '.');\r\n return s;\r\n}\r\n\r\nexport function parseClipboardNumber(text: string): number | null {\r\n const normalized = normalizePersianNumberText(text);\r\n if (normalized === '') return null;\r\n const n = Number(normalized);\r\n return Number.isFinite(n) ? n : null;\r\n}\r\n\r\nexport function parseClipboardDate(text: string): string {\r\n return normalizeDigits(text.trim());\r\n}\r\n\r\nexport type CoercePastedCellResult =\r\n | { ok: true; value: unknown }\r\n | { ok: false; reason: string };\r\n\r\nexport function coercePastedCellValue(\r\n fieldType: FieldType | undefined,\r\n rawText: string,\r\n): CoercePastedCellResult {\r\n const trimmed = rawText.trim();\r\n if (trimmed === '') {\r\n return { ok: true, value: '' };\r\n }\r\n\r\n switch (fieldType) {\r\n case 'number':\r\n case 'price':\r\n case 'select':\r\n case 'selectOption': {\r\n const n = parseClipboardNumber(trimmed);\r\n if (n == null) {\r\n return { ok: false, reason: 'Expected number' };\r\n }\r\n return { ok: true, value: n };\r\n }\r\n case 'date':\r\n return { ok: true, value: parseClipboardDate(trimmed) };\r\n case 'checkbox': {\r\n const lower = normalizeDigits(trimmed).toLowerCase();\r\n if (['true', '1', 'yes', '✔'].includes(lower)) {\r\n return { ok: true, value: true };\r\n }\r\n if (['false', '0', 'no', '✘'].includes(lower)) {\r\n return { ok: true, value: false };\r\n }\r\n return { ok: false, reason: 'Expected boolean' };\r\n }\r\n default:\r\n return { ok: true, value: rawText };\r\n }\r\n}\r\n","/**\r\n * Pure fill-handle series + target builder (PR-108).\r\n */\r\n\r\nimport { normalizeDigits } from '../dataOps/sortModel';\r\nimport { parseClipboardNumber } from '../dataOps/cellValueCoercion';\r\nimport type { CellRange } from './cellRange';\r\nimport { colIndex } from './cellRange';\r\n\r\nexport type FillSeriesKind = 'number' | 'jalali' | 'copy';\r\n\r\nexport type FillTarget = {\r\n rowIndex: number;\r\n colId: string;\r\n rawText: string;\r\n};\r\n\r\nexport type FillCorner = {\r\n rowIndex: number;\r\n colId: string;\r\n colIndex: number;\r\n};\r\n\r\nconst JALALI_DATE_RE = /^(\\d{4})[/\\-](\\d{1,2})[/\\-](\\d{1,2})$/;\r\n\r\nfunction parseJalaliParts(text: string): { y: number; m: number; d: number } | null {\r\n const normalized = normalizeDigits(text.trim());\r\n const match = JALALI_DATE_RE.exec(normalized);\r\n if (!match) return null;\r\n const y = Number(match[1]);\r\n const m = Number(match[2]);\r\n const d = Number(match[3]);\r\n if (!Number.isFinite(y) || !Number.isFinite(m) || !Number.isFinite(d)) {\r\n return null;\r\n }\r\n if (m < 1 || m > 12 || d < 1 || d > 31) return null;\r\n return { y, m, d };\r\n}\r\n\r\nfunction formatJalali(y: number, m: number, d: number): string {\r\n const mm = String(m).padStart(2, '0');\r\n const dd = String(d).padStart(2, '0');\r\n return `${y}/${mm}/${dd}`;\r\n}\r\n\r\n/** Jalali month lengths (non-leap Esfand = 29). */\r\nfunction jalaliMonthLength(year: number, month: number): number {\r\n if (month >= 1 && month <= 6) return 31;\r\n if (month >= 7 && month <= 11) return 30;\r\n return isJalaliLeapYear(year) ? 30 : 29;\r\n}\r\n\r\nfunction isJalaliLeapYear(year: number): boolean {\r\n // 33-year cycle approximation (good enough for fill series).\r\n const mod = ((year + 2346) % 128) % 33;\r\n return [1, 5, 9, 13, 17, 22, 26, 30].includes(mod);\r\n}\r\n\r\nexport function addJalaliMonths(\r\n parts: { y: number; m: number; d: number },\r\n months: number,\r\n): { y: number; m: number; d: number } {\r\n let y = parts.y;\r\n let m = parts.m + months;\r\n while (m > 12) {\r\n m -= 12;\r\n y += 1;\r\n }\r\n while (m < 1) {\r\n m += 12;\r\n y -= 1;\r\n }\r\n const maxDay = jalaliMonthLength(y, m);\r\n const d = Math.min(parts.d, maxDay);\r\n return { y, m, d };\r\n}\r\n\r\nexport function detectFillSeries(\r\n values: readonly string[],\r\n): { kind: FillSeriesKind; numberStep?: number } {\r\n if (values.length === 0) return { kind: 'copy' };\r\n\r\n const jalali = values.map(parseJalaliParts);\r\n if (jalali.every((p) => p != null) && jalali.length >= 1) {\r\n if (jalali.length === 1) {\r\n return { kind: 'jalali' };\r\n }\r\n for (let i = 1; i < jalali.length; i += 1) {\r\n const prev = jalali[i - 1]!;\r\n const cur = jalali[i]!;\r\n const expected = addJalaliMonths(prev, 1);\r\n if (\r\n expected.y !== cur.y ||\r\n expected.m !== cur.m ||\r\n expected.d !== cur.d\r\n ) {\r\n return { kind: 'copy' };\r\n }\r\n }\r\n return { kind: 'jalali' };\r\n }\r\n\r\n const nums = values.map((v) => parseClipboardNumber(v));\r\n if (nums.every((n) => n != null)) {\r\n if (nums.length === 1) {\r\n return { kind: 'number', numberStep: 1 };\r\n }\r\n const step = nums[1]! - nums[0]!;\r\n for (let i = 2; i < nums.length; i += 1) {\r\n if (nums[i]! - nums[i - 1]! !== step) {\r\n return { kind: 'copy' };\r\n }\r\n }\r\n return { kind: 'number', numberStep: step };\r\n }\r\n\r\n return { kind: 'copy' };\r\n}\r\n\r\nexport function extendSeriesValue(\r\n kind: FillSeriesKind,\r\n sourceValues: readonly string[],\r\n offset: number,\r\n numberStep = 1,\r\n): string {\r\n if (offset <= 0) {\r\n return sourceValues[sourceValues.length - 1] ?? '';\r\n }\r\n\r\n if (kind === 'copy') {\r\n const idx = offset % sourceValues.length;\r\n return sourceValues[idx] ?? '';\r\n }\r\n\r\n if (kind === 'number') {\r\n const nums = sourceValues.map((v) => parseClipboardNumber(v) ?? 0);\r\n const base = nums[nums.length - 1] ?? 0;\r\n const step =\r\n nums.length >= 2\r\n ? (nums[nums.length - 1] ?? 0) - (nums[nums.length - 2] ?? 0)\r\n : numberStep;\r\n return String(base + step * offset);\r\n }\r\n\r\n const last = parseJalaliParts(sourceValues[sourceValues.length - 1] ?? '');\r\n if (!last) return sourceValues[sourceValues.length - 1] ?? '';\r\n const next = addJalaliMonths(last, offset);\r\n return formatJalali(next.y, next.m, next.d);\r\n}\r\n\r\nexport function resolveFillCorner(\r\n ranges: readonly CellRange[],\r\n columnOrder: readonly string[],\r\n): FillCorner | null {\r\n if (ranges.length === 0 || columnOrder.length === 0) return null;\r\n const range = ranges[0]!;\r\n const endRow = Math.max(range.startRow, range.endRow);\r\n const lastCol = range.colIds[range.colIds.length - 1];\r\n if (!lastCol) return null;\r\n const colIdx = colIndex(lastCol, columnOrder);\r\n if (colIdx < 0) return null;\r\n return { rowIndex: endRow, colId: lastCol, colIndex: colIdx };\r\n}\r\n\r\nexport function buildFillUpdates(input: {\r\n sourceRange: CellRange;\r\n extendToRowIndex: number;\r\n extendToColIndex: number;\r\n columnOrder: readonly string[];\r\n getSourceText: (rowIndex: number, colId: string) => string;\r\n copyOnly: boolean;\r\n}): FillTarget[] {\r\n const {\r\n sourceRange,\r\n extendToRowIndex,\r\n extendToColIndex,\r\n columnOrder,\r\n getSourceText,\r\n copyOnly,\r\n } = input;\r\n\r\n const startRow = Math.min(sourceRange.startRow, sourceRange.endRow);\r\n const endRow = Math.max(sourceRange.startRow, sourceRange.endRow);\r\n const colIds = sourceRange.colIds;\r\n if (colIds.length === 0) return [];\r\n\r\n const colStart = colIndex(colIds[0]!, columnOrder);\r\n const colEnd = colIndex(colIds[colIds.length - 1]!, columnOrder);\r\n if (colStart < 0 || colEnd < 0) return [];\r\n\r\n const rowDelta = extendToRowIndex - endRow;\r\n const colDelta = extendToColIndex - colEnd;\r\n if (rowDelta <= 0 && colDelta <= 0) return [];\r\n\r\n const destEndRow = Math.max(endRow, extendToRowIndex);\r\n const destEndCol = Math.max(colEnd, extendToColIndex);\r\n const targets: FillTarget[] = [];\r\n\r\n for (let r = startRow; r <= destEndRow; r += 1) {\r\n for (let c = colStart; c <= destEndCol; c += 1) {\r\n if (r >= startRow && r <= endRow && c >= colStart && c <= colEnd) {\r\n continue;\r\n }\r\n const colId = columnOrder[c];\r\n if (!colId) continue;\r\n\r\n const colValues: string[] = [];\r\n for (let sr = startRow; sr <= endRow; sr += 1) {\r\n colValues.push(getSourceText(sr, colId));\r\n }\r\n\r\n const rowValues: string[] = [];\r\n for (let sc = colStart; sc <= colEnd; sc += 1) {\r\n const cid = columnOrder[sc];\r\n if (cid) rowValues.push(getSourceText(r, cid));\r\n }\r\n\r\n let rawText: string;\r\n if (copyOnly) {\r\n const srcRow = startRow + ((r - startRow) % (endRow - startRow + 1));\r\n const srcCol =\r\n colStart + ((c - colStart) % (colEnd - colStart + 1));\r\n const srcColId = columnOrder[srcCol] ?? colId;\r\n rawText = getSourceText(srcRow, srcColId);\r\n } else if (r > endRow && c <= colEnd) {\r\n const series = detectFillSeries(colValues);\r\n rawText = extendSeriesValue(\r\n series.kind,\r\n colValues,\r\n r - endRow,\r\n series.numberStep,\r\n );\r\n } else if (c > colEnd && r <= endRow) {\r\n const series = detectFillSeries(rowValues);\r\n rawText = extendSeriesValue(\r\n series.kind,\r\n rowValues,\r\n c - colEnd,\r\n series.numberStep,\r\n );\r\n } else {\r\n const series = detectFillSeries(colValues);\r\n rawText = extendSeriesValue(\r\n series.kind,\r\n colValues,\r\n r - endRow,\r\n series.numberStep,\r\n );\r\n }\r\n\r\n targets.push({ rowIndex: r, colId, rawText });\r\n }\r\n }\r\n\r\n return targets;\r\n}\r\n","/**\r\n * Pure clipboard payload builder (PR-106).\r\n * No DOM — keyboard/UI wiring writes via infrastructure.\r\n */\r\n\r\nimport { normalizeDigits } from '../dataOps/sortModel';\r\nimport type { CellRange } from './cellRange';\r\n\r\nexport type ClipboardCellSnapshot = {\r\n value: unknown;\r\n display: string;\r\n};\r\n\r\nexport type ClipboardRowSnapshot = {\r\n id: number;\r\n cells: Record<string, ClipboardCellSnapshot | undefined>;\r\n /** Infinite/server placeholder row — skipped in clipboard output. */\r\n loading?: boolean;\r\n};\r\n\r\nexport type ClipboardColumnMeta = {\r\n id: string;\r\n header: string;\r\n};\r\n\r\nexport type ProcessCellForClipboardParams = {\r\n value: unknown;\r\n display: string;\r\n colId: string;\r\n rowIndex: number;\r\n rowId: number;\r\n};\r\n\r\nexport type ClipboardCopyBuildOptions = {\r\n /** When true, use formatted display strings (valueFormatter output). Default false. */\r\n copyFormattedValue?: boolean;\r\n /** Prepend a header row with column captions. Default false. */\r\n copyHeadersToClipboard?: boolean;\r\n /** Eastern digits → ASCII for Excel. Default true. */\r\n copyDigitsAsLatin?: boolean;\r\n processCellForClipboard?: (params: ProcessCellForClipboardParams) => string;\r\n};\r\n\r\nexport type ClipboardPayload = {\r\n plainText: string;\r\n html: string;\r\n ranges: readonly CellRange[];\r\n};\r\n\r\nfunction stringifyRawValue(value: unknown): string {\r\n if (value == null) return '';\r\n if (typeof value === 'string') return value;\r\n if (typeof value === 'number' || typeof value === 'boolean') {\r\n return String(value);\r\n }\r\n if (value instanceof Date) return value.toISOString();\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n}\r\n\r\nfunction maybeLatinDigits(text: string, copyDigitsAsLatin: boolean): string {\r\n return copyDigitsAsLatin ? normalizeDigits(text) : text;\r\n}\r\n\r\nfunction escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"');\r\n}\r\n\r\nfunction escapeTsvCell(text: string): string {\r\n if (/[\\t\\n\\r\"]/.test(text)) {\r\n return `\"${text.replace(/\"/g, '\"\"')}\"`;\r\n }\r\n return text;\r\n}\r\n\r\nfunction normalizeRowSpan(range: CellRange): {\r\n from: number;\r\n to: number;\r\n colIds: readonly string[];\r\n} {\r\n const from = Math.min(range.startRow, range.endRow);\r\n const to = Math.max(range.startRow, range.endRow);\r\n return { from, to, colIds: range.colIds };\r\n}\r\n\r\nexport function resolveCopyRanges(\r\n ranges: readonly CellRange[],\r\n activeCell: { rowIndex: number; colId: string } | null | undefined,\r\n): CellRange[] {\r\n if (ranges.length > 0) return [...ranges];\r\n if (activeCell?.colId) {\r\n return [\r\n {\r\n startRow: activeCell.rowIndex,\r\n endRow: activeCell.rowIndex,\r\n colIds: [activeCell.colId],\r\n },\r\n ];\r\n }\r\n return [];\r\n}\r\n\r\nfunction resolveCellText(\r\n row: ClipboardRowSnapshot,\r\n colId: string,\r\n rowIndex: number,\r\n options: ClipboardCopyBuildOptions & {\r\n copyFormattedValue: boolean;\r\n copyDigitsAsLatin: boolean;\r\n },\r\n): string {\r\n if (row.loading) return '';\r\n const cell = row.cells[colId];\r\n const raw = cell?.value;\r\n const display = cell?.display ?? stringifyRawValue(raw);\r\n let text = options.copyFormattedValue\r\n ? display\r\n : stringifyRawValue(raw);\r\n if (options.processCellForClipboard) {\r\n text = options.processCellForClipboard({\r\n value: raw,\r\n display,\r\n colId,\r\n rowIndex,\r\n rowId: row.id,\r\n });\r\n }\r\n return maybeLatinDigits(text, options.copyDigitsAsLatin);\r\n}\r\n\r\nexport function buildClipboardPayload(input: {\r\n ranges: readonly CellRange[];\r\n rows: readonly ClipboardRowSnapshot[];\r\n columns: readonly ClipboardColumnMeta[];\r\n activeCell?: { rowIndex: number; colId: string } | null;\r\n options?: ClipboardCopyBuildOptions;\r\n}): ClipboardPayload | null {\r\n const opts = input.options ?? {};\r\n const copyFormattedValue = opts.copyFormattedValue ?? false;\r\n const copyHeadersToClipboard = opts.copyHeadersToClipboard ?? false;\r\n const copyDigitsAsLatin = opts.copyDigitsAsLatin !== false;\r\n\r\n const resolvedRanges = resolveCopyRanges(input.ranges, input.activeCell);\r\n if (resolvedRanges.length === 0 || input.rows.length === 0) return null;\r\n\r\n const headerByCol = new Map(input.columns.map((c) => [c.id, c.header]));\r\n const cellOpts = { ...opts, copyFormattedValue, copyDigitsAsLatin };\r\n\r\n const plainBlocks: string[] = [];\r\n const htmlTables: string[] = [];\r\n\r\n for (const range of resolvedRanges) {\r\n const { from, to, colIds } = normalizeRowSpan(range);\r\n if (colIds.length === 0) continue;\r\n\r\n const plainRows: string[] = [];\r\n const htmlRows: string[] = [];\r\n\r\n if (copyHeadersToClipboard) {\r\n plainRows.push(\r\n colIds\r\n .map((colId) => {\r\n const header = headerByCol.get(colId) ?? colId;\r\n return escapeTsvCell(maybeLatinDigits(header, copyDigitsAsLatin));\r\n })\r\n .join('\\t'),\r\n );\r\n htmlRows.push(\r\n `<tr>${colIds\r\n .map((colId) => {\r\n const header = headerByCol.get(colId) ?? colId;\r\n return `<th>${escapeHtml(maybeLatinDigits(header, copyDigitsAsLatin))}</th>`;\r\n })\r\n .join('')}</tr>`,\r\n );\r\n }\r\n\r\n for (let rowIndex = from; rowIndex <= to; rowIndex += 1) {\r\n const row = input.rows[rowIndex];\r\n if (!row || row.loading) continue;\r\n plainRows.push(\r\n colIds\r\n .map((colId) =>\r\n escapeTsvCell(resolveCellText(row, colId, rowIndex, cellOpts)),\r\n )\r\n .join('\\t'),\r\n );\r\n htmlRows.push(\r\n `<tr>${colIds\r\n .map((colId) => {\r\n const text = resolveCellText(row, colId, rowIndex, cellOpts);\r\n return `<td>${escapeHtml(text)}</td>`;\r\n })\r\n .join('')}</tr>`,\r\n );\r\n }\r\n\r\n if (plainRows.length === 0) continue;\r\n plainBlocks.push(plainRows.join('\\n'));\r\n htmlTables.push(`<table><tbody>${htmlRows.join('')}</tbody></table>`);\r\n }\r\n\r\n if (plainBlocks.length === 0) return null;\r\n\r\n const tablesHtml = htmlTables.join('');\r\n return {\r\n plainText: plainBlocks.join('\\n\\n'),\r\n html: `<html><body><!--StartFragment-->${tablesHtml}<!--EndFragment--></body></html>`,\r\n ranges: resolvedRanges,\r\n };\r\n}\r\n","/**\r\n * Pure clipboard paste parse + target tiling (PR-107).\r\n * No DOM / React.\r\n */\r\n\r\nimport type { CellRange } from './cellRange';\r\nimport { resolveCopyRanges } from './clipboardCopy';\r\n\r\nexport type PasteTarget = {\r\n rowIndex: number;\r\n colId: string;\r\n rawText: string;\r\n};\r\n\r\nexport type SkippedPasteTarget = PasteTarget & {\r\n reason: string;\r\n};\r\n\r\nexport type PasteColumnMeta = {\r\n id: string;\r\n editable?: boolean;\r\n /** Skip paste into index chrome columns by default. */\r\n fieldType?: string;\r\n};\r\n\r\nexport type BuildPastePlanInput = {\r\n text: string;\r\n ranges: readonly CellRange[];\r\n activeCell?: { rowIndex: number; colId: string } | null;\r\n columnOrder: readonly string[];\r\n columns: readonly PasteColumnMeta[];\r\n pasteAddsRows?: boolean;\r\n rowCount: number;\r\n};\r\n\r\nexport type PastePlan = {\r\n matrix: readonly (readonly string[])[];\r\n targets: readonly PasteTarget[];\r\n skipped: readonly SkippedPasteTarget[];\r\n rowsToAdd: number;\r\n};\r\n\r\nfunction detectDelimiter(text: string): string {\r\n if (text.includes('\\t')) return '\\t';\r\n if (text.includes(',')) return ',';\r\n return '\\t';\r\n}\r\n\r\n/**\r\n * Parse TSV/CSV including quoted fields and embedded newlines.\r\n */\r\nexport function parseDelimitedClipboardText(\r\n text: string,\r\n delimiter = detectDelimiter(text),\r\n): string[][] {\r\n const rows: string[][] = [];\r\n let row: string[] = [];\r\n let field = '';\r\n let inQuotes = false;\r\n\r\n for (let i = 0; i < text.length; i += 1) {\r\n const ch = text[i]!;\r\n if (inQuotes) {\r\n if (ch === '\"') {\r\n if (text[i + 1] === '\"') {\r\n field += '\"';\r\n i += 1;\r\n } else {\r\n inQuotes = false;\r\n }\r\n } else {\r\n field += ch;\r\n }\r\n continue;\r\n }\r\n\r\n if (ch === '\"') {\r\n inQuotes = true;\r\n } else if (ch === delimiter) {\r\n row.push(field);\r\n field = '';\r\n } else if (ch === '\\r') {\r\n // skip\r\n } else if (ch === '\\n') {\r\n row.push(field);\r\n if (row.length > 1 || row[0] !== '') {\r\n rows.push(row);\r\n }\r\n row = [];\r\n field = '';\r\n } else {\r\n field += ch;\r\n }\r\n }\r\n\r\n row.push(field);\r\n if (row.length > 1 || row[0] !== '') {\r\n rows.push(row);\r\n }\r\n\r\n return rows;\r\n}\r\n\r\nfunction resolvePasteOrigin(\r\n ranges: readonly CellRange[],\r\n activeCell: { rowIndex: number; colId: string } | null | undefined,\r\n columnOrder: readonly string[],\r\n): { rowIndex: number; colIndex: number } | null {\r\n const resolved = resolveCopyRanges(ranges, activeCell);\r\n if (resolved.length === 0) return null;\r\n\r\n const range = resolved[0]!;\r\n const rowIndex = Math.min(range.startRow, range.endRow);\r\n const firstCol = range.colIds[0];\r\n if (!firstCol) return null;\r\n const colIndex = columnOrder.indexOf(firstCol);\r\n if (colIndex < 0) return null;\r\n return { rowIndex, colIndex };\r\n}\r\n\r\nfunction isPasteableColumn(col: PasteColumnMeta | undefined): boolean {\r\n if (!col) return false;\r\n if (col.editable === false) return false;\r\n if (col.fieldType === 'index') return false;\r\n return true;\r\n}\r\n\r\nexport function buildPastePlan(input: BuildPastePlanInput): PastePlan | null {\r\n const trimmed = input.text.replace(/^\\uFEFF/, '').trimEnd();\r\n if (!trimmed) return null;\r\n\r\n const matrix = parseDelimitedClipboardText(trimmed);\r\n if (matrix.length === 0) return null;\r\n\r\n const origin = resolvePasteOrigin(\r\n input.ranges,\r\n input.activeCell,\r\n input.columnOrder,\r\n );\r\n if (!origin) return null;\r\n\r\n const columnById = new Map(input.columns.map((c) => [c.id, c]));\r\n const targets: PasteTarget[] = [];\r\n const skipped: SkippedPasteTarget[] = [];\r\n\r\n let maxRowIndex = origin.rowIndex;\r\n\r\n for (let r = 0; r < matrix.length; r += 1) {\r\n const line = matrix[r] ?? [];\r\n for (let c = 0; c < line.length; c += 1) {\r\n const colIndex = origin.colIndex + c;\r\n if (colIndex >= input.columnOrder.length) continue;\r\n const colId = input.columnOrder[colIndex]!;\r\n const rowIndex = origin.rowIndex + r;\r\n maxRowIndex = Math.max(maxRowIndex, rowIndex);\r\n const rawText = line[c] ?? '';\r\n const meta = columnById.get(colId);\r\n const target: PasteTarget = { rowIndex, colId, rawText };\r\n if (!isPasteableColumn(meta)) {\r\n skipped.push({ ...target, reason: 'not_editable' });\r\n continue;\r\n }\r\n targets.push(target);\r\n }\r\n }\r\n\r\n const pasteAddsRows = input.pasteAddsRows !== false;\r\n const rowsToAdd =\r\n pasteAddsRows && maxRowIndex >= input.rowCount\r\n ? maxRowIndex - input.rowCount + 1\r\n : 0;\r\n\r\n return { matrix, targets, skipped, rowsToAdd };\r\n}\r\n","/**\r\n * Pure cut helpers (PR-109): clear targets for selected ranges.\r\n */\r\n\r\nimport type { CellRange } from './cellRange';\r\n\r\nexport type CutColumnMeta = {\r\n id: string;\r\n editable?: boolean;\r\n fieldType?: string;\r\n hidden?: boolean;\r\n};\r\n\r\nexport type CutClearTarget = {\r\n rowIndex: number;\r\n colId: string;\r\n rawText: '';\r\n};\r\n\r\nexport function buildCutClearTargets(\r\n ranges: readonly CellRange[],\r\n columns: readonly CutColumnMeta[],\r\n): CutClearTarget[] {\r\n const editableIds = new Set(\r\n columns\r\n .filter(\r\n (col) =>\r\n !col.hidden &&\r\n col.editable !== false &&\r\n col.fieldType !== 'index' &&\r\n col.fieldType !== 'static',\r\n )\r\n .map((col) => col.id),\r\n );\r\n\r\n const seen = new Set<string>();\r\n const targets: CutClearTarget[] = [];\r\n\r\n for (const range of ranges) {\r\n for (let rowIndex = range.startRow; rowIndex <= range.endRow; rowIndex += 1) {\r\n for (const colId of range.colIds) {\r\n if (!editableIds.has(colId)) continue;\r\n const key = `${rowIndex}:${colId}`;\r\n if (seen.has(key)) continue;\r\n seen.add(key);\r\n targets.push({ rowIndex, colId, rawText: '' });\r\n }\r\n }\r\n }\r\n\r\n return targets;\r\n}\r\n","import type { CellRange } from '../../engine/selection/cellRange';\r\nimport {\r\n buildClipboardPayload,\r\n type ClipboardCopyBuildOptions,\r\n type ClipboardPayload,\r\n} from '../../engine/selection/clipboardCopy';\r\nimport { buildCutClearTargets } from '../../engine/selection/clipboardCut';\r\nimport { buildPastePlan } from '../../engine/selection/clipboardPaste';\r\nimport type { TableEngine } from '../../engine/tableEngine';\r\n\r\nexport type ClipboardCopyEvent = {\r\n plainText: string;\r\n html: string;\r\n ranges: readonly CellRange[];\r\n};\r\n\r\nexport type ClipboardPasteEvent = {\r\n text: string;\r\n applied: number;\r\n skipped: number;\r\n rowsAdded: number;\r\n};\r\n\r\nexport type GridPasteRuntimeOptions = {\r\n /** When true (default), paste past the last row adds empty rows. */\r\n pasteAddsRows?: boolean;\r\n onClipboardPaste?: (event: ClipboardPasteEvent) => boolean | void;\r\n};\r\n\r\nexport type GridClipboardRuntimeOptions = ClipboardCopyBuildOptions &\r\n GridPasteRuntimeOptions & {\r\n onClipboardCopy?: (event: ClipboardCopyEvent) => boolean | void;\r\n };\r\n\r\nexport const DEFAULT_GRID_PASTE_OPTIONS: GridPasteRuntimeOptions = {\r\n pasteAddsRows: true,\r\n};\r\n\r\nexport const DEFAULT_GRID_CLIPBOARD_OPTIONS: GridClipboardRuntimeOptions = {\r\n copyFormattedValue: false,\r\n copyHeadersToClipboard: false,\r\n copyDigitsAsLatin: true,\r\n pasteAddsRows: true,\r\n};\r\n\r\nexport type PasteGridResult = {\r\n applied: number;\r\n skipped: number;\r\n rowsAdded: number;\r\n};\r\n\r\nexport async function writeSystemClipboard(\r\n payload: Pick<ClipboardPayload, 'plainText' | 'html'>,\r\n): Promise<void> {\r\n if (\r\n typeof navigator !== 'undefined' &&\r\n navigator.clipboard &&\r\n typeof navigator.clipboard.write === 'function' &&\r\n typeof ClipboardItem !== 'undefined'\r\n ) {\r\n await navigator.clipboard.write([\r\n new ClipboardItem({\r\n 'text/plain': new Blob([payload.plainText], { type: 'text/plain' }),\r\n 'text/html': new Blob([payload.html], { type: 'text/html' }),\r\n }),\r\n ]);\r\n return;\r\n }\r\n\r\n if (typeof document === 'undefined') return;\r\n\r\n const textarea = document.createElement('textarea');\r\n textarea.value = payload.plainText;\r\n textarea.setAttribute('readonly', 'true');\r\n textarea.style.position = 'fixed';\r\n textarea.style.left = '-9999px';\r\n document.body.appendChild(textarea);\r\n textarea.select();\r\n try {\r\n document.execCommand('copy');\r\n } finally {\r\n document.body.removeChild(textarea);\r\n }\r\n}\r\n\r\nexport async function copyGridSelectionToClipboard(\r\n engine: TableEngine,\r\n options: GridClipboardRuntimeOptions = DEFAULT_GRID_CLIPBOARD_OPTIONS,\r\n): Promise<boolean> {\r\n const view = engine.getViewState();\r\n const uiRows = engine.getAllUIRows();\r\n if (!view || !uiRows || uiRows.length === 0) return false;\r\n\r\n const active = view.activeCell;\r\n const activeCell =\r\n active?.rowId != null && active.columnId\r\n ? {\r\n rowIndex: engine.getUiRowAbsoluteIndex(active.rowId),\r\n colId: active.columnId,\r\n }\r\n : null;\r\n\r\n const payload = buildClipboardPayload({\r\n ranges: engine.getCellRanges(),\r\n rows: uiRows.map((row) => ({\r\n id: row.id,\r\n loading: row.loading,\r\n cells: Object.fromEntries(\r\n Object.entries(row.cells).map(([colId, cell]) => [\r\n colId,\r\n {\r\n value: cell.value,\r\n display: String(cell.display ?? cell.value ?? ''),\r\n },\r\n ]),\r\n ),\r\n })),\r\n columns: view.columns.map((col) => ({\r\n id: col.fieldName,\r\n header: col.fieldCaption,\r\n })),\r\n activeCell:\r\n activeCell && activeCell.rowIndex >= 0 ? activeCell : null,\r\n options,\r\n });\r\n\r\n if (!payload) return false;\r\n\r\n if (options.onClipboardCopy) {\r\n const allow = options.onClipboardCopy({\r\n plainText: payload.plainText,\r\n html: payload.html,\r\n ranges: payload.ranges,\r\n });\r\n if (allow === false) return false;\r\n }\r\n\r\n await writeSystemClipboard(payload);\r\n return true;\r\n}\r\n\r\nexport async function cutGridSelectionToClipboard(\r\n engine: TableEngine,\r\n store: string,\r\n tableKey: string,\r\n options: GridClipboardRuntimeOptions = DEFAULT_GRID_CLIPBOARD_OPTIONS,\r\n): Promise<boolean> {\r\n const copied = await copyGridSelectionToClipboard(engine, options);\r\n if (!copied) return false;\r\n\r\n const view = engine.getViewState();\r\n if (!view) return false;\r\n\r\n const targets = buildCutClearTargets(\r\n engine.getCellRanges(),\r\n view.columns.map((col) => ({\r\n id: col.fieldName,\r\n editable: col.editable,\r\n fieldType: col.fieldType,\r\n hidden: col.hidden,\r\n })),\r\n );\r\n if (targets.length === 0) return true;\r\n\r\n const correlationId = createPasteCorrelationId();\r\n await applyCellTextUpdates(engine, store, tableKey, targets, {\r\n correlationId,\r\n pasteAddsRows: false,\r\n });\r\n return true;\r\n}\r\n\r\nexport async function readSystemClipboardText(): Promise<string> {\r\n if (\r\n typeof navigator !== 'undefined' &&\r\n navigator.clipboard &&\r\n typeof navigator.clipboard.readText === 'function'\r\n ) {\r\n return navigator.clipboard.readText();\r\n }\r\n return '';\r\n}\r\n\r\nexport function createPasteCorrelationId(): string {\r\n return `paste-cells-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\r\n}\r\n\r\nexport async function applyCellTextUpdates(\r\n engine: TableEngine,\r\n store: string,\r\n tableKey: string,\r\n targets: readonly { rowIndex: number; colId: string; rawText: string }[],\r\n options: {\r\n pasteAddsRows?: boolean;\r\n rowsToAdd?: number;\r\n correlationId?: string;\r\n } = {},\r\n): Promise<PasteGridResult> {\r\n const empty: PasteGridResult = { applied: 0, skipped: 0, rowsAdded: 0 };\r\n if (targets.length === 0) return empty;\r\n\r\n const correlationId = options.correlationId ?? createPasteCorrelationId();\r\n const rowCount = engine.getUiRowCount();\r\n const maxRow = targets.reduce((m, t) => Math.max(m, t.rowIndex), -1);\r\n const rowsToAdd =\r\n options.rowsToAdd ??\r\n (options.pasteAddsRows !== false && maxRow >= rowCount\r\n ? maxRow - rowCount + 1\r\n : 0);\r\n\r\n let rowsAdded = 0;\r\n for (let i = 0; i < rowsToAdd; i += 1) {\r\n await engine.dispatch({\r\n type: 'ADD_EMPTY_ROW',\r\n store,\r\n tableKey,\r\n autoActivate: false,\r\n correlationId,\r\n });\r\n rowsAdded += 1;\r\n }\r\n\r\n const rowIds = engine.getUiRowIndex().getOrderedIds();\r\n const updates = targets\r\n .map((target) => {\r\n const rowId = rowIds[target.rowIndex];\r\n if (rowId === undefined) return null;\r\n return {\r\n rowId,\r\n columnId: target.colId,\r\n rawText: target.rawText,\r\n };\r\n })\r\n .filter((item): item is NonNullable<typeof item> => item != null);\r\n\r\n if (updates.length === 0) {\r\n return { applied: 0, skipped: 0, rowsAdded };\r\n }\r\n\r\n await engine.dispatch({\r\n type: 'PASTE_CELLS',\r\n store,\r\n tableKey,\r\n updates,\r\n correlationId,\r\n });\r\n\r\n return { applied: updates.length, skipped: 0, rowsAdded };\r\n}\r\n\r\nexport async function pasteGridFromClipboard(\r\n engine: TableEngine,\r\n store: string,\r\n tableKey: string,\r\n options: GridClipboardRuntimeOptions = DEFAULT_GRID_CLIPBOARD_OPTIONS,\r\n): Promise<PasteGridResult> {\r\n const empty: PasteGridResult = { applied: 0, skipped: 0, rowsAdded: 0 };\r\n const view = engine.getViewState();\r\n if (!view) return empty;\r\n\r\n const text = await readSystemClipboardText();\r\n if (!text.trim()) return empty;\r\n\r\n const columnOrder = view.columns\r\n .filter((col) => !col.hidden)\r\n .map((col) => col.fieldName);\r\n\r\n const active = view.activeCell;\r\n const activeCell =\r\n active?.rowId != null && active.columnId\r\n ? {\r\n rowIndex: engine.getUiRowAbsoluteIndex(active.rowId),\r\n colId: active.columnId,\r\n }\r\n : null;\r\n\r\n const plan = buildPastePlan({\r\n text,\r\n ranges: engine.getCellRanges(),\r\n activeCell:\r\n activeCell && activeCell.rowIndex >= 0 ? activeCell : null,\r\n columnOrder,\r\n columns: view.columns.map((col) => ({\r\n id: col.fieldName,\r\n editable: col.editable,\r\n fieldType: col.fieldType,\r\n })),\r\n pasteAddsRows: options.pasteAddsRows,\r\n rowCount: engine.getUiRowCount(),\r\n });\r\n\r\n if (!plan || plan.targets.length === 0) {\r\n return { ...empty, skipped: plan?.skipped.length ?? 0 };\r\n }\r\n\r\n const preview: PasteGridResult = {\r\n applied: plan.targets.length,\r\n skipped: plan.skipped.length,\r\n rowsAdded: plan.rowsToAdd,\r\n };\r\n\r\n if (options.onClipboardPaste) {\r\n const allow = options.onClipboardPaste({\r\n text,\r\n applied: preview.applied,\r\n skipped: preview.skipped,\r\n rowsAdded: preview.rowsAdded,\r\n });\r\n if (allow === false) return empty;\r\n }\r\n\r\n const result = await applyCellTextUpdates(\r\n engine,\r\n store,\r\n tableKey,\r\n plan.targets,\r\n { rowsToAdd: plan.rowsToAdd, pasteAddsRows: options.pasteAddsRows },\r\n );\r\n\r\n return {\r\n applied: result.applied,\r\n skipped: plan.skipped.length,\r\n rowsAdded: result.rowsAdded,\r\n };\r\n}\r\n","import { buildFillUpdates } from '../../engine/selection/fillHandle';\r\nimport type { CellRange } from '../../engine/selection/cellRange';\r\nimport type { TableEngine } from '../../engine/tableEngine';\r\nimport {\r\n applyCellTextUpdates,\r\n type GridClipboardRuntimeOptions,\r\n type PasteGridResult,\r\n} from './gridClipboard';\r\n\r\nexport async function applyFillHandleDrag(\r\n engine: TableEngine,\r\n store: string,\r\n tableKey: string,\r\n extendTo: { rowIndex: number; colIndex: number },\r\n copyOnly: boolean,\r\n options: GridClipboardRuntimeOptions = {},\r\n): Promise<PasteGridResult> {\r\n const empty: PasteGridResult = { applied: 0, skipped: 0, rowsAdded: 0 };\r\n const view = engine.getViewState();\r\n const uiRows = engine.getAllUIRows();\r\n if (!view || !uiRows) return empty;\r\n\r\n const ranges = engine.getCellRanges();\r\n const sourceRange = ranges[0];\r\n if (!sourceRange) return empty;\r\n\r\n const columnOrder = view.columns\r\n .filter((col) => !col.hidden)\r\n .map((col) => col.fieldName);\r\n\r\n const editableCols = new Set(\r\n view.columns\r\n .filter(\r\n (col) =>\r\n col.editable !== false &&\r\n col.fieldType !== 'index' &&\r\n !col.hidden,\r\n )\r\n .map((col) => col.fieldName),\r\n );\r\n\r\n const getSourceText = (rowIndex: number, colId: string): string => {\r\n const row = uiRows[rowIndex];\r\n if (!row) return '';\r\n const cell = row.cells[colId];\r\n if (cell?.value != null && cell.value !== '') {\r\n return String(cell.value);\r\n }\r\n return String(cell?.display ?? '');\r\n };\r\n\r\n const targets = buildFillUpdates({\r\n sourceRange,\r\n extendToRowIndex: extendTo.rowIndex,\r\n extendToColIndex: extendTo.colIndex,\r\n columnOrder,\r\n getSourceText,\r\n copyOnly,\r\n }).filter((t) => editableCols.has(t.colId));\r\n\r\n if (targets.length === 0) return empty;\r\n\r\n const maxRow = targets.reduce((m, t) => Math.max(m, t.rowIndex), -1);\r\n const rowsToAdd =\r\n options.pasteAddsRows !== false && maxRow >= engine.getUiRowCount()\r\n ? maxRow - engine.getUiRowCount() + 1\r\n : 0;\r\n\r\n return applyCellTextUpdates(engine, store, tableKey, targets, {\r\n pasteAddsRows: options.pasteAddsRows,\r\n rowsToAdd,\r\n });\r\n}\r\n\r\nexport function resolveCellAddressFromPoint(\r\n clientX: number,\r\n clientY: number,\r\n): { rowIndex: number; colId: string; colIndex: number } | null {\r\n if (typeof document === 'undefined') return null;\r\n const el = document\r\n .elementFromPoint(clientX, clientY)\r\n ?.closest('[data-columnid][data-pdg-row-index]') as HTMLElement | null;\r\n if (!el) return null;\r\n const rowIndex = Number(el.dataset.pdgRowIndex);\r\n const colId = el.dataset.columnid;\r\n const colIndex = Number(el.dataset.pdgColIndex);\r\n if (!Number.isFinite(rowIndex) || !colId) return null;\r\n return {\r\n rowIndex,\r\n colId,\r\n colIndex: Number.isFinite(colIndex) ? colIndex : 0,\r\n };\r\n}\r\n\r\nexport type { CellRange };\r\n","import { isBlankSortValue, normalizeDigits } from './sortModel';\r\n\r\n/**\r\n * Column filter model (PR-92). Wired to the row index in PR-94.\r\n * Keys are `colId` / field names. Empty model ⇒ all rows pass.\r\n */\r\nexport type FilterModel = Readonly<Record<string, ColumnFilter>>;\r\n\r\nexport type FilterJoin = 'AND' | 'OR';\r\n\r\nexport type TextFilterOp =\r\n | 'contains'\r\n | 'notContains'\r\n | 'equals'\r\n | 'startsWith'\r\n | 'endsWith'\r\n | 'blank'\r\n | 'notBlank';\r\n\r\n/** Number ops: = ≠ < ≤ > ≥ inRange blank */\r\nexport type NumberFilterOp =\r\n | 'equals'\r\n | 'notEqual'\r\n | '='\r\n | '≠'\r\n | '!='\r\n | 'lessThan'\r\n | '<'\r\n | 'lessThanOrEqual'\r\n | '≤'\r\n | '<='\r\n | 'greaterThan'\r\n | '>'\r\n | 'greaterThanOrEqual'\r\n | '≥'\r\n | '>='\r\n | 'inRange'\r\n | 'blank';\r\n\r\nexport type DateFilterOp =\r\n | 'equals'\r\n | 'before'\r\n | 'after'\r\n | 'inRange'\r\n | 'blank';\r\n\r\nexport type SetFilterOp = 'in' | 'notIn';\r\n\r\nexport type BooleanFilterOp = 'true' | 'false' | 'any';\r\n\r\nexport type TextColumnFilter = {\r\n filterType: 'text';\r\n type: TextFilterOp;\r\n filter?: string | number | null;\r\n};\r\n\r\nexport type NumberColumnFilter = {\r\n filterType: 'number';\r\n type: NumberFilterOp;\r\n filter?: number | string | null;\r\n filterTo?: number | string | null;\r\n};\r\n\r\nexport type DateColumnFilter = {\r\n filterType: 'date';\r\n type: DateFilterOp;\r\n /** Inclusive lower / equals bound (Date, epoch ms, or date string). */\r\n dateFrom?: unknown;\r\n dateTo?: unknown;\r\n filter?: unknown;\r\n filterTo?: unknown;\r\n};\r\n\r\nexport type SetColumnFilter = {\r\n filterType: 'set';\r\n type?: SetFilterOp;\r\n values: readonly unknown[];\r\n};\r\n\r\nexport type BooleanColumnFilter = {\r\n filterType: 'boolean';\r\n type: BooleanFilterOp;\r\n};\r\n\r\n/**\r\n * Host / ColumnDef custom predicate. `rowId` is the engine row id;\r\n * hosts that need the row object look it up themselves.\r\n */\r\nexport type CustomFilterFn = (value: unknown, rowId: number) => boolean;\r\n\r\nexport type CustomColumnFilter = {\r\n filterType: 'custom';\r\n /** Registry key when applied from a FilterComponent (PR-95). */\r\n type?: string;\r\n params?: Record<string, unknown>;\r\n customFilter: CustomFilterFn;\r\n};\r\n\r\nexport type SimpleColumnFilter =\r\n | TextColumnFilter\r\n | NumberColumnFilter\r\n | DateColumnFilter\r\n | SetColumnFilter\r\n | BooleanColumnFilter\r\n | CustomColumnFilter;\r\n\r\n/** AND / OR of simple conditions on one column (PR-92). */\r\nexport type CombinedColumnFilter = {\r\n operator: FilterJoin;\r\n conditions: readonly SimpleColumnFilter[];\r\n};\r\n\r\nexport type ColumnFilter = SimpleColumnFilter | CombinedColumnFilter;\r\n\r\nexport type FilterAccessor = {\r\n getValue: (rowId: number, colId: string) => unknown;\r\n /**\r\n * Optional per-column custom filter when the model uses\r\n * `{ filterType: 'custom' }` without an inline `customFilter`.\r\n */\r\n getCustomFilter?: (colId: string) => CustomFilterFn | undefined;\r\n};\r\n\r\nconst ARABIC_YEH = /\\u064A/g; // ي\r\nconst ARABIC_KAF = /\\u0643/g; // ك\r\nconst PERSIAN_YEH = '\\u06CC'; // ی\r\nconst PERSIAN_KAF = '\\u06A9'; // ک\r\n\r\n/** Digits + Arabic ي/ك → Latin digits + Persian ی/ک for text compare. */\r\nexport function normalizeFilterText(value: string): string {\r\n return normalizeDigits(value)\r\n .replace(ARABIC_YEH, PERSIAN_YEH)\r\n .replace(ARABIC_KAF, PERSIAN_KAF);\r\n}\r\n\r\nfunction isCombined(filter: ColumnFilter): filter is CombinedColumnFilter {\r\n return (\r\n typeof filter === 'object' &&\r\n filter !== null &&\r\n 'operator' in filter &&\r\n 'conditions' in filter &&\r\n !('filterType' in filter)\r\n );\r\n}\r\n\r\nfunction isBlank(value: unknown): boolean {\r\n return isBlankSortValue(value);\r\n}\r\n\r\nfunction toNumber(value: unknown): number | null {\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : null;\r\n }\r\n if (typeof value === 'boolean') return value ? 1 : 0;\r\n if (typeof value === 'string') {\r\n const trimmed = normalizeDigits(value).replace(/,/g, '').trim();\r\n if (!trimmed) return null;\r\n const n = Number(trimmed);\r\n return Number.isFinite(n) ? n : null;\r\n }\r\n return null;\r\n}\r\n\r\nfunction toDateKey(value: unknown): number | null {\r\n if (value instanceof Date) {\r\n const t = value.getTime();\r\n return Number.isNaN(t) ? null : t;\r\n }\r\n if (typeof value === 'number' && Number.isFinite(value)) return value;\r\n if (typeof value === 'string') {\r\n const text = normalizeDigits(value).trim();\r\n if (!text) return null;\r\n const parsed = Date.parse(text);\r\n if (!Number.isNaN(parsed)) return parsed;\r\n const digits = text.replace(/\\D/g, '');\r\n if (digits.length >= 8) return Number(digits.slice(0, 8));\r\n }\r\n return null;\r\n}\r\n\r\nfunction toBoolean(value: unknown): boolean | null {\r\n if (typeof value === 'boolean') return value;\r\n if (value === 1 || value === '1' || value === 'true' || value === 'TRUE') {\r\n return true;\r\n }\r\n if (value === 0 || value === '0' || value === 'false' || value === 'FALSE') {\r\n return false;\r\n }\r\n return null;\r\n}\r\n\r\nfunction textNeedle(filter: TextColumnFilter): string {\r\n if (filter.filter == null) return '';\r\n return normalizeFilterText(String(filter.filter)).toLocaleLowerCase('fa');\r\n}\r\n\r\nfunction textHaystack(value: unknown): string {\r\n if (isBlank(value)) return '';\r\n return normalizeFilterText(String(value)).toLocaleLowerCase('fa');\r\n}\r\n\r\nfunction matchText(value: unknown, filter: TextColumnFilter): boolean {\r\n const op = filter.type;\r\n if (op === 'blank') return isBlank(value);\r\n if (op === 'notBlank') return !isBlank(value);\r\n\r\n const hay = textHaystack(value);\r\n const needle = textNeedle(filter);\r\n\r\n switch (op) {\r\n case 'contains':\r\n return needle.length === 0 ? true : hay.includes(needle);\r\n case 'notContains':\r\n return needle.length === 0 ? true : !hay.includes(needle);\r\n case 'equals':\r\n return hay === needle;\r\n case 'startsWith':\r\n return needle.length === 0 ? true : hay.startsWith(needle);\r\n case 'endsWith':\r\n return needle.length === 0 ? true : hay.endsWith(needle);\r\n default:\r\n return true;\r\n }\r\n}\r\n\r\nfunction normalizeNumberOp(op: NumberFilterOp): NumberFilterOp {\r\n switch (op) {\r\n case '=':\r\n return 'equals';\r\n case '≠':\r\n case '!=':\r\n return 'notEqual';\r\n case '<':\r\n return 'lessThan';\r\n case '≤':\r\n case '<=':\r\n return 'lessThanOrEqual';\r\n case '>':\r\n return 'greaterThan';\r\n case '≥':\r\n case '>=':\r\n return 'greaterThanOrEqual';\r\n default:\r\n return op;\r\n }\r\n}\r\n\r\nfunction matchNumber(value: unknown, filter: NumberColumnFilter): boolean {\r\n const op = normalizeNumberOp(filter.type);\r\n if (op === 'blank') return isBlank(value);\r\n\r\n const n = toNumber(value);\r\n const bound = toNumber(filter.filter);\r\n const boundTo = toNumber(filter.filterTo);\r\n\r\n if (n == null) return false;\r\n\r\n switch (op) {\r\n case 'equals':\r\n return bound != null && n === bound;\r\n case 'notEqual':\r\n return bound == null ? true : n !== bound;\r\n case 'lessThan':\r\n return bound != null && n < bound;\r\n case 'lessThanOrEqual':\r\n return bound != null && n <= bound;\r\n case 'greaterThan':\r\n return bound != null && n > bound;\r\n case 'greaterThanOrEqual':\r\n return bound != null && n >= bound;\r\n case 'inRange':\r\n if (bound == null || boundTo == null) return false;\r\n return n >= Math.min(bound, boundTo) && n <= Math.max(bound, boundTo);\r\n default:\r\n return true;\r\n }\r\n}\r\n\r\nfunction dateBound(filter: DateColumnFilter, which: 'from' | 'to'): number | null {\r\n if (which === 'from') {\r\n return toDateKey(filter.dateFrom ?? filter.filter);\r\n }\r\n return toDateKey(filter.dateTo ?? filter.filterTo);\r\n}\r\n\r\nfunction matchDate(value: unknown, filter: DateColumnFilter): boolean {\r\n const op = filter.type;\r\n if (op === 'blank') return isBlank(value);\r\n\r\n const key = toDateKey(value);\r\n if (key == null) return false;\r\n\r\n const from = dateBound(filter, 'from');\r\n const to = dateBound(filter, 'to');\r\n\r\n switch (op) {\r\n case 'equals':\r\n return from != null && key === from;\r\n case 'before':\r\n return from != null && key < from;\r\n case 'after':\r\n return from != null && key > from;\r\n case 'inRange':\r\n if (from == null || to == null) return false;\r\n return key >= Math.min(from, to) && key <= Math.max(from, to);\r\n default:\r\n return true;\r\n }\r\n}\r\n\r\nfunction setKey(value: unknown): string {\r\n if (isBlank(value)) return '';\r\n if (typeof value === 'string') return normalizeFilterText(value);\r\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\r\n return normalizeFilterText(String(value));\r\n}\r\n\r\nfunction matchSet(value: unknown, filter: SetColumnFilter): boolean {\r\n const op: SetFilterOp = filter.type === 'notIn' ? 'notIn' : 'in';\r\n const allowed = new Set(filter.values.map(setKey));\r\n const key = setKey(value);\r\n const hit = allowed.has(key);\r\n return op === 'in' ? hit : !hit;\r\n}\r\n\r\nfunction matchBoolean(value: unknown, filter: BooleanColumnFilter): boolean {\r\n if (filter.type === 'any') return true;\r\n const b = toBoolean(value);\r\n if (b == null) return false;\r\n return filter.type === 'true' ? b === true : b === false;\r\n}\r\n\r\nfunction matchCustom(\r\n value: unknown,\r\n rowId: number,\r\n colId: string,\r\n filter: CustomColumnFilter,\r\n accessor: FilterAccessor,\r\n): boolean {\r\n const fn = filter.customFilter ?? accessor.getCustomFilter?.(colId);\r\n if (!fn) return true;\r\n return Boolean(fn(value, rowId));\r\n}\r\n\r\nfunction matchSimple(\r\n value: unknown,\r\n rowId: number,\r\n colId: string,\r\n filter: SimpleColumnFilter,\r\n accessor: FilterAccessor,\r\n): boolean {\r\n switch (filter.filterType) {\r\n case 'text':\r\n return matchText(value, filter);\r\n case 'number':\r\n return matchNumber(value, filter);\r\n case 'date':\r\n return matchDate(value, filter);\r\n case 'set':\r\n return matchSet(value, filter);\r\n case 'boolean':\r\n return matchBoolean(value, filter);\r\n case 'custom':\r\n return matchCustom(value, rowId, colId, filter, accessor);\r\n default:\r\n return true;\r\n }\r\n}\r\n\r\nfunction matchColumn(\r\n value: unknown,\r\n rowId: number,\r\n colId: string,\r\n filter: ColumnFilter,\r\n accessor: FilterAccessor,\r\n): boolean {\r\n if (isCombined(filter)) {\r\n const { operator, conditions } = filter;\r\n if (!conditions || conditions.length === 0) return true;\r\n if (operator === 'OR') {\r\n return conditions.some((c) =>\r\n matchSimple(value, rowId, colId, c, accessor),\r\n );\r\n }\r\n return conditions.every((c) =>\r\n matchSimple(value, rowId, colId, c, accessor),\r\n );\r\n }\r\n return matchSimple(value, rowId, colId, filter, accessor);\r\n}\r\n\r\n/**\r\n * Unique display values for a set-filter menu (PR-92 helper; UI in PR-94).\r\n * Order is first-seen in `rowIds`.\r\n */\r\nexport function collectUniqueFilterValues(\r\n rowIds: readonly number[],\r\n colId: string,\r\n accessor: FilterAccessor,\r\n): unknown[] {\r\n const seen = new Set<string>();\r\n const out: unknown[] = [];\r\n for (const rowId of rowIds) {\r\n const value = accessor.getValue(rowId, colId);\r\n const key = setKey(value);\r\n if (seen.has(key)) continue;\r\n seen.add(key);\r\n out.push(isBlank(value) ? null : value);\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Pure multi-column filter (PR-92). Does not mutate `rowIds`.\r\n * Columns in the model are combined with AND. Per-column conditions\r\n * may use AND / OR. Empty / invalid model returns a shallow copy.\r\n */\r\nexport function applyFilter(\r\n rowIds: readonly number[],\r\n filterModel: FilterModel | null | undefined,\r\n accessor: FilterAccessor,\r\n): number[] {\r\n if (!filterModel) return rowIds.slice();\r\n const entries = Object.entries(filterModel).filter(\r\n ([colId, filter]) =>\r\n typeof colId === 'string' &&\r\n colId.length > 0 &&\r\n filter != null &&\r\n typeof filter === 'object',\r\n );\r\n if (entries.length === 0) return rowIds.slice();\r\n\r\n return rowIds.filter((rowId) =>\r\n entries.every(([colId, filter]) =>\r\n matchColumn(\r\n accessor.getValue(rowId, colId),\r\n rowId,\r\n colId,\r\n filter,\r\n accessor,\r\n ),\r\n ),\r\n );\r\n}\r\n\r\n/** True when the column has a non-empty filter entry (PR-94 active indicator). */\r\nexport function isColumnFilterActive(\r\n filterModel: FilterModel | null | undefined,\r\n colId: string,\r\n): boolean {\r\n if (!filterModel) return false;\r\n const entry = filterModel[colId];\r\n return entry != null && typeof entry === 'object';\r\n}\r\n\r\nexport type BuiltinFilterKind = 'text' | 'number' | 'date' | 'set' | 'boolean';\r\n\r\nconst BUILTIN_FILTER_NAMES = new Set<string>([\r\n 'text',\r\n 'number',\r\n 'date',\r\n 'set',\r\n 'boolean',\r\n]);\r\n\r\nexport type FilterUiResolution =\r\n | { mode: 'builtin'; kind: BuiltinFilterKind }\r\n | { mode: 'custom'; name: string; params?: Record<string, unknown> };\r\n\r\n/**\r\n * Resolve filter UI for a column (PR-94/95).\r\n * `filter: false` ⇒ not filterable. Custom string / `{ type }` ⇒ registry key.\r\n */\r\nexport function resolveFilterUi(col: {\r\n fieldName: string;\r\n fieldType?: string;\r\n columnDef?: { filter?: unknown } | null;\r\n}): FilterUiResolution | null {\r\n if (col.fieldName === 'index' || col.fieldType === 'index') return null;\r\n const def = col.columnDef?.filter;\r\n if (def === false) return null;\r\n\r\n if (typeof def === 'string') {\r\n if (BUILTIN_FILTER_NAMES.has(def)) {\r\n return { mode: 'builtin', kind: def as BuiltinFilterKind };\r\n }\r\n return { mode: 'custom', name: def };\r\n }\r\n\r\n if (def && typeof def === 'object' && def !== null && 'type' in def) {\r\n const t = String((def as { type: string }).type ?? '');\r\n const params = (def as { params?: Record<string, unknown> }).params;\r\n if (!t) return null;\r\n if (BUILTIN_FILTER_NAMES.has(t)) {\r\n return { mode: 'builtin', kind: t as BuiltinFilterKind };\r\n }\r\n return { mode: 'custom', name: t, params };\r\n }\r\n\r\n switch (col.fieldType) {\r\n case 'number':\r\n case 'price':\r\n return { mode: 'builtin', kind: 'number' };\r\n case 'date':\r\n return { mode: 'builtin', kind: 'date' };\r\n case 'checkbox':\r\n return { mode: 'builtin', kind: 'boolean' };\r\n case 'text':\r\n case 'textArea':\r\n case 'description':\r\n case 'select':\r\n case 'selectOption':\r\n case 'static':\r\n default:\r\n return { mode: 'builtin', kind: 'text' };\r\n }\r\n}\r\n\r\n/**\r\n * Resolve which built-in filter UI to show for a column (PR-94).\r\n * Custom registry filters return `null` — use {@link resolveFilterUi}.\r\n */\r\nexport function resolveBuiltinFilterKind(col: {\r\n fieldName: string;\r\n fieldType?: string;\r\n columnDef?: { filter?: unknown } | null;\r\n}): BuiltinFilterKind | null {\r\n const ui = resolveFilterUi(col);\r\n return ui?.mode === 'builtin' ? ui.kind : null;\r\n}\r\n","/**\r\n * Sparse ordered index for large tables: O(1) id lookup + O(window) projection.\r\n * Position map enables O(1) neighbor for keyboard nav (PR-99).\r\n */\r\nexport class SparseRowIndex<T> {\r\n private readonly byId = new Map<number, T>();\r\n private orderedIds: number[] = [];\r\n /** id → position in `orderedIds` (PR-99). */\r\n private readonly posById = new Map<number, number>();\r\n\r\n constructor(entries: Iterable<readonly [number, T]> = []) {\r\n for (const [id, value] of entries) {\r\n this.byId.set(id, value);\r\n this.posById.set(id, this.orderedIds.length);\r\n this.orderedIds.push(id);\r\n }\r\n }\r\n\r\n get size(): number {\r\n return this.orderedIds.length;\r\n }\r\n\r\n getOrderedIds(): readonly number[] {\r\n return this.orderedIds;\r\n }\r\n\r\n getById(id: number): T | undefined {\r\n return this.byId.get(id);\r\n }\r\n\r\n /** O(1) position of `id`, or `-1`. */\r\n indexOf(id: number): number {\r\n const pos = this.posById.get(id);\r\n return pos === undefined ? -1 : pos;\r\n }\r\n\r\n /** O(1) neighbor id along the ordered index, or `undefined`. */\r\n neighbor(id: number, delta: 1 | -1): number | undefined {\r\n const pos = this.posById.get(id);\r\n if (pos === undefined) return undefined;\r\n const next = pos + delta;\r\n if (next < 0 || next >= this.orderedIds.length) return undefined;\r\n return this.orderedIds[next];\r\n }\r\n\r\n set(id: number, value: T): void {\r\n const existed = this.byId.has(id);\r\n this.byId.set(id, value);\r\n if (!existed) {\r\n this.posById.set(id, this.orderedIds.length);\r\n this.orderedIds.push(id);\r\n }\r\n }\r\n\r\n /** Insert `id` at `pos` (0…size). Shifts later positions — O(n-pos). */\r\n insertAt(pos: number, id: number, value: T): void {\r\n if (this.byId.has(id)) {\r\n this.byId.set(id, value);\r\n return;\r\n }\r\n const at = Math.max(0, Math.min(pos, this.orderedIds.length));\r\n this.byId.set(id, value);\r\n this.orderedIds.splice(at, 0, id);\r\n for (let i = at; i < this.orderedIds.length; i += 1) {\r\n this.posById.set(this.orderedIds[i]!, i);\r\n }\r\n }\r\n\r\n remove(id: number): boolean {\r\n if (!this.byId.has(id)) return false;\r\n this.byId.delete(id);\r\n const pos = this.posById.get(id);\r\n this.posById.delete(id);\r\n if (pos === undefined) return true;\r\n this.orderedIds.splice(pos, 1);\r\n for (let i = pos; i < this.orderedIds.length; i += 1) {\r\n this.posById.set(this.orderedIds[i]!, i);\r\n }\r\n return true;\r\n }\r\n\r\n /** Replace order without rebuilding payloads (e.g. after sort). */\r\n setOrder(orderedIds: readonly number[]): void {\r\n this.orderedIds = orderedIds.slice();\r\n this.posById.clear();\r\n for (let i = 0; i < this.orderedIds.length; i += 1) {\r\n this.posById.set(this.orderedIds[i]!, i);\r\n }\r\n }\r\n\r\n /** Full replace of ids + values in one pass (PR-99 rebuild). */\r\n replaceAll(orderedIds: readonly number[], valueFor: (id: number) => T): void {\r\n this.byId.clear();\r\n this.orderedIds = orderedIds.slice();\r\n this.posById.clear();\r\n for (let i = 0; i < this.orderedIds.length; i += 1) {\r\n const id = this.orderedIds[i]!;\r\n this.byId.set(id, valueFor(id));\r\n this.posById.set(id, i);\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.byId.clear();\r\n this.orderedIds = [];\r\n this.posById.clear();\r\n }\r\n\r\n /** Project only the visible window — O(window), not O(n). */\r\n projectVisible(range: {\r\n startIndex: number;\r\n endIndex: number;\r\n }): T[] {\r\n const out: T[] = [];\r\n const end = Math.min(range.endIndex, this.orderedIds.length);\r\n for (let i = range.startIndex; i < end; i += 1) {\r\n const row = this.byId.get(this.orderedIds[i]!);\r\n if (row !== undefined) out.push(row);\r\n }\r\n return out;\r\n }\r\n}\r\n","//application/ports\r\n\r\nimport { Row } from '../../domain/entities/Row';\r\nimport { CollectionScope, Table } from '../../domain/entities/Table';\r\n\r\nexport interface TableRepository {\r\n getById(store: string, tableKey: string): Promise<Table>;\r\n save(store: string, table: Table): Promise<void>;\r\n delete(store: string, tableKey: string): Promise<void>;\r\n resetTable(store: string, tableKey: string): Promise<void>;\r\n exists(store: string, tableKey: string): Promise<boolean>;\r\n getFromDbById?(store: string, tableKey: string): Promise<Table>;\r\n}\r\n\r\n/** Plain serialized row as streamed from IndexedDB (no domain objects). */\r\nexport interface PersistedRowRecord {\r\n rowId: number;\r\n collection: string;\r\n sortIndex: number;\r\n rowState: string;\r\n /** colId → { value, originalValue, display } — plain, no domain objects */\r\n cells: Record<string, { value: unknown; originalValue: unknown; display: unknown }>;\r\n}\r\n\r\n/**\r\n * Page-window repository (\"paged IndexedDB\" persistence mode).\r\n *\r\n * IndexedDB is the single source of truth for ALL rows; RAM holds exactly one\r\n * page window (Memory Iron Rule: heap is O(batch), never O(total rows)).\r\n * Opt-in via `persistence: 'paged-idb'`; the default event-sourced\r\n * repositories do NOT implement these methods.\r\n */\r\nexport interface WindowedTableRepository extends TableRepository {\r\n /**\r\n * Persist metadata + upsert rows currently held in the Table (page window).\r\n * Must NOT delete other pages' rows in IndexedDB.\r\n */\r\n save(store: string, table: Table): Promise<void>;\r\n\r\n /**\r\n * Replace IndexedDB source of truth with every row on `table`, then callers\r\n * should `loadPage` so RAM only keeps one page.\r\n */\r\n replaceAll(store: string, table: Table): Promise<void>;\r\n\r\n /** Flush pending IDB writes, load one page into RAM, return that window. */\r\n loadPage(\r\n store: string,\r\n tableKey: string,\r\n page: number,\r\n pageSize?: number,\r\n ): Promise<Table | null>;\r\n\r\n /**\r\n * Switch the persisted active collection (page resets to 1) and return a\r\n * Table whose RAM window holds page 1 of the NEW collection only.\r\n * Rows of other collections must remain untouched in IndexedDB.\r\n */\r\n setActiveCollection(\r\n store: string,\r\n tableKey: string,\r\n collection: string,\r\n ): Promise<Table | null>;\r\n\r\n /**\r\n * @deprecated Legacy: hydrates the whole dataset. Use `iterateRowRecords`.\r\n * All rows from IndexedDB (source of truth).\r\n */\r\n getAllRows(\r\n store: string,\r\n tableKey: string,\r\n collectionScope?: CollectionScope,\r\n ): Promise<Row[]>;\r\n\r\n /**\r\n * All row ids from IndexedDB (source of truth), without hydrating cells.\r\n * Used for select-all across the full dataset (not just the RAM page window).\r\n */\r\n getAllRowIds(\r\n store: string,\r\n tableKey: string,\r\n collectionScope?: CollectionScope,\r\n ): Promise<number[]>;\r\n\r\n /**\r\n * Stream serialized row records from IndexedDB in bounded batches via a\r\n * cursor over the byTableCollectionSort index (ordered, no full load).\r\n * The heap at any moment holds one batch — never the whole dataset.\r\n * Return false from onBatch to stop early.\r\n */\r\n iterateRowRecords(\r\n store: string,\r\n tableKey: string,\r\n collectionScope: CollectionScope,\r\n onBatch: (\r\n records: PersistedRowRecord[],\r\n /** Ordinal (0-based, collection-sorted position) of the batch's first record */\r\n ordinalBase: number,\r\n ) => Promise<boolean | void>,\r\n batchSize?: number,\r\n ): Promise<void>;\r\n\r\n /** Physically remove row records from IndexedDB (hard delete). */\r\n removeRows(store: string, tableKey: string, rowIds: number[]): Promise<void>;\r\n\r\n /**\r\n * Bulk soft/hard delete applied directly to persisted row records\r\n * (cursor-based — heap stays O(1)):\r\n * - `Added` rows are hard-removed from the store\r\n * - others get rowState = Deleted written on the record (cursor.update)\r\n * - already-Deleted rows are left untouched (no restore on bulk delete)\r\n */\r\n softDeleteRows(\r\n store: string,\r\n tableKey: string,\r\n rowIds: number[],\r\n ): Promise<{\r\n softDeleted: number;\r\n hardRemoved: number;\r\n /** Non-deleted rows remaining in the active collection after the delete. */\r\n remaining: number;\r\n }>;\r\n\r\n /** Drop RAM window only; IndexedDB untouched. */\r\n clearLocal(store: string, tableKey: string): void;\r\n\r\n /** Await queued IndexedDB writes for this table. */\r\n flush(store: string, tableKey: string): Promise<void>;\r\n}\r\n\r\n/** Type guard: true only for page-window repositories (`persistence: 'paged-idb'`). */\r\nexport function isWindowedRepository(\r\n repo: TableRepository,\r\n): repo is WindowedTableRepository {\r\n const r = repo as Partial<WindowedTableRepository>;\r\n return (\r\n typeof r.loadPage === 'function' &&\r\n typeof r.iterateRowRecords === 'function' &&\r\n typeof r.softDeleteRows === 'function'\r\n );\r\n}\r\n","import { normalizeFilterText } from './filterModel';\r\n\r\nexport type QuickFilterBlobAccessor = {\r\n /** Searchable cell values for one row (value + display, etc.). */\r\n getParts: (rowId: number) => readonly unknown[];\r\n};\r\n\r\n/** Normalize query / cell text for quick filter (digits + ي/ك). */\r\nexport function normalizeQuickFilterText(value: string): string {\r\n return normalizeFilterText(value).toLocaleLowerCase('fa').trim();\r\n}\r\n\r\n/**\r\n * Flatten row parts into one searchable blob (PR-93).\r\n * Empty / null parts are skipped.\r\n */\r\nexport function buildQuickFilterBlob(parts: readonly unknown[]): string {\r\n const chunks: string[] = [];\r\n for (const part of parts) {\r\n if (part == null) continue;\r\n if (typeof part === 'string' && part.trim() === '') continue;\r\n if (typeof part === 'number' && Number.isNaN(part)) continue;\r\n chunks.push(normalizeQuickFilterText(String(part)));\r\n }\r\n return chunks.join(' ');\r\n}\r\n\r\nfunction tokenize(blob: string): string[] {\r\n return blob.split(/[^\\p{L}\\p{N}]+/u).filter((t) => t.length > 0);\r\n}\r\n\r\n/**\r\n * Per-row text cache + inverted token → rowIds (PR-93).\r\n * Typing reuses blobs (no per-keystroke cell walk). Cell edits update one row.\r\n */\r\nexport class QuickFilterIndex {\r\n private readonly blobs = new Map<number, string>();\r\n private readonly inverted = new Map<string, Set<number>>();\r\n\r\n clear(): void {\r\n this.blobs.clear();\r\n this.inverted.clear();\r\n }\r\n\r\n get size(): number {\r\n return this.blobs.size;\r\n }\r\n\r\n getBlob(rowId: number): string {\r\n return this.blobs.get(rowId) ?? '';\r\n }\r\n\r\n rowIds(): IterableIterator<number> {\r\n return this.blobs.keys();\r\n }\r\n\r\n has(rowId: number): boolean {\r\n return this.blobs.has(rowId);\r\n }\r\n\r\n removeRow(rowId: number): void {\r\n const prev = this.blobs.get(rowId);\r\n if (prev === undefined) return;\r\n this.blobs.delete(rowId);\r\n for (const token of tokenize(prev)) {\r\n const set = this.inverted.get(token);\r\n if (!set) continue;\r\n set.delete(rowId);\r\n if (set.size === 0) this.inverted.delete(token);\r\n }\r\n }\r\n\r\n setRow(rowId: number, parts: readonly unknown[]): void {\r\n const blob = buildQuickFilterBlob(parts);\r\n this.removeRow(rowId);\r\n this.blobs.set(rowId, blob);\r\n for (const token of tokenize(blob)) {\r\n let set = this.inverted.get(token);\r\n if (!set) {\r\n set = new Set();\r\n this.inverted.set(token, set);\r\n }\r\n set.add(rowId);\r\n }\r\n }\r\n\r\n /** Rebuild from an ordered id list + accessor (full invalidate). */\r\n rebuild(rowIds: readonly number[], accessor: QuickFilterBlobAccessor): void {\r\n this.clear();\r\n for (const rowId of rowIds) {\r\n this.setRow(rowId, accessor.getParts(rowId));\r\n }\r\n }\r\n\r\n /**\r\n * Candidate rows for one query part via inverted tokens (prefix / equality).\r\n * Used to narrow before blob `includes` verification.\r\n */\r\n private candidatesForPart(part: string): Set<number> | null {\r\n if (part.length === 0) return null;\r\n const out = new Set<number>();\r\n let hit = false;\r\n for (const [token, ids] of this.inverted) {\r\n if (token === part || token.startsWith(part) || token.includes(part)) {\r\n hit = true;\r\n for (const id of ids) out.add(id);\r\n }\r\n }\r\n return hit ? out : null;\r\n }\r\n\r\n /**\r\n * Filter `rowIds` whose cached blob contains every whitespace-separated\r\n * query part (AND). Empty / blank query ⇒ shallow copy of `rowIds`.\r\n */\r\n filter(rowIds: readonly number[], quickFilterText: string | null | undefined): number[] {\r\n const raw = typeof quickFilterText === 'string' ? quickFilterText : '';\r\n const normalized = normalizeQuickFilterText(raw);\r\n if (!normalized) return rowIds.slice();\r\n\r\n const parts = normalized.split(/\\s+/).filter((p) => p.length > 0);\r\n if (parts.length === 0) return rowIds.slice();\r\n\r\n let candidates: Set<number> | null = null;\r\n for (const part of parts) {\r\n const next = this.candidatesForPart(part);\r\n if (next) {\r\n candidates = candidates\r\n ? intersectSets(candidates, next)\r\n : next;\r\n if (candidates.size === 0) {\r\n // inverted miss — fall through to full blob scan for this part\r\n candidates = null;\r\n break;\r\n }\r\n } else {\r\n candidates = null;\r\n break;\r\n }\r\n }\r\n\r\n const source =\r\n candidates != null\r\n ? rowIds.filter((id) => candidates!.has(id))\r\n : rowIds;\r\n\r\n return source.filter((rowId) => {\r\n const blob = this.blobs.get(rowId) ?? '';\r\n return parts.every((part) => blob.includes(part));\r\n });\r\n }\r\n}\r\n\r\nfunction intersectSets(a: Set<number>, b: Set<number>): Set<number> {\r\n const out = new Set<number>();\r\n const [small, large] = a.size <= b.size ? [a, b] : [b, a];\r\n for (const id of small) {\r\n if (large.has(id)) out.add(id);\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Pure quick filter over a blob getter (PR-93). Prefer {@link QuickFilterIndex}\r\n * when filtering repeatedly (typing).\r\n */\r\nexport function applyQuickFilter(\r\n rowIds: readonly number[],\r\n quickFilterText: string | null | undefined,\r\n getBlob: ((rowId: number) => string) | QuickFilterIndex,\r\n): number[] {\r\n if (getBlob instanceof QuickFilterIndex) {\r\n return getBlob.filter(rowIds, quickFilterText);\r\n }\r\n const raw = typeof quickFilterText === 'string' ? quickFilterText : '';\r\n const normalized = normalizeQuickFilterText(raw);\r\n if (!normalized) return rowIds.slice();\r\n const parts = normalized.split(/\\s+/).filter((p) => p.length > 0);\r\n if (parts.length === 0) return rowIds.slice();\r\n return rowIds.filter((rowId) => {\r\n const blob = getBlob(rowId);\r\n return parts.every((part) => blob.includes(part));\r\n });\r\n}\r\n","/**\r\n * Row model mode (PR-96).\r\n * - `clientSide` — local sort / filter / quick filter.\r\n * - `infinite` / `serverSide` — models are for the host datasource; skip local apply*.\r\n */\r\nexport type RowModelType = 'clientSide' | 'infinite' | 'serverSide';\r\n\r\nexport function isServerRowModel(\r\n rowModelType: RowModelType | undefined | null,\r\n): boolean {\r\n return rowModelType === 'infinite' || rowModelType === 'serverSide';\r\n}\r\n\r\n/**\r\n * Marker on host row objects used as infinite/server block placeholders (PR-102 / PR-103).\r\n * UI reads this via {@link isServerLoadingRow}.\r\n */\r\nexport const SERVER_ROW_LOADING_FLAG = '__pdgLoading' as const;\r\n\r\nexport function isServerLoadingRow(data: unknown): boolean {\r\n if (!data || typeof data !== 'object') return false;\r\n return (data as Record<string, unknown>)[SERVER_ROW_LOADING_FLAG] === true;\r\n}\r\n\r\n/** Half-open page window `[startRow, endRow)`. */\r\nexport function pageWindow(\r\n page: number,\r\n pageSize: number,\r\n): { startRow: number; endRow: number } {\r\n const safePage = Math.max(1, page);\r\n const safeSize = Math.max(1, pageSize);\r\n const startRow = (safePage - 1) * safeSize;\r\n return { startRow, endRow: startRow + safeSize };\r\n}\r\n","/**\r\n * Column aggregation model (PR-118 / RFC-002). Pure — no React/DOM.\r\n * Built-in aggs are incremental; money uses integer minor units (no float sum).\r\n */\r\n\r\nimport type { AggFunc, AggFuncName } from '../../domain/types/ColumnDef';\r\n\r\nexport type { AggFunc, AggFuncName };\r\n\r\nexport function isAggFuncName(value: unknown): value is AggFuncName {\r\n return (\r\n value === 'sum' ||\r\n value === 'avg' ||\r\n value === 'min' ||\r\n value === 'max' ||\r\n value === 'count' ||\r\n value === 'first' ||\r\n value === 'last'\r\n );\r\n}\r\n\r\nexport function isCustomAggFunc(\r\n agg: AggFunc | undefined,\r\n): agg is (values: readonly unknown[]) => unknown {\r\n return typeof agg === 'function';\r\n}\r\n\r\n/**\r\n * Coerce a cell value to integer minor units (rials).\r\n * Rejects non-finite numbers; truncates toward zero (no float accumulation).\r\n */\r\nexport function toMinorUnits(value: unknown): number | null {\r\n if (value == null || value === '') return null;\r\n if (typeof value === 'bigint') {\r\n const n = Number(value);\r\n return Number.isSafeInteger(n) ? n : null;\r\n }\r\n if (typeof value === 'number') {\r\n if (!Number.isFinite(value)) return null;\r\n return Math.trunc(value);\r\n }\r\n if (typeof value === 'boolean') return value ? 1 : 0;\r\n if (typeof value === 'string') {\r\n const normalized = value\r\n .trim()\r\n .replace(/[۰-۹]/g, (d) => String('۰۱۲۳۴۵۶۷۸۹'.indexOf(d)))\r\n .replace(/[٠-٩]/g, (d) => String('٠١٢٣٤٥٦٧٨٩'.indexOf(d)))\r\n .replace(/,/g, '');\r\n if (normalized === '') return null;\r\n const n = Number(normalized);\r\n if (!Number.isFinite(n)) return null;\r\n return Math.trunc(n);\r\n }\r\n return null;\r\n}\r\n\r\nexport type AggAccumulator =\r\n | { kind: 'sum'; sum: number; count: number }\r\n | { kind: 'avg'; sum: number; count: number }\r\n | { kind: 'min'; min: number | null; count: number }\r\n | { kind: 'max'; max: number | null; count: number }\r\n | { kind: 'count'; count: number }\r\n | { kind: 'first'; value: unknown; set: boolean }\r\n | { kind: 'last'; value: unknown; set: boolean };\r\n\r\nexport function createAccumulator(kind: AggFuncName): AggAccumulator {\r\n switch (kind) {\r\n case 'sum':\r\n return { kind: 'sum', sum: 0, count: 0 };\r\n case 'avg':\r\n return { kind: 'avg', sum: 0, count: 0 };\r\n case 'min':\r\n return { kind: 'min', min: null, count: 0 };\r\n case 'max':\r\n return { kind: 'max', max: null, count: 0 };\r\n case 'count':\r\n return { kind: 'count', count: 0 };\r\n case 'first':\r\n return { kind: 'first', value: undefined, set: false };\r\n case 'last':\r\n return { kind: 'last', value: undefined, set: false };\r\n }\r\n}\r\n\r\nfunction contributeNumeric(\r\n acc: Extract<AggAccumulator, { kind: 'sum' | 'avg' | 'min' | 'max' }>,\r\n value: unknown,\r\n sign: 1 | -1,\r\n): 'ok' | 'rebuild' {\r\n const n = toMinorUnits(value);\r\n if (n == null) return 'ok';\r\n if (acc.kind === 'sum' || acc.kind === 'avg') {\r\n acc.sum += sign * n;\r\n acc.count += sign;\r\n return 'ok';\r\n }\r\n if (acc.kind === 'min') {\r\n if (sign === 1) {\r\n acc.min = acc.min == null ? n : Math.min(acc.min, n);\r\n acc.count += 1;\r\n return 'ok';\r\n }\r\n acc.count -= 1;\r\n if (acc.count <= 0) {\r\n acc.min = null;\r\n acc.count = 0;\r\n return 'ok';\r\n }\r\n if (acc.min === n) return 'rebuild';\r\n return 'ok';\r\n }\r\n // max\r\n if (sign === 1) {\r\n acc.max = acc.max == null ? n : Math.max(acc.max, n);\r\n acc.count += 1;\r\n return 'ok';\r\n }\r\n acc.count -= 1;\r\n if (acc.count <= 0) {\r\n acc.max = null;\r\n acc.count = 0;\r\n return 'ok';\r\n }\r\n if (acc.max === n) return 'rebuild';\r\n return 'ok';\r\n}\r\n\r\n/** Add one value into an accumulator. Returns 'rebuild' when min/max need a full pass. */\r\nexport function accumulateAdd(\r\n acc: AggAccumulator,\r\n value: unknown,\r\n): 'ok' | 'rebuild' {\r\n switch (acc.kind) {\r\n case 'sum':\r\n case 'avg':\r\n case 'min':\r\n case 'max':\r\n return contributeNumeric(acc, value, 1);\r\n case 'count':\r\n if (value != null && value !== '') acc.count += 1;\r\n return 'ok';\r\n case 'first':\r\n if (!acc.set && value != null && value !== '') {\r\n acc.value = value;\r\n acc.set = true;\r\n }\r\n return 'ok';\r\n case 'last':\r\n if (value != null && value !== '') {\r\n acc.value = value;\r\n acc.set = true;\r\n }\r\n return 'ok';\r\n }\r\n}\r\n\r\n/** Remove one value from an accumulator (cell edit old value). */\r\nexport function accumulateRemove(\r\n acc: AggAccumulator,\r\n value: unknown,\r\n): 'ok' | 'rebuild' {\r\n switch (acc.kind) {\r\n case 'sum':\r\n case 'avg':\r\n case 'min':\r\n case 'max':\r\n return contributeNumeric(acc, value, -1);\r\n case 'count':\r\n if (value != null && value !== '') acc.count = Math.max(0, acc.count - 1);\r\n return 'ok';\r\n case 'first':\r\n if (acc.set && Object.is(acc.value, value)) return 'rebuild';\r\n return 'ok';\r\n case 'last':\r\n if (acc.set && Object.is(acc.value, value)) return 'rebuild';\r\n return 'ok';\r\n }\r\n}\r\n\r\nexport function readAccumulator(acc: AggAccumulator): unknown {\r\n switch (acc.kind) {\r\n case 'sum':\r\n return acc.count === 0 ? null : acc.sum;\r\n case 'avg':\r\n return acc.count === 0 ? null : acc.sum / acc.count;\r\n case 'min':\r\n return acc.min;\r\n case 'max':\r\n return acc.max;\r\n case 'count':\r\n return acc.count;\r\n case 'first':\r\n case 'last':\r\n return acc.set ? acc.value : null;\r\n }\r\n}\r\n\r\n/** Full (non-incremental) aggregate over a value list. */\r\nexport function applyAgg(\r\n agg: AggFunc | undefined,\r\n values: readonly unknown[],\r\n): unknown {\r\n if (agg == null) return null;\r\n if (typeof agg === 'function') return agg(values);\r\n const acc = createAccumulator(agg);\r\n for (const v of values) accumulateAdd(acc, v);\r\n return readAccumulator(acc);\r\n}\r\n\r\nexport type ColumnAggSpec = {\r\n colId: string;\r\n aggFunc: AggFunc;\r\n};\r\n\r\n/**\r\n * Resolve which columns participate in footer aggregates (PR-119).\r\n * - If any column declares `columnDef.aggFunc`, only those columns aggregate\r\n * (columns without aggFunc stay empty — verify).\r\n * - Else legacy: `price` / `number` columns default to `sum` (0.5.x hosts).\r\n */\r\nexport function resolveColumnAggSpecs(\r\n columns: readonly {\r\n fieldName: string;\r\n fieldType?: string;\r\n columnDef?: { aggFunc?: AggFunc } | undefined;\r\n }[],\r\n): ColumnAggSpec[] {\r\n const explicit: ColumnAggSpec[] = [];\r\n for (const col of columns) {\r\n const agg = col.columnDef?.aggFunc;\r\n if (agg != null) explicit.push({ colId: col.fieldName, aggFunc: agg });\r\n }\r\n if (explicit.length > 0) return explicit;\r\n return columns\r\n .filter((c) => c.fieldType === 'price' || c.fieldType === 'number')\r\n .map((c) => ({ colId: c.fieldName, aggFunc: 'sum' as const }));\r\n}\r\n\r\n/**\r\n * Incremental per-column aggregates (PR-118).\r\n * Custom functions always rebuild; built-ins patch in O(1) when possible.\r\n */\r\nexport class ColumnAggIndex {\r\n private readonly states = new Map<\r\n string,\r\n {\r\n agg: AggFunc;\r\n acc: AggAccumulator | null;\r\n customResult: unknown;\r\n dirty: boolean;\r\n }\r\n >();\r\n private dirty = true;\r\n\r\n invalidate(): void {\r\n this.dirty = true;\r\n for (const state of this.states.values()) state.dirty = true;\r\n }\r\n\r\n get isDirty(): boolean {\r\n return this.dirty;\r\n }\r\n\r\n clear(): void {\r\n this.states.clear();\r\n this.dirty = true;\r\n }\r\n\r\n /**\r\n * Rebuild all tracked columns. `valuesFor` supplies current values per colId.\r\n */\r\n rebuild(\r\n specs: readonly ColumnAggSpec[],\r\n valuesFor: (colId: string) => readonly unknown[],\r\n ): void {\r\n this.states.clear();\r\n for (const spec of specs) {\r\n if (isCustomAggFunc(spec.aggFunc)) {\r\n this.states.set(spec.colId, {\r\n agg: spec.aggFunc,\r\n acc: null,\r\n customResult: spec.aggFunc(valuesFor(spec.colId)),\r\n dirty: false,\r\n });\r\n continue;\r\n }\r\n const acc = createAccumulator(spec.aggFunc);\r\n for (const v of valuesFor(spec.colId)) accumulateAdd(acc, v);\r\n this.states.set(spec.colId, {\r\n agg: spec.aggFunc,\r\n acc,\r\n customResult: undefined,\r\n dirty: false,\r\n });\r\n }\r\n this.dirty = false;\r\n }\r\n\r\n /**\r\n * O(1) patch for a cell change. Returns false if a rebuild is required.\r\n */\r\n patch(\r\n colId: string,\r\n oldValue: unknown,\r\n newValue: unknown,\r\n ): boolean {\r\n const state = this.states.get(colId);\r\n if (!state || state.dirty || this.dirty) return false;\r\n if (isCustomAggFunc(state.agg) || !state.acc) return false;\r\n if (state.acc.kind === 'first' || state.acc.kind === 'last') {\r\n state.dirty = true;\r\n this.dirty = true;\r\n return false;\r\n }\r\n const rem = accumulateRemove(state.acc, oldValue);\r\n if (rem === 'rebuild') {\r\n state.dirty = true;\r\n this.dirty = true;\r\n return false;\r\n }\r\n const add = accumulateAdd(state.acc, newValue);\r\n if (add === 'rebuild') {\r\n state.dirty = true;\r\n this.dirty = true;\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n get(colId: string): unknown {\r\n const state = this.states.get(colId);\r\n if (!state) return null;\r\n if (isCustomAggFunc(state.agg)) return state.customResult ?? null;\r\n if (!state.acc) return null;\r\n return readAccumulator(state.acc);\r\n }\r\n\r\n toRecord(): Record<string, unknown> {\r\n const out: Record<string, unknown> = {};\r\n for (const colId of this.states.keys()) {\r\n out[colId] = this.get(colId);\r\n }\r\n return out;\r\n }\r\n\r\n /** Numeric-only view for legacy footer (`Record<string, number>`). */\r\n toNumberRecord(): Record<string, number> {\r\n const out: Record<string, number> = {};\r\n for (const colId of this.states.keys()) {\r\n const v = this.get(colId);\r\n if (typeof v === 'number' && Number.isFinite(v)) out[colId] = v;\r\n }\r\n return out;\r\n }\r\n}\r\n","import type { ColumnDef } from './ColumnDef';\r\n\r\n/**\r\n * Multi-level column group (PR-113).\r\n * Nested groups are supported via `children` containing more groups.\r\n */\r\nexport interface ColumnGroupDef<TRow = unknown> {\r\n groupId?: string;\r\n headerName: string;\r\n children: readonly ColDefOrGroup<TRow>[];\r\n /** When true, hiding one child hides siblings in the same group (AG Grid parity). */\r\n marryChildren?: boolean;\r\n}\r\n\r\nexport type ColDefOrGroup<TRow = unknown> =\r\n | ColumnDef<TRow>\r\n | ColumnGroupDef<TRow>;\r\n\r\nexport function isColumnGroupDef<TRow>(\r\n item: ColDefOrGroup<TRow>,\r\n): item is ColumnGroupDef<TRow> {\r\n return (\r\n typeof item === 'object' &&\r\n item !== null &&\r\n 'children' in item &&\r\n Array.isArray((item as ColumnGroupDef<TRow>).children)\r\n );\r\n}\r\n\r\n/** Persisted on leaf `ColumnSchema` for header rendering and group reorder. */\r\nexport type ColumnGroupPathEntry = {\r\n groupId: string;\r\n headerName: string;\r\n marryChildren?: boolean;\r\n};\r\n\r\nexport type ColumnGroupMeta = {\r\n /** Immediate parent group id. */\r\n groupId: string;\r\n /** Root → parent chain. */\r\n path: readonly ColumnGroupPathEntry[];\r\n};\r\n","import type { ColumnDef } from '../../domain/types/ColumnDef';\r\nimport type {\r\n ColDefOrGroup,\r\n ColumnGroupPathEntry,\r\n} from '../../domain/types/ColumnGroupDef';\r\nimport { isColumnGroupDef } from '../../domain/types/ColumnGroupDef';\r\n\r\nfunction slugGroupId(headerName: string, index: number): string {\r\n const base = headerName\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, '-')\r\n .replace(/^-|-$/g, '');\r\n return base.length > 0 ? base : `group-${index}`;\r\n}\r\n\r\nfunction withGroupMeta<TRow>(\r\n def: ColumnDef<TRow>,\r\n path: readonly ColumnGroupPathEntry[],\r\n): ColumnDef<TRow> {\r\n if (path.length === 0) return def;\r\n const parent = path[path.length - 1]!;\r\n const columnGroup = { groupId: parent.groupId, path };\r\n return { ...def, columnGroup };\r\n}\r\n\r\n/**\r\n * Expand nested `ColumnGroupDef` trees into flat `ColumnDef` leaves with group metadata.\r\n */\r\nexport function flattenColDefOrGroup<TRow>(\r\n items: readonly ColDefOrGroup<TRow>[],\r\n parentPath: readonly ColumnGroupPathEntry[] = [],\r\n groupIndex = { value: 0 },\r\n): ColumnDef<TRow>[] {\r\n const out: ColumnDef<TRow>[] = [];\r\n for (const item of items) {\r\n if (isColumnGroupDef(item)) {\r\n const groupId =\r\n item.groupId ?? slugGroupId(item.headerName, groupIndex.value++);\r\n const entry: ColumnGroupPathEntry = {\r\n groupId,\r\n headerName: item.headerName,\r\n marryChildren: item.marryChildren,\r\n };\r\n out.push(\r\n ...flattenColDefOrGroup(item.children, [...parentPath, entry], groupIndex),\r\n );\r\n } else {\r\n out.push(withGroupMeta(item, parentPath));\r\n }\r\n }\r\n return out;\r\n}\r\n","import type { ColumnDef, ColumnDefBridge } from '../../domain/types/ColumnDef';\r\nimport type { ColDefOrGroup } from '../../domain/types/ColumnGroupDef';\r\nimport type { ColumnSchema } from '../../domain/types/ColumnSchema';\r\nimport { formatPrice } from '../finance/currency';\r\nimport { flattenColDefOrGroup } from './flattenColumnDefs';\r\n\r\nconst DEFAULT_FIELD_TYPE: ColumnSchema['fieldType'] = 'text';\r\n\r\n/** Resolve the persisted column id (`colId` wins, then `field`). */\r\nexport function columnDefFieldName<TRow, TValue = unknown>(\r\n def: ColumnDef<TRow, TValue>,\r\n): string {\r\n if (typeof def.colId === 'string' && def.colId.length > 0) return def.colId;\r\n const field = def.field as string | undefined;\r\n if (typeof field === 'string' && field.length > 0) return field;\r\n throw new Error('ColumnDef requires colId or field');\r\n}\r\n\r\nfunction pickBridge<TRow, TValue>(def: ColumnDef<TRow, TValue>): ColumnDefBridge | undefined {\r\n const bridge: ColumnDefBridge = {};\r\n const fieldName = columnDefFieldName(def);\r\n if (typeof def.field === 'string' && def.field !== fieldName) {\r\n bridge.field = def.field;\r\n }\r\n if (typeof def.colId === 'string' && def.colId !== fieldName) {\r\n bridge.colId = def.colId;\r\n } else if (typeof def.colId === 'string' && typeof def.field === 'string') {\r\n // both set and equal fieldName — omit\r\n }\r\n if (def.valueGetter) {\r\n bridge.valueGetter = def.valueGetter as ColumnDefBridge['valueGetter'];\r\n }\r\n if (def.valueSetter) {\r\n bridge.valueSetter = def.valueSetter as ColumnDefBridge['valueSetter'];\r\n }\r\n if (def.valueFormatter) {\r\n bridge.valueFormatter = def.valueFormatter as ColumnDefBridge['valueFormatter'];\r\n }\r\n if (def.comparator) {\r\n bridge.comparator = def.comparator as ColumnDefBridge['comparator'];\r\n }\r\n if (typeof def.editable === 'function') {\r\n bridge.editableWhen = def.editable as ColumnDefBridge['editableWhen'];\r\n }\r\n if (def.width !== undefined) bridge.width = def.width;\r\n if (def.flex !== undefined) bridge.flex = def.flex;\r\n if (def.pinned !== undefined) bridge.pinned = def.pinned;\r\n if (def.sortable !== undefined) bridge.sortable = def.sortable;\r\n if (def.filter !== undefined) bridge.filter = def.filter;\r\n if (def.aggFunc !== undefined) {\r\n bridge.aggFunc = def.aggFunc as ColumnDefBridge['aggFunc'];\r\n }\r\n if (def.currencyUnit !== undefined) {\r\n bridge.currencyUnit = def.currencyUnit;\r\n }\r\n if (def.currencyUnit && !def.valueFormatter) {\r\n const displayUnit = def.currencyUnit;\r\n bridge.valueFormatter = ({ value }) => {\r\n if (value == null || value === '') return '';\r\n const n = Number(value);\r\n if (!Number.isFinite(n)) return String(value);\r\n return formatPrice(n, {\r\n unit: 'rial',\r\n displayUnit,\r\n withLabel: true,\r\n persianDigits: true,\r\n });\r\n };\r\n }\r\n return Object.keys(bridge).length > 0 ? bridge : undefined;\r\n}\r\n\r\nfunction emptySchema<TRow, TValue>(def: ColumnDef<TRow, TValue>): ColumnSchema {\r\n const fieldName = columnDefFieldName(def);\r\n return {\r\n fieldName,\r\n fieldCaption: def.headerName ?? fieldName,\r\n fieldType: def.type ?? DEFAULT_FIELD_TYPE,\r\n visibility: { kind: 'always' },\r\n};\r\n}\r\n\r\n/**\r\n * Generic `ColumnDef` → legacy/ERP `ColumnSchema`.\r\n * Unmapped ColumnDef fields are stored on `schema.columnDef` for the reverse map.\r\n */\r\nexport function toColumnSchema<TRow, TValue = unknown>(\r\n def: ColumnDef<TRow, TValue>,\r\n): ColumnSchema {\r\n const fieldName = columnDefFieldName(def);\r\n const base: ColumnSchema = def.columnSchema\r\n ? { ...def.columnSchema }\r\n : emptySchema(def);\r\n\r\n const next: ColumnSchema = {\r\n ...base,\r\n fieldName,\r\n fieldCaption: def.headerName ?? base.fieldCaption ?? fieldName,\r\n fieldType: def.type ?? base.fieldType ?? DEFAULT_FIELD_TYPE,\r\n };\r\n\r\n if (def.minWidth !== undefined) next.minWidth = def.minWidth;\r\n if (def.hide !== undefined) next.hidden = def.hide;\r\n if (def.columnGroup) next.columnGroup = def.columnGroup;\r\n else if (def.columnSchema?.columnGroup) next.columnGroup = def.columnSchema.columnGroup;\r\n if (typeof def.editable === 'boolean') next.editable = def.editable;\r\n if (def.cellRenderer !== undefined) {\r\n next.render = def.cellRenderer;\r\n }\r\n\r\n const bridge = pickBridge(def);\r\n if (bridge) next.columnDef = bridge;\r\n else delete next.columnDef;\r\n\r\n return next;\r\n}\r\n\r\n/**\r\n * Legacy/ERP `ColumnSchema` → generic `ColumnDef`.\r\n * `columnSchema` on the result is the source object so `toColumnSchema` is lossless.\r\n */\r\nexport function toColumnDef<TRow = unknown, TValue = unknown>(\r\n schema: ColumnSchema,\r\n): ColumnDef<TRow, TValue> & { columnSchema: ColumnSchema } {\r\n const bridge = schema.columnDef;\r\n const fieldName = schema.fieldName;\r\n const field = (bridge?.field ?? fieldName) as ColumnDef<TRow, TValue>['field'];\r\n const colId = bridge?.colId ?? fieldName;\r\n const editable: ColumnDef<TRow, TValue>['editable'] = bridge?.editableWhen\r\n ? (bridge.editableWhen as ColumnDef<TRow, TValue>['editable'])\r\n : schema.editable;\r\n\r\n const def: ColumnDef<TRow, TValue> & { columnSchema: ColumnSchema } = {\r\n colId,\r\n field,\r\n headerName: schema.fieldCaption,\r\n type: schema.fieldType,\r\n editable,\r\n minWidth: schema.minWidth,\r\n hide: schema.hidden,\r\n cellRenderer: schema.render,\r\n columnSchema: schema,\r\n };\r\n\r\n if (bridge?.valueGetter) {\r\n def.valueGetter = bridge.valueGetter as ColumnDef<TRow, TValue>['valueGetter'];\r\n }\r\n if (bridge?.valueSetter) {\r\n def.valueSetter = bridge.valueSetter as ColumnDef<TRow, TValue>['valueSetter'];\r\n }\r\n if (bridge?.valueFormatter) {\r\n def.valueFormatter = bridge.valueFormatter as ColumnDef<\r\n TRow,\r\n TValue\r\n >['valueFormatter'];\r\n }\r\n if (bridge?.comparator) {\r\n def.comparator = bridge.comparator as ColumnDef<TRow, TValue>['comparator'];\r\n }\r\n if (bridge?.width !== undefined) def.width = bridge.width;\r\n if (bridge?.flex !== undefined) def.flex = bridge.flex;\r\n if (bridge?.pinned !== undefined) def.pinned = bridge.pinned;\r\n if (bridge?.sortable !== undefined) def.sortable = bridge.sortable;\r\n if (bridge?.filter !== undefined) def.filter = bridge.filter;\r\n if (bridge?.aggFunc !== undefined) {\r\n def.aggFunc = bridge.aggFunc as ColumnDef<TRow, TValue>['aggFunc'];\r\n }\r\n if (bridge?.currencyUnit !== undefined) {\r\n def.currencyUnit = bridge.currencyUnit;\r\n }\r\n if (schema.columnGroup) def.columnGroup = schema.columnGroup;\r\n\r\n return def;\r\n}\r\n\r\nexport function mapColumnDefs<TRow>(defs: ColumnDef<TRow>[]): ColumnSchema[] {\r\n return defs.map((def) => toColumnSchema(def));\r\n}\r\n\r\nexport function mapColDefOrGroups<TRow>(\r\n items: ColDefOrGroup<TRow>[],\r\n): ColumnSchema[] {\r\n return flattenColDefOrGroup(items).map((def) => toColumnSchema(def));\r\n}\r\n\r\nexport function mapColumnSchemasToDefs<TRow = unknown>(\r\n schemas: ColumnSchema[],\r\n): Array<ColumnDef<TRow> & { columnSchema: ColumnSchema }> {\r\n return schemas.map((schema) => toColumnDef<TRow>(schema));\r\n}\r\n","import { Cell } from '../../domain/entities/Cell';\r\nimport { Row } from '../../domain/entities/Row';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport type { ColumnDef } from '../../domain/types/ColumnDef';\r\nimport type { ColDefOrGroup } from '../../domain/types/ColumnGroupDef';\r\nimport { flattenColDefOrGroup } from '../columns/flattenColumnDefs';\r\nimport {\r\n CellDisplay,\r\n CellValue,\r\n ColumnId,\r\n RowId,\r\n RowState,\r\n RowStateEnum,\r\n} from '../../domain/value-objects';\r\nimport { columnDefFieldName } from '../columns/mapColumnDef';\r\n\r\nexport type GetRowId<TRow = unknown> = (row: TRow, index: number) => string;\r\n\r\n/** Default `getRowId`: array index. Hosts with a stable key should pass one. */\r\nexport function defaultGetRowId<TRow>(_row: TRow, index: number): string {\r\n return String(index);\r\n}\r\n\r\nexport function resolveSourceId<TRow>(\r\n row: TRow,\r\n index: number,\r\n getRowId: GetRowId<TRow> = defaultGetRowId,\r\n): string {\r\n const id = getRowId(row, index);\r\n return id === '' || id == null ? String(index) : String(id);\r\n}\r\n\r\n/**\r\n * Map a host string id onto a numeric `RowId`. Reuses ids already taken\r\n * for the same source key; otherwise prefers a parseable integer.\r\n */\r\nexport function allocateNumericRowId(\r\n sourceId: string,\r\n index: number,\r\n taken: Set<number>,\r\n known: Map<string, number>,\r\n): number {\r\n const existing = known.get(sourceId);\r\n if (existing !== undefined) return existing;\r\n if (/^-?\\d+$/.test(sourceId)) {\r\n const n = Number(sourceId);\r\n if (Number.isSafeInteger(n) && !taken.has(n)) {\r\n known.set(sourceId, n);\r\n taken.add(n);\r\n return n;\r\n }\r\n }\r\n let n = index + 1;\r\n while (taken.has(n) || n === 0) n += 1;\r\n known.set(sourceId, n);\r\n taken.add(n);\r\n return n;\r\n}\r\n\r\nexport function readHostCellValue<TRow, TValue = unknown>(\r\n data: TRow,\r\n def: ColumnDef<TRow, TValue>,\r\n): unknown {\r\n if (def.type === 'index') return undefined;\r\n if (def.valueGetter) return def.valueGetter({ data });\r\n const field = def.field as string | undefined;\r\n if (field && data && typeof data === 'object') {\r\n return (data as Record<string, unknown>)[field];\r\n }\r\n return null;\r\n}\r\n\r\nexport function readHostCellDisplay<TRow, TValue = unknown>(\r\n data: TRow,\r\n def: ColumnDef<TRow, TValue>,\r\n value: unknown,\r\n): unknown {\r\n if (def.valueFormatter) {\r\n return def.valueFormatter({ value: value as TValue, data });\r\n }\r\n return value;\r\n}\r\n\r\nfunction hasIndexColumn<TRow>(defs: ColumnDef<TRow>[]): boolean {\r\n return defs.some(\r\n (def) =>\r\n def.type === 'index' ||\r\n def.field === 'index' ||\r\n def.colId === 'index',\r\n );\r\n}\r\n\r\n/**\r\n * Domain sort/pagination still keys off an `index` cell. When the host omits\r\n * one, synthesize a hidden `#` column so order stays stable.\r\n */\r\nexport function ensureIndexColumnDef<TRow>(\r\n defs: ColDefOrGroup<TRow>[],\r\n): ColDefOrGroup<TRow>[] {\r\n const flat = flattenColDefOrGroup(defs);\r\n if (hasIndexColumn(flat)) return defs;\r\n return [\r\n {\r\n colId: 'index',\r\n headerName: '#',\r\n type: 'index',\r\n editable: false,\r\n sortable: false,\r\n hide: true,\r\n },\r\n ...defs,\r\n ];\r\n}\r\n\r\nexport type MappedRowInput = {\r\n id: number;\r\n values: Record<string, unknown>;\r\n data: unknown;\r\n sourceId: string;\r\n collection: 'default';\r\n};\r\n\r\nexport function mapRowDataToRowInputs<TRow>(\r\n rowData: readonly TRow[],\r\n columnDefs: ColumnDef<TRow>[],\r\n getRowId: GetRowId<TRow> = defaultGetRowId,\r\n): MappedRowInput[] {\r\n const known = new Map<string, number>();\r\n const taken = new Set<number>();\r\n const needsValueCopy = columnDefs.some(\r\n (def) => Boolean(def.valueGetter) || def.type === 'index',\r\n );\r\n return rowData.map((data, index) => {\r\n const sourceId = resolveSourceId(data, index, getRowId);\r\n const id = allocateNumericRowId(sourceId, index, taken, known);\r\n // PR-101: prefer leaving values on `data` (lazy cells). Only copy when\r\n // getters/index synthesis require a values bag.\r\n const values: Record<string, unknown> = { index: index + 1 };\r\n if (needsValueCopy) {\r\n for (const def of columnDefs) {\r\n const fieldName = columnDefFieldName(def);\r\n if (def.type === 'index' || fieldName === 'index') {\r\n values[fieldName] = index + 1;\r\n continue;\r\n }\r\n if (def.valueGetter) {\r\n values[fieldName] = readHostCellValue(data, def);\r\n }\r\n }\r\n }\r\n return {\r\n id,\r\n values,\r\n data,\r\n sourceId,\r\n collection: 'default',\r\n };\r\n });\r\n}\r\n\r\nfunction writeIndexCell(row: Row, index: number): boolean {\r\n const value = index + 1;\r\n let cell = row.peekCell('index');\r\n if (!cell) {\r\n cell = new Cell(\r\n row.id,\r\n ColumnId.for('index'),\r\n value,\r\n value,\r\n value,\r\n );\r\n row.cells.set('index', cell);\r\n return true;\r\n }\r\n let changed = false;\r\n if (cell.getValue() !== value) {\r\n cell.changeValue(value);\r\n cell.changeOriginalValue(value);\r\n changed = true;\r\n }\r\n if (cell.getDisplay() !== value) {\r\n cell.changeDisplay(value);\r\n changed = true;\r\n }\r\n return changed;\r\n}\r\n\r\nexport function syncRowFromHost<TRow>(\r\n row: Row,\r\n data: TRow,\r\n index: number,\r\n columnDefs: ColumnDef<TRow>[],\r\n): boolean {\r\n const sameRef = Object.is(row.data, data);\r\n row.setData(data);\r\n let changed = writeIndexCell(row, index);\r\n // PR-101: do not eagerly allocate cells. Update only already-materialized\r\n // cells; untouched fields stay on host `data`.\r\n for (const def of columnDefs) {\r\n const fieldName = columnDefFieldName(def);\r\n if (def.type === 'index' || fieldName === 'index') continue;\r\n const cell = row.peekCell(fieldName);\r\n if (!cell) {\r\n if (!sameRef) changed = true;\r\n continue;\r\n }\r\n const value = readHostCellValue(data, def);\r\n const display = readHostCellDisplay(data, def, value);\r\n if (cell.getValue() !== value) {\r\n cell.changeValue(value);\r\n cell.changeOriginalValue(value);\r\n changed = true;\r\n }\r\n if (cell.getDisplay() !== display) {\r\n cell.changeDisplay(display);\r\n changed = true;\r\n }\r\n }\r\n if (!sameRef) changed = true;\r\n return changed;\r\n}\r\n\r\nexport function createDomainRowFromHost<TRow>(\r\n data: TRow,\r\n index: number,\r\n columnDefs: ColumnDef<TRow>[],\r\n sourceId: string,\r\n numericId: number,\r\n collection = 'default',\r\n): Row {\r\n const rowId = new RowId(numericId);\r\n const cells = new Map<string, Cell>();\r\n const indexValue = index + 1;\r\n // PR-101: only materialize the index cell. Other fields stay on `data`\r\n // until getCell / edit — keeps 100k×N under the memory budget.\r\n cells.set(\r\n 'index',\r\n new Cell(\r\n rowId,\r\n ColumnId.for('index'),\r\n indexValue,\r\n indexValue,\r\n indexValue,\r\n ),\r\n );\r\n void columnDefs;\r\n return new Row(\r\n rowId,\r\n cells,\r\n new RowState(RowStateEnum.Unchanged),\r\n new Set(),\r\n {},\r\n collection,\r\n false,\r\n data,\r\n sourceId,\r\n );\r\n}\r\n\r\nexport type HostRowDataDiffResult = {\r\n added: number;\r\n updated: number;\r\n removed: number;\r\n kept: number;\r\n structureChanged: boolean;\r\n removedIds: number[];\r\n /** Domain `Row` instances whose cells were not rewritten. */\r\n unchangedRows: Row[];\r\n};\r\n\r\n/**\r\n * Align table rows with a new `rowData` array without rebuilding the table.\r\n * Unchanged rows keep the same `Row` instance (no deep clone of `data`).\r\n */\r\nexport function applyHostRowDataToTable<TRow>(\r\n table: Table,\r\n rowData: readonly TRow[],\r\n columnDefs: ColumnDef<TRow>[],\r\n getRowId: GetRowId<TRow> = defaultGetRowId,\r\n): HostRowDataDiffResult {\r\n const existing = table.getRows();\r\n const known = new Map<string, number>();\r\n const taken = new Set<number>();\r\n const bySource = new Map<string, Row>();\r\n for (const row of existing) {\r\n const sid = row.sourceId ?? String(row.id.value);\r\n known.set(sid, row.id.value);\r\n taken.add(row.id.value);\r\n bySource.set(sid, row);\r\n }\r\n\r\n const nextIds = new Set<string>();\r\n let added = 0;\r\n let updated = 0;\r\n let kept = 0;\r\n const unchangedRows: Row[] = [];\r\n const collection = table.getActiveCollectionName();\r\n\r\n for (let i = 0; i < rowData.length; i += 1) {\r\n const data = rowData[i] as TRow;\r\n const sourceId = resolveSourceId(data, i, getRowId);\r\n nextIds.add(sourceId);\r\n const prev = bySource.get(sourceId);\r\n if (!prev) {\r\n const numericId = allocateNumericRowId(sourceId, i, taken, known);\r\n table.hostPutRow(\r\n createDomainRowFromHost(\r\n data,\r\n i,\r\n columnDefs,\r\n sourceId,\r\n numericId,\r\n collection,\r\n ),\r\n );\r\n added += 1;\r\n continue;\r\n }\r\n const sameRef = Object.is(prev.data, data);\r\n const cellsChanged = syncRowFromHost(prev, data, i, columnDefs);\r\n if (cellsChanged) {\r\n updated += 1;\r\n } else {\r\n kept += 1;\r\n unchangedRows.push(prev);\r\n if (!sameRef) prev.setData(data);\r\n }\r\n }\r\n\r\n const removedIds: number[] = [];\r\n for (const row of existing) {\r\n const sid = row.sourceId ?? String(row.id.value);\r\n if (!nextIds.has(sid)) {\r\n table.hostRemoveRow(row.id.value);\r\n removedIds.push(row.id.value);\r\n }\r\n }\r\n\r\n return {\r\n added,\r\n updated,\r\n removed: removedIds.length,\r\n kept,\r\n structureChanged: added > 0 || removedIds.length > 0,\r\n removedIds,\r\n unchangedRows,\r\n };\r\n}\r\n","// application/commands/tableCommands.ts\r\n\r\nimport { Table } from '../../domain/entities/Table';\r\nimport { TableActions } from '../../domain/value-objects';\r\nimport type { FilterModel } from '../../engine/dataOps/filterModel';\r\nimport type {\r\n GridSearchState,\r\n MobileEditorState,\r\n} from '../../engine/type';\r\n\r\nexport interface BaseTableCommand {\r\n readonly store: string;\r\n readonly tableKey: string;\r\n /** When set, undoable events from separate executes merge into one undo unit. */\r\n readonly correlationId?: string;\r\n}\r\n\r\nexport type Actor = {\r\n readonly userId: string;\r\n readonly roles: string[];\r\n};\r\n\r\n/**\r\n * Base invariant:\r\n * هر Command دقیقاً متعلق به یک Table است\r\n */\r\n\r\n/* ---------- Cell ---------- */\r\n\r\nexport interface MoveActiveCellCommand {\r\n readonly type: 'MOVE_ACTIVE_CELL';\r\n readonly store: string;\r\n readonly tableKey: string;\r\n readonly rowId: number;\r\n readonly columnId: string;\r\n readonly direction: 'next' | 'prev';\r\n}\r\nexport interface MoveActiveCellVerticalCommand {\r\n readonly type: 'MOVE_ACTIVE_CELL_VERTICAL';\r\n readonly store: string;\r\n readonly tableKey: string;\r\n readonly rowId: number;\r\n readonly columnId: string;\r\n readonly direction: 'up' | 'down';\r\n}\r\nexport interface MoveVerticalSelectedRows {\r\n readonly type: 'MOVE_VERTICAL_SELECTED_ROWS';\r\n readonly tableKey: string;\r\n readonly direction: 'up' | 'down';\r\n}\r\nexport interface MoveVerticalActiveRow {\r\n readonly type: 'MOVE_VERTICAL_ACTIVE_ROW';\r\n readonly tableKey: string;\r\n readonly direction: 'up' | 'down';\r\n}\r\nexport interface ActiveCellCommand {\r\n readonly type: 'ACTIVE_CELL';\r\n readonly tableKey: string;\r\n\r\n readonly rowId: number;\r\n readonly columnId: string;\r\n}\r\nexport interface ActiveRowCommand extends BaseTableCommand {\r\n readonly type: 'ACTIVE_ROW';\r\n readonly tableKey: string;\r\n\r\n readonly rowId: number;\r\n}\r\nexport interface ActiveFirstCellCommand {\r\n readonly type: 'ACTIVATE_FIRST_CELL';\r\n readonly tableKey: string;\r\n\r\n readonly rowId: number;\r\n\r\n}\r\n\r\nexport interface ChangeCellValueCommand extends BaseTableCommand {\r\n readonly type: 'CHANGE_CELL_VALUE';\r\n readonly rowId: number;\r\n readonly columnId: string;\r\n readonly newValue: unknown;\r\n}\r\n \r\nexport interface SaveDescriptionCommand extends BaseTableCommand {\r\n readonly type: 'SAVE_DESCRIPTION';\r\n readonly rowId: number;\r\n readonly flag: boolean;\r\n \r\n}\r\nexport interface ChangeCellDisplayValueCommand extends BaseTableCommand {\r\n readonly type: 'CHANGE_CELL_DISPLAY_VALUE';\r\n readonly rowId: number;\r\n readonly columnId: string;\r\n readonly newValue: string;\r\n}\r\n\r\n\r\n/* ---------- Row ---------- */\r\n\r\nexport interface AddEmptyRowCommand extends BaseTableCommand {\r\n readonly type: 'ADD_EMPTY_ROW';\r\n readonly autoActivate: boolean;\r\n}\r\nexport interface AddNewRowsCommand extends BaseTableCommand {\r\n readonly type: 'ADD_NEW_ROWS';\r\n readonly detailFieldKey: string;\r\n readonly rows: {\r\n key: string;\r\n value: unknown;\r\n display: unknown;\r\n }[][];\r\n readonly autoActivate?: boolean;\r\n}\r\n\r\n\r\nexport interface DuplicateRowCommand extends BaseTableCommand {\r\n readonly type: 'DUPLICATE_ROW';\r\n readonly rowId: number;\r\n}\r\n\r\n/**\r\n * Clone one source row (clipboard paste). Engine batches these with a shared\r\n * correlationId so undo reverses the whole paste unit.\r\n */\r\nexport interface PasteCellsCommand extends BaseTableCommand {\r\n readonly type: 'PASTE_CELLS';\r\n readonly updates: readonly {\r\n rowId: number;\r\n columnId: string;\r\n rawText: string;\r\n }[];\r\n}\r\n\r\nexport interface PasteRowCommand extends BaseTableCommand {\r\n readonly type: 'PASTE_ROW';\r\n readonly sourceRowId: number;\r\n /** When set (pasteInsert), place the clone relative to this row. */\r\n readonly placeAtRowId?: number;\r\n}\r\n\r\nexport interface DeleteRowCommand extends BaseTableCommand {\r\n readonly type: 'ROW_DELETED';\r\n readonly rowId: number;\r\n\r\n}\r\n\r\n/** Undo-stack redo: re-insert a previously added row with original identity/values. */\r\nexport interface RestoreAddedRowCommand extends BaseTableCommand {\r\n readonly type: 'RESTORE_ADDED_ROW';\r\n readonly rowId: number;\r\n readonly cells: Readonly<\r\n Record<\r\n string,\r\n {\r\n readonly value: unknown;\r\n readonly display?: unknown;\r\n readonly originalValue?: unknown;\r\n }\r\n >\r\n >;\r\n readonly collection?: string;\r\n readonly isSaveDescription?: boolean;\r\n}\r\n\r\nexport interface DeleteRowsCommand extends BaseTableCommand {\r\n readonly type: 'ROWS_DELETED';\r\n /** Selected row ids (may include rows not in the RAM page window). Filled by engine if omitted. */\r\n readonly rowIds?: number[];\r\n}\r\nexport interface ExpandRowCommand {\r\n readonly type: 'ROW_EXPANDED';\r\n readonly tableKey: string,\r\n readonly rowId: number,\r\n readonly value: boolean\r\n\r\n}\r\nexport interface SelectRowCommand {\r\n readonly type: 'ROW_SELECTED';\r\n readonly tableKey: string,\r\n readonly rowId: number,\r\n}\r\nexport interface ToggleRowSelectionCommand {\r\n readonly type: \"ROW_SELECTION_TOGGLED\";\r\n readonly tableKey: string;\r\n readonly rowId: number;\r\n\r\n}\r\nexport interface ToggleRowExpandCommand {\r\n readonly type: 'ROW_EXPAND_TOGGLED';\r\n readonly tableKey: string,\r\n readonly rowId: number\r\n\r\n}\r\nexport interface SelectRangeCommand {\r\n readonly type: \"ROW_RANGE_SELECTED\";\r\n readonly tableKey: string;\r\n readonly rowId: number;\r\n}\r\nexport interface SelectActiveRowToLastCommand {\r\n readonly type: \"SELECT_FROM_ACTIVE_TO_LAST\";\r\n readonly tableKey: string;\r\n readonly anchorRowId: number;\r\n}\r\nexport interface RowReorderedCommand extends BaseTableCommand {\r\n readonly type: 'ROW_REORDERED';\r\n readonly draggedRowId: number;\r\n readonly droppedRowId: number;\r\n readonly position: 'before' | 'after';\r\n}\r\n\r\nexport interface SelectAllRowsCommand {\r\n readonly type: 'TOGGLE_SELECT_ALL_ROWS';\r\n readonly store: string;\r\n readonly tableKey: string;\r\n}\r\nexport interface SelectPageRowsCommand {\r\n readonly type: 'TOGGLE_SELECT_PAGE_ROWS';\r\n readonly tableKey: string;\r\n\r\n\r\n\r\n}\r\nexport interface ClearRowSelectionCommand {\r\n readonly type: 'CLEAR_ROW_SELECTION';\r\n readonly tableKey: string;\r\n\r\n\r\n\r\n}\r\nexport interface CollapseAllRowsCommand {\r\n readonly type: 'COLLAPSE_ALL_ROWS';\r\n readonly tableKey: string;\r\n\r\n\r\n}\r\n/* ---------- Column ---------- */\r\n\r\nexport interface ColumnReorderedCommand extends BaseTableCommand {\r\n readonly type: 'COLUMN_REORDERED';\r\n readonly sourceIndex: number;\r\n readonly destIndex: number;\r\n}\r\n/* ---------- Table ---------- */\r\nexport interface DeleteTableCommand extends BaseTableCommand {\r\n readonly type: 'TABLE_DELETED';\r\n\r\n}\r\nexport interface SetActiveCollectionCommand extends BaseTableCommand {\r\n readonly type: 'SET_ACTIVE_COLLECTION';\r\n readonly activeCollection: string;\r\n\r\n}\r\nexport interface ResetTableCommand extends BaseTableCommand {\r\n readonly type: 'TABLE_RESET';\r\n readonly rowId: string;\r\n\r\n}\r\nexport interface RegisterTableCommand extends BaseTableCommand {\r\n readonly type: 'TABLE_REGISTERED';\r\n readonly store: string,\r\n readonly table: Table\r\n\r\n}\r\nexport interface DisposeTableCommand extends BaseTableCommand {\r\n readonly type: 'TABLE_DISPOSED';\r\n}\r\nexport interface ChangeTableActionCommand extends BaseTableCommand {\r\n readonly type: 'SET_TABLE_ACTION';\r\n action: TableActions\r\n}\r\n\r\n\r\n\r\n\r\n\r\n/* ---------- Pagination ---------- */\r\n\r\nexport interface ChangePageCommand extends BaseTableCommand {\r\n readonly type: 'CHANGE_PAGE';\r\n readonly page: number;\r\n}\r\n\r\nexport interface ChangePageSizeCommand extends BaseTableCommand {\r\n readonly type: 'CHANGE_PAGE_SIZE';\r\n readonly pageSize: number;\r\n}\r\n\r\n/* ---------- Other ---------- */\r\n\r\nexport interface ApplyDynamicProjectionCommand extends BaseTableCommand {\r\n readonly type: 'APPLY_DYNAMIC_PROJECTION';\r\n readonly tableKey: string;\r\n readonly rowId: number;\r\n readonly columnId: string;\r\n\r\n}\r\n\r\n/**\r\n * اعمال مجدد شروط visibility ریموت برای یک سطر مشخص (مثلاً هنگام active شدن سطر\r\n * در حالت ویرایش) بدون تغییر RowState یا پاککردن سلولهای وابسته.\r\n */\r\nexport interface ApplyRowVisibilityCommand extends BaseTableCommand {\r\n readonly type: 'APPLY_ROW_VISIBILITY';\r\n readonly tableKey: string;\r\n readonly rowId: number;\r\n}\r\n\r\n/* ---------- UI overlay state (engine-managed) ---------- */\r\n\r\nexport interface SetGridSearchCommand {\r\n readonly type: 'SET_GRID_SEARCH';\r\n readonly tableKey: string;\r\n readonly search: GridSearchState;\r\n}\r\n\r\nexport interface SetMobileEditorCommand {\r\n readonly type: 'SET_MOBILE_EDITOR';\r\n readonly tableKey: string;\r\n readonly editor: MobileEditorState;\r\n}\r\n\r\nexport interface ResizeColumnCommand {\r\n readonly type: 'RESIZE_COLUMN';\r\n readonly tableKey: string;\r\n readonly columnId: string;\r\n readonly width: number;\r\n}\r\n\r\nexport interface SetColumnVisibleCommand {\r\n readonly type: 'SET_COLUMN_VISIBLE';\r\n readonly tableKey: string;\r\n readonly columnId: string;\r\n readonly visible: boolean;\r\n}\r\n\r\nexport interface ToggleColumnGroupCommand {\r\n readonly type: 'TOGGLE_COLUMN_GROUP';\r\n readonly tableKey: string;\r\n readonly groupId: string;\r\n}\r\n\r\nexport interface SetColumnPinnedCommand {\r\n readonly type: 'SET_COLUMN_PIN';\r\n readonly tableKey: string;\r\n readonly columnId: string;\r\n readonly pinned: 'start' | 'end' | null;\r\n}\r\n\r\nexport interface SetSortModelCommand {\r\n readonly type: 'SET_SORT_MODEL';\r\n readonly tableKey: string;\r\n /** Empty / omit fields cleared by host ⇒ document `index` order. */\r\n readonly sortModel: readonly {\r\n readonly colId: string;\r\n readonly sort: 'asc' | 'desc';\r\n }[];\r\n}\r\n\r\nexport interface SetQuickFilterTextCommand {\r\n readonly type: 'SET_QUICK_FILTER_TEXT';\r\n readonly tableKey: string;\r\n /** Empty string clears the filter (all rows visible). */\r\n readonly quickFilterText: string;\r\n}\r\n\r\nexport interface SetFilterModelCommand {\r\n readonly type: 'SET_FILTER_MODEL';\r\n readonly tableKey: string;\r\n /** Empty object clears all column filters. */\r\n readonly filterModel: FilterModel;\r\n}\r\n\r\nexport interface SetRowGroupColumnsCommand {\r\n readonly type: 'SET_ROW_GROUP_COLUMNS';\r\n readonly tableKey: string;\r\n /** Only the first entry is active in 0.12.0 (RFC-002). */\r\n readonly columns: readonly string[];\r\n}\r\n\r\nexport interface SetGroupDefaultExpandedCommand {\r\n readonly type: 'SET_GROUP_DEFAULT_EXPANDED';\r\n readonly tableKey: string;\r\n readonly expanded: boolean;\r\n}\r\n\r\nexport interface ToggleRowGroupCommand {\r\n readonly type: 'TOGGLE_ROW_GROUP';\r\n readonly tableKey: string;\r\n /** `normalizeGroupKey` of the group. */\r\n readonly groupKey: string;\r\n}\r\n\r\n/* ---------- Union ---------- */\r\n\r\nexport type EngineTableCommand =\r\n SelectActiveRowToLastCommand\r\n | SelectRangeCommand\r\n | ToggleRowExpandCommand\r\n | SelectRowCommand\r\n | CollapseAllRowsCommand\r\n | RegisterTableCommand\r\n | DisposeTableCommand\r\n | DeleteRowsCommand\r\n | ToggleRowSelectionCommand\r\n | SelectAllRowsCommand\r\n | SelectPageRowsCommand\r\n | ClearRowSelectionCommand\r\n | ActiveCellCommand\r\n | ActiveRowCommand\r\n | MoveActiveCellCommand\r\n | MoveActiveCellVerticalCommand\r\n | MoveVerticalSelectedRows\r\n | MoveVerticalActiveRow\r\n | ActiveFirstCellCommand\r\n | ExpandRowCommand\r\n | ChangeTableActionCommand\r\n | SetGridSearchCommand\r\n | SetMobileEditorCommand\r\n | ResizeColumnCommand\r\n | SetColumnVisibleCommand\r\n | ToggleColumnGroupCommand\r\n | SetColumnPinnedCommand\r\n | SetSortModelCommand\r\n | SetQuickFilterTextCommand\r\n | SetFilterModelCommand\r\n | SetRowGroupColumnsCommand\r\n | SetGroupDefaultExpandedCommand\r\n | ToggleRowGroupCommand;\r\n\r\nexport type ApplicationTableCommand =\r\n | ChangeCellValueCommand\r\n | SaveDescriptionCommand\r\n | ChangeCellDisplayValueCommand\r\n | AddEmptyRowCommand\r\n | AddNewRowsCommand\r\n | DuplicateRowCommand\r\n | PasteCellsCommand\r\n | PasteRowCommand\r\n | DeleteRowCommand\r\n | RestoreAddedRowCommand\r\n | DeleteTableCommand\r\n | SetActiveCollectionCommand\r\n | ResetTableCommand\r\n | RowReorderedCommand\r\n | ColumnReorderedCommand\r\n | ChangePageCommand\r\n | ChangePageSizeCommand\r\n | ApplyDynamicProjectionCommand\r\n | ApplyRowVisibilityCommand\r\n | DeleteRowsCommand;\r\n\r\nexport type TableCommand =\r\n | EngineTableCommand\r\n | ApplicationTableCommand;\r\n\r\nconst applicationCommandTypes = new Set<TableCommand['type']>([\r\n 'CHANGE_CELL_VALUE',\r\n 'SAVE_DESCRIPTION',\r\n 'CHANGE_CELL_DISPLAY_VALUE',\r\n 'ADD_EMPTY_ROW',\r\n 'ADD_NEW_ROWS',\r\n 'DUPLICATE_ROW',\r\n 'PASTE_ROW',\r\n 'PASTE_CELLS',\r\n 'ROW_DELETED',\r\n 'RESTORE_ADDED_ROW',\r\n 'TABLE_DELETED',\r\n 'SET_ACTIVE_COLLECTION',\r\n 'TABLE_RESET',\r\n 'ROW_REORDERED',\r\n 'COLUMN_REORDERED',\r\n 'CHANGE_PAGE',\r\n 'CHANGE_PAGE_SIZE',\r\n 'APPLY_DYNAMIC_PROJECTION',\r\n 'APPLY_ROW_VISIBILITY',\r\n]);\r\n\r\nexport function isApplicationTableCommand(\r\n command: TableCommand\r\n): command is ApplicationTableCommand {\r\n return applicationCommandTypes.has(command.type);\r\n}\r\n","// engine/EngineErrorHandler.ts\r\n\r\nimport { DomainError } from '../domain/errors/DomainError';\r\nimport {\r\n ConsoleAuditLogger,\r\n} from '../infrastructure/Repositories/consoleAuditLogger';\r\n\r\nexport class EngineErrorHandler {\r\n constructor(private readonly audit: ConsoleAuditLogger) {}\r\n\r\n /**\r\n * همهی خطاها — چه DomainError چه runtime error — از اینجا رد میشن\r\n * و از طریق ConsoleAuditLogger لاگ میشن.\r\n */\r\n handle(error: unknown, context?: string): void {\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: { details: error.details, context },\r\n });\r\n return;\r\n }\r\n\r\n if (error instanceof Error) {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: error.message,\r\n payload: { stack: error.stack, context },\r\n });\r\n return;\r\n }\r\n\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: 'Unknown error',\r\n payload: { error, context },\r\n });\r\n }\r\n\r\n /** برای جاهایی که store یا table پیدا نشد */\r\n notFound(entity: string, key: string, context?: string): void {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: `${entity} \"${key}\" could not be found`,\r\n payload: { key, context },\r\n });\r\n }\r\n}","import { EngineErrorHandler } from '../EngineErrorHandler';\r\nimport {\r\n clickCell,\r\n ctrlClickCell,\r\n createEmptyCellRangeSelection,\r\n normalizeCellRange,\r\n selectAllCellRanges,\r\n shiftArrowCell,\r\n shiftClickCell,\r\n type ArrowDirection,\r\n type CellAddress,\r\n type CellRange,\r\n type CellRangeBounds,\r\n type CellRangeSelection,\r\n} from '../selection/cellRange';\r\nimport { TableStore } from '../tableStore';\r\nimport type { TableState } from '../type';\r\n\r\nexport class CellRangeManager {\r\n constructor(\r\n private readonly readStore: () => TableStore<TableState> | undefined,\r\n private readonly getBounds: () => CellRangeBounds,\r\n private readonly err: EngineErrorHandler,\r\n ) {}\r\n\r\n private getStore(tableKey: string) {\r\n const store = this.readStore();\r\n if (!store) {\r\n this.err.notFound('TableStore', tableKey, 'CellRangeManager');\r\n }\r\n return store;\r\n }\r\n\r\n getSelection(tableKey: string): CellRangeSelection {\r\n const store = this.getStore(tableKey);\r\n if (!store) return createEmptyCellRangeSelection();\r\n return store.getState().cellRangeSelection ?? createEmptyCellRangeSelection();\r\n }\r\n\r\n setSelection(tableKey: string, selection: CellRangeSelection): void {\r\n const store = this.getStore(tableKey);\r\n if (!store) return;\r\n store.setState((prev) => ({\r\n ...prev,\r\n cellRangeSelection: selection,\r\n }));\r\n }\r\n\r\n handlePointer(cmd: {\r\n tableKey: string;\r\n rowIndex: number;\r\n colId: string;\r\n shiftKey: boolean;\r\n ctrlKey: boolean;\r\n }): CellRangeSelection {\r\n const bounds = this.getBounds();\r\n const cell: CellAddress = { rowIndex: cmd.rowIndex, colId: cmd.colId };\r\n const prev = this.getSelection(cmd.tableKey);\r\n let next: CellRangeSelection;\r\n if (cmd.shiftKey) {\r\n next = shiftClickCell(prev, cell, bounds);\r\n } else if (cmd.ctrlKey) {\r\n next = ctrlClickCell(prev, cell, bounds);\r\n } else {\r\n next = clickCell(prev, cell, bounds);\r\n }\r\n this.setSelection(cmd.tableKey, next);\r\n return next;\r\n }\r\n\r\n extendWithArrow(\r\n tableKey: string,\r\n direction: ArrowDirection,\r\n ): CellRangeSelection {\r\n const bounds = this.getBounds();\r\n const prev = this.getSelection(tableKey);\r\n const next = shiftArrowCell(prev, direction, bounds);\r\n this.setSelection(tableKey, next);\r\n return next;\r\n }\r\n\r\n selectAll(tableKey: string): CellRangeSelection {\r\n const bounds = this.getBounds();\r\n const next = selectAllCellRanges(bounds);\r\n this.setSelection(tableKey, next);\r\n return next;\r\n }\r\n\r\n addRange(tableKey: string, range: CellRange): CellRangeSelection {\r\n const bounds = this.getBounds();\r\n const normalized = normalizeCellRange(range, bounds);\r\n const prev = this.getSelection(tableKey);\r\n const next: CellRangeSelection = {\r\n ranges: [...prev.ranges, normalized],\r\n anchor: prev.anchor,\r\n focus: prev.focus,\r\n };\r\n this.setSelection(tableKey, next);\r\n return next;\r\n }\r\n\r\n clear(tableKey: string): void {\r\n this.setSelection(tableKey, createEmptyCellRangeSelection());\r\n }\r\n}\r\n","// engine/managers/NavigationManager.ts\r\n\r\nimport {\r\n Actor,\r\n ApplyDynamicProjectionCommand,\r\n TableCommand,\r\n ApplyRowVisibilityCommand,\r\n} from '../../application/commands';\r\nimport { TableRepository } from '../../application/ports/TableRepository';\r\nimport { TableAppService } from '../../application/TableAppService';\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { Row } from '../../domain/entities/Row';\r\nimport { EngineErrorHandler } from '../EngineErrorHandler';\r\nimport { TableStore } from '../tableStore';\r\nimport {\r\n TableState,\r\n TableViewState,\r\n} from '../type';\r\nimport type { SparseRowIndex } from '../SparseRowIndex';\r\n\r\nexport class NavigationManager {\r\n constructor(\r\n private readonly readStore: () => TableStore<TableState> | undefined,\r\n private readonly app: TableAppService,\r\n private readonly repo: TableRepository,\r\n private readonly actor: Actor,\r\n private readonly err: EngineErrorHandler,\r\n /**\r\n * getViewState از TableEngine تزریق میشه\r\n * تا NavigationManager به ViewStateBuilder وابستگی مستقیم نداشته باشه\r\n */\r\n private readonly getViewState: () => TableViewState | undefined,\r\n private readonly dispatch: (cmd: TableCommand) => Promise<void>,\r\n /** Ordered UI row index (PR-99) — O(1) vertical neighbor. */\r\n private readonly getUiRowIndex: () => SparseRowIndex<number>,\r\n /**\r\n * متای زندهٔ ستونها از کانفیگ (دارای resolveOn / dynamicSource). در حالت\r\n * page-window ستونهای RAM از IndexedDB میآیند و توابع را ندارند؛ پس برای\r\n * تشخیص ستونهای شرطیِ فعالشدن سطر لازم است. optional.\r\n */\r\n private readonly columnMeta?: Map<string, ColumnSchema>,\r\n ) { }\r\n\r\n private getStore(tableKey: string) {\r\n const store = this.readStore();\r\n if (!store) {\r\n this.err.notFound('TableStore', tableKey, 'NavigationManager');\r\n }\r\n return store;\r\n }\r\n\r\n setActiveCell(cmd: {\r\n tableKey: string;\r\n rowId: number;\r\n columnId: string;\r\n }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n store.setState(prev => {\r\n const current = prev.activeCell;\r\n if (\r\n current &&\r\n current.rowId === cmd.rowId &&\r\n current.columnId === cmd.columnId\r\n ) {\r\n return prev;\r\n }\r\n return {\r\n ...prev,\r\n activeRowId: cmd.rowId,\r\n activeCell: { rowId: cmd.rowId, columnId: cmd.columnId },\r\n };\r\n });\r\n }\r\n async setActiveRow(cmd: {\r\n store: string;\r\n tableKey: string;\r\n rowId: number;\r\n }): Promise<void> {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n const { table } = store.getState();\r\n if (!table) return;\r\n const row = table.getRows().find(r => r.id.value === cmd.rowId);\r\n if (!row) {\r\n this.err.handle('Row not found in setActiveRow', `${cmd.tableKey, cmd.rowId}`);\r\n return;\r\n }\r\n // Re-apply remote visibility flags for this row without wiping dependent values\r\n // (clearing is only for real cell value changes via CHANGE_CELL_VALUE).\r\n await this.fetchVisibilityCondition(cmd, row);\r\n store.setState(prev => {\r\n if (prev.activeRowId === cmd.rowId) {\r\n return {\r\n ...prev,\r\n rangeAnchorRowId: cmd.rowId,\r\n };\r\n }\r\n return {\r\n ...prev,\r\n activeRowId: cmd.rowId,\r\n activeCell: null,\r\n rangeAnchorRowId: cmd.rowId,\r\n };\r\n });\r\n }\r\n\r\n activateFirstCell(cmd: { tableKey: string; rowId: number }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const state = store.getState();\r\n const firstEditable = state.table\r\n .getActiveCollectionColumns()\r\n .find(\r\n c =>\r\n c.editable !== false &&\r\n c.fieldName !== 'index' &&\r\n c.fieldType !== 'index' &&\r\n c.fieldType !== 'static' &&\r\n !c.hidden,\r\n );\r\n\r\n if (!firstEditable) return;\r\n\r\n store.setState(() => ({\r\n ...state,\r\n activeCell: { rowId: cmd.rowId, columnId: firstEditable.fieldName },\r\n }));\r\n }\r\n\r\n async fetchVisibilityCondition(\r\n cmd: { store: string; tableKey: string; rowId: number },\r\n row: Row,\r\n ): Promise<void> {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const { table } = store.getState();\r\n if (!table) return;\r\n\r\n // ستونهای جدول RAM پس از معماری page-window از متای ذخیرهشدهٔ IndexedDB\r\n // ساخته میشوند که توابع (resolveOn / dynamicSource) را serialize نمیکند؛\r\n // پس منبع تشخیص باید columnMeta زندهٔ کانفیگ باشد، نه ستونهای RAM.\r\n const columns: ColumnSchema[] = this.columnMeta\r\n ? Array.from(this.columnMeta.values()).filter(\r\n col => (col.fieldCollection ?? 'default') ===\r\n (table.getActiveCollectionName() ?? 'default'),\r\n )\r\n : table.getColumns();\r\n const cellDependency = new Set<string>();\r\n\r\n columns\r\n .filter(\r\n col =>\r\n !!col.dynamicSource?.dependsOn &&\r\n col.dynamicSource.dependsOn.length > 0,\r\n )\r\n .forEach(col => {\r\n const deps = col.dynamicSource?.dependsOn;\r\n if (!deps) return;\r\n for (const dep of deps) {\r\n cellDependency.add(dep);\r\n }\r\n });\r\n\r\n /* ستونهای دارای resolveOn تعیینکنندهٔ visibilityCondition ریموت سطرند؛\r\n هنگام فعالشدن سطر (مثلاً در حالت ویرایش) باید visibilityCondition\r\n از روی مقادیر فعلی آنها دوباره گرفته شود. */\r\n const resolveOnFields = new Set(\r\n columns\r\n .filter(col => col.resolveOn != null)\r\n .map(col => col.resolveOn!.fieldName)\r\n .filter(f => !!f),\r\n );\r\n\r\n for (const col of resolveOnFields) {\r\n const cell = row.getCell(col);\r\n if (!cell) continue;\r\n const val = cell.getValue();\r\n if (val == null || val === '') continue;\r\n\r\n const command: ApplyRowVisibilityCommand = {\r\n type: 'APPLY_ROW_VISIBILITY',\r\n store: cmd.store,\r\n tableKey: cmd.tableKey,\r\n rowId: cmd.rowId,\r\n };\r\n try {\r\n await this.app.execute(command, this.actor);\r\n } catch (e) {\r\n this.err.handle(e, 'NavigationManager.fetchVisibilityCondition.applyRowVisibility');\r\n }\r\n }\r\n\r\n for (const col of cellDependency) {\r\n const cell = row.getCell(col);\r\n\r\n if (!cell) {\r\n this.err.notFound('Cell not found', `${cmd.rowId, col}`);\r\n continue;\r\n }\r\n\r\n const val = cell.getValue(); if (val) {\r\n const command: ApplyDynamicProjectionCommand = {\r\n type: 'APPLY_DYNAMIC_PROJECTION',\r\n store: cmd.store,\r\n tableKey: cmd.tableKey,\r\n rowId: cmd.rowId,\r\n columnId: col,\r\n };\r\n try {\r\n await this.app.execute(command, this.actor);\r\n } catch (e) {\r\n this.err.handle(e, 'NavigationManager.fetchVisibilityCondition');\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const updated = await this.repo.getById(cmd.store, cmd.tableKey);\r\n const currentStore = this.getStore(cmd.tableKey);\r\n if (currentStore && updated) {\r\n const prev = currentStore.getState();\r\n currentStore.setState(() => ({ ...prev, table: updated }));\r\n }\r\n } catch (e) {\r\n this.err.handle(e, 'NavigationManager.fetchVisibilityCondition.reload');\r\n }\r\n }\r\n\r\n async moveActiveCell(cmd: {\r\n store: string;\r\n tableKey: string;\r\n rowId: number;\r\n columnId: string;\r\n direction: 'next' | 'prev';\r\n }): Promise<void> {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const state = await store.getState();\r\n const table = state.table;\r\n\r\n const row = table.getRow(cmd.rowId);\r\n if (!row) {\r\n this.err.notFound('Row not found in moveActiveCell', `${cmd.rowId}`);\r\n\r\n return;\r\n }\r\n\r\n const disabledCols = Object.entries(\r\n row.getVisibilityCondition() ?? {},\r\n )\r\n .filter(([, value]) => value === false)\r\n .map(([key]) => key);\r\n\r\n const columns = table\r\n .getActiveCollectionColumns()\r\n .filter(\r\n c =>\r\n !c.hidden &&\r\n c.editable !== false &&\r\n !disabledCols.includes(c.fieldName) &&\r\n c.fieldName !== 'index' &&\r\n c.fieldType !== 'index' &&\r\n c.fieldType !== 'static',\r\n );\r\n\r\n\r\n const currentColIndex = columns.findIndex(c => c.fieldName === cmd.columnId);\r\n if (currentColIndex === -1) return;\r\n\r\n const nextColIndex =\r\n cmd.direction === 'next' ? currentColIndex + 1 : currentColIndex - 1;\r\n const nextColumn = columns[nextColIndex];\r\n // حرکت در همان سطر\r\n if (nextColumn !== undefined) {\r\n store.setState(prev => ({\r\n ...prev,\r\n activeRowId: cmd.rowId,\r\n activeCell: { rowId: cmd.rowId, columnId: nextColumn.fieldName },\r\n }));\r\n return;\r\n }\r\n // رسیدیم به انتهای ستونهای سطر جاری\r\n const allRows = table.getRows();\r\n const currentRowIndex = allRows.findIndex(r => r.id.value === cmd.rowId);\r\n const isLastRow = currentRowIndex === allRows.length - 1;\r\n const isFirstRow = currentRowIndex === 0;\r\n\r\n if (cmd.direction === 'next') {\r\n if (isLastRow) {\r\n await this.addEmptyRowAndActivate(cmd, store, state, columns);\r\n return;\r\n }\r\n\r\n let nextValidRowIndex = -1;\r\n for (let offset = 1; currentRowIndex + offset < allRows.length; offset++) {\r\n if (allRows[currentRowIndex + offset].rowState.value !== 'Delete') {\r\n nextValidRowIndex = currentRowIndex + offset;\r\n break;\r\n }\r\n }\r\n\r\n if (nextValidRowIndex !== -1) {\r\n const nextRowId = allRows[nextValidRowIndex].id.value;\r\n store.setState(() => ({\r\n ...state,\r\n activeRowId: nextRowId,\r\n activeCell: { rowId: nextRowId, columnId: columns[0].fieldName },\r\n }));\r\n return;\r\n }\r\n\r\n await this.addEmptyRowAndActivate(cmd, store, state, columns);\r\n return;\r\n }\r\n\r\n if (cmd.direction === 'prev') {\r\n if (isFirstRow) return;\r\n\r\n let prevValidRowIndex = -1;\r\n for (let offset = 1; currentRowIndex - offset >= 0; offset++) {\r\n if (allRows[currentRowIndex - offset].rowState.value !== 'Delete') {\r\n prevValidRowIndex = currentRowIndex - offset;\r\n break;\r\n }\r\n }\r\n\r\n if (prevValidRowIndex !== -1) {\r\n const prevRowId = allRows[prevValidRowIndex].id.value;\r\n const lastColumn = columns[columns.length - 1];\r\n store.setState(() => ({\r\n ...state,\r\n activeRowId: prevRowId,\r\n activeCell: { rowId: prevRowId, columnId: lastColumn.fieldName },\r\n }));\r\n }\r\n }\r\n }\r\n\r\n private async addEmptyRowAndActivate(\r\n cmd: { store: string; tableKey: string },\r\n store: TableStore<TableState>,\r\n state: TableState,\r\n columns: ReturnType<typeof state.table.getColumns>,\r\n ): Promise<void> {\r\n try {\r\n const newRow = await this.app.execute(\r\n {\r\n type: 'ADD_EMPTY_ROW',\r\n store: cmd.store,\r\n tableKey: cmd.tableKey,\r\n autoActivate: true,\r\n },\r\n this.actor,\r\n );\r\n const firstColumn = columns[0];\r\n\r\n if (!firstColumn) {\r\n this.err.notFound('No editable column found after adding row', cmd.tableKey);\r\n return;\r\n }\r\n\r\n\r\n if (\r\n !newRow ||\r\n typeof newRow !== 'object' ||\r\n !('rowId' in newRow)\r\n ) {\r\n this.err.notFound('Invalid ADD_EMPTY_ROW response', `${newRow}`);\r\n return;\r\n }\r\n\r\n\r\n const rowIdValue = (newRow as { rowId?: { value?: unknown } }).rowId?.value;\r\n const rowId = typeof rowIdValue === 'number' ? rowIdValue : undefined;\r\n\r\n if (!rowId) {\r\n\r\n this.err.notFound('Missing rowId in ADD_EMPTY_ROW response', `${newRow}`);\r\n return;\r\n }\r\n\r\n\r\n store.setState(() => ({\r\n ...state,\r\n activeRowId: rowId,\r\n activeCell: {\r\n rowId,\r\n columnId: firstColumn.fieldName,\r\n },\r\n }));\r\n } catch (e) {\r\n this.err.handle(e, 'NavigationManager.addEmptyRowAndActivate');\r\n }\r\n }\r\n\r\n private editableColumnsForRow(\r\n table: TableState['table'],\r\n row: Row,\r\n ): ReturnType<typeof table.getActiveCollectionColumns> {\r\n const disabledCols = Object.entries(row.getVisibilityCondition() ?? {})\r\n .filter(([, value]) => value === false)\r\n .map(([key]) => key);\r\n\r\n return table\r\n .getActiveCollectionColumns()\r\n .filter(\r\n (c) =>\r\n !c.hidden &&\r\n c.editable !== false &&\r\n !disabledCols.includes(c.fieldName) &&\r\n c.fieldName !== 'index' &&\r\n c.fieldType !== 'index' &&\r\n c.fieldType !== 'static',\r\n );\r\n }\r\n\r\n jumpActiveCellRowEdge(cmd: {\r\n tableKey: string;\r\n rowId: number;\r\n columnId: string;\r\n edge: 'start' | 'end';\r\n }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const { table } = store.getState();\r\n const row = table.getRow(cmd.rowId);\r\n if (!row) return;\r\n\r\n const columns = this.editableColumnsForRow(table, row);\r\n if (columns.length === 0) return;\r\n\r\n const targetColumn =\r\n cmd.edge === 'start'\r\n ? columns[0]\r\n : columns[columns.length - 1];\r\n\r\n store.setState((prev) => ({\r\n ...prev,\r\n activeRowId: cmd.rowId,\r\n activeCell: { rowId: cmd.rowId, columnId: targetColumn.fieldName },\r\n }));\r\n }\r\n\r\n jumpActiveCellGridCorner(cmd: {\r\n tableKey: string;\r\n corner: 'first' | 'last';\r\n }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const { table } = store.getState();\r\n const index = this.getUiRowIndex();\r\n const orderedIds = index.getOrderedIds();\r\n if (orderedIds.length === 0) return;\r\n\r\n const rowId =\r\n cmd.corner === 'first'\r\n ? orderedIds[0]\r\n : orderedIds[orderedIds.length - 1];\r\n const row = table.getRow(rowId);\r\n if (!row || row.rowState.value === 'Delete') return;\r\n\r\n const columns = this.editableColumnsForRow(table, row);\r\n if (columns.length === 0) return;\r\n\r\n const targetColumn =\r\n cmd.corner === 'first'\r\n ? columns[0]\r\n : columns[columns.length - 1];\r\n\r\n store.setState((prev) => ({\r\n ...prev,\r\n activeRowId: rowId,\r\n activeCell: { rowId, columnId: targetColumn.fieldName },\r\n }));\r\n }\r\n\r\n async moveActiveCellVertical(cmd: {\r\n store: string;\r\n tableKey: string;\r\n rowId: number;\r\n columnId: string;\r\n direction: 'up' | 'down';\r\n }): Promise<void> {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const { table } = store.getState();\r\n if (!table) return;\r\n\r\n // PR-99: O(1) neighbor from ordered SparseRowIndex (filter/sort already applied).\r\n const index = this.getUiRowIndex();\r\n const nextId = index.neighbor(\r\n cmd.rowId,\r\n cmd.direction === 'down' ? 1 : -1,\r\n );\r\n if (nextId === undefined) {\r\n const view = this.getViewState();\r\n if (cmd.direction === 'down' && view?.pagination.canNext) {\r\n void this.dispatch({\r\n type: 'CHANGE_PAGE',\r\n store: cmd.store,\r\n tableKey: cmd.tableKey,\r\n page: view.pagination.page + 1,\r\n });\r\n } else if (cmd.direction === 'up' && view?.pagination.canPrev) {\r\n void this.dispatch({\r\n type: 'CHANGE_PAGE',\r\n store: cmd.store,\r\n tableKey: cmd.tableKey,\r\n page: view.pagination.page - 1,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n const nextRow = table.getRow(nextId);\r\n if (!nextRow || nextRow.rowState.value === 'Delete') return;\r\n\r\n await this.fetchVisibilityCondition(cmd, nextRow);\r\n\r\n store.setState(prev => ({\r\n ...prev,\r\n activeRowId: nextId,\r\n activeCell: { rowId: nextId, columnId: cmd.columnId },\r\n }));\r\n }\r\n}","// engine/managers/RowManager.ts\r\n\r\nimport {\r\n CellValue,\r\n ColumnId,\r\n TableActions,\r\n} from '../../domain/value-objects';\r\nimport { EngineErrorHandler } from '../EngineErrorHandler';\r\nimport { TableStore } from '../tableStore';\r\nimport { TableState } from '../type';\r\n\r\nexport class RowManager {\r\n constructor(\r\n private readonly readStore: () => TableStore<TableState> | undefined,\r\n private readonly err: EngineErrorHandler,\r\n ) { }\r\n\r\n private getStore(tableKey: string) {\r\n const store = this.readStore();\r\n if (!store) {\r\n this.err.notFound('TableStore', tableKey, 'RowManager');\r\n }\r\n return store;\r\n }\r\n\r\n setRowExpanded(cmd: {\r\n tableKey: string;\r\n rowId: number;\r\n value: boolean;\r\n }): void {\r\n const { rowId, tableKey, value } = cmd;\r\n const store = this.getStore(tableKey);\r\n if (!store) return;\r\n\r\n const state = store.getState();\r\n const key = String(rowId);\r\n if (!!state.expandedRows[rowId] === value) return;\r\n\r\n store.setState(() => ({\r\n ...state,\r\n expandedRows: { ...state.expandedRows, [key]: value },\r\n }));\r\n }\r\n\r\n toggleRowExpanded(cmd: { tableKey: string; rowId: number }): void {\r\n const { rowId, tableKey } = cmd;\r\n const key = String(rowId);\r\n const store = this.getStore(tableKey);\r\n if (!store) return;\r\n\r\n const state = store.getState();\r\n const next = !state.expandedRows[key];\r\n store.setState(() => ({\r\n ...state,\r\n expandedRows: { ...state.expandedRows, [key]: next },\r\n }));\r\n }\r\n\r\n collapseAll(tableKey: string): void {\r\n const store = this.getStore(tableKey);\r\n if (!store) return;\r\n\r\n const state = store.getState();\r\n if (!state.expandedRows || Object.keys(state.expandedRows).length === 0)\r\n return;\r\n\r\n store.setState(() => ({ ...state, expandedRows: {} }));\r\n }\r\n\r\n moveVerticalSelectedRows(cmd: {\r\n tableKey: string;\r\n direction: 'down' | 'up';\r\n }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n store.setState(prev => {\r\n const table = prev.table;\r\n const selectedMap = prev.selectedRows;\r\n const allRows = table.getRows();\r\n\r\n const sortedRows = [...allRows].sort(\r\n (a, b) =>\r\n (a.getCell('index')?.getValue() as number) -\r\n (b.getCell('index')?.getValue() as number),\r\n );\r\n\r\n const selectedRows = sortedRows.filter(r => selectedMap[r.id.value]);\r\n if (selectedRows.length === 0) return prev;\r\n\r\n if (cmd.direction === 'up') {\r\n for (const row of selectedRows) {\r\n const idx = sortedRows.findIndex(r => r.id.value === row.id.value);\r\n if (idx === 0) continue;\r\n\r\n const upperRow = sortedRows[idx - 1];\r\n const rowIndex = row.getCell('index')?.getValue() as number;\r\n const upperIndex = upperRow.getCell('index')?.getValue() as number;\r\n\r\n row.changeCell(new ColumnId('index'), new CellValue(upperIndex));\r\n upperRow.changeCell(new ColumnId('index'), new CellValue(rowIndex));\r\n\r\n sortedRows[idx - 1] = row;\r\n sortedRows[idx] = upperRow;\r\n }\r\n }\r\n\r\n if (cmd.direction === 'down') {\r\n for (let i = selectedRows.length - 1; i >= 0; i--) {\r\n const row = selectedRows[i];\r\n const idx = sortedRows.findIndex(r => r.id.value === row.id.value);\r\n if (idx === sortedRows.length - 1) continue;\r\n\r\n const lowerRow = sortedRows[idx + 1];\r\n const rowIndex = row.getCell('index')?.getValue() as number;\r\n const lowerIndex = lowerRow.getCell('index')?.getValue() as number;\r\n\r\n row.changeCell(new ColumnId('index'), new CellValue(lowerIndex));\r\n lowerRow.changeCell(new ColumnId('index'), new CellValue(rowIndex));\r\n\r\n sortedRows[idx] = lowerRow;\r\n sortedRows[idx + 1] = row;\r\n }\r\n }\r\n\r\n return { ...prev, table };\r\n });\r\n }\r\n\r\n moveVerticalActiveRow(cmd: {\r\n tableKey: string;\r\n direction: 'down' | 'up';\r\n }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n try {\r\n store.setState(prev => {\r\n const table = prev.table;\r\n const allRows = table.getRows();\r\n const activeRow = allRows.find(r => r.id.value == prev.activeRowId);\r\n if (!activeRow) return prev;\r\n\r\n const sortedRows = [...allRows].sort(\r\n (a, b) =>\r\n (a.getCell('index')?.getValue() as number) -\r\n (b.getCell('index')?.getValue() as number),\r\n );\r\n\r\n if (cmd.direction === 'up') {\r\n const idx = sortedRows.findIndex(\r\n r => r.id.value === prev.activeRowId,\r\n );\r\n if (idx !== 0) {\r\n const upperRow = sortedRows[idx - 1];\r\n const rowIndex = activeRow.getCell('index')?.getValue() as number;\r\n const upperIndex = upperRow.getCell('index')?.getValue() as number;\r\n\r\n activeRow.changeCell(\r\n new ColumnId('index'),\r\n new CellValue(upperIndex),\r\n );\r\n upperRow.changeCell(\r\n new ColumnId('index'),\r\n new CellValue(rowIndex),\r\n );\r\n sortedRows[idx - 1] = activeRow;\r\n sortedRows[idx] = upperRow;\r\n }\r\n }\r\n\r\n if (cmd.direction === 'down') {\r\n const idx = sortedRows.findIndex(\r\n r => r.id.value === prev.activeRowId,\r\n );\r\n if (idx !== sortedRows.length - 1) {\r\n const lowerRow = sortedRows[idx + 1];\r\n const rowIndex = activeRow.getCell('index')?.getValue() as number;\r\n const lowerIndex = lowerRow.getCell('index')?.getValue() as number;\r\n\r\n activeRow.changeCell(\r\n new ColumnId('index'),\r\n new CellValue(lowerIndex),\r\n );\r\n lowerRow.changeCell(\r\n new ColumnId('index'),\r\n new CellValue(rowIndex),\r\n );\r\n sortedRows[idx] = lowerRow;\r\n sortedRows[idx + 1] = activeRow;\r\n }\r\n }\r\n\r\n return { ...prev, table };\r\n });\r\n } catch (error) {\r\n this.err.handle(error, 'RowManager.moveVerticalActiveRow');\r\n }\r\n }\r\n\r\n setTableAction(\n cmd: { tableKey: string; action: TableActions },\n _activeRowId: number | undefined,\n ): void {\n const store = this.getStore(cmd.tableKey);\n if (!store) return;\n\n const { table } = store.getState();\n\n switch (cmd.action) {\n case 'copy':\n case 'cut':\n case null:\n table.setTableAction(cmd.action);\n break;\n\n case 'paste':\n case 'pasteInsert':\n // Paste is handled by TableEngine.executePasteAction → AppService.\n break;\n\n default:\n break;\n }\n\n store.setState(prev => ({ ...prev, table }));\n }\n}\n","// engine/managers/SelectionManager.ts\r\n\r\nimport { RowId } from '../../domain/value-objects';\r\nimport { EngineErrorHandler } from '../EngineErrorHandler';\r\nimport { TableStore } from '../tableStore';\r\nimport { TableState } from '../type';\r\n\r\nexport class SelectionManager {\r\n constructor(\r\n private readonly readStore: () => TableStore<TableState> | undefined,\r\n private readonly err: EngineErrorHandler,\r\n private readonly getGroupChildren?: (\r\n rowId: number,\r\n ) => readonly number[] | undefined,\r\n ) {}\r\n\r\n private getStore(tableKey: string) {\r\n const store = this.readStore();\r\n if (!store) {\r\n this.err.notFound('TableStore', tableKey, 'SelectionManager');\r\n }\r\n return store;\r\n }\r\n\r\n setSelectRow(cmd: { tableKey: string; rowId: number }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n const children = this.getGroupChildren?.(cmd.rowId);\r\n\r\n store.setState(prev => {\r\n const targets = children?.length\r\n ? [cmd.rowId, ...children]\r\n : [cmd.rowId];\r\n const allOn = targets.every((id) => prev.selectedRows[id]);\r\n\r\n if (allOn) {\r\n return {\r\n ...prev,\r\n selectedRows: {},\r\n rangeAnchorRowId: undefined,\r\n };\r\n }\r\n\r\n const nextSelected: Record<number, true> = {};\r\n for (const id of targets) nextSelected[id] = true;\r\n return {\r\n ...prev,\r\n selectedRows: nextSelected,\r\n rangeAnchorRowId: cmd.rowId,\r\n };\r\n });\r\n }\r\n\r\n toggleRowSelection(cmd: { tableKey: string; rowId: number }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n const children = this.getGroupChildren?.(cmd.rowId);\r\n\r\n store.setState(prev => {\r\n const targets = children?.length\r\n ? [cmd.rowId, ...children]\r\n : [cmd.rowId];\r\n const allOn = targets.every((id) => prev.selectedRows[id]);\r\n const nextSelected = { ...prev.selectedRows };\r\n\r\n if (allOn) {\r\n for (const id of targets) delete nextSelected[id];\r\n } else {\r\n for (const id of targets) nextSelected[id] = true;\r\n }\r\n\r\n return { ...prev, selectedRows: nextSelected };\r\n });\r\n }\r\n\r\n /**\r\n * Toggle selection of every row in the dataset (ids from IndexedDB SoT).\r\n * Does not use the RAM page window — `rowIds` must be the full id list.\r\n */\r\n toggleSelectAllRows(cmd: { tableKey: string; rowIds: number[] }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const state = store.getState();\r\n const ids = cmd.rowIds;\r\n const selectedCount = Object.keys(state.selectedRows).length;\r\n const allSelected =\r\n ids.length > 0 &&\r\n selectedCount === ids.length &&\r\n ids.every(id => state.selectedRows[id]);\r\n\r\n store.setState(prev => {\r\n if (allSelected) {\r\n return { ...prev, selectedRows: {} };\r\n }\r\n\r\n const nextSelected: Record<number, true> = {};\r\n for (const id of ids) {\r\n nextSelected[id] = true;\r\n }\r\n\r\n return { ...prev, selectedRows: nextSelected };\r\n });\r\n }\r\n\r\n toggleSelectPageRows(cmd: { tableKey: string }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n const state = store.getState();\r\n\r\n const pageRows = state.table.getVisibleRows();\r\n const selectedRows = state.selectedRows;\r\n\r\n const allPageRowsSelected = pageRows.every(row =>\r\n Object.prototype.hasOwnProperty.call(selectedRows, row.id.value),\r\n );\r\n\r\n store.setState(prev => {\r\n if (allPageRowsSelected) {\r\n return { ...prev, selectedRows: {} };\r\n }\r\n\r\n const nextSelected: Record<number, true> = {};\r\n\r\n pageRows.forEach(row => {\r\n nextSelected[row.id.value] = true;\r\n });\r\n\r\n return { ...prev, selectedRows: nextSelected };\r\n });\r\n }\r\n\r\n clearRowSelection(cmd: { tableKey: string }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n store.setState((prev) => ({\r\n ...prev,\r\n selectedRows: {},\r\n rangeAnchorRowId: undefined,\r\n }));\r\n }\r\n\r\n selectRange(cmd: { tableKey: string; rowId: number }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n store.setState(prev => {\r\n const anchor = prev.rangeAnchorRowId ?? prev.activeRowId;\r\n if (!anchor) return prev;\r\n\r\n const rows = prev.table.getVisibleRows();\r\n\r\n const startIndex = rows.findIndex(r => r.id.value === anchor);\r\n const endIndex = rows.findIndex(r => r.id.value === cmd.rowId);\r\n\r\n if (startIndex === -1 || endIndex === -1) return prev;\r\n\r\n const [from, to] =\r\n startIndex < endIndex\r\n ? [startIndex, endIndex]\r\n : [endIndex, startIndex];\r\n\r\n const nextSelected: Record<number, true> = {};\r\n\r\n for (let i = from; i <= to; i++) {\r\n nextSelected[rows[i].id.value] = true;\r\n }\r\n\r\n return {\r\n ...prev,\r\n selectedRows: nextSelected,\r\n rangeAnchorRowId: anchor,\r\n };\r\n });\r\n }\r\n\r\n selectFromActiveToLast(cmd: {\r\n tableKey: string;\r\n anchorRowId: number;\r\n }): void {\r\n const store = this.getStore(cmd.tableKey);\r\n if (!store) return;\r\n\r\n store.setState(prev => {\r\n const rows = prev.table.getVisibleRows();\r\n\r\n const startIdx = rows.findIndex(\r\n r => r.id.value === cmd.anchorRowId,\r\n );\r\n\r\n if (startIdx === -1) return prev;\r\n\r\n const nextSelected: Record<number, true> = {\r\n ...prev.selectedRows,\r\n };\r\n\r\n for (let i = startIdx; i < rows.length; i++) {\r\n nextSelected[rows[i].id.value] = true;\r\n }\r\n\r\n return {\r\n ...prev,\r\n selectedRows: nextSelected,\r\n rangeAnchorRowId: cmd.anchorRowId,\r\n };\r\n });\r\n }\r\n\r\n deleteAll(tableKey: string): void {\r\n const store = this.getStore(tableKey);\r\n if (!store) return;\r\n\r\n const { table, selectedRows } = store.getState();\r\n\r\n try {\r\n Object.entries(selectedRows).forEach(([key]) => {\r\n table.deleteRow(new RowId(Number(key)));\r\n });\r\n } catch (e) {\r\n this.err.handle(e, 'SelectionManager.deleteAll');\r\n }\r\n\r\n store.setState(prev => ({\r\n ...prev,\r\n selectedRows: {},\r\n table,\r\n }));\r\n }\r\n}","/**\r\n * Column hide/show policy (PR-111).\r\n * Pure — no React/DOM.\r\n *\r\n * Domain `visibility.kind === 'never'` is a hard forbid (RBAC / schema policy).\r\n * Hosts may toggle `hidden` for other columns; they cannot unhide a never-visible column.\r\n */\r\n\r\nimport type { ColumnSchema } from '../../domain/types/ColumnSchema';\r\nimport { isIndexColumn } from '../columnWidth';\r\n\r\nexport type SetColumnVisibleResult =\r\n | { ok: true; hidden: boolean }\r\n | { ok: false; reason: 'not-found' | 'forbidden' | 'index' | 'unchanged' };\r\n\r\n/** Policy lock: column must stay hidden. */\r\nexport function isColumnShowForbidden(column: ColumnSchema): boolean {\r\n return column.visibility?.kind === 'never';\r\n}\r\n\r\nexport function canSetColumnVisible(\r\n column: ColumnSchema | undefined,\r\n visible: boolean,\r\n): SetColumnVisibleResult {\r\n if (!column) return { ok: false, reason: 'not-found' };\r\n if (isIndexColumn(column) && !visible) {\r\n return { ok: false, reason: 'index' };\r\n }\r\n if (visible && isColumnShowForbidden(column)) {\r\n return { ok: false, reason: 'forbidden' };\r\n }\r\n const nextHidden = !visible;\r\n if (Boolean(column.hidden) === nextHidden) {\r\n return { ok: false, reason: 'unchanged' };\r\n }\r\n return { ok: true, hidden: nextHidden };\r\n}\r\n\r\nexport function withColumnHidden(\r\n column: ColumnSchema,\r\n hidden: boolean,\r\n): ColumnSchema {\r\n return { ...column, hidden };\r\n}\r\n","/**\r\n * Runtime column pin policy (PR-114).\r\n * Pure — no React/DOM.\r\n */\r\n\r\nimport type { ColumnPinned } from '../../domain/types/ColumnDef';\r\nimport type { ColumnSchema } from '../../domain/types/ColumnSchema';\r\nimport { isIndexColumn } from '../columnWidth';\r\nimport { resolveColumnPinned } from './columnPin';\r\n\r\nexport type SetColumnPinnedResult =\r\n | { ok: true; pinned: ColumnPinned }\r\n | { ok: false; reason: 'not-found' | 'index' | 'unchanged' };\r\n\r\nexport function canSetColumnPinned(\r\n column: ColumnSchema | undefined,\r\n pinned: ColumnPinned,\r\n): SetColumnPinnedResult {\r\n if (!column) return { ok: false, reason: 'not-found' };\r\n if (isIndexColumn(column)) return { ok: false, reason: 'index' };\r\n const current = resolveColumnPinned(column);\r\n const next = pinned ?? null;\r\n if (current === next) return { ok: false, reason: 'unchanged' };\r\n return { ok: true, pinned: next };\r\n}\r\n\r\nexport function withColumnPinned(\r\n column: ColumnSchema,\r\n pinned: ColumnPinned,\r\n): ColumnSchema {\r\n const bridge = { ...(column.columnDef ?? {}), pinned: pinned ?? undefined };\r\n if (pinned == null) delete bridge.pinned;\r\n return { ...column, columnDef: bridge };\r\n}\r\n","// /table/engine/tableStore.ts\r\n\r\nimport { Row } from '../domain/entities/Row';\r\n\r\ntype Subscriber = () => void;\r\n\r\nexport class TableStore<T> {\r\n private subscribers: Subscriber[] = [];\r\n private state: T;\r\n private originalState: T;\r\n\r\n constructor(initialState: T) {\r\n this.state = initialState;\r\n this.originalState = initialState;\r\n }\r\n\r\n getState() {\r\n return this.state;\r\n }\r\n getRowByRowId(rowId: number): Row | undefined {\r\n return undefined;\r\n }\r\n\r\n setState(updater: (prev: T) => T) {\r\n const nextState = updater(this.state);\r\n if (nextState === this.state) return;\r\n this.state = nextState;\r\n this.notify();\r\n }\r\n\r\n subscribe(cb: Subscriber) {\r\n this.subscribers.push(cb);\r\n return () => {\r\n this.subscribers = this.subscribers.filter((s) => s !== cb);\r\n };\r\n }\r\n\r\n /**\r\n * Notify only when the selected slice changes (Object.is by default).\r\n * Prevents React adapters from re-rendering on unrelated store updates.\r\n */\r\n subscribeWithSelector<TSelected>(\r\n selector: (state: T) => TSelected,\r\n listener: (selected: TSelected) => void,\r\n isEqual: (a: TSelected, b: TSelected) => boolean = Object.is,\r\n ): () => void {\r\n let current = selector(this.state);\r\n return this.subscribe(() => {\r\n const next = selector(this.state);\r\n if (!isEqual(current, next)) {\r\n current = next;\r\n listener(next);\r\n }\r\n });\r\n }\r\n\r\n resetTable(): void {\r\n this.state = this.originalState;\r\n }\r\n\r\n private notify() {\r\n this.subscribers.forEach((cb) => cb());\r\n }\r\n}\r\n","/**\r\n * Session-only cell edit draft (PR-126). Not EventStore.\r\n * Typing updates drafts; Commit writes; Cancel discards.\r\n */\r\n\r\nexport type CellEditType = 'cell' | 'fullRow';\r\n\r\nexport type CellEditValue = {\r\n value: unknown;\r\n display: unknown;\r\n};\r\n\r\nexport type CellEditSession = {\r\n rowId: number;\r\n /** Focused column while editing. */\r\n columnId: string;\r\n editType: CellEditType;\r\n /** Values at edit start — restored on cancel. */\r\n baseline: Readonly<Record<string, CellEditValue>>;\r\n /** Working copies. */\r\n drafts: Record<string, CellEditValue>;\r\n};\r\n\r\nexport type CellEditOptions = {\r\n /** Default true — activate cell starts edit. False ⇒ need Enter / double-click / api.startEditingCell. */\r\n singleClickEdit: boolean;\r\n /** Default true — leaving the grid / clearActiveCell commits the draft. */\r\n stopEditingWhenCellsLoseFocus: boolean;\r\n /** Default `cell`. `fullRow` edits every editable column on the row. */\r\n editType: CellEditType;\r\n};\r\n\r\nexport const DEFAULT_CELL_EDIT_OPTIONS: CellEditOptions = {\r\n singleClickEdit: true,\r\n stopEditingWhenCellsLoseFocus: true,\r\n editType: 'cell',\r\n};\r\n\r\nexport function createCellEditSession(input: {\r\n rowId: number;\r\n columnId: string;\r\n editType: CellEditType;\r\n baseline: Readonly<Record<string, CellEditValue>>;\r\n}): CellEditSession {\r\n const drafts: Record<string, CellEditValue> = {};\r\n for (const [colId, cell] of Object.entries(input.baseline)) {\r\n drafts[colId] = { value: cell.value, display: cell.display };\r\n }\r\n return {\r\n rowId: input.rowId,\r\n columnId: input.columnId,\r\n editType: input.editType,\r\n baseline: input.baseline,\r\n drafts,\r\n };\r\n}\r\n\r\nexport function readDraft(\r\n session: CellEditSession | null | undefined,\r\n rowId: number,\r\n columnId: string,\r\n): CellEditValue | null {\r\n if (!session || session.rowId !== rowId) return null;\r\n return session.drafts[columnId] ?? null;\r\n}\r\n\r\n/** True when this cell shows an editor for the active session. */\r\nexport function isEditingCell(\r\n session: CellEditSession | null | undefined,\r\n rowId: number,\r\n columnId: string,\r\n): boolean {\r\n if (!session || session.rowId !== rowId) return false;\r\n if (session.editType === 'fullRow') return true;\r\n return session.columnId === columnId;\r\n}\r\n\r\n/** True when navigating away should end the current session. */\r\nexport function leavesEditSession(\r\n session: CellEditSession | null | undefined,\r\n nextRowId: number,\r\n nextColumnId: string,\r\n): boolean {\r\n if (!session) return false;\r\n if (session.editType === 'fullRow') {\r\n return session.rowId !== nextRowId;\r\n }\r\n return session.rowId !== nextRowId || session.columnId !== nextColumnId;\r\n}\r\n\r\nexport function patchDraft(\r\n session: CellEditSession,\r\n columnId: string,\r\n patch: Partial<CellEditValue>,\r\n): CellEditSession {\r\n const prev = session.drafts[columnId] ??\r\n session.baseline[columnId] ?? { value: null, display: null };\r\n return {\r\n ...session,\r\n columnId,\r\n drafts: {\r\n ...session.drafts,\r\n [columnId]: {\r\n value: patch.value !== undefined ? patch.value : prev.value,\r\n display: patch.display !== undefined ? patch.display : prev.display,\r\n },\r\n },\r\n };\r\n}\r\n\r\n/** Columns whose draft differs from baseline (need commit). */\r\nexport function dirtyDraftColumns(session: CellEditSession): string[] {\r\n const out: string[] = [];\r\n for (const colId of Object.keys(session.drafts)) {\r\n const draft = session.drafts[colId]!;\r\n const base = session.baseline[colId];\r\n if (!base) {\r\n out.push(colId);\r\n continue;\r\n }\r\n if (draft.value !== base.value || draft.display !== base.display) {\r\n out.push(colId);\r\n }\r\n }\r\n return out;\r\n}\r\n","import type { ColumnSchema } from '../../domain/types/ColumnSchema';\r\nimport type { ColumnGroupPathEntry } from '../../domain/types/ColumnGroupDef';\r\nimport { isIndexColumn, type ColumnWidthHint } from '../columnWidth';\r\n\r\nexport type ColumnGroupHeaderCell = {\r\n kind: 'group';\r\n groupId: string;\r\n headerName: string;\r\n colspan: number;\r\n level: number;\r\n collapsed: boolean;\r\n /** Leaf field names spanned by this header (document order). */\r\n leafFields: readonly string[];\r\n};\r\n\r\nexport type ColumnGroupHeaderModel = {\r\n /** 0 = outermost group row. */\r\n rows: ColumnGroupHeaderCell[][];\r\n maxDepth: number;\r\n};\r\n\r\nexport function columnGroupDepth(column: ColumnSchema): number {\r\n return column.columnGroup?.path.length ?? 0;\r\n}\r\n\r\nexport function maxColumnGroupDepth(columns: readonly ColumnSchema[]): number {\r\n let max = 0;\r\n for (const col of columns) {\r\n max = Math.max(max, columnGroupDepth(col));\r\n }\r\n return max;\r\n}\r\n\r\nexport function hasColumnGroups(columns: readonly ColumnSchema[]): boolean {\r\n return maxColumnGroupDepth(columns) > 0;\r\n}\r\n\r\n/** True when any ancestor group id is collapsed. */\r\nexport function isColumnGroupCollapsed(\r\n column: ColumnSchema,\r\n collapsedGroups: Readonly<Record<string, true>>,\r\n): boolean {\r\n const path = column.columnGroup?.path ?? [];\r\n for (const entry of path) {\r\n if (collapsedGroups[entry.groupId]) return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function applyColumnGroupCollapse(\r\n columns: readonly ColumnSchema[],\r\n collapsedGroups: Readonly<Record<string, true>>,\r\n): ColumnSchema[] {\r\n if (Object.keys(collapsedGroups).length === 0) return columns.slice();\r\n return columns.map((col) => {\r\n if (col.hidden) return col;\r\n if (!isColumnGroupCollapsed(col, collapsedGroups)) return col;\r\n return { ...col, hidden: true };\r\n });\r\n}\r\n\r\nfunction groupAtLevel(\r\n column: ColumnSchema,\r\n level: number,\r\n): ColumnGroupPathEntry | undefined {\r\n return column.columnGroup?.path[level];\r\n}\r\n\r\n/**\r\n * Build multi-row group header cells for visible leaf columns (PR-113).\r\n * Each row merges adjacent columns sharing the same group id at that depth.\r\n */\r\nexport function buildColumnGroupHeaderModel(\r\n visibleColumns: readonly ColumnSchema[],\r\n collapsedGroups: Readonly<Record<string, true>>,\r\n): ColumnGroupHeaderModel {\r\n const maxDepth = maxColumnGroupDepth(visibleColumns);\r\n if (maxDepth === 0) {\r\n return { rows: [], maxDepth: 0 };\r\n }\r\n\r\n const rows: ColumnGroupHeaderCell[][] = [];\r\n\r\n for (let level = 0; level < maxDepth; level += 1) {\r\n const row: ColumnGroupHeaderCell[] = [];\r\n let i = 0;\r\n while (i < visibleColumns.length) {\r\n const col = visibleColumns[i]!;\r\n const entry = groupAtLevel(col, level);\r\n if (!entry) {\r\n i += 1;\r\n continue;\r\n }\r\n const leafFields: string[] = [col.fieldName];\r\n let j = i + 1;\r\n while (j < visibleColumns.length) {\r\n const next = visibleColumns[j]!;\r\n const nextEntry = groupAtLevel(next, level);\r\n if (!nextEntry || nextEntry.groupId !== entry.groupId) break;\r\n leafFields.push(next.fieldName);\r\n j += 1;\r\n }\r\n row.push({\r\n kind: 'group',\r\n groupId: entry.groupId,\r\n headerName: entry.headerName,\r\n colspan: leafFields.length,\r\n level,\r\n collapsed: Boolean(collapsedGroups[entry.groupId]),\r\n leafFields,\r\n });\r\n i = j;\r\n }\r\n rows.push(row);\r\n }\r\n\r\n return { rows, maxDepth };\r\n}\r\n\r\nexport type ColumnReorderHint = ColumnWidthHint & {\r\n fieldName: string;\r\n columnGroup?: ColumnSchema['columnGroup'];\r\n};\r\n\r\nfunction columnInGroup(column: ColumnReorderHint, groupId: string): boolean {\r\n return (column.columnGroup?.path ?? []).some((p) => p.groupId === groupId);\r\n}\r\n\r\n/** Move a contiguous group block before `destField` (group-level reorder). */\r\nexport function resolveGroupBlockReorder(\r\n columns: readonly ColumnReorderHint[],\r\n groupId: string,\r\n destField: string,\r\n): { sourceIndex: number; destIndex: number } | null {\r\n const blockIndices = columns\r\n .map((c, i) => (columnInGroup(c, groupId) ? i : -1))\r\n .filter((i) => i >= 0);\r\n if (blockIndices.length === 0) return null;\r\n\r\n for (let k = 1; k < blockIndices.length; k += 1) {\r\n if (blockIndices[k] !== blockIndices[k - 1]! + 1) return null;\r\n }\r\n\r\n const sourceIndex = blockIndices[0]!;\r\n const destIndex = columns.findIndex((c) => c.fieldName === destField);\r\n if (destIndex < 0 || sourceIndex === destIndex) return null;\r\n const source = columns[sourceIndex];\r\n const dest = columns[destIndex];\r\n if (!source || !dest) return null;\r\n if (isIndexColumn(source) || isIndexColumn(dest)) return null;\r\n if (blockIndices.includes(destIndex)) return null;\r\n\r\n return { sourceIndex, destIndex };\r\n}\r\n\r\n/** Reorder within the same parent group (existing column drag). */\r\nexport function isSameParentGroup(\r\n a: ColumnSchema,\r\n b: ColumnSchema,\r\n): boolean {\r\n const ga = a.columnGroup?.groupId ?? '';\r\n const gb = b.columnGroup?.groupId ?? '';\r\n return ga === gb;\r\n}\r\n","/**\r\n * Single-level row grouping (PR-120 / RFC-002). Pure — no React/DOM.\r\n * Produces a flat presentation list: group nodes + leaf row ids.\r\n */\r\n\r\nimport type { AggFunc } from '../../domain/types/ColumnDef';\r\nimport { applyAgg } from './aggregation';\r\n\r\nexport type FlatGroupNode = {\r\n kind: 'group';\r\n /** Negative sentinel id (not a domain RowId). */\r\n id: number;\r\n field: string;\r\n key: string;\r\n childRowIds: readonly number[];\r\n aggregates: Record<string, unknown>;\r\n};\r\n\r\nexport type FlatLeafNode = {\r\n kind: 'leaf';\r\n id: number;\r\n};\r\n\r\nexport type FlatUiNode = FlatGroupNode | FlatLeafNode;\r\n\r\nexport type RowGroupingAggColumn = {\r\n colId: string;\r\n aggFunc: AggFunc;\r\n};\r\n\r\nexport type BuildGroupedFlatIndexInput = {\r\n /** Leaf row ids already sorted/filtered. */\r\n orderedLeafIds: readonly number[];\r\n groupField: string;\r\n getGroupValue: (rowId: number) => unknown;\r\n /** When true (default), groups start expanded. */\r\n defaultExpanded?: boolean;\r\n /** Per-group override: true = expanded, false = collapsed. */\r\n expandedByKey?: Readonly<Record<string, boolean>>;\r\n aggregateColumns?: readonly RowGroupingAggColumn[];\r\n getCellValue?: (rowId: number, colId: string) => unknown;\r\n};\r\n\r\n/** Stable negative id for a group key (PR-120). */\r\nexport function groupRowId(groupField: string, groupKey: string): number {\r\n let h = 2166136261;\r\n const s = `${groupField}\\0${groupKey}`;\r\n for (let i = 0; i < s.length; i += 1) {\r\n h ^= s.charCodeAt(i);\r\n h = Math.imul(h, 16777619);\r\n }\r\n const id = h | 0;\r\n if (id === 0) return -1;\r\n return id > 0 ? -id : id;\r\n}\r\n\r\nexport function normalizeGroupKey(value: unknown): string {\r\n if (value == null || value === '') return '(blank)';\r\n return String(value);\r\n}\r\n\r\nexport function isGroupRowId(id: number): boolean {\r\n return id < 0;\r\n}\r\n\r\nexport function isGroupExpanded(\r\n groupKey: string,\r\n defaultExpanded: boolean,\r\n expandedByKey: Readonly<Record<string, boolean>> | undefined,\r\n): boolean {\r\n if (expandedByKey && Object.prototype.hasOwnProperty.call(expandedByKey, groupKey)) {\r\n return Boolean(expandedByKey[groupKey]);\r\n }\r\n return defaultExpanded;\r\n}\r\n\r\n/**\r\n * Active group field: API accepts `string | string[]` but only the first\r\n * entry is used in 0.12.0 (RFC-002).\r\n */\r\nexport function resolveActiveGroupField(\r\n groupBy: string | readonly string[] | null | undefined,\r\n): string | null {\r\n if (groupBy == null) return null;\r\n if (typeof groupBy === 'string') {\r\n const t = groupBy.trim();\r\n return t === '' ? null : t;\r\n }\r\n const first = groupBy.find((c) => typeof c === 'string' && c.trim() !== '');\r\n return first?.trim() ?? null;\r\n}\r\n\r\nexport function buildGroupedFlatIndex(\r\n input: BuildGroupedFlatIndexInput,\r\n): { nodes: FlatUiNode[]; orderedIds: number[] } {\r\n const {\r\n orderedLeafIds,\r\n groupField,\r\n getGroupValue,\r\n defaultExpanded = true,\r\n expandedByKey,\r\n aggregateColumns = [],\r\n getCellValue,\r\n } = input;\r\n\r\n const buckets = new Map<string, number[]>();\r\n const order: string[] = [];\r\n for (const rowId of orderedLeafIds) {\r\n const key = normalizeGroupKey(getGroupValue(rowId));\r\n let bucket = buckets.get(key);\r\n if (!bucket) {\r\n bucket = [];\r\n buckets.set(key, bucket);\r\n order.push(key);\r\n }\r\n bucket.push(rowId);\r\n }\r\n\r\n const nodes: FlatUiNode[] = [];\r\n const orderedIds: number[] = [];\r\n\r\n for (const key of order) {\r\n const childRowIds = buckets.get(key) ?? [];\r\n const aggregates: Record<string, unknown> = {};\r\n if (getCellValue && aggregateColumns.length > 0) {\r\n for (const col of aggregateColumns) {\r\n const values = childRowIds.map((id) => getCellValue(id, col.colId));\r\n aggregates[col.colId] = applyAgg(col.aggFunc, values);\r\n }\r\n }\r\n const id = groupRowId(groupField, key);\r\n const groupNode: FlatGroupNode = {\r\n kind: 'group',\r\n id,\r\n field: groupField,\r\n key,\r\n childRowIds,\r\n aggregates,\r\n };\r\n nodes.push(groupNode);\r\n orderedIds.push(id);\r\n\r\n if (isGroupExpanded(key, defaultExpanded, expandedByKey)) {\r\n for (const childId of childRowIds) {\r\n nodes.push({ kind: 'leaf', id: childId });\r\n orderedIds.push(childId);\r\n }\r\n }\r\n }\r\n\r\n return { nodes, orderedIds };\r\n}\r\n","import type * as React from 'react';\r\n\r\nimport { ColumnSchema } from '../bootstrap/type';\r\nimport { Table } from '../domain/entities/Table';\r\nimport {\r\n RowStateEnum,\r\n TableActions,\r\n} from '../domain/value-objects';\r\nimport type { SortModel } from './dataOps/sortModel';\r\nimport type { FilterModel } from './dataOps/filterModel';\r\nimport type { RowModelType } from './dataOps/rowModel';\r\nimport type { CellEditSession } from './dataOps/cellEditSession';\r\nimport type { CellRange, CellRangeSelection } from './selection/cellRange';\r\nimport { UIRow } from '../ui/type';\r\n\r\nexport const MOBILE_PAGE_SIZE = 50;\r\n\r\nexport type GridSearchMatch = {\r\n rowId: number;\r\n columnId: string;\r\n};\r\n\r\nexport type GridSearchState = {\r\n columnId: string;\r\n query: string;\r\n matches: GridSearchMatch[];\r\n currentIndex: number;\r\n} | null;\r\n\r\nexport type MobileEditorState = {\r\n mode: 'add' | 'edit';\r\n rowId: number;\r\n} | null;\r\n\r\nexport type TableViewState = {\r\n // table: Table\r\n activeCell: ActiveCell;\r\n selectedRows: Record<number, true>;\r\n rows: UIRow[];\r\n deletedRows: Array<{\r\n id: string;\r\n cells: Record<string, unknown>;\r\n isExpanded: boolean;\r\n }>;\r\n columns: ColumnSchema[];\r\n activeCollectionColumn: ColumnSchema[];\r\n pagination: {\r\n page: number;\r\n pageSize: number;\r\n totalRows: number;\r\n totalPages: number;\r\n canPrev: boolean;\r\n canNext: boolean;\r\n };\r\n action: TableActions;\r\n gridSearch: GridSearchState;\r\n mobileEditor: MobileEditorState;\r\n /** Session-only column widths (px). Not EventStore. */\r\n columnWidths: Record<string, number>;\r\n /** Session-only sort (PR-90). Empty ⇒ document `index` order. Not EventStore. */\r\n sortModel: SortModel;\r\n /**\r\n * Session-only quick filter (PR-93). Hides non-matching rows (unlike\r\n * `gridSearch` find-and-navigate). Not EventStore.\r\n */\r\n quickFilterText: string;\r\n /** Session-only column filters (PR-94). Not EventStore. */\r\n filterModel: FilterModel;\r\n /** Cell-range selection (PR-105). Session-only. */\r\n cellRanges: readonly CellRange[];\r\n /** Collapsed column group ids (PR-113). */\r\n collapsedColumnGroups: Record<string, true>;\r\n /** Active row-group columns (PR-120). */\r\n rowGroupColumns: string[];\r\n groupDefaultExpanded: boolean;\r\n /** Session-only cell edit draft (PR-126). */\r\n cellEdit: CellEditSession | null;\r\n};\r\n\r\nexport type MobileTableViewState = {\r\n rows: UIRow[];\r\n columns: ColumnSchema[];\r\n totalRows: number;\r\n visibleCount: number;\r\n hasMore: boolean;\r\n pageSize: number;\r\n mobileEditor: MobileEditorState;\r\n};\r\n\r\nexport type TableSnapShot = {\r\n rows: Array<{\r\n id: number;\r\n cells: Record<string, unknown>;\r\n rowState: RowStateEnum\r\n collection: string\r\n rowType?: string\r\n changeFields: readonly string[]\r\n isSaveDescription: boolean\r\n }>;\r\n};\r\nexport type ActiveCell = {\r\n rowId: number;\r\n columnId: string;\r\n} | null;\r\nexport type ValidCell = { isValid: boolean, cellError: CellError }\r\n\r\nexport type TableState = {\r\n table: Table;\r\n expandedRows: Record<string, boolean>;\r\n selectedRows: Record<number, true>;\r\n activeRowId: number | undefined;\r\n activeCell: ActiveCell | undefined;\r\n rangeAnchorRowId: number | undefined;\r\n gridSearch: GridSearchState;\r\n mobileEditor: MobileEditorState;\r\n columnWidths: Record<string, number>;\r\n /** Session-only sort model (PR-90). Not EventStore. */\r\n sortModel: SortModel;\r\n /** Session-only quick filter text (PR-93). Not EventStore. */\r\n quickFilterText: string;\r\n /** Session-only column filter model (PR-94). Not EventStore. */\r\n filterModel: FilterModel;\r\n /**\r\n * Row model mode (PR-96). Default `clientSide`.\r\n * When `infinite` / `serverSide`, local sort/filter are skipped.\r\n */\r\n rowModelType: RowModelType;\r\n /**\r\n * Total rows from the last `GridDatasource.getRows().lastRow` (PR-96).\r\n * `null` = unknown / use loaded row count.\r\n */\r\n serverRowCount: number | null;\r\n /** Cell-range selection state (PR-105). Session-only. */\r\n cellRangeSelection: CellRangeSelection;\r\n /** Collapsed column group ids (PR-113). Session-only. */\r\n collapsedColumnGroups: Record<string, true>;\r\n /**\r\n * Row group column ids (PR-120). Only the first is active in 0.12.0.\r\n * Session-only — not EventStore (RFC-002).\r\n */\r\n rowGroupColumns: string[];\r\n /** Default expand state for row groups (PR-120). */\r\n groupDefaultExpanded: boolean;\r\n /** Per-group expand overrides keyed by normalizeGroupKey (PR-120). */\r\n rowGroupExpanded: Record<string, boolean>;\r\n /** Session-only cell edit draft (PR-126). Not EventStore. */\r\n cellEdit: CellEditSession | null;\r\n};\r\n\r\n\r\n\r\n\r\nexport type TCell = {\r\n value: unknown;\r\n originalValue: unknown;\r\n display: unknown;\r\n};\r\n//======================================dropdownType===========================================================================================\r\nexport type ItemType = {\r\n type?: 'submenu' | 'item' | 'group' | 'divider';\r\n label?: React.ReactNode;\r\n children?: ItemType[];\r\n disabled?: boolean;\r\n ref?: React.Ref<HTMLLIElement | null>;\r\n style?: React.CSSProperties;\r\n className?: string;\r\n isSelected?: boolean;\r\n isOpen?: boolean;\r\n isSubMenu?: boolean;\r\n danger?: boolean;\r\n icon?: React.ReactNode; //(name: string) => React.ReactNode | React.ReactNode;\r\n title?: string;\r\n key: string;\r\n theme?: 'dark' | 'light';\r\n dashed?: boolean;\r\n rootClassName?: string;\r\n itemIcon?: React.ReactNode;\r\n expandIcon?: React.ReactNode;\r\n popupClassName?: string;\r\n popupOffset?: number[];\r\n popupStyle?: React.CSSProperties;\r\n onClick?: () => void;\r\n extra?: React.ReactNode;\r\n}\r\n\r\nexport type ValidationCallback = (result: ValidationCallbackResult) => void;\r\nexport type ValidationCallbackResult = {\r\n valid: boolean,\r\n errors?: Map<string, CellError>,\r\n data?: unknown\r\n}\r\nexport interface CellError {\r\n rowId: number;\r\n caption: string;\r\n message: string;\r\n}\r\n","// engine/ViewStateBuilder.ts\r\n\r\nimport { ColumnSchema } from '../bootstrap/type';\r\nimport { Cell } from '../domain/entities/Cell';\r\nimport { Row } from '../domain/entities/Row';\r\nimport { CollectionScope } from '../domain/entities/Table';\r\nimport { RowStateEnum } from '../domain/value-objects';\r\nimport { UIRow } from '../ui/type';\r\nimport {\r\n applySort,\r\n findSortedInsertIndex,\r\n type SortAccessor,\r\n type SortModel,\r\n} from './dataOps/sortModel';\r\nimport {\r\n applyFilter,\r\n type FilterAccessor,\r\n type FilterModel,\r\n} from './dataOps/filterModel';\r\nimport {\r\n applyQuickFilter,\r\n QuickFilterIndex,\r\n} from './dataOps/quickFilter';\r\nimport { applyColumnGroupCollapse } from './dataOps/columnGroups';\r\nimport { isServerLoadingRow, isServerRowModel } from './dataOps/rowModel';\r\nimport {\r\n applyAgg,\r\n ColumnAggIndex,\r\n resolveColumnAggSpecs,\r\n} from './dataOps/aggregation';\r\nimport {\r\n buildGroupedFlatIndex,\r\n isGroupExpanded,\r\n isGroupRowId,\r\n resolveActiveGroupField,\r\n type FlatGroupNode,\r\n type FlatUiNode,\r\n} from './dataOps/rowGrouping';\r\nimport type { AggFunc, AggFuncName } from '../domain/types/ColumnDef';\r\nimport { EngineErrorHandler } from './EngineErrorHandler';\r\nimport { SparseRowIndex } from './SparseRowIndex';\r\nimport { TableStore } from './tableStore';\r\nimport {\r\n MOBILE_PAGE_SIZE,\r\n MobileTableViewState,\r\n TableSnapShot,\r\n TableState,\r\n TableViewState,\r\n TCell,\r\n} from './type';\r\n\r\nfunction uiRowShallowEqual(a: UIRow, b: UIRow): boolean {\r\n if (\r\n a.id !== b.id ||\r\n a.rowState !== b.rowState ||\r\n a.isExpanded !== b.isExpanded ||\r\n a.visibilityCondition !== b.visibilityCondition ||\r\n a.loading !== b.loading ||\r\n a.rowKind !== b.rowKind ||\r\n a.groupField !== b.groupField ||\r\n a.groupKey !== b.groupKey ||\r\n a.groupChildCount !== b.groupChildCount ||\r\n a.groupExpanded !== b.groupExpanded\r\n ) {\r\n return false;\r\n }\r\n if (a.changeFields.length !== b.changeFields.length) return false;\r\n for (let i = 0; i < a.changeFields.length; i += 1) {\r\n if (a.changeFields[i] !== b.changeFields[i]) return false;\r\n }\r\n const aKeys = Object.keys(a.cells);\r\n const bKeys = Object.keys(b.cells);\r\n if (aKeys.length !== bKeys.length) return false;\r\n for (const key of aKeys) {\r\n const ca = a.cells[key];\r\n const cb = b.cells[key];\r\n if (\r\n !cb ||\r\n ca.value !== cb.value ||\r\n ca.display !== cb.display ||\r\n ca.originalValue !== cb.originalValue\r\n ) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport class ViewStateBuilder {\r\n private readonly uiRowIndex = new SparseRowIndex<number>();\r\n private uiRowIndexDirty = true;\r\n private readonly uiRowCache = new Map<number, UIRow>();\r\n private cachedColumns: ColumnSchema[] | undefined;\r\n private columnsFingerprint: string | undefined;\r\n private readonly quickFilterIndex = new QuickFilterIndex();\r\n private quickFilterIndexDirty = true;\r\n private readonly columnAggs = new ColumnAggIndex();\r\n /** Flat group/leaf nodes for the current UI index (PR-120). */\r\n private flatUiNodes: FlatUiNode[] = [];\r\n private groupNodesById = new Map<number, FlatGroupNode>();\r\n\r\n constructor(\r\n private readonly readStore: () => TableStore<TableState> | undefined,\r\n private readonly err: EngineErrorHandler,\r\n ) { }\r\n\r\n invalidateUiRowIndex(): void {\r\n this.uiRowIndexDirty = true;\r\n this.columnAggs.invalidate();\r\n }\r\n\r\n /** Full rebuild of searchable blobs (row add/delete/collection change). */\r\n invalidateQuickFilterIndex(): void {\r\n this.quickFilterIndexDirty = true;\r\n this.uiRowIndexDirty = true;\r\n this.columnAggs.invalidate();\r\n }\r\n\r\n forgetUiRows(ids: readonly number[]): void {\r\n for (const id of ids) this.uiRowCache.delete(id);\r\n }\r\n\r\n private columnsFor(\r\n table: { getActiveCollectionColumns: () => ColumnSchema[] },\r\n collapsedColumnGroups: Record<string, true>,\r\n ): ColumnSchema[] {\r\n const cols = table.getActiveCollectionColumns();\r\n const fingerprint = cols\r\n .map(\r\n (c) =>\r\n `${c.fieldName}:${c.hidden ? 1 : 0}:${c.order ?? ''}:${c.columnDef?.pinned ?? ''}`,\r\n )\r\n .join('|') + `|cg:${Object.keys(collapsedColumnGroups).sort().join(',')}`;\r\n if (this.cachedColumns && this.columnsFingerprint === fingerprint) {\r\n return this.cachedColumns;\r\n }\r\n this.columnsFingerprint = fingerprint;\r\n this.cachedColumns = applyColumnGroupCollapse(cols, collapsedColumnGroups);\r\n return this.cachedColumns;\r\n }\r\n\r\n getUiRowIndex(): SparseRowIndex<number> {\r\n this.ensureUiRowIndex();\r\n return this.uiRowIndex;\r\n }\r\n\r\n /**\r\n * O(log n) insert into an already-built UI index (PR-99).\r\n * Falls back to full invalidate when filters reject the row or index is dirty.\r\n */\r\n insertUiRow(rowId: number): boolean {\r\n if (this.uiRowIndexDirty) {\r\n this.ensureUiRowIndex();\r\n return this.uiRowIndex.indexOf(rowId) >= 0;\r\n }\r\n const storeRef = this.readStore();\r\n if (!storeRef) return false;\r\n const { table, sortModel, quickFilterText, filterModel, rowModelType } =\r\n storeRef.getState();\r\n if (isServerRowModel(rowModelType)) {\r\n this.invalidateUiRowIndex();\r\n return false;\r\n }\r\n const row = table.getRow(rowId);\r\n if (!row || row.rowState.value === RowStateEnum.Deleted) return false;\r\n if (this.uiRowIndex.indexOf(rowId) >= 0) return true;\r\n\r\n const activeName = table.getActiveCollectionName();\r\n if (row.collection !== activeName) return false;\r\n\r\n const columns = table.getActiveCollectionColumns();\r\n const byId = new Map([[rowId, row] as const]);\r\n // Accessor needs existing rows for compare — load active collection.\r\n for (const r of table.getRows()) {\r\n if (r.collection === activeName) byId.set(r.id.value, r);\r\n }\r\n this.ensureQuickFilterIndex(byId, columns);\r\n const sortAccessor = this.createSortAccessor(byId, columns);\r\n const filterAccessor = this.createFilterAccessor(byId, sortAccessor);\r\n if (applyFilter([rowId], filterModel, filterAccessor).length === 0) {\r\n return false;\r\n }\r\n if (\r\n applyQuickFilter([rowId], quickFilterText, this.quickFilterIndex)\r\n .length === 0\r\n ) {\r\n return false;\r\n }\r\n\r\n const pos = findSortedInsertIndex(\r\n this.uiRowIndex.getOrderedIds(),\r\n rowId,\r\n sortModel ?? [],\r\n sortAccessor,\r\n );\r\n this.uiRowIndex.insertAt(pos, rowId, rowId);\r\n this.columnAggs.invalidate();\r\n return true;\r\n }\r\n\r\n /** O(n-pos) remove from UI index without full sort (PR-99). */\r\n removeUiRow(rowId: number): void {\r\n this.quickFilterIndex.removeRow(rowId);\r\n this.uiRowCache.delete(rowId);\r\n if (this.uiRowIndexDirty) {\r\n this.columnAggs.invalidate();\r\n return;\r\n }\r\n this.uiRowIndex.remove(rowId);\r\n this.columnAggs.invalidate();\r\n }\r\n\r\n /**\r\n * Column search using ordered UI ids + QuickFilterIndex candidates (PR-99).\r\n * Verifies the target column text so QF false-positives are dropped.\r\n */\r\n findColumnSearchMatches(\r\n columnId: string,\r\n query: string,\r\n ): Array<{ rowId: number; columnId: string }> {\r\n const q = query.trim().toLowerCase();\r\n if (!q) return [];\r\n const storeRef = this.readStore();\r\n if (!storeRef) return [];\r\n const { table } = storeRef.getState();\r\n const ordered = this.getUiRowIndex().getOrderedIds();\r\n const activeName = table.getActiveCollectionName();\r\n const columns = table.getActiveCollectionColumns();\r\n const byId = new Map(\r\n table\r\n .getRows()\r\n .filter((r) => r.collection === activeName)\r\n .map((r) => [r.id.value, r] as const),\r\n );\r\n this.ensureQuickFilterIndex(byId, columns);\r\n const candidates = this.quickFilterIndex.filter(ordered, query);\r\n const matches: Array<{ rowId: number; columnId: string }> = [];\r\n for (const rowId of candidates) {\r\n if (isGroupRowId(rowId)) continue;\r\n const row = byId.get(rowId);\r\n if (!row || row.rowState.value === RowStateEnum.Deleted) continue;\r\n const value = row.readValue(columnId);\r\n const display = row.readDisplay(columnId);\r\n if (value === undefined && display === undefined && !row.peekCell(columnId)) {\r\n continue;\r\n }\r\n const text =\r\n display != null && display !== ''\r\n ? String(display)\r\n : String(value ?? '');\r\n if (text.toLowerCase().includes(q)) {\r\n matches.push({ rowId, columnId });\r\n }\r\n }\r\n return matches;\r\n }\r\n\r\n getColumnTotals(): Record<string, number> {\r\n this.ensureColumnAggs();\r\n return this.columnAggs.toNumberRecord();\r\n }\r\n\r\n /** All configured column aggregates (PR-119). */\r\n getColumnAggs(): Record<string, unknown> {\r\n this.ensureColumnAggs();\r\n return this.columnAggs.toRecord();\r\n }\r\n\r\n /**\r\n * Aggregate for one column with an optional override (footerRows).\r\n * Uses the incremental index when the override matches the column spec.\r\n */\r\n getColumnAggValue(\r\n columnId: string,\r\n overrideAgg?: AggFuncName | AggFunc,\r\n ): unknown {\r\n this.ensureColumnAggs();\r\n const storeRef = this.readStore();\r\n if (!storeRef) return null;\r\n const { table } = storeRef.getState();\r\n const columns = table.getActiveCollectionColumns();\r\n const specs = resolveColumnAggSpecs(columns);\r\n const primary = specs.find((s) => s.colId === columnId);\r\n if (\r\n overrideAgg == null ||\r\n (primary && primary.aggFunc === overrideAgg)\r\n ) {\r\n return this.columnAggs.get(columnId);\r\n }\r\n const values = this.collectActiveColumnValues(columnId);\r\n return applyAgg(overrideAgg, values);\r\n }\r\n\r\n /** Patch one aggregate after a cell edit (PR-99 / PR-118). */\r\n patchColumnTotal(\r\n columnId: string,\r\n oldValue: unknown,\r\n newValue: unknown,\r\n ): void {\r\n const storeRef = this.readStore();\r\n if (!storeRef) return;\r\n const col = storeRef\r\n .getState()\r\n .table.getActiveCollectionColumns()\r\n .find((c) => c.fieldName === columnId);\r\n if (!col) return;\r\n const specs = resolveColumnAggSpecs(\r\n storeRef.getState().table.getActiveCollectionColumns(),\r\n );\r\n if (!specs.some((s) => s.colId === columnId)) return;\r\n if (this.columnAggs.isDirty) {\r\n this.ensureColumnAggs();\r\n return;\r\n }\r\n const ok = this.columnAggs.patch(columnId, oldValue, newValue);\r\n if (!ok) this.ensureColumnAggs();\r\n }\r\n\r\n private collectActiveColumnValues(columnId: string): unknown[] {\r\n const storeRef = this.readStore();\r\n if (!storeRef) return [];\r\n const { table } = storeRef.getState();\r\n const activeName = table.getActiveCollectionName();\r\n const out: unknown[] = [];\r\n for (const row of table.getRows()) {\r\n if (row.collection !== activeName) continue;\r\n if (row.rowState.value === RowStateEnum.Deleted) continue;\r\n out.push(row.readValue(columnId));\r\n }\r\n return out;\r\n }\r\n\r\n private ensureColumnAggs(): void {\r\n if (!this.columnAggs.isDirty) return;\r\n const storeRef = this.readStore();\r\n if (!storeRef) {\r\n this.columnAggs.clear();\r\n this.columnAggs.rebuild([], () => []);\r\n return;\r\n }\r\n const { table } = storeRef.getState();\r\n const columns = table.getActiveCollectionColumns();\r\n const specs = resolveColumnAggSpecs(columns);\r\n const activeName = table.getActiveCollectionName();\r\n const rows = table\r\n .getRows()\r\n .filter(\r\n (r) =>\r\n r.collection === activeName &&\r\n r.rowState.value !== RowStateEnum.Deleted,\r\n );\r\n this.columnAggs.rebuild(specs, (columnId) =>\r\n rows.map((row) => row.readValue(columnId)),\r\n );\r\n }\r\n\r\n getUiRowCount(): number {\r\n return this.getUiRowIndex().size;\r\n }\r\n\r\n projectVisibleUiRows(range: { startIndex: number; endIndex: number }): UIRow[] {\r\n const ids = this.getUiRowIndex().projectVisible(range);\r\n const out: UIRow[] = [];\r\n for (const id of ids) {\r\n const row = this.getRowView(id);\r\n if (row) out.push(row);\r\n }\r\n return out;\r\n }\r\n\r\n private ensureUiRowIndex(): void {\r\n if (!this.uiRowIndexDirty) return;\r\n this.uiRowIndex.clear();\r\n this.flatUiNodes = [];\r\n this.groupNodesById.clear();\r\n const storeRef = this.readStore();\r\n if (!storeRef) {\r\n this.uiRowIndexDirty = false;\r\n return;\r\n }\r\n const {\r\n table,\r\n sortModel,\r\n quickFilterText,\r\n filterModel,\r\n rowModelType,\r\n rowGroupColumns,\r\n groupDefaultExpanded,\r\n rowGroupExpanded,\r\n } = storeRef.getState();\r\n const activeName = table.getActiveCollectionName();\r\n const rows = table\r\n .getRows()\r\n .filter((row) => row.collection === activeName);\r\n const byId = new Map(rows.map((row) => [row.id.value, row] as const));\r\n const columns = table.getActiveCollectionColumns();\r\n const server = isServerRowModel(rowModelType);\r\n\r\n let orderedIds: number[];\r\n if (server) {\r\n // Host already applied sort/filter — keep table insertion order (PR-96).\r\n orderedIds = [...byId.keys()];\r\n } else {\r\n this.ensureQuickFilterIndex(byId, columns);\r\n const sortAccessor = this.createSortAccessor(byId, columns);\r\n const afterColumnFilter = applyFilter(\r\n [...byId.keys()],\r\n filterModel,\r\n this.createFilterAccessor(byId, sortAccessor),\r\n );\r\n const filteredIds = applyQuickFilter(\r\n afterColumnFilter,\r\n quickFilterText,\r\n this.quickFilterIndex,\r\n );\r\n orderedIds = applySort(filteredIds, sortModel ?? [], sortAccessor);\r\n\r\n const groupField = resolveActiveGroupField(rowGroupColumns ?? []);\r\n if (groupField) {\r\n const aggSpecs = resolveColumnAggSpecs(columns);\r\n const grouped = buildGroupedFlatIndex({\r\n orderedLeafIds: orderedIds,\r\n groupField,\r\n getGroupValue: (rowId) => byId.get(rowId)?.readValue(groupField),\r\n defaultExpanded: groupDefaultExpanded !== false,\r\n expandedByKey: rowGroupExpanded ?? {},\r\n aggregateColumns: aggSpecs,\r\n getCellValue: (rowId, colId) => byId.get(rowId)?.readValue(colId),\r\n });\r\n this.flatUiNodes = grouped.nodes;\r\n for (const node of grouped.nodes) {\r\n if (node.kind === 'group') {\r\n this.groupNodesById.set(node.id, node);\r\n }\r\n }\r\n orderedIds = grouped.orderedIds;\r\n }\r\n }\r\n this.uiRowIndex.replaceAll(orderedIds, (id) => id);\r\n this.uiRowIndexDirty = false;\r\n }\r\n\r\n private ensureQuickFilterIndex(\r\n byId: Map<number, Row>,\r\n columns: ColumnSchema[],\r\n ): void {\r\n if (this.quickFilterIndexDirty) {\r\n this.quickFilterIndex.rebuild([...byId.keys()], {\r\n getParts: (rowId) => {\r\n const row = byId.get(rowId);\r\n return row ? this.quickFilterParts(row, columns) : [];\r\n },\r\n });\r\n this.quickFilterIndexDirty = false;\r\n return;\r\n }\r\n for (const id of [...this.quickFilterIndex.rowIds()]) {\r\n if (!byId.has(id)) this.quickFilterIndex.removeRow(id);\r\n }\r\n for (const id of byId.keys()) {\r\n if (!this.quickFilterIndex.has(id)) {\r\n const row = byId.get(id);\r\n if (row) {\r\n this.quickFilterIndex.setRow(id, this.quickFilterParts(row, columns));\r\n }\r\n }\r\n }\r\n }\r\n\r\n private quickFilterParts(row: Row, columns: ColumnSchema[]): unknown[] {\r\n const parts: unknown[] = [];\r\n for (const col of columns) {\r\n if (col.fieldName === 'index' || col.fieldType === 'index') continue;\r\n // PR-101: read host data without allocating Cell objects.\r\n const value = row.readValue(col.fieldName);\r\n if (value === undefined && !row.peekCell(col.fieldName)) continue;\r\n parts.push(value);\r\n const display = row.readDisplay(col.fieldName);\r\n if (display != null && display !== '' && display !== value) {\r\n parts.push(display);\r\n }\r\n }\r\n return parts;\r\n }\r\n\r\n /** Patch one row after a cell edit (incremental; no full O(n) rebuild). */\r\n patchQuickFilterRow(rowId: number): void {\r\n const storeRef = this.readStore();\r\n if (!storeRef) return;\r\n const { table } = storeRef.getState();\r\n const row = table.getRow(rowId);\r\n if (!row) {\r\n this.quickFilterIndex.removeRow(rowId);\r\n return;\r\n }\r\n this.quickFilterIndex.setRow(\r\n rowId,\r\n this.quickFilterParts(row, table.getActiveCollectionColumns()),\r\n );\r\n }\r\n\r\n removeQuickFilterRows(ids: readonly number[]): void {\r\n for (const id of ids) this.quickFilterIndex.removeRow(id);\r\n }\r\n\r\n private createSortAccessor(\r\n byId: Map<number, Row>,\r\n columns: ColumnSchema[],\r\n ): SortAccessor {\r\n const colByName = new Map(columns.map((col) => [col.fieldName, col]));\r\n return {\r\n getValue: (rowId, colId) => byId.get(rowId)?.readValue(colId),\r\n getFieldType: (colId) => colByName.get(colId)?.fieldType,\r\n getComparator: (colId) => colByName.get(colId)?.columnDef?.comparator,\r\n };\r\n }\r\n\r\n private createFilterAccessor(\r\n _byId: Map<number, Row>,\r\n sortAccessor: SortAccessor,\r\n ): FilterAccessor {\r\n return {\r\n getValue: sortAccessor.getValue,\r\n };\r\n }\r\n\r\n private getSortModel(): SortModel {\r\n return this.readStore()?.getState().sortModel ?? [];\r\n }\r\n\r\n private getQuickFilterText(): string {\r\n return this.readStore()?.getState().quickFilterText ?? '';\r\n }\r\n\r\n private getFilterModel(): FilterModel {\r\n return this.readStore()?.getState().filterModel ?? {};\r\n }\r\n\r\n private getStore() {\r\n const store = this.readStore();\r\n\r\n if (!store) {\r\n this.err.notFound('TableStore', 'active', 'ViewStateBuilder');\r\n }\r\n return store;\r\n }\r\n\r\n private mapRowCells(\r\n row: Row,\r\n columns: ColumnSchema[],\r\n ): Record<string, TCell> {\r\n const cells: Record<string, TCell> = {};\r\n\r\n for (const col of columns) {\r\n try {\r\n const cell = row.getCell(col.fieldName);\r\n\r\n cells[col.fieldName] = {\r\n value: cell?.getValue() ?? null,\r\n originalValue: cell?.getOriginalValue()?.value ?? null,\r\n display: cell?.getDisplay() ?? null,\r\n };\r\n } catch (error) {\r\n this.err.handle(error, 'ViewStateBuilder.mapRowCells');\r\n }\r\n }\r\n\r\n return cells;\r\n }\r\n\r\n private sortRows(rows: Row[]): Row[] {\r\n if (rows.length === 0) return [];\r\n const server = isServerRowModel(this.readStore()?.getState().rowModelType);\r\n if (server) {\r\n return rows.slice();\r\n }\r\n const qf = this.getQuickFilterText().trim();\r\n const fm = this.getFilterModel();\r\n const hasFilter = Boolean(qf) || Object.keys(fm).length > 0;\r\n if (rows.length === 1 && !hasFilter) {\r\n return rows.slice();\r\n }\r\n const byId = new Map(rows.map((row) => [row.id.value, row] as const));\r\n const columns =\r\n this.readStore()?.getState().table.getActiveCollectionColumns() ?? [];\r\n this.ensureQuickFilterIndex(byId, columns);\r\n const sortAccessor = this.createSortAccessor(byId, columns);\r\n const afterColumnFilter = applyFilter(\r\n [...byId.keys()],\r\n fm,\r\n this.createFilterAccessor(byId, sortAccessor),\r\n );\r\n const filteredIds = applyQuickFilter(\r\n afterColumnFilter,\r\n this.getQuickFilterText(),\r\n this.quickFilterIndex,\r\n );\r\n const orderedIds = applySort(\r\n filteredIds,\r\n this.getSortModel(),\r\n sortAccessor,\r\n );\r\n const out: Row[] = [];\r\n for (const id of orderedIds) {\r\n const row = byId.get(id);\r\n if (row) out.push(row);\r\n }\r\n return out;\r\n }\r\n\r\n private mapRowToUIRow(\r\n row: Row,\r\n columns: ColumnSchema[],\r\n expandedRows: Record<string, boolean>,\r\n ): UIRow {\r\n const next: UIRow = {\r\n id: row.id.value,\r\n rowState: row.rowState.value,\r\n changeFields: row.getChangeFields(),\r\n cells: this.mapRowCells(row, columns),\r\n isExpanded: !!expandedRows[row.id.value],\r\n visibilityCondition: row.visibilityCondition,\r\n loading: isServerLoadingRow(row.getData()) || undefined,\r\n };\r\n const prev = this.uiRowCache.get(row.id.value);\r\n if (prev && uiRowShallowEqual(prev, next)) {\r\n return prev;\r\n }\r\n this.uiRowCache.set(row.id.value, next);\r\n return next;\r\n }\r\n\r\n private mapRowsToUIRows(\r\n rows: Row[],\r\n columns: ColumnSchema[],\r\n expandedRows: Record<string, boolean>,\r\n ): UIRow[] {\r\n return this.sortRows(rows).map((row) =>\r\n this.mapRowToUIRow(row, columns, expandedRows),\r\n );\r\n }\r\n\r\n private getRenderableMobileRows(\r\n rows: Row[],\r\n mobileEditor: TableState['mobileEditor'],\r\n ): Row[] {\r\n return this.sortRows(\r\n rows\r\n .filter((row) => row.rowState.value !== RowStateEnum.Deleted)\r\n .filter(\r\n (row) =>\r\n !(\r\n mobileEditor?.mode === 'add' &&\r\n row.id.value === mobileEditor.rowId\r\n ),\r\n ),\r\n );\r\n }\r\n\r\n getViewState(): TableViewState | undefined {\r\n try {\r\n const storeRef = this.getStore();\r\n\r\n if (!storeRef) return undefined;\r\n\r\n const store = storeRef.getState();\r\n\r\n const { table, expandedRows, activeCell, selectedRows, gridSearch, mobileEditor, columnWidths, sortModel, quickFilterText, filterModel, rowModelType, serverRowCount, cellRangeSelection, collapsedColumnGroups, rowGroupColumns, groupDefaultExpanded, cellEdit } = store;\r\n\r\n const pagination = table.getPagination();\r\n\r\n const activeName = table.getActiveCollectionName();\r\n const sortedActive = this.sortRows(\r\n table.getRows().filter((row) => row.collection === activeName),\r\n );\r\n const server = isServerRowModel(rowModelType);\r\n const pageWindow = table.isPageWindow();\r\n // Page-window mode: totals come from Pagination (IndexedDB meta), not the\r\n // RAM window size.\r\n const totalRows = server\r\n ? (serverRowCount ?? sortedActive.length)\r\n : pageWindow\r\n ? pagination.totalRows\r\n : this.getUiRowCount();\r\n\r\n const totalPages = Math.max(\r\n 1,\r\n Math.ceil(totalRows / Math.max(1, pagination.pageSize)),\r\n );\r\n\r\n const collapsed = collapsedColumnGroups ?? {};\r\n const columns = this.columnsFor(table, collapsed);\r\n // Server/infinite: table already holds the current page payload (PR-96).\r\n // Client: page from the flat UI index (sort/filter/group — PR-93/120).\r\n let pageRows: UIRow[];\r\n if (server) {\r\n pageRows = sortedActive.map((row) =>\r\n this.mapRowToUIRow(row, columns, expandedRows),\r\n );\r\n } else {\r\n // Page-window mode: the RAM Maps already hold ONLY the current page.\r\n const orderedIds = this.getUiRowIndex().getOrderedIds();\r\n const start = pageWindow ? 0 : (pagination.page - 1) * pagination.pageSize;\r\n const end = pageWindow ? orderedIds.length : start + pagination.pageSize;\r\n const ids = orderedIds.slice(start, end);\r\n pageRows = [];\r\n for (const id of ids) {\r\n const view = this.getRowView(id);\r\n if (view) pageRows.push(view);\r\n }\r\n }\r\n\r\n return {\r\n activeCell: activeCell ?? null,\r\n selectedRows,\r\n rows: pageRows,\r\n deletedRows: [],\r\n columns,\r\n activeCollectionColumn: columns,\r\n pagination: {\r\n page: pagination.page,\r\n pageSize: pagination.pageSize,\r\n totalRows,\r\n totalPages,\r\n canPrev: pagination.page > 1,\r\n canNext: pagination.page < totalPages,\r\n },\r\n action: table.getTableAction(),\r\n gridSearch,\r\n mobileEditor,\r\n columnWidths: columnWidths ?? {},\r\n sortModel: sortModel ?? [],\r\n quickFilterText: quickFilterText ?? '',\r\n filterModel: filterModel ?? {},\r\n cellRanges: cellRangeSelection?.ranges ?? [],\r\n collapsedColumnGroups: collapsed,\r\n rowGroupColumns: rowGroupColumns ?? [],\r\n groupDefaultExpanded: groupDefaultExpanded !== false,\r\n cellEdit: cellEdit ?? null,\r\n };\r\n } catch (error) {\r\n this.err.handle(error, 'ViewStateBuilder.getViewState');\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * All active-collection UI rows (no pagination slice) for virtual scroll.\r\n */\r\n getAllUIRows(): UIRow[] | null {\r\n try {\r\n const storeRef = this.getStore();\r\n if (!storeRef) return null;\r\n const ids = this.getUiRowIndex().getOrderedIds();\r\n const out: UIRow[] = [];\r\n for (const id of ids) {\r\n const view = this.getRowView(id);\r\n if (view) out.push(view);\r\n }\r\n return out;\r\n } catch (error) {\r\n this.err.handle(error, 'ViewStateBuilder.getAllUIRows');\r\n return null;\r\n }\r\n }\r\n\r\n // ViewBuilder\r\n getAllRows(collectionScope: CollectionScope = 'active'): Row[] | null {\r\n const storeRef = this.getStore();\r\n if (!storeRef) return null;\r\n const { table } = storeRef.getState();\r\n return this.sortRows(table.getRows(collectionScope));\r\n }\r\n\r\n getMobileViewState(): MobileTableViewState | undefined {\r\n try {\r\n const storeRef = this.getStore();\r\n if (!storeRef) return undefined;\r\n\r\n const { table, expandedRows, mobileEditor, collapsedColumnGroups } = storeRef.getState();\r\n const pagination = table.getPagination();\r\n const columns = this.columnsFor(table, collapsedColumnGroups ?? {});\r\n const allRows = this.getRenderableMobileRows(table.getRows('active'), mobileEditor);\r\n const pageSize = Math.max(MOBILE_PAGE_SIZE, pagination.pageSize);\r\n const visibleRows = allRows.slice(0, pageSize);\r\n const totalRows = table.isPageWindow() ? pagination.totalRows : allRows.length;\r\n const visibleCount = Math.min(pageSize, allRows.length);\r\n\r\n return {\r\n rows: this.mapRowsToUIRows(visibleRows, columns, expandedRows),\r\n columns,\r\n totalRows,\r\n visibleCount,\r\n hasMore: visibleCount < totalRows,\r\n pageSize,\r\n mobileEditor,\r\n };\r\n } catch (error) {\r\n this.err.handle(error, 'ViewStateBuilder.getMobileViewState');\r\n return undefined;\r\n }\r\n }\r\n\r\n getRowView(rowId: number): UIRow | null {\r\n const storeRef = this.getStore();\r\n if (!storeRef) return null;\r\n\r\n const {\r\n table,\r\n expandedRows,\r\n collapsedColumnGroups,\r\n groupDefaultExpanded,\r\n rowGroupExpanded,\r\n } = storeRef.getState();\r\n const columns = this.columnsFor(table, collapsedColumnGroups ?? {});\r\n\r\n if (isGroupRowId(rowId)) {\r\n this.ensureUiRowIndex();\r\n const node = this.groupNodesById.get(rowId);\r\n if (!node) return null;\r\n const expanded = isGroupExpanded(\r\n node.key,\r\n groupDefaultExpanded !== false,\r\n rowGroupExpanded,\r\n );\r\n return this.mapGroupToUIRow(node, columns, expanded);\r\n }\r\n\r\n const row = table.getRow(rowId);\r\n\r\n if (!row) return null;\r\n\r\n return this.mapRowToUIRow(row, columns, expandedRows);\r\n }\r\n\r\n /** Flat group/leaf presentation nodes (PR-120). */\r\n getFlatUiNodes(): readonly FlatUiNode[] {\r\n this.ensureUiRowIndex();\r\n return this.flatUiNodes;\r\n }\r\n\r\n getGroupNode(rowId: number): FlatGroupNode | undefined {\r\n this.ensureUiRowIndex();\r\n return this.groupNodesById.get(rowId);\r\n }\r\n\r\n private mapGroupToUIRow(\r\n node: FlatGroupNode,\r\n columns: ColumnSchema[],\r\n expanded: boolean,\r\n ): UIRow {\r\n const cells: Record<string, TCell> = {};\r\n for (const col of columns) {\r\n if (col.fieldName === node.field) {\r\n cells[col.fieldName] = {\r\n value: node.key,\r\n originalValue: node.key,\r\n display: node.key,\r\n };\r\n } else if (\r\n Object.prototype.hasOwnProperty.call(node.aggregates, col.fieldName)\r\n ) {\r\n const v = node.aggregates[col.fieldName];\r\n cells[col.fieldName] = {\r\n value: v,\r\n originalValue: v,\r\n display: v,\r\n };\r\n } else {\r\n cells[col.fieldName] = {\r\n value: null,\r\n originalValue: null,\r\n display: null,\r\n };\r\n }\r\n }\r\n const next: UIRow = {\r\n id: node.id,\r\n rowState: RowStateEnum.Unchanged,\r\n changeFields: [],\r\n cells,\r\n isExpanded: expanded,\r\n visibilityCondition: {},\r\n rowKind: 'group',\r\n groupField: node.field,\r\n groupKey: node.key,\r\n groupChildCount: node.childRowIds.length,\r\n groupExpanded: expanded,\r\n };\r\n const prev = this.uiRowCache.get(node.id);\r\n if (prev && uiRowShallowEqual(prev, next)) {\r\n return prev;\r\n }\r\n this.uiRowCache.set(node.id, next);\r\n return next;\r\n }\r\n\r\n getSnapShot(collectionScope?: CollectionScope): TableSnapShot | null {\r\n const storeRef = this.getStore();\r\n if (!storeRef) return null;\r\n\r\n const { table } = storeRef.getState();\r\n const hasMeaningfulValue = (value: unknown) =>\r\n value !== undefined && value !== null && value !== '';\r\n\r\n return {\r\n rows: table\r\n .getRows(collectionScope)\r\n .filter(row =>\r\n Array.from(row.getCells().entries()).some(\r\n ([key, cell]) => key !== 'index' && hasMeaningfulValue(cell.getValue()),\r\n ),\r\n )\r\n .map(row => ({\r\n id: row.id.value,\r\n changeFields: row.getSnapshotChangeFields(),\r\n cells: Object.fromEntries(\r\n [...row.getCells()].map(([k, c]) => [k, c.getValue()]),\r\n ),\r\n rowState: row.rowState.value,\r\n collection: row.getCollection(),\r\n rowType: row.getCollection(),\r\n isSaveDescription: row.isSaveDescription,\r\n })),\r\n };\r\n }\r\n\r\n getExpandedRowData(\r\n rowId: number,\r\n ): Record<string, unknown> | null {\r\n const storeRef = this.getStore();\r\n if (!storeRef) return null;\r\n\r\n const { table } = storeRef.getState();\r\n const row = table.getRows().find(r => r.id.value === rowId);\r\n if (!row) return null;\r\n\r\n const rowValues: Record<string, unknown> = {};\r\n for (const [colId, cell] of row.getCells().entries()) {\r\n rowValues[colId] = cell.getValue();\r\n }\r\n return rowValues;\r\n }\r\n\r\n getActiveCell(): TableState['activeCell'] | null {\r\n const store = this.getStore()?.getState();\r\n if (!store) return null;\r\n return store.activeCell;\r\n }\r\n getActiveRow(): number | null {\r\n\r\n try {\r\n\r\n const store = this.getStore()?.getState();\r\n\r\n if (!store) return null;\r\n\r\n return store.activeRowId ?? null;\r\n\r\n } catch (error) {\r\n\r\n this.err.handle(error, 'ViewStateBuilder.getActiveRow');\r\n\r\n return null;\r\n }\r\n }\r\n\r\n getSelectedRows(): Record<number, boolean> | undefined {\r\n const store = this.getStore()?.getState();\r\n if (!store) return undefined;\r\n return store.selectedRows;\r\n }\r\n\r\n getCell(rowId: number, columnId: string): Cell | undefined {\r\n const store = this.getStore()?.getState();\r\n if (!store) return undefined;\r\n return store.table.getRow(rowId)?.getCell(columnId);\r\n }\r\n isActiveCell(rowId: number, columnId: string): boolean {\r\n\r\n try {\r\n const store = this.getStore();\r\n if (!store) return false;\r\n const { activeCell } = store.getState();\r\n return (\r\n !!activeCell &&\r\n activeCell.rowId === rowId &&\r\n activeCell.columnId === columnId\r\n );\r\n } catch (error) {\r\n this.err.handle(error, 'ViewStateBuilder.isActiveCell');\r\n return false;\r\n }\r\n }\r\n\r\n\r\n isSelectedRow(rowId: number): boolean {\r\n\r\n try {\r\n\r\n const store = this.getStore();\r\n\r\n if (!store) return false;\r\n\r\n const { selectedRows } = store.getState();\r\n\r\n return !!selectedRows && !!selectedRows[rowId];\r\n\r\n } catch (error) {\r\n\r\n this.err.handle(error, 'ViewStateBuilder.isSelectedRow');\r\n\r\n return false;\r\n }\r\n }\r\n\r\n\r\n isCutRow(rowId: number): boolean {\r\n try {\r\n const store = this.getStore();\r\n if (!store) return false;\r\n const { selectedRows, table } = store.getState();\r\n return selectedRows[rowId] && table.getTableAction() === 'cut';\r\n } catch (error) {\r\n this.err.handle(error, 'ViewStateBuilder.isCutRow');\r\n return false;\r\n }\r\n }\r\n\r\n\r\n isActiveRow(rowId: number): boolean {\r\n\r\n try {\r\n\r\n const store = this.getStore();\r\n\r\n if (!store) return false;\r\n\r\n const { activeRowId } = store.getState();\r\n\r\n return !!activeRowId && activeRowId === rowId;\r\n\r\n } catch (error) {\r\n\r\n this.err.handle(error, 'ViewStateBuilder.isActiveRow');\r\n\r\n return false;\r\n }\r\n }\r\n\r\n}","import {\r\n Actor,\r\n AddEmptyRowCommand,\r\n DuplicateRowCommand,\r\n ApplicationTableCommand,\r\n isApplicationTableCommand,\r\n TableCommand,\r\n} from '../application/commands';\r\nimport {\r\n isWindowedRepository,\r\n PersistedRowRecord,\r\n TableRepository,\r\n} from '../application/ports/TableRepository';\r\nimport { TableAppService } from '../application/TableAppService';\r\nimport { ColumnSchema } from '../bootstrap/type';\r\nimport { Cell } from '../domain/entities/Cell';\r\nimport { Row } from '../domain/entities/Row';\r\nimport {\r\n CollectionScope,\r\n Table,\r\n} from '../domain/entities/Table';\r\nimport { RowAdded } from '../domain/events';\r\nimport {\r\n ColumnId,\r\n RowStateEnum,\r\n} from '../domain/value-objects';\r\nimport {\r\n ConsoleAuditLogger,\r\n} from '../infrastructure/Repositories/consoleAuditLogger';\r\nimport { UIRow } from '../ui/type';\r\nimport { EngineErrorHandler } from './EngineErrorHandler';\r\nimport { CellRangeManager } from './managers/CellRangeManager';\r\nimport { NavigationManager } from './managers/NavigationManager';\r\nimport { RowManager } from './managers/RowManager';\r\nimport { SelectionManager } from './managers/SelectionManager';\r\nimport {\r\n canSetColumnVisible,\r\n} from './dataOps/columnVisibility';\r\nimport { canSetColumnPinned } from './dataOps/columnPinPolicy';\r\nimport {\r\n createEmptyCellRangeSelection,\r\n extendCellRangeToEdge,\r\n type ArrowDirection,\r\n type CellRange,\r\n type CellRangeSelection,\r\n} from './selection/cellRange';\r\nimport { SparseRowIndex } from './SparseRowIndex';\r\nimport { TableStore } from './tableStore';\r\nimport {\r\n CellError,\r\n MobileTableViewState,\r\n TableSnapShot,\r\n TableState,\r\n TableViewState,\r\n ValidationCallback,\r\n ValidCell,\r\n} from './type';\r\nimport { clampColumnWidth } from './columnWidth';\r\nimport {\r\n createCellEditSession,\r\n dirtyDraftColumns,\r\n isEditingCell,\r\n leavesEditSession,\r\n patchDraft,\r\n readDraft,\r\n DEFAULT_CELL_EDIT_OPTIONS,\r\n type CellEditOptions,\r\n type CellEditSession,\r\n type CellEditValue,\r\n} from './dataOps/cellEditSession';\r\nimport type { FilterModel } from './dataOps/filterModel';\r\nimport type { RowModelType } from './dataOps/rowModel';\r\nimport { ViewStateBuilder } from './ViewStateBuilder';\r\nimport type { ColumnDef } from '../domain/types/ColumnDef';\r\nimport { mapColumnSchemasToDefs } from '../infrastructure/columns/mapColumnDef';\r\nimport {\r\n applyHostRowDataToTable,\r\n defaultGetRowId,\r\n ensureIndexColumnDef,\r\n type GetRowId,\r\n} from '../infrastructure/rows/mapRowData';\r\n\r\nexport class TableEngine {\r\n // ─── internal state ────────────────────────────────────────────────────────\r\n private tableStore?: TableStore<TableState>;\r\n private tableKey?: string;\r\n /** Durable command store id (for CHANGE_CELL_* on edit commit). */\r\n private commandStore?: string;\r\n private cellEditOptions: CellEditOptions = { ...DEFAULT_CELL_EDIT_OPTIONS };\r\n public readonly errors = new Map<string, CellError>();\r\n public readonly searchResult = new Map<string, CellError>();\r\n private readonly asyncCellCache = new Map<\r\n string,\r\n { valueKey: string; error?: CellError }\r\n >();\r\n private readonly asyncCellSeq = new Map<string, number>();\r\n\r\n\r\n // ─── collaborators ─────────────────────────────────────────────────────────\r\n private readonly errHandler: EngineErrorHandler;\r\n private readonly selection: SelectionManager;\r\n private readonly cellRange: CellRangeManager;\r\n private readonly rowMgr: RowManager;\r\n private readonly nav: NavigationManager;\r\n private readonly viewBuilder: ViewStateBuilder;\r\n /** Notifies host server/infinite row model after sort/filter/page (PR-96). */\r\n private viewQueryListener?: () => void;\r\n\r\n constructor(\r\n private readonly app: TableAppService,\r\n private readonly repo: TableRepository,\r\n private readonly actor: Actor,\r\n audit: ConsoleAuditLogger,\r\n /**\r\n * متای زندهٔ ستونها از کانفیگ (دارای resolveOn / dynamicSource که در\r\n * IndexedDB serialize نمیشوند). NavigationManager برای تشخیص ستونهای\r\n * شرطیِ فعالشدن سطر (APPLY_ROW_VISIBILITY) به آن نیاز دارد.\r\n */\r\n private readonly columnMeta?: Map<string, ColumnSchema>,\r\n ) {\r\n this.errHandler = new EngineErrorHandler(audit);\r\n this.selection = new SelectionManager(\r\n () => this.tableStore,\r\n this.errHandler,\r\n (rowId) => this.viewBuilder.getGroupNode(rowId)?.childRowIds,\r\n );\r\n this.cellRange = new CellRangeManager(\r\n () => this.tableStore,\r\n () => this.getCellRangeBounds(),\r\n this.errHandler,\r\n );\r\n this.rowMgr = new RowManager(() => this.tableStore, this.errHandler);\r\n this.viewBuilder = new ViewStateBuilder(() => this.tableStore, this.errHandler);\r\n this.nav = new NavigationManager(\r\n () => this.tableStore,\r\n this.app,\r\n this.repo,\r\n this.actor,\r\n this.errHandler,\r\n () => this.getViewState(),\r\n (cmd) => this.dispatch(cmd),\r\n () => this.getUiRowIndex(),\r\n columnMeta,\r\n );\r\n }\r\n\r\n // ─── private table lifecycle ────────────────────────────────────────────────\r\n\r\n private async registerTable(cmd: {\r\n store: string;\r\n table: Table;\r\n }): Promise<void> {\r\n const { store, table } = cmd;\r\n this.commandStore = store;\r\n if (this.tableStore && this.tableKey === table.id) {\r\n const existsInRepo = await this.repo.exists(store, table.id);\r\n if (existsInRepo) return;\r\n await this.repo.save(store, table);\r\n return;\r\n }\r\n const tableStore = new TableStore<TableState>({\r\n table,\r\n expandedRows: {},\r\n selectedRows: {},\r\n activeRowId: undefined,\r\n activeCell: undefined,\r\n rangeAnchorRowId: undefined,\r\n gridSearch: null,\r\n mobileEditor: null,\r\n columnWidths: {},\r\n sortModel: [],\r\n quickFilterText: '',\r\n filterModel: {},\r\n rowModelType: 'clientSide',\r\n serverRowCount: null,\r\n cellRangeSelection: createEmptyCellRangeSelection(),\r\n collapsedColumnGroups: {},\r\n rowGroupColumns: [],\r\n groupDefaultExpanded: true,\r\n rowGroupExpanded: {},\r\n cellEdit: null,\r\n });\r\n this.tableKey = table.id;\r\n this.tableStore = tableStore;\r\n this.viewBuilder.invalidateUiRowIndex();\r\n try {\r\n await this.repo.save(store, table);\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.registerTable');\r\n }\r\n }\r\n\r\n private async deleteTable(cmd: {\r\n store: string;\r\n tableKey: string;\r\n }): Promise<void> {\r\n try {\r\n await this.repo.delete(cmd.store, cmd.tableKey);\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.deleteTable');\r\n }\r\n if (this.tableKey === cmd.tableKey) {\r\n this.tableStore = undefined;\r\n this.tableKey = undefined;\r\n this.viewBuilder.invalidateUiRowIndex();\r\n }\r\n }\r\n\r\n private disposeTable(cmd: { store: string; tableKey: string }): void {\r\n if (isWindowedRepository(this.repo)) {\r\n // Keep IndexedDB as source of truth; only drop the RAM page window\r\n this.repo.clearLocal(cmd.store, cmd.tableKey);\r\n } else {\r\n this.repo.delete(cmd.store, cmd.tableKey);\r\n }\r\n if (this.tableKey === cmd.tableKey) {\r\n this.tableStore = undefined;\r\n this.tableKey = undefined;\r\n this.viewBuilder.invalidateUiRowIndex();\r\n }\r\n }\r\n\r\n private async resetTable(cmd: {\r\n store: string;\r\n tableKey: string;\r\n }): Promise<void> {\r\n const tableStore = this.getStore(cmd.tableKey);\r\n if (!tableStore) {\r\n this.errHandler.notFound('TableStore', cmd.tableKey, 'TableEngine.resetTable');\r\n return;\r\n }\r\n\r\n try {\r\n const freshTable = await this.repo.getById(cmd.store, cmd.tableKey);\r\n if (!freshTable) {\r\n this.errHandler.notFound('Table (from repo)', cmd.tableKey, 'TableEngine.resetTable');\r\n return;\r\n }\r\n this.viewBuilder.invalidateUiRowIndex();\r\n tableStore.setState(prev => ({\r\n ...prev,\r\n table: freshTable,\r\n expandedRows: {},\r\n selectedRows: {},\r\n activeRowId: undefined,\r\n activeCell: undefined,\r\n rangeAnchorRowId: undefined,\r\n gridSearch: null,\r\n mobileEditor: null,\r\n columnWidths: {},\r\n sortModel: [],\r\n quickFilterText: '',\r\n filterModel: {},\r\n serverRowCount: null,\r\n cellRangeSelection: createEmptyCellRangeSelection(),\r\n collapsedColumnGroups: {},\r\n rowGroupColumns: [],\r\n groupDefaultExpanded: true,\r\n rowGroupExpanded: {},\r\n cellEdit: null,\r\n }));\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.resetTable');\r\n }\r\n }\r\n\r\n // ─── private helper ─────────────────────────────────────────────────────────\r\n\r\n private shouldInvalidateUiRowIndex(command: ApplicationTableCommand): boolean {\r\n if (isWindowedRepository(this.repo)) {\r\n // Page-window: the RAM rows are swapped wholesale from IndexedDB, so the\r\n // flat UI index can never be patched incrementally for these commands.\r\n switch (command.type) {\r\n case 'ADD_EMPTY_ROW':\r\n case 'ROW_DELETED':\r\n case 'ROWS_DELETED':\r\n case 'CHANGE_PAGE':\r\n case 'CHANGE_PAGE_SIZE':\r\n this.viewBuilder.invalidateQuickFilterIndex();\r\n return true;\r\n default:\r\n break;\r\n }\r\n }\r\n switch (command.type) {\r\n case 'ADD_EMPTY_ROW':\r\n case 'ROW_DELETED': {\r\n // Incremental patch skips group nodes — full rebuild when grouping (PR-120).\r\n const state = this.getStore(command.tableKey)?.getState();\r\n if ((state?.rowGroupColumns?.length ?? 0) > 0) {\r\n this.viewBuilder.invalidateQuickFilterIndex();\r\n return true;\r\n }\r\n return false;\r\n }\r\n case 'ADD_NEW_ROWS':\r\n case 'DUPLICATE_ROW':\r\n case 'PASTE_ROW':\r\n case 'RESTORE_ADDED_ROW':\r\n case 'TABLE_DELETED':\r\n case 'TABLE_RESET':\r\n case 'ROW_REORDERED':\r\n case 'SET_ACTIVE_COLLECTION':\r\n this.viewBuilder.invalidateQuickFilterIndex();\r\n return true;\r\n case 'CHANGE_CELL_VALUE': {\r\n if (command.columnId === 'index') return true;\r\n const state = this.getStore(command.tableKey)?.getState();\r\n const sortModel = state?.sortModel ?? [];\r\n if (sortModel.some((item) => item.colId === command.columnId)) {\r\n return true;\r\n }\r\n if (state?.filterModel?.[command.columnId]) return true;\r\n if ((state?.rowGroupColumns?.length ?? 0) > 0) return true;\r\n return Boolean(state?.quickFilterText?.trim());\r\n }\r\n case 'PASTE_CELLS':\r\n this.viewBuilder.invalidateQuickFilterIndex();\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private getStore(expectedTableKey?: string): TableStore<TableState> | undefined {\r\n const store = this.tableStore;\r\n if (!store || (expectedTableKey && this.tableKey && expectedTableKey !== this.tableKey)) {\r\n this.errHandler.notFound('TableStore', expectedTableKey ?? this.tableKey ?? 'active', 'TableEngine');\r\n return undefined;\r\n }\r\n return store;\r\n }\r\n\r\n /**\r\n * Default case در dispatch:\r\n * command را به AppService میدهد و سپس repo را reload میکند.\r\n */\r\n private async executeAppCommand(command: ApplicationTableCommand): Promise<void> {\r\n let result: unknown;\r\n\r\n const prevCellValue =\r\n command.type === 'CHANGE_CELL_VALUE'\r\n ? this.getStore(command.tableKey)\r\n ?.getState()\r\n .table.getRow(command.rowId)\r\n ?.getCells()\r\n .get(command.columnId)\r\n ?.getValue()\r\n : undefined;\r\n\r\n try {\r\n result = await this.app.execute(command, this.actor);\r\n } catch (e) {\r\n this.errHandler.handle(e, `TableEngine.dispatch[${command.type}]`);\r\n return;\r\n }\r\n\r\n try {\r\n const updated = await this.repo.getById(\r\n command.store,\r\n command.tableKey,\r\n );\r\n const store = this.getStore(command.tableKey);\r\n if (!store || !updated) return;\r\n if (this.shouldInvalidateUiRowIndex(command)) {\r\n this.viewBuilder.invalidateUiRowIndex();\r\n }\r\n const prev = store.getState();\r\n store.setState(() => ({ ...prev, table: updated }));\r\n\r\n if (command.type === 'CHANGE_CELL_VALUE') {\r\n this.viewBuilder.patchQuickFilterRow(command.rowId);\r\n this.viewBuilder.patchColumnTotal(\r\n command.columnId,\r\n prevCellValue,\r\n command.newValue,\r\n );\r\n }\r\n\r\n if (command.type === 'ADD_EMPTY_ROW' || command.type === 'DUPLICATE_ROW') {\r\n const rowAdded = result as RowAdded | null;\r\n const rowId = rowAdded?.rowId?.value;\r\n const shouldActivate =\r\n command.type === 'DUPLICATE_ROW' ||\r\n (command as AddEmptyRowCommand).autoActivate;\r\n\r\n if (command.type === 'ADD_EMPTY_ROW' && !updated.isPageWindow()) {\r\n const grouping =\r\n (store.getState().rowGroupColumns?.length ?? 0) > 0;\r\n if (rowId != null && !grouping) {\r\n this.viewBuilder.patchQuickFilterRow(rowId);\r\n this.viewBuilder.insertUiRow(rowId);\r\n } else if (rowId != null) {\r\n this.viewBuilder.patchQuickFilterRow(rowId);\r\n }\r\n }\r\n\r\n if (shouldActivate && rowId != null) {\r\n const target = command as AddEmptyRowCommand | DuplicateRowCommand;\r\n await this.nav.setActiveRow({\r\n store: target.store,\r\n tableKey: target.tableKey,\r\n rowId,\r\n });\r\n this.nav.activateFirstCell({\r\n tableKey: target.tableKey,\r\n rowId,\r\n });\r\n }\r\n }\r\n\r\n if (command.type === 'ROW_DELETED') {\r\n const grouping =\r\n (store.getState().rowGroupColumns?.length ?? 0) > 0;\r\n if (!grouping) {\r\n this.viewBuilder.removeUiRow(command.rowId);\r\n }\r\n }\r\n\r\n if (\r\n command.type === 'CHANGE_PAGE' ||\r\n command.type === 'CHANGE_PAGE_SIZE'\r\n ) {\r\n this.notifyViewQueryChanged();\r\n }\r\n } catch (e) {\r\n this.errHandler.handle(e, `TableEngine.dispatch.reload[${command.type}]`);\r\n }\r\n }\r\n\r\n /**\r\n * Paste goes through AppService (PASTE_ROW + optional ROW_DELETED for cut)\r\n * with one correlationId so undo reverses the whole unit.\r\n */\r\n private async executePasteAction(command: {\r\n store: string;\r\n tableKey: string;\r\n action: 'paste' | 'pasteInsert';\r\n correlationId?: string;\r\n }): Promise<void> {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n\r\n const { table, selectedRows, activeRowId } = store.getState();\r\n const wasCut = table.getTableAction() === 'cut';\r\n const correlationId =\r\n command.correlationId ??\r\n `paste-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\r\n\r\n const sources = table\r\n .getRows()\r\n .filter((r) => r.rowState.value !== RowStateEnum.Deleted)\r\n .filter((row) => selectedRows[row.id.value] === true)\r\n .sort((a, b) => {\r\n const aIndex = Number(a.getCells().get('index')?.getValue() ?? 0);\r\n const bIndex = Number(b.getCells().get('index')?.getValue() ?? 0);\r\n return bIndex - aIndex;\r\n });\r\n\r\n if (sources.length === 0) {\r\n table.setTableAction(null);\r\n store.setState((prev) => ({ ...prev, table }));\r\n return;\r\n }\r\n\r\n const placeAtRowId =\r\n command.action === 'pasteInsert' ? activeRowId : undefined;\r\n\r\n for (const row of sources) {\r\n await this.executeAppCommand({\r\n type: 'PASTE_ROW',\r\n store: command.store,\r\n tableKey: command.tableKey,\r\n sourceRowId: row.id.value,\r\n placeAtRowId,\r\n correlationId,\r\n });\r\n }\r\n\r\n if (wasCut) {\r\n for (const row of sources) {\r\n await this.executeAppCommand({\r\n type: 'ROW_DELETED',\r\n store: command.store,\r\n tableKey: command.tableKey,\r\n rowId: row.id.value,\r\n correlationId,\r\n });\r\n }\r\n const afterCut = this.getStore(command.tableKey);\r\n afterCut?.setState((prev) => ({ ...prev, selectedRows: {} }));\r\n }\r\n\r\n try {\r\n const updated = await this.repo.getById(command.store, command.tableKey);\r\n updated.setTableAction(null);\r\n await this.repo.save(command.store, updated);\r\n const live = this.getStore(command.tableKey);\r\n if (live) {\r\n const prev = live.getState();\r\n live.setState(() => ({ ...prev, table: updated }));\r\n }\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.executePasteAction.clearAction');\r\n }\r\n }\r\n\r\n // ─── public dispatch ────────────────────────────────────────────────────────\r\n\r\n async dispatch(command: TableCommand): Promise<void> {\r\n // Ignore commands after dispose (no store), except (re)register\r\n if (\r\n !this.tableStore &&\r\n command.type !== 'TABLE_REGISTERED' &&\r\n command.type !== 'TABLE_DISPOSED'\r\n ) {\r\n return;\r\n }\r\n\r\n switch (command.type) {\r\n // ── Navigation ──────────────────────────────────────────────────────────\r\n case 'ACTIVE_CELL':\r\n await this.transitionActiveCell(command.rowId, command.columnId);\r\n return;\r\n case 'ACTIVE_ROW':\r\n await this.nav.setActiveRow(command);\r\n return;\r\n case 'MOVE_ACTIVE_CELL':\r\n await this.commitCellEdit();\r\n await this.nav.moveActiveCell(command);\r\n this.maybeStartEditForActiveCell();\r\n return;\r\n case 'MOVE_ACTIVE_CELL_VERTICAL':\r\n await this.commitCellEdit();\r\n await this.nav.moveActiveCellVertical(command);\r\n this.maybeStartEditForActiveCell();\r\n return;\r\n case 'ACTIVATE_FIRST_CELL':\r\n await this.commitCellEdit();\r\n this.nav.activateFirstCell(command);\r\n this.maybeStartEditForActiveCell();\r\n return;\r\n\r\n // ── Table lifecycle ──────────────────────────────────────────────────────\r\n case 'TABLE_REGISTERED':\r\n await this.registerTable(command);\r\n return;\r\n case 'TABLE_DELETED':\r\n await this.deleteTable(command);\r\n return;\r\n case 'TABLE_DISPOSED':\r\n this.disposeTable(command);\r\n return;\r\n case 'TABLE_RESET':\r\n await this.resetTable(command);\r\n return;\r\n\r\n // ── Row expand / collapse ────────────────────────────────────────────────\r\n case 'ROW_EXPANDED':\r\n this.rowMgr.setRowExpanded(command);\r\n return;\r\n case 'ROW_EXPAND_TOGGLED':\r\n this.rowMgr.toggleRowExpanded(command);\r\n return;\r\n case 'COLLAPSE_ALL_ROWS':\r\n this.rowMgr.collapseAll(command.tableKey);\r\n return;\r\n\r\n // ── Row movement ─────────────────────────────────────────────────────────\r\n case 'MOVE_VERTICAL_SELECTED_ROWS':\r\n this.viewBuilder.invalidateUiRowIndex();\r\n this.rowMgr.moveVerticalSelectedRows(command);\r\n return;\r\n case 'MOVE_VERTICAL_ACTIVE_ROW':\r\n this.viewBuilder.invalidateUiRowIndex();\r\n this.rowMgr.moveVerticalActiveRow(command);\r\n return;\r\n\r\n // ── Row selection ────────────────────────────────────────────────────────\r\n case 'ROWS_DELETED': {\r\n if (!isWindowedRepository(this.repo)) {\r\n this.selection.deleteAll(command.tableKey);\r\n return;\r\n }\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n const selected = store.getState().selectedRows;\r\n const rowIds = Object.keys(selected)\r\n .map(Number)\r\n .filter(id => Number.isFinite(id));\r\n await this.executeAppCommand({ ...command, rowIds });\r\n store.setState(prev => ({\r\n ...prev,\r\n selectedRows: {},\r\n rangeAnchorRowId: undefined,\r\n }));\r\n return;\r\n }\r\n case 'TOGGLE_SELECT_ALL_ROWS': {\r\n try {\r\n let rowIds: number[];\r\n if (isWindowedRepository(this.repo)) {\r\n // Page-window: ids come from IndexedDB (SoT), not the RAM window\r\n rowIds = await this.repo.getAllRowIds(\r\n command.store,\r\n command.tableKey,\r\n 'active',\r\n );\r\n } else {\r\n const st = this.getStore(command.tableKey);\r\n if (!st) return;\r\n rowIds = st.getState().table.getRows('active').map(r => r.id.value);\r\n }\r\n this.selection.toggleSelectAllRows({\r\n tableKey: command.tableKey,\r\n rowIds,\r\n });\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.TOGGLE_SELECT_ALL_ROWS');\r\n }\r\n return;\r\n }\r\n case 'TOGGLE_SELECT_PAGE_ROWS':\r\n this.selection.toggleSelectPageRows(command);\r\n return;\r\n case 'CLEAR_ROW_SELECTION':\r\n this.selection.clearRowSelection(command);\r\n return;\r\n case 'ROW_SELECTION_TOGGLED':\r\n this.selection.toggleRowSelection(command);\r\n return;\r\n case 'ROW_RANGE_SELECTED':\r\n this.selection.selectRange(command);\r\n return;\r\n case 'ROW_SELECTED':\r\n this.selection.setSelectRow(command);\r\n return;\r\n case 'SELECT_FROM_ACTIVE_TO_LAST':\r\n this.selection.selectFromActiveToLast(command);\r\n return;\r\n\r\n // ── Table action (copy/cut/paste) ────────────────────────────────────────\r\n case 'SET_TABLE_ACTION': {\r\n const pasteAction = command.action;\r\n if (pasteAction === 'paste' || pasteAction === 'pasteInsert') {\r\n await this.executePasteAction({\r\n store: command.store,\r\n tableKey: command.tableKey,\r\n action: pasteAction,\r\n correlationId: command.correlationId,\r\n });\r\n return;\r\n }\r\n const activeRowId = this.getStore(command.tableKey)?.getState().activeRowId;\r\n this.rowMgr.setTableAction(command, activeRowId);\r\n return;\r\n }\r\n\r\n // ── UI overlay state ─────────────────────────────────────────────────────\r\n case 'SET_GRID_SEARCH':\r\n this.setGridSearch(command);\r\n return;\r\n case 'SET_MOBILE_EDITOR':\r\n this.setMobileEditor(command);\r\n return;\r\n case 'RESIZE_COLUMN':\r\n this.resizeColumn(command);\r\n return;\r\n case 'SET_COLUMN_VISIBLE':\r\n this.setColumnVisible(command);\r\n return;\r\n case 'TOGGLE_COLUMN_GROUP':\r\n this.toggleColumnGroup(command);\r\n return;\r\n case 'SET_COLUMN_PIN':\r\n this.setColumnPinned(command);\r\n return;\r\n case 'SET_SORT_MODEL':\r\n this.setSortModel(command);\r\n return;\r\n case 'SET_QUICK_FILTER_TEXT':\r\n this.setQuickFilterText(command);\r\n return;\r\n case 'SET_FILTER_MODEL':\r\n this.setFilterModel(command);\r\n return;\r\n case 'SET_ROW_GROUP_COLUMNS':\r\n this.setRowGroupColumns(command);\r\n return;\r\n case 'SET_GROUP_DEFAULT_EXPANDED':\r\n this.setGroupDefaultExpanded(command);\r\n return;\r\n case 'TOGGLE_ROW_GROUP':\r\n this.toggleRowGroup(command);\r\n return;\r\n\r\n // ── Delegate to AppService ───────────────────────────────────────────────\r\n default:\r\n if (!isApplicationTableCommand(command)) {\r\n this.errHandler.handle(\r\n new Error(\r\n `Unhandled engine command: ${(command as { type: string }).type}`,\r\n ),\r\n 'TableEngine.dispatch'\r\n );\r\n return;\r\n }\r\n await this.executeAppCommand(command);\r\n }\r\n }\r\n\r\n private setGridSearch(command: {\r\n tableKey: string;\r\n search: TableState['gridSearch'];\r\n }): void {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n store.setState(prev => ({\r\n ...prev,\r\n gridSearch: command.search,\r\n }));\r\n }\r\n\r\n private setMobileEditor(command: {\r\n tableKey: string;\r\n editor: TableState['mobileEditor'];\r\n }): void {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n store.setState(prev => ({\r\n ...prev,\r\n mobileEditor: command.editor,\r\n }));\r\n }\r\n\r\n private resizeColumn(command: {\r\n tableKey: string;\r\n columnId: string;\r\n width: number;\r\n }): void {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n const col = store\r\n .getState()\r\n .table.getActiveCollectionColumns()\r\n .find((c) => c.fieldName === command.columnId);\r\n const next = clampColumnWidth(command.width, col ?? { fieldName: command.columnId });\r\n store.setState(prev => ({\r\n ...prev,\r\n columnWidths: {\r\n ...(prev.columnWidths ?? {}),\r\n [command.columnId]: next,\r\n },\r\n }));\r\n }\r\n\r\n private setColumnPinned(command: {\r\n tableKey: string;\r\n columnId: string;\r\n pinned: 'start' | 'end' | null;\r\n }): void {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n const { table } = store.getState();\r\n const schema = table\r\n .getActiveCollectionColumns()\r\n .find((c) => c.fieldName === command.columnId);\r\n const check = canSetColumnPinned(schema, command.pinned);\r\n if (!check.ok) return;\r\n const changed = table.setColumnPinned(command.columnId, check.pinned);\r\n if (!changed) return;\r\n store.setState((prev) => ({ ...prev, table }));\r\n }\r\n\r\n private toggleColumnGroup(command: {\r\n tableKey: string;\r\n groupId: string;\r\n }): void {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n store.setState((prev) => {\r\n const collapsed = { ...(prev.collapsedColumnGroups ?? {}) };\r\n if (collapsed[command.groupId]) delete collapsed[command.groupId];\r\n else collapsed[command.groupId] = true;\r\n return { ...prev, collapsedColumnGroups: collapsed };\r\n });\r\n }\r\n\r\n private setColumnVisible(command: {\r\n tableKey: string;\r\n columnId: string;\r\n visible: boolean;\r\n }): void {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n const { table } = store.getState();\r\n const schema = table\r\n .getActiveCollectionColumns()\r\n .find((c) => c.fieldName === command.columnId);\r\n const check = canSetColumnVisible(schema, command.visible);\r\n if (!check.ok) return;\r\n const changed = table.setColumnHidden(command.columnId, check.hidden);\r\n if (!changed) return;\r\n store.setState((prev) => ({ ...prev, table }));\r\n }\r\n\r\n private setSortModel(command: {\r\n tableKey: string;\r\n sortModel: readonly { colId: string; sort: 'asc' | 'desc' }[];\r\n }): void {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n const next = command.sortModel\r\n .filter(\r\n (item) =>\r\n item &&\r\n typeof item.colId === 'string' &&\r\n item.colId.length > 0 &&\r\n (item.sort === 'asc' || item.sort === 'desc'),\r\n )\r\n .map((item) => ({ colId: item.colId, sort: item.sort }));\r\n store.setState((prev) => ({\r\n ...prev,\r\n sortModel: next,\r\n }));\r\n this.viewBuilder.invalidateUiRowIndex();\r\n this.notifyViewQueryChanged();\r\n }\r\n\r\n private setQuickFilterText(command: {\r\n tableKey: string;\r\n quickFilterText: string;\r\n }): void {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n const next =\r\n typeof command.quickFilterText === 'string'\r\n ? command.quickFilterText\r\n : '';\r\n store.setState((prev) => ({\r\n ...prev,\r\n quickFilterText: next,\r\n }));\r\n // Blobs stay cached — only re-apply the query (PR-93).\r\n this.viewBuilder.invalidateUiRowIndex();\r\n }\r\n\r\n private setFilterModel(command: {\r\n tableKey: string;\r\n filterModel: FilterModel;\r\n }): void {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n const next =\r\n command.filterModel && typeof command.filterModel === 'object'\r\n ? { ...command.filterModel }\r\n : {};\r\n store.setState((prev) => ({\r\n ...prev,\r\n filterModel: next,\r\n }));\r\n this.viewBuilder.invalidateUiRowIndex();\r\n this.notifyViewQueryChanged();\r\n }\r\n\r\n private setRowGroupColumns(command: {\r\n tableKey: string;\r\n columns: readonly string[];\r\n }): void {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n const next = command.columns\r\n .filter((c) => typeof c === 'string' && c.trim() !== '')\r\n .map((c) => c.trim());\r\n store.setState((prev) => ({\r\n ...prev,\r\n rowGroupColumns: next,\r\n rowGroupExpanded: {},\r\n }));\r\n this.viewBuilder.invalidateUiRowIndex();\r\n }\r\n\r\n private setGroupDefaultExpanded(command: {\r\n tableKey: string;\r\n expanded: boolean;\r\n }): void {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n store.setState((prev) => ({\r\n ...prev,\r\n groupDefaultExpanded: Boolean(command.expanded),\r\n rowGroupExpanded: {},\r\n }));\r\n this.viewBuilder.invalidateUiRowIndex();\r\n }\r\n\r\n private toggleRowGroup(command: {\r\n tableKey: string;\r\n groupKey: string;\r\n }): void {\r\n const store = this.getStore(command.tableKey);\r\n if (!store) return;\r\n const state = store.getState();\r\n const key = command.groupKey;\r\n const current = Object.prototype.hasOwnProperty.call(\r\n state.rowGroupExpanded,\r\n key,\r\n )\r\n ? state.rowGroupExpanded[key]!\r\n : state.groupDefaultExpanded;\r\n store.setState((prev) => ({\r\n ...prev,\r\n rowGroupExpanded: {\r\n ...prev.rowGroupExpanded,\r\n [key]: !current,\r\n },\r\n }));\r\n this.viewBuilder.invalidateUiRowIndex();\r\n }\r\n\r\n /**\r\n * Server/infinite row model hooks (PR-96).\r\n * Listener runs after sort / filter / page changes.\r\n */\r\n bindViewQueryListener(listener: (() => void) | undefined): void {\r\n this.viewQueryListener = listener;\r\n }\r\n\r\n setRowModelType(rowModelType: RowModelType): void {\r\n const store = this.getStore();\r\n if (!store) return;\r\n store.setState((prev) => ({\r\n ...prev,\r\n rowModelType,\r\n }));\r\n this.viewBuilder.invalidateUiRowIndex();\r\n }\r\n\r\n setServerRowCount(count: number | null): void {\r\n const store = this.getStore();\r\n if (!store) return;\r\n store.setState((prev) => ({\r\n ...prev,\r\n serverRowCount: count,\r\n }));\r\n }\r\n\r\n private notifyViewQueryChanged(): void {\r\n this.viewQueryListener?.();\r\n }\r\n\r\n // ─── public read API ────────────────────────────────────────────────────────\r\n\r\n getViewState(): TableViewState | undefined {\r\n return this.viewBuilder.getViewState();\r\n }\r\n\r\n /**\r\n * Diff `rowData` onto the live table without resetting it (PR-82).\r\n * Unchanged domain rows keep identity so UI `React.memo` can skip them.\r\n */\r\n applyHostRowData<TRow>(\r\n rowData: readonly TRow[],\r\n columnDefs?: ColumnDef<TRow>[],\r\n getRowId?: GetRowId<TRow>,\r\n ): void {\r\n const store = this.getStore();\r\n if (!store) return;\r\n const { table } = store.getState();\r\n const defs = ensureIndexColumnDef(\r\n columnDefs && columnDefs.length > 0\r\n ? columnDefs\r\n : mapColumnSchemasToDefs<TRow>(table.getColumns()),\r\n );\r\n const result = applyHostRowDataToTable(\r\n table,\r\n rowData,\r\n defs,\r\n getRowId ?? defaultGetRowId,\r\n );\r\n if (result.removedIds.length) {\r\n this.viewBuilder.forgetUiRows(result.removedIds);\r\n }\r\n if (result.added === 0 && result.updated === 0 && result.removed === 0) {\r\n return;\r\n }\r\n if (result.structureChanged) {\r\n this.viewBuilder.invalidateUiRowIndex();\r\n }\r\n store.setState((prev) => ({ ...prev, table }));\r\n }\r\n\r\n getAllRows(): Row[] | null {\r\n return this.viewBuilder.getAllRows();\r\n }\r\n\r\n getAllUIRows(): UIRow[] | null {\r\n return this.viewBuilder.getAllUIRows();\r\n }\r\n\r\n /** Flat group/leaf nodes (PR-120). */\r\n getFlatUiNodes() {\r\n return this.viewBuilder.getFlatUiNodes();\r\n }\r\n\r\n getGroupNode(rowId: number) {\r\n return this.viewBuilder.getGroupNode(rowId);\r\n }\r\n\r\n /** Expand/collapse group for the active synthetic row (PR-121). */\r\n toggleRowGroupById(rowId: number): boolean {\r\n const node = this.viewBuilder.getGroupNode(rowId);\r\n if (!node || !this.tableKey) return false;\r\n this.toggleRowGroup({ tableKey: this.tableKey, groupKey: node.key });\r\n return true;\r\n }\r\n\r\n getUiRowIndex(): SparseRowIndex<number> {\r\n return this.viewBuilder.getUiRowIndex();\r\n }\r\n\r\n /** Absolute 0-based position in the filter/sort UI order (PR-99). */\r\n getUiRowAbsoluteIndex(rowId: number): number {\r\n return this.viewBuilder.getUiRowIndex().indexOf(rowId);\r\n }\r\n\r\n getCellRanges(): readonly CellRange[] {\r\n if (!this.tableKey) return [];\r\n return this.cellRange.getSelection(this.tableKey).ranges;\r\n }\r\n\r\n addCellRange(range: CellRange): void {\r\n if (!this.tableKey) return;\r\n this.cellRange.addRange(this.tableKey, range);\r\n }\r\n\r\n handleCellRangePointer(\r\n rowId: number,\r\n colId: string,\r\n modifiers: { shiftKey: boolean; ctrlKey: boolean },\r\n ): void {\r\n if (!this.tableKey) return;\r\n const rowIndex = this.getUiRowAbsoluteIndex(rowId);\r\n if (rowIndex < 0) return;\r\n this.cellRange.handlePointer({\r\n tableKey: this.tableKey,\r\n rowIndex,\r\n colId,\r\n shiftKey: modifiers.shiftKey,\r\n ctrlKey: modifiers.ctrlKey,\r\n });\r\n }\r\n\r\n extendCellRangeArrow(direction: ArrowDirection): void {\r\n if (!this.tableKey) return;\r\n const selection = this.cellRange.extendWithArrow(this.tableKey, direction);\r\n this.syncActiveCellToRangeFocus(selection);\r\n }\r\n\r\n extendCellRangeToEdge(direction: ArrowDirection): void {\r\n if (!this.tableKey) return;\r\n const bounds = this.getCellRangeBounds();\r\n const prev = this.cellRange.getSelection(this.tableKey);\r\n const next = extendCellRangeToEdge(prev, direction, bounds);\r\n this.cellRange.setSelection(this.tableKey, next);\r\n this.syncActiveCellToRangeFocus(next);\r\n }\r\n\r\n jumpActiveCellRowEdge(edge: 'start' | 'end'): void {\r\n if (!this.tableKey) return;\r\n const store = this.tableStore;\r\n if (!store) return;\r\n const { activeCell } = store.getState();\r\n if (!activeCell) return;\r\n void this.commitCellEdit().then(() => {\r\n if (!this.tableKey) return;\r\n this.nav.jumpActiveCellRowEdge({\r\n tableKey: this.tableKey,\r\n rowId: activeCell.rowId,\r\n columnId: activeCell.columnId,\r\n edge,\r\n });\r\n this.syncCellRangeToActiveCell();\r\n this.maybeStartEditForActiveCell();\r\n });\r\n }\r\n\r\n jumpActiveCellGridCorner(corner: 'first' | 'last'): void {\r\n if (!this.tableKey) return;\r\n void this.commitCellEdit().then(() => {\r\n if (!this.tableKey) return;\r\n this.nav.jumpActiveCellGridCorner({\r\n tableKey: this.tableKey,\r\n corner,\r\n });\r\n this.syncCellRangeToActiveCell();\r\n this.maybeStartEditForActiveCell();\r\n });\r\n }\r\n\r\n private syncActiveCellToRangeFocus(selection: CellRangeSelection): void {\r\n if (!this.tableKey) return;\r\n const focus = selection.focus;\r\n if (!focus) return;\r\n const rowId = this.getUiRowIndex().getOrderedIds()[focus.rowIndex];\r\n if (rowId === undefined) return;\r\n this.nav.setActiveCell({\r\n tableKey: this.tableKey,\r\n rowId,\r\n columnId: focus.colId,\r\n });\r\n }\r\n\r\n selectAllCells(): void {\r\n if (!this.tableKey) return;\r\n const selection = this.cellRange.selectAll(this.tableKey);\r\n const focus = selection.focus;\r\n if (!focus) return;\r\n const rowId = this.getUiRowIndex().getOrderedIds()[focus.rowIndex];\r\n if (rowId === undefined) return;\r\n this.nav.setActiveCell({\r\n tableKey: this.tableKey,\r\n rowId,\r\n columnId: focus.colId,\r\n });\r\n }\r\n\r\n syncCellRangeToActiveCell(): void {\r\n if (!this.tableKey) return;\r\n const store = this.tableStore;\r\n if (!store) return;\r\n const { activeCell } = store.getState();\r\n if (!activeCell) return;\r\n this.handleCellRangePointer(activeCell.rowId, activeCell.columnId, {\r\n shiftKey: false,\r\n ctrlKey: false,\r\n });\r\n }\r\n\r\n private getCellRangeBounds() {\r\n const store = this.tableStore;\r\n if (!store) {\r\n return { rowCount: 0, columnOrder: [] as readonly string[] };\r\n }\r\n const { table } = store.getState();\r\n const columnOrder = table\r\n .getColumns()\r\n .filter((c) => !c.hidden)\r\n .map((c) => c.fieldName);\r\n return {\r\n rowCount: this.getUiRowCount(),\r\n columnOrder,\r\n };\r\n }\r\n\r\n findColumnSearchMatches(\r\n columnId: string,\r\n query: string,\r\n ): Array<{ rowId: number; columnId: string }> {\r\n return this.viewBuilder.findColumnSearchMatches(columnId, query);\r\n }\r\n\r\n getColumnTotals(): Record<string, number> {\r\n return this.viewBuilder.getColumnTotals();\r\n }\r\n\r\n getColumnAggs(): Record<string, unknown> {\r\n return this.viewBuilder.getColumnAggs();\r\n }\r\n\r\n getColumnAggValue(\r\n columnId: string,\r\n overrideAgg?: import('../domain/types/ColumnDef').AggFunc,\r\n ): unknown {\r\n return this.viewBuilder.getColumnAggValue(columnId, overrideAgg);\r\n }\r\n\r\n subscribeColumnTotals(\r\n cb: (totals: Record<string, number>) => void,\r\n ): (() => void) | null {\r\n const store = this.getStore();\r\n if (!store) return null;\r\n let prev = this.viewBuilder.getColumnTotals();\r\n cb(prev);\r\n return store.subscribe(() => {\r\n const next = this.viewBuilder.getColumnTotals();\r\n const keys = Object.keys(next);\r\n const changed =\r\n keys.length !== Object.keys(prev).length ||\r\n keys.some((k) => next[k] !== prev[k]);\r\n if (changed) {\r\n prev = next;\r\n cb(next);\r\n }\r\n });\r\n }\r\n\r\n subscribeColumnAggs(\r\n cb: (aggs: Record<string, unknown>) => void,\r\n ): (() => void) | null {\r\n const store = this.getStore();\r\n if (!store) return null;\r\n let prev = this.viewBuilder.getColumnAggs();\r\n cb(prev);\r\n return store.subscribe(() => {\r\n const next = this.viewBuilder.getColumnAggs();\r\n const keys = new Set([...Object.keys(next), ...Object.keys(prev)]);\r\n let changed = false;\r\n for (const k of keys) {\r\n if (next[k] !== prev[k]) {\r\n changed = true;\r\n break;\r\n }\r\n }\r\n if (changed) {\r\n prev = next;\r\n cb(next);\r\n }\r\n });\r\n }\r\n\r\n getUiRowCount(): number {\r\n return this.viewBuilder.getUiRowCount();\r\n }\r\n\r\n projectVisibleUiRows(range: { startIndex: number; endIndex: number }): UIRow[] {\r\n return this.viewBuilder.projectVisibleUiRows(range);\r\n }\r\n\r\n getMobileViewState(): MobileTableViewState | undefined {\r\n return this.viewBuilder.getMobileViewState();\r\n }\r\n\r\n getRowView(rowId: number): UIRow | null {\r\n return this.viewBuilder.getRowView(rowId);\r\n }\r\n\r\n getSnapShot(collectionScope: CollectionScope): TableSnapShot | null {\r\n return this.viewBuilder.getSnapShot(collectionScope);\r\n }\r\n\r\n /**\r\n * Full dataset snapshot from IndexedDB (source of truth).\r\n * Use for server save / export — not the RAM page window.\r\n */\r\n async getFullSnapShot(\r\n store: string,\r\n collectionScope: CollectionScope = 'active',\r\n ): Promise<TableSnapShot | null> {\r\n if (!this.tableKey) return null;\r\n try {\r\n const rows = await this.loadAllRows(store, collectionScope);\r\n const { rowsToSnapshot } = await import(\r\n '../infrastructure/Repositories/paged/memoryRecords'\r\n );\r\n return rowsToSnapshot(rows);\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.getFullSnapShot');\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Stream serialized row records from IndexedDB in bounded batches.\r\n * Heap holds one batch at a time — never the whole dataset.\r\n * Return false from onBatch to stop early.\r\n */\r\n async iterateRowsFromDb(\r\n store: string,\r\n collectionScope: CollectionScope,\r\n onBatch: (\r\n records: PersistedRowRecord[],\r\n ordinalBase: number,\r\n ) => Promise<boolean | void>,\r\n batchSize?: number,\r\n ): Promise<void> {\r\n if (!this.tableKey) return;\r\n try {\r\n if (isWindowedRepository(this.repo)) {\r\n await this.repo.iterateRowRecords(\r\n store,\r\n this.tableKey,\r\n collectionScope,\r\n onBatch,\r\n batchSize,\r\n );\r\n return;\r\n }\r\n // Default (event-sourced) mode: every row already lives in RAM, so the\r\n // same batched contract is served from the in-memory table (lazy module).\r\n const { iterateMemoryRows } = await import(\r\n '../infrastructure/Repositories/paged/memoryRecords'\r\n );\r\n await iterateMemoryRows(\r\n this.viewBuilder.getAllRows(collectionScope) ?? [],\r\n onBatch,\r\n batchSize,\r\n );\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.iterateRowsFromDb');\r\n }\r\n }\r\n\r\n /** True in persistence 'paged-idb' mode (RAM holds one page window). */\r\n isPagedWindow(): boolean {\r\n return isWindowedRepository(this.repo);\r\n }\r\n\r\n /** Windowed: IndexedDB (SoT). Default mode: the in-memory table. */\r\n private async loadAllRows(\r\n store: string,\r\n collectionScope: CollectionScope,\r\n ): Promise<Row[]> {\r\n if (isWindowedRepository(this.repo) && this.tableKey) {\r\n return this.repo.getAllRows(store, this.tableKey, collectionScope);\r\n }\r\n return this.viewBuilder.getAllRows(collectionScope) ?? [];\r\n }\r\n\r\n getExpandedRowData(rowId: number): Record<string, unknown> | null {\r\n return this.viewBuilder.getExpandedRowData(rowId);\r\n }\r\n\r\n getActiveCell(): TableState['activeCell'] | null {\r\n return this.viewBuilder.getActiveCell();\r\n }\r\n\r\n /** Force a view-store tick so bound React rows re-read cells (PR-86). */\r\n refreshView(): void {\r\n const store = this.tableStore;\r\n if (!store) return;\r\n this.viewBuilder.invalidateUiRowIndex();\r\n store.setState((prev) => ({ ...prev }));\r\n }\r\n\r\n setCellEditOptions(partial: Partial<CellEditOptions>): void {\r\n this.cellEditOptions = {\r\n ...this.cellEditOptions,\r\n ...partial,\r\n };\r\n }\r\n\r\n getCellEditOptions(): CellEditOptions {\r\n return this.cellEditOptions;\r\n }\r\n\r\n getCellEdit(): CellEditSession | null {\r\n return this.tableStore?.getState().cellEdit ?? null;\r\n }\r\n\r\n getEditDraft(rowId: number, columnId: string): CellEditValue | null {\r\n return readDraft(this.getCellEdit(), rowId, columnId);\r\n }\r\n\r\n isEditingCell(rowId: number, columnId: string): boolean {\r\n return isEditingCell(this.getCellEdit(), rowId, columnId);\r\n }\r\n\r\n /**\r\n * Begin a session-only draft for the cell (or full row). Does not touch EventStore.\r\n */\r\n startCellEdit(rowId: number, columnId: string): void {\r\n const store = this.tableStore;\r\n if (!store || !this.tableKey) return;\r\n const { table, cellEdit } = store.getState();\r\n if (\r\n cellEdit &&\r\n cellEdit.rowId === rowId &&\r\n (cellEdit.editType === 'fullRow' || cellEdit.columnId === columnId)\r\n ) {\r\n if (cellEdit.columnId !== columnId) {\r\n store.setState((prev) => ({\r\n ...prev,\r\n cellEdit: prev.cellEdit\r\n ? { ...prev.cellEdit, columnId }\r\n : null,\r\n }));\r\n }\r\n return;\r\n }\r\n const row = table.getRow(rowId);\r\n if (!row) return;\r\n const schema = table.getColumns().find((c) => c.fieldName === columnId);\r\n if (schema && schema.editable === false) return;\r\n\r\n const editType = this.cellEditOptions.editType;\r\n const baseline: Record<string, CellEditValue> = {};\r\n if (editType === 'fullRow') {\r\n for (const col of table.getColumns()) {\r\n if (col.fieldName === 'index') continue;\r\n if (col.editable === false) continue;\r\n const cell = row.getCell(col.fieldName);\r\n baseline[col.fieldName] = {\r\n value: cell?.getValue() ?? null,\r\n display: cell?.getDisplay() ?? null,\r\n };\r\n }\r\n } else {\r\n const cell = row.getCell(columnId);\r\n baseline[columnId] = {\r\n value: cell?.getValue() ?? null,\r\n display: cell?.getDisplay() ?? null,\r\n };\r\n }\r\n if (!baseline[columnId] && editType === 'cell') {\r\n baseline[columnId] = { value: null, display: null };\r\n }\r\n\r\n store.setState((prev) => ({\r\n ...prev,\r\n activeRowId: rowId,\r\n activeCell: { rowId, columnId },\r\n cellEdit: createCellEditSession({\r\n rowId,\r\n columnId,\r\n editType,\r\n baseline,\r\n }),\r\n }));\r\n }\r\n\r\n patchCellEdit(\r\n rowId: number,\r\n columnId: string,\r\n patch: Partial<CellEditValue>,\r\n ): void {\r\n const store = this.tableStore;\r\n if (!store) return;\r\n const session = store.getState().cellEdit;\r\n if (!session || session.rowId !== rowId) return;\r\n if (session.editType === 'cell' && !(columnId in session.baseline)) {\r\n // Allow late column focus within fullRow only; cell mode sticks to session cols.\r\n }\r\n if (session.editType === 'cell' && columnId !== session.columnId) {\r\n // Still allow patch if baseline has the column (shouldn't happen).\r\n if (!(columnId in session.drafts) && !(columnId in session.baseline)) {\r\n return;\r\n }\r\n }\r\n store.setState((prev) => {\r\n if (!prev.cellEdit || prev.cellEdit.rowId !== rowId) return prev;\r\n return {\r\n ...prev,\r\n cellEdit: patchDraft(prev.cellEdit, columnId, patch),\r\n };\r\n });\r\n }\r\n\r\n /** Discard drafts; restore UI to domain values. No EventStore write. */\r\n cancelCellEdit(): void {\r\n const store = this.tableStore;\r\n if (!store) return;\r\n if (!store.getState().cellEdit) return;\r\n store.setState((prev) => ({ ...prev, cellEdit: null }));\r\n }\r\n\r\n /**\r\n * Write dirty drafts via CHANGE_CELL_* then clear the session.\r\n * @returns number of value-change commands dispatched\r\n */\r\n async commitCellEdit(): Promise<number> {\r\n const store = this.tableStore;\r\n const commandStore = this.commandStore;\r\n const tableKey = this.tableKey;\r\n if (!store || !commandStore || !tableKey) return 0;\r\n const session = store.getState().cellEdit;\r\n if (!session) return 0;\r\n const dirty = dirtyDraftColumns(session);\r\n store.setState((prev) => ({ ...prev, cellEdit: null }));\r\n let writes = 0;\r\n for (const colId of dirty) {\r\n const draft = session.drafts[colId]!;\r\n const base = session.baseline[colId];\r\n if (!base || draft.value !== base.value) {\r\n await this.dispatch({\r\n type: 'CHANGE_CELL_VALUE',\r\n store: commandStore,\r\n tableKey,\r\n rowId: session.rowId,\r\n columnId: colId,\r\n newValue: draft.value,\r\n });\r\n writes += 1;\r\n }\r\n if (!base || draft.display !== base.display) {\r\n await this.dispatch({\r\n type: 'CHANGE_CELL_DISPLAY_VALUE',\r\n store: commandStore,\r\n tableKey,\r\n rowId: session.rowId,\r\n columnId: colId,\r\n newValue:\r\n draft.display == null ? '' : String(draft.display),\r\n });\r\n }\r\n }\r\n return writes;\r\n }\r\n\r\n private async transitionActiveCell(\r\n rowId: number,\r\n columnId: string,\r\n ): Promise<void> {\r\n const store = this.tableStore;\r\n if (!store || !this.tableKey) return;\r\n const session = store.getState().cellEdit;\r\n if (leavesEditSession(session, rowId, columnId)) {\r\n await this.commitCellEdit();\r\n } else if (session && session.editType === 'fullRow' && session.rowId === rowId) {\r\n store.setState((prev) => ({\r\n ...prev,\r\n cellEdit: prev.cellEdit\r\n ? { ...prev.cellEdit, columnId }\r\n : null,\r\n }));\r\n }\r\n this.nav.setActiveCell({\r\n tableKey: this.tableKey,\r\n rowId,\r\n columnId,\r\n });\r\n if (this.cellEditOptions.singleClickEdit) {\r\n this.startCellEdit(rowId, columnId);\r\n }\r\n }\r\n\r\n private maybeStartEditForActiveCell(): void {\r\n if (!this.cellEditOptions.singleClickEdit) return;\r\n const active = this.getActiveCell();\r\n if (!active) return;\r\n this.startCellEdit(active.rowId, active.columnId);\r\n }\r\n\r\n /** Leave cell-edit / focus. Commits when stopEditingWhenCellsLoseFocus. */\r\n async clearActiveCell(options?: { cancel?: boolean }): Promise<void> {\r\n const store = this.tableStore;\r\n if (!store) return;\r\n const cancel = options?.cancel === true;\r\n if (cancel) {\r\n this.cancelCellEdit();\r\n } else if (store.getState().cellEdit) {\r\n if (this.cellEditOptions.stopEditingWhenCellsLoseFocus) {\r\n await this.commitCellEdit();\r\n } else {\r\n this.cancelCellEdit();\r\n }\r\n }\r\n store.setState((prev) => {\r\n if (\r\n prev.activeCell == null &&\r\n prev.activeRowId === undefined &&\r\n prev.cellEdit == null\r\n ) {\r\n return prev;\r\n }\r\n return {\r\n ...prev,\r\n activeCell: undefined,\r\n activeRowId: undefined,\r\n cellEdit: null,\r\n };\r\n });\r\n }\r\n\r\n getActiveRow(): number | null {\r\n return this.viewBuilder.getActiveRow();\r\n }\r\n\r\n getSelectedRows(): Record<number, boolean> | undefined {\r\n return this.viewBuilder.getSelectedRows();\r\n }\r\n\r\n getCell(rowId: number, columnId: string): Cell | undefined {\r\n return this.viewBuilder.getCell(rowId, columnId);\r\n }\r\n getMobileEditor(): TableState['mobileEditor'] | undefined {\r\n const store = this.getStore();\r\n if (!store) return undefined;\r\n return store.getState().mobileEditor;\r\n }\r\n\r\n isActiveCell(rowId: number, columnId: string): boolean {\r\n return this.viewBuilder.isActiveCell(rowId, columnId);\r\n }\r\n\r\n isSelectedRow(rowId: number): boolean {\r\n return this.viewBuilder.isSelectedRow(rowId);\r\n }\r\n\r\n isCutRow(rowId: number): boolean {\r\n return this.viewBuilder.isCutRow(rowId);\r\n }\r\n\r\n isActiveRow(rowId: number): boolean {\r\n return this.viewBuilder.isActiveRow(rowId);\r\n }\r\n\r\n private validateCell(value: unknown, schema: ColumnSchema, caption: string, rowId: number): CellError | undefined {\r\n const rules = schema?.rules ?? [];\r\n if (!rules.length) return undefined;\r\n for (const rule of rules) {\r\n const v = rule.transform ? rule.transform(value) : value;\r\n const isEmpty =\r\n v === null ||\r\n v === undefined ||\r\n (typeof v === \"string\" && v.trim() === \"\") ||\r\n (Array.isArray(v) && v.length === 0);\r\n\r\n // Required\r\n if (rule.required && (!rule.requiredIf || rule.requiredIf())) {\r\n if (isEmpty) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} الزامی است` };\r\n }\r\n\r\n // Optional empty values should not fail type/min/max checks\r\n if (isEmpty) continue;\r\n\r\n // Pattern\r\n if (rule.pattern) {\r\n const reg = typeof rule.pattern === \"string\" ? new RegExp(rule.pattern) : rule.pattern;\r\n if (!reg.test(String(v))) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} فرمت نامعتبر دارد` };\r\n }\r\n\r\n // Type-based\r\n switch (rule.type) {\r\n case \"number\":\r\n case \"integer\":\r\n case \"float\": {\r\n const n = Number(v);\r\n\r\n if (Number.isNaN(n)) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید عددی باشد` };\r\n if (rule.min != null && n < rule.min) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید ≥ ${rule.min} باشد` };\r\n if (rule.max != null && n > rule.max) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید ≤ ${rule.max} باشد` };\r\n if (rule.type === \"integer\" && !Number.isInteger(n)) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید عدد صحیح باشد` };\r\n break;\r\n }\r\n case \"boolean\":\r\n if (typeof v !== \"boolean\") return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید بولی باشد` };\r\n break;\r\n case \"email\": {\r\n const reg = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n if (!reg.test(String(v))) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} ایمیل معتبر نیست` };\r\n break;\r\n }\r\n case \"url\": {\r\n try {\r\n new URL(String(v));\r\n } catch {\r\n return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید URL معتبر باشد` };\r\n }\r\n break;\r\n }\r\n case \"date\": {\r\n const d = new Date(\r\n typeof v === 'string' || typeof v === 'number' ? v : String(v),\r\n );\r\n if (isNaN(d.getTime())) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} تاریخ معتبر نیست` };\r\n break;\r\n }\r\n case \"enum\":\r\n if (rule.enum && !rule.enum.includes(v))\r\n return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} مقدار نامعتبر دارد` };\r\n break;\r\n default:\r\n break;\r\n }\r\n if (typeof v === \"string\") {\r\n if (rule.len != null && v.length !== rule.len) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید ${rule.len} کاراکتر باشد` };\r\n if (rule.min != null && v.length < rule.min) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید حداقل ${rule.min} کاراکتر باشد` };\r\n if (rule.max != null && v.length > rule.max) return { caption, rowId, message: rule.message ?? `${schema.fieldCaption || caption} باید حداکثر ${rule.max} کاراکتر باشد` };\r\n }\r\n if (rule.validator) {\r\n let customError: string[] | undefined;\r\n rule.validator(rule, v, (err?: string[]) => (customError = err));\r\n if (customError && customError.length) return { caption, rowId, message: rule.message ?? customError[0] };\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n private schemaHasAsyncValidator(schema: ColumnSchema | undefined): boolean {\r\n return !!schema?.rules?.some(\r\n (rule) => typeof rule.asyncValidator === 'function',\r\n );\r\n }\r\n\r\n private tableHasAsyncValidators(table: Table): boolean {\r\n return table.getColumns().some((column) =>\r\n this.schemaHasAsyncValidator(column),\r\n );\r\n }\r\n\r\n private cellValueKey(value: unknown): string {\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n }\r\n\r\n private errorFromAsyncFailure(\r\n err: unknown,\r\n rule: { message?: string },\r\n schema: ColumnSchema,\r\n caption: string,\r\n rowId: number,\r\n ): CellError {\r\n const fallback =\r\n err instanceof Error\r\n ? err.message\r\n : typeof err === 'string'\r\n ? err\r\n : `${schema.fieldCaption || caption} نامعتبر است`;\r\n return { caption, rowId, message: rule.message ?? fallback };\r\n }\r\n\r\n private async applyAsyncValidators(\r\n value: unknown,\r\n schema: ColumnSchema,\r\n caption: string,\r\n rowId: number,\r\n ): Promise<CellError | undefined> {\r\n const rules = schema.rules ?? [];\r\n for (const rule of rules) {\r\n if (typeof rule.asyncValidator !== 'function') continue;\r\n const v = rule.transform ? rule.transform(value) : value;\r\n const isEmpty =\r\n v === null ||\r\n v === undefined ||\r\n (typeof v === 'string' && v.trim() === '') ||\r\n (Array.isArray(v) && v.length === 0);\r\n if (isEmpty) continue;\r\n try {\r\n await rule.asyncValidator(rule, v);\r\n } catch (err) {\r\n return this.errorFromAsyncFailure(err, rule, schema, caption, rowId);\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n private async validateCellFull(\r\n value: unknown,\r\n schema: ColumnSchema,\r\n caption: string,\r\n rowId: number,\r\n ): Promise<CellError | undefined> {\r\n const syncError = this.validateCell(value, schema, caption, rowId);\r\n if (syncError) return syncError;\r\n return this.applyAsyncValidators(value, schema, caption, rowId);\r\n }\r\n\r\n private finishValidation(\r\n cb: ValidationCallback,\r\n tableStore: TableStore<TableState>,\r\n ): void {\r\n cb({\r\n valid: this.errors.size === 0,\r\n errors: this.errors,\r\n data: this.getAllRows(),\r\n });\r\n tableStore.setState((prev) => ({\r\n ...prev,\r\n expandedRows: {},\r\n }));\r\n }\r\n\r\n private collectValidationJobs(table: Table): Array<{\r\n cellId: string;\r\n value: unknown;\r\n schema: ColumnSchema;\r\n caption: string;\r\n rowId: number;\r\n }> {\r\n const jobs: Array<{\r\n cellId: string;\r\n value: unknown;\r\n schema: ColumnSchema;\r\n caption: string;\r\n rowId: number;\r\n }> = [];\r\n this.getAllRows()\r\n ?.filter((row) => row.rowState.value !== RowStateEnum.Deleted)\r\n .forEach((row: Row, rowIndex: number) => {\r\n for (const [columnId, cell] of row.getCells().entries()) {\r\n const schema = table.getColumnSchema(new ColumnId(columnId));\r\n if (!schema || schema.hidden) continue;\r\n jobs.push({\r\n cellId: `row-${rowIndex}-${columnId}`,\r\n value: cell.getValue(),\r\n schema,\r\n caption: schema.fieldCaption,\r\n rowId: row.id.value,\r\n });\r\n }\r\n });\r\n return jobs;\r\n }\r\n\r\n private applyValidationErrors(nextErrors: Map<string, CellError>): void {\r\n this.errors.clear();\r\n nextErrors.forEach((error, cellId) => {\r\n this.errors.set(cellId, error);\r\n });\r\n }\r\n\r\n private runValidationSync(\r\n table: Table,\r\n cb: ValidationCallback,\r\n tableStore: TableStore<TableState>,\r\n ): void {\r\n const nextErrors = new Map<string, CellError>();\r\n for (const job of this.collectValidationJobs(table)) {\r\n const error = this.validateCell(\r\n job.value,\r\n job.schema,\r\n job.caption,\r\n job.rowId,\r\n );\r\n if (error) nextErrors.set(job.cellId, error);\r\n }\r\n this.applyValidationErrors(nextErrors);\r\n this.finishValidation(cb, tableStore);\r\n }\r\n\r\n private async runValidationAsync(\r\n table: Table,\r\n cb: ValidationCallback,\r\n tableStore: TableStore<TableState>,\r\n ): Promise<void> {\r\n const nextErrors = new Map<string, CellError>();\r\n for (const job of this.collectValidationJobs(table)) {\r\n const error = await this.validateCellFull(\r\n job.value,\r\n job.schema,\r\n job.caption,\r\n job.rowId,\r\n );\r\n if (error) nextErrors.set(job.cellId, error);\r\n }\r\n this.applyValidationErrors(nextErrors);\r\n this.finishValidation(cb, tableStore);\r\n }\r\n\r\n private scheduleAsyncCellCheck(\r\n cellId: string,\r\n valueKey: string,\r\n value: unknown,\r\n schema: ColumnSchema,\r\n caption: string,\r\n rowId: number,\r\n ): void {\r\n const seq = (this.asyncCellSeq.get(cellId) ?? 0) + 1;\r\n this.asyncCellSeq.set(cellId, seq);\r\n void this.applyAsyncValidators(value, schema, caption, rowId).then(\r\n (error) => {\r\n if (this.asyncCellSeq.get(cellId) !== seq) return;\r\n this.asyncCellCache.set(cellId, { valueKey, error });\r\n if (error) this.errors.set(cellId, error);\r\n else this.errors.delete(cellId);\r\n this.getStore()?.setState((prev) => ({ ...prev }));\r\n },\r\n );\r\n }\r\n validation(cb: ValidationCallback): void {\r\n const store = this.getStore();\r\n if (!store) {\r\n cb({\r\n valid: false,\r\n errors: new Map<string, CellError>([\r\n [\r\n \"system\",\r\n {\r\n caption: \"\",\r\n rowId: NaN,\r\n message: `TableStore not found for active table`,\r\n },\r\n ],\r\n ]),\r\n data: null,\r\n });\r\n return;\r\n }\r\n const table = store.getState().table;\r\n try {\r\n if (this.tableHasAsyncValidators(table)) {\r\n void this.runValidationAsync(table, cb, store).catch((error) => {\r\n const message =\r\n error instanceof Error ? error.message : String(error ?? \"خطای اعتبارسنجی\");\r\n cb({\r\n valid: false,\r\n errors: new Map<string, CellError>([\r\n ['system', { caption: '', rowId: NaN, message }],\r\n ]),\r\n data: null,\r\n });\r\n });\r\n return;\r\n }\r\n this.runValidationSync(table, cb, store);\r\n } catch (error) {\r\n const message =\r\n error instanceof Error ? error.message : String(error ?? \"خطای اعتبارسنجی\");\r\n cb(\r\n {\r\n valid: false,\r\n errors: new Map<string, CellError>([['system', { caption: '', rowId: NaN, message }]]),\r\n data: null\r\n }\r\n );\r\n\r\n }\r\n }\r\n isValidCell(\r\n rowId: number,\r\n caption: string\r\n ): ValidCell {\r\n try {\r\n const store = this.getStore()?.getState();\r\n if (!store) return { isValid: false, cellError: { caption: \"\", rowId: NaN, message: \"حافظه پیدا نشد\" } };\r\n\r\n const table = store.table;\r\n const row = table.getRow(rowId);\r\n if (!row) {\r\n return { isValid: true, cellError: { caption: \"\", rowId: NaN, message: \"\" } };\r\n }\r\n if (row.rowState.value === RowStateEnum.Deleted) {\r\n return { isValid: true, cellError: { caption: \"\", rowId: NaN, message: \"\" } };\r\n }\r\n const rowIndex = table.getRows().sort((a, b) => {\r\n const aIndex = Number(a.getCells().get(\"index\")?.getValue() ?? 0);\r\n const bIndex = Number(b.getCells().get(\"index\")?.getValue() ?? 0);\r\n return aIndex - bIndex;\r\n }).findIndex(r => r.id.value == rowId)\r\n const schema = table.getColumnSchema(new ColumnId(caption));\r\n if (!schema) return { isValid: true, cellError: { caption: \"\", rowId: NaN, message: \"\" } };\r\n const cell = row.getCell(caption);\r\n if (!cell) {\r\n return { isValid: true, cellError: { caption: \"\", rowId: NaN, message: \"\" } };\r\n }\r\n const error = this.validateCell(cell.getValue(), schema, caption, rowId);\r\n const cellId = `row-${rowIndex}-${caption}`;\r\n if (error) {\r\n this.asyncCellCache.delete(cellId);\r\n return { isValid: false, cellError: error }\r\n }\r\n if (!this.schemaHasAsyncValidator(schema)) {\r\n this.errors.delete(cellId);\r\n return { isValid: true, cellError: { caption: \"\", rowId: NaN, message: '' } }\r\n }\r\n const valueKey = this.cellValueKey(cell.getValue());\r\n const cached = this.asyncCellCache.get(cellId);\r\n if (cached?.valueKey === valueKey) {\r\n if (cached.error) {\r\n this.errors.set(cellId, cached.error);\r\n return { isValid: false, cellError: cached.error };\r\n }\r\n this.errors.delete(cellId);\r\n return { isValid: true, cellError: { caption: \"\", rowId: NaN, message: '' } };\r\n }\r\n this.scheduleAsyncCellCheck(\r\n cellId,\r\n valueKey,\r\n cell.getValue(),\r\n schema,\r\n caption,\r\n rowId,\r\n );\r\n this.errors.delete(cellId);\r\n return { isValid: true, cellError: { caption: \"\", rowId: NaN, message: '' } };\r\n } catch (e) {\r\n const message = e instanceof Error ? e.message : String(e ?? \"خطای اعتبارسنجی\");\r\n return { isValid: false, cellError: { caption: \"\", rowId: NaN, message } }\r\n }\r\n }\r\n // ─── subscriptions ───────────────────────────────────────────────────────────\r\n\r\n subscribe(cb: () => void): (() => void) | null {\r\n const store = this.getStore();\r\n if (!store) return null;\r\n try {\r\n return store.subscribe(cb);\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.subscribe');\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Selector-based subscription over engine-derived view data.\r\n * `selector` closes over engine getters (snapshot, activeCell, …).\r\n */\r\n subscribeSelected<TSelected>(\r\n selector: () => TSelected,\r\n listener: (selected: TSelected) => void,\r\n isEqual: (a: TSelected, b: TSelected) => boolean = Object.is,\r\n ): (() => void) | null {\r\n const store = this.getStore();\r\n if (!store) return null;\r\n try {\r\n let current = selector();\r\n return store.subscribe(() => {\r\n const next = selector();\r\n if (!isEqual(current, next)) {\r\n current = next;\r\n listener(next);\r\n }\r\n });\r\n } catch (e) {\r\n this.errHandler.handle(e, 'TableEngine.subscribeSelected');\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Streamed column subscription (Memory Iron Rule compliant).\r\n * Consumes the dataset through `iterateRowRecords` in bounded batches and\r\n * folds every non-deleted item into a small caller-owned accumulator via\r\n * `reducer` — never materializes rows with getAllRows and never\r\n * JSON.stringify's the whole dataset. Heap = one batch + the accumulator\r\n * (O(batch) in RAM, independent of total row count).\r\n * Change detection uses an incrementally-maintained double-hash signature\r\n * (O(1) heap) instead of a full JSON signature.\r\n * `cb` fires with the folded accumulator on the initial emit and afterwards\r\n * only when the column's data actually changed. Reads are async.\r\n */\r\n subscribeColumn<T = unknown>(\r\n columnId: string,\r\n collections: CollectionScope,\r\n reducer: (acc: T, item: { id: number; rowNum: unknown; value: unknown }) => T,\r\n seed: T,\r\n cb: (acc: T) => void,\r\n store?: string,\r\n ): (() => void) | null {\r\n const tableStore = this.getStore();\r\n if (!tableStore) return null;\r\n const repo = this.repo;\r\n const tableKey = this.tableKey ?? '';\r\n\r\n const iterate = async (\r\n onItem: (item: { id: number; rowNum: unknown; value: unknown }) => void,\r\n ): Promise<void> => {\r\n if (store && isWindowedRepository(repo)) {\r\n // Stream from IndexedDB (source of truth): heap holds ONE batch.\r\n await repo.iterateRowRecords(store, tableKey, collections, async (records) => {\r\n for (const rec of records) {\r\n if (rec.rowState === RowStateEnum.Deleted) continue;\r\n onItem({\r\n id: rec.rowId,\r\n rowNum: rec.cells['index']?.value ?? rec.sortIndex,\r\n value: rec.cells[columnId]?.value,\r\n });\r\n }\r\n });\r\n return;\r\n }\r\n // Default (event-sourced) mode: rows already live in RAM.\r\n for (const r of this.viewBuilder.getAllRows(collections) ?? []) {\r\n if (r.rowState.value === RowStateEnum.Deleted) continue;\r\n onItem({\r\n id: r.id.value,\r\n rowNum: r.getCell('index')?.getValue(),\r\n value: r.getCell(columnId)?.getValue(),\r\n });\r\n }\r\n };\r\n\r\n let cancelled = false;\r\n let off: (() => void) | undefined;\r\n // The fold (hash-based change detection) is lazy-loaded to keep the\r\n // default entry small; the first emit therefore arrives asynchronously.\r\n void import('../infrastructure/Repositories/paged/foldedColumn').then(\r\n ({ foldColumnSubscription }) => {\r\n if (cancelled) return;\r\n off = foldColumnSubscription<T>({\r\n subscribe: (listener) => tableStore.subscribe(listener),\r\n iterate,\r\n reducer,\r\n seed,\r\n cb,\r\n onError: (e) => this.errHandler.handle(e, 'TableEngine.subscribeColumn'),\r\n });\r\n },\r\n );\r\n\r\n return () => {\r\n cancelled = true;\r\n off?.();\r\n };\r\n }\r\n}","import type { RemoteApi } from '../../application/ports/RemoteApi';\r\n\r\n/** Default RemoteApi — host injects FetchRemoteApi or a custom adapter. */\r\nexport class NoopRemoteApi implements RemoteApi {\r\n async request<TResponse = unknown>(): Promise<TResponse> {\r\n return null as TResponse;\r\n }\r\n}\r\n","import type { EventStore, AppendResult, Unsubscribe } from '../../application/ports/EventStore';\r\nimport type { GridEvent } from '../../domain/types/GridEvent';\r\n\r\ntype Listener = (event: GridEvent) => void;\r\n\r\nexport class InMemoryEventStore implements EventStore {\r\n private streams = new Map<string, GridEvent[]>();\r\n private globalLog: GridEvent[] = [];\r\n private listeners = new Map<string, Set<Listener>>();\r\n private globalListeners = new Set<Listener>();\r\n\r\n async append(\r\n streamId: string,\r\n events: GridEvent[],\r\n expectedVersion: number\r\n ): Promise<AppendResult> {\r\n const stream = this.streams.get(streamId) ?? [];\r\n const actualVersion = stream.length;\r\n\r\n if (expectedVersion !== -1 && expectedVersion !== actualVersion) {\r\n return { ok: false, conflict: { expectedVersion, actualVersion } };\r\n }\r\n\r\n const stamped: GridEvent[] = [];\r\n for (const event of events) {\r\n const versioned: GridEvent = {\r\n ...event,\r\n streamId,\r\n version: stream.length + stamped.length + 1,\r\n };\r\n stamped.push(versioned);\r\n stream.push(versioned);\r\n this.globalLog.push(versioned);\r\n }\r\n this.streams.set(streamId, stream);\r\n\r\n const subs = this.listeners.get(streamId);\r\n for (const event of stamped) {\r\n if (subs) {\r\n for (const listener of subs) { listener(event); }\r\n }\r\n for (const listener of this.globalListeners) { listener(event); }\r\n }\r\n\r\n return { ok: true, version: stream.length };\r\n }\r\n\r\n async read(streamId: string, fromVersion: number = 0): Promise<GridEvent[]> {\r\n const stream = this.streams.get(streamId) ?? [];\r\n return stream.slice(fromVersion);\r\n }\r\n\r\n async readAll(fromPosition: number = 0): Promise<GridEvent[]> {\r\n return this.globalLog.slice(fromPosition);\r\n }\r\n\r\n subscribe(streamId: string, onEvent: Listener): Unsubscribe {\r\n if (!this.listeners.has(streamId)) {\r\n this.listeners.set(streamId, new Set());\r\n }\r\n const subs = this.listeners.get(streamId)!;\r\n subs.add(onEvent);\r\n return () => { subs.delete(onEvent); };\r\n }\r\n\r\n subscribeAll(onEvent: Listener): Unsubscribe {\r\n this.globalListeners.add(onEvent);\r\n return () => { this.globalListeners.delete(onEvent); };\r\n }\r\n\r\n getStreamVersion(streamId: string): number {\r\n return (this.streams.get(streamId) ?? []).length;\r\n }\r\n\r\n getGlobalPosition(): number {\r\n return this.globalLog.length;\r\n }\r\n}\r\n","/**\r\n * Minimal async key-value backend so IndexedDbEventStore can run in Node tests\r\n * without a real IndexedDB, and in browsers via an IDB adapter.\r\n */\r\nexport interface KvStore {\r\n get<T = unknown>(key: string): Promise<T | undefined>;\r\n put(key: string, value: unknown): Promise<void>;\r\n delete(key: string): Promise<void>;\r\n getAllKeys(): Promise<string[]>;\r\n getAll<T = unknown>(): Promise<T[]>;\r\n clear(): Promise<void>;\r\n}\r\n\r\nexport interface KvDatabase {\r\n objectStore(name: string): KvStore;\r\n}\r\n\r\nexport class MemoryKvStore implements KvStore {\r\n private data = new Map<string, unknown>();\r\n\r\n async get<T = unknown>(key: string): Promise<T | undefined> {\r\n return this.data.get(key) as T | undefined;\r\n }\r\n\r\n async put(key: string, value: unknown): Promise<void> {\r\n this.data.set(key, value);\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n this.data.delete(key);\r\n }\r\n\r\n async getAllKeys(): Promise<string[]> {\r\n return Array.from(this.data.keys());\r\n }\r\n\r\n async getAll<T = unknown>(): Promise<T[]> {\r\n return Array.from(this.data.values()) as T[];\r\n }\r\n\r\n async clear(): Promise<void> {\r\n this.data.clear();\r\n }\r\n}\r\n\r\nexport class MemoryKvDatabase implements KvDatabase {\r\n private stores = new Map<string, MemoryKvStore>();\r\n\r\n objectStore(name: string): KvStore {\r\n let store = this.stores.get(name);\r\n if (!store) {\r\n store = new MemoryKvStore();\r\n this.stores.set(name, store);\r\n }\r\n return store;\r\n }\r\n}\r\n\r\n/**\r\n * Browser IndexedDB adapter. Opens (or creates) a DB with the given object stores.\r\n * Falls back callers should use MemoryKvDatabase in Node/tests.\r\n */\r\nexport async function openIndexedDbDatabase(\r\n dbName: string,\r\n storeNames: string[],\r\n version = 1,\r\n): Promise<KvDatabase> {\r\n if (typeof indexedDB === 'undefined') {\r\n throw new Error('indexedDB is not available in this environment');\r\n }\r\n\r\n const db = await new Promise<IDBDatabase>((resolve, reject) => {\r\n const request = indexedDB.open(dbName, version);\r\n request.onerror = () => reject(request.error ?? new Error('indexedDB.open failed'));\r\n request.onupgradeneeded = () => {\r\n const database = request.result;\r\n for (const name of storeNames) {\r\n if (!database.objectStoreNames.contains(name)) {\r\n database.createObjectStore(name);\r\n }\r\n }\r\n };\r\n request.onsuccess = () => resolve(request.result);\r\n });\r\n\r\n return {\r\n objectStore(name: string): KvStore {\r\n return {\r\n async get<T = unknown>(key: string): Promise<T | undefined> {\r\n return run(db, name, 'readonly', (store) => store.get(key)) as Promise<T | undefined>;\r\n },\r\n async put(key: string, value: unknown): Promise<void> {\r\n await run(db, name, 'readwrite', (store) => store.put(value, key));\r\n },\r\n async delete(key: string): Promise<void> {\r\n await run(db, name, 'readwrite', (store) => store.delete(key));\r\n },\r\n async getAllKeys(): Promise<string[]> {\r\n const keys = await run(db, name, 'readonly', (store) => store.getAllKeys());\r\n return (keys as IDBValidKey[]).map(String);\r\n },\r\n async getAll<T = unknown>(): Promise<T[]> {\r\n return run(db, name, 'readonly', (store) => store.getAll()) as Promise<T[]>;\r\n },\r\n async clear(): Promise<void> {\r\n await run(db, name, 'readwrite', (store) => store.clear());\r\n },\r\n };\r\n },\r\n };\r\n}\r\n\r\nfunction run<T>(\r\n db: IDBDatabase,\r\n storeName: string,\r\n mode: IDBTransactionMode,\r\n op: (store: IDBObjectStore) => IDBRequest<T>,\r\n): Promise<T> {\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(storeName, mode);\r\n const store = tx.objectStore(storeName);\r\n const request = op(store);\r\n request.onsuccess = () => resolve(request.result);\r\n request.onerror = () => reject(request.error ?? new Error('IDB request failed'));\r\n });\r\n}\r\n","/** Default IndexedDB database prefix (PR-80). */\r\nexport const DEFAULT_EVENT_STORE_PREFIX = 'persian-data-grid-events';\r\n\r\n/**\r\n * Prefix used by `persian-data-grid@0.5.x`.\r\n * Pass as `eventStoreName` to keep reading existing local data.\r\n */\r\nexport const LEGACY_EVENT_STORE_PREFIX = 'erp-table-events';\r\n\r\n/** Full IndexedDB name: `{prefix}:{store}`. */\r\nexport function eventStoreDbName(\r\n store: string,\r\n prefix: string = DEFAULT_EVENT_STORE_PREFIX,\r\n): string {\r\n return `${prefix}:${store}`;\r\n}\r\n","import type { EventStore, AppendResult, Unsubscribe } from '../../application/ports/EventStore';\r\nimport type { GridEvent } from '../../domain/types/GridEvent';\r\nimport type { KvDatabase } from './KvDatabase';\r\nimport { MemoryKvDatabase, openIndexedDbDatabase } from './KvDatabase';\r\nimport { DEFAULT_EVENT_STORE_PREFIX } from './eventStoreName';\r\n\r\ntype Listener = (event: GridEvent) => void;\r\n\r\nconst STREAMS = 'streams';\r\nconst GLOBAL = 'global';\r\nconst META = 'meta';\r\n\r\ntype StreamRecord = {\r\n events: GridEvent[];\r\n};\r\n\r\n/**\r\n * Durable EventStore backed by IndexedDB (or any KvDatabase).\r\n * Same OCC contract as InMemoryEventStore.\r\n */\r\nexport class IndexedDbEventStore implements EventStore {\r\n private listeners = new Map<string, Set<Listener>>();\r\n private globalListeners = new Set<Listener>();\r\n private ready: Promise<void>;\r\n\r\n constructor(private readonly db: KvDatabase) {\r\n this.ready = Promise.resolve();\r\n }\r\n\r\n static async open(\r\n dbName = DEFAULT_EVENT_STORE_PREFIX,\r\n ): Promise<IndexedDbEventStore> {\r\n const db = await openIndexedDbDatabase(dbName, [STREAMS, GLOBAL, META]);\r\n return new IndexedDbEventStore(db);\r\n }\r\n\r\n /** Test / Node helper — durable API with in-memory persistence backend. */\r\n static inMemory(): IndexedDbEventStore {\r\n return new IndexedDbEventStore(new MemoryKvDatabase());\r\n }\r\n\r\n async append(\r\n streamId: string,\r\n events: GridEvent[],\r\n expectedVersion: number,\r\n ): Promise<AppendResult> {\r\n await this.ready;\r\n const streamStore = this.db.objectStore(STREAMS);\r\n const globalStore = this.db.objectStore(GLOBAL);\r\n const metaStore = this.db.objectStore(META);\r\n\r\n const record = (await streamStore.get<StreamRecord>(streamId)) ?? {\r\n events: [],\r\n };\r\n const actualVersion = record.events.length;\r\n\r\n if (expectedVersion !== -1 && expectedVersion !== actualVersion) {\r\n return { ok: false, conflict: { expectedVersion, actualVersion } };\r\n }\r\n\r\n const stamped: GridEvent[] = [];\r\n for (const event of events) {\r\n const versioned: GridEvent = {\r\n ...event,\r\n streamId,\r\n version: record.events.length + stamped.length + 1,\r\n };\r\n stamped.push(versioned);\r\n record.events.push(versioned);\r\n }\r\n\r\n await streamStore.put(streamId, record);\r\n\r\n const globalPos =\r\n (await metaStore.get<number>('globalPosition')) ?? 0;\r\n let nextPos = globalPos;\r\n for (const event of stamped) {\r\n nextPos += 1;\r\n await globalStore.put(String(nextPos), event);\r\n }\r\n await metaStore.put('globalPosition', nextPos);\r\n\r\n const subs = this.listeners.get(streamId);\r\n for (const event of stamped) {\r\n if (subs) {\r\n for (const listener of subs) listener(event);\r\n }\r\n for (const listener of this.globalListeners) listener(event);\r\n }\r\n\r\n return { ok: true, version: record.events.length };\r\n }\r\n\r\n async read(streamId: string, fromVersion: number = 0): Promise<GridEvent[]> {\r\n await this.ready;\r\n const record = await this.db.objectStore(STREAMS).get<StreamRecord>(streamId);\r\n return (record?.events ?? []).slice(fromVersion);\r\n }\r\n\r\n async readAll(fromPosition: number = 0): Promise<GridEvent[]> {\r\n await this.ready;\r\n const globalStore = this.db.objectStore(GLOBAL);\r\n const keys = (await globalStore.getAllKeys())\r\n .map(Number)\r\n .filter((n) => Number.isFinite(n))\r\n .sort((a, b) => a - b)\r\n .filter((n) => n > fromPosition);\r\n\r\n const events: GridEvent[] = [];\r\n for (const key of keys) {\r\n const event = await globalStore.get<GridEvent>(String(key));\r\n if (event) events.push(event);\r\n }\r\n return events;\r\n }\r\n\r\n subscribe(streamId: string, onEvent: Listener): Unsubscribe {\r\n if (!this.listeners.has(streamId)) {\r\n this.listeners.set(streamId, new Set());\r\n }\r\n const subs = this.listeners.get(streamId)!;\r\n subs.add(onEvent);\r\n return () => {\r\n subs.delete(onEvent);\r\n };\r\n }\r\n\r\n subscribeAll(onEvent: Listener): Unsubscribe {\r\n this.globalListeners.add(onEvent);\r\n return () => {\r\n this.globalListeners.delete(onEvent);\r\n };\r\n }\r\n}\r\n","import type { GridEvent } from '../../domain/types/GridEvent';\r\nimport type { EventStore, Unsubscribe } from '../ports/EventStore';\r\n\r\n/** Host / test seam for online detection (no DOM in application/). */\r\nexport type ConnectivitySource = {\r\n getOnline(): boolean;\r\n subscribe(listener: (online: boolean) => void): Unsubscribe;\r\n};\r\n\r\n/** Optional durable set of synced event ids (host/infra; not DOM here). */\r\nexport type SyncWatermarkStore = {\r\n load(): readonly string[];\r\n save(ids: readonly string[]): void;\r\n};\r\n\r\nexport type Connectivity = 'online' | 'offline';\r\n\r\nexport type PendingChange = {\r\n readonly eventId: string;\r\n readonly type: string;\r\n readonly occurredAt: number;\r\n readonly summary: string;\r\n /** Full event for SyncPort push (PR-138). */\r\n readonly event: GridEvent;\r\n};\r\n\r\nconst DATA_EVENT_TYPES = new Set([\r\n 'CELL_CHANGED',\r\n 'CELL_DISPLAY_CHANGED',\r\n 'ROW_ADDED',\r\n 'NEW_ROW_ADDED',\r\n 'ROW_DELETED',\r\n 'ROW_RESTORED',\r\n 'ROW_REORDERED',\r\n 'ROW_DESCRIPTION_SAVED',\r\n]);\r\n\r\nfunction summarize(event: GridEvent): string {\r\n const payload = event.payload as Record<string, unknown> | null;\r\n switch (event.type) {\r\n case 'CELL_CHANGED':\r\n return `Cell ${payload?.columnId ?? '?'} → ${String(payload?.newValue ?? '')}`;\r\n case 'ROW_ADDED':\r\n case 'NEW_ROW_ADDED':\r\n return `Row ${String(payload?.rowId ?? '')} added`;\r\n case 'ROW_DELETED':\r\n return `Row ${String(payload?.rowId ?? '')} deleted`;\r\n default:\r\n return event.type;\r\n }\r\n}\r\n\r\nfunction toPending(event: GridEvent): PendingChange {\r\n return {\r\n eventId: event.eventId,\r\n type: event.type,\r\n occurredAt: event.occurredAt,\r\n summary: summarize(event),\r\n event,\r\n };\r\n}\r\n\r\nexport type OfflineStatusOptions = {\r\n readonly tableId: string;\r\n readonly connectivity: ConnectivitySource;\r\n readonly watermark?: SyncWatermarkStore;\r\n};\r\n\r\n/**\r\n * Product offline session (PR-137): connectivity + pending local data mutations\r\n * not yet marked synced (SyncPort in PR-138 will call `markSynced`).\r\n */\r\nexport class OfflineStatus {\r\n private online: boolean;\r\n private pending: PendingChange[] = [];\r\n private syncedIds = new Set<string>();\r\n private connectivityUnsub: Unsubscribe | null = null;\r\n private storeUnsub: Unsubscribe | null = null;\r\n private readonly connectivityListeners = new Set<\r\n (state: Connectivity) => void\r\n >();\r\n private readonly pendingListeners = new Set<\r\n (items: readonly PendingChange[]) => void\r\n >();\r\n\r\n constructor(private readonly options: OfflineStatusOptions) {\r\n this.online = options.connectivity.getOnline();\r\n this.loadWatermark();\r\n }\r\n\r\n async start(eventStore: EventStore): Promise<void> {\r\n this.stop();\r\n this.connectivityUnsub = this.options.connectivity.subscribe((online) => {\r\n this.online = online;\r\n this.emitConnectivity();\r\n });\r\n\r\n const past = await eventStore.readAll(0);\r\n for (const event of past) {\r\n this.consider(event);\r\n }\r\n this.storeUnsub = eventStore.subscribeAll((event) => {\r\n this.consider(event);\r\n });\r\n this.emitPending();\r\n }\r\n\r\n stop(): void {\r\n this.connectivityUnsub?.();\r\n this.connectivityUnsub = null;\r\n this.storeUnsub?.();\r\n this.storeUnsub = null;\r\n }\r\n\r\n getConnectivity(): Connectivity {\r\n return this.online ? 'online' : 'offline';\r\n }\r\n\r\n getPendingChanges(): readonly PendingChange[] {\r\n return this.pending;\r\n }\r\n\r\n getPendingCount(): number {\r\n return this.pending.length;\r\n }\r\n\r\n /** Mark pending mutations as synced (clears queue / advances watermark). */\r\n markSynced(eventIds?: readonly string[]): void {\r\n if (!eventIds || eventIds.length === 0) {\r\n for (const item of this.pending) {\r\n this.syncedIds.add(item.eventId);\r\n }\r\n this.pending = [];\r\n } else {\r\n const clear = new Set(eventIds);\r\n for (const id of clear) this.syncedIds.add(id);\r\n this.pending = this.pending.filter((p) => !clear.has(p.eventId));\r\n }\r\n this.persistWatermark();\r\n this.emitPending();\r\n }\r\n\r\n subscribeConnectivity(listener: (state: Connectivity) => void): Unsubscribe {\r\n this.connectivityListeners.add(listener);\r\n listener(this.getConnectivity());\r\n return () => this.connectivityListeners.delete(listener);\r\n }\r\n\r\n subscribePending(\r\n listener: (items: readonly PendingChange[]) => void,\r\n ): Unsubscribe {\r\n this.pendingListeners.add(listener);\r\n listener(this.pending);\r\n return () => this.pendingListeners.delete(listener);\r\n }\r\n\r\n private consider(event: GridEvent): void {\r\n if (event.tableId !== this.options.tableId) return;\r\n if (!DATA_EVENT_TYPES.has(event.type)) return;\r\n if (this.syncedIds.has(event.eventId)) return;\r\n if (this.pending.some((p) => p.eventId === event.eventId)) return;\r\n this.pending = [...this.pending, toPending(event)];\r\n this.emitPending();\r\n }\r\n\r\n private emitConnectivity(): void {\r\n const state = this.getConnectivity();\r\n for (const listener of this.connectivityListeners) listener(state);\r\n }\r\n\r\n private emitPending(): void {\r\n for (const listener of this.pendingListeners) listener(this.pending);\r\n }\r\n\r\n private loadWatermark(): void {\r\n const ids = this.options.watermark?.load() ?? [];\r\n for (const id of ids) this.syncedIds.add(id);\r\n }\r\n\r\n private persistWatermark(): void {\r\n this.options.watermark?.save([...this.syncedIds]);\r\n }\r\n}\r\n\r\n/** Always-online source for Node tests / SSR. */\r\nexport const alwaysOnlineConnectivity: ConnectivitySource = {\r\n getOnline: () => true,\r\n subscribe: () => () => {},\r\n};\r\n","import type { ConnectivitySource } from '../../application/offline/OfflineStatus';\r\n\r\n/** Browser `navigator.onLine` + window online/offline events (PR-137). */\r\nexport function createBrowserConnectivity(\r\n overrides?: Partial<ConnectivitySource>,\r\n): ConnectivitySource {\r\n return {\r\n getOnline() {\r\n if (overrides?.getOnline) return overrides.getOnline();\r\n if (typeof navigator === 'undefined') return true;\r\n return navigator.onLine;\r\n },\r\n subscribe(listener) {\r\n if (overrides?.subscribe) return overrides.subscribe(listener);\r\n if (typeof window === 'undefined') return () => {};\r\n const on = () => listener(true);\r\n const off = () => listener(false);\r\n window.addEventListener('online', on);\r\n window.addEventListener('offline', off);\r\n return () => {\r\n window.removeEventListener('online', on);\r\n window.removeEventListener('offline', off);\r\n };\r\n },\r\n };\r\n}\r\n","import type { SyncWatermarkStore } from '../../application/offline/OfflineStatus';\r\n\r\n/** localStorage-backed sync watermark (PR-137). */\r\nexport function createLocalStorageWatermark(key: string): SyncWatermarkStore {\r\n return {\r\n load() {\r\n if (typeof localStorage === 'undefined') return [];\r\n try {\r\n const raw = localStorage.getItem(key);\r\n if (!raw) return [];\r\n const ids = JSON.parse(raw) as unknown;\r\n return Array.isArray(ids)\r\n ? ids.filter((id): id is string => typeof id === 'string')\r\n : [];\r\n } catch {\r\n return [];\r\n }\r\n },\r\n save(ids) {\r\n if (typeof localStorage === 'undefined') return;\r\n try {\r\n localStorage.setItem(key, JSON.stringify([...ids]));\r\n } catch {\r\n /* quota / private mode */\r\n }\r\n },\r\n };\r\n}\r\n","import type {\r\n AggregateSnapshot,\r\n SnapshotStore,\r\n} from '../../application/ports/SnapshotStore';\r\nimport type { EventStore } from '../../application/ports/EventStore';\r\nimport type { GridEvent } from '../../domain/types/GridEvent';\r\n\r\nexport type SnapshotStrategyOptions = {\r\n /** Take a snapshot every N appended domain events (default 200). */\r\n readonly everyNEvents?: number;\r\n};\r\n\r\n/**\r\n * After appends, periodically persists a snapshot of the selected payload.\r\n * load(stream) = latest snapshot + events with version > snapshot.version\r\n */\r\nexport class SnapshotStrategy<TPayload = unknown> {\r\n private readonly everyN: number;\r\n private counts = new Map<string, number>();\r\n\r\n constructor(\r\n private readonly snapshots: SnapshotStore<TPayload>,\r\n private readonly eventStore: EventStore,\r\n private readonly capture: (streamId: string) => Promise<TPayload> | TPayload,\r\n options: SnapshotStrategyOptions = {},\r\n ) {\r\n this.everyN = options.everyNEvents ?? 200;\r\n }\r\n\r\n /** Call after a successful EventStore.append for the stream. */\r\n async onAppend(streamId: string, tableId: string, appendedCount: number): Promise<void> {\r\n const next = (this.counts.get(streamId) ?? 0) + appendedCount;\r\n this.counts.set(streamId, next);\r\n\r\n if (next < this.everyN) return;\r\n\r\n const events = await this.eventStore.read(streamId);\r\n const version = events.length;\r\n const payload = await this.capture(streamId);\r\n\r\n await this.snapshots.save({\r\n tableId,\r\n streamId,\r\n version,\r\n takenAt: Date.now(),\r\n payload,\r\n });\r\n\r\n this.counts.set(streamId, 0);\r\n }\r\n\r\n async loadWithCatchUp(streamId: string): Promise<{\r\n snapshot: AggregateSnapshot<TPayload> | null;\r\n eventsAfter: GridEvent[];\r\n }> {\r\n const snapshot = await this.snapshots.loadLatest(streamId);\r\n const fromVersion = snapshot?.version ?? 0;\r\n const eventsAfter = await this.eventStore.read(streamId, fromVersion);\r\n return { snapshot, eventsAfter };\r\n }\r\n}\r\n","/**\r\n * Column layout state model (PR-115). Pure — no React/DOM.\r\n * Used by GridApi get/apply and optional localStorage / EventStore persist.\r\n */\r\n\r\nimport type { SortDirection, SortModel } from './sortModel';\r\n\r\nexport type ColumnPinnedState = 'start' | 'end' | null;\r\n\r\nexport type ColumnStateItem = {\r\n colId: string;\r\n width: number;\r\n hide: boolean;\r\n order: number;\r\n pinned?: ColumnPinnedState;\r\n sort?: SortDirection | null;\r\n sortIndex?: number | null;\r\n};\r\n\r\nconst STORAGE_PREFIX = 'pdg:columnState:';\r\n\r\nexport function columnStateStorageKey(stateKey: string): string {\r\n return `${STORAGE_PREFIX}${stateKey}`;\r\n}\r\n\r\nexport function serializeColumnState(\r\n state: readonly ColumnStateItem[],\r\n): string {\r\n return JSON.stringify(state);\r\n}\r\n\r\nexport function parseColumnState(\r\n raw: string | null | undefined,\r\n): ColumnStateItem[] | null {\r\n if (raw == null || raw === '') return null;\r\n try {\r\n const parsed: unknown = JSON.parse(raw);\r\n if (!Array.isArray(parsed)) return null;\r\n const items: ColumnStateItem[] = [];\r\n for (const entry of parsed) {\r\n if (!entry || typeof entry !== 'object') continue;\r\n const rec = entry as Record<string, unknown>;\r\n if (typeof rec.colId !== 'string' || rec.colId === '') continue;\r\n const width =\r\n typeof rec.width === 'number' && Number.isFinite(rec.width)\r\n ? rec.width\r\n : 0;\r\n const hide = Boolean(rec.hide);\r\n const order =\r\n typeof rec.order === 'number' && Number.isFinite(rec.order)\r\n ? rec.order\r\n : items.length;\r\n const pinned =\r\n rec.pinned === 'start' || rec.pinned === 'end'\r\n ? rec.pinned\r\n : rec.pinned === null\r\n ? null\r\n : undefined;\r\n const sort =\r\n rec.sort === 'asc' || rec.sort === 'desc'\r\n ? rec.sort\r\n : rec.sort === null\r\n ? null\r\n : undefined;\r\n const sortIndex =\r\n typeof rec.sortIndex === 'number' && Number.isFinite(rec.sortIndex)\r\n ? rec.sortIndex\r\n : rec.sortIndex === null\r\n ? null\r\n : undefined;\r\n items.push({\r\n colId: rec.colId,\r\n width,\r\n hide,\r\n order,\r\n ...(pinned !== undefined ? { pinned } : {}),\r\n ...(sort !== undefined ? { sort } : {}),\r\n ...(sortIndex !== undefined ? { sortIndex } : {}),\r\n });\r\n }\r\n return items.length > 0 ? items : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/** Build SortModel from per-column sort / sortIndex fields. */\r\nexport function sortModelFromColumnState(\r\n state: readonly ColumnStateItem[],\r\n): SortModel {\r\n const withSort = state\r\n .map((item, index) => ({ item, index }))\r\n .filter(\r\n ({ item }) => item.sort === 'asc' || item.sort === 'desc',\r\n )\r\n .sort((a, b) => {\r\n const ai =\r\n typeof a.item.sortIndex === 'number' ? a.item.sortIndex : a.index;\r\n const bi =\r\n typeof b.item.sortIndex === 'number' ? b.item.sortIndex : b.index;\r\n return ai - bi;\r\n });\r\n return withSort.map(({ item }) => ({\r\n colId: item.colId,\r\n sort: item.sort as SortDirection,\r\n }));\r\n}\r\n\r\nexport function columnStatesEqual(\r\n a: readonly ColumnStateItem[],\r\n b: readonly ColumnStateItem[],\r\n): boolean {\r\n return serializeColumnState(a) === serializeColumnState(b);\r\n}\r\n","import type { PluginHost } from '../../application/plugins/PluginHost';\r\nimport type { ColumnDef } from '../../domain/types/ColumnDef';\r\nimport { isIndexColumn, resolveColumnWidth } from '../../engine/columnWidth';\r\nimport type {\r\n ColumnPinnedState,\r\n ColumnStateItem,\r\n} from '../../engine/dataOps/columnState';\r\nimport { sortModelFromColumnState } from '../../engine/dataOps/columnState';\r\nimport type { SortDirection, SortModel } from '../../engine/dataOps/sortModel';\r\nimport type { FilterModel } from '../../engine/dataOps/filterModel';\r\nimport type { CellRange } from '../../engine/selection/cellRange';\r\nimport type {\r\n ManualResolution,\r\n SyncConflict,\r\n SyncConflictPolicy,\r\n SyncResult,\r\n} from '../../application/ports/SyncPort';\r\nimport type { PresencePeer } from '../../application/ports/PresencePort';\r\nimport type { GetRowId } from '../rows/mapRowData';\r\nimport type { UITableController } from './UITableController';\r\n\r\nexport type GridRowNode<TRow = unknown> = {\r\n id: string;\r\n rowId: number;\r\n data: TRow;\r\n};\r\n\r\n/** Column layout snapshot (PR-115). Includes pin + sort for persist/restore. */\r\nexport type GridColumnState = ColumnStateItem;\r\n\r\nexport type StartEditingCellParams = {\r\n rowId: string | number;\r\n colId: string;\r\n};\r\n\r\nexport type ExportDataAsExcelOptions = {\r\n fileName?: string;\r\n};\r\n\r\nexport type CreateGridApiInput<TRow = unknown> = {\r\n controller: UITableController;\r\n pluginHost: PluginHost;\r\n columnDefs?: ColumnDef<TRow>[];\r\n getRowId?: GetRowId<TRow>;\r\n /** Wired when `rowModelType` is infinite/serverSide (PR-102). */\r\n refreshServerSide?: () => Promise<void>;\r\n};\r\n\r\n/**\r\n * Imperative host API (PR-86). Thin adapter over `UITableController` +\r\n * `PluginHost`. Does not expose `dispatch` or the full controller surface.\r\n */\r\nexport type GridApi<TRow = unknown> = {\r\n getRowNode(id: string | number): GridRowNode<TRow> | undefined;\r\n setRowData(rowData: readonly TRow[]): void;\r\n refreshCells(): void;\r\n getSelectedRows(): TRow[];\r\n deselectAll(): Promise<void>;\r\n startEditingCell(params: StartEditingCellParams): Promise<void>;\r\n stopEditing(cancel?: boolean): void | Promise<void>;\r\n exportDataAsExcel(options?: ExportDataAsExcelOptions): Promise<void>;\r\n undo(): Promise<boolean>;\r\n redo(): Promise<boolean>;\r\n getColumnState(): GridColumnState[];\r\n applyColumnState(state: readonly GridColumnState[]): Promise<void>;\r\n setColumnVisible(colId: string, visible: boolean): void;\r\n /** Measure header + cell text off-DOM and resize columns (PR-112). */\r\n autoSizeColumns(colIds?: string[]): void;\r\n /** Scale column widths to fit the scrollport (PR-112). */\r\n sizeColumnsToFit(containerWidth?: number): void;\r\n getSortModel(): SortModel;\r\n setSortModel(sortModel: SortModel): void;\r\n getQuickFilter(): string;\r\n setQuickFilter(quickFilterText: string): void;\r\n getFilterModel(): FilterModel;\r\n setFilterModel(filterModel: FilterModel): void;\r\n /** Active row-group columns (PR-120). Only the first is used in 0.12.0. */\r\n getRowGroupColumns(): string[];\r\n setRowGroupColumns(columns: readonly string[]): void;\r\n setGroupDefaultExpanded(expanded: boolean): void;\r\n toggleRowGroup(groupKey: string): void;\r\n /** Purge server block cache and refetch (PR-102). */\r\n refreshServerSide(): Promise<void>;\r\n /** Current cell ranges in UI row/column space (PR-105). */\r\n getCellRanges(): readonly CellRange[];\r\n /** Append a normalized range (PR-105). */\r\n addCellRange(range: CellRange): void;\r\n /** Online / offline (PR-137). */\r\n getConnectivity(): 'online' | 'offline';\r\n /** Local data mutations not yet marked synced (PR-137). */\r\n getPendingChangeCount(): number;\r\n markPendingSynced(eventIds?: readonly string[]): void;\r\n /** Push/pull sync when `syncTransport` was configured (PR-138). */\r\n sync(): Promise<SyncResult | null>;\r\n setSyncPolicy(policy: SyncConflictPolicy): void;\r\n getSyncPolicy(): SyncConflictPolicy | undefined;\r\n getOpenSyncConflicts(): readonly SyncConflict[];\r\n resolveSyncConflict(\r\n conflictId: string,\r\n choice: ManualResolution,\r\n ): Promise<void>;\r\n /** Remote peers currently broadcasting a cell cursor (PR-139). */\r\n getPresencePeers(): readonly PresencePeer[];\r\n};\r\n\r\nfunction rowKey(row: { sourceId?: string; id: { value: number } }): string {\r\n return row.sourceId ?? String(row.id.value);\r\n}\r\n\r\nexport function createGridApi<TRow = unknown>(\r\n input: CreateGridApiInput<TRow>,\r\n): GridApi<TRow> {\r\n const { controller, pluginHost } = input;\r\n const columnDefs = input.columnDefs;\r\n const getRowId = input.getRowId;\r\n\r\n const findRow = (id: string | number) => {\r\n const key = String(id);\r\n const rows = controller.getAllRows() ?? [];\r\n return rows.find(\r\n (row) => row.sourceId === key || String(row.id.value) === key,\r\n );\r\n };\r\n\r\n const api: GridApi<TRow> = {\r\n getRowNode(id) {\r\n const row = findRow(id);\r\n if (!row) return undefined;\r\n return {\r\n id: rowKey(row),\r\n rowId: row.id.value,\r\n data: row.data as TRow,\r\n };\r\n },\r\n\r\n setRowData(rowData) {\r\n controller.applyHostRowData(rowData, columnDefs, getRowId);\r\n },\r\n\r\n refreshCells() {\r\n controller.refreshView();\r\n },\r\n\r\n getSelectedRows() {\r\n const selected = controller.getSelectedRows() ?? {};\r\n const rows = controller.getAllRows() ?? [];\r\n return Object.keys(selected)\r\n .map(Number)\r\n .filter((id) => Number.isFinite(id) && Boolean(selected[id]))\r\n .map((id) => rows.find((row) => row.id.value === id)?.data)\r\n .filter((data): data is TRow => data !== undefined);\r\n },\r\n\r\n async deselectAll() {\r\n await controller.dispatch({ type: 'CLEAR_ROW_SELECTION' });\r\n },\r\n\r\n async startEditingCell(params) {\r\n const node = api.getRowNode(params.rowId);\r\n if (!node) return;\r\n await controller.dispatch({\r\n type: 'UI_ACTIVE_CELL',\r\n rowId: node.rowId,\r\n columnId: params.colId,\r\n });\r\n controller.startCellEdit(node.rowId, params.colId);\r\n },\r\n\r\n async stopEditing(cancel?: boolean) {\r\n if (cancel) {\r\n controller.cancelCellEdit();\r\n await controller.clearActiveCell(true);\r\n return;\r\n }\r\n await controller.commitCellEdit();\r\n await controller.clearActiveCell();\r\n },\r\n\r\n async exportDataAsExcel(options) {\r\n await pluginHost.requestExport({\r\n format: 'xlsx',\r\n fileName: options?.fileName,\r\n });\r\n },\r\n\r\n undo() {\r\n return controller.undo();\r\n },\r\n\r\n redo() {\r\n return controller.redo();\r\n },\r\n\r\n getColumnState() {\r\n const view = controller.getViewState();\r\n const widths = view?.columnWidths ?? {};\r\n const columns = view?.columns ?? [];\r\n const sortModel = view?.sortModel ?? [];\r\n return columns.map((col, index) => {\r\n const sortIdx = sortModel.findIndex((s) => s.colId === col.fieldName);\r\n const pinned = (col.columnDef?.pinned ?? null) as ColumnPinnedState;\r\n const item: GridColumnState = {\r\n colId: col.fieldName,\r\n hide: Boolean(col.hidden),\r\n width: resolveColumnWidth(col, widths),\r\n order: col.order ?? index,\r\n pinned,\r\n sort: sortIdx >= 0 ? (sortModel[sortIdx]!.sort as SortDirection) : null,\r\n sortIndex: sortIdx >= 0 ? sortIdx : null,\r\n };\r\n return item;\r\n });\r\n },\r\n\r\n async applyColumnState(state) {\r\n for (const item of state) {\r\n if (typeof item.width === 'number' && Number.isFinite(item.width)) {\r\n await controller.dispatch({\r\n type: 'UI_RESIZE_COLUMN',\r\n columnId: item.colId,\r\n width: item.width,\r\n });\r\n }\r\n if (typeof item.hide === 'boolean') {\r\n await controller.dispatch({\r\n type: 'UI_SET_COLUMN_VISIBLE',\r\n columnId: item.colId,\r\n visible: !item.hide,\r\n });\r\n }\r\n if ('pinned' in item) {\r\n const pinned =\r\n item.pinned === 'start' || item.pinned === 'end'\r\n ? item.pinned\r\n : null;\r\n controller.setColumnPinned(item.colId, pinned);\r\n }\r\n }\r\n\r\n const desiredMovable = state\r\n .map((item) => item.colId)\r\n .filter((colId) => {\r\n if (isIndexColumn({ fieldName: colId })) return false;\r\n return api.getColumnState().some((col) => col.colId === colId);\r\n });\r\n if (desiredMovable.length >= 2) {\r\n for (let i = 0; i < desiredMovable.length; i += 1) {\r\n const now = api.getColumnState();\r\n const from = now.findIndex((col) => col.colId === desiredMovable[i]);\r\n const dest = now\r\n .map((col, idx) => ({ col, idx }))\r\n .filter(({ col }) => !isIndexColumn({ fieldName: col.colId }))[i]\r\n ?.idx;\r\n if (from < 0 || dest === undefined || from === dest) continue;\r\n await controller.dispatch({\r\n type: 'COLUMN_REORDERED',\r\n sourceIndex: from,\r\n destIndex: dest,\r\n });\r\n }\r\n }\r\n\r\n const nextSort = sortModelFromColumnState(state);\r\n const currentSort = api.getSortModel();\r\n const sortChanged =\r\n nextSort.length !== currentSort.length ||\r\n nextSort.some(\r\n (item, i) =>\r\n item.colId !== currentSort[i]?.colId ||\r\n item.sort !== currentSort[i]?.sort,\r\n );\r\n if (sortChanged) {\r\n api.setSortModel(nextSort);\r\n }\r\n },\r\n\r\n setColumnVisible(colId, visible) {\r\n controller.setColumnVisible(colId, visible);\r\n },\r\n\r\n autoSizeColumns(colIds) {\r\n controller.autoSizeColumns(colIds);\r\n },\r\n\r\n sizeColumnsToFit(containerWidth) {\r\n controller.sizeColumnsToFit(containerWidth);\r\n },\r\n\r\n getSortModel() {\r\n return controller.getViewState()?.sortModel ?? [];\r\n },\r\n\r\n setSortModel(sortModel) {\r\n controller.setSortModel(sortModel);\r\n },\r\n\r\n getQuickFilter() {\r\n return controller.getQuickFilterText();\r\n },\r\n\r\n setQuickFilter(quickFilterText) {\r\n controller.setQuickFilterText(quickFilterText);\r\n },\r\n\r\n getFilterModel() {\r\n return controller.getFilterModel();\r\n },\r\n\r\n setFilterModel(filterModel) {\r\n controller.setFilterModel(filterModel);\r\n },\r\n\r\n getRowGroupColumns() {\r\n return controller.getRowGroupColumns();\r\n },\r\n\r\n setRowGroupColumns(columns) {\r\n controller.setRowGroupColumns(columns);\r\n },\r\n\r\n setGroupDefaultExpanded(expanded) {\r\n controller.setGroupDefaultExpanded(expanded);\r\n },\r\n\r\n toggleRowGroup(groupKey) {\r\n controller.toggleRowGroup(groupKey);\r\n },\r\n\r\n async refreshServerSide() {\r\n await input.refreshServerSide?.();\r\n },\r\n\r\n getCellRanges() {\r\n return controller.getCellRanges();\r\n },\r\n\r\n addCellRange(range) {\r\n controller.addCellRange(range);\r\n },\r\n\r\n getConnectivity() {\r\n return controller.getConnectivity();\r\n },\r\n\r\n getPendingChangeCount() {\r\n return controller.getPendingChangeCount();\r\n },\r\n\r\n markPendingSynced(eventIds) {\r\n controller.markPendingSynced(eventIds);\r\n },\r\n\r\n async sync() {\r\n return controller.syncNow();\r\n },\r\n\r\n setSyncPolicy(policy) {\r\n controller.setSyncPolicy(policy);\r\n },\r\n\r\n getSyncPolicy() {\r\n return controller.getSyncPolicy();\r\n },\r\n\r\n getOpenSyncConflicts() {\r\n return controller.getOpenSyncConflicts();\r\n },\r\n\r\n async resolveSyncConflict(conflictId, choice) {\r\n await controller.resolveSyncConflict(conflictId, choice);\r\n },\r\n\r\n getPresencePeers() {\r\n return controller.getPresencePeers();\r\n },\r\n };\r\n\r\n return api;\r\n}\r\n","import {\r\n clampColumnWidth,\r\n type ColumnWidthHint,\r\n} from '../columnWidth';\r\n\r\nexport type TextMeasurer = (text: string) => number;\r\n\r\n/** Horizontal padding added around measured text (cell chrome). */\r\nexport const AUTO_SIZE_PADDING = 16;\r\n\r\nexport function measureTextsWidth(\r\n texts: readonly string[],\r\n measureText: TextMeasurer,\r\n): number {\r\n let max = 0;\r\n for (const text of texts) {\r\n if (!text) continue;\r\n max = Math.max(max, measureText(text));\r\n }\r\n return max;\r\n}\r\n\r\nexport function autoSizeColumnWidth(\r\n column: ColumnWidthHint,\r\n texts: readonly string[],\r\n measureText: TextMeasurer,\r\n padding = AUTO_SIZE_PADDING,\r\n): number {\r\n const content = measureTextsWidth(texts, measureText);\r\n return clampColumnWidth(content + padding, column);\r\n}\r\n\r\nexport type AutoSizeCell = {\r\n display?: unknown;\r\n value?: unknown;\r\n};\r\n\r\nexport type AutoSizeRow = {\r\n cells: Record<string, AutoSizeCell>;\r\n};\r\n\r\n/** Header caption + visible cell strings for auto-size (O(window) capped). */\r\nexport function collectAutoSizeTexts(\r\n column: { fieldName: string; fieldCaption?: string },\r\n rows: readonly AutoSizeRow[],\r\n maxRows = 500,\r\n): string[] {\r\n const texts: string[] = [column.fieldCaption ?? column.fieldName];\r\n const limit = Math.min(rows.length, maxRows);\r\n for (let i = 0; i < limit; i += 1) {\r\n const cell = rows[i]?.cells[column.fieldName];\r\n if (!cell) continue;\r\n const raw = cell.display ?? cell.value;\r\n if (raw != null && raw !== '') texts.push(String(raw));\r\n }\r\n return texts;\r\n}\r\n\r\nexport function autoSizeColumnWidths(\r\n columns: readonly { fieldName: string; fieldCaption?: string }[],\r\n rows: readonly AutoSizeRow[],\r\n measureText: TextMeasurer,\r\n colIds?: readonly string[],\r\n): Record<string, number> {\r\n const targets = colIds?.length\r\n ? columns.filter((c) => colIds.includes(c.fieldName))\r\n : columns;\r\n\r\n const out: Record<string, number> = {};\r\n for (const col of targets) {\r\n const texts = collectAutoSizeTexts(col, rows);\r\n out[col.fieldName] = autoSizeColumnWidth(col, texts, measureText);\r\n }\r\n return out;\r\n}\r\n","import type { TextMeasurer } from '../../engine/dataOps/columnAutoSize';\r\n\r\nconst DEFAULT_FONT =\r\n '12px system-ui, -apple-system, \"Segoe UI\", sans-serif';\r\n\r\nlet canvas: HTMLCanvasElement | null = null;\r\nlet ctx: CanvasRenderingContext2D | null = null;\r\n\r\n/**\r\n * Off-DOM canvas `measureText` (PR-112). Avoids layout reflow during auto-size.\r\n */\r\nexport function createCanvasMeasureText(font = DEFAULT_FONT): TextMeasurer {\r\n if (typeof document !== 'undefined') {\r\n if (!canvas) {\r\n canvas = document.createElement('canvas');\r\n ctx = canvas.getContext('2d');\r\n }\r\n if (ctx) {\r\n ctx.font = font;\r\n return (text: string) => ctx!.measureText(text).width;\r\n }\r\n }\r\n return (text: string) => text.length * 7;\r\n}\r\n","// adapters/ui/UITableController.ts\r\n\r\nimport { AuditLogger } from '../../application/ports/AuditLogger';\r\nimport type { RemoteApi } from '../../application/ports/RemoteApi';\r\nimport { Row } from '../../domain/entities/Row';\r\nimport {\r\n CollectionScope,\r\n Table,\r\n} from '../../domain/entities/Table';\r\nimport { TableActions } from '../../domain/value-objects';\r\nimport { TableEngine } from '../../engine/tableEngine';\r\nimport type { FilterModel } from '../../engine/dataOps/filterModel';\r\nimport type { CellRange } from '../../engine/selection/cellRange';\r\nimport { MOBILE_PAGE_SIZE } from '../../engine/type';\r\nimport type {\r\n GridSearchState,\r\n MobileEditorState,\r\n MobileTableViewState,\r\n ValidationCallbackResult,\r\n ValidCell,\r\n} from '../../engine/type';\r\nimport type {\r\n ChangelogEntry,\r\n ChangelogQuery,\r\n} from '../projections/ChangelogProjection';\r\nimport type { ChangelogProjection } from '../projections/ChangelogProjection';\r\nimport type {\r\n HistoryItem,\r\n HistoryPanelViewModel,\r\n HistoryQuery,\r\n} from '../history/HistoryPanelViewModel';\r\nimport type { CellUndoStack } from '../../application/undo/CellUndoStack';\r\nimport type { GridSession } from '../../application/session/GridSession';\r\nimport type {\r\n Connectivity,\r\n OfflineStatus,\r\n PendingChange,\r\n} from '../../application/offline/OfflineStatus';\r\nimport type {\r\n ManualResolution,\r\n SyncConflict,\r\n SyncConflictPolicy,\r\n SyncPort,\r\n SyncResult,\r\n} from '../../application/ports/SyncPort';\r\nimport type {\r\n PresencePeer,\r\n PresencePort,\r\n} from '../../application/ports/PresencePort';\r\nimport { UIRow } from '../../ui/type';\r\nimport { UITableCommand } from './uiEvents';\r\nimport type { ColumnDef } from '../../domain/types/ColumnDef';\r\nimport type { GetRowId } from '../../infrastructure/rows/mapRowData';\r\nimport {\r\n DEFAULT_GRID_CLIPBOARD_OPTIONS,\r\n type GridClipboardRuntimeOptions,\r\n type PasteGridResult,\r\n} from './gridClipboard';\r\nimport { applyFillHandleDrag } from './gridFillHandle';\r\nimport {\r\n autoSizeColumnWidths,\r\n} from '../../engine/dataOps/columnAutoSize';\r\nimport { sizeColumnsToFitWidths } from '../../engine/dataOps/columnLayout';\r\nimport { isIndexColumn } from '../../engine/columnWidth';\r\nimport { createCanvasMeasureText } from './columnMeasure';\r\n\r\nexport class UITableController {\r\n private disposed = false;\r\n private layoutViewportWidth = 1024;\r\n private clipboardOptions: GridClipboardRuntimeOptions = {\r\n ...DEFAULT_GRID_CLIPBOARD_OPTIONS,\r\n };\r\n private syncPort?: SyncPort;\r\n private presencePort?: PresencePort;\r\n constructor(\r\n private readonly engine: TableEngine,\r\n private readonly store: string,\r\n private readonly tableKey: string,\r\n private readonly audit: AuditLogger,\r\n private readonly changelogProjection?: ChangelogProjection,\r\n private readonly historyPanelViewModel?: HistoryPanelViewModel,\r\n private readonly cellUndoStack?: CellUndoStack,\r\n private readonly session?: GridSession,\r\n private readonly remoteApi?: RemoteApi,\r\n private readonly offlineStatus?: OfflineStatus,\r\n ) {}\r\n\r\n getRemoteApi(): RemoteApi | undefined {\r\n return this.remoteApi;\r\n }\r\n\r\n getOfflineStatus(): OfflineStatus | undefined {\r\n return this.offlineStatus;\r\n }\r\n\r\n getSyncPort(): SyncPort | undefined {\r\n return this.syncPort;\r\n }\r\n\r\n setSyncPort(port: SyncPort | undefined): void {\r\n this.syncPort = port;\r\n }\r\n\r\n getPresencePort(): PresencePort | undefined {\r\n return this.presencePort;\r\n }\r\n\r\n setPresencePort(port: PresencePort | undefined): void {\r\n this.presencePort = port;\r\n }\r\n\r\n getPresencePeers(): readonly PresencePeer[] {\r\n return this.presencePort?.getPeers() ?? [];\r\n }\r\n\r\n subscribePresencePeers(\r\n cb: (peers: readonly PresencePeer[]) => void,\r\n ): () => void {\r\n if (!this.presencePort) {\r\n cb([]);\r\n return () => {};\r\n }\r\n return this.presencePort.subscribe(cb);\r\n }\r\n\r\n /** Broadcast local active cell to peers (no-op without presence). */\r\n publishPresenceCell(rowId: number | null, columnId: string | null): void {\r\n this.presencePort?.setActiveCell(rowId, columnId);\r\n }\r\n\r\n getConnectivity(): Connectivity {\r\n return this.offlineStatus?.getConnectivity() ?? 'online';\r\n }\r\n\r\n getPendingChangeCount(): number {\r\n return this.offlineStatus?.getPendingCount() ?? 0;\r\n }\r\n\r\n getPendingChanges(): readonly PendingChange[] {\r\n return this.offlineStatus?.getPendingChanges() ?? [];\r\n }\r\n\r\n markPendingSynced(eventIds?: readonly string[]): void {\r\n this.offlineStatus?.markSynced(eventIds);\r\n }\r\n\r\n subscribeConnectivity(cb: (state: Connectivity) => void): () => void {\r\n if (!this.offlineStatus) {\r\n cb('online');\r\n return () => {};\r\n }\r\n return this.offlineStatus.subscribeConnectivity(cb);\r\n }\r\n\r\n subscribePendingChanges(\r\n cb: (items: readonly PendingChange[]) => void,\r\n ): () => void {\r\n if (!this.offlineStatus) {\r\n cb([]);\r\n return () => {};\r\n }\r\n return this.offlineStatus.subscribePending(cb);\r\n }\r\n\r\n getSyncPolicy(): SyncConflictPolicy | undefined {\r\n return this.syncPort?.getPolicy();\r\n }\r\n\r\n setSyncPolicy(policy: SyncConflictPolicy): void {\r\n this.syncPort?.setPolicy(policy);\r\n }\r\n\r\n getOpenSyncConflicts(): readonly SyncConflict[] {\r\n return this.syncPort?.getOpenConflicts() ?? [];\r\n }\r\n\r\n subscribeSyncConflicts(\r\n cb: (conflicts: readonly SyncConflict[]) => void,\r\n ): () => void {\r\n if (!this.syncPort) {\r\n cb([]);\r\n return () => {};\r\n }\r\n return this.syncPort.subscribeConflicts(cb);\r\n }\r\n\r\n async syncNow(): Promise<SyncResult | null> {\r\n if (!this.syncPort) return null;\r\n return this.syncPort.sync();\r\n }\r\n\r\n async resolveSyncConflict(\r\n conflictId: string,\r\n choice: ManualResolution,\r\n ): Promise<void> {\r\n await this.syncPort?.resolveConflict(conflictId, choice);\r\n }\r\n\r\n /** Apply a remote cell value (used by SyncPort; dual-writes via engine). */\r\n async applySyncedCellValue(\r\n rowId: number,\r\n columnId: string,\r\n value: unknown,\r\n ): Promise<void> {\r\n await this.engine.dispatch({\r\n type: 'CHANGE_CELL_VALUE',\r\n store: this.store,\r\n tableKey: this.tableKey,\r\n rowId,\r\n columnId,\r\n newValue: value,\r\n });\r\n }\r\n\r\n configureClipboard(options: Partial<GridClipboardRuntimeOptions>): void {\r\n this.clipboardOptions = { ...this.clipboardOptions, ...options };\r\n }\r\n\r\n getClipboardOptions(): GridClipboardRuntimeOptions {\r\n return this.clipboardOptions;\r\n }\r\n\r\n async applyFillHandleDrag(\r\n extendTo: { rowIndex: number; colIndex: number },\r\n copyOnly: boolean,\r\n ): Promise<PasteGridResult> {\r\n return applyFillHandleDrag(\r\n this.engine,\r\n this.store,\r\n this.tableKey,\r\n extendTo,\r\n copyOnly,\r\n this.clipboardOptions,\r\n );\r\n }\r\n\r\n // ─── private dispatch helpers ───────────────────────────────────────\r\n\r\n private safe<T>(fn: () => T, context: string): T | null {\r\n try {\r\n return fn();\r\n } catch (error) {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: `UITableController error in ${context}`,\r\n payload: { error, tableKey: this.tableKey },\r\n });\r\n return null;\r\n }\r\n }\r\n\r\n private changePageSize(pageSize: number): void {\r\n this.engine.dispatch({ type: 'CHANGE_PAGE_SIZE', store: this.store, tableKey: this.tableKey, pageSize });\r\n }\r\n\r\n private changePage(page: number): void {\r\n this.engine.dispatch({ type: 'CHANGE_PAGE', store: this.store, tableKey: this.tableKey, page });\r\n }\r\n\r\n private onCellChange(rowId: number, columnId: string, value: unknown): void {\r\n if (this.engine.isEditingCell(rowId, columnId)) {\r\n this.engine.patchCellEdit(rowId, columnId, { value });\r\n return;\r\n }\r\n // No session (e.g. programmatic / custom cell before activate): write through.\r\n this.engine.dispatch({ type: 'CHANGE_CELL_VALUE', store: this.store, tableKey: this.tableKey, rowId, columnId, newValue: value });\r\n }\r\n\r\n private onDescriptionSave(rowId: number, flag: boolean): void {\r\n this.engine.dispatch({ type: 'SAVE_DESCRIPTION', store: this.store, tableKey: this.tableKey, rowId, flag });\r\n }\r\n\r\n private onCellDisplayChange(rowId: number, columnId: string, value: string): void {\r\n if (this.engine.isEditingCell(rowId, columnId)) {\r\n this.engine.patchCellEdit(rowId, columnId, { display: value });\r\n return;\r\n }\r\n this.engine.dispatch({ type: 'CHANGE_CELL_DISPLAY_VALUE', store: this.store, tableKey: this.tableKey, rowId, columnId, newValue: value });\r\n }\r\n\r\n private setActiveCell(rowId: number, columnId: string): void {\r\n const prev = this.engine.getActiveCell();\r\n if (prev?.rowId === rowId && prev?.columnId === columnId) {\r\n if (\r\n this.engine.getCellEditOptions().singleClickEdit &&\r\n !this.engine.getCellEdit()\r\n ) {\r\n this.engine.startCellEdit(rowId, columnId);\r\n }\r\n this.publishPresenceCell(rowId, columnId);\r\n return;\r\n }\r\n if (prev?.rowId !== rowId) {\r\n // سطر عوض شد: شروط visibility ریموتِ سطر تازهفعالشده دوباره گرفته میشود\r\n // (در حالت ویرایش سطری که مقدار تعیینکننده دارد visibilityCondition میسازد).\r\n void this.engine.dispatch({\r\n type: 'APPLY_ROW_VISIBILITY',\r\n store: this.store,\r\n tableKey: this.tableKey,\r\n rowId,\r\n });\r\n }\r\n this.engine.dispatch({ type: 'ACTIVE_CELL', tableKey: this.tableKey, rowId, columnId });\r\n this.publishPresenceCell(rowId, columnId);\r\n }\r\n\r\n private setActiveRow(rowId: number): void {\r\n this.engine.dispatch({ type: 'ACTIVE_ROW', store: this.store, tableKey: this.tableKey, rowId });\r\n }\r\n\r\n private moveActiveCellVertical(rowId: number, columnId: string, direction: 'up' | 'down'): void {\r\n this.engine.dispatch({ type: 'MOVE_ACTIVE_CELL_VERTICAL', store: this.store, tableKey: this.tableKey, rowId, columnId, direction });\r\n }\r\n\r\n private reorderRow(draggedRowId: number, droppedRowId: number, position: 'before' | 'after'): void {\r\n this.engine.dispatch({ type: 'ROW_REORDERED', store: this.store, tableKey: this.tableKey, draggedRowId, droppedRowId, position });\r\n }\r\n\r\n private reorderColumns(sourceIndex: number, destIndex: number): void {\r\n this.engine.dispatch({\r\n type: 'COLUMN_REORDERED',\r\n store: this.store,\r\n tableKey: this.tableKey,\r\n sourceIndex,\r\n destIndex,\r\n });\r\n }\r\n\r\n private async addEmptyRow(): Promise<void> {\r\n await this.engine.dispatch({\r\n type: 'ADD_EMPTY_ROW',\r\n store: this.store,\r\n tableKey: this.tableKey,\r\n autoActivate: true,\r\n });\r\n }\r\n\r\n private async openMobileAddEditor(): Promise<void> {\r\n await this.addEmptyRow();\r\n const rowId = this.engine.getActiveRow();\r\n if (rowId != null) {\r\n this.setMobileEditor({ mode: 'add', rowId });\r\n }\r\n }\r\n\r\n private addNewRows(cmd: { rows: { key: string; value: unknown; display: unknown }[][]; detailFieldKey: string }): void {\r\n this.engine.dispatch({ type: 'ADD_NEW_ROWS', store: this.store, tableKey: this.tableKey, rows: cmd.rows, detailFieldKey: cmd.detailFieldKey });\r\n }\r\n\r\n private duplicateRow(rowId: number): void {\r\n this.engine.dispatch({ type: 'DUPLICATE_ROW', store: this.store, tableKey: this.tableKey, rowId });\r\n }\r\n\r\n private deleteRow(rowId: number): void {\r\n this.engine.dispatch({ type: 'ROW_DELETED', store: this.store, tableKey: this.tableKey, rowId });\r\n }\r\n\r\n private deleteRows(): void {\r\n this.engine.dispatch({ type: 'ROWS_DELETED', store: this.store, tableKey: this.tableKey });\r\n }\r\n\r\n private deleteTable(): void {\r\n this.engine.dispatch({ type: 'TABLE_DELETED', store: this.store, tableKey: this.tableKey });\r\n }\r\n\r\n private async registerTable(table: Table): Promise<void> {\r\n await this.engine.dispatch({\r\n type: 'TABLE_REGISTERED',\r\n store: this.store,\r\n tableKey: this.tableKey,\r\n table,\r\n });\r\n }\r\n\r\n private async toggleRowExpanded(rowId: number): Promise<void> {\r\n await this.engine.dispatch({ type: 'ROW_EXPAND_TOGGLED', tableKey: this.tableKey, rowId });\r\n }\r\n\r\n private async toggleRowSelect(): Promise<void> {\r\n await this.engine.dispatch({\r\n type: 'TOGGLE_SELECT_ALL_ROWS',\r\n store: this.store,\r\n tableKey: this.tableKey,\r\n });\r\n }\r\n\r\n private async togglePageRowSelect(): Promise<void> {\r\n await this.engine.dispatch({ type: 'TOGGLE_SELECT_PAGE_ROWS', tableKey: this.tableKey });\r\n }\r\n\r\n private async clearRowSelection(): Promise<void> {\r\n await this.engine.dispatch({ type: 'CLEAR_ROW_SELECTION', tableKey: this.tableKey });\r\n }\r\n\r\n private selectFromActiveToLast(activeRowId: number): void {\r\n if (activeRowId == null) return;\r\n this.engine.dispatch({ type: 'SELECT_FROM_ACTIVE_TO_LAST', tableKey: this.tableKey, anchorRowId: activeRowId });\r\n }\r\n\r\n private activateFirstEditableCell(rowId: number): void {\r\n this.engine.dispatch({ type: 'ACTIVATE_FIRST_CELL', tableKey: this.tableKey, rowId });\r\n }\r\n\r\n private moveToNextCell(rowId: number, columnId: string, direction: 'next' | 'prev' = 'next'): void {\r\n this.engine.dispatch({ type: 'MOVE_ACTIVE_CELL', store: this.store, tableKey: this.tableKey, rowId, columnId, direction });\r\n }\r\n\r\n private async setTableAction(action: TableActions): Promise<void> {\r\n await this.engine.dispatch({ type: 'SET_TABLE_ACTION', store: this.store, tableKey: this.tableKey, action });\r\n }\r\n\r\n private async setActiveCollection(activeCollection: string): Promise<void> {\r\n await this.engine.dispatch({ type: 'SET_ACTIVE_COLLECTION', store: this.store, tableKey: this.tableKey, activeCollection });\r\n }\r\n\r\n private setGridSearch(search: GridSearchState): void {\r\n this.engine.dispatch({ type: 'SET_GRID_SEARCH', tableKey: this.tableKey, search });\r\n }\r\n\r\n private setMobileEditor(editor: MobileEditorState): void {\r\n this.engine.dispatch({ type: 'SET_MOBILE_EDITOR', tableKey: this.tableKey, editor });\r\n }\r\n\r\n private resizeColumn(columnId: string, width: number): void {\r\n this.engine.dispatch({ type: 'RESIZE_COLUMN', tableKey: this.tableKey, columnId, width });\r\n }\r\n\r\n setColumnVisible(columnId: string, visible: boolean): void {\r\n this.engine.dispatch({\r\n type: 'SET_COLUMN_VISIBLE',\r\n tableKey: this.tableKey,\r\n columnId,\r\n visible,\r\n });\r\n }\r\n\r\n setLayoutViewportWidth(width: number): void {\r\n if (Number.isFinite(width) && width > 0) {\r\n this.layoutViewportWidth = width;\r\n }\r\n }\r\n\r\n getLayoutViewportWidth(): number {\r\n return this.layoutViewportWidth;\r\n }\r\n\r\n /** Measure header + cell text off-DOM and resize columns (PR-112). */\r\n autoSizeColumns(colIds?: string[]): void {\r\n const view = this.getViewState();\r\n if (!view) return;\r\n const measure = createCanvasMeasureText();\r\n const visible = view.columns.filter((c) => !c.hidden);\r\n const targets = colIds?.length\r\n ? visible.filter((c) => colIds.includes(c.fieldName))\r\n : visible.filter((c) => !isIndexColumn(c));\r\n const widths = autoSizeColumnWidths(targets, view.rows, measure, colIds);\r\n for (const [columnId, width] of Object.entries(widths)) {\r\n this.resizeColumn(columnId, width);\r\n }\r\n }\r\n\r\n setColumnPinned(columnId: string, pinned: 'start' | 'end' | null): void {\r\n this.engine.dispatch({\r\n type: 'SET_COLUMN_PIN',\r\n tableKey: this.tableKey,\r\n columnId,\r\n pinned,\r\n });\r\n }\r\n\r\n toggleColumnGroup(groupId: string): void {\r\n this.engine.dispatch({\r\n type: 'TOGGLE_COLUMN_GROUP',\r\n tableKey: this.tableKey,\r\n groupId,\r\n });\r\n }\r\n\r\n /** Scale column widths to fit the last known scrollport width (PR-112). */\r\n sizeColumnsToFit(containerWidth?: number): void {\r\n const view = this.getViewState();\r\n if (!view) return;\r\n const width = containerWidth ?? this.layoutViewportWidth;\r\n const widths = sizeColumnsToFitWidths(view.columns, view.columnWidths, width);\r\n for (const [columnId, w] of Object.entries(widths)) {\r\n this.resizeColumn(columnId, w);\r\n }\r\n }\r\n\r\n /** Session-only sort (PR-90). Empty model restores document `index` order. */\r\n setSortModel(\r\n sortModel: readonly { colId: string; sort: 'asc' | 'desc' }[],\r\n ): void {\r\n this.safe(\r\n () =>\r\n this.engine.dispatch({\r\n type: 'SET_SORT_MODEL',\r\n tableKey: this.tableKey,\r\n sortModel,\r\n }),\r\n 'setSortModel',\r\n );\r\n }\r\n\r\n /** Session-only quick filter (PR-93). Empty string shows all rows. */\r\n setQuickFilterText(quickFilterText: string): void {\r\n this.safe(\r\n () =>\r\n this.engine.dispatch({\r\n type: 'SET_QUICK_FILTER_TEXT',\r\n tableKey: this.tableKey,\r\n quickFilterText,\r\n }),\r\n 'setQuickFilterText',\r\n );\r\n }\r\n\r\n getQuickFilterText(): string {\r\n return this.safe(\r\n () => this.engine.getViewState()?.quickFilterText ?? '',\r\n 'getQuickFilterText',\r\n ) ?? '';\r\n }\r\n\r\n /** Session-only column filter model (PR-94). */\r\n setFilterModel(filterModel: FilterModel): void {\r\n this.safe(\r\n () =>\r\n this.engine.dispatch({\r\n type: 'SET_FILTER_MODEL',\r\n tableKey: this.tableKey,\r\n filterModel,\r\n }),\r\n 'setFilterModel',\r\n );\r\n }\r\n\r\n /** Session-only row grouping (PR-120). Only the first column is active. */\r\n setRowGroupColumns(columns: readonly string[]): void {\r\n this.safe(\r\n () =>\r\n this.engine.dispatch({\r\n type: 'SET_ROW_GROUP_COLUMNS',\r\n tableKey: this.tableKey,\r\n columns,\r\n }),\r\n 'setRowGroupColumns',\r\n );\r\n }\r\n\r\n getRowGroupColumns(): string[] {\r\n return (\r\n this.safe(\r\n () => this.engine.getViewState()?.rowGroupColumns ?? [],\r\n 'getRowGroupColumns',\r\n ) ?? []\r\n );\r\n }\r\n\r\n setGroupDefaultExpanded(expanded: boolean): void {\r\n this.safe(\r\n () =>\r\n this.engine.dispatch({\r\n type: 'SET_GROUP_DEFAULT_EXPANDED',\r\n tableKey: this.tableKey,\r\n expanded,\r\n }),\r\n 'setGroupDefaultExpanded',\r\n );\r\n }\r\n\r\n toggleRowGroup(groupKey: string): void {\r\n this.safe(\r\n () =>\r\n this.engine.dispatch({\r\n type: 'TOGGLE_ROW_GROUP',\r\n tableKey: this.tableKey,\r\n groupKey,\r\n }),\r\n 'toggleRowGroup',\r\n );\r\n }\r\n\r\n getFilterModel(): FilterModel {\r\n return (\r\n this.safe(\r\n () => this.engine.getViewState()?.filterModel ?? {},\r\n 'getFilterModel',\r\n ) ?? {}\r\n );\r\n }\r\n\r\n // ─── public read API ────────────────────────────────────────────────\r\n\r\n getViewState() {\r\n return this.safe(() => this.engine.getViewState(), 'getViewState');\r\n }\r\n\r\n applyHostRowData<TRow>(\r\n rowData: readonly TRow[],\r\n columnDefs?: ColumnDef<TRow>[],\r\n getRowId?: GetRowId<TRow>,\r\n ): void {\r\n this.safe(\r\n () => this.engine.applyHostRowData(rowData, columnDefs, getRowId),\r\n 'applyHostRowData',\r\n );\r\n }\r\n\r\n getMobileViewState(): MobileTableViewState | null | undefined {\r\n return this.safe(\r\n () => this.engine.getMobileViewState(),\r\n 'getMobileViewState',\r\n );\r\n }\r\n\r\n getRowView(rowId: number): UIRow | null {\r\n return this.safe(() => this.engine.getRowView(rowId), 'getRowView');\r\n }\r\n\r\n getAllRows(): Row[] | null {\r\n return this.safe(() => this.engine.getAllRows(), 'getAllRows');\r\n }\r\n\r\n getAllUIRows() {\r\n return this.safe(() => this.engine.getAllUIRows(), 'getAllUIRows');\r\n }\r\n\r\n getUiRowAbsoluteIndex(rowId: number): number {\r\n return this.safe(\r\n () => this.engine.getUiRowAbsoluteIndex(rowId),\r\n 'getUiRowAbsoluteIndex',\r\n ) ?? -1;\r\n }\r\n\r\n findColumnSearchMatches(columnId: string, query: string) {\r\n return (\r\n this.safe(\r\n () => this.engine.findColumnSearchMatches(columnId, query),\r\n 'findColumnSearchMatches',\r\n ) ?? []\r\n );\r\n }\r\n\r\n getColumnTotals(): Record<string, number> {\r\n return this.safe(() => this.engine.getColumnTotals(), 'getColumnTotals') ?? {};\r\n }\r\n\r\n getColumnAggs(): Record<string, unknown> {\r\n return this.safe(() => this.engine.getColumnAggs(), 'getColumnAggs') ?? {};\r\n }\r\n\r\n getColumnAggValue(\r\n columnId: string,\r\n overrideAgg?: import('../../domain/types/ColumnDef').AggFunc,\r\n ): unknown {\r\n return this.safe(\r\n () => this.engine.getColumnAggValue(columnId, overrideAgg),\r\n 'getColumnAggValue',\r\n );\r\n }\r\n\r\n subscribeColumnTotals(cb: (totals: Record<string, number>) => void) {\r\n return this.safe(() => this.engine.subscribeColumnTotals(cb), 'subscribeColumnTotals');\r\n }\r\n\r\n subscribeColumnAggs(cb: (aggs: Record<string, unknown>) => void) {\r\n return this.safe(() => this.engine.subscribeColumnAggs(cb), 'subscribeColumnAggs');\r\n }\r\n\r\n getSnapShot(collectionScope?: CollectionScope) {\r\n return this.safe(() => this.engine.getSnapShot(collectionScope ?? \"active\"), 'getSnapShot');\r\n }\r\n\r\n /** True in persistence 'paged-idb' mode (RAM holds one page window). */\r\n isPagedWindow(): boolean {\r\n return this.engine.isPagedWindow();\r\n }\r\n\r\n /** Full IndexedDB snapshot for server save / export. */\r\n async getFullSnapShot(collectionScope?: CollectionScope) {\r\n try {\r\n return await this.engine.getFullSnapShot(\r\n this.store,\r\n collectionScope ?? 'active',\r\n );\r\n } catch (e) {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: 'getFullSnapShot failed',\r\n payload: e,\r\n });\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Stream serialized row records from IndexedDB in bounded batches (no full\r\n * load). Heap holds one batch at a time. Return false from onBatch to stop.\r\n */\r\n async iterateRowsFromDb(\r\n collectionScope: CollectionScope,\r\n onBatch: (\r\n records: {\r\n rowId: number;\r\n collection: string;\r\n sortIndex: number;\r\n rowState: string;\r\n cells: Record<string, { value: unknown; originalValue: unknown; display: unknown }>;\r\n }[],\r\n ordinalBase: number,\r\n ) => Promise<boolean | void>,\r\n batchSize?: number,\r\n ): Promise<void> {\r\n try {\r\n await this.engine.iterateRowsFromDb(\r\n this.store,\r\n collectionScope,\r\n onBatch,\r\n batchSize,\r\n );\r\n } catch (e) {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: 'iterateRowsFromDb failed',\r\n payload: e,\r\n });\r\n }\r\n }\r\n\r\n getCell(rowId: number, columnId: string) {\r\n return this.safe(() => this.engine.getCell(rowId, columnId), 'getCell');\r\n }\r\n\r\n getChangelog(filter: Omit<ChangelogQuery, 'tableId'> = {}): ChangelogEntry[] {\r\n if (!this.changelogProjection) return [];\r\n return this.safe(\r\n () => this.changelogProjection!.query({ tableId: this.tableKey, ...filter }),\r\n 'getChangelog',\r\n ) ?? [];\r\n }\r\n\r\n getChangelogCount(filter: Omit<ChangelogQuery, 'tableId'> = {}): number {\r\n if (!this.changelogProjection) return 0;\r\n return this.safe(\r\n () => this.changelogProjection!.count({ tableId: this.tableKey, ...filter }),\r\n 'getChangelogCount',\r\n ) ?? 0;\r\n }\r\n\r\n subscribeChangelog(\r\n cb: (entries: ChangelogEntry[]) => void,\r\n filter: Omit<ChangelogQuery, 'tableId'> = {},\r\n ): () => void {\r\n if (!this.changelogProjection) return () => {};\r\n return this.safe(\r\n () => this.changelogProjection!.subscribe(cb, { tableId: this.tableKey, ...filter }),\r\n 'subscribeChangelog',\r\n ) ?? (() => {});\r\n }\r\n\r\n getHistoryItems(filter: Omit<HistoryQuery, 'tableId'> = {}): HistoryItem[] {\r\n if (!this.historyPanelViewModel) return [];\r\n return this.safe(\r\n () => this.historyPanelViewModel!.query({ tableId: this.tableKey, ...filter }),\r\n 'getHistoryItems',\r\n ) ?? [];\r\n }\r\n\r\n getHistoryItemCount(filter: Omit<HistoryQuery, 'tableId'> = {}): number {\r\n if (!this.historyPanelViewModel) return 0;\r\n return this.safe(\r\n () => this.historyPanelViewModel!.count({ tableId: this.tableKey, ...filter }),\r\n 'getHistoryItemCount',\r\n ) ?? 0;\r\n }\r\n\r\n subscribeHistoryItems(\r\n cb: (items: HistoryItem[]) => void,\r\n filter: Omit<HistoryQuery, 'tableId'> = {},\r\n ): () => void {\r\n if (!this.historyPanelViewModel) return () => {};\r\n return this.safe(\r\n () => this.historyPanelViewModel!.subscribe(cb, { tableId: this.tableKey, ...filter }),\r\n 'subscribeHistoryItems',\r\n ) ?? (() => {});\r\n }\r\n\r\n canUndo(): boolean {\r\n return this.cellUndoStack?.canUndo() ?? false;\r\n }\r\n\r\n canRedo(): boolean {\r\n return this.cellUndoStack?.canRedo() ?? false;\r\n }\r\n\r\n async undo(): Promise<boolean> {\r\n if (!this.cellUndoStack) return false;\r\n try {\r\n return await this.cellUndoStack.undo(this.store, (command) =>\r\n this.engine.dispatch(command),\r\n );\r\n } catch (error) {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: 'UITableController.undo failed',\r\n payload: { error, tableKey: this.tableKey },\r\n });\r\n return false;\r\n }\r\n }\r\n\r\n async redo(): Promise<boolean> {\r\n if (!this.cellUndoStack) return false;\r\n try {\r\n return await this.cellUndoStack.redo(this.store, (command) =>\r\n this.engine.dispatch(command),\r\n );\r\n } catch (error) {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: 'UITableController.redo failed',\r\n payload: { error, tableKey: this.tableKey },\r\n });\r\n return false;\r\n }\r\n }\r\n\r\n getActiveRow() {\r\n return this.safe(() => this.engine.getActiveRow(), 'getActiveRow');\r\n }\r\n\r\n getSelectedRows(): Record<number, boolean> | null | undefined {\r\n return this.safe(() => this.engine.getSelectedRows(), 'getSelectedRows');\r\n }\r\n\r\n getActiveCell() {\r\n return this.safe(() => this.engine.getActiveCell(), 'getActiveCell');\r\n }\r\n\r\n refreshView(): void {\r\n this.safe(() => this.engine.refreshView(), 'refreshView');\r\n }\r\n\r\n clearActiveCell(cancel?: boolean): Promise<void> {\r\n return (\r\n this.safe(\r\n () => this.engine.clearActiveCell({ cancel: cancel === true }),\r\n 'clearActiveCell',\r\n ) ?? Promise.resolve()\r\n );\r\n }\r\n\r\n startCellEdit(rowId: number, columnId: string): void {\r\n this.safe(() => this.engine.startCellEdit(rowId, columnId), 'startCellEdit');\r\n }\r\n\r\n cancelCellEdit(): void {\r\n this.safe(() => this.engine.cancelCellEdit(), 'cancelCellEdit');\r\n }\r\n\r\n commitCellEdit(): Promise<number> {\r\n return (\r\n this.safe(() => this.engine.commitCellEdit(), 'commitCellEdit') ??\r\n Promise.resolve(0)\r\n );\r\n }\r\n\r\n getEditDraft(rowId: number, columnId: string) {\r\n return this.safe(\r\n () => this.engine.getEditDraft(rowId, columnId),\r\n 'getEditDraft',\r\n );\r\n }\r\n\r\n isEditingCell(rowId: number, columnId: string) {\r\n return (\r\n this.safe(\r\n () => this.engine.isEditingCell(rowId, columnId),\r\n 'isEditingCell',\r\n ) ?? false\r\n );\r\n }\r\n getMobileEditor(){\r\n return this.safe(() => this.engine.getMobileEditor(), 'getMobileEditor');\r\n }\r\n\r\n resetMobileVisibleRows(size: number = MOBILE_PAGE_SIZE): void {\r\n this.changePageSize(size);\r\n }\r\n\r\n loadMoreMobileRows(step: number = MOBILE_PAGE_SIZE): void {\r\n const mobileView = this.getMobileViewState();\r\n if (!mobileView) return;\r\n const nextPageSize = Math.min(\r\n mobileView.totalRows,\r\n mobileView.pageSize + step,\r\n );\r\n if (nextPageSize !== mobileView.pageSize) {\r\n this.changePageSize(nextPageSize);\r\n }\r\n }\r\n\r\n revealAllMobileRows(minSize: number = MOBILE_PAGE_SIZE): void {\r\n const mobileView = this.getMobileViewState();\r\n if (!mobileView) return;\r\n const nextPageSize = Math.max(minSize, mobileView.totalRows);\r\n if (nextPageSize !== mobileView.pageSize) {\r\n this.changePageSize(nextPageSize);\r\n }\r\n }\r\n\r\n isActiveCell(rowId: number, columnId: string) {\r\n return this.safe(() => this.engine.isActiveCell(rowId, columnId), 'isActiveCell');\r\n }\r\n\r\n isActiveRow(rowId: number) {\r\n return this.safe(() => this.engine.isActiveRow(rowId), 'isActiveRow');\r\n }\r\n\r\n isSelectedRow(rowId: number) {\r\n return this.safe(() => this.engine.isSelectedRow(rowId), 'isSelectedRow');\r\n }\r\n\r\n isCutRow(rowId: number) {\r\n return this.safe(() => this.engine.isCutRow(rowId), 'isCutRow');\r\n }\r\n\r\n subscribe(cb: () => void) {\r\n return this.safe(() => this.engine.subscribe(cb), 'subscribe');\r\n }\r\n\r\n subscribeSelected<TSelected>(\r\n selector: () => TSelected,\r\n listener: (selected: TSelected) => void,\r\n isEqual: (a: TSelected, b: TSelected) => boolean = Object.is,\r\n ): () => void {\r\n if (this.session) {\r\n return this.session.subscribeSelected(selector, listener, isEqual);\r\n }\r\n return (\r\n this.safe(\r\n () => this.engine.subscribeSelected(selector, listener, isEqual),\r\n 'subscribeSelected',\r\n ) ?? (() => {})\r\n );\r\n }\r\n\r\n getSession(): GridSession | undefined {\r\n return this.session;\r\n }\r\n\r\n getTableKey(): string {\r\n return this.tableKey;\r\n }\r\n\r\n /**\r\n * Streamed column subscription (Memory Iron Rule compliant): every row's\r\n * {id, rowNum, value} is folded into via (heap = one batch,\r\n * never the full dataset); fires only when the column data changed.\r\n *\r\n * Legacy form (cb receives the\r\n * item array) is still supported.\r\n */\r\n subscribeColumn<T>(\r\n columnId: string,\r\n collections: CollectionScope,\r\n reducer: (acc: T, item: { id: number; rowNum: unknown; value: unknown }) => T,\r\n seed: T,\r\n cb: (acc: T) => void,\r\n ): (() => void) | null;\r\n subscribeColumn<T>(\r\n columnId: string,\r\n collections: CollectionScope,\r\n cb: (values: Array<{ id: number; rowNum: unknown; value: T }>) => void,\r\n ): (() => void) | null;\r\n subscribeColumn(\r\n columnId: string,\r\n collections: CollectionScope,\r\n ...rest: unknown[]\r\n ): (() => void) | null {\r\n if (rest.length === 1 && typeof rest[0] === 'function') {\r\n const legacyCb = rest[0] as (\r\n values: Array<{ id: number; rowNum: unknown; value: unknown }>,\r\n ) => void;\r\n return this.engine.subscribeColumn<\r\n Array<{ id: number; rowNum: unknown; value: unknown }>\r\n >(\r\n columnId,\r\n collections,\r\n (acc, item) => {\r\n acc.push(item);\r\n return acc;\r\n },\r\n [] as Array<{ id: number; rowNum: unknown; value: unknown }>,\r\n legacyCb,\r\n this.store,\r\n );\r\n }\r\n const [reducer, seed, cb] = rest as [\r\n (acc: unknown, item: { id: number; rowNum: unknown; value: unknown }) => unknown,\r\n unknown,\r\n (acc: unknown) => void,\r\n ];\r\n return this.engine.subscribeColumn(\r\n columnId,\r\n collections,\r\n reducer,\r\n seed,\r\n cb,\r\n this.store,\r\n );\r\n }\r\n validation: () => (callback: (result: ValidationCallbackResult) => void) => void = () => (callback) => {\r\n this.engine.validation((result) => {\r\n callback(result);\r\n });\r\n }\r\n isValidCell(rowId: number, columnId: string): ValidCell | null {\r\n try {\r\n return this.engine.isValidCell(rowId, columnId);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n // ─── row interactions ────────────────────────────────────────────────\r\n\r\n onRowClick(rowId: number, modifiers: { ctrlKey: boolean; shiftKey: boolean }): void {\r\n if (modifiers.shiftKey) {\r\n this.engine.dispatch({ type: 'ROW_RANGE_SELECTED', tableKey: this.tableKey, rowId });\r\n } else if (modifiers.ctrlKey) {\r\n this.engine.dispatch({ type: 'ROW_SELECTION_TOGGLED', tableKey: this.tableKey, rowId });\r\n } else {\r\n this.engine.dispatch({ type: 'ACTIVE_ROW', store: this.store, tableKey: this.tableKey, rowId });\r\n }\r\n }\r\n\r\n onRowSelect(rowId: number): void {\r\n this.engine.dispatch({ type: 'ROW_SELECTION_TOGGLED', tableKey: this.tableKey, rowId });\r\n }\r\n\r\n getCellRanges() {\r\n return this.engine.getCellRanges();\r\n }\r\n\r\n addCellRange(range: CellRange): void {\r\n this.engine.addCellRange(range);\r\n }\r\n\r\n // ─── lifecycle ───────────────────────────────────────────────────────\r\n\r\n dispose(): void {\r\n if (this.disposed) return;\r\n this.disposed = true;\r\n this.presencePort?.dispose();\r\n this.presencePort = undefined;\r\n void this.engine.dispatch({ type: 'TABLE_DISPOSED', store: this.store, tableKey: this.tableKey });\r\n }\r\n\r\n // ─── main dispatch ───────────────────────────────────────────────────\r\n\r\n async dispatch(command: UITableCommand): Promise<void> {\r\n if (this.disposed) return;\r\n try {\r\n await this.dispatchInternal(command);\r\n } catch (error) {\r\n this.audit.log({\r\n type: 'ERROR',\r\n message: `UITableController.dispatch failed for command \"${command.type}\"`,\r\n payload: { error, tableKey: this.tableKey, command },\r\n });\r\n }\r\n }\r\n\r\n private async dispatchInternal(command: UITableCommand): Promise<void> {\r\n switch (command.type) {\r\n case 'CHANGE_PAGE_SIZE':\r\n this.changePageSize(command.pageSize);\r\n return;\r\n case 'CHANGE_PAGE':\r\n this.changePage(command.page);\r\n return;\r\n case 'UI_CELL_CHANGE':\r\n this.onCellChange(command.rowId, command.columnId, command.value);\r\n return;\r\n case 'UI_DESCRIPTION_SAVE':\r\n this.onDescriptionSave(command.rowId, command.flag);\r\n return;\r\n case 'UI_CELL_CHANGE_DISPLAY':\r\n this.onCellDisplayChange(command.rowId, command.columnId, command.value);\r\n return;\r\n case 'ADD_EMPTY_ROW':\r\n await this.addEmptyRow();\r\n return;\r\n case 'ADD_NEW_ROWS':\r\n this.addNewRows(command);\r\n return;\r\n case 'DUPLICATE_ROW':\r\n this.duplicateRow(command.rowId);\r\n return;\r\n case 'ROW_DELETED':\r\n this.deleteRow(command.rowId);\r\n return;\r\n case 'UI_DELETE_SELECTED_ROW':\r\n this.deleteRows();\r\n return;\r\n case 'TABLE_DELETED':\r\n this.deleteTable();\r\n return;\r\n case 'TOGGLE_ROW_EXPANDED':\r\n await this.toggleRowExpanded(command.rowId);\r\n return;\r\n case 'ROW_REORDERED':\r\n this.reorderRow(command.draggedRowId, command.droppedRowId, command.position);\r\n return;\r\n case 'COLUMN_REORDERED':\r\n this.reorderColumns(command.sourceIndex, command.destIndex);\r\n return;\r\n case 'TABLE_REGISTERED':\r\n await this.registerTable(command.table);\r\n return;\r\n case 'UI_ACTIVE_FIRST_CELL':\r\n this.activateFirstEditableCell(command.rowId);\r\n return;\r\n case 'UI_ACTIVE_CELL':\r\n this.engine.handleCellRangePointer(command.rowId, command.columnId, {\r\n shiftKey: Boolean(command.shiftKey),\r\n ctrlKey: Boolean(command.ctrlKey),\r\n });\r\n this.setActiveCell(command.rowId, command.columnId);\r\n return;\r\n case 'UI_MOVE_ACTIVE_CELL':\r\n this.moveToNextCell(command.rowId, command.columnId, command.direction);\r\n return;\r\n case 'UI_MOVE_ACTIVE_CELL_VERTICAL':\r\n this.moveActiveCellVertical(command.rowId, command.columnId, command.direction);\r\n return;\r\n case 'UI_ACTIVE_ROW':\r\n this.setActiveRow(command.rowId);\r\n return;\r\n case 'KEY_DOWN':\r\n if (this.session) {\r\n await this.session.handleKeydown(command.event, command.ctx);\r\n }\r\n return;\r\n case 'TOGGLE_ROW_SELECTED':\r\n await this.toggleRowSelect();\r\n return;\r\n case 'ROW_SELECTED':\r\n await this.toggleRowSelect();\r\n return;\r\n case 'TOGGLE_PAGE_ROW_SELECTED':\r\n await this.togglePageRowSelect();\r\n return;\r\n case 'CLEAR_ROW_SELECTION':\r\n await this.clearRowSelection();\r\n return;\r\n case 'UI_ACTION_TABLE':\r\n await this.setTableAction(command.action);\r\n return;\r\n case 'UI_CHANGE_ACTIVE_COLLECTION':\r\n await this.setActiveCollection(command.activeCollection);\r\n return;\r\n case 'UI_SET_GRID_SEARCH':\r\n this.setGridSearch(command.search);\r\n return;\r\n case 'UI_CLEAR_GRID_SEARCH':\r\n this.setGridSearch(null);\r\n return;\r\n case 'UI_OPEN_MOBILE_ADD':\r\n await this.openMobileAddEditor();\r\n return;\r\n case 'UI_OPEN_MOBILE_EDIT':\r\n this.setActiveRow(command.rowId);\r\n this.setMobileEditor({ mode: 'edit', rowId: command.rowId });\r\n return;\r\n case 'UI_CLOSE_MOBILE_EDITOR':\r\n this.setMobileEditor(null);\r\n return;\r\n case 'UI_RESIZE_COLUMN':\r\n this.resizeColumn(command.columnId, command.width);\r\n return;\r\n case 'UI_SET_COLUMN_VISIBLE':\r\n this.setColumnVisible(command.columnId, command.visible);\r\n return;\r\n case 'UI_SET_SORT_MODEL':\r\n this.setSortModel(command.sortModel);\r\n return;\r\n case 'UI_SET_QUICK_FILTER_TEXT':\r\n this.setQuickFilterText(command.quickFilterText);\r\n return;\r\n case 'UI_SET_FILTER_MODEL':\r\n this.setFilterModel(command.filterModel);\r\n return;\r\n case 'UI_SET_ROW_GROUP_COLUMNS':\r\n this.setRowGroupColumns(command.columns);\r\n return;\r\n case 'UI_SET_GROUP_DEFAULT_EXPANDED':\r\n this.setGroupDefaultExpanded(command.expanded);\r\n return;\r\n case 'UI_TOGGLE_ROW_GROUP':\r\n this.toggleRowGroup(command.groupKey);\r\n return;\r\n default: {\r\n const _exhaustive: never = command;\r\n return _exhaustive;\r\n }\r\n }\r\n }\r\n}","import { RowStateEnum } from '../../domain/value-objects';\r\nimport type { CollectionScope } from '../../domain/entities/Table';\r\nimport type { TableEngine } from '../../engine/tableEngine';\r\nimport type { UIRow } from '../../ui/type';\r\nimport type {\r\n ExportRowSource,\r\n ExportSource,\r\n GridQueryPort,\r\n} from './GridPlugin';\r\n\r\nconst hasMeaningfulValue = (value: unknown) =>\r\n value !== undefined && value !== null && value !== '';\r\n\r\nfunction cellsFromUiRow(row: UIRow): ExportRowSource['cells'] {\r\n const cells: Record<string, { value: unknown; display?: unknown }> = {};\r\n for (const [key, cell] of Object.entries(row.cells)) {\r\n cells[key] = { value: cell.value, display: cell.display };\r\n }\r\n return cells;\r\n}\r\n\r\n/**\r\n * Adapter: TableEngine → GridQueryPort for export plugins.\r\n * When row grouping is active, projects the flat UI index (group + leaf).\r\n */\r\nexport function createEngineGridQuery(engine: TableEngine): GridQueryPort {\r\n return {\r\n getSnapShot(collectionScope: CollectionScope = 'active') {\r\n return engine.getSnapShot(collectionScope);\r\n },\r\n\r\n getExportSource(collectionScope: CollectionScope = 'active'): ExportSource | null {\r\n const view = engine.getViewState();\r\n if (!view) return null;\r\n\r\n const columns = (\r\n view.activeCollectionColumn?.length\r\n ? view.activeCollectionColumn\r\n : (view.columns ?? [])\r\n )\r\n .filter((col) => col.fieldType !== 'index')\r\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\r\n .map((col) => ({\r\n fieldName: col.fieldName,\r\n fieldCaption: col.fieldCaption,\r\n fieldType: col.fieldType,\r\n order: col.order,\r\n }));\r\n\r\n const uiRows = engine.getAllUIRows() ?? [];\r\n const grouped = uiRows.some((r) => r.rowKind === 'group');\r\n\r\n let rows: ExportRowSource[];\r\n if (grouped) {\r\n rows = uiRows\r\n .filter((row) => {\r\n if (row.rowKind === 'group') return true;\r\n return row.rowState !== RowStateEnum.Deleted;\r\n })\r\n .map((row) => {\r\n if (row.rowKind === 'group') {\r\n return {\r\n id: row.id,\r\n rowState: String(row.rowState),\r\n cells: cellsFromUiRow(row),\r\n kind: 'group' as const,\r\n groupKey: row.groupKey,\r\n outlineLevel: 0,\r\n };\r\n }\r\n return {\r\n id: row.id,\r\n rowState: String(row.rowState),\r\n cells: cellsFromUiRow(row),\r\n kind: 'leaf' as const,\r\n outlineLevel: 1,\r\n };\r\n });\r\n } else {\r\n rows = (engine.getAllRows() ?? [])\r\n .filter((row) => {\r\n if (row.rowState.value === RowStateEnum.Deleted) return false;\r\n return Array.from(row.getCells().entries()).some(\r\n ([key, cell]) =>\r\n key !== 'index' && hasMeaningfulValue(cell.getValue()),\r\n );\r\n })\r\n .map((row) => ({\r\n id: row.id.value,\r\n rowState: String(row.rowState.value),\r\n cells: Object.fromEntries(\r\n [...row.getCells()].map(([key, cell]) => [\r\n key,\r\n {\r\n value: cell.getValue(),\r\n display: cell.getDisplay(),\r\n },\r\n ]),\r\n ),\r\n kind: 'leaf' as const,\r\n }));\r\n }\r\n\r\n void collectionScope;\r\n\r\n return { columns, rows };\r\n },\r\n };\r\n}\r\n","import type { EventStore } from '../ports/EventStore';\r\nimport type { GridSession } from '../session/GridSession';\r\nimport type { GridEvent } from '../../domain/types/GridEvent';\r\nimport type {\r\n ExportRequestedPayload,\r\n ImportRequestedPayload,\r\n} from '../../domain/types/GridEvent';\r\nimport type {\r\n GridPlugin,\r\n GridPluginContext,\r\n GridQueryPort,\r\n PluginEventBus,\r\n} from './GridPlugin';\r\n\r\nexport type RequestExportOptions = {\r\n format: 'xlsx' | 'pdf' | 'csv';\r\n collectionScope?: ExportRequestedPayload['collectionScope'];\r\n correlationId?: string;\r\n fileName?: string;\r\n sheetName?: string;\r\n direction?: 'rtl' | 'ltr';\r\n};\r\n\r\nexport type RequestImportOptions = {\r\n format: 'xlsx';\r\n data: Blob | ArrayBuffer | Uint8Array;\r\n collectionScope?: ImportRequestedPayload['collectionScope'];\r\n correlationId?: string;\r\n sheetName?: string;\r\n};\r\n\r\nexport type PluginHostDeps = {\r\n tableId: string;\r\n actorId: string;\r\n eventStore: EventStore;\r\n session: GridSession;\r\n query: GridQueryPort;\r\n};\r\n\r\nfunction createEventId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\r\n}\r\n\r\nasync function toUint8Array(\r\n data: Blob | ArrayBuffer | Uint8Array,\r\n): Promise<Uint8Array> {\r\n if (data instanceof Uint8Array) return data;\r\n if (data instanceof ArrayBuffer) return new Uint8Array(data);\r\n return new Uint8Array(await data.arrayBuffer());\r\n}\r\n\r\n/**\r\n * Registers plugins and publishes plugin/view-stream events (e.g. EXPORT_REQUESTED).\r\n */\r\nexport class PluginHost {\r\n private readonly plugins: GridPlugin[] = [];\r\n private readonly disposers: Array<() => void> = [];\r\n private readonly importPayloads = new Map<string, Uint8Array>();\r\n private version = 0;\r\n\r\n constructor(private readonly deps: PluginHostDeps) {}\r\n\r\n private takeImportPayload(correlationId: string): Uint8Array | undefined {\r\n return this.importPayloads.get(correlationId);\r\n }\r\n\r\n private createBus(): PluginEventBus {\r\n const { eventStore, tableId, actorId } = this.deps;\r\n const viewStreamId = `table/${tableId}/view`;\r\n\r\n return {\r\n subscribeAll: (onEvent) => eventStore.subscribeAll(onEvent),\r\n publish: async (partial) => {\r\n this.version += 1;\r\n const event: GridEvent = {\r\n ...partial,\r\n eventId: partial.eventId || createEventId(),\r\n tableId: partial.tableId || tableId,\r\n streamId: partial.streamId || viewStreamId,\r\n version: partial.version || this.version,\r\n occurredAt: partial.occurredAt || Date.now(),\r\n actorId: partial.actorId || actorId,\r\n };\r\n await eventStore.append(event.streamId, [event], -1);\r\n },\r\n };\r\n }\r\n\r\n register(plugins: readonly GridPlugin[]): void {\r\n const ctx: GridPluginContext = {\r\n tableId: this.deps.tableId,\r\n bus: this.createBus(),\r\n session: this.deps.session,\r\n query: this.deps.query,\r\n eventStore: this.deps.eventStore,\r\n resolveImportData: (correlationId) => this.takeImportPayload(correlationId),\r\n };\r\n\r\n for (const plugin of plugins) {\r\n plugin.register(ctx);\r\n this.plugins.push(plugin);\r\n if (plugin.dispose) {\r\n this.disposers.push(() => plugin.dispose?.());\r\n }\r\n }\r\n }\r\n\r\n list(): readonly GridPlugin[] {\r\n return this.plugins;\r\n }\r\n\r\n has(pluginName: string): boolean {\r\n return this.plugins.some((p) => p.name === pluginName);\r\n }\r\n\r\n async requestExport(options: RequestExportOptions): Promise<void> {\r\n const bus = this.createBus();\r\n const correlationId = options.correlationId ?? createEventId();\r\n const pluginName =\r\n options.format === 'pdf'\r\n ? 'pdf-export'\r\n : options.format === 'csv'\r\n ? 'csv-export'\r\n : 'excel-export';\r\n const wait = this.has(pluginName);\r\n const successType =\r\n options.format === 'pdf'\r\n ? 'PDF_EXPORT_COMPLETED'\r\n : options.format === 'csv'\r\n ? 'CSV_EXPORT_COMPLETED'\r\n : 'XLSX_EXPORT_COMPLETED';\r\n const failType =\r\n options.format === 'pdf'\r\n ? 'PDF_EXPORT_FAILED'\r\n : options.format === 'csv'\r\n ? 'CSV_EXPORT_FAILED'\r\n : 'XLSX_EXPORT_FAILED';\r\n\r\n const finished = wait\r\n ? new Promise<void>((resolve, reject) => {\r\n const unsub = this.deps.eventStore.subscribeAll((event) => {\r\n if (event.correlationId !== correlationId) return;\r\n if (event.type === successType) {\r\n unsub();\r\n resolve();\r\n }\r\n if (event.type === failType) {\r\n unsub();\r\n const message =\r\n (event.payload as { message?: string })?.message ?? 'EXPORT_FAILED';\r\n reject(new Error(message));\r\n }\r\n });\r\n })\r\n : Promise.resolve();\r\n\r\n const payload: ExportRequestedPayload = {\r\n format: options.format,\r\n collectionScope: options.collectionScope ?? 'active',\r\n fileName: options.fileName,\r\n sheetName: options.sheetName,\r\n direction: options.direction,\r\n };\r\n\r\n await bus.publish({\r\n eventId: createEventId(),\r\n type: 'EXPORT_REQUESTED',\r\n tableId: this.deps.tableId,\r\n streamId: `table/${this.deps.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: this.deps.actorId,\r\n correlationId,\r\n payload,\r\n });\r\n\r\n await finished;\r\n }\r\n\r\n async requestImport(options: RequestImportOptions): Promise<void> {\r\n if (options.format !== 'xlsx') {\r\n throw new Error(`Unsupported import format: ${options.format}`);\r\n }\r\n\r\n const correlationId = options.correlationId ?? createEventId();\r\n const bytes = await toUint8Array(options.data);\r\n this.importPayloads.set(correlationId, bytes);\r\n\r\n if (!this.plugins.some((p) => p.name === 'excel-import')) {\r\n this.importPayloads.delete(correlationId);\r\n throw new Error('NO_IMPORT_PLUGIN');\r\n }\r\n\r\n const bus = this.createBus();\r\n const payload: ImportRequestedPayload = {\r\n format: 'xlsx',\r\n collectionScope: options.collectionScope ?? 'active',\r\n sheetName: options.sheetName,\r\n byteLength: bytes.byteLength,\r\n };\r\n\r\n const finished = new Promise<'ok' | string>((resolve) => {\r\n const unsub = this.deps.eventStore.subscribeAll((event) => {\r\n if (event.correlationId !== correlationId) return;\r\n if (event.type === 'XLSX_IMPORT_COMPLETED') {\r\n unsub();\r\n resolve('ok');\r\n }\r\n if (event.type === 'XLSX_IMPORT_FAILED') {\r\n unsub();\r\n const msg =\r\n (event.payload as { message?: string })?.message ?? 'IMPORT_FAILED';\r\n resolve(msg);\r\n }\r\n });\r\n });\r\n\r\n try {\r\n await bus.publish({\r\n eventId: createEventId(),\r\n type: 'IMPORT_REQUESTED',\r\n tableId: this.deps.tableId,\r\n streamId: `table/${this.deps.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: this.deps.actorId,\r\n correlationId,\r\n payload,\r\n });\r\n const outcome = await finished;\r\n if (outcome !== 'ok') {\r\n throw new Error(outcome);\r\n }\r\n } finally {\r\n this.importPayloads.delete(correlationId);\r\n }\r\n }\r\n\r\n dispose(): void {\r\n for (const dispose of this.disposers) dispose();\r\n this.disposers.length = 0;\r\n this.plugins.length = 0;\r\n this.importPayloads.clear();\r\n }\r\n}\r\n","import type { ColumnSchema } from '../../domain/types/ColumnSchema';\r\nimport type {\r\n ColumnDefinition,\r\n ColumnViewBinding,\r\n} from '../../domain/types/ColumnDefinition';\r\n\r\n/**\r\n * Maps host/legacy ColumnSchema into core ColumnDefinition + view bindings.\r\n * Domain/runtime should prefer ColumnDefinition; React renderers stay in bindings.\r\n */\r\nexport function toColumnDefinition(schema: ColumnSchema): ColumnDefinition {\r\n return {\r\n fieldName: schema.fieldName,\r\n fieldCaption: schema.fieldCaption,\r\n fieldType: schema.fieldType,\r\n fieldCollection: schema.fieldCollection,\r\n order: schema.order,\r\n editable: schema.editable,\r\n isUnique: schema.isUnique,\r\n hidden: schema.hidden,\r\n disable: schema.disable,\r\n noCache: schema.noCache,\r\n expandable: schema.expandable,\r\n rules: schema.rules,\r\n options: schema.options,\r\n visibility: schema.visibility,\r\n dynamicSource: schema.dynamicSource\r\n ? {\r\n endpoint: schema.dynamicSource.endpoint,\r\n dependsOn: schema.dynamicSource.dependsOn,\r\n dependOn: schema.dynamicSource.dependOn,\r\n params: schema.dynamicSource.params,\r\n }\r\n : undefined,\r\n computed: schema.computed\r\n ? { dependsOn: schema.computed.dependsOn }\r\n : undefined,\r\n selectOptions: schema.selectOptions,\r\n minWidth: schema.minWidth,\r\n labelValue: schema.labelValue,\r\n };\r\n}\r\n\r\nexport function toColumnViewBinding(schema: ColumnSchema): ColumnViewBinding {\r\n return {\r\n fieldName: schema.fieldName,\r\n className: schema.className,\r\n minWidth: schema.minWidth,\r\n style: schema.style,\r\n render: schema.render as ColumnViewBinding['render'],\r\n displayFormat: schema.displayFormat,\r\n onChange: schema.onChange,\r\n indexOptions: schema.indexOptions,\r\n popUpWidth: schema.popUpWidth,\r\n dynamicSelectFilterOption: schema.dynamicSelectFilterOption,\r\n };\r\n}\r\n\r\nexport function mapColumnSchemas(schemas: ColumnSchema[]): {\r\n definitions: ColumnDefinition[];\r\n bindings: ColumnViewBinding[];\r\n} {\r\n return {\r\n definitions: schemas.map(toColumnDefinition),\r\n bindings: schemas.map(toColumnViewBinding),\r\n };\r\n}\r\n","import type { Actor } from '../domain/policies';\r\nimport type { CreateERPTableConfig } from './type';\r\n\r\n/** Internal repo/event-store namespace when the host omits `store` (PR-83). */\r\nexport const DEFAULT_MEMORY_STORE = 'memory';\r\n\r\n/** Actor used when the host omits `actor` — every permission check passes. */\r\nexport const DEFAULT_GRID_ACTOR: Actor = {\r\n userId: 'anonymous',\r\n roles: ['admin'],\r\n};\r\n\r\nexport function createGridTableKey(): string {\r\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\r\n return `pdg-${crypto.randomUUID()}`;\r\n }\r\n return `pdg-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\r\n}\r\n\r\nexport function isPersistentStore(\r\n store: string | undefined,\r\n): store is string {\r\n return typeof store === 'string' && store.length > 0;\r\n}\r\n\r\nexport type ResolvedGridIdentity = {\r\n store: string;\r\n tableKey: string;\r\n actor: Actor;\r\n persist: boolean;\r\n};\r\n\r\n/**\r\n * Fill `store` / `tableKey` / `actor` when omitted.\r\n * When `store` is set, identity is unchanged (PR-83: do not alter that path).\r\n */\r\nexport function resolveCreateGridDefaults(\r\n config: Pick<CreateERPTableConfig, 'store' | 'tableKey' | 'actor'>,\r\n): ResolvedGridIdentity {\r\n const tableKey =\r\n typeof config.tableKey === 'string' && config.tableKey.length > 0\r\n ? config.tableKey\r\n : createGridTableKey();\r\n const actor = config.actor ?? DEFAULT_GRID_ACTOR;\r\n if (isPersistentStore(config.store)) {\r\n return { persist: true, store: config.store, tableKey, actor };\r\n }\r\n return {\r\n persist: false,\r\n store: DEFAULT_MEMORY_STORE,\r\n tableKey,\r\n actor,\r\n };\r\n}\r\n","// adapters/infra/indexedDbTableRepository.ts\r\n\r\nimport { TableRepository } from '../../application/ports/TableRepository';\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { Cell } from '../../domain/entities/Cell';\r\nimport { Collection } from '../../domain/entities/Collection';\r\nimport { Row } from '../../domain/entities/Row';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport {\r\n CellValue,\r\n ColumnId,\r\n Pagination,\r\n RowId,\r\n RowState,\r\n RowStateEnum,\r\n} from '../../domain/value-objects';\r\n\r\n// ─── Serialization interfaces ─────────────────────────────────────────────────\r\n\r\ninterface SerializedCell {\r\n colId: string;\r\n value: unknown;\r\n originalValue: unknown;\r\n display: unknown;\r\n}\r\n\r\ninterface SerializedRow {\r\n rowId: number;\r\n cells: SerializedCell[];\r\n rowState: RowStateEnum;\r\n visibilityCondition: Record<string, boolean>;\r\n collection?: string;\r\n rowType?: string;\r\n isSaveDescription: boolean;\r\n}\r\n\r\ninterface SerializedCollection {\r\n name?: string;\r\n type?: string;\r\n rows: SerializedRow[];\r\n}\r\n\r\ninterface SerializedTable {\r\n id: string;\r\n pages: string[];\r\n collections: SerializedCollection[];\r\n activeCollection?: string;\r\n activeDetailType?: string;\r\n}\r\n\r\n// ─── Repository ───────────────────────────────────────────────────────────────\r\n\r\nexport class IndexedDbTableRepository implements TableRepository {\r\n private dbName = 'ERP_TABLE_DB';\r\n private dbPromise: Promise<IDBDatabase>;\r\n\r\n constructor() {\r\n this.dbPromise = this.initDb();\r\n }\r\n\r\n private initDb(): Promise<IDBDatabase> {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(this.dbName);\r\n request.onupgradeneeded = (_event: IDBVersionChangeEvent) => { };\r\n request.onsuccess = () => {\r\n const db = request.result;\r\n db.onversionchange = () => {\r\n db.close();\r\n console.warn('DB version changed, connection closed');\r\n };\r\n resolve(db);\r\n };\r\n request.onerror = () => reject(request.error);\r\n });\r\n }\r\n\r\n private async getDb(): Promise<IDBDatabase> {\r\n return this.dbPromise;\r\n }\r\n\r\n // ─── Serialization ──────────────────────────────────────────────────────────\r\n\r\n private serializeRows(rows: Row[]): SerializedRow[] {\r\n return rows.map(row => ({\r\n rowId: row.id.value,\r\n rowState: row.rowState.value,\r\n visibilityCondition: row.visibilityCondition,\r\n collection: row.collection,\r\n isSaveDescription: row.isSaveDescription,\r\n cells: Array.from(row.getCells().entries()).map(([colId, cell]) => ({\r\n colId,\r\n value: cell.getValue(),\r\n originalValue: cell.getOriginalValue().value,\r\n display: cell.getDisplay(),\r\n })),\r\n }));\r\n }\r\n\r\n /**\r\n * Serializes the entire collection map.\r\n * Each Collection becomes { name, rows[] }.\r\n */\r\n private serializeCollections(\r\n collectionMap: Map<string, Collection>\r\n ): SerializedCollection[] {\r\n const collections = Array.from(collectionMap.entries()).map(([name, collection]) => {\r\n return{\r\n name,\r\n rows: this.serializeRows(Array.from(collection.getRows().values())),\r\n }});\r\n return collections\r\n }\r\n\r\n // ─── Deserialization ────────────────────────────────────────────────────────\r\n\r\n private deserializeRowMap(data: SerializedRow[]): Map<number, Row> {\r\n const rowMap = new Map<number, Row>();\r\n\r\n data.forEach(r => {\r\n const cells = new Map<string, Cell>();\r\n r.cells.forEach(c => {\r\n cells.set(\r\n c.colId,\r\n new Cell(\r\n new RowId(r.rowId),\r\n new ColumnId(c.colId),\r\n new CellValue(c.value),\r\n new CellValue(c.originalValue),\r\n new CellValue(c.display)\r\n )\r\n );\r\n });\r\n\r\n const changeFields = new Set<string>();\r\n if (r.rowState === RowStateEnum.Modified) {\r\n r.cells.forEach(c => {\r\n if (c.value !== c.originalValue) changeFields.add(c.colId);\r\n });\r\n }\r\n\r\n rowMap.set(\r\n r.rowId,\r\n new Row(\r\n new RowId(r.rowId),\r\n cells,\r\n new RowState(r.rowState),\r\n changeFields,\r\n r.visibilityCondition,\r\n r.collection ?? r.rowType ?? 'default',\r\n r.isSaveDescription\r\n )\r\n );\r\n });\r\n\r\n return rowMap;\r\n }\r\n\r\n /**\r\n * Rebuilds the full Map<string, Collection> from persisted data.\r\n * If the stored data is empty/missing, seeds a default empty collection\r\n * so Table always has at least one entry.\r\n */\r\n private deserializeCollections(\r\n data: SerializedCollection[],\r\n activeCollection: string\r\n ): Map<string, Collection> {\r\n const collectionMap = new Map<string, Collection>();\r\n\r\n if (!data || data.length === 0) {\r\n collectionMap.set(activeCollection, new Collection(activeCollection, new Map<number, Row>(), new Map<string, ColumnSchema>));\r\n return collectionMap;\r\n }\r\n\r\n data.forEach(({ name, type, rows }) => {\r\n const collectionName = name ?? type ?? activeCollection;\r\n collectionMap.set(collectionName, new Collection(collectionName, this.deserializeRowMap(rows), new Map<string, ColumnSchema>));\r\n });\r\n\r\n // Ensure the active collection always has an entry even if not in stored data\r\n if (!collectionMap.has(activeCollection)) {\r\n collectionMap.set(activeCollection, new Collection(activeCollection, new Map<number, Row>(), new Map<string, ColumnSchema>));\r\n }\r\n\r\n return collectionMap;\r\n }\r\n\r\n // ─── Store management ───────────────────────────────────────────────────────\r\n\r\n private async ensureStore(db: IDBDatabase, storeName: string): Promise<IDBDatabase> {\r\n if (db.objectStoreNames.contains(storeName)) return db;\r\n\r\n db.close();\r\n const newDb = await new Promise<IDBDatabase>((resolve, reject) => {\r\n const req = indexedDB.open(this.dbName, db.version + 1);\r\n req.onupgradeneeded = (event: IDBVersionChangeEvent) => {\r\n const upgradedDb = (event.target as IDBOpenDBRequest).result;\r\n if (!upgradedDb.objectStoreNames.contains(storeName)) {\r\n upgradedDb.createObjectStore(storeName, { keyPath: 'id' });\r\n }\r\n };\r\n req.onsuccess = () => resolve(req.result);\r\n req.onerror = () => reject(req.error);\r\n });\r\n\r\n this.dbPromise = Promise.resolve(newDb);\r\n return newDb;\r\n }\r\n\r\n // ─── CRUD ───────────────────────────────────────────────────────────────────\r\n\r\n async save(storeName: string, table: Table): Promise<void> {\r\n let db = await this.getDb();\r\n db = await this.ensureStore(db, storeName);\r\n const serialized: SerializedTable = {\r\n id: table.id,\r\n pages: [table.id],\r\n collections: this.serializeCollections(table.getCollections()),\r\n activeCollection: table.getActiveCollectionName(),\r\n };\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(storeName, 'readwrite');\r\n const objectStore = tx.objectStore(storeName);\r\n if(!objectStore)return\r\n const req = objectStore.put(serialized);\r\n req.onsuccess = () => resolve();\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n async getById(storeName: string, tableId: string): Promise<Table> {\r\n const db = await this.getDb();\r\n if (!db.objectStoreNames.contains(storeName)) {\r\n throw new Error(`Store ${storeName} not found`);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(storeName, 'readonly');\r\n const objectStore = tx.objectStore(storeName);\r\n const req = objectStore.get(tableId) as IDBRequest<SerializedTable>;\r\n\r\n req.onsuccess = () => {\r\n const result = req.result;\r\n if (!result) {\r\n reject(new Error(`Table ${tableId} not found`));\r\n return;\r\n }\r\n const activeCollection = result.activeCollection ?? result.activeDetailType ?? 'default';\r\n resolve(\r\n new Table(\r\n tableId,\r\n this.deserializeCollections(result.collections, activeCollection),\r\n new Pagination(1, 10, 10),\r\n null,\r\n activeCollection\r\n )\r\n );\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n async exists(storeName: string, tableId: string): Promise<boolean> {\r\n if (!tableId) return false;\r\n const db = await this.getDb();\r\n if (!db.objectStoreNames.contains(storeName)) return false;\r\n\r\n return new Promise(resolve => {\r\n const tx = db.transaction(storeName, 'readonly');\r\n const objectStore = tx.objectStore(storeName);\r\n const req = objectStore.get(tableId);\r\n req.onsuccess = () => resolve(Boolean(req.result));\r\n req.onerror = () => resolve(false);\r\n });\r\n }\r\n\r\n async delete(storeName: string, tableId: string): Promise<void> {\r\n const db = await this.getDb();\r\n if (!db.objectStoreNames.contains(storeName)) return;\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(storeName, 'readwrite');\r\n const objectStore = tx.objectStore(storeName);\r\n const req = objectStore.delete(tableId);\r\n req.onsuccess = () => resolve();\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n async resetTable(storeName: string, tableId: string): Promise<void> {\r\n const db = await this.getDb();\r\n if (!db.objectStoreNames.contains(storeName)) return;\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(storeName, 'readwrite');\r\n const objectStore = tx.objectStore(storeName);\r\n const getReq = objectStore.get(tableId) as IDBRequest<SerializedTable>;\r\n\r\n getReq.onsuccess = () => {\r\n if (!getReq.result) {\r\n reject(new Error(`Table ${tableId} not found`));\r\n return;\r\n }\r\n const resetTable: SerializedTable = {\r\n id: tableId,\r\n pages: [tableId],\r\n collections: [], // empty — Table will seed a default collection on next load\r\n activeDetailType: getReq.result.activeDetailType,\r\n };\r\n const putReq = objectStore.put(resetTable);\r\n putReq.onsuccess = () => resolve();\r\n putReq.onerror = () => reject(putReq.error);\r\n };\r\n getReq.onerror = () => reject(getReq.error);\r\n });\r\n }\r\n}","// adapters/infra/localTableRepository.ts\r\n\r\nimport { TableRepository } from '../../application/ports/TableRepository';\r\nimport { Table } from '../../domain/entities/Table';\r\n\r\nexport class LocalTableRepository implements TableRepository {\r\n private tables = new Map<string, Table>();\r\n private initTables = new Map<string, Table>();\r\n\r\n constructor(initialTables: Table[] = []) {\r\n initialTables.forEach(t => {\r\n this.tables.set(t.id, t.clone());\r\n this.initTables.set(t.id, t.clone()); \r\n });\r\n }\r\n\r\n async exists(_store: string, tableKey: string): Promise<boolean> {\r\n return this.tables.has(tableKey);\r\n }\r\n\r\n async getById(_store: string, tableKey: string): Promise<Table> {\r\n const table = this.tables.get(tableKey);\r\n if (!table) throw new Error(`Table ${tableKey} not found`);\r\n return table;\r\n }\r\n\r\n async save(_store: string, table: Table): Promise<void> {\r\n this.tables.set(table.id, table);\r\n }\r\n\r\n async delete(_store: string, tableKey: string): Promise<void> {\r\n this.tables.delete(tableKey);\r\n }\r\n\r\n async resetTable(_store: string, tableKey: string): Promise<void> {\r\n const initTable = this.initTables.get(tableKey);\r\n if (initTable) this.tables.set(tableKey, initTable.clone()); // ← fresh clone each reset\r\n }\r\n}","// adapters/infra/cachedTableRepository.ts\r\nimport { TableRepository } from '../../application/ports/TableRepository';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport { IndexedDbTableRepository } from './indexedDbTableRepository';\r\nimport { LocalTableRepository } from './localTableRepository';\r\n\r\nexport class CachedTableRepository implements TableRepository {\r\n private localRepo: LocalTableRepository;\r\n private indexedRepo: IndexedDbTableRepository;\r\n\r\n constructor() {\r\n this.localRepo = new LocalTableRepository();\r\n this.indexedRepo = new IndexedDbTableRepository();\r\n }\r\n\r\n async getById(store: string, tableKey: string): Promise<Table> {\r\n if (await this.localRepo.exists(store, tableKey)) {\r\n return this.localRepo.getById(store, tableKey);\r\n }\r\n const table = await this.indexedRepo.getById(store, tableKey);\r\n await this.localRepo.save(store, table);\r\n return table;\r\n }\r\n\r\n async save(store: string, table: Table): Promise<void> {\r\n await this.localRepo.save(store, table);\r\n await this.indexedRepo.save(store, table);\r\n }\r\n\r\n async delete(store: string, tableKey: string): Promise<void> {\r\n await this.localRepo.delete(store, tableKey);\r\n await this.indexedRepo.delete(store, tableKey);\r\n }\r\n\r\n async resetTable(store: string, tableKey: string): Promise<void> {\r\n await this.localRepo.resetTable(store, tableKey);\r\n await this.indexedRepo.resetTable(store, tableKey);\r\n }\r\n\r\n async exists(store: string, tableKey: string): Promise<boolean> {\r\n return this.indexedRepo.exists(store, tableKey);\r\n }\r\n}\r\n\r\n","//adapters/infra\r\nimport { AuditLogger } from '../../application/ports/AuditLogger';\r\n\r\nexport class ConsoleAuditLogger implements AuditLogger {\r\n log(event: unknown) {\r\n console.log('[AuditLog]', event);\r\n }\r\n error(event: unknown) {\r\n console.error('[AuditLog]', event);\r\n }\r\n warn(event: unknown) {\r\n console.warn('[AuditLog]', event);\r\n }\r\n info(event: unknown) {\r\n console.info('[AuditLog]', event);\r\n }\r\n}\r\n","import type { Unsubscribe } from '../../application/ports/EventStore';\r\nimport type {\r\n ChangelogEntry,\r\n ChangelogProjection,\r\n ChangelogQuery,\r\n} from '../projections/ChangelogProjection';\r\n\r\nexport type HistorySeverity = 'info' | 'warning' | 'error';\r\nexport type HistoryCategory = 'data' | 'structure' | 'view' | 'system';\r\n\r\nexport interface HistoryClassification {\r\n readonly severity: HistorySeverity;\r\n readonly category: HistoryCategory;\r\n}\r\n\r\nexport interface HistoryQuery extends ChangelogQuery {\r\n severity?: HistorySeverity;\r\n category?: HistoryCategory;\r\n}\r\n\r\nexport interface HistoryItem {\r\n readonly id: string;\r\n readonly type: string;\r\n readonly title: string;\r\n readonly description: string;\r\n readonly occurredAt: number;\r\n readonly tableId: string;\r\n readonly actorId: string;\r\n readonly severity: HistorySeverity;\r\n readonly category: HistoryCategory;\r\n readonly raw: ChangelogEntry;\r\n}\r\n\r\nconst HISTORY_CLASSIFICATIONS: Record<string, HistoryClassification> = {\r\n CELL_CHANGED: { category: 'data', severity: 'info' },\r\n CELL_DISPLAY_CHANGED: { category: 'data', severity: 'info' },\r\n ROW_ADDED: { category: 'data', severity: 'info' },\r\n NEW_ROW_ADDED: { category: 'data', severity: 'info' },\r\n ROW_DELETED: { category: 'data', severity: 'warning' },\r\n ROW_RESTORED: { category: 'data', severity: 'info' },\r\n ROW_REORDERED: { category: 'data', severity: 'info' },\r\n ROW_DESCRIPTION_SAVED: { category: 'data', severity: 'info' },\r\n DYNAMIC_PROJECTION_DONE: { category: 'data', severity: 'info' },\r\n DYNAMIC_DATA_REQUESTED: { category: 'data', severity: 'info' },\r\n VALIDATION_FAILED: { category: 'data', severity: 'error' },\r\n CELL_EDIT_CONFLICTED: { category: 'data', severity: 'error' },\r\n COLUMN_REORDERED: { category: 'structure', severity: 'info' },\r\n COLUMN_STATE_CHANGED: { category: 'structure', severity: 'info' },\r\n UNIT_COLUMN_ADDED: { category: 'structure', severity: 'info' },\r\n ACTIVE_COLLECTION_CHANGED: { category: 'structure', severity: 'info' },\r\n PAGE_CHANGED: { category: 'view', severity: 'info' },\r\n PAGE_SIZE_CHANGED: { category: 'view', severity: 'info' },\r\n VIEWPORT_CHANGED: { category: 'view', severity: 'info' },\r\n ROWS_LOADED: { category: 'system', severity: 'info' },\r\n TABLE_RESET: { category: 'system', severity: 'warning' },\r\n TABLE_DELETED: { category: 'system', severity: 'warning' },\r\n INVARIANT_VIOLATION: { category: 'system', severity: 'error' },\r\n};\r\n\r\nexport function classifyHistoryEvent(type: string): HistoryClassification {\r\n return HISTORY_CLASSIFICATIONS[type] ?? { category: 'system', severity: 'info' };\r\n}\r\n\r\nfunction formatValue(value: unknown): string {\r\n if (typeof value === 'string') return value;\r\n if (value == null) return String(value);\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value);\r\n }\r\n}\r\n\r\nfunction describeEntry(entry: ChangelogEntry): Pick<HistoryItem, 'title' | 'description'> {\r\n const payload = entry.payload as Record<string, unknown> | null;\r\n const rowId = payload?.rowId;\r\n const columnId = payload?.columnId;\r\n\r\n switch (entry.type) {\r\n case 'CELL_CHANGED':\r\n return {\r\n title: 'Cell changed',\r\n description:\r\n payload?.previousValue !== undefined\r\n ? `Row ${rowId}, column \"${columnId}\" changed from ${formatValue(payload?.previousValue)} to ${formatValue(payload?.newValue)}.`\r\n : `Row ${rowId}, column \"${columnId}\" changed to ${formatValue(payload?.newValue)}.`,\r\n };\r\n case 'CELL_DISPLAY_CHANGED':\r\n return {\r\n title: 'Cell display changed',\r\n description: `Row ${rowId}, column \"${columnId}\" display changed to ${formatValue(payload?.newValue)}.`,\r\n };\r\n case 'PAGE_CHANGED':\r\n return {\r\n title: 'Page changed',\r\n description: `Table page changed to ${formatValue(payload?.page)}.`,\r\n };\r\n case 'PAGE_SIZE_CHANGED':\r\n return {\r\n title: 'Page size changed',\r\n description: `Page size changed to ${formatValue(payload?.pageSize)}.`,\r\n };\r\n case 'VIEWPORT_CHANGED':\r\n return {\r\n title: 'Viewport changed',\r\n description: `Scroll offset ${formatValue(payload?.scrollOffset)}; visible [${formatValue(payload?.startIndex)}–${formatValue(payload?.endIndex)}).`,\r\n };\r\n case 'ROW_ADDED':\r\n case 'NEW_ROW_ADDED':\r\n return {\r\n title: 'Row added',\r\n description: `Row ${formatValue(payload?.rowId)} was added.`,\r\n };\r\n case 'ROW_DELETED':\r\n return {\r\n title: 'Row deleted',\r\n description: `Row ${formatValue(payload?.rowId)} was deleted.`,\r\n };\r\n case 'ROW_RESTORED':\r\n return {\r\n title: 'Row restored',\r\n description: `Row ${formatValue(payload?.rowId)} was restored.`,\r\n };\r\n case 'ROW_REORDERED':\r\n return {\r\n title: 'Rows reordered',\r\n description: `Rows moved from ${formatValue(payload?.sourceIndex)} to ${formatValue(payload?.destIndex)}.`,\r\n };\r\n case 'COLUMN_REORDERED':\r\n return {\r\n title: 'Columns reordered',\r\n description: `Columns moved from ${formatValue(payload?.sourceIndex)} to ${formatValue(payload?.destIndex)}.`,\r\n };\r\n case 'COLUMN_STATE_CHANGED': {\r\n const cols = payload?.columns;\r\n const count = Array.isArray(cols) ? cols.length : 0;\r\n return {\r\n title: 'Column state changed',\r\n description: `Column layout updated (${count} columns).`,\r\n };\r\n }\r\n case 'ROW_DESCRIPTION_SAVED':\r\n return {\r\n title: 'Description saved',\r\n description: `Row ${formatValue(payload?.rowId)} description flag changed to ${formatValue(payload?.description)}.`,\r\n };\r\n case 'ACTIVE_COLLECTION_CHANGED':\r\n return {\r\n title: 'Active collection changed',\r\n description: 'The active collection was changed.',\r\n };\r\n case 'TABLE_RESET':\r\n return {\r\n title: 'Table reset',\r\n description: 'The table was reset.',\r\n };\r\n case 'TABLE_DELETED':\r\n return {\r\n title: 'Table deleted',\r\n description: 'The table was deleted.',\r\n };\r\n case 'UNIT_COLUMN_ADDED':\r\n return {\r\n title: 'Unit columns updated',\r\n description: `Unit-level columns updated: ${formatValue(payload?.reason)}.`,\r\n };\r\n case 'VALIDATION_FAILED':\r\n return {\r\n title: 'Validation failed',\r\n description: formatValue(payload?.reason ?? payload?.message ?? 'Validation failed.'),\r\n };\r\n case 'CELL_EDIT_CONFLICTED':\r\n return {\r\n title: 'Cell edit conflicted',\r\n description: `Row ${rowId}, column \"${columnId}\" could not be saved because of a version conflict.`,\r\n };\r\n case 'INVARIANT_VIOLATION':\r\n return {\r\n title: 'Invariant violation',\r\n description: formatValue(payload?.reason ?? payload?.message ?? 'A domain invariant was violated.'),\r\n };\r\n default:\r\n return {\r\n title: entry.type,\r\n description: `Event ${entry.type} was recorded.`,\r\n };\r\n }\r\n}\r\n\r\nfunction toChangelogQuery(filter: HistoryQuery): ChangelogQuery {\r\n const { severity: _severity, category: _category, limit: _limit, ...changelogFilter } = filter;\r\n return changelogFilter;\r\n}\r\n\r\nfunction applyHistoryFilters(items: HistoryItem[], filter: HistoryQuery): HistoryItem[] {\r\n let result = items;\r\n\r\n if (filter.severity) {\r\n result = result.filter((item) => item.severity === filter.severity);\r\n }\r\n if (filter.category) {\r\n result = result.filter((item) => item.category === filter.category);\r\n }\r\n if (filter.limit && filter.limit > 0) {\r\n result = result.slice(-filter.limit);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport class HistoryPanelViewModel {\r\n constructor(private readonly changelogProjection: ChangelogProjection) {}\r\n\r\n query(filter: HistoryQuery = {}): HistoryItem[] {\r\n return applyHistoryFilters(\r\n this.changelogProjection.query(toChangelogQuery(filter)).map((entry) => this.toHistoryItem(entry)),\r\n filter,\r\n );\r\n }\r\n\r\n count(filter: HistoryQuery = {}): number {\r\n return this.query(filter).length;\r\n }\r\n\r\n subscribe(\r\n cb: (items: HistoryItem[]) => void,\r\n filter: HistoryQuery = {},\r\n ): Unsubscribe {\r\n return this.changelogProjection.subscribe((entries) => {\r\n cb(applyHistoryFilters(entries.map((entry) => this.toHistoryItem(entry)), filter));\r\n }, toChangelogQuery(filter));\r\n }\r\n\r\n private toHistoryItem(entry: ChangelogEntry): HistoryItem {\r\n const description = describeEntry(entry);\r\n const classification = classifyHistoryEvent(entry.type);\r\n\r\n return {\r\n id: entry.eventId,\r\n type: entry.type,\r\n title: description.title,\r\n description: description.description,\r\n occurredAt: entry.occurredAt,\r\n tableId: entry.tableId,\r\n actorId: entry.actorId,\r\n severity: classification.severity,\r\n category: classification.category,\r\n raw: entry,\r\n };\r\n }\r\n}\r\n","import type { EventStore, Unsubscribe } from '../../application/ports/EventStore';\r\nimport type { GridEvent } from '../../domain/types/GridEvent';\r\n\r\nexport interface ChangelogEntry {\r\n readonly eventId: string;\r\n readonly type: string;\r\n readonly tableId: string;\r\n readonly occurredAt: number;\r\n readonly actorId: string;\r\n readonly payload: unknown;\r\n}\r\n\r\nexport interface ChangelogQuery {\r\n tableId?: string;\r\n rowId?: number | string;\r\n columnId?: string;\r\n type?: string;\r\n since?: number;\r\n limit?: number;\r\n}\r\n\r\ntype ChangelogSubscriber = {\r\n filter: ChangelogQuery;\r\n notify: (entries: ChangelogEntry[]) => void;\r\n};\r\n\r\nexport class ChangelogProjection {\r\n private entries: ChangelogEntry[] = [];\r\n private unsubscribe: Unsubscribe | null = null;\r\n private subscribers = new Set<ChangelogSubscriber>();\r\n private seenEventIds = new Set<string>();\r\n private started = false;\r\n\r\n constructor(private readonly eventStore: EventStore) {}\r\n\r\n /**\r\n * Catch up via readAll, then subscribe for live events.\r\n * Dedupes by eventId so subscribe-before-replay races are safe.\r\n */\r\n async start(): Promise<void> {\r\n if (this.started) return;\r\n this.started = true;\r\n\r\n const projectOnce = (event: GridEvent) => {\r\n if (this.seenEventIds.has(event.eventId)) return;\r\n this.seenEventIds.add(event.eventId);\r\n this.project(event);\r\n };\r\n\r\n this.unsubscribe = this.eventStore.subscribeAll(projectOnce);\r\n\r\n const past = await this.eventStore.readAll(0);\r\n for (const event of past) {\r\n projectOnce(event);\r\n }\r\n }\r\n\r\n stop(): void {\r\n this.unsubscribe?.();\r\n this.unsubscribe = null;\r\n this.started = false;\r\n }\r\n\r\n query(filter: ChangelogQuery = {}): ChangelogEntry[] {\r\n let result = this.entries;\r\n\r\n if (filter.tableId) {\r\n result = result.filter((e) => e.tableId === filter.tableId);\r\n }\r\n if (filter.type) {\r\n result = result.filter((e) => e.type === filter.type);\r\n }\r\n if (filter.since) {\r\n const since = filter.since;\r\n result = result.filter((e) => e.occurredAt >= since);\r\n }\r\n if (filter.rowId !== undefined) {\r\n const rid = filter.rowId;\r\n result = result.filter((e) => {\r\n const p =\r\n typeof e.payload === 'object' && e.payload !== null\r\n ? (e.payload as Record<string, unknown>)\r\n : undefined;\r\n return p?.rowId === rid;\r\n });\r\n }\r\n if (filter.columnId) {\r\n const cid = filter.columnId;\r\n result = result.filter((e) => {\r\n const p =\r\n typeof e.payload === 'object' && e.payload !== null\r\n ? (e.payload as Record<string, unknown>)\r\n : undefined;\r\n return p?.columnId === cid;\r\n });\r\n }\r\n if (filter.limit && filter.limit > 0) {\r\n result = result.slice(-filter.limit);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n count(filter: ChangelogQuery = {}): number {\r\n return this.query(filter).length;\r\n }\r\n\r\n subscribe(\r\n notify: (entries: ChangelogEntry[]) => void,\r\n filter: ChangelogQuery = {},\r\n ): Unsubscribe {\r\n const subscriber: ChangelogSubscriber = { filter, notify };\r\n this.subscribers.add(subscriber);\r\n notify(this.query(filter));\r\n\r\n return () => {\r\n this.subscribers.delete(subscriber);\r\n };\r\n }\r\n\r\n clear(): void {\r\n this.entries = [];\r\n this.seenEventIds.clear();\r\n this.notifySubscribers();\r\n }\r\n\r\n private project(event: GridEvent): void {\r\n this.entries.push({\r\n eventId: event.eventId,\r\n type: event.type,\r\n tableId: event.tableId,\r\n occurredAt: event.occurredAt,\r\n actorId: event.actorId,\r\n payload: event.payload,\r\n });\r\n this.notifySubscribers();\r\n }\r\n\r\n private notifySubscribers(): void {\r\n for (const subscriber of this.subscribers) {\r\n subscriber.notify(this.query(subscriber.filter));\r\n }\r\n }\r\n}\r\n","/**\r\n * Optional column-state persistence (PR-115).\r\n * When `stateKey` is set: restore/save localStorage and append\r\n * `COLUMN_STATE_CHANGED` to the EventStore on layout changes.\r\n */\r\n\r\nimport type { EventStore } from '../../application/ports/EventStore';\r\nimport type { GridEvent } from '../../domain/types/GridEvent';\r\nimport {\r\n columnStateStorageKey,\r\n parseColumnState,\r\n serializeColumnState,\r\n} from '../../engine/dataOps/columnState';\r\nimport type { GridApi, GridColumnState } from './createGridApi';\r\nimport type { UITableController } from './UITableController';\r\n\r\nconst PERSIST_DEBOUNCE_MS = 150;\r\n\r\nexport function loadColumnStateFromStorage(\r\n stateKey: string,\r\n): GridColumnState[] | null {\r\n if (typeof localStorage === 'undefined') return null;\r\n try {\r\n return parseColumnState(localStorage.getItem(columnStateStorageKey(stateKey)));\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function saveColumnStateToStorage(\r\n stateKey: string,\r\n state: readonly GridColumnState[],\r\n): void {\r\n if (typeof localStorage === 'undefined') return;\r\n try {\r\n localStorage.setItem(\r\n columnStateStorageKey(stateKey),\r\n serializeColumnState(state),\r\n );\r\n } catch {\r\n // Quota / private mode — ignore\r\n }\r\n}\r\n\r\nexport type AttachColumnStatePersistenceInput = {\r\n api: GridApi;\r\n controller: UITableController;\r\n tableId: string;\r\n actorId: string;\r\n /** Required to enable persist/restore (PR-115). */\r\n stateKey?: string;\r\n eventStore?: EventStore;\r\n};\r\n\r\n/**\r\n * Restore from localStorage (if `stateKey`), then subscribe to layout\r\n * changes and persist. No-op when `stateKey` is omitted.\r\n */\r\nexport async function attachColumnStatePersistence(\r\n input: AttachColumnStatePersistenceInput,\r\n): Promise<() => void> {\r\n const { api, controller, tableId, actorId, stateKey, eventStore } = input;\r\n if (!stateKey) {\r\n return () => undefined;\r\n }\r\n\r\n let suppressed = false;\r\n let lastSerialized = serializeColumnState(api.getColumnState());\r\n let timer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n const stored = loadColumnStateFromStorage(stateKey);\r\n if (stored && stored.length > 0) {\r\n suppressed = true;\r\n try {\r\n await api.applyColumnState(stored);\r\n lastSerialized = serializeColumnState(api.getColumnState());\r\n } finally {\r\n suppressed = false;\r\n }\r\n }\r\n\r\n const flush = () => {\r\n if (suppressed) return;\r\n const state = api.getColumnState();\r\n const serialized = serializeColumnState(state);\r\n if (serialized === lastSerialized) return;\r\n lastSerialized = serialized;\r\n\r\n saveColumnStateToStorage(stateKey, state);\r\n\r\n if (eventStore) {\r\n const streamId = `table:${tableId}`;\r\n const evt: GridEvent = {\r\n eventId: `col-state-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\r\n type: 'COLUMN_STATE_CHANGED',\r\n tableId,\r\n streamId,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId,\r\n payload: { columns: state },\r\n };\r\n void eventStore.append(streamId, [evt], -1);\r\n }\r\n };\r\n\r\n const schedule = () => {\r\n if (suppressed) return;\r\n if (timer) clearTimeout(timer);\r\n timer = setTimeout(flush, PERSIST_DEBOUNCE_MS);\r\n };\r\n\r\n const unsubscribe = controller.subscribe(schedule) ?? (() => undefined);\r\n\r\n return () => {\r\n if (timer) clearTimeout(timer);\r\n unsubscribe();\r\n };\r\n}\r\n","import type { CellChangedEvent } from '../../application/events';\r\n\r\nexport interface CellUndoEntry {\r\n readonly kind: 'CELL_CHANGED';\r\n readonly tableId: string;\r\n readonly rowId: number;\r\n readonly columnId: string;\r\n readonly newValue: unknown;\r\n readonly previousValue: unknown;\r\n}\r\n\r\nexport type RowCellSnapshot = {\r\n readonly value: unknown;\r\n readonly display?: unknown;\r\n readonly originalValue?: unknown;\r\n};\r\n\r\nexport interface RowAddedUndoEntry {\r\n readonly kind: 'ROW_ADDED';\r\n readonly tableId: string;\r\n readonly rowId: number;\r\n /** Captured at record time so redo can restore identity + values. */\r\n readonly cells: Readonly<Record<string, RowCellSnapshot>>;\r\n readonly collection?: string;\r\n readonly isSaveDescription?: boolean;\r\n}\r\n\r\n/**\r\n * Compensating entry for a delete:\r\n * - soft: Unchanged→Deleted (undo/redo = toggle ROW_DELETED)\r\n * - hard: Added row removed from map (undo = RESTORE_ADDED_ROW)\r\n */\r\nexport interface RowDeletedUndoEntry {\r\n readonly kind: 'ROW_DELETED';\r\n readonly tableId: string;\r\n readonly rowId: number;\r\n readonly mode: 'soft' | 'hard';\r\n readonly cells: Readonly<Record<string, RowCellSnapshot>>;\r\n readonly collection?: string;\r\n readonly isSaveDescription?: boolean;\r\n}\r\n\r\nexport type AtomicUndoEntry =\r\n | CellUndoEntry\r\n | RowAddedUndoEntry\r\n | RowDeletedUndoEntry;\r\n\r\nexport interface UndoUnit {\r\n readonly correlationId?: string;\r\n readonly entries: AtomicUndoEntry[];\r\n}\r\n\r\nexport type UndoDispatchCommand =\r\n | {\r\n type: 'CHANGE_CELL_VALUE';\r\n store: string;\r\n tableKey: string;\r\n rowId: number;\r\n columnId: string;\r\n newValue: unknown;\r\n }\r\n | {\r\n type: 'ROW_DELETED';\r\n store: string;\r\n tableKey: string;\r\n rowId: number;\r\n }\r\n | {\r\n type: 'RESTORE_ADDED_ROW';\r\n store: string;\r\n tableKey: string;\r\n rowId: number;\r\n cells: Readonly<Record<string, RowCellSnapshot>>;\r\n collection?: string;\r\n isSaveDescription?: boolean;\r\n };\r\n\r\nexport type CellUndoDispatch = (\r\n command: UndoDispatchCommand,\r\n) => Promise<void>;\r\n\r\nfunction isNoOpCell(entry: CellUndoEntry): boolean {\r\n return Object.is(entry.newValue, entry.previousValue);\r\n}\r\n\r\n/**\r\n * Compensating undo/redo stack for domain edits.\r\n * - CELL_CHANGED: restore previousValue / re-apply newValue\r\n * - ROW_ADDED: delete on undo; RESTORE_ADDED_ROW on redo\r\n * - ROW_DELETED soft: toggle ROW_DELETED; hard: RESTORE_ADDED_ROW / ROW_DELETED\r\n * - Same correlationId merges into one undo unit (paste / cut+paste)\r\n */\r\nexport class CellUndoStack {\r\n private undoEntries: UndoUnit[] = [];\r\n private redoEntries: UndoUnit[] = [];\r\n private applying: 'undo' | 'redo' | null = null;\r\n\r\n record(event: CellChangedEvent, correlationId?: string): void {\r\n if (this.applying) return;\r\n const entry: CellUndoEntry = {\r\n kind: 'CELL_CHANGED',\r\n tableId: event.tableId,\r\n rowId: event.rowId,\r\n columnId: event.columnId,\r\n newValue: event.newValue,\r\n previousValue: event.previousValue,\r\n };\r\n if (isNoOpCell(entry)) return;\r\n this.pushAtomic(entry, correlationId);\r\n }\r\n\r\n recordRowAdded(\r\n event: {\r\n tableId: string;\r\n rowId: number;\r\n cells?: Readonly<Record<string, RowCellSnapshot>>;\r\n collection?: string;\r\n isSaveDescription?: boolean;\r\n },\r\n correlationId?: string,\r\n ): void {\r\n if (this.applying) return;\r\n this.pushAtomic(\r\n {\r\n kind: 'ROW_ADDED',\r\n tableId: event.tableId,\r\n rowId: event.rowId,\r\n cells: event.cells ?? {},\r\n collection: event.collection,\r\n isSaveDescription: event.isSaveDescription,\r\n },\r\n correlationId,\r\n );\r\n }\r\n\r\n recordRowDeleted(\r\n event: {\r\n tableId: string;\r\n rowId: number;\r\n mode: 'soft' | 'hard';\r\n cells?: Readonly<Record<string, RowCellSnapshot>>;\r\n collection?: string;\r\n isSaveDescription?: boolean;\r\n },\r\n correlationId?: string,\r\n ): void {\r\n if (this.applying) return;\r\n if (event.mode === 'hard' && (!event.cells || Object.keys(event.cells).length === 0)) {\r\n // Cannot restore a hard-removed row without a snapshot.\r\n return;\r\n }\r\n this.pushAtomic(\r\n {\r\n kind: 'ROW_DELETED',\r\n tableId: event.tableId,\r\n rowId: event.rowId,\r\n mode: event.mode,\r\n cells: event.cells ?? {},\r\n collection: event.collection,\r\n isSaveDescription: event.isSaveDescription,\r\n },\r\n correlationId,\r\n );\r\n }\r\n\r\n recordMany(\r\n entries: AtomicUndoEntry[],\r\n correlationId?: string,\r\n ): void {\r\n if (this.applying) return;\r\n const filtered = entries.filter((e) =>\r\n e.kind === 'CELL_CHANGED' ? !isNoOpCell(e) : true,\r\n );\r\n if (filtered.length === 0) return;\r\n\r\n if (\r\n correlationId &&\r\n this.undoEntries.length > 0 &&\r\n this.undoEntries[this.undoEntries.length - 1].correlationId ===\r\n correlationId\r\n ) {\r\n this.undoEntries[this.undoEntries.length - 1].entries.push(...filtered);\r\n this.redoEntries = [];\r\n return;\r\n }\r\n\r\n this.undoEntries.push({ correlationId, entries: filtered });\r\n this.redoEntries = [];\r\n }\r\n\r\n canUndo(): boolean {\r\n return this.undoEntries.length > 0;\r\n }\r\n\r\n canRedo(): boolean {\r\n return this.redoEntries.length > 0;\r\n }\r\n\r\n undoDepth(): number {\r\n return this.undoEntries.length;\r\n }\r\n\r\n redoDepth(): number {\r\n return this.redoEntries.length;\r\n }\r\n\r\n async undo(\r\n store: string,\r\n dispatch: CellUndoDispatch,\r\n ): Promise<boolean> {\r\n const unit = this.undoEntries.pop();\r\n if (!unit) return false;\r\n\r\n this.applying = 'undo';\r\n try {\r\n for (let i = unit.entries.length - 1; i >= 0; i -= 1) {\r\n await this.applyCompensating(store, unit.entries[i], dispatch);\r\n }\r\n this.redoEntries.push(unit);\r\n return true;\r\n } finally {\r\n this.applying = null;\r\n }\r\n }\r\n\r\n async redo(\r\n store: string,\r\n dispatch: CellUndoDispatch,\r\n ): Promise<boolean> {\r\n const unit = this.redoEntries.pop();\r\n if (!unit) return false;\r\n\r\n this.applying = 'redo';\r\n try {\r\n for (const entry of unit.entries) {\r\n await this.applyForward(store, entry, dispatch);\r\n }\r\n this.undoEntries.push(unit);\r\n return true;\r\n } finally {\r\n this.applying = null;\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.undoEntries = [];\r\n this.redoEntries = [];\r\n this.applying = null;\r\n }\r\n\r\n private pushAtomic(\r\n entry: AtomicUndoEntry,\r\n correlationId?: string,\r\n ): void {\r\n if (\r\n correlationId &&\r\n this.undoEntries.length > 0 &&\r\n this.undoEntries[this.undoEntries.length - 1].correlationId ===\r\n correlationId\r\n ) {\r\n this.undoEntries[this.undoEntries.length - 1].entries.push(entry);\r\n this.redoEntries = [];\r\n return;\r\n }\r\n\r\n this.undoEntries.push({ correlationId, entries: [entry] });\r\n this.redoEntries = [];\r\n }\r\n\r\n private async applyCompensating(\r\n store: string,\r\n entry: AtomicUndoEntry,\r\n dispatch: CellUndoDispatch,\r\n ): Promise<void> {\r\n if (entry.kind === 'CELL_CHANGED') {\r\n await dispatch({\r\n type: 'CHANGE_CELL_VALUE',\r\n store,\r\n tableKey: entry.tableId,\r\n rowId: entry.rowId,\r\n columnId: entry.columnId,\r\n newValue: entry.previousValue,\r\n });\r\n return;\r\n }\r\n\r\n if (entry.kind === 'ROW_ADDED') {\r\n await dispatch({\r\n type: 'ROW_DELETED',\r\n store,\r\n tableKey: entry.tableId,\r\n rowId: entry.rowId,\r\n });\r\n return;\r\n }\r\n\r\n // ROW_DELETED undo: restore source\r\n if (entry.mode === 'soft') {\r\n // Domain toggles Deleted → Unchanged/Modified\r\n await dispatch({\r\n type: 'ROW_DELETED',\r\n store,\r\n tableKey: entry.tableId,\r\n rowId: entry.rowId,\r\n });\r\n return;\r\n }\r\n\r\n await dispatch({\r\n type: 'RESTORE_ADDED_ROW',\r\n store,\r\n tableKey: entry.tableId,\r\n rowId: entry.rowId,\r\n cells: entry.cells,\r\n collection: entry.collection,\r\n isSaveDescription: entry.isSaveDescription,\r\n });\r\n }\r\n\r\n private async applyForward(\r\n store: string,\r\n entry: AtomicUndoEntry,\r\n dispatch: CellUndoDispatch,\r\n ): Promise<void> {\r\n if (entry.kind === 'CELL_CHANGED') {\r\n await dispatch({\r\n type: 'CHANGE_CELL_VALUE',\r\n store,\r\n tableKey: entry.tableId,\r\n rowId: entry.rowId,\r\n columnId: entry.columnId,\r\n newValue: entry.newValue,\r\n });\r\n return;\r\n }\r\n\r\n if (entry.kind === 'ROW_ADDED') {\r\n await dispatch({\r\n type: 'RESTORE_ADDED_ROW',\r\n store,\r\n tableKey: entry.tableId,\r\n rowId: entry.rowId,\r\n cells: entry.cells,\r\n collection: entry.collection,\r\n isSaveDescription: entry.isSaveDescription,\r\n });\r\n return;\r\n }\r\n\r\n // ROW_DELETED redo: delete again\r\n await dispatch({\r\n type: 'ROW_DELETED',\r\n store,\r\n tableKey: entry.tableId,\r\n rowId: entry.rowId,\r\n });\r\n }\r\n}\r\n","/**\r\n * Block cache for infinite / server-side row models (PR-102).\r\n * Pure — no React/DOM.\r\n */\r\n\r\nexport type BlockCacheEntry<T> = {\r\n readonly rows: readonly T[];\r\n lastAccess: number;\r\n};\r\n\r\nexport function blockIndexForRow(rowIndex: number, blockSize: number): number {\r\n const size = Math.max(1, blockSize);\r\n return Math.floor(Math.max(0, rowIndex) / size);\r\n}\r\n\r\nexport function blockRange(\r\n blockIndex: number,\r\n blockSize: number,\r\n): { startRow: number; endRow: number } {\r\n const size = Math.max(1, blockSize);\r\n const startRow = Math.max(0, blockIndex) * size;\r\n return { startRow, endRow: startRow + size };\r\n}\r\n\r\n/** Inclusive of start, exclusive of end — all block indices that overlap. */\r\nexport function blocksCovering(\r\n startRow: number,\r\n endRow: number,\r\n blockSize: number,\r\n): number[] {\r\n const size = Math.max(1, blockSize);\r\n const start = Math.max(0, startRow);\r\n const end = Math.max(start, endRow);\r\n if (end <= start) return [];\r\n const first = blockIndexForRow(start, size);\r\n const last = blockIndexForRow(end - 1, size);\r\n const out: number[] = [];\r\n for (let i = first; i <= last; i += 1) out.push(i);\r\n return out;\r\n}\r\n\r\n/**\r\n * LRU map of block index → rows. Evicts least-recently-used when over capacity.\r\n */\r\nexport class BlockCache<T> {\r\n private readonly blocks = new Map<number, BlockCacheEntry<T>>();\r\n private clock = 0;\r\n\r\n constructor(private readonly maxBlocks: number) {}\r\n\r\n get size(): number {\r\n return this.blocks.size;\r\n }\r\n\r\n has(blockIndex: number): boolean {\r\n return this.blocks.has(blockIndex);\r\n }\r\n\r\n get(blockIndex: number): readonly T[] | undefined {\r\n const entry = this.blocks.get(blockIndex);\r\n if (!entry) return undefined;\r\n entry.lastAccess = ++this.clock;\r\n return entry.rows;\r\n }\r\n\r\n set(blockIndex: number, rows: readonly T[]): void {\r\n this.blocks.set(blockIndex, {\r\n rows: rows.slice(),\r\n lastAccess: ++this.clock,\r\n });\r\n this.evictIfNeeded();\r\n }\r\n\r\n clear(): void {\r\n this.blocks.clear();\r\n this.clock = 0;\r\n }\r\n\r\n keys(): number[] {\r\n return [...this.blocks.keys()].sort((a, b) => a - b);\r\n }\r\n\r\n private evictIfNeeded(): void {\r\n const max = Math.max(1, this.maxBlocks);\r\n while (this.blocks.size > max) {\r\n let victim: number | undefined;\r\n let oldest = Infinity;\r\n for (const [idx, entry] of this.blocks) {\r\n if (entry.lastAccess < oldest) {\r\n oldest = entry.lastAccess;\r\n victim = idx;\r\n }\r\n }\r\n if (victim === undefined) break;\r\n this.blocks.delete(victim);\r\n }\r\n }\r\n}\r\n\r\nexport type AssembleBlockWindowResult<T> = {\r\n rows: T[];\r\n /** Absolute row indices still loading (no cache hit). */\r\n loadingIndices: number[];\r\n};\r\n\r\n/**\r\n * Build a contiguous `[startRow, endRow)` slice from cached blocks.\r\n * Missing cells use `placeholder(absoluteIndex)`.\r\n */\r\nexport function assembleBlockWindow<T>(\r\n cache: BlockCache<T>,\r\n startRow: number,\r\n endRow: number,\r\n blockSize: number,\r\n placeholder: (absoluteIndex: number) => T,\r\n): AssembleBlockWindowResult<T> {\r\n const start = Math.max(0, startRow);\r\n const end = Math.max(start, endRow);\r\n const rows: T[] = [];\r\n const loadingIndices: number[] = [];\r\n for (let i = start; i < end; i += 1) {\r\n const bi = blockIndexForRow(i, blockSize);\r\n const block = cache.get(bi);\r\n if (!block) {\r\n rows.push(placeholder(i));\r\n loadingIndices.push(i);\r\n continue;\r\n }\r\n const offset = i - bi * Math.max(1, blockSize);\r\n if (offset < block.length) {\r\n rows.push(block[offset] as T);\r\n } else {\r\n // Past end of a short final block — stop assembling.\r\n break;\r\n }\r\n }\r\n return { rows, loadingIndices };\r\n}\r\n","import type { ColumnDef } from '../../domain/types/ColumnDef';\r\nimport type { TableEngine } from '../../engine/tableEngine';\r\nimport type { GetRowId } from '../../infrastructure/rows/mapRowData';\r\nimport {\r\n BlockCache,\r\n assembleBlockWindow,\r\n blockRange,\r\n blocksCovering,\r\n} from '../../engine/dataOps/blockCache';\r\nimport {\r\n pageWindow,\r\n SERVER_ROW_LOADING_FLAG,\r\n} from '../../engine/dataOps/rowModel';\r\nimport type { GridSession } from '../session/GridSession';\r\nimport {\r\n isServerRowModel,\r\n type GridDatasource,\r\n type RowModelType,\r\n} from '../ports/GridDatasource';\r\n\r\nexport type AttachServerRowModelOptions<TRow> = {\r\n engine: TableEngine;\r\n rowModelType: RowModelType;\r\n datasource: GridDatasource<TRow>;\r\n columnDefs?: ColumnDef<TRow>[];\r\n getRowId?: GetRowId<TRow>;\r\n /** Optional session — viewport scroll drives block fetches (PR-102). */\r\n session?: GridSession;\r\n /** Rows per cache block (PR-102). Default 100. */\r\n cacheBlockSize?: number;\r\n /** Max blocks retained (LRU). Default 10. */\r\n maxBlocksInCache?: number;\r\n};\r\n\r\nexport type ServerRowModelHandle = {\r\n refresh: () => Promise<void>;\r\n /** Purge cache and refetch (PR-102). */\r\n refreshServerSide: () => Promise<void>;\r\n dispose: () => void;\r\n /** Test/inspection helper. */\r\n getCacheSize: () => number;\r\n};\r\n\r\nfunction loadingPlaceholder<TRow>(absoluteIndex: number): TRow {\r\n return {\r\n [SERVER_ROW_LOADING_FLAG]: true,\r\n id: `loading-${absoluteIndex}`,\r\n } as TRow;\r\n}\r\n\r\nfunction queryFingerprint(\r\n sortModel: unknown,\r\n filterModel: unknown,\r\n): string {\r\n return JSON.stringify({ sortModel, filterModel });\r\n}\r\n\r\n/**\r\n * Wires {@link GridDatasource} with a block cache (PR-102).\r\n * Sort/filter purge the cache; scroll/page only fetch missing blocks.\r\n */\r\nexport function attachServerRowModel<TRow>(\r\n opts: AttachServerRowModelOptions<TRow>,\r\n): ServerRowModelHandle {\r\n const {\r\n engine,\r\n rowModelType,\r\n datasource,\r\n columnDefs,\r\n getRowId,\r\n session,\r\n cacheBlockSize = 100,\r\n maxBlocksInCache = 10,\r\n } = opts;\r\n\r\n if (!isServerRowModel(rowModelType)) {\r\n return {\r\n refresh: async () => undefined,\r\n refreshServerSide: async () => undefined,\r\n dispose: () => undefined,\r\n getCacheSize: () => 0,\r\n };\r\n }\r\n\r\n engine.setRowModelType(rowModelType);\r\n\r\n const configuredBlockSize =\r\n typeof cacheBlockSize === 'number' && cacheBlockSize > 0\r\n ? cacheBlockSize\r\n : undefined;\r\n const resolveBlockSize = (): number =>\r\n Math.max(\r\n 1,\r\n configuredBlockSize ??\r\n engine.getViewState()?.pagination.pageSize ??\r\n 100,\r\n );\r\n const cache = new BlockCache<TRow>(Math.max(1, maxBlocksInCache));\r\n const inflight = new Map<number, Promise<void>>();\r\n let seq = 0;\r\n let lastQueryFp = '';\r\n\r\n const resolveWindow = (\r\n blockSize: number,\r\n ): { startRow: number; endRow: number } => {\r\n if (session) {\r\n const total =\r\n engine.getViewState()?.pagination.totalRows ??\r\n Math.max(session.getUiRowCount(), blockSize * 2);\r\n const range = session.getVisibleRange(Math.max(total, blockSize));\r\n const startRow = Math.max(0, range.startIndex);\r\n const endRow = Math.max(startRow + 1, range.endIndex);\r\n return { startRow, endRow };\r\n }\r\n const view = engine.getViewState();\r\n if (!view) return { startRow: 0, endRow: blockSize };\r\n return pageWindow(view.pagination.page, view.pagination.pageSize);\r\n };\r\n\r\n const ensureBlock = async (\r\n blockIndex: number,\r\n blockSize: number,\r\n ): Promise<void> => {\r\n if (cache.has(blockIndex)) {\r\n cache.get(blockIndex);\r\n return;\r\n }\r\n const existing = inflight.get(blockIndex);\r\n if (existing) {\r\n await existing;\r\n return;\r\n }\r\n const { startRow, endRow } = blockRange(blockIndex, blockSize);\r\n const view = engine.getViewState();\r\n const sortModel = view?.sortModel ?? [];\r\n const filterModel = view?.filterModel ?? {};\r\n const job = (async () => {\r\n const result = await datasource.getRows({\r\n startRow,\r\n endRow,\r\n sortModel,\r\n filterModel,\r\n });\r\n cache.set(blockIndex, result.rows);\r\n if (typeof result.lastRow === 'number' && Number.isFinite(result.lastRow)) {\r\n engine.setServerRowCount(Math.max(0, Math.floor(result.lastRow)));\r\n } else if (result.rows.length < blockSize) {\r\n engine.setServerRowCount(startRow + result.rows.length);\r\n } else {\r\n const known = engine.getViewState()?.pagination.totalRows ?? 0;\r\n engine.setServerRowCount(Math.max(known, endRow + blockSize));\r\n }\r\n })().finally(() => {\r\n inflight.delete(blockIndex);\r\n });\r\n inflight.set(blockIndex, job);\r\n await job;\r\n };\r\n\r\n const applyWindow = (\r\n startRow: number,\r\n endRow: number,\r\n blockSize: number,\r\n ): void => {\r\n const { rows } = assembleBlockWindow(\r\n cache,\r\n startRow,\r\n endRow,\r\n blockSize,\r\n (i) => loadingPlaceholder<TRow>(i),\r\n );\r\n engine.applyHostRowData(rows, columnDefs, getRowId);\r\n };\r\n\r\n const refresh = async (): Promise<void> => {\r\n const ticket = ++seq;\r\n const view = engine.getViewState();\r\n const fp = queryFingerprint(view?.sortModel ?? [], view?.filterModel ?? {});\r\n if (fp !== lastQueryFp) {\r\n cache.clear();\r\n lastQueryFp = fp;\r\n }\r\n\r\n const blockSize = resolveBlockSize();\r\n let { startRow, endRow } = resolveWindow(blockSize);\r\n const total = engine.getViewState()?.pagination.totalRows;\r\n if (typeof total === 'number' && total >= 0) {\r\n endRow = Math.min(endRow, Math.max(startRow + 1, total));\r\n }\r\n const needed = blocksCovering(startRow, endRow, blockSize);\r\n\r\n applyWindow(startRow, endRow, blockSize);\r\n\r\n await Promise.all(needed.map((bi) => ensureBlock(bi, blockSize)));\r\n if (ticket !== seq) return;\r\n applyWindow(startRow, endRow, blockSize);\r\n };\r\n\r\n const refreshServerSide = async (): Promise<void> => {\r\n cache.clear();\r\n lastQueryFp = '';\r\n await refresh();\r\n };\r\n\r\n engine.bindViewQueryListener(() => {\r\n void refresh();\r\n });\r\n\r\n let unsubViewport: (() => void) | undefined;\r\n if (session) {\r\n unsubViewport = session.subscribeViewport(() => {\r\n void refresh();\r\n });\r\n }\r\n\r\n void refresh();\r\n\r\n return {\r\n refresh,\r\n refreshServerSide,\r\n dispose: () => {\r\n engine.bindViewQueryListener(undefined);\r\n unsubViewport?.();\r\n cache.clear();\r\n inflight.clear();\r\n },\r\n getCacheSize: () => cache.size,\r\n };\r\n}\r\n\r\n/** @deprecated Prefer {@link SERVER_ROW_LOADING_FLAG} from `engine/dataOps/rowModel`. */\r\nexport const LOADING_FLAG = SERVER_ROW_LOADING_FLAG;\r\nexport { SERVER_ROW_LOADING_FLAG };\r\n","/**\r\n * Focus helpers for APG grid / modal / menu (PR-124).\r\n * DOM-only; used by keyboard handler and UI overlays.\r\n */\r\n\r\nconst EDITOR_SELECTOR =\r\n 'input:not([type=\"hidden\"]):not([disabled]), textarea:not([disabled]), select:not([disabled]), [contenteditable=\"true\"]';\r\n\r\nexport function isCellEditorTarget(target: EventTarget | null): boolean {\r\n if (!target || !(target instanceof Element)) return false;\r\n if (target.closest('[role=\"menu\"], [role=\"dialog\"], .erp-table-modal')) {\r\n return false;\r\n }\r\n const editor = target.closest(EDITOR_SELECTOR);\r\n if (!editor) return false;\r\n return Boolean(editor.closest('[role=\"gridcell\"], [data-erp-cell-textarea]'));\r\n}\r\n\r\nexport function closestGridRoot(target: EventTarget | null): HTMLElement | null {\r\n if (!target || !(target instanceof Element)) return null;\r\n return target.closest('[role=\"grid\"], [role=\"treegrid\"]') as HTMLElement | null;\r\n}\r\n\r\n/** Focusable controls inside a container (for focus traps). */\r\nexport function listFocusable(container: HTMLElement): HTMLElement[] {\r\n const nodes = container.querySelectorAll<HTMLElement>(\r\n 'a[href], button:not([disabled]), input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\r\n );\r\n return Array.from(nodes).filter((el) => {\r\n if (el.hasAttribute('disabled')) return false;\r\n const style = typeof window !== 'undefined' ? window.getComputedStyle(el) : null;\r\n if (style && (style.visibility === 'hidden' || style.display === 'none')) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n}\r\n\r\n/**\r\n * Trap Tab inside `container`. Returns true when the event was handled.\r\n */\r\nexport function trapTabKey(\r\n container: HTMLElement,\r\n e: Pick<KeyboardEvent, 'key' | 'shiftKey' | 'preventDefault'>,\r\n): boolean {\r\n if (e.key !== 'Tab') return false;\r\n const focusables = listFocusable(container);\r\n if (focusables.length === 0) return false;\r\n const first = focusables[0]!;\r\n const last = focusables[focusables.length - 1]!;\r\n const active = document.activeElement as HTMLElement | null;\r\n if (e.shiftKey) {\r\n if (!active || active === first || !container.contains(active)) {\r\n e.preventDefault();\r\n last.focus();\r\n return true;\r\n }\r\n } else if (!active || active === last || !container.contains(active)) {\r\n e.preventDefault();\r\n first.focus();\r\n return true;\r\n }\r\n return false;\r\n}\r\n","// adapters/ui/UITableKeyboardHandler.ts\r\n\r\n\r\n\r\nimport { AuditLogger } from '../../application/ports/AuditLogger';\r\n\r\nimport type { ViewIntentDispatcher } from '../../application/session/ViewIntent';\r\n\r\nimport { TableEngine } from '../../engine/tableEngine';\r\n\r\nimport {\r\n closestGridRoot,\r\n isCellEditorTarget,\r\n} from './focusTrap';\r\n\r\n\r\n\r\ntype KeydownCtx = {\r\n\r\n activeRowId: number | null;\r\n\r\n activeColumnId: string | null;\r\n\r\n};\r\n\r\n\r\n\r\n/**\r\n\r\n * Keyboard shortcuts emit ViewIntent through the session dispatcher.\r\n\r\n * Reads (pagination / selection) still come from Engine view state.\r\n\r\n */\r\n\r\nexport class UITableKeyboardHandler {\r\n\r\n private copyCells?: () => Promise<boolean>;\r\n\r\n private cutCells?: () => Promise<boolean>;\r\n\r\n private pasteCells?: () => Promise<boolean>;\r\n\r\n\r\n\r\n constructor(\r\n\r\n private readonly engine: TableEngine,\r\n\r\n private readonly audit: AuditLogger,\r\n\r\n private readonly dispatchIntent: ViewIntentDispatcher,\r\n\r\n ) {}\r\n\r\n\r\n\r\n setCopyCells(handler: () => Promise<boolean>): void {\r\n\r\n this.copyCells = handler;\r\n\r\n }\r\n\r\n\r\n\r\n setCutCells(handler: () => Promise<boolean>): void {\r\n\r\n this.cutCells = handler;\r\n\r\n }\r\n\r\n\r\n\r\n setPasteCells(handler: () => Promise<boolean>): void {\r\n\r\n this.pasteCells = handler;\r\n\r\n }\r\n\r\n\r\n\r\n async handle(e: KeyboardEvent, ctx: KeydownCtx): Promise<void> {\r\n\r\n try {\r\n\r\n await this.handleInternal(e, ctx);\r\n\r\n } catch (error) {\r\n\r\n this.audit.log({\r\n\r\n type: 'ERROR',\r\n\r\n message: 'Unhandled error in keyboard handler',\r\n\r\n payload: { error, code: e.code, ctx },\r\n\r\n });\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n private async handleInternal(e: KeyboardEvent, ctx: KeydownCtx): Promise<void> {\r\n\r\n const view = this.engine.getViewState();\r\n\r\n if (!view) return;\r\n\r\n\r\n\r\n const { canPrev, canNext, page } = view.pagination;\r\n\r\n const { altKey, shiftKey, ctrlKey, code } = e;\r\n\r\n const { activeColumnId } = ctx;\r\n\r\n const selectedRows = this.engine.getSelectedRows();\r\n\r\n // When focus is inside a Select, ctx.activeRowId may be empty; fall back to\r\n // the engine's active row, then to the first selected row (arianERP parity).\r\n const activeRowId: number | null =\r\n ctx.activeRowId ??\r\n this.engine.getActiveRow() ??\r\n (selectedRows\r\n ? Number(Object.keys(selectedRows).find((id) => selectedRows[Number(id)])) ||\r\n null\r\n : null);\r\n\r\n\r\n\r\n switch (code) {\r\n\r\n case 'KeyN': {\r\n\r\n if (altKey) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({ type: 'ADD_EMPTY_ROW', autoActivate: true });\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'KeyD': {\r\n\r\n if (altKey && activeRowId != null) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({ type: 'DUPLICATE_ROW', rowId: activeRowId });\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'Delete': {\r\n\r\n if (altKey && activeRowId) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({ type: 'DELETE_ROW', rowId: activeRowId });\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'Home': {\r\n\r\n if (ctrlKey && !shiftKey && !altKey) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'JUMP_ACTIVE_CELL_GRID',\r\n\r\n corner: 'first',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (!ctrlKey && !shiftKey && !altKey && activeRowId && activeColumnId) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'JUMP_ACTIVE_CELL_ROW_EDGE',\r\n\r\n edge: 'start',\r\n\r\n });\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'End': {\r\n\r\n if (shiftKey && ctrlKey && activeRowId != null) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'SELECT_FROM_ACTIVE_TO_LAST',\r\n\r\n anchorRowId: activeRowId,\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (shiftKey && activeRowId != null) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'TOGGLE_ROW_SELECTION',\r\n\r\n rowId: activeRowId,\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (ctrlKey && !shiftKey && !altKey) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'JUMP_ACTIVE_CELL_GRID',\r\n\r\n corner: 'last',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (!ctrlKey && !shiftKey && !altKey && activeRowId && activeColumnId) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'JUMP_ACTIVE_CELL_ROW_EDGE',\r\n\r\n edge: 'end',\r\n\r\n });\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'Space': {\r\n\r\n if (activeRowId != null && ctrlKey) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'TOGGLE_ROW_SELECTION',\r\n\r\n rowId: activeRowId,\r\n\r\n });\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'NumpadEnter':\r\n\r\n case 'Enter': {\r\n\r\n e.preventDefault();\r\n\r\n if (activeRowId) {\r\n\r\n if (!activeColumnId) {\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'ACTIVATE_FIRST_CELL',\r\n\r\n rowId: activeRowId,\r\n\r\n });\r\n\r\n } else if (this.engine.getCellEdit()) {\r\n\r\n // PR-126: confirm (commit via MOVE) + move vertically.\r\n await this.dispatchIntent({\r\n\r\n type: 'MOVE_ACTIVE_CELL_VERTICAL',\r\n\r\n rowId: activeRowId,\r\n\r\n columnId: activeColumnId,\r\n\r\n direction: shiftKey ? 'up' : 'down',\r\n\r\n });\r\n\r\n } else if (!this.engine.getCellEditOptions().singleClickEdit) {\r\n\r\n this.engine.startCellEdit(activeRowId, activeColumnId);\r\n\r\n } else {\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'MOVE_ACTIVE_CELL_VERTICAL',\r\n\r\n rowId: activeRowId,\r\n\r\n columnId: activeColumnId,\r\n\r\n direction: shiftKey ? 'up' : 'down',\r\n\r\n });\r\n\r\n }\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'Tab': {\r\n\r\n // PR-124 APG: Tab exits the grid unless a cell editor is focused.\r\n // PR-126: while editing, Tab confirms + moves sideways.\r\n if (!isCellEditorTarget(e.target)) {\r\n return;\r\n }\r\n\r\n if (activeRowId && activeColumnId) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'MOVE_ACTIVE_CELL',\r\n\r\n rowId: activeRowId,\r\n\r\n columnId: activeColumnId,\r\n\r\n direction: shiftKey ? 'prev' : 'next',\r\n\r\n });\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'ArrowLeft': {\r\n\r\n if (\r\n !ctrlKey &&\r\n !shiftKey &&\r\n !altKey &&\r\n activeRowId != null &&\r\n this.engine.getGroupNode(activeRowId)\r\n ) {\r\n const expanded =\r\n this.engine.getRowView(activeRowId)?.groupExpanded !== false;\r\n if (expanded) {\r\n e.preventDefault();\r\n this.engine.toggleRowGroupById(activeRowId);\r\n return;\r\n }\r\n }\r\n\r\n if (ctrlKey && shiftKey && !altKey && activeRowId && activeColumnId) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'EXTEND_CELL_RANGE_TO_EDGE',\r\n\r\n direction: 'left',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (altKey) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({ type: 'COLLAPSE_ALL_ROWS' });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (shiftKey && !ctrlKey && activeRowId && activeColumnId) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'EXTEND_CELL_RANGE',\r\n\r\n direction: 'left',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (!activeRowId || !activeColumnId) return;\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'MOVE_ACTIVE_CELL',\r\n\r\n rowId: activeRowId,\r\n\r\n columnId: activeColumnId,\r\n\r\n direction: 'next',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'ArrowRight': {\r\n\r\n if (\r\n !ctrlKey &&\r\n !shiftKey &&\r\n !altKey &&\r\n activeRowId != null &&\r\n this.engine.getGroupNode(activeRowId)\r\n ) {\r\n const expanded =\r\n this.engine.getRowView(activeRowId)?.groupExpanded !== false;\r\n if (!expanded) {\r\n e.preventDefault();\r\n this.engine.toggleRowGroupById(activeRowId);\r\n return;\r\n }\r\n }\r\n\r\n if (ctrlKey && shiftKey && !altKey && activeRowId && activeColumnId) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'EXTEND_CELL_RANGE_TO_EDGE',\r\n\r\n direction: 'right',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (shiftKey && !ctrlKey && activeRowId && activeColumnId) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'EXTEND_CELL_RANGE',\r\n\r\n direction: 'right',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (!activeRowId || !activeColumnId) return;\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'MOVE_ACTIVE_CELL',\r\n\r\n rowId: activeRowId,\r\n\r\n columnId: activeColumnId,\r\n\r\n direction: 'prev',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'ArrowDown': {\r\n\r\n if (ctrlKey && shiftKey && !altKey && activeRowId && activeColumnId) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'EXTEND_CELL_RANGE_TO_EDGE',\r\n\r\n direction: 'down',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (shiftKey && !altKey && !ctrlKey && activeRowId && activeColumnId) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'EXTEND_CELL_RANGE',\r\n\r\n direction: 'down',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (altKey && selectedRows) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'MOVE_VERTICAL_SELECTED_ROWS',\r\n\r\n direction: 'down',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (ctrlKey && activeRowId) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'MOVE_VERTICAL_ACTIVE_ROW',\r\n\r\n direction: 'down',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (!activeRowId) return;\r\n\r\n if (!activeColumnId) return;\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'MOVE_ACTIVE_CELL_VERTICAL',\r\n\r\n rowId: activeRowId,\r\n\r\n columnId: activeColumnId,\r\n\r\n direction: 'down',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'ArrowUp': {\r\n\r\n if (ctrlKey && shiftKey && !altKey && activeRowId && activeColumnId) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'EXTEND_CELL_RANGE_TO_EDGE',\r\n\r\n direction: 'up',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (shiftKey && !altKey && !ctrlKey && activeRowId && activeColumnId) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'EXTEND_CELL_RANGE',\r\n\r\n direction: 'up',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (altKey && selectedRows) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'MOVE_VERTICAL_SELECTED_ROWS',\r\n\r\n direction: 'up',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (ctrlKey && activeRowId) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'MOVE_VERTICAL_ACTIVE_ROW',\r\n\r\n direction: 'up',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (!activeRowId) return;\r\n\r\n if (!activeColumnId) return;\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'MOVE_ACTIVE_CELL_VERTICAL',\r\n\r\n rowId: activeRowId,\r\n\r\n columnId: activeColumnId,\r\n\r\n direction: 'up',\r\n\r\n });\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'PageUp': {\r\n\r\n if (!canPrev) return;\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({ type: 'CHANGE_PAGE', page: page - 1 });\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'PageDown': {\r\n\r\n if (!canNext) return;\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({ type: 'CHANGE_PAGE', page: page + 1 });\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'KeyA': {\r\n\r\n if (ctrlKey) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({ type: 'SELECT_ALL_CELLS' });\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'KeyC': {\r\n\r\n if (ctrlKey && !altKey) {\r\n\r\n e.preventDefault();\r\n\r\n if (this.copyCells) {\r\n\r\n await this.copyCells();\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n /** @deprecated D18 — use Ctrl+C (system clipboard). Alt+C keeps row-clone mode until 1.0.0. */\r\n\r\n if (altKey) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({ type: 'SET_TABLE_ACTION', action: 'copy' });\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'KeyX': {\r\n\r\n if (ctrlKey && !altKey) {\r\n\r\n e.preventDefault();\r\n\r\n if (this.cutCells) {\r\n\r\n await this.cutCells();\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n /** @deprecated D18 — use Ctrl+X (system clipboard cut). Alt+X keeps row-clone mode until 1.0.0. */\r\n\r\n if (altKey) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({ type: 'SET_TABLE_ACTION', action: 'cut' });\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'KeyV': {\r\n\r\n if (ctrlKey && !altKey) {\r\n\r\n e.preventDefault();\r\n\r\n if (this.pasteCells) {\r\n\r\n await this.pasteCells();\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n /** @deprecated D18 — use Ctrl+V (system clipboard). Alt+V keeps row-clone mode until 1.0.0. */\r\n\r\n if (altKey) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({ type: 'SET_TABLE_ACTION', action: 'paste' });\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'KeyB': {\r\n\r\n if (altKey) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({\r\n\r\n type: 'SET_TABLE_ACTION',\r\n\r\n action: 'pasteInsert',\r\n\r\n });\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'F2': {\r\n\r\n if (activeRowId && activeColumnId && !this.engine.getCellEdit()) {\r\n e.preventDefault();\r\n this.engine.startCellEdit(activeRowId, activeColumnId);\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'Escape': {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({ type: 'SET_TABLE_ACTION', action: null });\r\n\r\n // PR-126: Esc cancels the draft (no EventStore write).\r\n if (this.engine.getCellEdit()) {\r\n this.engine.cancelCellEdit();\r\n }\r\n\r\n // PR-124: Esc ladder — editor → grid, cell chrome → grid, grid → blur.\r\n const target = e.target as HTMLElement | null;\r\n const grid = closestGridRoot(target);\r\n if (target && grid) {\r\n if (isCellEditorTarget(target)) {\r\n target.blur();\r\n grid.focus();\r\n } else if (target === grid) {\r\n grid.blur();\r\n } else {\r\n grid.focus();\r\n }\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'KeyZ': {\r\n\r\n if (ctrlKey && !shiftKey) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({ type: 'UNDO' });\r\n\r\n return;\r\n\r\n }\r\n\r\n if (ctrlKey && shiftKey) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({ type: 'REDO' });\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n case 'KeyY': {\r\n\r\n if (ctrlKey) {\r\n\r\n e.preventDefault();\r\n\r\n await this.dispatchIntent({ type: 'REDO' });\r\n\r\n }\r\n\r\n return;\r\n\r\n }\r\n\r\n\r\n\r\n default:\r\n\r\n return;\r\n\r\n }\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n","import type { AuditLogger } from '../../application/ports/AuditLogger';\r\nimport type { CellUndoStack } from '../../application/undo/CellUndoStack';\r\nimport type { GridSession } from '../../application/session/GridSession';\r\nimport type { ViewIntent } from '../../application/session/ViewIntent';\r\nimport type { CollectionScope } from '../../domain/entities/Table';\r\nimport { Viewport } from '../../domain/value-objects/Viewport';\r\nimport type { VisibleRange } from '../../domain/value-objects/Viewport';\r\nimport type { TableEngine } from '../../engine/tableEngine';\r\nimport type { TableSnapShot } from '../../engine/type';\r\nimport { ViewportCalculator } from '../../engine/ViewportCalculator';\r\nimport type {\r\n ChangelogEntry,\r\n ChangelogProjection,\r\n ChangelogQuery,\r\n} from '../projections/ChangelogProjection';\r\nimport type {\r\n HistoryItem,\r\n HistoryPanelViewModel,\r\n HistoryQuery,\r\n} from '../history/HistoryPanelViewModel';\r\nimport { UITableKeyboardHandler } from '../ui/UITableKeyboardHandler';\r\n\r\nexport type CreateGridSessionDeps = {\r\n engine: TableEngine;\r\n store: string;\r\n tableKey: string;\r\n audit: AuditLogger;\r\n changelogProjection?: ChangelogProjection;\r\n historyPanelViewModel?: HistoryPanelViewModel;\r\n cellUndoStack?: CellUndoStack;\r\n /** Initial virtual viewport; defaults to 400px × 40px rows. */\r\n initialViewport?: Viewport;\r\n};\r\n\r\nexport class DefaultGridSession implements GridSession {\r\n private readonly keyboard: UITableKeyboardHandler;\r\n private viewport: Viewport;\r\n private readonly viewportListeners = new Set<() => void>();\r\n\r\n constructor(private readonly deps: CreateGridSessionDeps) {\r\n this.viewport =\r\n deps.initialViewport ?? new Viewport(0, 400, 40, 2);\r\n this.keyboard = new UITableKeyboardHandler(\r\n deps.engine,\r\n deps.audit,\r\n (intent) => this.dispatchViewIntent(intent),\r\n );\r\n }\r\n\r\n get store(): string {\r\n return this.deps.store;\r\n }\r\n\r\n get tableKey(): string {\r\n return this.deps.tableKey;\r\n }\r\n\r\n getEngine(): TableEngine {\r\n return this.deps.engine;\r\n }\r\n\r\n attachCopyCells(handler: () => Promise<boolean>): void {\r\n this.keyboard.setCopyCells(handler);\r\n }\r\n\r\n attachPasteCells(handler: () => Promise<boolean>): void {\r\n this.keyboard.setPasteCells(handler);\r\n }\r\n\r\n attachCutCells(handler: () => Promise<boolean>): void {\r\n this.keyboard.setCutCells(handler);\r\n }\r\n\r\n async dispatchViewIntent(intent: ViewIntent): Promise<void> {\r\n const { engine, store, tableKey, cellUndoStack } = this.deps;\r\n\r\n switch (intent.type) {\r\n case 'ADD_EMPTY_ROW':\r\n await engine.dispatch({\r\n type: 'ADD_EMPTY_ROW',\r\n store,\r\n tableKey,\r\n autoActivate: intent.autoActivate ?? true,\r\n });\r\n return;\r\n case 'DUPLICATE_ROW':\r\n await engine.dispatch({\r\n type: 'DUPLICATE_ROW',\r\n store,\r\n tableKey,\r\n rowId: intent.rowId,\r\n });\r\n return;\r\n case 'DELETE_ROW':\r\n await engine.dispatch({\r\n type: 'ROW_DELETED',\r\n store,\r\n tableKey,\r\n rowId: intent.rowId,\r\n });\r\n return;\r\n case 'TOGGLE_ROW_SELECTION':\r\n await engine.dispatch({\r\n type: 'ROW_SELECTION_TOGGLED',\r\n tableKey,\r\n rowId: intent.rowId,\r\n });\r\n return;\r\n case 'SELECT_FROM_ACTIVE_TO_LAST':\r\n await engine.dispatch({\r\n type: 'SELECT_FROM_ACTIVE_TO_LAST',\r\n tableKey,\r\n anchorRowId: intent.anchorRowId,\r\n });\r\n return;\r\n case 'ACTIVATE_FIRST_CELL':\r\n await engine.dispatch({\r\n type: 'ACTIVATE_FIRST_CELL',\r\n tableKey,\r\n rowId: intent.rowId,\r\n });\r\n return;\r\n case 'MOVE_ACTIVE_CELL':\r\n await engine.dispatch({\r\n type: 'MOVE_ACTIVE_CELL',\r\n store,\r\n tableKey,\r\n rowId: intent.rowId,\r\n columnId: intent.columnId,\r\n direction: intent.direction,\r\n });\r\n engine.syncCellRangeToActiveCell();\r\n return;\r\n case 'MOVE_ACTIVE_CELL_VERTICAL':\r\n await engine.dispatch({\r\n type: 'MOVE_ACTIVE_CELL_VERTICAL',\r\n store,\r\n tableKey,\r\n rowId: intent.rowId,\r\n columnId: intent.columnId,\r\n direction: intent.direction,\r\n });\r\n engine.syncCellRangeToActiveCell();\r\n return;\r\n case 'EXTEND_CELL_RANGE':\r\n engine.extendCellRangeArrow(intent.direction);\r\n return;\r\n case 'EXTEND_CELL_RANGE_TO_EDGE':\r\n engine.extendCellRangeToEdge(intent.direction);\r\n return;\r\n case 'JUMP_ACTIVE_CELL_ROW_EDGE':\r\n engine.jumpActiveCellRowEdge(intent.edge);\r\n return;\r\n case 'JUMP_ACTIVE_CELL_GRID':\r\n engine.jumpActiveCellGridCorner(intent.corner);\r\n return;\r\n case 'SELECT_ALL_CELLS':\r\n engine.selectAllCells();\r\n return;\r\n case 'MOVE_VERTICAL_SELECTED_ROWS':\r\n await engine.dispatch({\r\n type: 'MOVE_VERTICAL_SELECTED_ROWS',\r\n tableKey,\r\n direction: intent.direction,\r\n });\r\n return;\r\n case 'MOVE_VERTICAL_ACTIVE_ROW':\r\n await engine.dispatch({\r\n type: 'MOVE_VERTICAL_ACTIVE_ROW',\r\n tableKey,\r\n direction: intent.direction,\r\n });\r\n return;\r\n case 'COLLAPSE_ALL_ROWS':\r\n await engine.dispatch({ type: 'COLLAPSE_ALL_ROWS', tableKey });\r\n return;\r\n case 'CHANGE_PAGE':\r\n await engine.dispatch({\r\n type: 'CHANGE_PAGE',\r\n store,\r\n tableKey,\r\n page: intent.page,\r\n });\r\n return;\r\n case 'CHANGE_PAGE_SIZE':\r\n await engine.dispatch({\r\n type: 'CHANGE_PAGE_SIZE',\r\n store,\r\n tableKey,\r\n pageSize: intent.pageSize,\r\n });\r\n return;\r\n case 'SET_TABLE_ACTION':\r\n await engine.dispatch({\r\n type: 'SET_TABLE_ACTION',\r\n store,\r\n tableKey,\r\n action: intent.action,\r\n });\r\n return;\r\n case 'SET_GRID_SEARCH':\r\n await engine.dispatch({\r\n type: 'SET_GRID_SEARCH',\r\n tableKey,\r\n search: intent.search,\r\n });\r\n return;\r\n case 'SET_MOBILE_EDITOR':\r\n await engine.dispatch({\r\n type: 'SET_MOBILE_EDITOR',\r\n tableKey,\r\n editor: intent.editor,\r\n });\r\n return;\r\n case 'CHANGE_VIEWPORT': {\r\n const next = new Viewport(\r\n intent.scrollOffset,\r\n intent.viewportSize ?? this.viewport.viewportSize,\r\n intent.rowHeight ?? this.viewport.rowHeight,\r\n intent.overscan ?? this.viewport.overscan,\r\n );\r\n if (!this.viewport.equals(next)) {\r\n this.viewport = next;\r\n this.notifyViewportListeners();\r\n }\r\n return;\r\n }\r\n case 'UNDO':\r\n if (!cellUndoStack) return;\r\n await cellUndoStack.undo(store, (command) => engine.dispatch(command));\r\n return;\r\n case 'REDO':\r\n if (!cellUndoStack) return;\r\n await cellUndoStack.redo(store, (command) => engine.dispatch(command));\r\n return;\r\n default: {\r\n const _exhaustive: never = intent;\r\n return _exhaustive;\r\n }\r\n }\r\n }\r\n\r\n async handleKeydown(\r\n event: KeyboardEvent,\r\n ctx: { activeRowId: number | null; activeColumnId: string | null },\r\n ): Promise<void> {\r\n await this.keyboard.handle(event, ctx);\r\n }\r\n\r\n getSnapShot(collectionScope: CollectionScope = 'active'): TableSnapShot | null {\r\n return this.deps.engine.getSnapShot(collectionScope);\r\n }\r\n\r\n getViewState() {\r\n return this.deps.engine.getViewState();\r\n }\r\n\r\n subscribe(cb: () => void): () => void {\r\n return this.deps.engine.subscribe(cb) ?? (() => {});\r\n }\r\n\r\n subscribeSelected<TSelected>(\r\n selector: () => TSelected,\r\n listener: (selected: TSelected) => void,\r\n isEqual: (a: TSelected, b: TSelected) => boolean = Object.is,\r\n ): () => void {\r\n let current = selector();\r\n const onChange = () => {\r\n const next = selector();\r\n if (!isEqual(current, next)) {\r\n current = next;\r\n listener(next);\r\n }\r\n };\r\n const unsubEngine = this.deps.engine.subscribe(onChange) ?? (() => {});\r\n this.viewportListeners.add(onChange);\r\n return () => {\r\n unsubEngine();\r\n this.viewportListeners.delete(onChange);\r\n };\r\n }\r\n\r\n getViewport(): Viewport {\r\n return this.viewport;\r\n }\r\n\r\n subscribeViewport(listener: () => void): () => void {\r\n this.viewportListeners.add(listener);\r\n return () => {\r\n this.viewportListeners.delete(listener);\r\n };\r\n }\r\n\r\n getVisibleRange(totalRows?: number): VisibleRange {\r\n const count = totalRows ?? this.deps.engine.getUiRowCount();\r\n return ViewportCalculator.calculate(count, this.viewport);\r\n }\r\n\r\n projectVisibleRows<T>(rows: readonly T[], totalRows?: number): T[] {\r\n const range = this.getVisibleRange(totalRows ?? rows.length);\r\n return ViewportCalculator.projectRows(rows, range);\r\n }\r\n\r\n getUiRowCount(): number {\r\n return this.deps.engine.getUiRowCount();\r\n }\r\n\r\n projectVisibleUiRows(): NonNullable<ReturnType<TableEngine['getRowView']>>[] {\r\n return this.deps.engine.projectVisibleUiRows(this.getVisibleRange());\r\n }\r\n\r\n private notifyViewportListeners(): void {\r\n for (const listener of this.viewportListeners) listener();\r\n }\r\n\r\n canUndo(): boolean {\r\n return this.deps.cellUndoStack?.canUndo() ?? false;\r\n }\r\n\r\n canRedo(): boolean {\r\n return this.deps.cellUndoStack?.canRedo() ?? false;\r\n }\r\n\r\n async undo(): Promise<boolean> {\r\n if (!this.deps.cellUndoStack) return false;\r\n return this.deps.cellUndoStack.undo(this.deps.store, (command) =>\r\n this.deps.engine.dispatch(command),\r\n );\r\n }\r\n\r\n async redo(): Promise<boolean> {\r\n if (!this.deps.cellUndoStack) return false;\r\n return this.deps.cellUndoStack.redo(this.deps.store, (command) =>\r\n this.deps.engine.dispatch(command),\r\n );\r\n }\r\n\r\n getChangelog(filter: Omit<ChangelogQuery, 'tableId'> = {}): ChangelogEntry[] {\r\n if (!this.deps.changelogProjection) return [];\r\n return this.deps.changelogProjection.query({\r\n tableId: this.deps.tableKey,\r\n ...filter,\r\n });\r\n }\r\n\r\n getChangelogCount(filter: Omit<ChangelogQuery, 'tableId'> = {}): number {\r\n if (!this.deps.changelogProjection) return 0;\r\n return this.deps.changelogProjection.count({\r\n tableId: this.deps.tableKey,\r\n ...filter,\r\n });\r\n }\r\n\r\n subscribeChangelog(\r\n cb: (entries: ChangelogEntry[]) => void,\r\n filter: Omit<ChangelogQuery, 'tableId'> = {},\r\n ): () => void {\r\n if (!this.deps.changelogProjection) return () => {};\r\n return this.deps.changelogProjection.subscribe(cb, {\r\n tableId: this.deps.tableKey,\r\n ...filter,\r\n });\r\n }\r\n\r\n getHistoryItems(filter: Omit<HistoryQuery, 'tableId'> = {}): HistoryItem[] {\r\n if (!this.deps.historyPanelViewModel) return [];\r\n return this.deps.historyPanelViewModel.query({\r\n tableId: this.deps.tableKey,\r\n ...filter,\r\n });\r\n }\r\n\r\n getHistoryItemCount(filter: Omit<HistoryQuery, 'tableId'> = {}): number {\r\n if (!this.deps.historyPanelViewModel) return 0;\r\n return this.deps.historyPanelViewModel.count({\r\n tableId: this.deps.tableKey,\r\n ...filter,\r\n });\r\n }\r\n\r\n subscribeHistoryItems(\r\n cb: (items: HistoryItem[]) => void,\r\n filter: Omit<HistoryQuery, 'tableId'> = {},\r\n ): () => void {\r\n if (!this.deps.historyPanelViewModel) return () => {};\r\n return this.deps.historyPanelViewModel.subscribe(cb, {\r\n tableId: this.deps.tableKey,\r\n ...filter,\r\n });\r\n }\r\n}\r\n","// application/handlers/rowCommandsHandler.ts\r\n\r\nimport { DomainError } from '../../domain/errors/DomainError';\r\nimport {\r\n RowAdded,\r\n RowRemoved,\r\n MinimumRowConstraintViolated,\r\n} from '../../domain/events';\r\nimport {\r\n Actor,\r\n PermissionPolicy,\r\n} from '../../domain/policies';\r\nimport {\r\n ColumnId,\r\n KeyValue,\r\n Pagination,\r\n RowId,\r\n RowState,\r\n RowStateEnum,\r\n} from '../../domain/value-objects';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport { Row } from '../../domain/entities/Row';\r\nimport {\r\n AddEmptyRowCommand,\r\n AddNewRowsCommand,\r\n DeleteRowCommand,\r\n DeleteRowsCommand,\r\n DuplicateRowCommand,\r\n PasteRowCommand,\r\n RestoreAddedRowCommand,\r\n RowReorderedCommand,\r\n} from '../commands';\r\nimport { AuditLogger } from '../ports/AuditLogger';\r\nimport {\r\n isWindowedRepository,\r\n TableRepository,\r\n WindowedTableRepository,\r\n} from '../ports/TableRepository';\r\n\r\n/** Page-window append (lazy module — only paged mode pays for it). */\r\nasync function appendAtEndAndShowLastPage(\r\n repo: WindowedTableRepository,\r\n store: string,\r\n tableKey: string,\r\n table: Table,\r\n data?: KeyValue[],\r\n): Promise<RowAdded> {\r\n const mod = await import('./appendAtEnd');\r\n return mod.appendAtEndAndShowLastPage(repo, store, tableKey, table, data);\r\n}\r\n\r\n/* ======================================================\r\n Add New Row\r\n ====================================================== */\r\n\r\nexport class AddNewRowCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy\r\n ) { }\r\n\r\n async execute(command: AddEmptyRowCommand, actor: Actor) {\r\n try {\r\n if (!command.tableKey) return null;\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n if (!this.permission.canAddRow?.({ actor })) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to add a new row',\r\n { actor }\r\n );\r\n }\r\n let event: RowAdded;\r\n if (isWindowedRepository(this.repo)) {\r\n event = await appendAtEndAndShowLastPage(\r\n this.repo,\r\n command.store,\r\n command.tableKey,\r\n table,\r\n );\r\n } else {\r\n event = table.addNewRow();\r\n await this.repo.save(command.store, table);\r\n }\r\n this.audit.log({ type: 'INFORMATION', message: event.type, payload: event.rowId });\r\n return event;\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return null\r\n }\r\n }\r\n}\r\n/* ======================================================\r\n Add New Rows\r\n ====================================================== */\r\n\r\nexport class AddNewRowsCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy\r\n ) {}\r\n\r\n async execute(command: AddNewRowsCommand, actor: Actor) {\r\n try {\r\n if (!command.tableKey) return null;\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n if (!this.permission.canAddRow?.({ actor })) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to add rows',\r\n { actor }\r\n );\r\n }\r\n let events: RowAdded[];\r\n if (isWindowedRepository(this.repo)) {\r\n // Memory Iron Rule: count existing rows via streaming cursor (heap = one\r\n // batch) instead of hydrating the full dataset with getAllRows.\r\n let existingCount = 0;\r\n await this.repo.iterateRowRecords(\r\n command.store,\r\n command.tableKey,\r\n 'active',\r\n async records => {\r\n existingCount += records.length;\r\n },\r\n );\r\n events = table.addNewRows(command);\r\n const pageSize = Math.max(1, table.getPagination().pageSize);\r\n const newTotal = Math.max(\r\n table.getPagination().totalRows,\r\n existingCount + events.length,\r\n );\r\n const lastPage = Math.max(1, Math.ceil(newTotal / pageSize));\r\n table.setPagination(new Pagination(lastPage, pageSize, newTotal));\r\n await this.repo.save(command.store, table);\r\n await this.repo.loadPage(command.store, command.tableKey, lastPage, pageSize);\r\n } else {\r\n events = table.addNewRows(command);\r\n await this.repo.save(command.store, table);\r\n }\r\n\r\n events.forEach(event => {\r\n this.audit.log({\r\n type: 'INFORMATION',\r\n message: event.type,\r\n payload: event.rowId\r\n });\r\n });\r\n\r\n return events;\r\n\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n }\r\n\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n\r\n/* ======================================================\r\n Paste Row (clipboard clone via AppService)\r\n ====================================================== */\r\n\r\nexport class PasteRowCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy\r\n ) {}\r\n\r\n async execute(command: PasteRowCommand, actor: Actor) {\r\n try {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n if (!this.permission.canAddRow?.({ actor })) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to paste a row',\r\n { actor }\r\n );\r\n }\r\n const event = table.addRow(command.sourceRowId, command.placeAtRowId);\r\n await this.repo.save(command.store, table);\r\n this.audit.log({\r\n type: 'INFORMATION',\r\n message: event.type,\r\n payload: event.rowId,\r\n });\r\n return event;\r\n } catch (error) {\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details,\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error },\r\n });\r\n }\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n Duplicate Row → windowed: copy values + append at end + go to last page\r\n (page-window architecture cannot safely insert mid-dataset)\r\n ====================================================== */\r\n\r\nexport class DuplicateRowCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy\r\n ) { }\r\n\r\n async execute(command: DuplicateRowCommand, actor: Actor) {\r\n try {\r\n if (!command.tableKey) return null;\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n if (!this.permission.canCopyRow?.({ actor, rowId: command.rowId })) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to duplicate a row',\r\n { actor }\r\n );\r\n }\r\n if (!isWindowedRepository(this.repo)) {\r\n const event = table.duplicateRow(new RowId(command.rowId));\r\n await this.repo.save(command.store, table);\r\n this.audit.log({ type: 'INFORMATION', message: event.type, payload: event.rowId });\r\n return event;\r\n }\r\n const source = table.getRow(command.rowId);\r\n if (!source) {\r\n throw new DomainError('ROW_NOT_FOUND', 'Source row not found', {\r\n rowId: command.rowId,\r\n });\r\n }\r\n\r\n const data: KeyValue[] = [];\r\n for (const [colId, cell] of source.getCells().entries()) {\r\n if (colId === 'index' || colId === 'RowState') continue;\r\n data.push({\r\n key: colId,\r\n value: cell.getValue(),\r\n display: cell.getDisplay(),\r\n });\r\n }\r\n\r\n const event = await appendAtEndAndShowLastPage(\r\n this.repo,\r\n command.store,\r\n command.tableKey,\r\n table,\r\n data,\r\n );\r\n this.audit.log({ type: 'INFORMATION', message: event.type, payload: event.rowId });\r\n return event;\r\n } catch (error) {\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return null\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n Delete Row\r\n ====================================================== */\r\n\r\nexport class DeleteRowCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy\r\n ) { }\r\n\r\n async execute(command: DeleteRowCommand, actor: Actor) {\r\n try {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n if (!this.permission.canDeleteRow?.({ actor, rowId: command.rowId })) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to delete this row',\r\n { actor }\r\n );\r\n }\r\n const rowId = new RowId(command.rowId);\r\n const event = table.deleteRow(rowId);\r\n\r\n if (!event) {\r\n throw new DomainError(\r\n 'ROW_NOT_FOUND',\r\n 'Row not found or already deleted',\r\n { rowId: rowId.value }\r\n );\r\n }\r\n\r\n if (\r\n isWindowedRepository(this.repo) &&\r\n (event instanceof RowRemoved ||\r\n event instanceof MinimumRowConstraintViolated)\r\n ) {\r\n // Added rows are hard-removed from IndexedDB\r\n await this.repo.removeRows(command.store, command.tableKey, [command.rowId]);\r\n if (event instanceof RowRemoved) {\r\n const p = table.getPagination();\r\n table.setPagination(\r\n new Pagination(p.page, p.pageSize, Math.max(0, p.totalRows - 1)),\r\n );\r\n }\r\n // MinimumRowConstraintViolated: old Added gone, addNewRow already on table\r\n }\r\n\r\n await this.repo.save(command.store, table);\r\n this.audit.log({ type: 'INFORMATION', message: event.type, payload: event.rowId });\r\n\r\n return event;\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return null\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n Restore Added Row (redo identity)\r\n ====================================================== */\r\n\r\nexport class RestoreAddedRowCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy\r\n ) {}\r\n\r\n async execute(command: RestoreAddedRowCommand, actor: Actor) {\r\n try {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n if (!this.permission.canAddRow?.({ actor })) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to restore an added row',\r\n { actor }\r\n );\r\n }\r\n const event = table.restoreAddedRow({\r\n rowId: command.rowId,\r\n cells: command.cells,\r\n collection: command.collection,\r\n isSaveDescription: command.isSaveDescription,\r\n });\r\n await this.repo.save(command.store, table);\r\n this.audit.log({\r\n type: 'INFORMATION',\r\n message: event.type,\r\n payload: event.rowId,\r\n });\r\n return event;\r\n } catch (error) {\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details,\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error },\r\n });\r\n }\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n Reorder Row\r\n ====================================================== */\r\n\r\nexport class ReorderRowCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy\r\n ) { }\r\n\r\n async execute(command: RowReorderedCommand, actor: Actor) {\r\n try {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n if (!this.permission?.canReorderRow?.({ actor, rowId: command.draggedRowId })) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to reorder this row',\r\n { actor }\r\n );\r\n }\r\n const draggedRowId = new RowId(command.draggedRowId);\r\n const droppedRowId = new RowId(command.droppedRowId);\r\n const event = table.reorderRows(draggedRowId.value, droppedRowId.value, command.position);\r\n if (!event) {\r\n throw new DomainError(\r\n 'DRAG_OR_DROP_ROW_NOT_FOUND',\r\n `Drag row num is ${draggedRowId.value} && drop row num is ${droppedRowId.value} `,\r\n { draggedRowId: draggedRowId.value, droppedRowId: droppedRowId.value }\r\n );\r\n }\r\n\r\n await this.repo.save(command.store, table);\r\n return event;\r\n\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return null\r\n }\r\n }\r\n}\r\n","// application/handlers/TableCommandHandler.ts\r\n\r\nimport { ColumnSchema } from '../../bootstrap/type';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport { DomainError } from '../../domain/errors/DomainError';\r\nimport {\r\n Actor,\r\n PermissionPolicy,\r\n} from '../../domain/policies';\r\nimport {\r\n ChangePageCommand,\r\n ChangePageSizeCommand,\r\n ColumnReorderedCommand,\r\n DeleteTableCommand,\r\n ResetTableCommand,\r\n SetActiveCollectionCommand,\r\n} from '../commands';\r\nimport { TableEvent } from '../events';\r\nimport { AuditLogger } from '../ports/AuditLogger';\r\nimport { RemoteApi } from '../ports/RemoteApi';\r\nimport { isWindowedRepository, TableRepository } from '../ports/TableRepository';\r\n\r\ntype DynamicConfig = {\r\n columnMeta: Map<string, ColumnSchema>;\r\n remoteApi: RemoteApi;\r\n};\r\n\r\n/* ======================================================\r\n Change Page\r\n ====================================================== */\r\n\r\nexport class ChangePageCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger\r\n ) { }\r\n\r\n async execute(\r\n command: ChangePageCommand,\r\n actor: Actor\r\n ): Promise<TableEvent[]> {\r\n try {\r\n if (!command.tableKey) return [];\r\n if (isWindowedRepository(this.repo)) {\r\n // Replace RAM window with the requested page from IndexedDB\r\n const loaded = await this.repo.loadPage(command.store, command.tableKey, command.page);\r\n if (!loaded) return [];\r\n } else {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n table.changePage(command.page);\r\n await this.repo.save(command.store, table);\r\n }\r\n\r\n const out: TableEvent = {\r\n type: 'PAGE_CHANGED',\r\n tableId: command.tableKey,\r\n page: command.page\r\n };\r\n\r\n this.audit.log({\r\n type: out.type,\r\n message: out.type,\r\n payload: out.page\r\n });\r\n return [out];\r\n\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return []\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n Change Page size\r\n ====================================================== */\r\n\r\nexport class ChangePageSizeCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger\r\n ) { }\r\n\r\n async execute(\r\n command: ChangePageSizeCommand,\r\n actor: Actor\r\n ): Promise<TableEvent[]> {\r\n try {\r\n if (!command.tableKey) return [];\r\n if (isWindowedRepository(this.repo)) {\r\n // Keep the current page when only pageSize changes (don't jump to page 1)\r\n let page = 1;\r\n try {\r\n const current = await this.repo.getById(command.store, command.tableKey);\r\n page = current.getPagination().page || 1;\r\n } catch {\r\n page = 1;\r\n }\r\n const loaded = await this.repo.loadPage(\r\n command.store,\r\n command.tableKey,\r\n page,\r\n command.pageSize,\r\n );\r\n if (!loaded) return [];\r\n } else {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n table.changePageSize(command.pageSize);\r\n await this.repo.save(command.store, table);\r\n }\r\n const out: TableEvent = {\r\n type: 'PAGE_SIZE_CHANGED',\r\n tableId: command.tableKey,\r\n pageSize: command.pageSize\r\n };\r\n\r\n this.audit.log({\r\n type: out.type,\r\n message: out.type,\r\n payload: out.tableId\r\n });\r\n return [out];\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return []\r\n }\r\n }\r\n}\r\n/* ======================================================\r\n Delete Table \r\n ====================================================== */\r\n\r\nexport class DeleteTableCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n\r\n ) { }\r\n async execute(\r\n command: DeleteTableCommand,\r\n actor: Actor\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n this.repo.delete(command.store, command.tableKey)\r\n await this.repo.save(command.store, table);\r\n const out: TableEvent = {\r\n type: 'TABLE_DELETED',\r\n tableId: command.tableKey,\r\n };\r\n\r\n this.audit.log({\r\n type: out.type,\r\n message: out.type,\r\n payload: out.tableId\r\n });\r\n return [out];\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return []\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n Reset Table \r\n ====================================================== */\r\n\r\nexport class ResetTableCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n\r\n ) { }\r\n async execute(\r\n command: ResetTableCommand,\r\n actor: Actor\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n this.repo.delete(command.store, command.tableKey)\r\n await this.repo.save(command.store, table);\r\n const out: TableEvent = {\r\n type: 'TABLE_RESET',\r\n tableId: command.tableKey,\r\n };\r\n\r\n this.audit.log({\r\n type: out.type,\r\n message: out.type,\r\n payload: out.tableId\r\n }); return [out];\r\n } catch (error) {\r\n\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n } return []\r\n }\r\n }\r\n}\r\n/* ======================================================\r\n Reset Table \r\n ====================================================== */\r\n\r\nexport class SetActiveCollectionCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n ) { }\r\nprivate async applyVisibility(input: {\r\n table: Table;\r\n command: SetActiveCollectionCommand;\r\n}): Promise<void> {\r\n const { table, command } = input;\r\n\r\n const collection = table.getCollections().get(command.activeCollection);\r\n if (!collection) return;\r\n\r\n collection.getColumns().forEach(colCfg => {\r\n const visibility = colCfg.visibility;\r\n\r\n if (\r\n (visibility?.kind === \"whenCollection\" &&\r\n visibility.collection === command.activeCollection) ||\r\n (visibility?.kind === \"whenTableType\" &&\r\n visibility.tableType === command.activeCollection)\r\n ) {\r\n colCfg.hidden = false;\r\n return;\r\n }\r\n\r\n // ستونهای شرطی محتوا دار (whenFieldTruthy / whenRemoteFlag) باید هنگام\r\n // سوییچ تب، در کالکشن خودشان نمایان شوند — همان قراردادِ بارگذاری اولیه:\r\n // \"ستون وابستهای که محتوا دارد فقط در کالکشن مربوطه نمایش داده شود\".\r\n // بدون این، فلگ اشتباه ذخیرهشده از ران قبلی (مثلاً hidden=true از\r\n // bootstrap وقتی تب دیگری فعال بود) تا باز شدن مجدد صفحه میماند.\r\n if (\r\n visibility?.kind === 'whenFieldTruthy' ||\r\n visibility?.kind === 'whenRemoteFlag'\r\n ) {\r\n const rows = collection.getRows();\r\n const hasValue = Array.from(rows.values()).some(\r\n row => !!row.getCell(colCfg.fieldName)?.getValue(),\r\n );\r\n if (hasValue) {\r\n colCfg.hidden = false;\r\n }\r\n }\r\n });\r\n}\r\n\r\n async execute(\r\n command: SetActiveCollectionCommand,\r\n actor: Actor\r\n ): Promise<TableEvent[]> {\r\n const repo = this.repo;\r\n try {\r\n let table: Table | null;\r\n if (isWindowedRepository(repo)) {\r\n // Persist pending edits of the current window first, then swap the RAM\r\n // window with page 1 of the requested collection from IndexedDB.\r\n // (A plain setActiveCollection + save used to persist an EMPTY window\r\n // for the new collection, wiping the rows of every other collection.)\r\n await repo.getById(command.store, command.tableKey);\r\n table = await repo.setActiveCollection(\r\n command.store,\r\n command.tableKey,\r\n command.activeCollection,\r\n );\r\n } else {\r\n table = await repo.getById(command.store, command.tableKey);\r\n }\r\n if (table) {\r\n table.setActiveCollection(command.activeCollection);\r\n this.applyVisibility({ table, command });\r\n await repo.save(command.store, table);\r\n }\r\n const out: TableEvent = {\r\n type: 'ACTIVE_COLLECTION_CHANGED',\r\n tableId: command.tableKey,\r\n };\r\n this.audit.log({ type: out.type, message: out.type, payload: out.tableId });\r\n return [out];\r\n } catch (error) {\r\n return this.handleSetActiveError(error);\r\n }\r\n }\r\n\r\n private handleSetActiveError(error: unknown): TableEvent[] {\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error }\r\n });\r\n }\r\n return [];\r\n }\r\n}\r\n\r\n/* ======================================================\r\n Reorder Column\r\n ====================================================== */\r\n\r\nexport class ReorderColumnCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permission: PermissionPolicy,\r\n ) {}\r\n\r\n async execute(\r\n command: ColumnReorderedCommand,\r\n actor: Actor,\r\n ): Promise<TableEvent[]> {\r\n try {\r\n if (\r\n this.permission.canReorderColumn &&\r\n !this.permission.canReorderColumn({ actor })\r\n ) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to reorder columns',\r\n { actor },\r\n );\r\n }\r\n\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n const columns = table.getActiveCollectionColumns();\r\n const n = columns.length;\r\n const { sourceIndex, destIndex } = command;\r\n\r\n if (\r\n !Number.isInteger(sourceIndex) ||\r\n !Number.isInteger(destIndex) ||\r\n sourceIndex < 0 ||\r\n destIndex < 0 ||\r\n sourceIndex >= n ||\r\n destIndex >= n\r\n ) {\r\n throw new DomainError(\r\n 'COLUMN_NOT_FOUND',\r\n 'Column reorder indices are out of range',\r\n { sourceIndex, destIndex, columnCount: n },\r\n );\r\n }\r\n\r\n table.reorderColumns(sourceIndex, destIndex);\r\n await this.repo.save(command.store, table);\r\n\r\n const out: TableEvent = {\r\n type: 'COLUMN_REORDERED',\r\n tableId: command.tableKey,\r\n sourceIndex,\r\n destIndex,\r\n };\r\n this.audit.log({\r\n type: out.type,\r\n message: out.type,\r\n payload: { sourceIndex, destIndex },\r\n });\r\n return [out];\r\n } catch (error) {\r\n if (error instanceof DomainError) {\r\n this.audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: error.details,\r\n });\r\n } else {\r\n this.audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error },\r\n });\r\n }\r\n return [];\r\n }\r\n }\r\n}","// application/TableAppService.ts\r\n\r\nimport {\r\n Actor,\r\n ApplicationTableCommand,\r\n} from './commands';\r\nimport { CellChangedEvent, TableEvent } from './events';\r\nimport {\r\n ApplyDynamicProjectionHandler,\r\n ChangeCellDisplayValueHandler,\r\n ChangeCellValueHandler,\r\n SaveDescriptionHandler,\r\n} from './handlers/cellCommandsHandler';\r\nimport type { DeleteRowsCommandHandler } from './handlers/deleteRowsCommandHandler';\r\nimport type { ApplyRowVisibilityHandler } from './handlers/applyRowVisibilityHandler';\r\nimport { PasteCellsCommandHandler } from './handlers/pasteCellsCommandsHandler';\r\nimport {\r\n AddNewRowCommandHandler,\r\n AddNewRowsCommandHandler,\r\n DeleteRowCommandHandler,\r\n DuplicateRowCommandHandler,\r\n PasteRowCommandHandler,\r\n ReorderRowCommandHandler,\r\n RestoreAddedRowCommandHandler,\r\n} from './handlers/rowCommandsHandler';\r\nimport {\r\n ChangePageCommandHandler,\r\n ChangePageSizeCommandHandler,\r\n ReorderColumnCommandHandler,\r\n SetActiveCollectionCommandHandler,\r\n DeleteTableCommandHandler,\r\n ResetTableCommandHandler,\r\n} from './handlers/tableCommandHandler';\r\nimport type { EventStore } from './ports/EventStore';\r\nimport type { TableRepository } from './ports/TableRepository';\r\nimport type { GridEvent } from '../domain/types/GridEvent';\r\nimport type { CellUndoStack, RowCellSnapshot } from './undo/CellUndoStack';\r\n\r\nexport class TableAppService {\r\n private eventStore?: EventStore;\r\n private undoStack?: CellUndoStack;\r\n private repo?: TableRepository;\r\n private snapshotStrategy?: {\r\n onAppend(streamId: string, tableId: string, appendedCount: number): Promise<void>;\r\n };\r\n\r\n constructor(\r\n private readonly changeCellValue: ChangeCellValueHandler,\r\n private readonly changeCellDisplayValue: ChangeCellDisplayValueHandler,\r\n private readonly saveDescription: SaveDescriptionHandler,\r\n private readonly addEmptyRow: AddNewRowCommandHandler,\r\n private readonly addNewRows: AddNewRowsCommandHandler,\r\n private readonly duplicateRow: DuplicateRowCommandHandler,\r\n private readonly deleteRow: DeleteRowCommandHandler,\r\n private readonly reorderRow: ReorderRowCommandHandler,\r\n private readonly setPageSize: ChangePageSizeCommandHandler,\r\n private readonly setPage: ChangePageCommandHandler,\r\n private readonly setActiveCollection: SetActiveCollectionCommandHandler,\r\n private readonly deleteTable: DeleteTableCommandHandler,\r\n private readonly resetTable: ResetTableCommandHandler,\r\n private readonly applyDynamicProjection: ApplyDynamicProjectionHandler,\r\n private readonly pasteCells: PasteCellsCommandHandler,\r\n private readonly restoreAddedRow?: RestoreAddedRowCommandHandler,\r\n private readonly pasteRow?: PasteRowCommandHandler,\r\n private readonly reorderColumn?: ReorderColumnCommandHandler,\r\n /** Page-window (paged-idb) mode only. */\r\n /** Lazy loader (module is fetched on first row activation with `resolveOn`). */\r\n private readonly applyRowVisibility?: () => Promise<ApplyRowVisibilityHandler>,\r\n ) {}\r\n\r\n private deleteRows?: DeleteRowsCommandHandler;\r\n\r\n /** Page-window mode only (lazy module): bulk delete of the selected rows. */\r\n setDeleteRowsHandler(handler: DeleteRowsCommandHandler): void {\r\n this.deleteRows = handler;\r\n }\r\n\r\n setEventStore(eventStore: EventStore): void {\r\n this.eventStore = eventStore;\r\n }\r\n\r\n setSnapshotStrategy(strategy: {\r\n onAppend(streamId: string, tableId: string, appendedCount: number): Promise<void>;\r\n }): void {\r\n this.snapshotStrategy = strategy;\r\n }\r\n\r\n setUndoStack(undoStack: CellUndoStack): void {\r\n this.undoStack = undoStack;\r\n }\r\n\r\n setRepository(repo: TableRepository): void {\r\n this.repo = repo;\r\n }\r\n\r\n async execute(command: ApplicationTableCommand, actor: Actor) {\r\n const correlationId =\r\n (command as { correlationId?: string }).correlationId ??\r\n this.createCorrelationId();\r\n\r\n const preDeleteSnapshot =\r\n command.type === 'ROW_DELETED'\r\n ? await this.captureRowSnapshot(\r\n command.store,\r\n command.tableKey,\r\n command.rowId,\r\n )\r\n : undefined;\r\n\r\n const result = await this.dispatch(command, actor);\r\n if (result) {\r\n await this.recordUndoableEvents(\r\n command,\r\n result,\r\n correlationId,\r\n preDeleteSnapshot,\r\n );\r\n }\r\n if (this.eventStore && result) {\r\n await this.appendToEventStore(command, result, correlationId);\r\n await this.recordSnapshot(command, result);\r\n }\r\n return result;\r\n }\r\n\r\n private async dispatch(command: ApplicationTableCommand, actor: Actor) {\r\n switch (command.type) {\r\n case 'CHANGE_CELL_VALUE':\r\n return this.changeCellValue.execute(command, actor);\r\n case 'SAVE_DESCRIPTION':\r\n return this.saveDescription.execute(command, actor);\r\n case 'APPLY_DYNAMIC_PROJECTION':\r\n return this.applyDynamicProjection.execute(command, actor);\r\n case 'APPLY_ROW_VISIBILITY':\r\n if (!this.applyRowVisibility) return [];\r\n return (await this.applyRowVisibility()).execute(command, actor);\r\n case 'CHANGE_CELL_DISPLAY_VALUE':\r\n return this.changeCellDisplayValue.execute(command, actor);\r\n case 'ADD_EMPTY_ROW':\r\n return this.addEmptyRow.execute(command, actor);\r\n case 'ADD_NEW_ROWS':\r\n return this.addNewRows.execute(command, actor);\r\n case 'DUPLICATE_ROW':\r\n return this.duplicateRow.execute(command, actor);\r\n case 'PASTE_ROW':\r\n if (!this.pasteRow) {\r\n throw new Error('PASTE_ROW handler is not configured');\r\n }\r\n return this.pasteRow.execute(command, actor);\r\n case 'PASTE_CELLS':\r\n return this.pasteCells.execute(command, actor);\r\n case 'ROW_DELETED':\r\n return this.deleteRow.execute(command, actor);\r\n case 'RESTORE_ADDED_ROW':\r\n if (!this.restoreAddedRow) {\r\n throw new Error('RESTORE_ADDED_ROW handler is not configured');\r\n }\r\n return this.restoreAddedRow.execute(command, actor);\r\n case 'ROWS_DELETED':\r\n if (!this.deleteRows) {\r\n throw new Error('ROWS_DELETED handler is not configured');\r\n }\r\n return this.deleteRows.execute(command, actor);\r\n case 'TABLE_RESET':\r\n return this.resetTable.execute(command, actor);\r\n case 'TABLE_DELETED':\r\n return this.deleteTable.execute(command, actor);\r\n case 'ROW_REORDERED':\r\n return this.reorderRow.execute(command, actor);\r\n case 'COLUMN_REORDERED':\r\n if (!this.reorderColumn) {\r\n throw new Error('COLUMN_REORDERED handler is not configured');\r\n }\r\n return this.reorderColumn.execute(command, actor);\r\n case 'CHANGE_PAGE_SIZE':\r\n return this.setPageSize.execute(command, actor);\r\n case 'CHANGE_PAGE':\r\n return this.setPage.execute(command, actor);\r\n case 'SET_ACTIVE_COLLECTION':\r\n return this.setActiveCollection.execute(command, actor);\r\n default:\r\n throw new Error(`Unhandled command: ${JSON.stringify(command)}`);\r\n }\r\n }\r\n\r\n private async recordUndoableEvents(\r\n command: ApplicationTableCommand,\r\n result: TableEvent[] | TableEvent | null | unknown,\r\n correlationId: string,\r\n preDeleteSnapshot?: {\r\n cells: Record<string, RowCellSnapshot>;\r\n collection: string;\r\n isSaveDescription: boolean;\r\n },\r\n ): Promise<void> {\r\n if (!this.undoStack) return;\r\n\r\n const events = this.normalizeResult(result);\r\n if (events.length === 0) return;\r\n\r\n const fallbackTableId = (command as { tableKey?: string }).tableKey ?? '';\r\n const store = (command as { store?: string }).store ?? '';\r\n\r\n for (const evt of events) {\r\n if (evt.type === 'CELL_CHANGED' && 'previousValue' in evt) {\r\n const cellEvt = evt as CellChangedEvent;\r\n this.undoStack.record(\r\n {\r\n ...cellEvt,\r\n tableId: cellEvt.tableId || fallbackTableId,\r\n },\r\n correlationId,\r\n );\r\n continue;\r\n }\r\n\r\n if (evt.type === 'ROW_ADDED' || evt.type === 'NEW_ROW_ADDED') {\r\n const rowId = this.resolveRowId((evt as { rowId?: unknown }).rowId);\r\n const tableId = evt.tableId || fallbackTableId;\r\n if (rowId == null || !tableId) continue;\r\n const snapshot = await this.captureRowSnapshot(store, tableId, rowId);\r\n this.undoStack.recordRowAdded(\r\n {\r\n tableId,\r\n rowId,\r\n cells: snapshot?.cells,\r\n collection: snapshot?.collection,\r\n isSaveDescription: snapshot?.isSaveDescription,\r\n },\r\n correlationId,\r\n );\r\n continue;\r\n }\r\n\r\n if (evt.type === 'ROW_DELETED' || evt.type === 'NEW_ROW_REMOVED') {\r\n const rowId = this.resolveRowId((evt as { rowId?: unknown }).rowId);\r\n const tableId = evt.tableId || fallbackTableId;\r\n if (rowId == null || !tableId) continue;\r\n const mode = evt.type === 'NEW_ROW_REMOVED' ? 'hard' : 'soft';\r\n this.undoStack.recordRowDeleted(\r\n {\r\n tableId,\r\n rowId,\r\n mode,\r\n cells: preDeleteSnapshot?.cells,\r\n collection: preDeleteSnapshot?.collection,\r\n isSaveDescription: preDeleteSnapshot?.isSaveDescription,\r\n },\r\n correlationId,\r\n );\r\n }\r\n }\r\n }\r\n\r\n private async captureRowSnapshot(\r\n store: string,\r\n tableId: string,\r\n rowId: number,\r\n ): Promise<\r\n | {\r\n cells: Record<string, RowCellSnapshot>;\r\n collection: string;\r\n isSaveDescription: boolean;\r\n }\r\n | undefined\r\n > {\r\n if (!this.repo || !store) return undefined;\r\n try {\r\n const table = await this.repo.getById(store, tableId);\r\n const row = table.getRow(rowId);\r\n if (!row) return undefined;\r\n const cells: Record<string, RowCellSnapshot> = {};\r\n for (const [key, cell] of row.getCells().entries()) {\r\n cells[key] = {\r\n value: cell.getValue(),\r\n display: cell.getDisplay(),\r\n originalValue: cell.getOriginalValue().value,\r\n };\r\n }\r\n return {\r\n cells,\r\n collection: row.getCollection(),\r\n isSaveDescription: row.isSaveDescription,\r\n };\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n private async appendToEventStore(\r\n command: ApplicationTableCommand,\r\n result: TableEvent[] | TableEvent | null | unknown,\r\n correlationId: string,\r\n ): Promise<void> {\r\n if (!this.eventStore) return;\r\n\r\n const events = this.normalizeResult(result);\r\n if (events.length === 0) return;\r\n\r\n const tableId = command.tableKey ?? '';\r\n const streamId = `table:${tableId}`;\r\n\r\n const gridEvents: GridEvent[] = events.map((evt) => ({\r\n eventId: `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\r\n type: evt.type,\r\n tableId: evt.tableId ?? tableId,\r\n streamId,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: 'system',\r\n correlationId,\r\n payload: this.toGridPayload(evt, tableId),\r\n }));\r\n\r\n await this.eventStore.append(streamId, gridEvents, -1);\r\n }\r\n\r\n private async recordSnapshot(\r\n command: ApplicationTableCommand,\r\n result: TableEvent[] | TableEvent | null | unknown,\r\n ): Promise<void> {\r\n if (!this.snapshotStrategy) return;\r\n const events = this.normalizeResult(result);\r\n if (events.length === 0) return;\r\n const tableId = (command as { tableKey?: string }).tableKey ?? '';\r\n if (!tableId) return;\r\n await this.snapshotStrategy.onAppend(`table:${tableId}`, tableId, events.length);\r\n }\r\n\r\n private normalizeResult(result: unknown): TableEvent[] {\r\n if (!result) return [];\r\n if (Array.isArray(result)) return result;\r\n if (typeof result === 'object' && result !== null && 'type' in result) {\r\n return [result as TableEvent];\r\n }\r\n return [];\r\n }\r\n\r\n private resolveRowId(rowId: unknown): number | null {\r\n if (typeof rowId === 'number' && Number.isFinite(rowId)) return rowId;\r\n if (typeof rowId === 'string' && rowId.trim() !== '') {\r\n const parsed = Number(rowId);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n }\r\n if (\r\n typeof rowId === 'object' &&\r\n rowId !== null &&\r\n 'value' in rowId &&\r\n typeof (rowId as { value: unknown }).value === 'number'\r\n ) {\r\n return (rowId as { value: number }).value;\r\n }\r\n return null;\r\n }\r\n\r\n private toGridPayload(evt: TableEvent, fallbackTableId: string): unknown {\r\n if (evt.type === 'ROW_ADDED' || evt.type === 'NEW_ROW_ADDED') {\r\n const rowId = this.resolveRowId((evt as { rowId?: unknown }).rowId);\r\n return {\r\n type: evt.type,\r\n tableId: evt.tableId ?? fallbackTableId,\r\n rowId: rowId ?? String((evt as { rowId?: unknown }).rowId ?? ''),\r\n };\r\n }\r\n return evt;\r\n }\r\n\r\n private createCorrelationId(): string {\r\n return `cmd-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\r\n }\r\n}\r\n","import type { FieldType } from '../../bootstrap/type';\r\nimport { DomainError } from '../../domain/errors/DomainError';\r\nimport type { Actor, PermissionPolicy } from '../../domain/policies';\r\nimport {\r\n ColumnId,\r\n RowId,\r\n RowStateEnum,\r\n} from '../../domain/value-objects';\r\nimport { coercePastedCellValue } from '../../engine/dataOps/cellValueCoercion';\r\nimport type { PasteCellsCommand } from '../commands';\r\nimport type { TableEvent } from '../events';\r\nimport type { AuditLogger } from '../ports/AuditLogger';\r\nimport type { TableRepository } from '../ports/TableRepository';\r\n\r\nfunction logError(audit: AuditLogger, error: unknown, context?: string): void {\r\n if (error instanceof DomainError) {\r\n audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: { details: error.details, context },\r\n });\r\n } else if (error instanceof Error) {\r\n audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: error.message,\r\n payload: { stack: error.stack, context },\r\n });\r\n } else {\r\n audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error, context },\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Batch clipboard paste (PR-107): one repo save, many CELL_CHANGED events.\r\n */\r\nexport class PasteCellsCommandHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n ) {}\r\n\r\n async execute(\r\n command: PasteCellsCommand,\r\n actor: Actor,\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n const events: TableEvent[] = [];\r\n\r\n try {\r\n for (const update of command.updates) {\r\n const rowId = new RowId(update.rowId);\r\n const columnId = new ColumnId(update.columnId);\r\n const schema = table.getColumnSchema(columnId);\r\n if (!schema) continue;\r\n if (schema.editable === false || schema.fieldType === 'index') {\r\n continue;\r\n }\r\n if (\r\n !this.permissionPolicy.canChangeCell({\r\n actor,\r\n rowId: update.rowId,\r\n columnId: update.columnId,\r\n })\r\n ) {\r\n continue;\r\n }\r\n\r\n const coerced = coercePastedCellValue(\r\n schema.fieldType as FieldType,\r\n update.rawText,\r\n );\r\n if (!coerced.ok) continue;\r\n\r\n const validated = this.validateCellValue(schema.fieldType, coerced.value);\r\n if (!validated.ok) continue;\r\n\r\n const domainEvent = table.changeCell(rowId, columnId, validated.value);\r\n if (!domainEvent) continue;\r\n\r\n const state = table\r\n .getRows()\r\n .find((r) => r.id.value === rowId.value)\r\n ?.getCells()\r\n .get('RowState')\r\n ?.getValue();\r\n\r\n if (state === RowStateEnum.Unchanged) {\r\n table.changeCell(rowId, new ColumnId('RowState'), RowStateEnum.Modified);\r\n table.changeDisplay(rowId, new ColumnId('RowState'), RowStateEnum.Modified);\r\n }\r\n\r\n events.push({\r\n type: 'CELL_CHANGED',\r\n tableId: command.tableKey,\r\n rowId: domainEvent.rowId.value,\r\n columnId: domainEvent.columnId.value,\r\n newValue: domainEvent.newValue,\r\n previousValue: domainEvent.previousValue,\r\n });\r\n }\r\n\r\n if (events.length > 0) {\r\n await this.repo.save(command.store, table);\r\n }\r\n\r\n if (events.length > 0) {\r\n this.audit.log({\r\n type: 'INFORMATION',\r\n message: 'Batch clipboard paste',\r\n payload: { count: events.length },\r\n });\r\n }\r\n\r\n return events;\r\n } catch (e) {\r\n logError(this.audit, e, `PasteCellsCommandHandler[${command.tableKey}]`);\r\n return [];\r\n }\r\n }\r\n\r\n private validateCellValue(type: FieldType, value: unknown) {\r\n switch (type) {\r\n case 'text':\r\n case 'textArea':\r\n case 'description':\r\n case 'date':\r\n return typeof value === 'string'\r\n ? { ok: true as const, value }\r\n : { ok: false as const, value };\r\n case 'static':\r\n return { ok: true as const, value };\r\n case 'checkbox':\r\n return typeof value === 'boolean'\r\n ? { ok: true as const, value }\r\n : { ok: false as const, value };\r\n case 'number':\r\n case 'price':\r\n case 'select':\r\n case 'selectOption': {\r\n if (value === '' || value === undefined) {\r\n return { ok: true as const, value: '' };\r\n }\r\n const n = typeof value === 'number' ? value : Number(value);\r\n return Number.isFinite(n)\r\n ? { ok: true as const, value: n }\r\n : { ok: false as const, value };\r\n }\r\n default:\r\n return { ok: false as const, value };\r\n }\r\n }\r\n}\r\n","// bootstrap/builders.ts\r\n\r\nimport {\r\n ApplyDynamicProjectionHandler,\r\n ChangeCellDisplayValueHandler,\r\n ChangeCellValueHandler,\r\n SaveDescriptionHandler,\r\n} from '../../application/handlers/cellCommandsHandler';\r\nimport {\r\n AddNewRowCommandHandler,\r\n AddNewRowsCommandHandler,\r\n DeleteRowCommandHandler,\r\n DuplicateRowCommandHandler,\r\n PasteRowCommandHandler,\r\n ReorderRowCommandHandler,\r\n RestoreAddedRowCommandHandler,\r\n} from '../../application/handlers/rowCommandsHandler';\r\nimport {\r\n ChangePageCommandHandler,\r\n ChangePageSizeCommandHandler,\r\n ReorderColumnCommandHandler,\r\n SetActiveCollectionCommandHandler,\r\n DeleteTableCommandHandler,\r\n ResetTableCommandHandler,\r\n} from '../../application/handlers/tableCommandHandler';\r\nimport { AuditLogger } from '../../application/ports/AuditLogger';\r\nimport type { EventStore } from '../../application/ports/EventStore';\r\nimport type { RemoteApi } from '../../application/ports/RemoteApi';\r\nimport {\r\n isWindowedRepository,\r\n TableRepository,\r\n} from '../../application/ports/TableRepository';\r\nimport { TableAppService } from '../../application/TableAppService';\r\nimport { PasteCellsCommandHandler } from '../../application/handlers/pasteCellsCommandsHandler';\r\nimport { Cell } from '../../domain/entities/Cell';\r\nimport { Collection } from '../../domain/entities/Collection';\r\nimport { Row } from '../../domain/entities/Row';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport {\r\n Actor,\r\n PermissionPolicy,\r\n} from '../../domain/policies';\r\nimport {\r\n CellDisplay,\r\n CellValue,\r\n ColumnId,\r\n RowId,\r\n RowState,\r\n RowStateEnum,\r\n} from '../../domain/value-objects';\r\nimport {\r\n ColumnSchema,\r\n CreateERPTableConfig,\r\n RowInput,\r\n} from '../type';\r\n\r\n/* ======================================================\r\n helpers\r\n ====================================================== */\r\n\r\nexport const isInitiallyHidden = (\r\n col: ColumnSchema,\r\n inputRows: RowInput[] | Row[],\r\n activeCollection: string = \"default\"\r\n): boolean => {\r\n // شرط ۱: همیشه نمایش داده بشه (مگر ColumnDef.hide / schema.hidden صریح)\r\n if (col.visibility.kind === \"always\") {\r\n return col.hidden === true;\r\n }\r\n\r\n if (col.visibility.kind === \"never\") {\r\n return true;\r\n }\r\n\r\n // شرط ۴: ستون مختص این collection هست\r\n if (\r\n (col.visibility.kind === \"whenCollection\" &&\r\n col.visibility.collection === activeCollection) ||\r\n (col.visibility.kind === \"whenTableType\" &&\r\n col.visibility.tableType === activeCollection)\r\n ) {\r\n return false;\r\n }\r\n\r\n // شرط ۲ و ۳: بررسی مقدار و visibilityCondition — فقط بین سطرهای کالکشن خودِ ستون.\r\n // A dependent column that holds data becomes visible ONLY in its OWN\r\n // collection (fieldCollection, falling back to the active collection).\r\n // The value scan must never cross collections: a value in one tab must\r\n // not unhide the same-named column in other tabs.\r\n const scopeCollection = col.fieldCollection ?? activeCollection ?? \"default\";\r\n const isVisibleByCondition = inputRows.some(r => {\r\n if (r instanceof Row) {\r\n const domainRow = r as Row;\r\n // فقط سطرهای کالکشن خود ستون\r\n if (domainRow.getCollection() !== scopeCollection) return false;\r\n // شرط ۳: visibilityCondition با true\r\n if (domainRow.getVisibilityCondition()?.[col.fieldName] === true) {\r\n return true;\r\n }\r\n // whenRemoteFlag: فلگ ریموت در دسترس نیست؛ محتوا داشتنِ سلول خود ستون\r\n // (در کالکشن خودش) کافی است تا ستون در ویرایش نمایان شود.\r\n if (\r\n col.visibility?.kind === \"whenRemoteFlag\" &&\r\n !!domainRow.readValue(col.fieldName)\r\n ) {\r\n return true;\r\n }\r\n // شرط ۲: مقدار داره\r\n return !!domainRow.readValue(col.fieldName);\r\n } else {\r\n const inputRow = r as RowInput;\r\n // فقط سطرهای کالکشن خود ستون\r\n const rowCollection = inputRow.collection ?? inputRow.rowType ?? \"default\";\r\n if (rowCollection !== scopeCollection) return false;\r\n // شرط ۲: مقدار داره\r\n return inputRow.values?.[col.fieldName] != null &&\r\n inputRow.values?.[col.fieldName] !== \"\";\r\n }\r\n });\r\n\r\n if (isVisibleByCondition) {\r\n return false;\r\n }\r\n\r\n // در غیر این صورت مخفی باشه\r\n return true;\r\n};\r\n\r\n/* ======================================================\r\n builders\r\n ====================================================== */\r\n\r\nexport function buildColumns(\r\n columnsConfig: ColumnSchema[],\r\n rows: RowInput[],\r\n activeCollection?: string\r\n): {\r\n columns: Map<string, ColumnSchema>;\r\n columnMeta: Map<string, ColumnSchema>;\r\n collectionColumns: Map<string, Map<string, ColumnSchema>>;\r\n} {\r\n const columns = new Map<string, ColumnSchema>();\r\n const columnMeta = new Map<string, ColumnSchema>();\r\n\r\n // collectionName => columns\r\n const collectionColumns = new Map<string, Map<string, ColumnSchema>>();\r\n\r\n const sortedColumns = [...columnsConfig].sort(\r\n (a, b) => (a.order ?? 0) - (b.order ?? 0)\r\n );\r\n\r\n for (const col of sortedColumns) {\r\n const schema: ColumnSchema = {\r\n ...col,\r\n editable: col.computed\r\n ? false\r\n : col.fieldType === \"index\"\r\n ? false\r\n : col.editable ?? true,\r\n fieldCollection: col.fieldCollection ?? \"default\",\r\n expandable: col.fieldName === \"index\" && col.expandable,\r\n hidden: isInitiallyHidden(col, rows, activeCollection),\r\n };\r\n const collectionName = schema.fieldCollection ?? \"default\";\r\n const columnKey = `${col.fieldCollection ?? 'default'}_${col.fieldName}`;\r\n columns.set(columnKey, schema);\r\n columnMeta.set(columnKey, col);\r\n if (!collectionColumns.has(collectionName)) {\r\n collectionColumns.set(collectionName, new Map());\r\n }\r\n\r\n collectionColumns.get(collectionName)!.set(schema.fieldName, schema);\r\n }\r\n return {\r\n columns,\r\n columnMeta,\r\n collectionColumns,\r\n };\r\n}\r\n\r\nexport async function buildRows( collectionColumns: Map<string, Map<string, ColumnSchema>>,\r\n columnMeta: Map<string, ColumnSchema>,\r\n inputRows: RowInput[],\r\n repo: TableRepository,\r\n store: string,\r\n tableKey: string,\r\n remoteApi: RemoteApi,\r\n options?: { skipPersistLoad?: boolean },\r\n): Promise<{ rows: Map<number, Row>; table?: Table }> {\r\n let rowMap = new Map<number, Row>();\r\n // ---------- rows: ابتدا IndexedDB, fallback به ورودی ----------\r\n const exist =\r\n options?.skipPersistLoad ? false : await repo.exists(store, tableKey)\r\n if (exist) {\r\n const persistedTable = await repo.getById(store, tableKey);\r\n rowMap = new Map<number, Row>(\r\n persistedTable.getRows().map(r => [r.id.value, r])\r\n );\r\n // سطرهای بازخوانیشده از IndexedDB با visibilityCondition خالی از ذخیرهی\r\n // ران قبل میآیند (ویرایش): visibilityCondition هر سطر باید از روی مقادیر\r\n // فعلی خودش بازسازی شود تا ستونهای شرطیِ whenFieldTruthy / whenRemoteFlag\r\n // که محتوا دارند در بارگذاری اولیه نمایان شوند — قرارداد: ستون وابستهای\r\n // که محتوا دارد فقط در کالکشن خودش قابل رویت است.\r\n const { rebuildRowVisibilityCondition } = await import('../rebuildRowVisibility');\r\n for (const row of rowMap.values()) {\r\n rebuildRowVisibilityCondition(row, columnMeta);\r\n }\r\n return { rows: rowMap, table: persistedTable };\r\n } else {\r\n const rows = inputRows.sort((a, b) => a.id - b.id)\r\n for (const [idx, r] of rows.entries()) {\r\n const rowId = new RowId(r.id);\r\n const cells = new Map<string, Cell>();\r\n const rowCollection = r.collection ?? r.rowType ?? \"default\";\r\n const columns = collectionColumns.get(rowCollection);\r\n if (!columns) {\r\n throw new Error(\r\n `Collection '${rowCollection}' not found`\r\n );\r\n }\r\n\r\n // PR-101: host `rowData` path — keep values on `r.data`, only allocate index.\r\n const rowStateEarly =\r\n ((r.values ?? {})[\"RowState\"] as RowStateEnum | undefined) ??\r\n RowStateEnum.Unchanged;\r\n const canLazyHost =\r\n r.data != null &&\r\n typeof r.data === 'object' &&\r\n rowStateEarly === RowStateEnum.Unchanged;\r\n if (canLazyHost) {\r\n let needsEager = false;\r\n for (const [, schema] of columns) {\r\n const colKey = `${schema.fieldCollection ?? 'default'}_${schema.fieldName}`;\r\n const meta = columnMeta.get(colKey);\r\n if (\r\n (meta?.computed?.dependsOn &&\r\n meta.computed.dependsOn.length > 0) ||\r\n meta?.columnDef?.valueGetter\r\n ) {\r\n needsEager = true;\r\n break;\r\n }\r\n }\r\n if (!needsEager) {\r\n const indexValue =\r\n (r.values as Record<string, unknown> | undefined)?.index ??\r\n (r.values as Record<string, unknown> | undefined)?.RowNum ??\r\n idx + 1;\r\n cells.set(\r\n 'index',\r\n new Cell(\r\n rowId,\r\n ColumnId.for('index'),\r\n indexValue,\r\n indexValue,\r\n indexValue,\r\n ),\r\n );\r\n rowMap.set(\r\n rowId.value,\r\n new Row(\r\n rowId,\r\n cells,\r\n new RowState(rowStateEarly),\r\n new Set(),\r\n {},\r\n r.collection ?? r.rowType ?? rowCollection,\r\n false,\r\n r.data,\r\n r.sourceId ?? String(r.id),\r\n ),\r\n );\r\n continue;\r\n }\r\n }\r\n\r\n for (const [columnKey, schema] of columns) {\r\n const colKey = `${schema.fieldCollection ?? 'default'}_${schema.fieldName}`;\r\n const colId = schema.fieldName\r\n const meta = columnMeta.get(colKey);\r\n if (!meta) continue;\r\n const values = r.values ?? {};\r\n const hostData = r.data ?? values;\r\n const getter = meta.columnDef?.valueGetter;\r\n const incoming = getter\r\n ? getter({ data: hostData })\r\n : meta.returnValue?.(values, colId) ??\r\n (values as Record<string, unknown>)?.[colId] ??\r\n (hostData && typeof hostData === 'object'\r\n ? (hostData as Record<string, unknown>)[colId]\r\n : null) ??\r\n null;\r\n const rowNum =\r\n (values as Record<string, unknown>)?.[\"RowNum\"];\r\n const description =\r\n meta.returnDisplayValue?.(values, colId) ?? undefined;\r\n let value =\r\n meta.fieldType === \"index\"\r\n ? (rowNum ?? idx + 1)\r\n : (incoming ?? null);\r\n\r\n let display =\r\n meta.fieldType === \"index\"\r\n ? (rowNum ?? idx + 1)\r\n : (description ?? incoming);\r\n // if (meta.returnDisplayValue) {\r\n // console.log(colId, rowCollection, meta.returnDisplayValue, meta.fieldCollection, columnMeta, description, display)\r\n // }\r\n\r\n // 6. computed override\r\n if (meta?.computed?.dependsOn) {\r\n value = (await meta.computed.compute(values, remoteApi)) as unknown as\r\n | {}\r\n | null;\r\n display = value;\r\n } else if (meta.columnDef?.valueFormatter) {\r\n display = meta.columnDef.valueFormatter({\r\n value,\r\n data: hostData,\r\n });\r\n } else if (incoming != null && schema.displayFormat) {\r\n display = schema.displayFormat(incoming) as {} | null;\r\n }\r\n // 7. final cell creation\r\n cells.set(\r\n colId,\r\n new Cell(\r\n rowId,\r\n new ColumnId(colId),\r\n new CellValue(value),\r\n new CellValue(value),\r\n new CellDisplay(display)\r\n )\r\n );\r\n }\r\n const visibilityCondition = new Object() as Record<string, boolean>;\r\n const rowState =\r\n ((r.values ?? {})[\"RowState\"] as RowStateEnum | undefined) ??\r\n RowStateEnum.Unchanged;\r\n const uniqueId = new RowId(Math.floor((1 + Math.random()) * 0x10000000000000000));\r\n rowMap.set(\r\n uniqueId.value,\r\n new Row(\r\n rowId,\r\n cells,\r\n new RowState(rowState),\r\n new Set(),\r\n visibilityCondition,\r\n r.collection ?? r.rowType ?? rowCollection,\r\n false,\r\n r.data,\r\n r.sourceId ?? String(r.id),\r\n )\r\n );\r\n }\r\n return { rows: rowMap };\r\n }\r\n}\r\nexport function buildCollections(\r\n collectionColumns: Map<string, Map<string, ColumnSchema>>,\r\n rows: Map<number, Row>\r\n): Map<string, Collection> {\r\n const collectionMap = new Map<string, Collection>();\r\n for (const [collectionName, columns] of collectionColumns) {\r\n const collectionRows = new Map<number, Row>();\r\n for (const [rowId, row] of rows) {\r\n if (row.collection !== collectionName)\r\n continue;\r\n // PR-101: do not call getCell here — that would materialize every host\r\n // field. Reuse the existing cell map (index-only for lazy rowData).\r\n const cells = new Map(\r\n (row as { cells: Map<string, Cell> }).cells.entries(),\r\n );\r\n void columns;\r\n collectionRows.set(\r\n row.id.value,\r\n new Row(\r\n row.id,\r\n cells,\r\n row.rowState,\r\n new Set(row.changeFields),\r\n row.getVisibilityCondition(),\r\n collectionName,\r\n row.isSaveDescription,\r\n row.data,\r\n row.sourceId,\r\n )\r\n );\r\n }\r\n collectionMap.set(\r\n collectionName,\r\n new Collection(\r\n collectionName,\r\n collectionRows,\r\n columns\r\n )\r\n );\r\n }\r\n return collectionMap;\r\n}\r\n\r\nexport function createPermissionPolicy(\r\n config: Pick<CreateERPTableConfig, 'rowAccess'>,\r\n columnMeta: Map<string, ColumnSchema>,\r\n table: Table,\r\n repo: TableRepository,\r\n audit: AuditLogger\r\n): PermissionPolicy {\r\n const checkRoleAccess = (\r\n actor: Actor,\r\n allowRoles?: string[],\r\n denyRoles?: string[]\r\n ): boolean => {\r\n if (denyRoles?.some(r => actor.roles.includes(r))) {\r\n return false;\r\n }\r\n if (allowRoles) {\r\n return allowRoles.some(r => actor.roles.includes(r));\r\n }\r\n return true;\r\n };\r\n\r\n const resolveColumnAccess = (\r\n actor: Actor,\r\n rowId: number,\r\n columnId: string\r\n ): boolean => {\r\n const meta = columnMeta.get(columnId);\r\n if (!meta?.colAccess) return true;\r\n const { allowRoles, denyRoles, rule } = meta.colAccess;\r\n if (!checkRoleAccess(actor, allowRoles, denyRoles)) {\r\n return false;\r\n }\r\n if (rule) {\r\n // Page-window: bootstrap `table` may be stale after loadPage\r\n const row = table.getRow(rowId);\r\n if (!row) return true;\r\n return rule({ actor, row, table });\r\n }\r\n return true;\r\n };\r\n\r\n const resolveRowAccess = (\r\n actor: Actor,\r\n rowId?: number\r\n ): boolean => {\r\n const rowAccess = config.rowAccess;\r\n\r\n if (!rowId) {\r\n if (!rowAccess) return true;\r\n const { allowRoles, denyRoles, rule } = rowAccess;\r\n if (!checkRoleAccess(actor, allowRoles, denyRoles)) {\r\n return false;\r\n }\r\n if (rule) {\r\n return rule({ actor, table });\r\n }\r\n return true;\r\n }\r\n\r\n // Page-window: `table` closed over at bootstrap may be a stale page snapshot\r\n // after loadPage. Do NOT deny solely because the row isn't on that snapshot.\r\n if (!rowAccess) return true;\r\n\r\n const { allowRoles, denyRoles, rule } = rowAccess;\r\n if (!checkRoleAccess(actor, allowRoles, denyRoles)) {\r\n return false;\r\n }\r\n if (rule) {\r\n const row = table.getRow(rowId);\r\n if (!row) {\r\n // Roles already passed; row may live on another page / newer Table instance\r\n return true;\r\n }\r\n return rule({ actor, row, table });\r\n }\r\n return true;\r\n };\r\n\r\n return {\r\n canChangeCell: ({ actor, rowId, columnId }) => resolveColumnAccess(actor, rowId, columnId),\r\n canEdit: ({ actor, rowId, columnId }) => resolveColumnAccess(actor, rowId, columnId),\r\n canAddRow: ({ actor }) => resolveRowAccess(actor),\r\n canCopyRow: ({ actor, rowId }) => resolveRowAccess(actor, rowId),\r\n canDeleteRow: ({ actor, rowId }) => resolveRowAccess(actor, rowId),\r\n canReorderRow: ({ actor, rowId }) => resolveRowAccess(actor, rowId),\r\n canReorderColumn: ({ actor }) => resolveRowAccess(actor),\r\n };\r\n}\r\n\r\nexport function createTableAppService(\r\n repo: TableRepository,\r\n audit: AuditLogger,\r\n permissionPolicy: PermissionPolicy,\r\n { columnMeta, remoteApi }: { columnMeta: Map<string, ColumnSchema>; remoteApi: RemoteApi },\r\n eventStore?: EventStore\r\n): TableAppService {\r\n const changeCellHandler = new ChangeCellValueHandler(repo, audit, permissionPolicy, { columnMeta, remoteApi });\r\n const applyDynamicProjection = new ApplyDynamicProjectionHandler(repo, audit, permissionPolicy, { columnMeta, remoteApi });\r\n let rowVisibilityHandler: Promise<import('../../application/handlers/applyRowVisibilityHandler').ApplyRowVisibilityHandler> | undefined;\r\n const applyRowVisibility = () =>\r\n (rowVisibilityHandler ??= import('../../application/handlers/applyRowVisibilityHandler').then(\r\n (m) => new m.ApplyRowVisibilityHandler(repo, audit, permissionPolicy, { columnMeta, remoteApi }),\r\n ));\r\n const changeCellDisplayHandler = new ChangeCellDisplayValueHandler(repo, audit, permissionPolicy);\r\n const saveDescriptionHandler = new SaveDescriptionHandler(repo, audit, permissionPolicy);\r\n const addNewRowHandler = new AddNewRowCommandHandler(repo, audit, permissionPolicy);\r\n const addNewRowsHandler = new AddNewRowsCommandHandler(repo, audit, permissionPolicy);\r\n const duplicateRowHandler = new DuplicateRowCommandHandler(repo, audit, permissionPolicy);\r\n const pasteRowHandler = new PasteRowCommandHandler(repo, audit, permissionPolicy);\r\n const pasteCellsHandler = new PasteCellsCommandHandler(\r\n repo,\r\n audit,\r\n permissionPolicy,\r\n );\r\n const deleteRowHandler = new DeleteRowCommandHandler(repo, audit, permissionPolicy);\r\n const restoreAddedRowHandler = new RestoreAddedRowCommandHandler(\r\n repo,\r\n audit,\r\n permissionPolicy,\r\n );\r\n const deleteTableHandler = new DeleteTableCommandHandler(repo, audit, permissionPolicy);\r\n const resetTableHandler = new ResetTableCommandHandler(repo, audit, permissionPolicy);\r\n const reorderRowHandler = new ReorderRowCommandHandler(repo, audit, permissionPolicy);\r\n const reorderColumnHandler = new ReorderColumnCommandHandler(repo, audit, permissionPolicy);\r\n const setPageSize = new ChangePageSizeCommandHandler(repo, audit);\r\n const setPage = new ChangePageCommandHandler(repo, audit);\r\n const setActiveCollection = new SetActiveCollectionCommandHandler(repo, audit);\r\n\r\n const appService = new TableAppService(\r\n changeCellHandler,\r\n changeCellDisplayHandler,\r\n saveDescriptionHandler,\r\n addNewRowHandler,\r\n addNewRowsHandler,\r\n duplicateRowHandler,\r\n deleteRowHandler,\r\n reorderRowHandler,\r\n setPageSize,\r\n setPage,\r\n setActiveCollection,\r\n deleteTableHandler,\r\n resetTableHandler,\r\n applyDynamicProjection,\r\n pasteCellsHandler,\r\n restoreAddedRowHandler,\r\n pasteRowHandler,\r\n reorderColumnHandler,\r\n applyRowVisibility,\r\n );\r\n\r\n appService.setRepository(repo);\r\n\r\n if (eventStore) {\r\n appService.setEventStore(eventStore);\r\n }\r\n\r\n return appService;\r\n}\r\n","// bootstrap/index.ts — createGrid (sync) + deprecated createERPTable alias\r\n\r\nimport { Table } from '../domain/entities/Table';\r\nimport {\r\n Pagination,\r\n RowStateEnum,\r\n} from '../domain/value-objects';\r\nimport { TableEngine } from '../engine/tableEngine';\r\nimport {\r\n CachedTableRepository,\r\n} from '../infrastructure/Repositories/cachedTableRepository';\r\nimport {\r\n LocalTableRepository,\r\n} from '../infrastructure/Repositories/localTableRepository';\r\nimport {\r\n isWindowedRepository,\r\n WindowedTableRepository,\r\n} from '../application/ports/TableRepository';\r\nimport {\r\n ConsoleAuditLogger,\r\n} from '../infrastructure/Repositories/consoleAuditLogger';\r\nimport { NoopRemoteApi } from '../infrastructure/Repositories/noopRemoteApi';\r\nimport { InMemoryEventStore } from '../infrastructure/eventStore/InMemoryEventStore';\r\nimport { IndexedDbEventStore } from '../infrastructure/eventStore/IndexedDbEventStore';\r\nimport { eventStoreDbName } from '../infrastructure/eventStore/eventStoreName';\r\nimport { HistoryPanelViewModel } from '../infrastructure/history/HistoryPanelViewModel';\r\nimport { OfflineStatus } from '../application/offline/OfflineStatus';\r\nimport {\r\n createBrowserConnectivity,\r\n createLocalStorageWatermark,\r\n} from '../infrastructure/offline';\r\nimport { ChangelogProjection } from '../infrastructure/projections/ChangelogProjection';\r\nimport { SnapshotStrategy } from '../infrastructure/snapshot/SnapshotStrategy';\r\nimport { createGridApi } from '../infrastructure/ui/createGridApi';\r\nimport { attachColumnStatePersistence } from '../infrastructure/ui/columnStatePersist';\r\nimport { UITableController } from '../infrastructure/ui/UITableController';\r\nimport {\r\n copyGridSelectionToClipboard,\r\n cutGridSelectionToClipboard,\r\n pasteGridFromClipboard,\r\n} from '../infrastructure/ui/gridClipboard';\r\nimport { CellUndoStack } from '../application/undo/CellUndoStack';\r\nimport { createEngineGridQuery } from '../application/plugins/createEngineGridQuery';\r\nimport { PluginHost } from '../application/plugins/PluginHost';\r\nimport { attachServerRowModel } from '../application/rowModel/attachServerRowModel';\r\nimport { isServerRowModel } from '../application/ports/GridDatasource';\r\nimport { DefaultGridSession } from '../infrastructure/session/DefaultGridSession';\r\nimport { mapColumnSchemas } from '../infrastructure/columns/mapColumnSchema';\r\nimport {\r\n mapColDefOrGroups,\r\n mapColumnSchemasToDefs,\r\n} from '../infrastructure/columns/mapColumnDef';\r\nimport { flattenColDefOrGroup } from '../infrastructure/columns/flattenColumnDefs';\r\nimport {\r\n defaultGetRowId,\r\n ensureIndexColumnDef,\r\n mapRowDataToRowInputs,\r\n} from '../infrastructure/rows/mapRowData';\r\nimport type { EventStore } from '../application/ports/EventStore';\r\nimport {\r\n buildCollections,\r\n buildColumns,\r\n buildRows,\r\n createPermissionPolicy,\r\n createTableAppService,\r\n isInitiallyHidden,\r\n} from './builders';\r\nimport {\r\n ColumnSchema,\r\n CreateERPTableConfig,\r\n CreateERPTableResult,\r\n CreateGridConfig,\r\n CreateGridResult,\r\n GetRowId,\r\n RowInput,\r\n} from './type';\r\nimport type { ColumnDef } from '../domain/types/ColumnDef';\r\nimport {\r\n resolveCreateGridDefaults,\r\n} from './defaults';\r\n\r\nexport {\r\n DEFAULT_GRID_ACTOR,\r\n DEFAULT_MEMORY_STORE,\r\n createGridTableKey,\r\n isPersistentStore,\r\n resolveCreateGridDefaults,\r\n} from './defaults';\r\n\r\nasync function resolveEventStore(\r\n config: Pick<\r\n CreateERPTableConfig,\r\n 'eventStore' | 'store' | 'eventStoreName' | 'persistence'\r\n >,\r\n persist: boolean,\r\n): Promise<EventStore> {\r\n if (config.eventStore) return config.eventStore;\r\n // Page-window mode: IndexedDB already holds the durable rows, so the audit /\r\n // undo log stays in memory unless the host injects its own `eventStore`.\r\n if (config.persistence === 'paged-idb') return new InMemoryEventStore();\r\n // Durable log only when the host asked for a `store` (PR-83).\r\n if (persist && typeof indexedDB !== 'undefined') {\r\n return IndexedDbEventStore.open(\r\n eventStoreDbName(config.store as string, config.eventStoreName),\r\n );\r\n }\r\n return new InMemoryEventStore();\r\n}\r\n\r\nfunction createInitialRows(\r\n collectionColumns: Map<string, Map<string, ColumnSchema>>\r\n): RowInput[] {\r\n const rows: RowInput[] = [];\r\n for (const collectionName of collectionColumns.keys()) {\r\n rows.push({\r\n id: Date.now() + Math.floor(Math.random() * 1000000),\r\n collection: collectionName,\r\n values: {\r\n RowState: RowStateEnum.Added,\r\n },\r\n });\r\n }\r\n\r\n return rows;\r\n}\r\n\r\nfunction resolveHostColumns<TRow>(\r\n config: CreateERPTableConfig<TRow>,\r\n): ColumnSchema[] {\r\n if (config.columns && config.columns.length > 0) return config.columns;\r\n const defs = ensureIndexColumnDef(config.columnDefs ?? []);\r\n if (defs.length === 0) return [];\r\n return mapColDefOrGroups(defs);\r\n}\r\n\r\nfunction resolveHostRows<TRow>(\r\n config: CreateERPTableConfig<TRow>,\r\n columns: ColumnSchema[],\r\n): RowInput[] | undefined {\r\n if (config.rows && config.rows.length > 0) return config.rows;\r\n if (config.rowData === undefined) return undefined;\r\n const defs: ColumnDef<TRow>[] =\r\n config.columnDefs && config.columnDefs.length > 0\r\n ? flattenColDefOrGroup(ensureIndexColumnDef(config.columnDefs))\r\n : (mapColumnSchemasToDefs(columns) as ColumnDef<TRow>[]);\r\n return mapRowDataToRowInputs(\r\n config.rowData,\r\n defs,\r\n (config.getRowId ?? defaultGetRowId) as GetRowId<TRow>,\r\n );\r\n}\r\n\r\nasync function assembleGrid<TRow>(\r\n config: CreateERPTableConfig<TRow>,\r\n): Promise<CreateERPTableResult<TRow>> {\r\n const { store, tableKey, actor, persist } = resolveCreateGridDefaults(config);\r\n const resolved: CreateERPTableConfig<TRow> = {\r\n ...config,\r\n store,\r\n tableKey,\r\n actor,\r\n };\r\n\r\n // ---------- infra ----------\r\n const pagedIdb = config.persistence === 'paged-idb';\r\n if (pagedIdb && !persist) {\r\n throw new Error(\r\n \"[createGrid] persistence 'paged-idb' requires a non-empty `store`\",\r\n );\r\n }\r\n // The page-window kit (repositories, seed, bulk delete) is loaded lazily so\r\n // the default entry stays within its bundle budget (separate chunk).\r\n const pagedKit =\r\n pagedIdb || (config.repo && isWindowedRepository(config.repo))\r\n ? await import('../infrastructure/Repositories/paged/pagedKit')\r\n : undefined;\r\n const repo =\r\n config.repo ??\r\n (pagedKit\r\n ? new pagedKit.PagedCachedTableRepository()\r\n : persist\r\n ? new CachedTableRepository()\r\n : new LocalTableRepository());\r\n const windowed = isWindowedRepository(repo);\r\n const audit = config.audit ?? new ConsoleAuditLogger();\r\n const remoteApi = config.remoteApi ?? new NoopRemoteApi();\r\n const eventStore = await resolveEventStore(resolved, persist);\r\n const changelogProjection = new ChangelogProjection(eventStore);\r\n const historyPanelViewModel = new HistoryPanelViewModel(changelogProjection);\r\n const cellUndoStack = new CellUndoStack();\r\n await changelogProjection.start();\r\n\r\n const offlineStatus = new OfflineStatus({\r\n tableId: tableKey,\r\n connectivity: config.connectivity ?? createBrowserConnectivity(),\r\n watermark: createLocalStorageWatermark(`pdg-sync-watermark:${store}:${tableKey}`),\r\n });\r\n await offlineStatus.start(eventStore);\r\n\r\n const engineRef: { current?: TableEngine } = {};\r\n const snapshotStrategy = config.snapshotStore\r\n ? new SnapshotStrategy(\r\n config.snapshotStore,\r\n eventStore,\r\n () =>\r\n engineRef.current?.getSnapShot('active') ?? {\r\n rows: [],\r\n },\r\n { everyNEvents: config.snapshotEveryNEvents },\r\n )\r\n : undefined;\r\n\r\n // ---------- محاسبه pageSize دقیقاً مثل نسخه اولیه ----------\r\n const page = 1;\r\n const rowHeight = config.rowHeight ?? 40;\r\n const pageSize = config.tableHeight\r\n ? Math.floor(config.tableHeight / rowHeight)\r\n : config.recordPerPage ?? 10;\r\n // ---------- columns & rows (با چک repo) ----------\r\n const activeCollection = config.activeCollection ?? config.tableType;\r\n const hostColumns = resolveHostColumns(config);\r\n const hostRows = resolveHostRows(config, hostColumns);\r\n const usingRowData =\r\n config.rowData !== undefined && !(config.rows && config.rows.length > 0);\r\n const buildResult = buildColumns(\r\n hostColumns,\r\n hostRows ?? config.rows ?? [],\r\n activeCollection,\r\n );\r\n let { columns } = buildResult;\r\n const { columnMeta, collectionColumns } = buildResult;\r\n const normalizedRows: RowInput[] = usingRowData\r\n ? (hostRows ?? [])\r\n : hostRows?.length\r\n ? hostRows\r\n : createInitialRows(collectionColumns);\r\n const { rows, table: loadedTable } = await buildRows(\r\n collectionColumns,\r\n columnMeta,\r\n normalizedRows,\r\n repo,\r\n store,\r\n tableKey,\r\n remoteApi,\r\n { skipPersistLoad: windowed ? false : usingRowData || !persist },\r\n );\r\n const initialCollection = buildCollections(\r\n collectionColumns,\r\n rows\r\n );\r\n if (loadedTable) {\r\n columns = new Map<string, ColumnSchema>();\r\n const rowList = Array.from(rows.values());\r\n const collectionName = activeCollection ?? 'default';\r\n for (const [columnKey, col] of buildResult.columns) {\r\n columns.set(columnKey, {\r\n ...col,\r\n hidden: isInitiallyHidden(col, rowList, collectionName),\r\n });\r\n }\r\n }\r\n // ---------- table ----------\r\n // Pagination total = ACTIVE collection's own row count (windowed mode):\r\n // rows.size spans every collection on multi-collection pages.\r\n const activeRowCount = windowed\r\n ? initialCollection.get(activeCollection ?? 'default')?.getRows().size ??\r\n rows.size\r\n : pageSize;\r\n let table = loadedTable || new Table(\r\n tableKey,\r\n initialCollection,\r\n new Pagination(page, pageSize, activeRowCount),\r\n null,\r\n activeCollection ?? 'default'\r\n );\r\n if (windowed && pagedKit) {\r\n table.setPageWindow(true);\r\n await pagedKit.seedWindowedTable({\r\n repo: repo as WindowedTableRepository,\r\n store,\r\n tableKey,\r\n table,\r\n loadedTable,\r\n columns,\r\n columnMeta,\r\n page,\r\n pageSize,\r\n activeRowCount,\r\n }).then((w) => {\r\n table = w;\r\n });\r\n } else if (loadedTable) {\r\n table.setColumns(Array.from(columns.values()));\r\n table.setPagination(new Pagination(page, pageSize, pageSize)); await repo.save(store, table);\r\n } else {\r\n await repo.save(store, table);\r\n }\r\n // ---------- policies & app ----------\r\n const permissionPolicy = createPermissionPolicy(resolved, columnMeta, table, repo, audit);\r\n const app = createTableAppService(repo, audit, permissionPolicy, { columnMeta, remoteApi }, eventStore);\r\n app.setUndoStack(cellUndoStack);\r\n if (windowed && pagedKit) {\r\n app.setDeleteRowsHandler(\r\n new pagedKit.DeleteRowsCommandHandler(\r\n repo as WindowedTableRepository,\r\n audit,\r\n permissionPolicy,\r\n ),\r\n );\r\n }\r\n if (snapshotStrategy) {\r\n app.setSnapshotStrategy(snapshotStrategy);\r\n }\r\n\r\n // ---------- engine & session & controller ----------\r\n const engine = new TableEngine(app, repo, actor, audit, columnMeta);\r\n engineRef.current = engine;\r\n const session = new DefaultGridSession({\r\n engine,\r\n store,\r\n tableKey,\r\n audit,\r\n changelogProjection,\r\n historyPanelViewModel,\r\n cellUndoStack,\r\n });\r\n const controller = new UITableController(\r\n engine,\r\n store,\r\n tableKey,\r\n audit,\r\n changelogProjection,\r\n historyPanelViewModel,\r\n cellUndoStack,\r\n session,\r\n remoteApi,\r\n offlineStatus,\r\n );\r\n\r\n let syncPort: import('../application/ports/SyncPort').SyncPort | undefined;\r\n if (config.syncTransport) {\r\n const { GridSyncService } = await import('../application/sync/GridSyncService');\r\n syncPort = new GridSyncService({\r\n tableId: tableKey,\r\n eventStore,\r\n offlineStatus,\r\n transport: config.syncTransport,\r\n policy: config.syncConflictPolicy,\r\n applyCellValue: (rowId, columnId, value) =>\r\n controller.applySyncedCellValue(rowId, columnId, value),\r\n });\r\n controller.setSyncPort(syncPort);\r\n }\r\n\r\n let presencePort: import('../application/ports/PresencePort').PresencePort | undefined;\r\n const presenceTransport =\r\n config.presenceTransport ??\r\n (config.presence\r\n ? (\r\n await import('../infrastructure/presence/broadcastChannelTransport')\r\n ).createBroadcastChannelPresenceTransport(\r\n `pdg-presence:${store}:${tableKey}`,\r\n )\r\n : undefined);\r\n if (presenceTransport) {\r\n const { GridPresenceService } = await import(\r\n '../application/presence/GridPresenceService'\r\n );\r\n presencePort = new GridPresenceService({\r\n tableId: tableKey,\r\n actorId: actor.userId,\r\n label: config.presenceLabel ?? actor.userId,\r\n transport: presenceTransport,\r\n });\r\n controller.setPresencePort(presencePort);\r\n }\r\n\r\n const { definitions: columnDefinitions, bindings: columnBindings } =\r\n mapColumnSchemas(hostColumns);\r\n await controller.dispatch({ type: 'TABLE_REGISTERED', storeName: store, table });\r\n\r\n if (typeof config.quickFilterText === 'string' && config.quickFilterText.length > 0) {\r\n controller.setQuickFilterText(config.quickFilterText);\r\n }\r\n\r\n if (config.groupBy != null) {\r\n const cols =\r\n typeof config.groupBy === 'string'\r\n ? [config.groupBy]\r\n : [...config.groupBy];\r\n controller.setRowGroupColumns(cols);\r\n }\r\n if (typeof config.groupDefaultExpanded === 'boolean') {\r\n controller.setGroupDefaultExpanded(config.groupDefaultExpanded);\r\n }\r\n\r\n engine.setCellEditOptions({\r\n ...(typeof config.singleClickEdit === 'boolean'\r\n ? { singleClickEdit: config.singleClickEdit }\r\n : {}),\r\n ...(typeof config.stopEditingWhenCellsLoseFocus === 'boolean'\r\n ? { stopEditingWhenCellsLoseFocus: config.stopEditingWhenCellsLoseFocus }\r\n : {}),\r\n ...(config.editType === 'cell' || config.editType === 'fullRow'\r\n ? { editType: config.editType }\r\n : {}),\r\n });\r\n\r\n controller.configureClipboard({\r\n copyFormattedValue: config.copyFormattedValue,\r\n copyHeadersToClipboard: config.copyHeadersToClipboard,\r\n copyDigitsAsLatin: config.copyDigitsAsLatin,\r\n processCellForClipboard: config.processCellForClipboard,\r\n pasteAddsRows: config.pasteAddsRows,\r\n });\r\n session.attachCopyCells(() =>\r\n copyGridSelectionToClipboard(engine, controller.getClipboardOptions()),\r\n );\r\n session.attachCutCells(() =>\r\n cutGridSelectionToClipboard(\r\n engine,\r\n store,\r\n tableKey,\r\n controller.getClipboardOptions(),\r\n ),\r\n );\r\n session.attachPasteCells(async () => {\r\n const result = await pasteGridFromClipboard(\r\n engine,\r\n store,\r\n tableKey,\r\n controller.getClipboardOptions(),\r\n );\r\n return result.applied > 0 || result.rowsAdded > 0;\r\n });\r\n\r\n let refreshServerSide: (() => Promise<void>) | undefined;\r\n if (\r\n isServerRowModel(config.rowModelType) &&\r\n config.datasource\r\n ) {\r\n const handle = attachServerRowModel({\r\n engine,\r\n session,\r\n rowModelType: config.rowModelType!,\r\n datasource: config.datasource,\r\n columnDefs: config.columnDefs,\r\n getRowId: config.getRowId,\r\n cacheBlockSize: config.cacheBlockSize ?? config.recordPerPage,\r\n maxBlocksInCache: config.maxBlocksInCache,\r\n });\r\n refreshServerSide = () => handle.refreshServerSide();\r\n }\r\n\r\n if (snapshotStrategy) {\r\n await snapshotStrategy.loadWithCatchUp(`table:${tableKey}`);\r\n }\r\n\r\n const pluginHost = new PluginHost({\r\n tableId: tableKey,\r\n actorId: actor.userId,\r\n eventStore,\r\n session,\r\n query: createEngineGridQuery(engine),\r\n });\r\n if (config.plugins?.length) {\r\n pluginHost.register(config.plugins);\r\n }\r\n\r\n const api = createGridApi({\r\n controller,\r\n pluginHost,\r\n columnDefs: config.columnDefs,\r\n getRowId: config.getRowId,\r\n refreshServerSide,\r\n });\r\n\r\n await attachColumnStatePersistence({\r\n api,\r\n controller,\r\n tableId: tableKey,\r\n actorId: actor.userId,\r\n stateKey: config.stateKey,\r\n eventStore,\r\n });\r\n\r\n return {\r\n engine,\r\n controller,\r\n session,\r\n table,\r\n store,\r\n tableKey,\r\n columnMeta,\r\n columnDefinitions,\r\n columnBindings,\r\n eventStore,\r\n snapshotStrategy,\r\n changelogProjection,\r\n historyPanelViewModel,\r\n cellUndoStack,\r\n pluginHost,\r\n api,\r\n offlineStatus,\r\n syncPort,\r\n presencePort,\r\n };\r\n}\r\n\r\n/**\r\n * Sync composition root (D24). Returns immediately; EventStore / snapshot\r\n * load runs in the background. Await `grid.ready` before using `engine` / `api`.\r\n */\r\nexport function createGrid<TRow = unknown>(\r\n config: CreateGridConfig<TRow> = {},\r\n): CreateGridResult<TRow> {\r\n const identity = resolveCreateGridDefaults(config);\r\n // Do not fill the in-memory default `store` back into config — assembleGrid\r\n // re-resolves, and a set `store` means persist (PR-83).\r\n const resolved: CreateERPTableConfig<TRow> = {\r\n ...config,\r\n tableKey: identity.tableKey,\r\n actor: identity.actor,\r\n store: identity.persist ? identity.store : undefined,\r\n };\r\n\r\n const grid = {\r\n store: identity.store,\r\n tableKey: identity.tableKey,\r\n } as CreateGridResult<TRow>;\r\n\r\n // Page-window mode keys every IndexedDB record by `tableKey`; a generated\r\n // key would silently orphan the data on the next open.\r\n const missingPagedKey =\r\n config.persistence === 'paged-idb' &&\r\n !(typeof config.tableKey === 'string' && config.tableKey.length > 0);\r\n\r\n const ready: Promise<CreateGridResult<TRow>> = (\r\n missingPagedKey\r\n ? Promise.reject(\r\n new Error(\"[createGrid] persistence 'paged-idb' requires `tableKey`\"),\r\n )\r\n : assembleGrid(resolved)\r\n ).then(\r\n (assembled) => {\r\n Object.assign(grid, assembled);\r\n return grid;\r\n },\r\n );\r\n Object.defineProperty(grid, 'ready', {\r\n value: ready,\r\n enumerable: true,\r\n configurable: false,\r\n writable: false,\r\n });\r\n return grid;\r\n}\r\n\r\n/**\r\n * @deprecated Prefer {@link createGrid} (D24). `await createERPTable(cfg)` is\r\n * equivalent to `await createGrid(cfg).ready`.\r\n */\r\nexport function createERPTable<TRow = unknown>(\r\n config: CreateERPTableConfig<TRow> = {},\r\n): Promise<CreateGridResult<TRow>> {\r\n return createGrid(config).ready;\r\n}\r\n","import type {\r\n AggregateSnapshot,\r\n SnapshotStore,\r\n} from '../../application/ports/SnapshotStore';\r\n\r\nexport class InMemorySnapshotStore<TPayload = unknown>\r\n implements SnapshotStore<TPayload>\r\n{\r\n private byStream = new Map<string, AggregateSnapshot<TPayload>>();\r\n\r\n async save(snapshot: AggregateSnapshot<TPayload>): Promise<void> {\r\n this.byStream.set(snapshot.streamId, snapshot);\r\n }\r\n\r\n async loadLatest(\r\n streamId: string,\r\n ): Promise<AggregateSnapshot<TPayload> | null> {\r\n return this.byStream.get(streamId) ?? null;\r\n }\r\n\r\n async clear(streamId: string): Promise<void> {\r\n this.byStream.delete(streamId);\r\n }\r\n}\r\n","/**\r\n * Plugin-facing event catalog (stable type tokens for subscribe / export plugins).\r\n * Keep in sync with `application/events` and `domain/types/GridEvent`.\r\n */\r\n\r\nexport type EventCatalogEntry = {\r\n readonly type: string;\r\n readonly category: 'cell' | 'row' | 'column' | 'table' | 'view' | 'dynamic' | 'error' | 'plugin';\r\n readonly undoable: boolean;\r\n readonly description: string;\r\n};\r\n\r\nexport const EVENT_CATALOG: readonly EventCatalogEntry[] = [\r\n {\r\n type: 'CELL_CHANGED',\r\n category: 'cell',\r\n undoable: true,\r\n description: 'Cell value changed; payload includes previousValue and newValue. Host React: onCellValueChanged + onRowValueChanged (PR-85).',\r\n },\r\n {\r\n type: 'CELL_DISPLAY_CHANGED',\r\n category: 'cell',\r\n undoable: false,\r\n description: 'Display-only cell text changed.',\r\n },\r\n {\r\n type: 'DYNAMIC_PROJECTION_DONE',\r\n category: 'dynamic',\r\n undoable: false,\r\n description: 'Async/dynamic projection finished for a cell.',\r\n },\r\n {\r\n type: 'ROW_ADDED',\r\n category: 'row',\r\n undoable: true,\r\n description: 'A new row was added to the active collection.',\r\n },\r\n {\r\n type: 'NEW_ROW_ADDED',\r\n category: 'row',\r\n undoable: true,\r\n description: 'Alias/variant for newly inserted row with initial values.',\r\n },\r\n {\r\n type: 'ROW_DELETED',\r\n category: 'row',\r\n undoable: true,\r\n description:\r\n 'Soft delete for persisted rows; stacked for undo (toggle). Hard remove of Added rows uses NEW_ROW_REMOVED.',\r\n },\r\n {\r\n type: 'NEW_ROW_REMOVED',\r\n category: 'row',\r\n undoable: true,\r\n description: 'Hard-removed Added row; undo restores identity via RESTORE_ADDED_ROW.',\r\n },\r\n {\r\n type: 'ROW_RESTORED',\r\n category: 'row',\r\n undoable: false,\r\n description: 'Soft-deleted or modified row restored.',\r\n },\r\n {\r\n type: 'ROW_REORDERED',\r\n category: 'row',\r\n undoable: false,\r\n description: 'Row index/order changed.',\r\n },\r\n {\r\n type: 'ROW_DESCRIPTION_SAVED',\r\n category: 'row',\r\n undoable: false,\r\n description: 'Row description flag saved.',\r\n },\r\n {\r\n type: 'COLUMN_REORDERED',\r\n category: 'column',\r\n undoable: false,\r\n description: 'Column order changed via Table.reorderColumns (header drag or command).',\r\n },\r\n {\r\n type: 'COLUMN_STATE_CHANGED',\r\n category: 'column',\r\n undoable: false,\r\n description:\r\n 'Column layout snapshot (width, order, pin, hide, sort) after user/API change (PR-115).',\r\n },\r\n {\r\n type: 'UNIT_COLUMN_ADDED',\r\n category: 'column',\r\n undoable: false,\r\n description: 'Reserved: unit-level column added dynamically. No product emitter (SET_UNIT_LEVEL stub removed).',\r\n },\r\n {\r\n type: 'PAGE_CHANGED',\r\n category: 'view',\r\n undoable: false,\r\n description: 'Pagination page changed (view stream).',\r\n },\r\n {\r\n type: 'PAGE_SIZE_CHANGED',\r\n category: 'view',\r\n undoable: false,\r\n description: 'Page size changed (view stream).',\r\n },\r\n {\r\n type: 'VIEWPORT_CHANGED',\r\n category: 'view',\r\n undoable: false,\r\n description: 'Virtual scroll viewport moved; payload includes scrollOffset and visible range.',\r\n },\r\n {\r\n type: 'ACTIVE_COLLECTION_CHANGED',\r\n category: 'view',\r\n undoable: false,\r\n description: 'Active collection switched.',\r\n },\r\n {\r\n type: 'TABLE_DELETED',\r\n category: 'table',\r\n undoable: false,\r\n description: 'Table removed from store.',\r\n },\r\n {\r\n type: 'TABLE_RESET',\r\n category: 'table',\r\n undoable: false,\r\n description: 'Table state reset.',\r\n },\r\n {\r\n type: 'DYNAMIC_DATA_REQUESTED',\r\n category: 'dynamic',\r\n undoable: false,\r\n description: 'Remote/dynamic data requested for a column.',\r\n },\r\n {\r\n type: 'VALIDATION_FAILED',\r\n category: 'error',\r\n undoable: false,\r\n description: 'Domain validation failed; state unchanged.',\r\n },\r\n {\r\n type: 'EXPORT_REQUESTED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'Host/plugin requested export (pdf/xlsx); typically view stream.',\r\n },\r\n {\r\n type: 'XLSX_EXPORT_COMPLETED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'Excel plugin finished building an .xlsx blob.',\r\n },\r\n {\r\n type: 'XLSX_EXPORT_FAILED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'Excel plugin failed to export.',\r\n },\r\n {\r\n type: 'PDF_EXPORT_COMPLETED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'PDF plugin finished rendering a document.',\r\n },\r\n {\r\n type: 'PDF_EXPORT_FAILED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'PDF plugin failed to export.',\r\n },\r\n {\r\n type: 'CSV_EXPORT_COMPLETED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'CSV plugin finished building a .csv blob (PR-122).',\r\n },\r\n {\r\n type: 'CSV_EXPORT_FAILED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'CSV plugin failed to export.',\r\n },\r\n {\r\n type: 'IMPORT_REQUESTED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'Host/plugin requested import (xlsx); typically view stream.',\r\n },\r\n {\r\n type: 'XLSX_IMPORT_COMPLETED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'Excel plugin finished importing rows into the table.',\r\n },\r\n {\r\n type: 'XLSX_IMPORT_FAILED',\r\n category: 'plugin',\r\n undoable: false,\r\n description: 'Excel plugin failed to import.',\r\n },\r\n] as const;\r\n\r\nexport function getEventCatalogEntry(type: string): EventCatalogEntry | undefined {\r\n return EVENT_CATALOG.find((e) => e.type === type);\r\n}\r\n\r\nexport function listUndoableEventTypes(): string[] {\r\n return EVENT_CATALOG.filter((e) => e.undoable).map((e) => e.type);\r\n}\r\n"]}
|