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":["../domain/events/index.ts","../domain/entities/Cell.ts","../domain/entities/Collection.ts","../domain/entities/Row.ts","../domain/entities/Table.ts"],"names":[],"mappings":"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","file":"chunk-5HKVMPBD.js","sourcesContent":["//domain/events\r\nimport {\r\n CellValue,\r\n ColumnId,\r\n RowId,\r\n} from '../value-objects';\r\n\r\nexport class TablePageChanged {\r\n constructor(\r\n public readonly page: number,\r\n public readonly pageSize: number\r\n ) {}\r\n}\r\n\r\n\r\nexport class CellChanged {\r\n readonly type = 'CELL_CHANGED';\r\n constructor(\r\n public readonly rowId: RowId,\r\n public readonly columnId: ColumnId,\r\n public readonly newValue: unknown,\r\n public readonly previousValue: unknown,\r\n ) { }\r\n}\r\nexport class DisplayChanged {\r\n readonly type = 'DISPLAY_CHANGED';\r\n constructor(\r\n public readonly rowId: RowId,\r\n public readonly columnId: ColumnId,\r\n public readonly newValue: unknown\r\n ) { }\r\n}\r\nexport class DescriptionSaved {\r\n readonly type = 'DESCRIPTION_SAVED';\r\n constructor(\r\n public readonly rowId: RowId,\r\n public readonly flag: boolean,\r\n \r\n ) { }\r\n}\r\nexport class Validated {\r\n readonly type = 'CELL_VALIDATED';\r\n constructor(\r\n public readonly rowId: RowId,\r\n public readonly columnId: ColumnId,\r\n public readonly valid: boolean,\r\n public readonly error: string\r\n ) { }\r\n}\r\n\r\nexport class ColumnReordered {\r\n readonly type = \"COLUMN_REORDERED\";\r\n constructor(\r\n public readonly sourceIndex: number,\r\n public readonly destIndex: number\r\n ) { }\r\n}\r\n\r\nexport class DynamicDataRequested {\r\n readonly type = 'DYNAMIC_DATA_REQUESTED';\r\n\r\n constructor(\r\n public readonly sourceColumn: ColumnId,\r\n public readonly value: CellValue\r\n ) { }\r\n}\r\n\r\nexport type PageChanged = { type: \"PageChanged\"; payload: { page: number; }; };\r\n\r\nexport class RowAdded {\r\n readonly type = 'ROW_ADDED';\r\n constructor(public readonly rowId: RowId) { }\r\n}\r\nexport class NewRowAdded {\r\n readonly type = 'NEW_ROW_ADDED';\r\n\r\n constructor(public readonly rowId: RowId,\r\n public readonly initialValues: Record<string, unknown>\r\n ) { }\r\n}\r\n\r\nexport class RowDeleted {\r\n readonly type = \"ROW_DELETED\";\r\n constructor(public readonly rowId: RowId) { }\r\n}\r\nexport class RowRemoved {\r\n readonly type = \"NEW_ROW_REMOVED\";\r\n constructor(public readonly rowId: RowId) { }\r\n}\r\nexport class MinimumRowConstraintViolated {\r\n readonly type = \"NEW_AND_FIRST_ROW_CAN_NOT_BE_REMOVE\";\r\n constructor(public readonly rowId: RowId) { }\r\n}\r\n\r\n\r\nexport class RowRestored {\r\n readonly type = \"ROW_RESTORED\";\r\n constructor(public readonly rowId: RowId) { }\r\n}\r\n\r\nexport class RowReordered {\r\n readonly type = \"ROW_REORDERED\";\r\n constructor(\r\n public readonly draggedRowNum: number,\r\n public readonly droppedRowNum: number\r\n ) { }\r\n}\r\n\r\nexport class RowExpanded {\r\n constructor(public readonly rowId: RowId) {}\r\n}\r\nexport class RowCollapsed {\r\n constructor(public readonly rowId: RowId) {}\r\n}","// domain/entities/Cell.ts\r\nimport {\r\n CellChanged,\r\n DisplayChanged,\r\n} from '../events';\r\nimport {\r\n CellDisplay,\r\n CellValue,\r\n ColumnId,\r\n RowId,\r\n} from '../value-objects';\r\n\r\nfunction unwrap(value: unknown): unknown {\r\n if (value instanceof CellValue) return value.value;\r\n if (value instanceof CellDisplay) return value.value;\r\n return value;\r\n}\r\n\r\n/**\r\n * Domain cell. Stores primitives (PR-101) — `CellValue` / `CellDisplay`\r\n * wrappers are allocated only when callers ask for value objects.\r\n */\r\nexport class Cell {\r\n private value: unknown;\r\n private originalValue: unknown;\r\n private display: unknown;\r\n\r\n constructor(\r\n public readonly rowId: RowId,\r\n public readonly columnId: ColumnId,\r\n value: unknown,\r\n originalValue: unknown,\r\n display: unknown,\r\n ) {\r\n this.value = unwrap(value);\r\n this.originalValue = unwrap(originalValue);\r\n this.display = unwrap(display);\r\n }\r\n\r\n changeValue(newValue: unknown): CellChanged | null {\r\n const previousValue = this.value;\r\n this.value = unwrap(newValue);\r\n return new CellChanged(this.rowId, this.columnId, this.value, previousValue);\r\n }\r\n\r\n changeDisplay(newValue: unknown): DisplayChanged | null {\r\n const next = unwrap(newValue);\r\n if (this.display === next) return null;\r\n this.display = next;\r\n return new DisplayChanged(this.rowId, this.columnId, next);\r\n }\r\n\r\n changeOriginalValue(newValue: unknown): CellChanged | null {\r\n const next = unwrap(newValue);\r\n if (this.originalValue === next) return null;\r\n const previousValue = this.originalValue;\r\n this.originalValue = next;\r\n return new CellChanged(this.rowId, this.columnId, next, previousValue);\r\n }\r\n\r\n getValue(): unknown {\r\n return this.value;\r\n }\r\n\r\n getValueObject(): CellValue {\r\n return new CellValue(this.value);\r\n }\r\n\r\n getDisplay(): unknown {\r\n return this.display;\r\n }\r\n\r\n getDisplayObject(): CellDisplay {\r\n return new CellDisplay(this.display);\r\n }\r\n\r\n getOriginalValue(): CellValue {\r\n return new CellValue(this.originalValue);\r\n }\r\n\r\n clone(): Cell {\r\n return new Cell(\r\n this.rowId,\r\n this.columnId,\r\n this.value,\r\n this.originalValue,\r\n this.display,\r\n );\r\n }\r\n}\r\n","import type { ColumnSchema } from '../types/ColumnSchema';\nimport { Row } from './Row';\n\nexport class Collection {\n\n constructor(\n public name: string = \"default\",\n private rows: Map<number, Row>,\n private columns: Map<string, ColumnSchema>,\n\n\n\n ) { }\n setCollectionName(name: string): void {\n this.name = name\n }\n getCollectionName(): string {\n return this.name\n }\n getRows(): Map<number, Row> {\n return this.rows;\n }\n setRows(rows: Map<number, Row>): void {\n this.rows = rows;\n }\n\n getColumns(): Map<string, ColumnSchema> {\n return this.columns;\n }\n\n\n}\n\n\n","//domain/entities\r\nimport {\r\n CellChanged,\r\n DescriptionSaved,\r\n DisplayChanged,\r\n} from '../events';\r\nimport {\r\n CellDisplay,\r\n CellValue,\r\n ColumnId,\r\n RowId,\r\n RowState,\r\n RowStateEnum,\r\n} from '../value-objects';\r\nimport { Cell } from './Cell';\r\n\r\nexport class Row {\r\n\r\n constructor(\r\n public id: RowId,\r\n public cells: Map<string, Cell>,\r\n public rowState: RowState,\r\n public changeFields: Set<string> = new Set(),\r\n public visibilityCondition: Record<string, boolean>,\r\n public collection: string = \"default\",\r\n public isSaveDescription: boolean,\r\n /**\r\n * Host object for `rowData` (PR-82). Same reference — never deep-cloned —\r\n * so `ColumnDef.valueGetter` can read the original `TRow`.\r\n */\r\n public data?: unknown,\r\n /** Stable host id from `getRowId` (string). */\r\n public sourceId?: string,\r\n ) { }\r\n updateChangeFields(columnId: ColumnId): void {\r\n const cell = this.getCell(columnId.value);\r\n if (!cell) return;\r\n const value = cell.getValueObject();\r\n const originalValue = cell.getOriginalValue();\r\n if (this.rowState.value !== RowStateEnum.Added) {\r\n if (!value.equals(originalValue)) {\r\n this.changeFields.add(columnId.value);\r\n } else {\r\n this.changeFields.delete(columnId.value);\r\n }\r\n if (this.changeFields.size > 0) {\r\n this.rowState = new RowState(RowStateEnum.Modified)\r\n } else {\r\n this.rowState = new RowState(RowStateEnum.Unchanged)\r\n }\r\n }\r\n }\r\n\r\n getCollection(): string {\r\n return this.collection\r\n }\r\n setCollection(collection:string) {\r\n this.collection = collection\r\n }\r\n getChangeFields(): readonly string[] {\r\n return Array.from(this.changeFields);\r\n }\r\n getSnapshotChangeFields(): readonly string[] {\r\n return Array.from(this.changeFields).map(field =>\r\n field.replace(\"index\", \"RowNum\")\r\n );\r\n }\r\n changeCell(\r\n columnId: ColumnId,\r\n value: unknown\r\n ): CellChanged | null {\r\n const cell = this.getCell(columnId.value);\r\n if (!cell) return null;\r\n return cell.changeValue(value);\r\n }\r\n saveDescription(\r\n flag: boolean,\r\n\r\n ): DescriptionSaved {\r\n this.isSaveDescription = flag\r\n return new DescriptionSaved( this.id,flag) \r\n }\r\n changeDisplay(\r\n columnId: ColumnId,\r\n value: unknown\r\n ): DisplayChanged | null {\r\n const cell = this.getCell(columnId.value);\r\n if (!cell) return null;\r\n return cell.changeDisplay(value);\r\n }\r\n getCells(): ReadonlyMap<string, Cell> {\r\n return new Map(this.cells);\r\n }\r\n\r\n /**\r\n * Return a cell without materializing from host `data` (PR-101).\r\n */\r\n peekCell(columnId: string): Cell | undefined {\r\n return this.cells.get(columnId);\r\n }\r\n\r\n /**\r\n * Lazy host cells (PR-101): when `rowData` left values on `data`, materialize\r\n * a Cell on first read and cache it.\r\n */\r\n getCell(columnId: string): Cell | undefined {\r\n const existing = this.cells.get(columnId);\r\n if (existing) return existing;\r\n if (!this.data || typeof this.data !== 'object') return undefined;\r\n if (columnId === 'index') return undefined;\r\n const record = this.data as Record<string, unknown>;\r\n if (!Object.prototype.hasOwnProperty.call(record, columnId)) {\r\n return undefined;\r\n }\r\n const value = record[columnId];\r\n const cell = new Cell(\r\n this.id,\r\n ColumnId.for(columnId),\r\n value,\r\n value,\r\n value,\r\n );\r\n this.cells.set(columnId, cell);\r\n return cell;\r\n }\r\n\r\n /**\r\n * Read a cell value without allocating a Cell when the host object still\r\n * holds the canonical value (PR-101 hot path for sort/filter/quick filter).\r\n */\r\n readValue(columnId: string): unknown {\r\n const existing = this.cells.get(columnId);\r\n if (existing) return existing.getValue();\r\n if (columnId === 'index') return undefined;\r\n if (this.data && typeof this.data === 'object') {\r\n const record = this.data as Record<string, unknown>;\r\n if (Object.prototype.hasOwnProperty.call(record, columnId)) {\r\n return record[columnId];\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n readDisplay(columnId: string): unknown {\r\n const existing = this.cells.get(columnId);\r\n if (existing) return existing.getDisplay();\r\n return this.readValue(columnId);\r\n }\r\n\r\n ensureCell(columnId: ColumnId, defaultValue: CellValue, displayValue: CellDisplay) {\r\n if (this.cells.has(columnId.value)) return;\r\n\r\n const newCell = new Cell(this.id, columnId, defaultValue, defaultValue, displayValue);\r\n this.cells.set(columnId.value, newCell);\r\n }\r\n setRowId(rowId: RowId) {\r\n this.id.set(rowId);\r\n }\r\n \r\n setVisibilityCondition(Condition: Record<string, boolean>) {\r\n this.visibilityCondition = Condition;\r\n }\r\n getVisibilityCondition(): Record<string, boolean> {\r\n return this.visibilityCondition\r\n }\r\n \r\n\r\n removeCell(columnId: ColumnId) {\r\n this.cells.delete(columnId.value);\r\n }\r\n\r\n\r\n setData(data: unknown): void {\r\n this.data = data;\r\n }\r\n\r\n getData(): unknown {\r\n return this.data;\r\n }\r\n\r\n clone(): Row {\r\n const clonedCells = new Map<string, Cell>();\r\n for (const [k, cell] of this.cells.entries()) {\r\n const clonedCell = cell.clone();\r\n clonedCells.set(k, clonedCell);\r\n }\r\n return new Row(\r\n this.id,\r\n clonedCells,\r\n this.rowState,\r\n this.changeFields,\r\n this.visibilityCondition,\r\n this.collection,\r\n this.isSaveDescription,\r\n this.data,\r\n this.sourceId,\r\n );\r\n }\r\n\r\n}\r\n","import type { ColumnSchema } from '../types/ColumnSchema';\r\nimport {\r\n CellChanged,\r\n ColumnReordered,\r\n DescriptionSaved,\r\n DisplayChanged,\r\n MinimumRowConstraintViolated,\r\n RowAdded,\r\n RowDeleted,\r\n RowRemoved,\r\n RowReordered,\r\n RowRestored,\r\n} from '../events';\r\nimport {\r\n CellDisplay,\r\n CellValue,\r\n ColumnId,\r\n KeyValue,\r\n Pagination,\r\n RowId,\r\n RowState,\r\n RowStateEnum,\r\n TableActions,\r\n} from '../value-objects';\r\nimport { Cell } from './Cell';\r\nimport { Collection } from './Collection';\r\nimport { Row } from './Row';\r\n\r\nexport type CollectionScope = 'active' | 'all' | string[];\r\n\r\nexport class Table {\r\n constructor(\r\n public readonly id: string,\r\n private collection: Map<string, Collection>,\r\n private pagination: Pagination,\r\n private action: TableActions,\r\n private activeCollection: string = 'default'\r\n ) { }\r\n\r\n /**\r\n * Page-window mode (persistence 'paged-idb'): the Collection row Maps hold\r\n * ONLY the current page; Pagination.totalRows is the source of truth for\r\n * totals. In the default mode the Maps hold every row and pagination slices.\r\n */\r\n private pageWindow = false;\r\n\r\n isPageWindow(): boolean {\r\n return this.pageWindow;\r\n }\r\n\r\n setPageWindow(enabled: boolean): this {\r\n this.pageWindow = enabled;\r\n return this;\r\n }\r\n\r\n // ─── Collection accessor helper ───────────────────────────────────────────\r\n\r\n private getActiveCollection(): Collection {\r\n const collection = this.collection.get(this.activeCollection);\r\n if (!collection) throw new Error(`Collection \"${this.activeCollection}\" not found`);\r\n return collection;\r\n }\r\n private getCollection(collectionName: string): Collection {\r\n const collection = this.collection.get(collectionName);\r\n if (!collection) throw new Error(`Collection \"${collectionName}\" not found`);\r\n return collection;\r\n }\r\n /** Finds which Collection currently owns a given column id (if any). */\r\n private findCollectionForColumn(columnKey: string): Collection | undefined {\r\n for (const col of this.collection.values()) {\r\n if (col.getColumns().has(columnKey)) return col;\r\n }\r\n return undefined;\r\n }\r\n\r\n getCollections(): Map<string, Collection> {\r\n return this.collection;\r\n }\r\n\r\n // ─── Column helpers ───────────────────────────────────────────────────────\r\n\r\n getColumnSchema(columnId: ColumnId): ColumnSchema | undefined {\r\n return this.getActiveCollection().getColumns().get(columnId.value);\r\n }\r\n\r\n getActiveCollectionName(): string {\r\n return this.activeCollection;\r\n }\r\n\r\n setActiveCollection(activeCollection: string): void {\r\n this.activeCollection = activeCollection;\r\n }\r\n\r\n getRowCollection(rowId: number): string | undefined {\r\n return this.getActiveCollection().getRows().get(rowId)?.getCollection();\r\n }\r\n\r\n setRowCollection(rowId: number, collection: string): void {\r\n this.getActiveCollection().getRows().get(rowId)?.setCollection(collection);\r\n }\r\n\r\n setColumnSchema(columnId: ColumnId, DetailColumnConfig: ColumnSchema): ColumnSchema | undefined {\r\n const prev = this.getActiveCollection().getColumns().get(columnId.value);\r\n this.getActiveCollection().getColumns().set(columnId.value, DetailColumnConfig);\r\n return prev;\r\n }\r\n\r\n getColumns(): ColumnSchema[] {\r\n return Array.from(this.getActiveCollection().getColumns().values());\r\n }\r\n getActiveCollectionColumns(): ColumnSchema[] {\r\n const allColumns = this.getActiveCollection().getColumns();\r\n return Array.from(allColumns.values()).sort(\r\n (a, b) => (a.order ?? 0) - (b.order ?? 0),\r\n );\r\n }\r\n\r\n getColumnsForCollectionScope(collectionScope: CollectionScope = 'active'): ColumnSchema[] {\r\n if (collectionScope === 'active') return this.getActiveCollectionColumns();\r\n\r\n const names = collectionScope === 'all' ? Array.from(this.collection.keys()) : collectionScope;\r\n const merged = new Map<string, ColumnSchema>();\r\n for (const name of names) {\r\n for (const [id, col] of this.getCollection(name).getColumns()) {\r\n merged.set(id, col);\r\n }\r\n }\r\n return Array.from(merged.values());\r\n }\r\n getColumnValues(colId: string): unknown[] {\r\n const result: unknown[] = [];\r\n for (const row of this.getActiveCollection().getRows().values()) {\r\n const cell = row.getCell(colId);\r\n if (!cell) continue;\r\n result.push(cell.getValue());\r\n }\r\n return result;\r\n }\r\n\r\n setColumns(newColumns: ColumnSchema[]): void {\r\n // Snapshot before clear — getColumns() returns the live Map reference.\r\n const existingByField = new Map(this.getActiveCollection().getColumns());\r\n for (const col of this.collection.values()) {\r\n col.getColumns().clear();\r\n }\r\n\r\n for (const col of newColumns) {\r\n const existing = existingByField.get(col.fieldName);\r\n const targetCollectionKey = col.fieldCollection ?? this.activeCollection;\r\n const updatedCol: ColumnSchema = {\r\n ...col,\r\n fieldCollection: targetCollectionKey,\r\n // Prefer explicit hidden from caller; otherwise keep persisted visibility.\r\n hidden: col.hidden ?? existing?.hidden ?? false,\r\n // PR-61: keep user/domain order across host schema refresh.\r\n order: existing?.order ?? col.order,\r\n };\r\n const targetCollection = this.collection.get(targetCollectionKey);\r\n if (targetCollection) {\r\n targetCollection.getColumns().set(col.fieldName, updatedCol);\r\n }\r\n }\r\n\r\n for (const row of this.getActiveCollection().getRows().values()) {\r\n for (const col of newColumns) {\r\n if (!row.getCells().has(col.fieldName)) {\r\n const defaultValue = col.fieldType === 'number' ? new CellValue(0) : new CellValue('');\r\n const defaultDisplay = col.fieldType === 'number' ? new CellValue(0) : new CellValue('');\r\n row.ensureCell(new ColumnId(col.fieldName), defaultValue, defaultDisplay);\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n // ─── Cell mutations ───────────────────────────────────────────────────────\r\n\r\n changeCell(rowId: RowId, columnId: ColumnId, value: unknown): CellChanged | null {\r\n const row = this.getActiveCollection().getRows().get(rowId.value);\r\n if (!row) return null;\r\n const ev = row.changeCell(columnId, value);\r\n if (ev) row.updateChangeFields(columnId);\r\n return ev;\r\n }\r\n\r\n changeDisplay(rowId: RowId, columnId: ColumnId, value: unknown): DisplayChanged | null {\r\n const row = this.getActiveCollection().getRows().get(rowId.value);\r\n if (!row) return null;\r\n return row.changeDisplay(columnId, value);\r\n }\r\n\r\n saveDescription(rowId: RowId, flag: boolean): DescriptionSaved | null {\r\n const row = this.getActiveCollection().getRows().get(rowId.value);\r\n if (!row) return null;\r\n return row.saveDescription(flag);\r\n }\r\n\r\n // ─── Row operations ───────────────────────────────────────────────────────\r\n\r\n duplicateRow(rowId: RowId): RowAdded {\r\n const col = this.getActiveCollection();\r\n const target = col.getRows().get(rowId.value);\r\n if (!target) throw new Error('Row not found');\r\n\r\n const rowsArray = Array.from(col.getRows().values());\r\n const targetIndex = rowsArray.findIndex(r => r.id.value === rowId.value);\r\n const nextRow = targetIndex < rowsArray.length - 1 ? rowsArray[targetIndex + 1] : undefined;\r\n\r\n const targetIndexValue = target.getCell('index')?.getValue() as number;\r\n let x: number;\r\n if (!nextRow) {\r\n x = targetIndexValue + 1;\r\n } else {\r\n const nextIndexValue = nextRow.getCell('index')?.getValue() as number;\r\n x = (targetIndexValue + nextIndexValue) / 2;\r\n }\r\n\r\n const newRowId = new RowId(Math.floor((1 + Math.random()) * 0x10000000000000000));\r\n const newCells = new Map<string, Cell>();\r\n const newIndex = new CellValue(x);\r\n const newDisplay = new CellDisplay(x);\r\n\r\n for (const [colId, cell] of target.getCells().entries()) {\r\n if (colId === 'index') {\r\n newCells.set(colId, new Cell(newRowId, new ColumnId(colId), newIndex, newIndex, newDisplay));\r\n } else {\r\n newCells.set(\r\n colId,\r\n new Cell(\r\n newRowId,\r\n new ColumnId(colId),\r\n cell.getValueObject(),\r\n cell.getValueObject(),\r\n cell.getDisplayObject(),\r\n )\r\n );\r\n }\r\n }\r\n\r\n const newRow = new Row(\r\n newRowId,\r\n newCells,\r\n new RowState(RowStateEnum.Added),\r\n new Set(),\r\n target.visibilityCondition,\r\n target.collection,\r\n target.isSaveDescription\r\n );\r\n\r\n rowsArray.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 rowsArray.splice(targetIndex + 1, 0, newRow);\r\n col.setRows(new Map(rowsArray.map(r => [r.id.value, r])));\r\n\r\n return new RowAdded(newRowId);\r\n }\r\n\r\n addRow(targetRowId: number, placedRowId?: number): RowAdded {\r\n const col = this.getActiveCollection();\r\n const target = col.getRows().get(targetRowId);\r\n if (!target) throw new Error('Row not found');\r\n\r\n const rowsArray = Array.from(col.getRows().values()).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 let placeIndex: number | undefined;\r\n let x = 0;\r\n\r\n if (placedRowId !== undefined) {\r\n placeIndex = rowsArray.findIndex(r => r.id.value === placedRowId);\r\n const placedRow = rowsArray[placeIndex];\r\n const placeIndexValue = placedRow?.getCell('index')?.getValue() as number;\r\n const nextRow = placeIndex < rowsArray.length - 1 ? rowsArray[placeIndex + 1] : undefined;\r\n if (nextRow) {\r\n const nextIndexValue = nextRow.getCell('index')?.getValue() as number;\r\n x = (placeIndexValue + nextIndexValue) / 2;\r\n } else {\r\n x = placeIndexValue + 1;\r\n }\r\n } else {\r\n const lastRowIndexValue = rowsArray[rowsArray.length - 1].getCell('index')?.getValue() as number;\r\n x = lastRowIndexValue + 1;\r\n }\r\n\r\n const newRowId = new RowId(Math.floor((1 + Math.random()) * 0x10000000000000000));\r\n const newCells = new Map<string, Cell>();\r\n const newIndex = new CellValue(x);\r\n const newDisplay = new CellDisplay(x);\r\n\r\n for (const [colId, cell] of target.getCells().entries()) {\r\n\r\n if (colId === \"index\") {\r\n newCells.set(\"index\", new Cell(newRowId, new ColumnId(\"index\"), newIndex, newIndex, newDisplay));\r\n } else {\r\n newCells.set(\r\n colId,\r\n new Cell(\r\n newRowId,\r\n new ColumnId(colId),\r\n cell.getValueObject(),\r\n cell.getValueObject(),\r\n cell.getDisplayObject(),\r\n )\r\n );\r\n }\r\n }\r\n\r\n const newRow = new Row(\r\n newRowId,\r\n newCells,\r\n new RowState(RowStateEnum.Added),\r\n new Set(),\r\n target.visibilityCondition,\r\n target.collection,\r\n target.isSaveDescription\r\n );\r\n\r\n rowsArray.splice((placeIndex ?? 0) + 1, 0, newRow);\r\n col.setRows(new Map<number, Row>(rowsArray.map(r => [r.id.value, r])));\r\n\r\n return new RowAdded(newRowId);\r\n }\r\n\r\n addNewRow(data?: KeyValue[], nextIndex?: number): RowAdded {\r\n const col = this.getActiveCollection();\r\n const newRowId = new RowId(Math.floor((1 + Math.random()) * 0x10000000000000000));\r\n const rowId = new RowId(newRowId.value);\r\n const cells = new Map<string, Cell>();\r\n\r\n const dataMap = data ? new Map(data.map(kv => [kv.key, kv])) : undefined;\r\n\r\n // getColumns() already returns the active collection columns.\r\n // Do not filter by fieldCollection === activeCollection: after reload /\r\n // setColumns, fieldCollection may be undefined and the filter would\r\n // create a row with zero cells (breaks validation + action clicks).\r\n this.getColumns().forEach(column => {\r\n const columnId = column.fieldName;\r\n let value: unknown = null;\r\n let display: unknown = null;\r\n if (columnId === \"index\") {\r\n if (nextIndex != null) {\r\n value = nextIndex;\r\n display = value;\r\n } else {\r\n const rows = Array.from(col.getRows().values());\r\n\r\n const maxIndex = rows.length\r\n ? Math.max(\r\n ...rows.map(r =>\r\n Number(r.getCell(\"index\")?.getValue() ?? 0)\r\n )\r\n )\r\n : 0;\r\n\r\n value = maxIndex + 1;\r\n display = value;\r\n }\r\n } else if (dataMap?.has(columnId)) {\r\n const item = dataMap.get(columnId);\r\n value = item?.value;\r\n display = item?.display;\r\n }\r\n\r\n const cellValue = new CellValue(value);\r\n const cellDisplay = new CellValue(display);\r\n cells.set(columnId, new Cell(rowId, new ColumnId(columnId), cellValue, cellValue, cellDisplay));\r\n });\r\n\r\n const newRow = new Row(\r\n newRowId,\r\n cells,\r\n new RowState(RowStateEnum.Added),\r\n new Set(),\r\n {} as Record<string, boolean>,\r\n this.activeCollection,\r\n false\r\n );\r\n\r\n col.getRows().set(newRowId.value, newRow);\r\n\r\n if (this.pageWindow) {\r\n // totalRows lives in Pagination (IndexedDB meta), not Map.size of the page window\r\n const totalRows = this.pagination.totalRows + 1;\r\n const lastPage = Math.max(1, Math.ceil(totalRows / this.pagination.pageSize));\r\n this.pagination = new Pagination(lastPage, this.pagination.pageSize, totalRows);\r\n } else {\r\n const totalRows = col.getRows().size;\r\n const lastPage = Math.ceil(totalRows / this.pagination.pageSize);\r\n this.changePage(lastPage);\r\n }\r\n\r\n return new RowAdded(newRowId);\r\n }\r\n\r\n addNewRows(cmd: { rows: KeyValue[][]; detailFieldKey: string }): RowAdded[] {\r\n const events: RowAdded[] = [];\r\n const existingValues = new Set(\r\n this.getRows().map(r => r.getCell(cmd.detailFieldKey)?.getValue())\r\n );\r\n\r\n for (const data of cmd.rows) {\r\n const incomingValue = data.find(kv => kv.key === cmd.detailFieldKey)?.value;\r\n if (incomingValue !== undefined && !existingValues.has(incomingValue)) {\r\n events.push(this.addNewRow(data));\r\n existingValues.add(incomingValue);\r\n }\r\n }\r\n return events;\r\n }\r\n\r\n addColumns(newColumns: ColumnSchema[]): { added: ColumnId[] } {\r\n const added: ColumnId[] = [];\r\n const allColumns = this.getActiveCollection().getColumns();\r\n for (const incoming of newColumns) {\r\n const key = incoming.fieldName;\r\n const existing = allColumns.get(key);\r\n const targetCollectionKey = incoming.fieldCollection ?? this.activeCollection;\r\n const targetCollection = this.collection.get(targetCollectionKey);\r\n if (!targetCollection) continue;\r\n if (existing) {\r\n const shouldUnhide = existing.hidden === true;\r\n targetCollection.getColumns().set(key, {\r\n ...existing,\r\n editable: incoming.editable ?? existing.editable,\r\n hidden: shouldUnhide ? false : existing.hidden,\r\n });\r\n if (shouldUnhide) added.push(new ColumnId(incoming.fieldName));\r\n continue;\r\n }\r\n targetCollection.getColumns().set(key, {\r\n ...incoming,\r\n fieldCollection: targetCollectionKey,\r\n hidden: incoming.hidden ?? false,\r\n });\r\n added.push(new ColumnId(incoming.fieldName));\r\n\r\n for (const row of this.getActiveCollection().getRows().values()) {\r\n const defaultValue =\r\n incoming.fieldType === 'number' ? new CellValue(0) : new CellValue('');\r\n const defaultDisplay =\r\n incoming.fieldType === 'number' ? new CellValue(0) : new CellValue('');\r\n row.ensureCell(new ColumnId(incoming.fieldName), defaultValue, defaultDisplay);\r\n }\r\n }\r\n\r\n return { added };\r\n }\r\n\r\n setColumnHidden(columnId: string, hidden: boolean): boolean {\r\n const cols = this.getActiveCollection().getColumns();\r\n const existing = cols.get(columnId);\r\n if (!existing) return false;\r\n if (Boolean(existing.hidden) === hidden) return false;\r\n cols.set(columnId, { ...existing, hidden });\r\n return true;\r\n }\r\n\r\n /** Runtime pin on `columnDef.pinned` (PR-114). Index column is not mutable. */\r\n setColumnPinned(columnId: string, pinned: 'start' | 'end' | null): boolean {\r\n const cols = this.getActiveCollection().getColumns();\r\n const existing = cols.get(columnId);\r\n if (!existing) return false;\r\n const bridge = { ...(existing.columnDef ?? {}) };\r\n if (pinned == null) delete bridge.pinned;\r\n else bridge.pinned = pinned;\r\n const nextPinned = bridge.pinned ?? null;\r\n const prevPinned = existing.columnDef?.pinned ?? null;\r\n if (nextPinned === prevPinned) return false;\r\n cols.set(columnId, { ...existing, columnDef: bridge });\r\n return true;\r\n }\r\n\r\n removeColumns(columnIds: ColumnId[]): { removed: ColumnId[] } {\r\n const removed: ColumnId[] = [];\r\n for (const colId of columnIds) {\r\n const ownerCollection = this.findCollectionForColumn(colId.value);\r\n if (!ownerCollection) continue;\r\n const schema = ownerCollection.getColumns().get(colId.value);\r\n if (!schema || schema.hidden) continue;\r\n ownerCollection.getColumns().set(colId.value, { ...schema, hidden: true });\r\n removed.push(colId);\r\n }\r\n return { removed };\r\n }\r\n\r\n // ─── Row reads ────────────────────────────────────────────────────────────\r\n\r\n\r\n getRows(collectionScope: CollectionScope = 'active'): Row[] {\r\n if (collectionScope === 'all') {\r\n const rows: Row[] = [];\r\n for (const col of this.collection.values()) {\r\n rows.push(...col.getRows().values());\r\n }\r\n return rows;\r\n }\r\n\r\n if (Array.isArray(collectionScope)) {\r\n const rows: Row[] = [];\r\n for (const name of collectionScope) {\r\n const collection = this.getCollection(name);\r\n rows.push(...collection.getRows().values());\r\n }\r\n return rows;\r\n }\r\n\r\n return Array.from(this.getActiveCollection().getRows().values());\r\n }\r\n getCollectionsRows(collections: string[]): Row[] {\r\n const rows: Row[] = [];\r\n for (const name of collections) {\r\n const collection = this.getCollection(name);\r\n rows.push(...collection.getRows().values());\r\n }\r\n return rows;\r\n }\r\n\r\n getRow(rowId: number): Row | undefined {\r\n return this.getActiveCollection().getRows().get(rowId);\r\n }\r\n\r\n /** Host `rowData` sync (PR-82) — put without going through add/undo. */\r\n hostPutRow(row: Row): void {\r\n this.getActiveCollection().getRows().set(row.id.value, row);\r\n }\r\n\r\n /** Host `rowData` sync (PR-82) — drop to match the host array. */\r\n hostRemoveRow(rowId: number): void {\r\n this.getActiveCollection().getRows().delete(rowId);\r\n }\r\n\r\n addRows(newRows: Row[]): void {\r\n const rows = this.getActiveCollection().getRows();\r\n newRows.forEach(r => rows.set(r.id.value, r));\r\n }\r\n\r\n // ─── Pagination ───────────────────────────────────────────────────────────\r\n\r\n getPagination(): Pagination {\r\n return this.pagination;\r\n }\r\n\r\n setPagination(pagination: Pagination): void {\r\n this.pagination = pagination;\r\n }\r\n\r\n changePage(page: number): void {\r\n this.pagination = this.pagination.changePage(page);\r\n }\r\n\r\n changePageSize(size: number): void {\r\n this.pagination = this.pagination.changePageSize(size).changePage(1);\r\n }\r\n\r\n /**\r\n * Rows currently held in RAM for the active collection.\r\n * With page-window storage the Collection Map already contains only the\r\n * current page — do not slice by pagination offsets.\r\n */\r\n getVisibleRows(): Row[] {\r\n const filteredRows = this.getRows().filter(r => r.collection === this.activeCollection);\r\n if (this.pageWindow) return filteredRows;\r\n const start = (this.pagination.page - 1) * this.pagination.pageSize;\r\n return filteredRows.slice(start, start + this.pagination.pageSize);\r\n }\r\n\r\n // ─── Actions ──────────────────────────────────────────────────────────────\r\n\r\n setTableAction(action: TableActions): void {\r\n this.action = action;\r\n }\r\n\r\n getTableAction(): TableActions {\r\n return this.action;\r\n }\r\n\r\n // ─── Delete / restore ─────────────────────────────────────────────────────\r\n\r\n /**\r\n * Re-inserts a previously Added row after hard-remove (undo of ADD → redo).\r\n * Preserves rowId and cell values; no-ops if the id already exists.\r\n */\r\n restoreAddedRow(params: {\r\n rowId: number;\r\n 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 collection?: string;\r\n isSaveDescription?: boolean;\r\n }): RowAdded {\r\n const col = this.getActiveCollection();\r\n const existing = col.getRows().get(params.rowId);\r\n if (existing) {\r\n return new RowAdded(existing.id);\r\n }\r\n\r\n const rowId = new RowId(params.rowId);\r\n const cells = new Map<string, Cell>();\r\n\r\n for (const [columnId, snap] of Object.entries(params.cells)) {\r\n const value = new CellValue(snap.value);\r\n const original = new CellValue(\r\n snap.originalValue !== undefined ? snap.originalValue : snap.value,\r\n );\r\n const display = new CellDisplay(\r\n snap.display !== undefined ? snap.display : snap.value,\r\n );\r\n cells.set(\r\n columnId,\r\n new Cell(rowId, new ColumnId(columnId), value, original, display),\r\n );\r\n }\r\n\r\n for (const column of this.getColumns()) {\r\n if (cells.has(column.fieldName)) continue;\r\n const empty = new CellValue(null);\r\n cells.set(\r\n column.fieldName,\r\n new Cell(\r\n rowId,\r\n new ColumnId(column.fieldName),\r\n empty,\r\n empty,\r\n new CellDisplay(null),\r\n ),\r\n );\r\n }\r\n\r\n const newRow = new Row(\r\n rowId,\r\n cells,\r\n new RowState(RowStateEnum.Added),\r\n new Set(),\r\n {} as Record<string, boolean>,\r\n params.collection ?? this.activeCollection,\r\n params.isSaveDescription ?? false,\r\n );\r\n\r\n col.getRows().set(rowId.value, newRow);\r\n return new RowAdded(rowId);\r\n }\r\n\r\n /**\r\n * Delete semantics:\r\n * - `Added` → hard-remove from the table (physically gone).\r\n * - `Deleted` → restore (قابل برگرداندن).\r\n * - otherwise (`Unchanged` / `Modified`) → soft-delete (`rowState = Deleted`).\r\n */\r\n deleteRow(\r\n rowId: RowId\r\n ): RowDeleted | RowRestored | RowRemoved | MinimumRowConstraintViolated | null {\r\n const col = this.getActiveCollection();\r\n const rows = col.getRows();\r\n const row = rows.get(rowId.value);\r\n if (!row) return null;\r\n\r\n // Added → complete removal\r\n if (row.rowState.value === RowStateEnum.Added) {\r\n if (rows.size === 1) {\r\n rows.delete(rowId.value);\r\n this.addNewRow();\r\n return new MinimumRowConstraintViolated(rowId);\r\n }\r\n rows.delete(rowId.value);\r\n return new RowRemoved(rowId);\r\n }\r\n\r\n // Already soft-deleted → restore\r\n if (row.rowState.value === RowStateEnum.Deleted) {\r\n const otherChanges = row\r\n .getChangeFields()\r\n .filter(field => field !== 'RowState');\r\n row.rowState = new RowState(\r\n otherChanges.length > 0 ? RowStateEnum.Modified : RowStateEnum.Unchanged,\r\n );\r\n row.updateChangeFields(new ColumnId('RowState'));\r\n return new RowRestored(rowId);\r\n }\r\n\r\n // Unchanged / Modified → soft-delete (قابل برگرداندن)\r\n row.rowState = new RowState(RowStateEnum.Deleted);\r\n row.updateChangeFields(new ColumnId('RowState'));\r\n return new RowDeleted(rowId);\r\n }\r\n // ─── Reorder ──────────────────────────────────────────────────────────────\r\n reorderRows(\r\n draggedRowNum: number,\r\n droppedRowNum: number,\r\n position: 'before' | 'after' = 'after'\r\n ): RowReordered {\r\n if (draggedRowNum === droppedRowNum) return new RowReordered(draggedRowNum, droppedRowNum);\r\n\r\n const col = this.getActiveCollection();\r\n const rowsArray = Array.from(col.getRows().values()).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 fromIndex = rowsArray.findIndex(r => r.id.value === draggedRowNum);\r\n const toIndex = rowsArray.findIndex(r => r.id.value === droppedRowNum);\r\n if (fromIndex === -1 || toIndex === -1)\r\n throw new Error(`Row ${draggedRowNum} or ${droppedRowNum} does not exist`);\r\n\r\n const [moved] = rowsArray.splice(fromIndex, 1);\r\n let insertIndex = toIndex;\r\n if (position === 'after') {\r\n insertIndex = toIndex + 1;\r\n if (fromIndex < toIndex) insertIndex -= 1;\r\n } else {\r\n if (fromIndex < toIndex) insertIndex -= 1;\r\n }\r\n\r\n let newIndex: number;\r\n if (insertIndex === 0) {\r\n newIndex = (rowsArray[0]?.getCell('index')?.getValue() as number) / 2;\r\n } else if (insertIndex >= rowsArray.length) {\r\n newIndex = (rowsArray[rowsArray.length - 1]?.getCell('index')?.getValue() as number) + 1;\r\n } else {\r\n const prevIndex = rowsArray[insertIndex - 1].getCell('index')?.getValue() as number;\r\n const nextIndex = rowsArray[insertIndex].getCell('index')?.getValue() as number;\r\n newIndex = (prevIndex + nextIndex) / 2;\r\n }\r\n\r\n moved.changeCell(new ColumnId('index'), newIndex);\r\n rowsArray.splice(insertIndex, 0, moved);\r\n col.setRows(new Map(rowsArray.map(r => [r.id.value, r])));\r\n moved.updateChangeFields(new ColumnId('index'));\r\n\r\n return new RowReordered(draggedRowNum, droppedRowNum);\r\n }\r\n\r\n reorderColumns(sourceIndex: number, destIndex: number): ColumnReordered {\r\n // Reorder in display order (same as getActiveCollectionColumns), then\r\n // rewrite `order` so a later host setColumns does not hide the move.\r\n const activeCollection = this.getActiveCollection();\r\n const colsMap = activeCollection.getColumns();\r\n const colsArray = Array.from(colsMap.values()).sort(\r\n (a, b) => (a.order ?? 0) - (b.order ?? 0),\r\n );\r\n const [moved] = colsArray.splice(sourceIndex, 1);\r\n if (!moved) {\r\n return new ColumnReordered(sourceIndex, destIndex);\r\n }\r\n colsArray.splice(destIndex, 0, moved);\r\n\r\n colsMap.clear();\r\n for (let i = 0; i < colsArray.length; i += 1) {\r\n const col = colsArray[i];\r\n if (!col) continue;\r\n colsMap.set(col.fieldName, { ...col, order: i });\r\n }\r\n\r\n return new ColumnReordered(sourceIndex, destIndex);\r\n }\r\n\r\n // ─── Clone ────────────────────────────────────────────────────────────────\r\n\r\n clone(): Table {\r\n const clonedCollection = new Map<string, Collection>();\r\n\r\n for (const [collectionName, col] of this.collection.entries()) {\r\n\r\n const clonedRows = new Map<number, Row>();\r\n\r\n for (const [k, row] of col.getRows().entries()) {\r\n clonedRows.set(k, row.clone());\r\n }\r\n\r\n clonedCollection.set(\r\n collectionName,\r\n new Collection(\r\n col.getCollectionName(),\r\n clonedRows,\r\n new Map(col.getColumns())\r\n )\r\n );\r\n }\r\n\r\n return new Table(\r\n this.id,\r\n clonedCollection,\r\n this.pagination,\r\n this.action,\r\n this.activeCollection\r\n ).setPageWindow(this.pageWindow);\r\n }\r\n}"]}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
// application/sync/resolveCellConflicts.ts
|
|
2
|
+
function resolveConflictChoice(conflict, policy) {
|
|
3
|
+
if (policy === "manual") return "unresolved";
|
|
4
|
+
if (policy === "serverWins") return "remote";
|
|
5
|
+
if (conflict.remote.version !== conflict.local.version) {
|
|
6
|
+
return conflict.remote.version > conflict.local.version ? "remote" : "local";
|
|
7
|
+
}
|
|
8
|
+
if (conflict.remote.occurredAt !== conflict.local.occurredAt) {
|
|
9
|
+
return conflict.remote.occurredAt > conflict.local.occurredAt ? "remote" : "local";
|
|
10
|
+
}
|
|
11
|
+
return "remote";
|
|
12
|
+
}
|
|
13
|
+
function cellKeyFromPayload(payload) {
|
|
14
|
+
if (!payload || typeof payload !== "object") return null;
|
|
15
|
+
const p = payload;
|
|
16
|
+
const columnId = p.columnId;
|
|
17
|
+
if (typeof columnId !== "string" || !columnId) return null;
|
|
18
|
+
const rowRaw = p.rowId;
|
|
19
|
+
const rowId = typeof rowRaw === "number" ? rowRaw : typeof rowRaw === "string" ? Number(rowRaw) : NaN;
|
|
20
|
+
if (!Number.isFinite(rowId)) return null;
|
|
21
|
+
return { rowId, columnId };
|
|
22
|
+
}
|
|
23
|
+
function cellKeyId(rowId, columnId) {
|
|
24
|
+
return `${rowId}:${columnId}`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// application/sync/GridSyncService.ts
|
|
28
|
+
function isCellChanged(event) {
|
|
29
|
+
return event.type === "CELL_CHANGED";
|
|
30
|
+
}
|
|
31
|
+
function toSide(event) {
|
|
32
|
+
const payload = event.payload;
|
|
33
|
+
return {
|
|
34
|
+
eventId: event.eventId,
|
|
35
|
+
value: payload?.newValue,
|
|
36
|
+
occurredAt: event.occurredAt,
|
|
37
|
+
version: event.version
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
var GridSyncService = class {
|
|
41
|
+
constructor(options) {
|
|
42
|
+
this.options = options;
|
|
43
|
+
this.openConflicts = [];
|
|
44
|
+
this.conflictListeners = /* @__PURE__ */ new Set();
|
|
45
|
+
/** Remote events waiting on manual resolution (by conflict id). */
|
|
46
|
+
this.deferredRemote = /* @__PURE__ */ new Map();
|
|
47
|
+
this.policy = options.policy ?? "lastWriteWins";
|
|
48
|
+
this.cursor = options.initialCursor ?? 0;
|
|
49
|
+
}
|
|
50
|
+
getPolicy() {
|
|
51
|
+
return this.policy;
|
|
52
|
+
}
|
|
53
|
+
setPolicy(policy) {
|
|
54
|
+
this.policy = policy;
|
|
55
|
+
}
|
|
56
|
+
getOpenConflicts() {
|
|
57
|
+
return this.openConflicts;
|
|
58
|
+
}
|
|
59
|
+
subscribeConflicts(listener) {
|
|
60
|
+
this.conflictListeners.add(listener);
|
|
61
|
+
listener(this.openConflicts);
|
|
62
|
+
return () => this.conflictListeners.delete(listener);
|
|
63
|
+
}
|
|
64
|
+
async sync() {
|
|
65
|
+
const pending = this.options.offlineStatus.getPendingChanges();
|
|
66
|
+
const pushable = pending.map((p) => p.event).filter(
|
|
67
|
+
(e) => Boolean(e) && e.tableId === this.options.tableId
|
|
68
|
+
);
|
|
69
|
+
const { acceptedIds } = await this.options.transport.push(pushable);
|
|
70
|
+
if (acceptedIds.length > 0) {
|
|
71
|
+
this.options.offlineStatus.markSynced([...acceptedIds]);
|
|
72
|
+
}
|
|
73
|
+
const localByCell = /* @__PURE__ */ new Map();
|
|
74
|
+
for (const event of pushable) {
|
|
75
|
+
if (!isCellChanged(event)) continue;
|
|
76
|
+
const key = cellKeyFromPayload(event.payload);
|
|
77
|
+
if (!key) continue;
|
|
78
|
+
localByCell.set(cellKeyId(key.rowId, key.columnId), event);
|
|
79
|
+
}
|
|
80
|
+
for (const event of this.options.offlineStatus.getPendingChanges().map((p) => p.event).filter((e) => Boolean(e))) {
|
|
81
|
+
if (!isCellChanged(event) || event.tableId !== this.options.tableId) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const key = cellKeyFromPayload(event.payload);
|
|
85
|
+
if (!key) continue;
|
|
86
|
+
localByCell.set(cellKeyId(key.rowId, key.columnId), event);
|
|
87
|
+
}
|
|
88
|
+
const pulled = await this.options.transport.pull(this.cursor);
|
|
89
|
+
this.cursor = pulled.cursor;
|
|
90
|
+
let applied = 0;
|
|
91
|
+
const conflicts = [];
|
|
92
|
+
for (const remote of pulled.events) {
|
|
93
|
+
if (remote.tableId !== this.options.tableId) continue;
|
|
94
|
+
if (!isCellChanged(remote)) {
|
|
95
|
+
await this.ingestRemote(remote);
|
|
96
|
+
applied += 1;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const key = cellKeyFromPayload(remote.payload);
|
|
100
|
+
if (!key) continue;
|
|
101
|
+
const id = cellKeyId(key.rowId, key.columnId);
|
|
102
|
+
const local = localByCell.get(id);
|
|
103
|
+
if (local && toSide(local).value !== toSide(remote).value) {
|
|
104
|
+
const conflict = {
|
|
105
|
+
id: `conflict:${id}:${remote.eventId}`,
|
|
106
|
+
key,
|
|
107
|
+
local: toSide(local),
|
|
108
|
+
remote: toSide(remote)
|
|
109
|
+
};
|
|
110
|
+
const choice = resolveConflictChoice(conflict, this.policy);
|
|
111
|
+
if (choice === "unresolved") {
|
|
112
|
+
conflicts.push(conflict);
|
|
113
|
+
this.deferredRemote.set(conflict.id, remote);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (choice === "remote") {
|
|
117
|
+
await this.applyRemoteCell(remote, key.rowId, key.columnId);
|
|
118
|
+
this.options.offlineStatus.markSynced([local.eventId]);
|
|
119
|
+
applied += 1;
|
|
120
|
+
} else {
|
|
121
|
+
await this.ingestRemote(remote);
|
|
122
|
+
}
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
await this.applyRemoteCell(remote, key.rowId, key.columnId);
|
|
126
|
+
applied += 1;
|
|
127
|
+
}
|
|
128
|
+
this.openConflicts = [
|
|
129
|
+
...this.openConflicts.filter((c) => this.deferredRemote.has(c.id)),
|
|
130
|
+
...conflicts
|
|
131
|
+
];
|
|
132
|
+
this.emitConflicts();
|
|
133
|
+
return {
|
|
134
|
+
pushed: acceptedIds.length,
|
|
135
|
+
pulled: pulled.events.length,
|
|
136
|
+
applied,
|
|
137
|
+
conflicts: this.openConflicts
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
async resolveConflict(conflictId, choice) {
|
|
141
|
+
const conflict = this.openConflicts.find((c) => c.id === conflictId);
|
|
142
|
+
const remote = this.deferredRemote.get(conflictId);
|
|
143
|
+
if (!conflict || !remote) return;
|
|
144
|
+
if (choice === "remote") {
|
|
145
|
+
await this.applyRemoteCell(
|
|
146
|
+
remote,
|
|
147
|
+
conflict.key.rowId,
|
|
148
|
+
conflict.key.columnId
|
|
149
|
+
);
|
|
150
|
+
this.options.offlineStatus.markSynced([conflict.local.eventId]);
|
|
151
|
+
} else {
|
|
152
|
+
await this.ingestRemote(remote);
|
|
153
|
+
}
|
|
154
|
+
this.deferredRemote.delete(conflictId);
|
|
155
|
+
this.openConflicts = this.openConflicts.filter((c) => c.id !== conflictId);
|
|
156
|
+
this.emitConflicts();
|
|
157
|
+
}
|
|
158
|
+
async applyRemoteCell(remote, rowId, columnId) {
|
|
159
|
+
await this.ingestRemote(remote);
|
|
160
|
+
const before = new Set(
|
|
161
|
+
this.options.offlineStatus.getPendingChanges().map((p) => p.eventId)
|
|
162
|
+
);
|
|
163
|
+
const value = remote.payload?.newValue;
|
|
164
|
+
await this.options.applyCellValue(rowId, columnId, value);
|
|
165
|
+
const created = this.options.offlineStatus.getPendingChanges().filter((p) => !before.has(p.eventId)).map((p) => p.eventId);
|
|
166
|
+
if (created.length > 0) {
|
|
167
|
+
this.options.offlineStatus.markSynced(created);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async ingestRemote(remote) {
|
|
171
|
+
const streamId = remote.streamId || `table:${remote.tableId}`;
|
|
172
|
+
const existing = await this.options.eventStore.read(streamId);
|
|
173
|
+
if (existing.some((e) => e.eventId === remote.eventId)) {
|
|
174
|
+
this.options.offlineStatus.markSynced([remote.eventId]);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
await this.options.eventStore.append(streamId, [remote], -1);
|
|
178
|
+
this.options.offlineStatus.markSynced([remote.eventId]);
|
|
179
|
+
}
|
|
180
|
+
emitConflicts() {
|
|
181
|
+
for (const listener of this.conflictListeners) {
|
|
182
|
+
listener(this.openConflicts);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
export { GridSyncService };
|
|
188
|
+
//# sourceMappingURL=chunk-633KP74Z.js.map
|
|
189
|
+
//# sourceMappingURL=chunk-633KP74Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../application/sync/resolveCellConflicts.ts","../application/sync/GridSyncService.ts"],"names":[],"mappings":"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","file":"chunk-633KP74Z.js","sourcesContent":["import type {\r\n SyncConflict,\r\n SyncConflictPolicy,\r\n ManualResolution,\r\n} from '../ports/SyncPort';\r\n\r\n/**\r\n * Pure conflict resolution (PR-138).\r\n * `manual` always returns unresolved so the UI can choose.\r\n */\r\nexport function resolveConflictChoice(\r\n conflict: SyncConflict,\r\n policy: SyncConflictPolicy,\r\n): ManualResolution | 'unresolved' {\r\n if (policy === 'manual') return 'unresolved';\r\n if (policy === 'serverWins') return 'remote';\r\n // lastWriteWins — tie-break on version then occurredAt\r\n if (conflict.remote.version !== conflict.local.version) {\r\n return conflict.remote.version > conflict.local.version\r\n ? 'remote'\r\n : 'local';\r\n }\r\n if (conflict.remote.occurredAt !== conflict.local.occurredAt) {\r\n return conflict.remote.occurredAt > conflict.local.occurredAt\r\n ? 'remote'\r\n : 'local';\r\n }\r\n return 'remote';\r\n}\r\n\r\nexport function cellKeyFromPayload(\r\n payload: unknown,\r\n): { rowId: number; columnId: string } | null {\r\n if (!payload || typeof payload !== 'object') return null;\r\n const p = payload as Record<string, unknown>;\r\n const columnId = p.columnId;\r\n if (typeof columnId !== 'string' || !columnId) return null;\r\n const rowRaw = p.rowId;\r\n const rowId =\r\n typeof rowRaw === 'number'\r\n ? rowRaw\r\n : typeof rowRaw === 'string'\r\n ? Number(rowRaw)\r\n : NaN;\r\n if (!Number.isFinite(rowId)) return null;\r\n return { rowId, columnId };\r\n}\r\n\r\nexport function cellKeyId(rowId: number, columnId: string): string {\r\n return `${rowId}:${columnId}`;\r\n}\r\n","import type { EventStore } from '../ports/EventStore';\r\nimport type { GridEvent } from '../../domain/types/GridEvent';\r\nimport type { OfflineStatus } from '../offline/OfflineStatus';\r\nimport type {\r\n ManualResolution,\r\n SyncConflict,\r\n SyncConflictPolicy,\r\n SyncPort,\r\n SyncResult,\r\n SyncTransport,\r\n} from '../ports/SyncPort';\r\nimport {\r\n cellKeyFromPayload,\r\n cellKeyId,\r\n resolveConflictChoice,\r\n} from './resolveCellConflicts';\r\n\r\nexport type GridSyncServiceOptions = {\r\n readonly tableId: string;\r\n readonly eventStore: EventStore;\r\n readonly offlineStatus: OfflineStatus;\r\n readonly transport: SyncTransport;\r\n /** Apply a winning remote CELL_CHANGED into the local domain. */\r\n readonly applyCellValue: (\r\n rowId: number,\r\n columnId: string,\r\n value: unknown,\r\n ) => Promise<void>;\r\n /** Initial pull cursor (default 0). */\r\n readonly initialCursor?: number;\r\n readonly policy?: SyncConflictPolicy;\r\n};\r\n\r\nfunction isCellChanged(event: GridEvent): boolean {\r\n return event.type === 'CELL_CHANGED';\r\n}\r\n\r\nfunction toSide(event: GridEvent): SyncConflict['local'] {\r\n const payload = event.payload as { newValue?: unknown };\r\n return {\r\n eventId: event.eventId,\r\n value: payload?.newValue,\r\n occurredAt: event.occurredAt,\r\n version: event.version,\r\n };\r\n}\r\n\r\n/**\r\n * SyncPort implementation over EventStore + OfflineStatus + SyncTransport (PR-138).\r\n */\r\nexport class GridSyncService implements SyncPort {\r\n private policy: SyncConflictPolicy;\r\n private cursor: number;\r\n private openConflicts: SyncConflict[] = [];\r\n private readonly conflictListeners = new Set<\r\n (conflicts: readonly SyncConflict[]) => void\r\n >();\r\n /** Remote events waiting on manual resolution (by conflict id). */\r\n private readonly deferredRemote = new Map<string, GridEvent>();\r\n\r\n constructor(private readonly options: GridSyncServiceOptions) {\r\n this.policy = options.policy ?? 'lastWriteWins';\r\n this.cursor = options.initialCursor ?? 0;\r\n }\r\n\r\n getPolicy(): SyncConflictPolicy {\r\n return this.policy;\r\n }\r\n\r\n setPolicy(policy: SyncConflictPolicy): void {\r\n this.policy = policy;\r\n }\r\n\r\n getOpenConflicts(): readonly SyncConflict[] {\r\n return this.openConflicts;\r\n }\r\n\r\n subscribeConflicts(\r\n listener: (conflicts: readonly SyncConflict[]) => void,\r\n ): () => void {\r\n this.conflictListeners.add(listener);\r\n listener(this.openConflicts);\r\n return () => this.conflictListeners.delete(listener);\r\n }\r\n\r\n async sync(): Promise<SyncResult> {\r\n const pending = this.options.offlineStatus.getPendingChanges();\r\n const pushable = pending\r\n .map((p) => p.event)\r\n .filter(\r\n (e): e is GridEvent =>\r\n Boolean(e) && e.tableId === this.options.tableId,\r\n );\r\n\r\n const { acceptedIds } = await this.options.transport.push(pushable);\r\n if (acceptedIds.length > 0) {\r\n this.options.offlineStatus.markSynced([...acceptedIds]);\r\n }\r\n\r\n // Locals just pushed (or still pending) — used to detect cell conflicts on pull.\r\n const localByCell = new Map<string, GridEvent>();\r\n for (const event of pushable) {\r\n if (!isCellChanged(event)) continue;\r\n const key = cellKeyFromPayload(event.payload);\r\n if (!key) continue;\r\n localByCell.set(cellKeyId(key.rowId, key.columnId), event);\r\n }\r\n for (const event of this.options.offlineStatus\r\n .getPendingChanges()\r\n .map((p) => p.event)\r\n .filter((e): e is GridEvent => Boolean(e))) {\r\n if (!isCellChanged(event) || event.tableId !== this.options.tableId) {\r\n continue;\r\n }\r\n const key = cellKeyFromPayload(event.payload);\r\n if (!key) continue;\r\n localByCell.set(cellKeyId(key.rowId, key.columnId), event);\r\n }\r\n\r\n const pulled = await this.options.transport.pull(this.cursor);\r\n this.cursor = pulled.cursor;\r\n\r\n let applied = 0;\r\n const conflicts: SyncConflict[] = [];\r\n\r\n for (const remote of pulled.events) {\r\n if (remote.tableId !== this.options.tableId) continue;\r\n if (!isCellChanged(remote)) {\r\n await this.ingestRemote(remote);\r\n applied += 1;\r\n continue;\r\n }\r\n const key = cellKeyFromPayload(remote.payload);\r\n if (!key) continue;\r\n const id = cellKeyId(key.rowId, key.columnId);\r\n const local = localByCell.get(id);\r\n if (local && toSide(local).value !== toSide(remote).value) {\r\n const conflict: SyncConflict = {\r\n id: `conflict:${id}:${remote.eventId}`,\r\n key,\r\n local: toSide(local),\r\n remote: toSide(remote),\r\n };\r\n const choice = resolveConflictChoice(conflict, this.policy);\r\n if (choice === 'unresolved') {\r\n conflicts.push(conflict);\r\n this.deferredRemote.set(conflict.id, remote);\r\n continue;\r\n }\r\n if (choice === 'remote') {\r\n await this.applyRemoteCell(remote, key.rowId, key.columnId);\r\n this.options.offlineStatus.markSynced([local.eventId]);\r\n applied += 1;\r\n } else {\r\n // Keep local — acknowledge remote without applying its value\r\n await this.ingestRemote(remote);\r\n }\r\n continue;\r\n }\r\n await this.applyRemoteCell(remote, key.rowId, key.columnId);\r\n applied += 1;\r\n }\r\n\r\n this.openConflicts = [\r\n ...this.openConflicts.filter((c) => this.deferredRemote.has(c.id)),\r\n ...conflicts,\r\n ];\r\n this.emitConflicts();\r\n\r\n return {\r\n pushed: acceptedIds.length,\r\n pulled: pulled.events.length,\r\n applied,\r\n conflicts: this.openConflicts,\r\n };\r\n }\r\n\r\n async resolveConflict(\r\n conflictId: string,\r\n choice: ManualResolution,\r\n ): Promise<void> {\r\n const conflict = this.openConflicts.find((c) => c.id === conflictId);\r\n const remote = this.deferredRemote.get(conflictId);\r\n if (!conflict || !remote) return;\r\n\r\n if (choice === 'remote') {\r\n await this.applyRemoteCell(\r\n remote,\r\n conflict.key.rowId,\r\n conflict.key.columnId,\r\n );\r\n this.options.offlineStatus.markSynced([conflict.local.eventId]);\r\n } else {\r\n await this.ingestRemote(remote);\r\n }\r\n\r\n this.deferredRemote.delete(conflictId);\r\n this.openConflicts = this.openConflicts.filter((c) => c.id !== conflictId);\r\n this.emitConflicts();\r\n }\r\n\r\n private async applyRemoteCell(\r\n remote: GridEvent,\r\n rowId: number,\r\n columnId: string,\r\n ): Promise<void> {\r\n await this.ingestRemote(remote);\r\n const before = new Set(\r\n this.options.offlineStatus.getPendingChanges().map((p) => p.eventId),\r\n );\r\n const value = (remote.payload as { newValue?: unknown })?.newValue;\r\n await this.options.applyCellValue(rowId, columnId, value);\r\n // CHANGE_CELL_VALUE may dual-write a new local event — treat as synced.\r\n const created = this.options.offlineStatus\r\n .getPendingChanges()\r\n .filter((p) => !before.has(p.eventId))\r\n .map((p) => p.eventId);\r\n if (created.length > 0) {\r\n this.options.offlineStatus.markSynced(created);\r\n }\r\n }\r\n\r\n private async ingestRemote(remote: GridEvent): Promise<void> {\r\n const streamId = remote.streamId || `table:${remote.tableId}`;\r\n const existing = await this.options.eventStore.read(streamId);\r\n if (existing.some((e) => e.eventId === remote.eventId)) {\r\n this.options.offlineStatus.markSynced([remote.eventId]);\r\n return;\r\n }\r\n await this.options.eventStore.append(streamId, [remote], -1);\r\n // Remote ingest must not look like a local pending mutation.\r\n this.options.offlineStatus.markSynced([remote.eventId]);\r\n }\r\n\r\n private emitConflicts(): void {\r\n for (const listener of this.conflictListeners) {\r\n listener(this.openConflicts);\r\n }\r\n }\r\n}\r\n"]}
|