persian-data-grid 0.5.0 → 0.7.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-E5Q6FYDS.js +125 -0
- package/dist/ERPTableGroupRow-E5Q6FYDS.js.map +1 -0
- package/dist/ERPTableGroupRow-F2IPDYL5.cjs +131 -0
- package/dist/ERPTableGroupRow-F2IPDYL5.cjs.map +1 -0
- package/dist/GridPlugin-Bewn0X51.d.ts +57 -0
- package/dist/GridPlugin-DewWufGZ.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-CeIfVFck.d.ts +2625 -0
- package/dist/GridSession-CmQn2RnL.d.cts +2625 -0
- package/dist/GridSyncService-3JQLEY65.cjs +12 -0
- package/dist/GridSyncService-3JQLEY65.cjs.map +1 -0
- package/dist/GridSyncService-GECXGEKL.js +3 -0
- package/dist/GridSyncService-GECXGEKL.js.map +1 -0
- package/dist/PdfRenderer-B9FJaCo_.d.cts +22 -0
- package/dist/PdfRenderer-bN7ca_Aj.d.ts +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-C71LXBiX.d.ts +678 -0
- package/dist/UITableController-CIwnHIw8.d.cts +678 -0
- package/dist/VazirmatnPdfRenderer-CpCqA-Wh.d.cts +96 -0
- package/dist/VazirmatnPdfRenderer-D46smncn.d.ts +96 -0
- package/dist/adapters/arian-erp.cjs +89 -0
- package/dist/adapters/arian-erp.cjs.map +1 -0
- package/dist/adapters/arian-erp.d.cts +62 -0
- package/dist/adapters/arian-erp.d.ts +62 -0
- package/dist/adapters/arian-erp.js +79 -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-C2fWYoPy.d.cts +135 -0
- package/dist/applyImportedRows-Cqh_N_0k.d.ts +135 -0
- package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs +86 -0
- package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs.map +1 -0
- package/dist/applyRowVisibilityHandler-ZLZXQEGY.js +84 -0
- package/dist/applyRowVisibilityHandler-ZLZXQEGY.js.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-BYLjmSI6.d.ts +51 -0
- package/dist/callbackRemoteApi-Cv26MmSD.d.cts +51 -0
- package/dist/cellRenderContext-BaNh4qn_.d.ts +42 -0
- package/dist/cellRenderContext-DvngkptV.d.cts +42 -0
- package/dist/chunk-27ALJSZP.js +12187 -0
- package/dist/chunk-27ALJSZP.js.map +1 -0
- package/dist/chunk-3HP3HQCW.cjs +688 -0
- package/dist/chunk-3HP3HQCW.cjs.map +1 -0
- package/dist/chunk-3Y3KKGEC.js +3 -0
- package/dist/chunk-3Y3KKGEC.js.map +1 -0
- package/dist/chunk-52LFOPXD.cjs +588 -0
- package/dist/chunk-52LFOPXD.cjs.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-72IVAOTK.cjs +38 -0
- package/dist/chunk-72IVAOTK.cjs.map +1 -0
- package/dist/chunk-77UXAJII.js +112 -0
- package/dist/chunk-77UXAJII.js.map +1 -0
- package/dist/chunk-7GWV5HGO.js +36 -0
- package/dist/chunk-7GWV5HGO.js.map +1 -0
- package/dist/chunk-7T6AWRPU.js +581 -0
- package/dist/chunk-7T6AWRPU.js.map +1 -0
- package/dist/chunk-AU3RDJYQ.js +243 -0
- package/dist/chunk-AU3RDJYQ.js.map +1 -0
- package/dist/chunk-CILNIWYW.cjs +100 -0
- package/dist/chunk-CILNIWYW.cjs.map +1 -0
- package/dist/chunk-CMQ4VLCW.cjs +840 -0
- package/dist/chunk-CMQ4VLCW.cjs.map +1 -0
- package/dist/chunk-DFFP7SJ6.cjs +257 -0
- package/dist/chunk-DFFP7SJ6.cjs.map +1 -0
- package/dist/chunk-E2J533UH.cjs +53 -0
- package/dist/chunk-E2J533UH.cjs.map +1 -0
- package/dist/chunk-EBV6HGZB.cjs +33 -0
- package/dist/chunk-EBV6HGZB.cjs.map +1 -0
- package/dist/chunk-F4PYOYHR.js +112 -0
- package/dist/chunk-F4PYOYHR.js.map +1 -0
- package/dist/chunk-F6EMC75A.cjs +34 -0
- package/dist/chunk-F6EMC75A.cjs.map +1 -0
- package/dist/chunk-GKE33FOJ.js +32 -0
- package/dist/chunk-GKE33FOJ.js.map +1 -0
- package/dist/chunk-GQEDLUMB.js +168 -0
- package/dist/chunk-GQEDLUMB.js.map +1 -0
- package/dist/chunk-HLOHWFOA.js +645 -0
- package/dist/chunk-HLOHWFOA.js.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-KCNTKYUY.js +206 -0
- package/dist/chunk-KCNTKYUY.js.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-LY27YAXE.cjs +208 -0
- package/dist/chunk-LY27YAXE.cjs.map +1 -0
- package/dist/chunk-MT3KLB2Q.cjs +944 -0
- package/dist/chunk-MT3KLB2Q.cjs.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-NB5GCGHL.js +833 -0
- package/dist/chunk-NB5GCGHL.js.map +1 -0
- package/dist/chunk-NQUVAJQA.js +298 -0
- package/dist/chunk-NQUVAJQA.js.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-Q7TBBUTX.cjs +110 -0
- package/dist/chunk-Q7TBBUTX.cjs.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-SVO62ZV2.js +50 -0
- package/dist/chunk-SVO62ZV2.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-VBAZ77Q4.js +932 -0
- package/dist/chunk-VBAZ77Q4.js.map +1 -0
- package/dist/chunk-VSAFQTW5.cjs +319 -0
- package/dist/chunk-VSAFQTW5.cjs.map +1 -0
- package/dist/chunk-VYJQ2HTA.cjs +936 -0
- package/dist/chunk-VYJQ2HTA.cjs.map +1 -0
- package/dist/chunk-W5256BJ4.js +56 -0
- package/dist/chunk-W5256BJ4.js.map +1 -0
- package/dist/chunk-WTHTVKVI.cjs +12299 -0
- package/dist/chunk-WTHTVKVI.cjs.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-Z4QPZ3Z3.cjs +114 -0
- package/dist/chunk-Z4QPZ3Z3.cjs.map +1 -0
- package/dist/createEngineGridQuery-BBkud5oE.d.ts +939 -0
- package/dist/createEngineGridQuery-D-fgO_jg.d.cts +939 -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 +508 -0
- package/dist/headless.d.ts +508 -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 +8060 -11409
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +457 -2305
- package/dist/index.d.ts +457 -2305
- package/dist/index.js +7302 -11084
- 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 +185 -29
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../packages/plugins/excel/src/ExcelExportPlugin.ts","../packages/plugins/excel/src/applyImportedRows.ts","../packages/plugins/excel/src/mapImportedSheet.ts","../packages/plugins/excel/src/parseXlsxBlob.ts","../packages/plugins/excel/src/ExcelImportPlugin.ts","../packages/plugins/excel/src/exportActiveCollectionToExcelStreaming.ts","../packages/plugins/excel/src/exportActiveCollectionToExcel.ts"],"names":["downloadBlob","hasMeaningfulValue"],"mappings":"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","file":"chunk-NB5GCGHL.js","sourcesContent":["import type {\r\n ExportRequestedPayload,\r\n GridEvent,\r\n} from '../../../../domain/types/GridEvent';\r\nimport type {\r\n GridPlugin,\r\n GridPluginContext,\r\n} from '../../../../application/plugins/GridPlugin';\r\nimport { buildExportTable } from './buildExportTable';\r\nimport { buildXlsxBlob, downloadBlob } from './buildXlsxBlob';\r\n\r\nexport type ExcelExportPluginOptions = {\r\n /** Skip browser download (useful in tests / Node). */\r\n download?: boolean;\r\n onBlob?: (blob: Blob, meta: { fileName: string; rowCount: number; columnCount: number }) => void;\r\n};\r\n\r\n/**\r\n * Subscribes to EXPORT_REQUESTED (format=xlsx); never mutates Domain.\r\n */\r\nexport class ExcelExportPlugin implements GridPlugin {\r\n readonly name = 'excel-export';\r\n private unsub: (() => void) | null = null;\r\n\r\n constructor(private readonly options: ExcelExportPluginOptions = {}) {}\r\n\r\n register(ctx: GridPluginContext): void {\r\n this.unsub = ctx.bus.subscribeAll((event) => {\r\n void this.onEvent(ctx, event);\r\n });\r\n }\r\n\r\n dispose(): void {\r\n this.unsub?.();\r\n this.unsub = null;\r\n }\r\n\r\n private async onEvent(\r\n ctx: GridPluginContext,\r\n event: GridEvent,\r\n ): Promise<void> {\r\n if (event.type !== 'EXPORT_REQUESTED') return;\r\n if (event.tableId !== ctx.tableId) return;\r\n\r\n const payload = event.payload as ExportRequestedPayload;\r\n if (payload.format !== 'xlsx') return;\r\n\r\n try {\r\n const source = ctx.query.getExportSource(payload.collectionScope ?? 'active');\r\n if (!source) {\r\n throw new Error('NO_EXPORT_SOURCE');\r\n }\r\n\r\n const table = buildExportTable(source);\r\n if (table.columns.length === 0 && table.rows.length === 0) {\r\n throw new Error('NO_COLUMNS');\r\n }\r\n\r\n const fileName =\r\n payload.fileName ??\r\n `export-${new Date().toISOString().slice(0, 10)}.xlsx`;\r\n\r\n const blob = buildXlsxBlob(table, {\r\n sheetName: payload.sheetName,\r\n direction: payload.direction ?? 'rtl',\r\n });\r\n\r\n const columnCount = table.columns.length + 1;\r\n const rowCount = table.rows.length;\r\n\r\n if (this.options.download !== false) {\r\n downloadBlob(blob, fileName);\r\n }\r\n this.options.onBlob?.(blob, { fileName, rowCount, columnCount });\r\n\r\n await ctx.bus.publish({\r\n eventId: `${Date.now()}-xlsx-ok`,\r\n type: 'XLSX_EXPORT_COMPLETED',\r\n tableId: ctx.tableId,\r\n streamId: `table/${ctx.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: event.actorId,\r\n correlationId: event.correlationId,\r\n causationId: event.eventId,\r\n payload: {\r\n format: 'xlsx' as const,\r\n rowCount,\r\n columnCount,\r\n },\r\n });\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n await ctx.bus.publish({\r\n eventId: `${Date.now()}-xlsx-fail`,\r\n type: 'XLSX_EXPORT_FAILED',\r\n tableId: ctx.tableId,\r\n streamId: `table/${ctx.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: event.actorId,\r\n correlationId: event.correlationId,\r\n causationId: event.eventId,\r\n payload: {\r\n format: 'xlsx' as const,\r\n code: message === 'NO_COLUMNS' || message === 'NO_EXPORT_SOURCE'\r\n ? message\r\n : 'EXPORT_FAILED',\r\n message,\r\n },\r\n });\r\n }\r\n }\r\n}\r\n","import type { GridSession } from '../../../../application/session/GridSession';\r\nimport type { ImportCellKv } from './mapImportedSheet';\r\n\r\nexport type ApplyImportedRowsResult = {\r\n rowCount: number;\r\n};\r\n\r\n/**\r\n * Applies imported cell matrices through the engine (ADD_NEW_ROWS) so\r\n * CachedTableRepository / IndexedDB persistence stays on the normal path.\r\n *\r\n * Uses a synthetic unique `index` token only for dedupe in Table.addNewRows;\r\n * addNewRow still auto-assigns the real index cell.\r\n */\r\nexport async function applyImportedRows(\r\n session: GridSession,\r\n rows: ImportCellKv[][],\r\n): Promise<ApplyImportedRowsResult> {\r\n if (rows.length === 0) {\r\n return { rowCount: 0 };\r\n }\r\n\r\n const stamp = Date.now();\r\n const engine = session.getEngine();\r\n const payload = rows.map((cells, i) => [\r\n {\r\n key: 'index',\r\n value: `import-${stamp}-${i}`,\r\n display: `import-${stamp}-${i}`,\r\n },\r\n ...cells.filter((c) => c.key !== 'index'),\r\n ]);\r\n\r\n await engine.dispatch({\r\n type: 'ADD_NEW_ROWS',\r\n store: session.store,\r\n tableKey: session.tableKey,\r\n detailFieldKey: 'index',\r\n rows: payload,\r\n autoActivate: false,\r\n });\r\n\r\n return { rowCount: rows.length };\r\n}\r\n","import type { ExportColumnDef } from '../../../../application/plugins/GridPlugin';\r\nimport type { ParsedXlsxSheet } from './parseXlsxBlob';\r\n\r\nexport type ImportCellKv = {\r\n key: string;\r\n value: unknown;\r\n display: unknown;\r\n};\r\n\r\nexport type MappedImportRows = {\r\n columns: Array<{ fieldName: string; fieldType?: string }>;\r\n /** One KeyValue[] per data row (no index column). */\r\n rows: ImportCellKv[][];\r\n};\r\n\r\nfunction normalizeHeader(h: string): string {\r\n return h.trim().toLowerCase().replace(/\\s+/g, ' ');\r\n}\r\n\r\nfunction coerceValue(raw: string, fieldType?: string): unknown {\r\n const text = raw.trim();\r\n if (text === '') return '';\r\n\r\n switch (fieldType) {\r\n case 'number':\r\n case 'price': {\r\n const n = Number(text.replace(/,/g, ''));\r\n return Number.isFinite(n) ? n : text;\r\n }\r\n case 'checkbox': {\r\n const lower = text.toLowerCase();\r\n if (['1', 'true', 'yes', '✔', 'y'].includes(lower)) return true;\r\n if (['0', 'false', 'no', '✘', 'n'].includes(lower)) return false;\r\n return text;\r\n }\r\n default:\r\n return text;\r\n }\r\n}\r\n\r\n/**\r\n * Maps sheet headers to export/query columns by caption or fieldName.\r\n * Skips index/static columns.\r\n */\r\nexport function mapImportedSheet(\r\n sheet: ParsedXlsxSheet,\r\n columns: readonly ExportColumnDef[],\r\n): MappedImportRows {\r\n const importable = columns.filter(\r\n (c) =>\r\n c.fieldName !== 'index' &&\r\n c.fieldType !== 'index' &&\r\n c.fieldType !== 'static',\r\n );\r\n\r\n const byCaption = new Map<string, ExportColumnDef>();\r\n const byField = new Map<string, ExportColumnDef>();\r\n for (const col of importable) {\r\n byField.set(normalizeHeader(col.fieldName), col);\r\n if (col.fieldCaption) {\r\n byCaption.set(normalizeHeader(col.fieldCaption), col);\r\n }\r\n }\r\n\r\n const mappedCols: Array<{ fieldName: string; fieldType?: string; colIndex: number }> =\r\n [];\r\n\r\n sheet.headers.forEach((header, colIndex) => {\r\n const key = normalizeHeader(header);\r\n if (!key) return;\r\n const col = byCaption.get(key) ?? byField.get(key);\r\n if (!col) return;\r\n if (mappedCols.some((m) => m.fieldName === col.fieldName)) return;\r\n mappedCols.push({\r\n fieldName: col.fieldName,\r\n fieldType: col.fieldType,\r\n colIndex,\r\n });\r\n });\r\n\r\n // If headers did not match, fall back to positional mapping of importable columns.\r\n if (mappedCols.length === 0 && sheet.headers.length > 0) {\r\n importable.forEach((col, i) => {\r\n if (i < sheet.headers.length) {\r\n mappedCols.push({\r\n fieldName: col.fieldName,\r\n fieldType: col.fieldType,\r\n colIndex: i,\r\n });\r\n }\r\n });\r\n }\r\n\r\n const rows: ImportCellKv[][] = sheet.rows.map((line) =>\r\n mappedCols.map((m) => {\r\n const raw = line[m.colIndex] ?? '';\r\n const value = coerceValue(raw, m.fieldType);\r\n return { key: m.fieldName, value, display: value };\r\n }),\r\n );\r\n\r\n return {\r\n columns: mappedCols.map(({ fieldName, fieldType }) => ({\r\n fieldName,\r\n fieldType,\r\n })),\r\n rows,\r\n };\r\n}\r\n","import { strFromU8, unzipSync } from 'fflate';\r\n\r\nexport type ParsedXlsxSheet = {\r\n /** First row cells (header captions / field names). */\r\n headers: string[];\r\n /** Body rows; each row length matches headers (padded with ''). */\r\n rows: string[][];\r\n};\r\n\r\nconst textDecoder = new TextDecoder('utf-8');\r\n\r\nfunction toUint8Array(data: Blob | ArrayBuffer | Uint8Array): Promise<Uint8Array> {\r\n if (data instanceof Uint8Array) return Promise.resolve(data);\r\n if (data instanceof ArrayBuffer) return Promise.resolve(new Uint8Array(data));\r\n return data.arrayBuffer().then((buf) => new Uint8Array(buf));\r\n}\r\n\r\nfunction decodeXml(bytes: Uint8Array): string {\r\n return strFromU8(bytes) || textDecoder.decode(bytes);\r\n}\r\n\r\n/** A1 / AA12 → 0-based column index */\r\nfunction colIndexFromRef(ref: string): number {\r\n const letters = ref.match(/^([A-Za-z]+)/)?.[1];\r\n if (!letters) return 0;\r\n let n = 0;\r\n for (const ch of letters.toUpperCase()) {\r\n n = n * 26 + (ch.charCodeAt(0) - 64);\r\n }\r\n return n - 1;\r\n}\r\n\r\nfunction parseSharedStrings(xml: string): string[] {\r\n const out: string[] = [];\r\n // <si>…<t>…</t>…</si> (may include rich text runs)\r\n const siRe = /<si\\b[^>]*>([\\s\\S]*?)<\\/si>/gi;\r\n let m: RegExpExecArray | null;\r\n while ((m = siRe.exec(xml))) {\r\n const inner = m[1];\r\n const parts: string[] = [];\r\n const tRe = /<t\\b[^>]*>([\\s\\S]*?)<\\/t>/gi;\r\n let tm: RegExpExecArray | null;\r\n while ((tm = tRe.exec(inner))) {\r\n parts.push(decodeXmlEntities(tm[1]));\r\n }\r\n out.push(parts.join(''));\r\n }\r\n return out;\r\n}\r\n\r\nfunction decodeXmlEntities(s: string): string {\r\n return s\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/"/g, '\"')\r\n .replace(/'/g, \"'\")\r\n .replace(/&/g, '&');\r\n}\r\n\r\nfunction findSheetPath(\r\n files: Record<string, Uint8Array>,\r\n sheetName?: string,\r\n): string {\r\n const preferred = 'xl/worksheets/sheet1.xml';\r\n if (!sheetName) {\r\n if (files[preferred]) return preferred;\r\n const first = Object.keys(files).find((k) =>\r\n /^xl\\/worksheets\\/sheet\\d+\\.xml$/i.test(k),\r\n );\r\n if (!first) throw new Error('NO_SHEET');\r\n return first;\r\n }\r\n\r\n const workbook = files['xl/workbook.xml'];\r\n if (!workbook) throw new Error('NO_WORKBOOK');\r\n const wbXml = decodeXml(workbook);\r\n const sheetRe =\r\n /<sheet\\b[^>]*name=\"([^\"]+)\"[^>]*r:id=\"([^\"]+)\"[^>]*\\/?>/gi;\r\n const nameToRid = new Map<string, string>();\r\n let sm: RegExpExecArray | null;\r\n while ((sm = sheetRe.exec(wbXml))) {\r\n nameToRid.set(sm[1], sm[2]);\r\n }\r\n const rid = nameToRid.get(sheetName);\r\n if (!rid) throw new Error('SHEET_NOT_FOUND');\r\n\r\n const rels = files['xl/_rels/workbook.xml.rels'];\r\n if (!rels) throw new Error('NO_RELS');\r\n const relsXml = decodeXml(rels);\r\n const relRe =\r\n /<Relationship\\b[^>]*Id=\"([^\"]+)\"[^>]*Target=\"([^\"]+)\"[^>]*\\/?>/gi;\r\n let rm: RegExpExecArray | null;\r\n while ((rm = relRe.exec(relsXml))) {\r\n if (rm[1] === rid) {\r\n const target = rm[2].replace(/^\\//, '');\r\n const path = target.startsWith('xl/') ? target : `xl/${target}`;\r\n if (!files[path]) throw new Error('NO_SHEET');\r\n return path;\r\n }\r\n }\r\n throw new Error('SHEET_NOT_FOUND');\r\n}\r\n\r\ntype CellVal = { col: number; text: string };\r\n\r\nfunction parseSheetRows(\r\n sheetXml: string,\r\n shared: string[],\r\n): { headers: string[]; rows: string[][] } {\r\n const rowRe = /<row\\b[^>]*>([\\s\\S]*?)<\\/row>/gi;\r\n const matrix: CellVal[][] = [];\r\n\r\n let rowMatch: RegExpExecArray | null;\r\n while ((rowMatch = rowRe.exec(sheetXml))) {\r\n const rowXml = rowMatch[1];\r\n const cells: CellVal[] = [];\r\n const cellRe = /<c\\b([^>]*)>([\\s\\S]*?)<\\/c>|<c\\b([^>]*)\\/>/gi;\r\n let cm: RegExpExecArray | null;\r\n while ((cm = cellRe.exec(rowXml))) {\r\n const attrs = cm[1] ?? cm[3] ?? '';\r\n const body = cm[2] ?? '';\r\n const ref = attrs.match(/\\br=\"([^\"]+)\"/)?.[1] ?? '';\r\n const t = attrs.match(/\\bt=\"([^\"]+)\"/)?.[1] ?? '';\r\n const col = colIndexFromRef(ref);\r\n\r\n let text = '';\r\n if (t === 'inlineStr') {\r\n const tm = body.match(/<t\\b[^>]*>([\\s\\S]*?)<\\/t>/i);\r\n text = tm ? decodeXmlEntities(tm[1]) : '';\r\n } else if (t === 's') {\r\n const vm = body.match(/<v\\b[^>]*>([\\s\\S]*?)<\\/v>/i);\r\n const idx = vm ? Number(vm[1]) : -1;\r\n text = idx >= 0 ? (shared[idx] ?? '') : '';\r\n } else {\r\n const vm = body.match(/<v\\b[^>]*>([\\s\\S]*?)<\\/v>/i);\r\n text = vm ? decodeXmlEntities(vm[1]) : '';\r\n }\r\n cells.push({ col, text });\r\n }\r\n matrix.push(cells);\r\n }\r\n\r\n if (matrix.length === 0) {\r\n return { headers: [], rows: [] };\r\n }\r\n\r\n const maxCol = Math.max(\r\n 0,\r\n ...matrix.flatMap((r) => r.map((c) => c.col)),\r\n );\r\n\r\n const dense = matrix.map((rowCells) => {\r\n const line = Array.from({ length: maxCol + 1 }, () => '');\r\n for (const c of rowCells) {\r\n if (c.col >= 0 && c.col <= maxCol) line[c.col] = c.text;\r\n }\r\n return line;\r\n });\r\n\r\n // Exported files put a row-number column in A; drop it when header looks like ردیف/Row/#.\r\n const header = dense[0] ?? [];\r\n const rowHeaderHints = new Set(['ردیف', 'row', '#', 'row · actions', 'row number']);\r\n const dropFirst =\r\n header.length > 1 &&\r\n rowHeaderHints.has(header[0].trim().toLowerCase());\r\n\r\n const slice = (line: string[]) => (dropFirst ? line.slice(1) : line);\r\n const headers = slice(header).map((h) => h.trim());\r\n const rows = dense\r\n .slice(1)\r\n .map(slice)\r\n .map((line) => {\r\n const padded = Array.from({ length: headers.length }, (_, i) => line[i] ?? '');\r\n return padded;\r\n })\r\n .filter((line) => line.some((c) => c.trim() !== ''));\r\n\r\n return { headers, rows };\r\n}\r\n\r\n/**\r\n * Parses a minimal OOXML .xlsx (store or deflate) into a string matrix.\r\n * Supports shared strings and inlineStr (as produced by buildXlsxBlob).\r\n */\r\nexport async function parseXlsxBlob(\r\n data: Blob | ArrayBuffer | Uint8Array,\r\n options?: { sheetName?: string },\r\n): Promise<ParsedXlsxSheet> {\r\n const bytes = await toUint8Array(data);\r\n let files: Record<string, Uint8Array>;\r\n try {\r\n files = unzipSync(bytes);\r\n } catch {\r\n throw new Error('INVALID_XLSX');\r\n }\r\n\r\n const sharedPath = Object.keys(files).find((k) =>\r\n /xl\\/sharedStrings\\.xml$/i.test(k),\r\n );\r\n const shared = sharedPath\r\n ? parseSharedStrings(decodeXml(files[sharedPath]))\r\n : [];\r\n\r\n const sheetPath = findSheetPath(files, options?.sheetName);\r\n return parseSheetRows(decodeXml(files[sheetPath]), shared);\r\n}\r\n","import type {\r\n GridEvent,\r\n ImportRequestedPayload,\r\n} from '../../../../domain/types/GridEvent';\r\nimport type {\r\n GridPlugin,\r\n GridPluginContext,\r\n} from '../../../../application/plugins/GridPlugin';\r\nimport { applyImportedRows } from './applyImportedRows';\r\nimport { mapImportedSheet } from './mapImportedSheet';\r\nimport { parseXlsxBlob } from './parseXlsxBlob';\r\n\r\nexport type ExcelImportPluginOptions = {\r\n onImported?: (meta: { rowCount: number; columnCount: number }) => void;\r\n};\r\n\r\n/**\r\n * Subscribes to IMPORT_REQUESTED (format=xlsx); mutates domain only via\r\n * session/engine commands (never touches Entity directly).\r\n */\r\nexport class ExcelImportPlugin implements GridPlugin {\r\n readonly name = 'excel-import';\r\n private unsub: (() => void) | null = null;\r\n\r\n constructor(private readonly options: ExcelImportPluginOptions = {}) {}\r\n\r\n register(ctx: GridPluginContext): void {\r\n this.unsub = ctx.bus.subscribeAll((event) => {\r\n void this.onEvent(ctx, event);\r\n });\r\n }\r\n\r\n dispose(): void {\r\n this.unsub?.();\r\n this.unsub = null;\r\n }\r\n\r\n private async onEvent(\r\n ctx: GridPluginContext,\r\n event: GridEvent,\r\n ): Promise<void> {\r\n if (event.type !== 'IMPORT_REQUESTED') return;\r\n if (event.tableId !== ctx.tableId) return;\r\n\r\n const payload = event.payload as ImportRequestedPayload;\r\n if (payload.format !== 'xlsx') return;\r\n\r\n try {\r\n const correlationId = event.correlationId;\r\n if (!correlationId) {\r\n throw new Error('NO_IMPORT_DATA');\r\n }\r\n const bytes = ctx.resolveImportData?.(correlationId);\r\n if (!bytes || bytes.byteLength === 0) {\r\n throw new Error('NO_IMPORT_DATA');\r\n }\r\n\r\n const source = ctx.query.getExportSource(payload.collectionScope ?? 'active');\r\n if (!source) {\r\n throw new Error('NO_IMPORT_TARGET');\r\n }\r\n\r\n const sheet = await parseXlsxBlob(bytes, {\r\n sheetName: payload.sheetName,\r\n });\r\n if (sheet.headers.length === 0) {\r\n throw new Error('NO_COLUMNS');\r\n }\r\n\r\n const mapped = mapImportedSheet(sheet, source.columns);\r\n if (mapped.columns.length === 0) {\r\n throw new Error('NO_COLUMN_MATCH');\r\n }\r\n\r\n const { rowCount } = await applyImportedRows(ctx.session, mapped.rows);\r\n const columnCount = mapped.columns.length;\r\n\r\n this.options.onImported?.({ rowCount, columnCount });\r\n\r\n await ctx.bus.publish({\r\n eventId: `${Date.now()}-xlsx-import-ok`,\r\n type: 'XLSX_IMPORT_COMPLETED',\r\n tableId: ctx.tableId,\r\n streamId: `table/${ctx.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: event.actorId,\r\n correlationId: event.correlationId,\r\n causationId: event.eventId,\r\n payload: {\r\n format: 'xlsx' as const,\r\n rowCount,\r\n columnCount,\r\n },\r\n });\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n const known = new Set([\r\n 'NO_IMPORT_DATA',\r\n 'NO_IMPORT_TARGET',\r\n 'NO_COLUMNS',\r\n 'NO_COLUMN_MATCH',\r\n 'INVALID_XLSX',\r\n 'NO_SHEET',\r\n 'SHEET_NOT_FOUND',\r\n ]);\r\n await ctx.bus.publish({\r\n eventId: `${Date.now()}-xlsx-import-fail`,\r\n type: 'XLSX_IMPORT_FAILED',\r\n tableId: ctx.tableId,\r\n streamId: `table/${ctx.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: event.actorId,\r\n correlationId: event.correlationId,\r\n causationId: event.eventId,\r\n payload: {\r\n format: 'xlsx' as const,\r\n code: known.has(message) ? message : 'IMPORT_FAILED',\r\n message,\r\n },\r\n });\r\n }\r\n }\r\n}\r\n","/**\r\n * Streaming xlsx export for page-window mode (persistence 'paged-idb').\r\n *\r\n * Memory Iron Rule: two cursor passes over IndexedDB (columns-with-data, then\r\n * chunk-by-chunk XML coalesced into Blobs) — the dataset is never in the heap.\r\n * Ported from the arianERP host table; used by `exportActiveCollectionToExcel`\r\n * when the controller is in paged mode.\r\n */\r\nimport { RowStateEnum } from '../../../../domain/value-objects';\r\nimport type { ColumnSchema } from '../../../../domain/types/ColumnSchema';\r\nimport type { UITableController } from '../../../../infrastructure/ui/UITableController';\r\nimport { formatExportValue } from './formatExportValue';\r\n\r\nconst EMPTY_PLACEHOLDERS = new Set(['انتخاب کنید', 'select', 'Select']);\r\n\r\nconst escapeXml = (value: string) =>\r\n value\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n\r\nconst hasMeaningfulValue = (value: unknown) =>\r\n value !== undefined && value !== null && value !== '';\r\n\r\n/** Plain serialized cell as streamed from IndexedDB. */\r\ntype StreamCell = { value: unknown; originalValue: unknown; display: unknown };\r\ntype StreamRecord = {\r\n rowId: number;\r\n collection: string;\r\n sortIndex: number;\r\n rowState: string;\r\n cells: Record<string, StreamCell>;\r\n};\r\n\r\nconst getExportColumns = (controller: UITableController): ColumnSchema[] => {\r\n const view = controller.getViewState();\r\n const columns =\r\n view?.activeCollectionColumn?.length\r\n ? view.activeCollectionColumn\r\n : (view?.columns ?? []);\r\n\r\n return columns\r\n .filter((col) => col.fieldType !== 'index')\r\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n};\r\n\r\nconst isExportableRecord = (record: StreamRecord): boolean => {\r\n if (record.rowState === RowStateEnum.Deleted) return false;\r\n\r\n return Object.entries(record.cells).some(\r\n ([key, cell]) => key !== 'index' && hasMeaningfulValue(cell.value),\r\n );\r\n};\r\n\r\nconst getRecordExportText = (record: StreamRecord, column: ColumnSchema): string => {\r\n const cell = record.cells[column.fieldName];\r\n if (!cell) return '';\r\n\r\n const raw = cell.display ?? cell.value;\r\n if (!hasMeaningfulValue(raw)) return '';\r\n\r\n const text = formatExportValue(raw, column.fieldType).trim();\r\n if (!text || EMPTY_PLACEHOLDERS.has(text)) return '';\r\n\r\n return text;\r\n};\r\n\r\n/** 0-based column index → A, B, … Z, AA, … */\r\nconst toColumnLetter = (index: number): string => {\r\n let n = index + 1;\r\n let result = '';\r\n while (n > 0) {\r\n const rem = (n - 1) % 26;\r\n result = String.fromCharCode(65 + rem) + result;\r\n n = Math.floor((n - 1) / 26);\r\n }\r\n return result;\r\n};\r\n\r\nconst crcTable = (() => {\r\n const table = new Uint32Array(256);\r\n for (let i = 0; i < 256; i += 1) {\r\n let c = i;\r\n for (let k = 0; k < 8; k += 1) {\r\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 8;\r\n c = c >>> 0;\r\n }\r\n table[i] = c >>> 0;\r\n }\r\n return table;\r\n})();\r\n\r\nconst crc32 = (data: Uint8Array): number => {\r\n let crc = 0xffffffff;\r\n for (let i = 0; i < data.length; i += 1) {\r\n crc = crcTable[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);\r\n }\r\n return (crc ^ 0xffffffff) >>> 0;\r\n};\r\n\r\n/** Rolling CRC32 over a byte stream (chunk-by-chunk, no full buffer). */\r\nclass IncrementalCrc {\r\n private crc = 0xffffffff;\r\n private length = 0;\r\n\r\n update(data: Uint8Array): void {\r\n for (let i = 0; i < data.length; i += 1) {\r\n this.crc = crcTable[(this.crc ^ data[i]) & 0xff] ^ (this.crc >>> 8);\r\n this.crc = this.crc >>> 0;\r\n }\r\n this.length += data.length;\r\n }\r\n\r\n finish(): { crc: number; size: number } {\r\n return { crc: (this.crc ^ 0xffffffff) >>> 0, size: this.length };\r\n }\r\n}\r\n\r\nconst textEncoder = new TextEncoder();\r\n\r\ntype ZipEntry = { name: string; data: Uint8Array<ArrayBuffer> | Blob; crc?: number; size?: number };\r\n\r\n/** Minimal ZIP (store / no compression) for OOXML .xlsx. */\r\nconst buildZip = (entries: ZipEntry[]): Blob => {\r\n const parts: BlobPart[] = [];\r\n const centralParts: Uint8Array[] = [];\r\n let offset = 0;\r\n\r\n for (const entry of entries) {\r\n const nameBytes = textEncoder.encode(entry.name);\r\n const data = entry.data;\r\n const size =\r\n entry.size ?? (data instanceof Uint8Array ? data.length : data.size);\r\n const crc = entry.crc ?? (data instanceof Uint8Array ? crc32(data) : 0);\r\n\r\n const local = new Uint8Array(30 + nameBytes.length);\r\n const lv = new DataView(local.buffer);\r\n lv.setUint32(0, 0x04034b50, true);\r\n lv.setUint16(4, 20, true);\r\n lv.setUint16(6, 0, true);\r\n lv.setUint16(8, 0, true); // store\r\n lv.setUint16(10, 0, true);\r\n lv.setUint16(12, 0, true);\r\n lv.setUint32(14, crc, true);\r\n lv.setUint32(18, size, true);\r\n lv.setUint32(22, size, true);\r\n lv.setUint16(26, nameBytes.length, true);\r\n lv.setUint16(28, 0, true);\r\n local.set(nameBytes, 30);\r\n\r\n parts.push(local, data);\r\n\r\n const central = new Uint8Array(46 + nameBytes.length);\r\n const cv = new DataView(central.buffer);\r\n cv.setUint32(0, 0x02014b50, true);\r\n cv.setUint16(4, 20, true);\r\n cv.setUint16(6, 20, true);\r\n cv.setUint16(8, 0, true);\r\n cv.setUint16(10, 0, true);\r\n cv.setUint16(12, 0, true);\r\n cv.setUint16(14, 0, true);\r\n cv.setUint32(16, crc, true);\r\n cv.setUint32(20, size, true);\r\n cv.setUint32(24, size, true);\r\n cv.setUint16(28, nameBytes.length, true);\r\n cv.setUint16(30, 0, true);\r\n cv.setUint16(32, 0, true);\r\n cv.setUint16(34, 0, true);\r\n cv.setUint16(36, 0, true);\r\n cv.setUint32(38, 0, true);\r\n cv.setUint32(42, offset, true);\r\n central.set(nameBytes, 46);\r\n centralParts.push(central);\r\n\r\n offset += local.length + size;\r\n }\r\n\r\n const centralSize = centralParts.reduce((sum, p) => sum + p.length, 0);\r\n const end = new Uint8Array(22);\r\n const ev = new DataView(end.buffer);\r\n ev.setUint32(0, 0x06054b50, true);\r\n ev.setUint16(4, 0, true);\r\n ev.setUint16(6, 0, true);\r\n ev.setUint16(8, entries.length, true);\r\n ev.setUint16(10, entries.length, true);\r\n ev.setUint32(12, centralSize, true);\r\n ev.setUint32(16, offset, true);\r\n ev.setUint16(20, 0, true);\r\n\r\n return new Blob([...parts, ...centralParts, end] as BlobPart[], {\r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n });\r\n};\r\n\r\nconst buildStylesXml = (direction: 'rtl' | 'ltr') => {\r\n // OOXML readingOrder: 1 = LTR, 2 = RTL\r\n const readingOrder = direction === 'rtl' ? 2 : 1;\r\n const horizontal = direction === 'rtl' ? 'right' : 'left';\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\r\n <fonts count=\"3\">\r\n <font><sz val=\"10\"/><name val=\"Tahoma\"/></font>\r\n <font><b/><sz val=\"11\"/><color rgb=\"FFFFFFFF\"/><name val=\"Tahoma\"/></font>\r\n <font><b/><sz val=\"10\"/><name val=\"Tahoma\"/></font>\r\n </fonts>\r\n <fills count=\"4\">\r\n <fill><patternFill patternType=\"none\"/></fill>\r\n <fill><patternFill patternType=\"gray125\"/></fill>\r\n <fill><patternFill patternType=\"solid\"><fgColor rgb=\"FF2F5496\"/></patternFill></fill>\r\n <fill><patternFill patternType=\"solid\"><fgColor rgb=\"FFD6EAF8\"/></patternFill></fill>\r\n </fills>\r\n <borders count=\"2\">\r\n <border><left/><right/><top/><bottom/><diagonal/></border>\r\n <border>\r\n <left style=\"thin\"><color rgb=\"FFBDD7EE\"/></left>\r\n <right style=\"thin\"><color rgb=\"FFBDD7EE\"/></right>\r\n <top style=\"thin\"><color rgb=\"FFBDD7EE\"/></top>\r\n <bottom style=\"thin\"><color rgb=\"FFBDD7EE\"/></bottom>\r\n </border>\r\n </borders>\r\n <cellStyleXfs count=\"1\">\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/>\r\n </cellStyleXfs>\r\n <cellXfs count=\"6\">\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>\r\n <xf numFmtId=\"0\" fontId=\"1\" fillId=\"2\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"center\" vertical=\"center\" wrapText=\"1\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"3\" borderId=\"1\" xfId=\"0\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"${horizontal}\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"${horizontal}\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"2\" fillId=\"3\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"center\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"2\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"center\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n </cellXfs>\r\n</styleSheet>`;\r\n};\r\n\r\nconst inlineStrCell = (ref: string, text: string, styleId: number) =>\r\n `<c r=\"${ref}\" t=\"inlineStr\" s=\"${styleId}\"><is><t>${escapeXml(text)}</t></is></c>`;\r\n\r\nconst numberCell = (ref: string, value: number, styleId: number) =>\r\n `<c r=\"${ref}\" s=\"${styleId}\"><v>${value}</v></c>`;\r\n\r\nconst recordToRowXml = (\r\n record: StreamRecord,\r\n columns: ColumnSchema[],\r\n excelRow: number,\r\n): string => {\r\n const isOdd = (excelRow - 2) % 2 === 0;\r\n const dataStyle = isOdd ? 2 : 3;\r\n const rowNumStyle = isOdd ? 4 : 5;\r\n\r\n const cells = [\r\n numberCell(`A${excelRow}`, excelRow - 1, rowNumStyle),\r\n ...columns.map((col, i) =>\r\n inlineStrCell(\r\n `${toColumnLetter(i + 1)}${excelRow}`,\r\n getRecordExportText(record, col),\r\n dataStyle,\r\n ),\r\n ),\r\n ].join('');\r\n\r\n return `<row r=\"${excelRow}\" ht=\"18\" customHeight=\"1\">${cells}</row>`;\r\n};\r\n\r\nconst buildSheetHeaderXml = (\r\n columns: ColumnSchema[],\r\n options: { direction: 'rtl' | 'ltr'; rowHeaderLabel: string },\r\n): string => {\r\n const { direction, rowHeaderLabel } = options;\r\n const rightToLeft = direction === 'rtl' ? '1' : '0';\r\n const totalCols = columns.length + 1;\r\n\r\n const colsXml = Array.from({ length: totalCols }, (_, i) => {\r\n const width = i === 0 ? 6 : 18;\r\n return `<col min=\"${i + 1}\" max=\"${i + 1}\" width=\"${width}\" customWidth=\"1\"/>`;\r\n }).join('');\r\n\r\n const headerCells = [\r\n inlineStrCell('A1', rowHeaderLabel, 1),\r\n ...columns.map((col, i) =>\r\n inlineStrCell(\r\n `${toColumnLetter(i + 1)}1`,\r\n col.fieldCaption ?? col.fieldName,\r\n 1,\r\n ),\r\n ),\r\n ].join('');\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n <sheetViews>\r\n <sheetView workbookViewId=\"0\" rightToLeft=\"${rightToLeft}\"/>\r\n </sheetViews>\r\n <cols>${colsXml}</cols>\r\n <sheetData>\r\n <row r=\"1\" ht=\"22\" customHeight=\"1\">${headerCells}</row>`;\r\n};\r\n\r\n/**\r\n * Pass 1: stream records to find which columns have data (same semantics as\r\n * the previous full-array getColumnsWithData) — nothing retained per row.\r\n */\r\nconst findColumnsWithData = async (\r\n controller: UITableController,\r\n candidates: ColumnSchema[],\r\n): Promise<ColumnSchema[]> => {\r\n const pending = new Set(candidates.map((c) => c.fieldName));\r\n const byField = new Map(candidates.map((c) => [c.fieldName, c]));\r\n\r\n await controller.iterateRowsFromDb('active', async (records) => {\r\n for (const record of records) {\r\n if (!isExportableRecord(record)) continue;\r\n for (const field of Array.from(pending)) {\r\n if (getRecordExportText(record, byField.get(field)!) !== '') {\r\n pending.delete(field);\r\n }\r\n }\r\n if (pending.size === 0) return false; // early stop\r\n }\r\n });\r\n\r\n return candidates.filter((c) => !pending.has(c.fieldName));\r\n};\r\n\r\n/**\r\n * Pass 2: stream records again, converting each filtered row to an XML chunk\r\n * immediately. Chunks are coalesced into disk-backed Blobs periodically, so\r\n * the JS heap holds only the current batch — the full dataset never lands\r\n * in memory. The sheet's CRC32 and size are computed incrementally so the\r\n * ZIP entry metadata is known without buffering the whole sheet.\r\n */\r\nconst buildSheetBlobStreaming = async (\r\n controller: UITableController,\r\n columns: ColumnSchema[],\r\n options: { direction: 'rtl' | 'ltr'; rowHeaderLabel: string },\r\n): Promise<{ blob: Blob; rowCount: number; crc: number; size: number }> => {\r\n const crc = new IncrementalCrc();\r\n const blobParts: BlobPart[] = [];\r\n let pendingChunks: Uint8Array[] = [];\r\n let pendingBytes = 0;\r\n let rowCount = 0;\r\n\r\n const pushChunk = (text: string) => {\r\n const bytes = textEncoder.encode(text);\r\n crc.update(bytes);\r\n pendingChunks.push(bytes);\r\n pendingBytes += bytes.length;\r\n // Coalesce into a Blob so bytes leave the JS heap (browser blob store).\r\n if (pendingBytes >= 4 * 1024 * 1024) {\r\n blobParts.push(new Blob(pendingChunks as BlobPart[]));\r\n pendingChunks = [];\r\n pendingBytes = 0;\r\n }\r\n };\r\n\r\n pushChunk(buildSheetHeaderXml(columns, options));\r\n\r\n await controller.iterateRowsFromDb('active', async (records) => {\r\n for (const record of records) {\r\n if (!isExportableRecord(record)) continue;\r\n rowCount += 1;\r\n // Excel row numbers are 1-based with the header at row 1.\r\n pushChunk(recordToRowXml(record, columns, rowCount + 1));\r\n }\r\n });\r\n\r\n pushChunk(`\r\n </sheetData>\r\n</worksheet>`);\r\n\r\n if (pendingChunks.length > 0) {\r\n blobParts.push(new Blob(pendingChunks as BlobPart[]));\r\n }\r\n\r\n const { crc: sheetCrc, size } = crc.finish();\r\n return { blob: new Blob(blobParts), rowCount, crc: sheetCrc, size };\r\n};\r\n\r\nconst downloadBlob = (blob: Blob, fileName: string) => {\r\n const url = URL.createObjectURL(blob);\r\n const anchor = document.createElement('a');\r\n anchor.href = url;\r\n anchor.download = fileName;\r\n document.body.appendChild(anchor);\r\n anchor.click();\r\n document.body.removeChild(anchor);\r\n URL.revokeObjectURL(url);\r\n};\r\n\r\nexport type ExportActiveCollectionResult = {\r\n rowCount: number;\r\n columnCount: number;\r\n};\r\n\r\nexport type ExportActiveCollectionOptions = {\r\n fileName?: string;\r\n sheetName?: string;\r\n direction?: 'rtl' | 'ltr';\r\n rowHeaderLabel?: string;\r\n /** When false, skip browser download (tests). */\r\n download?: boolean;\r\n};\r\n\r\n/**\r\n * Exports all meaningful rows of the active collection (streamed from\r\n * IndexedDB — the source of truth) with column captions to Excel.\r\n * The dataset streams through in bounded batches; the full row set is never\r\n * held in the JS heap, so a 50k-row export costs the same heap as a 10-row one.\r\n * Sheet direction follows app RTL/LTR (Excel / Google Sheets sheet view).\r\n */\r\nexport async function exportActiveCollectionToExcelStreaming(\r\n controller: UITableController,\r\n options?: ExportActiveCollectionOptions,\r\n): Promise<ExportActiveCollectionResult> {\r\n const allColumns = getExportColumns(controller);\r\n // Two-pass streaming preserves the previous behavior of dropping columns\r\n // that have no data in any exported row.\r\n const columns = await findColumnsWithData(controller, allColumns);\r\n\r\n const direction = options?.direction ?? 'rtl';\r\n const rowHeaderLabel = options?.rowHeaderLabel ?? 'ردیف';\r\n const sheetName = options?.sheetName ?? 'Sheet1';\r\n const fileName =\r\n options?.fileName ??\r\n `export-${new Date().toISOString().slice(0, 10)}.xlsx`;\r\n\r\n // Yield so UI can paint loading state before the streaming build.\r\n await new Promise<void>((resolve) => {\r\n if (typeof setTimeout === 'function') setTimeout(resolve, 0);\r\n else resolve();\r\n });\r\n\r\n const { blob: sheetBlob, rowCount, crc: sheetCrc, size: sheetSize } =\r\n await buildSheetBlobStreaming(controller, columns, {\r\n direction,\r\n rowHeaderLabel,\r\n });\r\n\r\n if (columns.length === 0 && rowCount === 0) {\r\n throw new Error('NO_COLUMNS');\r\n }\r\n\r\n const safeSheetName = (sheetName.slice(0, 31) || 'Sheet1').replace(\r\n /[\\\\/*?:\\[\\]]/g,\r\n '',\r\n );\r\n\r\n const contentTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\r\n <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\r\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\r\n <Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>\r\n <Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>\r\n <Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>\r\n</Types>`;\r\n\r\n const rootRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>\r\n</Relationships>`;\r\n\r\n const workbook = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n <sheets>\r\n <sheet name=\"${escapeXml(safeSheetName)}\" sheetId=\"1\" r:id=\"rId1\"/>\r\n </sheets>\r\n</workbook>`;\r\n\r\n const workbookRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet1.xml\"/>\r\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>\r\n</Relationships>`;\r\n\r\n const styles = buildStylesXml(direction);\r\n\r\n const zip = buildZip([\r\n { name: '[Content_Types].xml', data: textEncoder.encode(contentTypes) },\r\n { name: '_rels/.rels', data: textEncoder.encode(rootRels) },\r\n { name: 'xl/workbook.xml', data: textEncoder.encode(workbook) },\r\n {\r\n name: 'xl/_rels/workbook.xml.rels',\r\n data: textEncoder.encode(workbookRels),\r\n },\r\n { name: 'xl/styles.xml', data: textEncoder.encode(styles) },\r\n {\r\n name: 'xl/worksheets/sheet1.xml',\r\n data: sheetBlob,\r\n crc: sheetCrc,\r\n size: sheetSize,\r\n },\r\n ]);\r\n if (options?.download !== false) downloadBlob(zip, fileName);\r\n\r\n // +1 for the synthetic row-number column\r\n return { rowCount, columnCount: columns.length + 1 };\r\n}\r\n","import type { UITableController } from '../../../../infrastructure/ui/UITableController';\r\nimport { RowStateEnum } from '../../../../domain/value-objects';\r\nimport type { ExportSource } from '../../../../application/plugins/GridPlugin';\r\nimport { buildExportTable } from './buildExportTable';\r\nimport { buildXlsxBlob, downloadBlob } from './buildXlsxBlob';\r\nimport { exportActiveCollectionToExcelStreaming } from './exportActiveCollectionToExcelStreaming';\r\n\r\nexport type ExportActiveCollectionResult = {\r\n rowCount: number;\r\n columnCount: number;\r\n};\r\n\r\nexport type ExportActiveCollectionOptions = {\r\n fileName?: string;\r\n sheetName?: string;\r\n direction?: 'rtl' | 'ltr';\r\n rowHeaderLabel?: string;\r\n /** When false, skip browser download (tests). */\r\n download?: boolean;\r\n};\r\n\r\nconst hasMeaningfulValue = (value: unknown) =>\r\n value !== undefined && value !== null && value !== '';\r\n\r\n/**\r\n * Imperative facade used by ERP toolbar buttons.\r\n * Prefer PluginHost.requestExport + ExcelExportPlugin for event-driven hosts.\r\n */\r\nexport async function exportActiveCollectionToExcel(\r\n controller: UITableController,\r\n options?: ExportActiveCollectionOptions,\r\n): Promise<ExportActiveCollectionResult> {\r\n // The value still in a cell editor belongs in the file.\r\n await controller.flushCellEdit();\r\n // Page-window mode: only one page is in RAM — stream the full set from\r\n // IndexedDB instead of materializing rows.\r\n if (controller.isPagedWindow()) {\r\n return exportActiveCollectionToExcelStreaming(controller, options);\r\n }\r\n const view = controller.getViewState();\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\r\n const rows = (controller.getAllRows() ?? []).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]) => key !== 'index' && hasMeaningfulValue(cell.getValue()),\r\n );\r\n });\r\n\r\n const source: ExportSource = {\r\n columns: columns.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 rows: rows.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 { value: cell.getValue(), display: cell.getDisplay() },\r\n ]),\r\n ),\r\n })),\r\n };\r\n\r\n const table = buildExportTable(source);\r\n if (table.columns.length === 0 && table.rows.length === 0) {\r\n throw new Error('NO_COLUMNS');\r\n }\r\n\r\n const direction = options?.direction ?? 'rtl';\r\n const rowHeaderLabel = options?.rowHeaderLabel ?? 'ردیف';\r\n const sheetName = options?.sheetName ?? 'Sheet1';\r\n const fileName =\r\n options?.fileName ??\r\n `export-${new Date().toISOString().slice(0, 10)}.xlsx`;\r\n\r\n await new Promise<void>((resolve) => {\r\n if (typeof setTimeout === 'function') setTimeout(resolve, 0);\r\n else resolve();\r\n });\r\n\r\n const blob = buildXlsxBlob(table, {\r\n direction,\r\n rowHeaderLabel,\r\n sheetName,\r\n });\r\n\r\n if (options?.download !== false) {\r\n downloadBlob(blob, fileName);\r\n }\r\n\r\n return { rowCount: table.rows.length, columnCount: table.columns.length + 1 };\r\n}\r\n"]}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { isIndexColumn, resolveColumnPinned, computeLayoutColumnWidths, partitionColumnsByPin, sumColumnWidths, ViewportCalculator, resolveColumnWidth } from './chunk-IPPIXOVQ.js';
|
|
2
|
+
import { useDirection } from './chunk-HLOHWFOA.js';
|
|
3
|
+
import React2, { createContext, useState, useMemo, useEffect, useContext } from 'react';
|
|
4
|
+
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// ui/a11y/gridRoles.ts
|
|
7
|
+
var ARIA_HEADER_ROW_INDEX = 1;
|
|
8
|
+
function ariaColIndex(visibleIndex) {
|
|
9
|
+
return visibleIndex + 1;
|
|
10
|
+
}
|
|
11
|
+
function ariaDataRowIndex(absoluteIndex, pinnedTopCount = 0) {
|
|
12
|
+
return absoluteIndex + 2 + pinnedTopCount;
|
|
13
|
+
}
|
|
14
|
+
function ariaPinnedTopRowIndex(indexInPinned) {
|
|
15
|
+
return indexInPinned + 2;
|
|
16
|
+
}
|
|
17
|
+
function ariaPinnedBottomRowIndex(indexInPinned, dataRowCount, pinnedTopCount = 0) {
|
|
18
|
+
return pinnedTopCount + dataRowCount + 2 + indexInPinned;
|
|
19
|
+
}
|
|
20
|
+
function ariaFooterRowIndex(dataRowCount, pinnedTopCount = 0, pinnedBottomCount = 0) {
|
|
21
|
+
return dataRowCount + pinnedTopCount + pinnedBottomCount + 2;
|
|
22
|
+
}
|
|
23
|
+
function ariaGridRowCount(dataRowCount, hasFooter, pinnedTopCount = 0, pinnedBottomCount = 0) {
|
|
24
|
+
const footerRows = typeof hasFooter === "number" ? hasFooter : hasFooter ? 1 : 0;
|
|
25
|
+
return 1 + pinnedTopCount + dataRowCount + pinnedBottomCount + footerRows;
|
|
26
|
+
}
|
|
27
|
+
function ariaToken(value) {
|
|
28
|
+
return value.replace(/[^A-Za-z0-9_-]/g, "_");
|
|
29
|
+
}
|
|
30
|
+
function gridCellDomId(tableKey, rowId, columnId) {
|
|
31
|
+
return `erp-cell-${ariaToken(tableKey)}-${rowId}-${ariaToken(columnId)}`;
|
|
32
|
+
}
|
|
33
|
+
function isAriaSelectedCell(active, rowId, columnId) {
|
|
34
|
+
return !!active && active.rowId === rowId && active.columnId === columnId;
|
|
35
|
+
}
|
|
36
|
+
function gridCellA11y(tableKey, rowId, columnId, active) {
|
|
37
|
+
return {
|
|
38
|
+
id: gridCellDomId(tableKey, rowId, columnId),
|
|
39
|
+
"aria-selected": isAriaSelectedCell(active, rowId, columnId)
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// ui/columnPin.ts
|
|
44
|
+
function columnPinSide(column) {
|
|
45
|
+
const pin = resolveColumnPinned(column);
|
|
46
|
+
if (pin === "start" || pin === "end") return pin;
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
function columnPinClassName(column) {
|
|
50
|
+
if (isIndexColumn(column)) return "erp-col-pin-start erp-col-pin-index";
|
|
51
|
+
const side = columnPinSide(column);
|
|
52
|
+
if (side === "start") return "erp-col-pin-start";
|
|
53
|
+
if (side === "end") return "erp-col-pin-end";
|
|
54
|
+
return "";
|
|
55
|
+
}
|
|
56
|
+
function indexPinClassName(column) {
|
|
57
|
+
return columnPinClassName(column);
|
|
58
|
+
}
|
|
59
|
+
function columnPinDataAttr(column) {
|
|
60
|
+
if (isIndexColumn(column)) return "index";
|
|
61
|
+
return columnPinSide(column) ?? void 0;
|
|
62
|
+
}
|
|
63
|
+
function indexPinDataAttr(column) {
|
|
64
|
+
const attr = columnPinDataAttr(column);
|
|
65
|
+
return attr === "index" ? "index" : void 0;
|
|
66
|
+
}
|
|
67
|
+
function columnPinStyle(column, startOffsets, endOffsets) {
|
|
68
|
+
const side = columnPinSide(column);
|
|
69
|
+
if (side === "start") {
|
|
70
|
+
const offset = startOffsets[column.fieldName];
|
|
71
|
+
if (offset === void 0) return void 0;
|
|
72
|
+
return { insetInlineStart: offset };
|
|
73
|
+
}
|
|
74
|
+
if (side === "end") {
|
|
75
|
+
const offset = endOffsets[column.fieldName];
|
|
76
|
+
if (offset === void 0) return void 0;
|
|
77
|
+
return { insetInlineEnd: offset };
|
|
78
|
+
}
|
|
79
|
+
return void 0;
|
|
80
|
+
}
|
|
81
|
+
function columnPinCellProps(column, startOffsets, endOffsets) {
|
|
82
|
+
return {
|
|
83
|
+
className: columnPinClassName(column),
|
|
84
|
+
"data-erp-col-pin": columnPinDataAttr(column),
|
|
85
|
+
style: columnPinStyle(column, startOffsets, endOffsets)
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
var EMPTY = {
|
|
89
|
+
allVisible: [],
|
|
90
|
+
pinnedStart: [],
|
|
91
|
+
pinned: [],
|
|
92
|
+
pinnedEnd: [],
|
|
93
|
+
scrollable: [],
|
|
94
|
+
scrollableAbsIndices: [],
|
|
95
|
+
spacerStart: 0,
|
|
96
|
+
spacerEnd: 0,
|
|
97
|
+
pinnedStartWidth: 0,
|
|
98
|
+
pinnedWidth: 0,
|
|
99
|
+
pinnedEndWidth: 0,
|
|
100
|
+
startPinOffsets: {},
|
|
101
|
+
endPinOffsets: {},
|
|
102
|
+
totalWidth: 0,
|
|
103
|
+
layoutWidths: {},
|
|
104
|
+
mountedScrollableCount: 0
|
|
105
|
+
};
|
|
106
|
+
var ColumnWindowContext = createContext(EMPTY);
|
|
107
|
+
function scrollOffsetFromInlineStart(el, direction) {
|
|
108
|
+
const { scrollLeft, scrollWidth, clientWidth } = el;
|
|
109
|
+
if (direction === "ltr") return Math.max(0, scrollLeft);
|
|
110
|
+
if (scrollLeft < 0) return Math.max(0, -scrollLeft);
|
|
111
|
+
const max = Math.max(0, scrollWidth - clientWidth);
|
|
112
|
+
return Math.max(0, max - scrollLeft);
|
|
113
|
+
}
|
|
114
|
+
function buildColumnWindowModel(allVisible, columnWidths, scrollOffset, viewportSize, overscan = 1, flexContainerWidth = viewportSize) {
|
|
115
|
+
const layoutWidths = computeLayoutColumnWidths(
|
|
116
|
+
allVisible,
|
|
117
|
+
columnWidths,
|
|
118
|
+
flexContainerWidth
|
|
119
|
+
);
|
|
120
|
+
const widthOf = (col) => layoutWidths[col.fieldName] ?? resolveColumnWidth(col, columnWidths);
|
|
121
|
+
const { pinnedStart, scrollable: scrollableAll, pinnedEnd, scrollableAbs } = partitionColumnsByPin(allVisible);
|
|
122
|
+
const pinnedStartWidth = sumColumnWidths(pinnedStart, widthOf);
|
|
123
|
+
const pinnedEndWidth = sumColumnWidths(pinnedEnd, widthOf);
|
|
124
|
+
const scrollableWidths = scrollableAll.map(widthOf);
|
|
125
|
+
const range = ViewportCalculator.calculateColumns(
|
|
126
|
+
scrollableWidths,
|
|
127
|
+
scrollOffset,
|
|
128
|
+
viewportSize,
|
|
129
|
+
pinnedStartWidth,
|
|
130
|
+
overscan,
|
|
131
|
+
pinnedEndWidth
|
|
132
|
+
);
|
|
133
|
+
const scrollable = scrollableAll.slice(range.startIndex, range.endIndex);
|
|
134
|
+
const scrollableAbsIndices = scrollableAbs.slice(
|
|
135
|
+
range.startIndex,
|
|
136
|
+
range.endIndex
|
|
137
|
+
);
|
|
138
|
+
const totalScrollable = range.totalScrollableWidth;
|
|
139
|
+
const spacerCells = (range.spacerStart > 0 ? 1 : 0) + (range.spacerEnd > 0 ? 1 : 0);
|
|
140
|
+
let startCursor = 0;
|
|
141
|
+
const startPinOffsets = {};
|
|
142
|
+
for (const col of pinnedStart) {
|
|
143
|
+
startPinOffsets[col.fieldName] = startCursor;
|
|
144
|
+
startCursor += widthOf(col);
|
|
145
|
+
}
|
|
146
|
+
let endCursor = 0;
|
|
147
|
+
const endPinOffsets = {};
|
|
148
|
+
for (let i = pinnedEnd.length - 1; i >= 0; i -= 1) {
|
|
149
|
+
const col = pinnedEnd[i];
|
|
150
|
+
endPinOffsets[col.fieldName] = endCursor;
|
|
151
|
+
endCursor += widthOf(col);
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
allVisible,
|
|
155
|
+
pinnedStart,
|
|
156
|
+
pinned: pinnedStart,
|
|
157
|
+
pinnedEnd,
|
|
158
|
+
scrollable,
|
|
159
|
+
scrollableAbsIndices,
|
|
160
|
+
spacerStart: range.spacerStart,
|
|
161
|
+
spacerEnd: range.spacerEnd,
|
|
162
|
+
pinnedStartWidth,
|
|
163
|
+
pinnedWidth: pinnedStartWidth,
|
|
164
|
+
pinnedEndWidth,
|
|
165
|
+
startPinOffsets,
|
|
166
|
+
endPinOffsets,
|
|
167
|
+
totalWidth: pinnedStartWidth + totalScrollable + pinnedEndWidth,
|
|
168
|
+
layoutWidths,
|
|
169
|
+
mountedScrollableCount: scrollable.length + spacerCells
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function ColumnWindowProvider({
|
|
173
|
+
scrollRef,
|
|
174
|
+
columns,
|
|
175
|
+
columnWidths,
|
|
176
|
+
overscan = 1,
|
|
177
|
+
onViewportWidthChange,
|
|
178
|
+
children
|
|
179
|
+
}) {
|
|
180
|
+
const direction = useDirection();
|
|
181
|
+
const [scrollOffset, setScrollOffset] = useState(0);
|
|
182
|
+
const [viewportSize, setViewportSize] = useState(1024);
|
|
183
|
+
const allVisible = useMemo(
|
|
184
|
+
() => columns.filter((c) => !c.hidden),
|
|
185
|
+
[columns]
|
|
186
|
+
);
|
|
187
|
+
useEffect(() => {
|
|
188
|
+
const el = scrollRef.current;
|
|
189
|
+
if (!el) return;
|
|
190
|
+
const update = () => {
|
|
191
|
+
setScrollOffset(scrollOffsetFromInlineStart(el, direction));
|
|
192
|
+
const w = el.clientWidth || 1024;
|
|
193
|
+
setViewportSize(w);
|
|
194
|
+
onViewportWidthChange?.(w);
|
|
195
|
+
};
|
|
196
|
+
update();
|
|
197
|
+
el.addEventListener("scroll", update, { passive: true });
|
|
198
|
+
const ro = typeof ResizeObserver !== "undefined" ? new ResizeObserver(() => update()) : null;
|
|
199
|
+
ro?.observe(el);
|
|
200
|
+
return () => {
|
|
201
|
+
el.removeEventListener("scroll", update);
|
|
202
|
+
ro?.disconnect();
|
|
203
|
+
};
|
|
204
|
+
}, [scrollRef, direction, allVisible.length, columnWidths, onViewportWidthChange]);
|
|
205
|
+
const value = useMemo(
|
|
206
|
+
() => buildColumnWindowModel(
|
|
207
|
+
allVisible,
|
|
208
|
+
columnWidths,
|
|
209
|
+
scrollOffset,
|
|
210
|
+
viewportSize,
|
|
211
|
+
overscan
|
|
212
|
+
),
|
|
213
|
+
[allVisible, columnWidths, scrollOffset, viewportSize, overscan]
|
|
214
|
+
);
|
|
215
|
+
return /* @__PURE__ */ jsx(ColumnWindowContext.Provider, { value, children });
|
|
216
|
+
}
|
|
217
|
+
function useColumnWindowOrAll(columns, columnWidths) {
|
|
218
|
+
const ctx = useContext(ColumnWindowContext);
|
|
219
|
+
const allVisible = columns.filter((c) => !c.hidden);
|
|
220
|
+
if (ctx.allVisible.length > 0) return ctx;
|
|
221
|
+
return buildColumnWindowModel(allVisible, columnWidths, 0, 1e9, 0, 0);
|
|
222
|
+
}
|
|
223
|
+
function renderPinnedColumns(cols, model, renderColumn, keyPrefix) {
|
|
224
|
+
const nodes = [];
|
|
225
|
+
for (const col of cols) {
|
|
226
|
+
const abs = model.allVisible.findIndex((c) => c.fieldName === col.fieldName);
|
|
227
|
+
nodes.push(
|
|
228
|
+
/* @__PURE__ */ jsx(React2.Fragment, { children: renderColumn(col, abs >= 0 ? abs : 0) }, `${keyPrefix}-${col.fieldName}`)
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
return nodes;
|
|
232
|
+
}
|
|
233
|
+
function ColumnWindowCells({
|
|
234
|
+
window: model,
|
|
235
|
+
renderColumn,
|
|
236
|
+
spacerElement: Spacer,
|
|
237
|
+
spacerRole = "presentation",
|
|
238
|
+
spacerStyle
|
|
239
|
+
}) {
|
|
240
|
+
const nodes = [];
|
|
241
|
+
nodes.push(
|
|
242
|
+
...renderPinnedColumns(model.pinnedStart, model, renderColumn, "pin-start")
|
|
243
|
+
);
|
|
244
|
+
if (model.spacerStart > 0) {
|
|
245
|
+
nodes.push(
|
|
246
|
+
/* @__PURE__ */ jsx(
|
|
247
|
+
Spacer,
|
|
248
|
+
{
|
|
249
|
+
"aria-hidden": true,
|
|
250
|
+
role: spacerRole,
|
|
251
|
+
"data-pdg-col-spacer": "start",
|
|
252
|
+
style: {
|
|
253
|
+
width: model.spacerStart,
|
|
254
|
+
minWidth: model.spacerStart,
|
|
255
|
+
padding: 0,
|
|
256
|
+
border: "none",
|
|
257
|
+
...spacerStyle
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
"pdg-col-spacer-start"
|
|
261
|
+
)
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
model.scrollable.forEach((col, i) => {
|
|
265
|
+
const abs = model.scrollableAbsIndices[i] ?? i;
|
|
266
|
+
nodes.push(
|
|
267
|
+
/* @__PURE__ */ jsx(React2.Fragment, { children: renderColumn(col, abs) }, `scr-${col.fieldName}`)
|
|
268
|
+
);
|
|
269
|
+
});
|
|
270
|
+
if (model.spacerEnd > 0) {
|
|
271
|
+
nodes.push(
|
|
272
|
+
/* @__PURE__ */ jsx(
|
|
273
|
+
Spacer,
|
|
274
|
+
{
|
|
275
|
+
"aria-hidden": true,
|
|
276
|
+
role: spacerRole,
|
|
277
|
+
"data-pdg-col-spacer": "end",
|
|
278
|
+
style: {
|
|
279
|
+
width: model.spacerEnd,
|
|
280
|
+
minWidth: model.spacerEnd,
|
|
281
|
+
padding: 0,
|
|
282
|
+
border: "none",
|
|
283
|
+
...spacerStyle
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
"pdg-col-spacer-end"
|
|
287
|
+
)
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
nodes.push(
|
|
291
|
+
...renderPinnedColumns(model.pinnedEnd, model, renderColumn, "pin-end")
|
|
292
|
+
);
|
|
293
|
+
return /* @__PURE__ */ jsx(Fragment, { children: nodes });
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export { ARIA_HEADER_ROW_INDEX, ColumnWindowCells, ColumnWindowProvider, ariaColIndex, ariaDataRowIndex, ariaFooterRowIndex, ariaGridRowCount, ariaPinnedBottomRowIndex, ariaPinnedTopRowIndex, columnPinCellProps, columnPinClassName, gridCellA11y, gridCellDomId, indexPinClassName, indexPinDataAttr, useColumnWindowOrAll };
|
|
297
|
+
//# sourceMappingURL=chunk-NQUVAJQA.js.map
|
|
298
|
+
//# sourceMappingURL=chunk-NQUVAJQA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../ui/a11y/gridRoles.ts","../ui/columnPin.ts","../ui/virtual/columnWindow.tsx","../ui/virtual/ColumnWindowCells.tsx"],"names":["jsx","React"],"mappings":"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","file":"chunk-NQUVAJQA.js","sourcesContent":["/** Header occupies ARIA row 1. Data rows start at 2 (or after pinned top). */\r\nexport const ARIA_HEADER_ROW_INDEX = 1;\r\n\r\n/** 1-based `aria-colindex` from 0-based visible column order. */\r\nexport function ariaColIndex(visibleIndex: number): number {\r\n return visibleIndex + 1;\r\n}\r\n\r\n/**\r\n * 1-based `aria-rowindex` for a data row.\r\n * `absoluteIndex` is 0-based in the full collection (not the mounted DOM window).\r\n * `pinnedTopCount` shifts indices when pinned-top rows occupy slots after the header (PR-116).\r\n */\r\nexport function ariaDataRowIndex(\r\n absoluteIndex: number,\r\n pinnedTopCount = 0,\r\n): number {\r\n return absoluteIndex + 2 + pinnedTopCount;\r\n}\r\n\r\n/** Pinned-top rows sit immediately after the header (PR-116). */\r\nexport function ariaPinnedTopRowIndex(indexInPinned: number): number {\r\n return indexInPinned + 2;\r\n}\r\n\r\n/** Pinned-bottom rows sit after all data rows (PR-116). */\r\nexport function ariaPinnedBottomRowIndex(\r\n indexInPinned: number,\r\n dataRowCount: number,\r\n pinnedTopCount = 0,\r\n): number {\r\n return pinnedTopCount + dataRowCount + 2 + indexInPinned;\r\n}\r\n\r\nexport function ariaFooterRowIndex(\r\n dataRowCount: number,\r\n pinnedTopCount = 0,\r\n pinnedBottomCount = 0,\r\n): number {\r\n return dataRowCount + pinnedTopCount + pinnedBottomCount + 2;\r\n}\r\n\r\nexport function ariaGridRowCount(\r\n dataRowCount: number,\r\n hasFooter: boolean | number,\r\n pinnedTopCount = 0,\r\n pinnedBottomCount = 0,\r\n): number {\r\n const footerRows =\r\n typeof hasFooter === 'number' ? hasFooter : hasFooter ? 1 : 0;\r\n return (\r\n 1 +\r\n pinnedTopCount +\r\n dataRowCount +\r\n pinnedBottomCount +\r\n footerRows\r\n );\r\n}\r\n\r\nfunction ariaToken(value: string): string {\r\n return value.replace(/[^A-Za-z0-9_-]/g, '_');\r\n}\r\n\r\n/** Stable DOM id for `aria-activedescendant` on the grid. */\r\nexport function gridCellDomId(\r\n tableKey: string,\r\n rowId: number,\r\n columnId: string,\r\n): string {\r\n return `erp-cell-${ariaToken(tableKey)}-${rowId}-${ariaToken(columnId)}`;\r\n}\r\n\r\nexport function isAriaSelectedCell(\r\n active: { rowId: number; columnId: string } | null | undefined,\r\n rowId: number,\r\n columnId: string,\r\n): boolean {\r\n return !!active && active.rowId === rowId && active.columnId === columnId;\r\n}\r\n\r\nexport function gridCellA11y(\r\n tableKey: string,\r\n rowId: number,\r\n columnId: string,\r\n active: { rowId: number; columnId: string } | null | undefined,\r\n): { id: string; 'aria-selected': boolean } {\r\n return {\r\n id: gridCellDomId(tableKey, rowId, columnId),\r\n 'aria-selected': isAriaSelectedCell(active, rowId, columnId),\r\n };\r\n}\r\n","import type { CSSProperties } from 'react';\r\n\r\nimport type { ColumnSchema } from '../bootstrap/type';\r\nimport {\r\n computeEndPinOffsets,\r\n computePinOffsets,\r\n resolveColumnPinned,\r\n type ColumnPinSide,\r\n} from '../engine/dataOps/columnPin';\r\nimport { isIndexColumn, type ColumnWidthHint } from '../engine/columnWidth';\r\n\r\n/** D19: any column may pin; index always pins at inline-start. */\r\nexport function columnPinSide(column: ColumnSchema): ColumnPinSide | null {\r\n const pin = resolveColumnPinned(column);\r\n if (pin === 'start' || pin === 'end') return pin;\r\n return null;\r\n}\r\n\r\nexport function columnPinClassName(column: ColumnWidthHint): string {\r\n if (isIndexColumn(column)) return 'erp-col-pin-start erp-col-pin-index';\r\n const side = columnPinSide(column as ColumnSchema);\r\n if (side === 'start') return 'erp-col-pin-start';\r\n if (side === 'end') return 'erp-col-pin-end';\r\n return '';\r\n}\r\n\r\n/** @deprecated Use `columnPinDataAttr` — kept for existing DOM hooks. */\r\nexport function indexPinClassName(column: ColumnWidthHint): string {\r\n return columnPinClassName(column);\r\n}\r\n\r\nexport function columnPinDataAttr(\r\n column: ColumnWidthHint,\r\n): ColumnPinSide | 'index' | undefined {\r\n if (isIndexColumn(column)) return 'index';\r\n return columnPinSide(column as ColumnSchema) ?? undefined;\r\n}\r\n\r\n/** @deprecated Use `columnPinDataAttr`. */\r\nexport function indexPinDataAttr(\r\n column: ColumnWidthHint,\r\n): 'index' | undefined {\r\n const attr = columnPinDataAttr(column);\r\n return attr === 'index' ? 'index' : undefined;\r\n}\r\n\r\nexport function columnPinStyle(\r\n column: ColumnSchema,\r\n startOffsets: Record<string, number>,\r\n endOffsets: Record<string, number>,\r\n): CSSProperties | undefined {\r\n const side = columnPinSide(column);\r\n if (side === 'start') {\r\n const offset = startOffsets[column.fieldName];\r\n if (offset === undefined) return undefined;\r\n return { insetInlineStart: offset };\r\n }\r\n if (side === 'end') {\r\n const offset = endOffsets[column.fieldName];\r\n if (offset === undefined) return undefined;\r\n return { insetInlineEnd: offset };\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function columnPinCellProps(\r\n column: ColumnSchema,\r\n startOffsets: Record<string, number>,\r\n endOffsets: Record<string, number>,\r\n): {\r\n className: string;\r\n 'data-erp-col-pin': ReturnType<typeof columnPinDataAttr>;\r\n style: CSSProperties | undefined;\r\n} {\r\n return {\r\n className: columnPinClassName(column),\r\n 'data-erp-col-pin': columnPinDataAttr(column),\r\n style: columnPinStyle(column, startOffsets, endOffsets),\r\n };\r\n}\r\n\r\nexport function buildPinOffsetMaps(\r\n pinnedStart: readonly ColumnSchema[],\r\n pinnedEnd: readonly ColumnSchema[],\r\n resolveWidth: (col: ColumnSchema) => number,\r\n): {\r\n startOffsets: Record<string, number>;\r\n endOffsets: Record<string, number>;\r\n} {\r\n return {\r\n startOffsets: computePinOffsets(pinnedStart, resolveWidth),\r\n endOffsets: computeEndPinOffsets(pinnedEnd, resolveWidth),\r\n };\r\n}\r\n","\"use client\";\r\n\r\n\r\n\r\nimport React, {\r\n\r\n createContext,\r\n\r\n useContext,\r\n\r\n useEffect,\r\n\r\n useMemo,\r\n\r\n useState,\r\n\r\n type ReactNode,\r\n\r\n type RefObject,\r\n\r\n} from 'react';\r\n\r\n\r\n\r\nimport type { ColumnSchema } from '../../bootstrap/type';\r\n\r\nimport { partitionColumnsByPin, sumColumnWidths } from '../../engine/dataOps/columnPin';\r\nimport { computeLayoutColumnWidths } from '../../engine/dataOps/columnLayout';\r\nimport { resolveColumnWidth } from '../../engine/columnWidth';\r\n\r\nimport { ViewportCalculator } from '../../engine/ViewportCalculator';\r\n\r\nimport { useDirection } from '../host';\r\n\r\n\r\n\r\nexport type ColumnWindowModel = {\r\n\r\n /** Full non-hidden column list (document order). */\r\n\r\n allVisible: ColumnSchema[];\r\n\r\n /** Inline-start pinned columns (includes index). */\r\n\r\n pinnedStart: ColumnSchema[];\r\n\r\n /** @deprecated alias for pinnedStart */\r\n\r\n pinned: ColumnSchema[];\r\n\r\n pinnedEnd: ColumnSchema[];\r\n\r\n /** Visible scrollable slice only. */\r\n\r\n scrollable: ColumnSchema[];\r\n\r\n /** Absolute indices into `allVisible` for scrollable slice entries. */\r\n\r\n scrollableAbsIndices: number[];\r\n\r\n spacerStart: number;\r\n\r\n spacerEnd: number;\r\n\r\n pinnedStartWidth: number;\r\n\r\n /** @deprecated alias for pinnedStartWidth */\r\n\r\n pinnedWidth: number;\r\n\r\n pinnedEndWidth: number;\r\n\r\n startPinOffsets: Record<string, number>;\r\n\r\n endPinOffsets: Record<string, number>;\r\n\r\n totalWidth: number;\r\n\r\n /** Effective widths after flex distribution (PR-112). */\r\n layoutWidths: Record<string, number>;\r\n\r\n /** Number of `<th>` / data cells that should mount (pins + slice + spacers). */\r\n\r\n mountedScrollableCount: number;\r\n\r\n};\r\n\r\n\r\n\r\nconst EMPTY: ColumnWindowModel = {\r\n\r\n allVisible: [],\r\n\r\n pinnedStart: [],\r\n\r\n pinned: [],\r\n\r\n pinnedEnd: [],\r\n\r\n scrollable: [],\r\n\r\n scrollableAbsIndices: [],\r\n\r\n spacerStart: 0,\r\n\r\n spacerEnd: 0,\r\n\r\n pinnedStartWidth: 0,\r\n\r\n pinnedWidth: 0,\r\n\r\n pinnedEndWidth: 0,\r\n\r\n startPinOffsets: {},\r\n\r\n endPinOffsets: {},\r\n\r\n totalWidth: 0,\r\n\r\n layoutWidths: {},\r\n\r\n mountedScrollableCount: 0,\r\n\r\n};\r\n\r\n\r\n\r\nconst ColumnWindowContext = createContext<ColumnWindowModel>(EMPTY);\r\n\r\n\r\n\r\n/** Normalize scroll position to distance from inline-start (px ≥ 0). */\r\n\r\nexport function scrollOffsetFromInlineStart(\r\n\r\n el: HTMLElement,\r\n\r\n direction: 'rtl' | 'ltr',\r\n\r\n): number {\r\n\r\n const { scrollLeft, scrollWidth, clientWidth } = el;\r\n\r\n if (direction === 'ltr') return Math.max(0, scrollLeft);\r\n\r\n if (scrollLeft < 0) return Math.max(0, -scrollLeft);\r\n\r\n const max = Math.max(0, scrollWidth - clientWidth);\r\n\r\n return Math.max(0, max - scrollLeft);\r\n\r\n}\r\n\r\n\r\n\r\nexport function buildColumnWindowModel(\r\n\r\n allVisible: ColumnSchema[],\r\n\r\n columnWidths: Record<string, number> | undefined,\r\n\r\n scrollOffset: number,\r\n\r\n viewportSize: number,\r\n\r\n overscan = 1,\r\n\r\n flexContainerWidth = viewportSize,\r\n\r\n): ColumnWindowModel {\r\n\r\n const layoutWidths = computeLayoutColumnWidths(\r\n allVisible,\r\n columnWidths,\r\n flexContainerWidth,\r\n );\r\n\r\n const widthOf = (col: ColumnSchema) =>\r\n layoutWidths[col.fieldName] ?? resolveColumnWidth(col, columnWidths);\r\n\r\n\r\n\r\n const { pinnedStart, scrollable: scrollableAll, pinnedEnd, scrollableAbs } =\r\n\r\n partitionColumnsByPin(allVisible);\r\n\r\n\r\n\r\n const pinnedStartWidth = sumColumnWidths(pinnedStart, widthOf);\r\n\r\n const pinnedEndWidth = sumColumnWidths(pinnedEnd, widthOf);\r\n\r\n\r\n\r\n const scrollableWidths = scrollableAll.map(widthOf);\r\n\r\n const range = ViewportCalculator.calculateColumns(\r\n\r\n scrollableWidths,\r\n\r\n scrollOffset,\r\n\r\n viewportSize,\r\n\r\n pinnedStartWidth,\r\n\r\n overscan,\r\n\r\n pinnedEndWidth,\r\n\r\n );\r\n\r\n const scrollable = scrollableAll.slice(range.startIndex, range.endIndex);\r\n\r\n const scrollableAbsIndices = scrollableAbs.slice(\r\n\r\n range.startIndex,\r\n\r\n range.endIndex,\r\n\r\n );\r\n\r\n const totalScrollable = range.totalScrollableWidth;\r\n\r\n const spacerCells =\r\n\r\n (range.spacerStart > 0 ? 1 : 0) + (range.spacerEnd > 0 ? 1 : 0);\r\n\r\n\r\n\r\n let startCursor = 0;\r\n\r\n const startPinOffsets: Record<string, number> = {};\r\n\r\n for (const col of pinnedStart) {\r\n\r\n startPinOffsets[col.fieldName] = startCursor;\r\n\r\n startCursor += widthOf(col);\r\n\r\n }\r\n\r\n\r\n\r\n let endCursor = 0;\r\n\r\n const endPinOffsets: Record<string, number> = {};\r\n\r\n for (let i = pinnedEnd.length - 1; i >= 0; i -= 1) {\r\n\r\n const col = pinnedEnd[i]!;\r\n\r\n endPinOffsets[col.fieldName] = endCursor;\r\n\r\n endCursor += widthOf(col);\r\n\r\n }\r\n\r\n\r\n\r\n return {\r\n\r\n allVisible,\r\n\r\n pinnedStart,\r\n\r\n pinned: pinnedStart,\r\n\r\n pinnedEnd,\r\n\r\n scrollable,\r\n\r\n scrollableAbsIndices,\r\n\r\n spacerStart: range.spacerStart,\r\n\r\n spacerEnd: range.spacerEnd,\r\n\r\n pinnedStartWidth,\r\n\r\n pinnedWidth: pinnedStartWidth,\r\n\r\n pinnedEndWidth,\r\n\r\n startPinOffsets: startPinOffsets,\r\n\r\n endPinOffsets,\r\n\r\n totalWidth: pinnedStartWidth + totalScrollable + pinnedEndWidth,\r\n\r\n layoutWidths,\r\n\r\n mountedScrollableCount: scrollable.length + spacerCells,\r\n\r\n };\r\n\r\n}\r\n\r\n\r\n\r\ntype ProviderProps = {\r\n\r\n scrollRef: RefObject<HTMLElement | null>;\r\n\r\n columns: ColumnSchema[];\r\n\r\n columnWidths?: Record<string, number>;\r\n\r\n overscan?: number;\r\n\r\n onViewportWidthChange?: (width: number) => void;\r\n\r\n children: ReactNode;\r\n\r\n};\r\n\r\n\r\n\r\nexport function ColumnWindowProvider({\r\n\r\n scrollRef,\r\n\r\n columns,\r\n\r\n columnWidths,\r\n\r\n overscan = 1,\r\n\r\n onViewportWidthChange,\r\n\r\n children,\r\n\r\n}: ProviderProps) {\r\n\r\n const direction = useDirection();\r\n\r\n const [scrollOffset, setScrollOffset] = useState(0);\r\n\r\n const [viewportSize, setViewportSize] = useState(1024);\r\n\r\n\r\n\r\n const allVisible = useMemo(\r\n\r\n () => columns.filter((c) => !c.hidden),\r\n\r\n [columns],\r\n\r\n );\r\n\r\n\r\n\r\n useEffect(() => {\r\n\r\n const el = scrollRef.current;\r\n\r\n if (!el) return;\r\n\r\n\r\n\r\n const update = () => {\r\n\r\n setScrollOffset(scrollOffsetFromInlineStart(el, direction));\r\n\r\n const w = el.clientWidth || 1024;\r\n\r\n setViewportSize(w);\r\n\r\n onViewportWidthChange?.(w);\r\n\r\n };\r\n\r\n update();\r\n\r\n el.addEventListener('scroll', update, { passive: true });\r\n\r\n const ro =\r\n\r\n typeof ResizeObserver !== 'undefined'\r\n\r\n ? new ResizeObserver(() => update())\r\n\r\n : null;\r\n\r\n ro?.observe(el);\r\n\r\n return () => {\r\n\r\n el.removeEventListener('scroll', update);\r\n\r\n ro?.disconnect();\r\n\r\n };\r\n\r\n }, [scrollRef, direction, allVisible.length, columnWidths, onViewportWidthChange]);\r\n\r\n\r\n\r\n const value = useMemo(\r\n\r\n () =>\r\n\r\n buildColumnWindowModel(\r\n\r\n allVisible,\r\n\r\n columnWidths,\r\n\r\n scrollOffset,\r\n\r\n viewportSize,\r\n\r\n overscan,\r\n\r\n ),\r\n\r\n [allVisible, columnWidths, scrollOffset, viewportSize, overscan],\r\n\r\n );\r\n\r\n\r\n\r\n return (\r\n\r\n <ColumnWindowContext.Provider value={value}>\r\n\r\n {children}\r\n\r\n </ColumnWindowContext.Provider>\r\n\r\n );\r\n\r\n}\r\n\r\n\r\n\r\nexport function useColumnWindow(): ColumnWindowModel {\r\n\r\n return useContext(ColumnWindowContext);\r\n\r\n}\r\n\r\n\r\n\r\n/** Fallback when provider is absent: render every visible column. */\r\n\r\nexport function useColumnWindowOrAll(\r\n\r\n columns: ColumnSchema[],\r\n\r\n columnWidths?: Record<string, number>,\r\n\r\n): ColumnWindowModel {\r\n\r\n const ctx = useContext(ColumnWindowContext);\r\n\r\n const allVisible = columns.filter((c) => !c.hidden);\r\n\r\n if (ctx.allVisible.length > 0) return ctx;\r\n\r\n return buildColumnWindowModel(allVisible, columnWidths, 0, 1e9, 0, 0);\r\n\r\n}\r\n\r\n\r\n","\"use client\";\r\n\r\n\r\n\r\nimport React, { type CSSProperties, type ReactNode } from 'react';\r\n\r\n\r\n\r\nimport type { ColumnSchema } from '../../bootstrap/type';\r\n\r\nimport type { ColumnWindowModel } from './columnWindow';\r\n\r\n\r\n\r\ntype SpacerKind = 'start' | 'end';\r\n\r\n\r\n\r\ntype Props = {\r\n\r\n window: ColumnWindowModel;\r\n\r\n /** Render a real pinned / scrollable column cell. */\r\n\r\n renderColumn: (col: ColumnSchema, absoluteIndex: number) => ReactNode;\r\n\r\n /** Element type for horizontal spacers (`th` in header, `td` elsewhere). */\r\n\r\n spacerElement: 'th' | 'td';\r\n\r\n spacerRole?: 'columnheader' | 'presentation' | 'gridcell';\r\n\r\n spacerStyle?: CSSProperties;\r\n\r\n};\r\n\r\n\r\n\r\nfunction renderPinnedColumns(\r\n\r\n cols: ColumnSchema[],\r\n\r\n model: ColumnWindowModel,\r\n\r\n renderColumn: Props['renderColumn'],\r\n\r\n keyPrefix: string,\r\n\r\n) {\r\n\r\n const nodes: ReactNode[] = [];\r\n\r\n for (const col of cols) {\r\n\r\n const abs = model.allVisible.findIndex((c) => c.fieldName === col.fieldName);\r\n\r\n nodes.push(\r\n\r\n <React.Fragment key={`${keyPrefix}-${col.fieldName}`}>\r\n\r\n {renderColumn(col, abs >= 0 ? abs : 0)}\r\n\r\n </React.Fragment>,\r\n\r\n );\r\n\r\n }\r\n\r\n return nodes;\r\n\r\n}\r\n\r\n\r\n\r\n/**\r\n\r\n * Shared column chrome for header / body / footer (PR-98 / PR-110):\r\n\r\n * pin start → spacerStart → scrollable window → spacerEnd → pin end.\r\n\r\n */\r\n\r\nexport function ColumnWindowCells({\r\n\r\n window: model,\r\n\r\n renderColumn,\r\n\r\n spacerElement: Spacer,\r\n\r\n spacerRole = 'presentation',\r\n\r\n spacerStyle,\r\n\r\n}: Props) {\r\n\r\n const nodes: ReactNode[] = [];\r\n\r\n\r\n\r\n nodes.push(\r\n\r\n ...renderPinnedColumns(model.pinnedStart, model, renderColumn, 'pin-start'),\r\n\r\n );\r\n\r\n\r\n\r\n if (model.spacerStart > 0) {\r\n\r\n nodes.push(\r\n\r\n <Spacer\r\n\r\n key=\"pdg-col-spacer-start\"\r\n\r\n aria-hidden\r\n\r\n role={spacerRole}\r\n\r\n data-pdg-col-spacer=\"start\"\r\n\r\n style={{\r\n\r\n width: model.spacerStart,\r\n\r\n minWidth: model.spacerStart,\r\n\r\n padding: 0,\r\n\r\n border: 'none',\r\n\r\n ...spacerStyle,\r\n\r\n }}\r\n\r\n />,\r\n\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n model.scrollable.forEach((col, i) => {\r\n\r\n const abs = model.scrollableAbsIndices[i] ?? i;\r\n\r\n nodes.push(\r\n\r\n <React.Fragment key={`scr-${col.fieldName}`}>\r\n\r\n {renderColumn(col, abs)}\r\n\r\n </React.Fragment>,\r\n\r\n );\r\n\r\n });\r\n\r\n\r\n\r\n if (model.spacerEnd > 0) {\r\n\r\n nodes.push(\r\n\r\n <Spacer\r\n\r\n key=\"pdg-col-spacer-end\"\r\n\r\n aria-hidden\r\n\r\n role={spacerRole}\r\n\r\n data-pdg-col-spacer=\"end\"\r\n\r\n style={{\r\n\r\n width: model.spacerEnd,\r\n\r\n minWidth: model.spacerEnd,\r\n\r\n padding: 0,\r\n\r\n border: 'none',\r\n\r\n ...spacerStyle,\r\n\r\n }}\r\n\r\n />,\r\n\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n nodes.push(\r\n\r\n ...renderPinnedColumns(model.pinnedEnd, model, renderColumn, 'pin-end'),\r\n\r\n );\r\n\r\n\r\n\r\n return <>{nodes}</>;\r\n\r\n}\r\n\r\n\r\n\r\nexport type { SpacerKind };\r\n\r\n\r\n"]}
|