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":["../application/handlers/cellCommandsHandler.ts"],"names":[],"mappings":"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","file":"chunk-7T6AWRPU.js","sourcesContent":["// application/handlers/cellCommandsHandler.ts\r\n\r\nimport {\r\n ColumnSchema,\r\n FieldType,\r\n} from '../../bootstrap/type';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport { DomainError } from '../../domain/errors/DomainError';\r\nimport {\r\n Actor,\r\n PermissionPolicy,\r\n} from '../../domain/policies';\r\nimport {\r\n ColumnId,\r\n RowId,\r\n RowStateEnum,\r\n} from '../../domain/value-objects';\r\nimport {\r\n ApplyDynamicProjectionCommand,\r\n ChangeCellDisplayValueCommand,\r\n ChangeCellValueCommand,\r\n SaveDescriptionCommand,\r\n} from '../commands';\r\nimport { TableEvent } from '../events';\r\nimport { AuditLogger } from '../ports/AuditLogger';\r\nimport { RemoteApi } from '../ports/RemoteApi';\r\nimport { TableRepository } from '../ports/TableRepository';\r\n\r\nexport type DynamicConfig = {\r\n columnMeta: Map<string, ColumnSchema>;\r\n remoteApi: RemoteApi;\r\n};\r\n\r\n/* ─── shared helper ──────────────────────────────────────────────── */\r\n\r\nexport function logError(audit: AuditLogger, error: unknown, context?: string): void {\r\n if (error instanceof DomainError) {\r\n audit.log({\r\n type: error.code,\r\n message: error.message,\r\n payload: { details: error.details, context },\r\n });\r\n } else if (error instanceof Error) {\r\n audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: error.message,\r\n payload: { stack: error.stack, context },\r\n });\r\n } else {\r\n audit.log({\r\n type: 'INVARIANT_VIOLATION',\r\n message: 'Unexpected error',\r\n payload: { error, context },\r\n });\r\n }\r\n}\r\n\r\n/* ======================================================\r\n ChangeCellValueHandler\r\n ====================================================== */\r\n\r\n/**\r\n * Remote visibility (`resolveOn`) projection shared by the cell-change, dynamic\r\n * re-projection and row-activation handlers.\r\n */\r\nexport async function applyRemoteVisibilityRules(\r\ndynamic: DynamicConfig | undefined,\r\ninput: {\r\ntable: Table;\r\nrowId: RowId;\r\nchangedColumnId: ColumnId;\r\nnewValue: unknown;\r\n/** When false (e.g. row activate / re-project), keep existing dependent cell values. */\r\nclearDependents?: boolean;\r\n},\r\n audit?: AuditLogger,\r\n): Promise<boolean> {\r\nconst {\r\n table,\r\n rowId,\r\n changedColumnId,\r\n newValue,\r\n clearDependents = true,\r\n} = input;\r\n\r\nconst meta = dynamic?.columnMeta;\r\nif (!meta) return true;\r\nconst colKey = `${table.getActiveCollectionName() ?? 'default'}_${changedColumnId.value}`;\r\nconst changedMeta = meta.get(colKey) ?? meta.get(changedColumnId.value);\r\nconst resolveOn = changedMeta?.resolveOn;\r\nif (!resolveOn) return true;\r\nif (resolveOn.fieldName !== changedColumnId.value) return true;\r\n\r\nconst row = table.getRows().find(r => r.id.value === rowId.value);\r\nif (!row) return true;\r\n\r\nconst rowValues: Record<string, unknown> = {};\r\nfor (const [colId, cell] of row.getCells().entries()) {\r\n rowValues[colId] = cell.getValue();\r\n}\r\nif (newValue == null || newValue === '') return true;\r\nconst params =\r\n typeof resolveOn.buildParams === 'function'\r\n ? resolveOn.buildParams(rowValues)\r\n : { value: newValue };\r\nlet response: unknown;\r\nlet failed = false;\r\ntry {\r\n response = await dynamic!.remoteApi.request({\r\n endpoint: resolveOn.endpoint,\r\n params,\r\n method: 'POST',\r\n });\r\n} catch (error) {\r\n // Backend failure must never abort the cell edit: keep the current\r\n // visibility flags, still clear stale dependents, and report.\r\n failed = true;\r\n if (audit) logError(audit, error, `resolveOn[${resolveOn.endpoint}]`);\r\n}\r\n\r\nif (!failed) resolveOn.getResponse?.(response, row);\r\nconst flags: Record<string, boolean> = failed\r\n ? {}\r\n : (resolveOn.mapFlags?.(response) ?? {});\r\n\r\nconst toShow: ColumnSchema[] = [];\r\nconst visibilityCondition: Record<string, boolean> = {};\r\nconst activeCollection = table.getActiveCollectionName() ?? 'default';\r\n\r\nmeta.forEach(colCfg => {\r\n // Collection guard — same rationale as applyDynamicProjection: configs of\r\n // other collections must not react to this collection's cell changes.\r\n if ((colCfg.fieldCollection ?? 'default') !== activeCollection) return;\r\n const v = colCfg.visibility;\r\n\r\n if (\r\n !failed &&\r\n v?.kind === 'whenRemoteFlag' &&\r\n v.sourceFieldName === changedColumnId.value\r\n ) {\r\n const colId = new ColumnId(colCfg.fieldName);\r\n const schema = table.getColumnSchema(colId);\r\n const flagValue = flags[v.flag] ?? false;\r\n\r\n // کلید visibilityCondition باید fieldName باشد چون UI (cellRenderer /\r\n // moveActiveCell / isInitiallyHidden) با col.fieldName چک میکند.\r\n visibilityCondition[colCfg.fieldName] = flagValue;\r\n\r\n if (flagValue && schema) {\r\n toShow.push({ ...schema, hidden: false });\r\n }\r\n }\r\n\r\n const dependency = colCfg.dynamicSource?.dependsOn;\r\n if (\r\n clearDependents &&\r\n dependency &&\r\n dependency.includes(changedColumnId.value) &&\r\n !Object.hasOwn(visibilityCondition, colCfg.fieldName) &&\r\n colCfg.visibility?.kind !== 'whenTableType' &&\r\n colCfg.visibility?.kind !== 'whenCollection'\r\n ) {\r\n const cell = row.getCell(colCfg.fieldName);\r\n cell?.changeValue(null);\r\n cell?.changeDisplay(null);\r\n }\r\n});\r\n\r\nif (toShow.length > 0) {\r\n table.addColumns(toShow);\r\n}\r\n\r\nif (!failed) row.setVisibilityCondition(visibilityCondition);\r\nreturn !failed;\r\n}\r\n\r\nexport class ChangeCellValueHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n private readonly dynamic?: DynamicConfig,\r\n ) { }\r\n\r\n async execute(\r\n command: ChangeCellValueCommand,\r\n actor: Actor,\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n const rowId = new RowId(command.rowId);\r\n const columnId = new ColumnId(command.columnId);\r\n /* 1. schema existence */\r\n const schema = table.getColumnSchema(columnId);\r\n if (!schema) {\r\n throw new DomainError('COLUMN_NOT_FOUND', 'Column does not exist', {\r\n columnId: columnId.value,\r\n });\r\n }\r\n /* 2. editable policy */\r\n if (schema.editable === false) {\r\n throw new DomainError('NOT_EDITABLE', 'Cell is not editable', {\r\n rowId: rowId.value,\r\n columnId: columnId.value,\r\n });\r\n }\r\n /* 3. permission policy */\r\n if (\r\n !this.permissionPolicy.canChangeCell({\r\n actor,\r\n rowId: command.rowId,\r\n columnId: command.columnId,\r\n })\r\n ) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to change this cell',\r\n { actor, rowId: rowId.value, columnId: columnId.value },\r\n );\r\n }\r\n /* 4. type validation */\r\n const validated = this.validateCellValue(schema.fieldType, command.newValue);\r\n /* 5. domain mutation */\r\n const domainEvent = table.changeCell(rowId, columnId, validated.value);\r\n // Keep existing display unless a dedicated display-change command updates it.\r\n // Writing the raw value here wipes select labels (e.g. account title).\r\n if (!domainEvent) {\r\n throw new DomainError(\r\n 'CELL_NOT_FOUND',\r\n 'Cell not found or value not changed',\r\n { rowId: rowId.value, columnId: columnId.value },\r\n );\r\n }\r\n /* 6. application-level side effects */\r\n if (this.dynamic) {\r\n await this.applyComputedColumns({\r\n table,\r\n rowId,\r\n changedColumnId: columnId,\r\n remoteApi: this.dynamic.remoteApi,\r\n });\r\n await this.applyRemoteVisibilityRules({\r\n table,\r\n rowId,\r\n changedColumnId: columnId,\r\n newValue: command.newValue,\r\n });\r\n this.applyDynamicProjection({\r\n table,\r\n rowId,\r\n changedColumnId: columnId,\r\n validatedValue: command.newValue,\r\n });\r\n }\r\n\r\n /* 7. RowState management */\r\n const state = table\r\n .getRows()\r\n .find(r => r.id.value === rowId.value)\r\n ?.getCells()\r\n .get('RowState')\r\n ?.getValue();\r\n\r\n if (state === RowStateEnum.Unchanged) {\r\n table.changeCell(rowId, new ColumnId('RowState'), RowStateEnum.Modified);\r\n table.changeDisplay(rowId, new ColumnId('RowState'), RowStateEnum.Modified);\r\n }\r\n\r\n /* 8. persist */\r\n await this.repo.save(command.store, table);\r\n\r\n /* 9. output event */\r\n const out: TableEvent = {\r\n type: 'CELL_CHANGED',\r\n tableId: command.tableKey,\r\n rowId: domainEvent.rowId.value,\r\n columnId: domainEvent.columnId.value,\r\n newValue: domainEvent.newValue,\r\n previousValue: domainEvent.previousValue,\r\n };\r\n this.audit.log({ type: 'CELL_CHANGED', message: out.type, payload: out });\r\n return [out];\r\n\r\n } catch (e) {\r\n logError(this.audit, e, `ChangeCellValueHandler[${command.tableKey}:${command.rowId}:${command.columnId}]`);\r\n return [];\r\n }\r\n }\r\n\r\n /* ── helpers ─────────────────────────────────────────────────────── */\r\n\r\n private applyRemoteVisibilityRules(input: Parameters<typeof applyRemoteVisibilityRules>[1]): Promise<boolean> {\r\n return applyRemoteVisibilityRules(this.dynamic, input, this.audit);\r\n }\r\n\r\n private async applyComputedColumns(input: {\r\n table: Table;\r\n rowId: RowId;\r\n changedColumnId: ColumnId;\r\n remoteApi: RemoteApi;\r\n }): Promise<void> {\r\n const { table, rowId, changedColumnId, remoteApi } = input;\r\n const meta = this.dynamic!.columnMeta;\r\n\r\n const computedColumns = Array.from(meta.values()).filter(\r\n (c): c is ColumnSchema & {\r\n computed: NonNullable<ColumnSchema['computed']>;\r\n } => c.computed != null,\r\n );\r\n\r\n if (computedColumns.length === 0) return;\r\n\r\n const row = table.getRows().find(r => r.id.value === rowId.value);\r\n if (!row) return;\r\n\r\n const rowValues: Record<string, unknown> = {};\r\n for (const [colId, cell] of row.getCells().entries()) {\r\n rowValues[colId] = cell.getValue();\r\n }\r\n\r\n const dependents = new Map<string, typeof computedColumns>();\r\n for (const col of computedColumns) {\r\n for (const dep of col.computed.dependsOn ?? []) {\r\n if (!dependents.has(dep)) dependents.set(dep, []);\r\n dependents.get(dep)!.push(col);\r\n }\r\n }\r\n\r\n const queue: string[] = [changedColumnId.value];\r\n const visited = new Set<string>();\r\n let safetyCounter = 0;\r\n const MAX = computedColumns.length + 1;\r\n\r\n while (queue.length > 0) {\r\n if (safetyCounter++ > MAX) {\r\n throw new Error('Computed cycle detected');\r\n }\r\n const source = queue.shift()!;\r\n const targets = dependents.get(source) ?? [];\r\n\r\n for (const colCfg of targets) {\r\n const targetField = colCfg.fieldName;\r\n const targetColId = new ColumnId(targetField);\r\n const schema = table.getColumnSchema(targetColId);\r\n if (!schema || !colCfg.computed) continue;\r\n\r\n let newValue: unknown;\r\n try {\r\n const rawValue = colCfg.computed.compute(rowValues, remoteApi);\r\n newValue = rawValue instanceof Promise ? await rawValue : rawValue;\r\n } catch (error) {\r\n // A failing remote lookup inside `compute` must not discard the edit:\r\n // keep the target's current value and report.\r\n logError(this.audit, error, `computed[${targetField}]`);\r\n continue;\r\n }\r\n const validated = this.validateCellValue(schema.fieldType, newValue);\r\n\r\n if (validated.value instanceof Promise) {\r\n throw new Error(\r\n `Computed column \"${targetField}\" returned a Promise after validation`,\r\n );\r\n }\r\n\r\n const prev = rowValues[targetField];\r\n if (Object.is(prev, validated.value)) continue;\r\n\r\n table.changeCell(rowId, targetColId, validated.value);\r\n\r\n if (schema.displayFormat) {\r\n const validatedDisplay = this.validateCellValue(\r\n schema.fieldType,\r\n schema.displayFormat(newValue),\r\n );\r\n table.changeDisplay(rowId, targetColId, validatedDisplay.value);\r\n } else {\r\n table.changeDisplay(rowId, targetColId, validated.value);\r\n }\r\n\r\n rowValues[targetField] = validated.value;\r\n queue.push(targetField);\r\n visited.add(targetField);\r\n }\r\n }\r\n }\r\n\r\n private validateCellValue(type: FieldType, value: unknown) {\r\n switch (type) {\r\n case 'text':\r\n case 'textArea':\r\n case 'description':\r\n case 'date':\r\n return typeof value === 'string'\r\n ? { ok: true as const, value }\r\n : { ok: false as const, error: { message: 'Expected string', details: { value } }, value };\r\n\r\n case 'static':\r\n return { ok: true as const, value };\r\n\r\n case 'checkbox':\r\n return typeof value === 'boolean'\r\n ? { ok: true as const, value }\r\n : { ok: false as const, error: { message: 'Expected boolean', details: { value } }, value };\r\n\r\n case 'number':\r\n case 'price':\r\n case 'select':\r\n case 'selectOption': {\r\n if (value === '' || value === undefined) {\r\n return { ok: true as const, value };\r\n }\r\n const n = typeof value === 'number' ? value : Number(value);\r\n return Number.isFinite(n)\r\n ? { ok: true as const, value: n }\r\n : { ok: false as const, error: { message: 'Expected number', details: { value } }, value };\r\n }\r\n\r\n default:\r\n return { ok: false as const, error: { message: 'Unsupported type', details: { type, value } }, value };\r\n }\r\n }\r\n\r\n private applyDynamicProjection(input: {\r\n table: Table;\r\n rowId: RowId;\r\n changedColumnId: ColumnId;\r\n validatedValue: unknown;\r\n }): void {\r\n const { table, changedColumnId, validatedValue } = input;\r\n const activeCollection = table.getActiveCollectionName() ?? 'default';\r\n this.dynamic!.columnMeta.forEach((colMeta, key) => {\r\n // Collection guard: a column config may only be projected onto the table\r\n // when it belongs to the ACTIVE collection. Twin configs of other\r\n // collections must never leak their dynamicSource/visibility into this\r\n // collection's column map — a value in one tab must not unhide/reconfigure\r\n // the same-named column in other tabs.\r\n if ((colMeta.fieldCollection ?? 'default') !== activeCollection) return;\r\n const col = table.getColumnSchema(new ColumnId(colMeta.fieldName));\r\n\r\n const depends = colMeta.dynamicSource?.dependsOn;\r\n if (depends?.includes(changedColumnId.value)) {\r\n const { dynamicSource } = colMeta;\r\n const { endpoint, dependsOn, ...restDynamic } = dynamicSource ?? {};\r\n const base = col ?? colMeta;\r\n table.setColumnSchema(new ColumnId(base.fieldName), {\r\n ...base,\r\n dynamicSelectFilterOption:\r\n base.dynamicSelectFilterOption ?? (() => true),\r\n dynamicSource: {\r\n endpoint: endpoint ?? '',\r\n ...restDynamic,\r\n dependOn: {\r\n fieldName: changedColumnId.value,\r\n value: validatedValue,\r\n },\r\n },\r\n });\r\n }\r\n\r\n if (\r\n colMeta.visibility?.kind === 'whenFieldTruthy' &&\r\n colMeta.visibility.fieldName === changedColumnId.value &&\r\n col\r\n ) {\r\n table.setColumnSchema(new ColumnId(colMeta.fieldName), col);\r\n }\r\n });\r\n }\r\n}\r\n\r\n/* ======================================================\r\n ChangeCellDisplayValueHandler\r\n ====================================================== */\r\n\r\nexport class ChangeCellDisplayValueHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n ) { }\r\n\r\n async execute(\r\n command: ChangeCellDisplayValueCommand,\r\n actor: Actor,\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n const rowId = new RowId(command.rowId);\r\n const columnId = new ColumnId(command.columnId);\r\n\r\n const schema = table.getColumnSchema(columnId);\r\n if (!schema) {\r\n throw new DomainError('COLUMN_NOT_FOUND', 'Column does not exist', {\r\n columnId: columnId.value,\r\n });\r\n }\r\n\r\n if (schema.editable === false) {\r\n throw new DomainError('NOT_EDITABLE', 'Cell is not editable', {\r\n rowId: rowId.value,\r\n columnId: columnId.value,\r\n });\r\n }\r\n\r\n if (\r\n !this.permissionPolicy.canChangeCell({\r\n actor,\r\n rowId: command.rowId,\r\n columnId: command.columnId,\r\n })\r\n ) {\r\n throw new DomainError(\r\n 'FORBIDDEN',\r\n 'Actor is not allowed to change this cell',\r\n { actor, rowId: rowId.value, columnId: columnId.value },\r\n );\r\n }\r\n\r\n const domainEvent = table.changeDisplay(rowId, columnId, command.newValue);\r\n\r\n if (!domainEvent) {\r\n throw new DomainError(\r\n 'CELL_NOT_FOUND',\r\n 'Cell not found or value not changed',\r\n { rowId: rowId.value, columnId: columnId.value },\r\n );\r\n }\r\n\r\n await this.repo.save(command.store, table);\r\n\r\n const out: TableEvent = {\r\n type: 'CELL_DISPLAY_CHANGED',\r\n tableId: command.tableKey,\r\n rowId: domainEvent.rowId.value,\r\n columnId: domainEvent.columnId.value,\r\n newValue: domainEvent.newValue,\r\n };\r\n this.audit.log({ type: 'CELL_DISPLAY_CHANGED', message: out.type, payload: out });\r\n return [out];\r\n\r\n } catch (e) {\r\n logError(this.audit, e, `ChangeCellDisplayValueHandler[${command.tableKey}:${command.rowId}:${command.columnId}]`);\r\n return [];\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n SaveDescriptionHandler\r\n ====================================================== */\r\n\r\nexport class SaveDescriptionHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n ) { }\r\n\r\n async execute(\r\n command: SaveDescriptionCommand,\r\n actor: Actor,\r\n ): Promise<TableEvent[]> {\r\n const table = await this.repo.getById(command.store, command.tableKey);\r\n try {\r\n const rowId = new RowId(command.rowId);\r\n const domainEvent = table.saveDescription(rowId, command.flag);\r\n\r\n if (!domainEvent) {\r\n throw new DomainError(\r\n 'CELL_NOT_FOUND',\r\n 'Cell not found or value not changed',\r\n { rowId: rowId.value, flag: command.flag },\r\n );\r\n }\r\n\r\n await this.repo.save(command.store, table);\r\n\r\n const out: TableEvent = {\r\n type: 'ROW_DESCRIPTION_SAVED',\r\n tableId: command.tableKey,\r\n rowId: domainEvent.rowId.value,\r\n description: command.flag,\r\n };\r\n this.audit.log({ type: 'INFORMATION', message: out.type, payload: out });\r\n return [out];\r\n\r\n } catch (e) {\r\n logError(this.audit, e, `SaveDescriptionHandler[${command.tableKey}:${command.rowId}]`);\r\n return [];\r\n }\r\n }\r\n}\r\n\r\n/* ======================================================\r\n ApplyDynamicProjectionHandler\r\n ====================================================== */\r\n\r\nexport class ApplyDynamicProjectionHandler {\r\n constructor(\r\n private readonly repo: TableRepository,\r\n private readonly audit: AuditLogger,\r\n private readonly permissionPolicy: PermissionPolicy,\r\n private readonly dynamic?: DynamicConfig,\r\n ) { }\r\n\r\n async execute(\r\n command: ApplyDynamicProjectionCommand,\r\n actor: Actor,\r\n ): Promise<TableEvent[]> {\r\n const { store, tableKey, rowId, columnId } = command;\r\n const table = await this.repo.getById(store, tableKey);\r\n\r\n try {\r\n const row = table.getRow(rowId);\r\n if (!row) {\r\n throw new DomainError('ROW_NOT_FOUND', `Row ${rowId} not found`, { rowId });\r\n }\r\n\r\n const cell = row.getCell(columnId);\r\n if (!cell) {\r\n throw new DomainError('CELL_NOT_FOUND', `Cell ${columnId} not found`, { columnId });\r\n }\r\n\r\n const colValue = cell.getValue();\r\n const previousValue = colValue;\r\n const newRowId = new RowId(rowId);\r\n const newColumnId = new ColumnId(columnId);\r\n\r\n if (this.dynamic) {\r\n await this.applyComputedColumns({\r\n table,\r\n rowId: newRowId,\r\n changedColumnId: newColumnId,\r\n remoteApi: this.dynamic.remoteApi,\r\n });\r\n await this.applyRemoteVisibilityRules({\r\n table,\r\n rowId: newRowId,\r\n changedColumnId: newColumnId,\r\n newValue: colValue,\r\n clearDependents: false,\r\n });\r\n this.applyDynamicProjection({\r\n table,\r\n rowId: newRowId,\r\n changedColumnId: newColumnId,\r\n validatedValue: colValue,\r\n });\r\n }\r\n\r\n /* RowState management */\r\n const state = table\r\n .getRows()\r\n .find(r => r.id.value === newRowId.value)\r\n ?.getCells()\r\n .get('RowState')\r\n ?.getValue();\r\n\r\n if (state === RowStateEnum.Unchanged) {\r\n table.changeCell(newRowId, new ColumnId('RowState'), RowStateEnum.Modified);\r\n table.changeDisplay(newRowId, new ColumnId('RowState'), RowStateEnum.Modified);\r\n }\r\n\r\n await this.repo.save(store, table);\r\n\r\n const out: TableEvent = {\r\n type: 'CELL_CHANGED',\r\n tableId: tableKey,\r\n rowId: newRowId.value,\r\n columnId: newColumnId.value,\r\n newValue: colValue,\r\n previousValue,\r\n };\r\n this.audit.log({ type: 'CELL_CHANGED', message: out.type, payload: out });\r\n return [out];\r\n\r\n } catch (e) {\r\n logError(this.audit, e, `ApplyDynamicProjectionHandler[${tableKey}:${rowId}:${columnId}]`);\r\n return [];\r\n }\r\n }\r\n\r\n /* ── helpers (identical to ChangeCellValueHandler) ───────────────── */\r\n\r\n private applyRemoteVisibilityRules(input: Parameters<typeof applyRemoteVisibilityRules>[1]): Promise<boolean> {\r\n return applyRemoteVisibilityRules(this.dynamic, input, this.audit);\r\n }\r\n\r\n private async applyComputedColumns(input: {\r\n table: Table;\r\n rowId: RowId;\r\n changedColumnId: ColumnId;\r\n remoteApi: RemoteApi;\r\n }): Promise<void> {\r\n const { table, rowId, changedColumnId, remoteApi } = input;\r\n const meta = this.dynamic!.columnMeta;\r\n\r\n const computedColumns = Array.from(meta.values()).filter(\r\n (c): c is ColumnSchema & {\r\n computed: NonNullable<ColumnSchema['computed']>;\r\n } => c.computed != null,\r\n );\r\n\r\n if (computedColumns.length === 0) return;\r\n\r\n const row = table.getRows().find(r => r.id.value === rowId.value);\r\n if (!row) return;\r\n\r\n const rowValues: Record<string, unknown> = {};\r\n for (const [colId, cell] of row.getCells().entries()) {\r\n rowValues[colId] = cell.getValue();\r\n }\r\n\r\n const dependents = new Map<string, typeof computedColumns>();\r\n for (const col of computedColumns) {\r\n for (const dep of col.computed.dependsOn ?? []) {\r\n if (!dependents.has(dep)) dependents.set(dep, []);\r\n dependents.get(dep)!.push(col);\r\n }\r\n }\r\n\r\n const queue: string[] = [changedColumnId.value];\r\n const visited = new Set<string>();\r\n let safetyCounter = 0;\r\n const MAX = computedColumns.length + 1;\r\n\r\n while (queue.length > 0) {\r\n if (safetyCounter++ > MAX) throw new Error('Computed cycle detected');\r\n const source = queue.shift()!;\r\n const targets = dependents.get(source) ?? [];\r\n\r\n for (const colCfg of targets) {\r\n const targetField = colCfg.fieldName;\r\n const targetColId = new ColumnId(targetField);\r\n const schema = table.getColumnSchema(targetColId);\r\n if (!schema || !colCfg.computed) continue;\r\n\r\n let newValue: unknown;\r\n try {\r\n const rawValue = colCfg.computed.compute(rowValues, remoteApi);\r\n newValue = rawValue instanceof Promise ? await rawValue : rawValue;\r\n } catch (error) {\r\n // A failing remote lookup inside `compute` must not discard the edit:\r\n // keep the target's current value and report.\r\n logError(this.audit, error, `computed[${targetField}]`);\r\n continue;\r\n }\r\n const validated = this.validateCellValue(schema.fieldType, newValue);\r\n\r\n if (validated.value instanceof Promise) {\r\n throw new Error(`Computed column \"${targetField}\" returned a Promise after validation`);\r\n }\r\n\r\n const prev = rowValues[targetField];\r\n if (Object.is(prev, validated.value)) continue;\r\n\r\n table.changeCell(rowId, targetColId, validated.value);\r\n\r\n if (schema.displayFormat) {\r\n const validatedDisplay = this.validateCellValue(\r\n schema.fieldType,\r\n schema.displayFormat(newValue),\r\n );\r\n table.changeDisplay(rowId, targetColId, validatedDisplay.value);\r\n } else {\r\n table.changeDisplay(rowId, targetColId, validated.value);\r\n }\r\n\r\n rowValues[targetField] = validated.value;\r\n queue.push(targetField);\r\n visited.add(targetField);\r\n }\r\n }\r\n }\r\n\r\n private validateCellValue(type: FieldType, value: unknown) {\r\n switch (type) {\r\n case 'text':\r\n case 'textArea':\r\n case 'description':\r\n case 'date':\r\n return typeof value === 'string'\r\n ? { ok: true as const, value }\r\n : { ok: false as const, error: { message: 'Expected string', details: { value } }, value };\r\n\r\n case 'static':\r\n return { ok: true as const, value };\r\n\r\n case 'checkbox':\r\n return typeof value === 'boolean'\r\n ? { ok: true as const, value }\r\n : { ok: false as const, error: { message: 'Expected boolean', details: { value } }, value };\r\n\r\n case 'number':\r\n case 'price':\r\n case 'select':\r\n case 'selectOption': {\r\n if (value === '' || value === undefined) return { ok: true as const, value };\r\n const n = typeof value === 'number' ? value : Number(value);\r\n return Number.isFinite(n)\r\n ? { ok: true as const, value: n }\r\n : { ok: false as const, error: { message: 'Expected number', details: { value } }, value };\r\n }\r\n\r\n default:\r\n return { ok: false as const, error: { message: 'Unsupported type', details: { type, value } }, value };\r\n }\r\n }\r\n\r\n private applyDynamicProjection(input: {\r\n table: Table;\r\n rowId: RowId;\r\n changedColumnId: ColumnId;\r\n validatedValue: unknown;\r\n }): void {\r\n const { table, changedColumnId, validatedValue } = input;\r\n const activeCollection = table.getActiveCollectionName() ?? 'default';\r\n this.dynamic!.columnMeta.forEach((colMeta, key) => {\r\n // Collection guard: a column config may only be projected onto the table\r\n // when it belongs to the ACTIVE collection. Twin configs of other\r\n // collections must never leak their dynamicSource/visibility into this\r\n // collection's column map — a value in one tab must not unhide/reconfigure\r\n // the same-named column in other tabs.\r\n if ((colMeta.fieldCollection ?? 'default') !== activeCollection) return;\r\n const col = table.getColumnSchema(new ColumnId(colMeta.fieldName));\r\n\r\n const depends = colMeta.dynamicSource?.dependsOn;\r\n if (depends?.includes(changedColumnId.value)) {\r\n const { dynamicSource } = colMeta;\r\n const { endpoint, dependsOn, ...restDynamic } = dynamicSource ?? {};\r\n const base = col ?? colMeta;\r\n table.setColumnSchema(new ColumnId(base.fieldName), {\r\n ...base,\r\n dynamicSelectFilterOption:\r\n base.dynamicSelectFilterOption ?? (() => true),\r\n dynamicSource: {\r\n endpoint: endpoint ?? '',\r\n ...restDynamic,\r\n dependOn: {\r\n fieldName: changedColumnId.value,\r\n value: validatedValue,\r\n },\r\n },\r\n });\r\n }\r\n\r\n if (\r\n colMeta.visibility?.kind === 'whenFieldTruthy' &&\r\n colMeta.visibility.fieldName === changedColumnId.value &&\r\n col\r\n ) {\r\n table.setColumnSchema(new ColumnId(colMeta.fieldName), col);\r\n }\r\n });\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
// engine/dataOps/sortModel.ts
|
|
2
|
+
var INDEX_COL_ID = "index";
|
|
3
|
+
var FA_COLLATOR = new Intl.Collator("fa", {
|
|
4
|
+
numeric: true,
|
|
5
|
+
sensitivity: "base"
|
|
6
|
+
});
|
|
7
|
+
var EASTERN_DIGITS = /[۰-۹٠-٩]/g;
|
|
8
|
+
var EASTERN_DIGIT_MAP = {
|
|
9
|
+
"\u06F0": "0",
|
|
10
|
+
"\u06F1": "1",
|
|
11
|
+
"\u06F2": "2",
|
|
12
|
+
"\u06F3": "3",
|
|
13
|
+
"\u06F4": "4",
|
|
14
|
+
"\u06F5": "5",
|
|
15
|
+
"\u06F6": "6",
|
|
16
|
+
"\u06F7": "7",
|
|
17
|
+
"\u06F8": "8",
|
|
18
|
+
"\u06F9": "9",
|
|
19
|
+
"\u0660": "0",
|
|
20
|
+
"\u0661": "1",
|
|
21
|
+
"\u0662": "2",
|
|
22
|
+
"\u0663": "3",
|
|
23
|
+
"\u0664": "4",
|
|
24
|
+
"\u0665": "5",
|
|
25
|
+
"\u0666": "6",
|
|
26
|
+
"\u0667": "7",
|
|
27
|
+
"\u0668": "8",
|
|
28
|
+
"\u0669": "9"
|
|
29
|
+
};
|
|
30
|
+
function normalizeDigits(value) {
|
|
31
|
+
return value.replace(EASTERN_DIGITS, (ch) => EASTERN_DIGIT_MAP[ch] ?? ch);
|
|
32
|
+
}
|
|
33
|
+
function isBlankSortValue(value) {
|
|
34
|
+
if (value == null) return true;
|
|
35
|
+
if (typeof value === "number" && Number.isNaN(value)) return true;
|
|
36
|
+
if (typeof value === "string" && value.trim() === "") return true;
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
function toNumber(value) {
|
|
40
|
+
if (typeof value === "number") {
|
|
41
|
+
return Number.isFinite(value) ? value : null;
|
|
42
|
+
}
|
|
43
|
+
if (typeof value === "boolean") return value ? 1 : 0;
|
|
44
|
+
if (typeof value === "string") {
|
|
45
|
+
const n = Number(normalizeDigits(value).replace(/,/g, "").trim());
|
|
46
|
+
return Number.isFinite(n) ? n : null;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
function toDateKey(value) {
|
|
51
|
+
if (value instanceof Date) {
|
|
52
|
+
const t = value.getTime();
|
|
53
|
+
return Number.isNaN(t) ? null : t;
|
|
54
|
+
}
|
|
55
|
+
if (typeof value === "number" && Number.isFinite(value)) return value;
|
|
56
|
+
if (typeof value === "string") {
|
|
57
|
+
const text = normalizeDigits(value).trim();
|
|
58
|
+
if (!text) return null;
|
|
59
|
+
const parsed = Date.parse(text);
|
|
60
|
+
if (!Number.isNaN(parsed)) return parsed;
|
|
61
|
+
const digits = text.replace(/\D/g, "");
|
|
62
|
+
if (digits.length >= 8) return Number(digits.slice(0, 8));
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
function toBoolean(value) {
|
|
67
|
+
if (typeof value === "boolean") return value;
|
|
68
|
+
if (value === 1 || value === "1" || value === "true") return true;
|
|
69
|
+
if (value === 0 || value === "0" || value === "false") return false;
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
function compareText(a, b) {
|
|
73
|
+
return FA_COLLATOR.compare(String(a), String(b));
|
|
74
|
+
}
|
|
75
|
+
function compareFinite(a, b) {
|
|
76
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
77
|
+
}
|
|
78
|
+
function compareTypedValues(a, b, fieldType) {
|
|
79
|
+
switch (fieldType) {
|
|
80
|
+
case "number":
|
|
81
|
+
case "price":
|
|
82
|
+
case "index": {
|
|
83
|
+
const na = toNumber(a);
|
|
84
|
+
const nb = toNumber(b);
|
|
85
|
+
if (na == null && nb == null) return compareText(a, b);
|
|
86
|
+
if (na == null) return 1;
|
|
87
|
+
if (nb == null) return -1;
|
|
88
|
+
return compareFinite(na, nb);
|
|
89
|
+
}
|
|
90
|
+
case "date": {
|
|
91
|
+
const da = toDateKey(a);
|
|
92
|
+
const db = toDateKey(b);
|
|
93
|
+
if (da == null && db == null) return compareText(a, b);
|
|
94
|
+
if (da == null) return 1;
|
|
95
|
+
if (db == null) return -1;
|
|
96
|
+
return compareFinite(da, db);
|
|
97
|
+
}
|
|
98
|
+
case "checkbox": {
|
|
99
|
+
const ba = toBoolean(a);
|
|
100
|
+
const bb = toBoolean(b);
|
|
101
|
+
if (ba == null && bb == null) return compareText(a, b);
|
|
102
|
+
if (ba == null) return 1;
|
|
103
|
+
if (bb == null) return -1;
|
|
104
|
+
return Number(ba) - Number(bb);
|
|
105
|
+
}
|
|
106
|
+
default:
|
|
107
|
+
return compareText(a, b);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function compareSortValues(a, b, fieldType, comparator) {
|
|
111
|
+
if (comparator) return comparator(a, b);
|
|
112
|
+
return compareTypedValues(a, b, fieldType);
|
|
113
|
+
}
|
|
114
|
+
function isSortDirection(value) {
|
|
115
|
+
return value === "asc" || value === "desc";
|
|
116
|
+
}
|
|
117
|
+
function resolveKeys(sortModel) {
|
|
118
|
+
const keys = [];
|
|
119
|
+
const seen = /* @__PURE__ */ new Set();
|
|
120
|
+
for (const item of sortModel) {
|
|
121
|
+
if (!item || typeof item.colId !== "string" || item.colId.length === 0) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (!isSortDirection(item.sort) || seen.has(item.colId)) continue;
|
|
125
|
+
seen.add(item.colId);
|
|
126
|
+
keys.push({ colId: item.colId, sort: item.sort });
|
|
127
|
+
}
|
|
128
|
+
if (!seen.has(INDEX_COL_ID)) {
|
|
129
|
+
keys.push({ colId: INDEX_COL_ID, sort: "asc" });
|
|
130
|
+
}
|
|
131
|
+
return keys;
|
|
132
|
+
}
|
|
133
|
+
function applySort(rowIds, sortModel, accessor) {
|
|
134
|
+
const keys = resolveKeys(sortModel);
|
|
135
|
+
const decorated = rowIds.map((rowId, originalIndex) => ({
|
|
136
|
+
rowId,
|
|
137
|
+
originalIndex
|
|
138
|
+
}));
|
|
139
|
+
decorated.sort((left, right) => {
|
|
140
|
+
for (const key of keys) {
|
|
141
|
+
const a = accessor.getValue(left.rowId, key.colId);
|
|
142
|
+
const b = accessor.getValue(right.rowId, key.colId);
|
|
143
|
+
const aBlank = isBlankSortValue(a);
|
|
144
|
+
const bBlank = isBlankSortValue(b);
|
|
145
|
+
if (aBlank || bBlank) {
|
|
146
|
+
if (aBlank && bBlank) continue;
|
|
147
|
+
return aBlank ? 1 : -1;
|
|
148
|
+
}
|
|
149
|
+
const fieldType = accessor.getFieldType?.(key.colId) ?? (key.colId === INDEX_COL_ID ? "index" : void 0);
|
|
150
|
+
const cmp = compareSortValues(
|
|
151
|
+
a,
|
|
152
|
+
b,
|
|
153
|
+
fieldType,
|
|
154
|
+
accessor.getComparator?.(key.colId)
|
|
155
|
+
);
|
|
156
|
+
if (cmp !== 0) return key.sort === "desc" ? -cmp : cmp;
|
|
157
|
+
}
|
|
158
|
+
return left.originalIndex - right.originalIndex;
|
|
159
|
+
});
|
|
160
|
+
return decorated.map((row) => row.rowId);
|
|
161
|
+
}
|
|
162
|
+
function compareRowIdsForSort(leftId, rightId, sortModel, accessor) {
|
|
163
|
+
const keys = resolveKeys(sortModel);
|
|
164
|
+
for (const key of keys) {
|
|
165
|
+
const a = accessor.getValue(leftId, key.colId);
|
|
166
|
+
const b = accessor.getValue(rightId, key.colId);
|
|
167
|
+
const aBlank = isBlankSortValue(a);
|
|
168
|
+
const bBlank = isBlankSortValue(b);
|
|
169
|
+
if (aBlank || bBlank) {
|
|
170
|
+
if (aBlank && bBlank) continue;
|
|
171
|
+
return aBlank ? 1 : -1;
|
|
172
|
+
}
|
|
173
|
+
const fieldType = accessor.getFieldType?.(key.colId) ?? (key.colId === INDEX_COL_ID ? "index" : void 0);
|
|
174
|
+
const cmp = compareSortValues(
|
|
175
|
+
a,
|
|
176
|
+
b,
|
|
177
|
+
fieldType,
|
|
178
|
+
accessor.getComparator?.(key.colId)
|
|
179
|
+
);
|
|
180
|
+
if (cmp !== 0) return key.sort === "desc" ? -cmp : cmp;
|
|
181
|
+
}
|
|
182
|
+
return leftId - rightId;
|
|
183
|
+
}
|
|
184
|
+
function findSortedInsertIndex(orderedIds, rowId, sortModel, accessor) {
|
|
185
|
+
let lo = 0;
|
|
186
|
+
let hi = orderedIds.length;
|
|
187
|
+
while (lo < hi) {
|
|
188
|
+
const mid = lo + hi >> 1;
|
|
189
|
+
const midId = orderedIds[mid];
|
|
190
|
+
if (compareRowIdsForSort(midId, rowId, sortModel, accessor) <= 0) {
|
|
191
|
+
lo = mid + 1;
|
|
192
|
+
} else {
|
|
193
|
+
hi = mid;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return lo;
|
|
197
|
+
}
|
|
198
|
+
var HEADER_SORT_CLICK_MAX_MOVE_PX = 5;
|
|
199
|
+
function shouldCommitHeaderSortClick(movedPx) {
|
|
200
|
+
return Number.isFinite(movedPx) && movedPx < HEADER_SORT_CLICK_MAX_MOVE_PX;
|
|
201
|
+
}
|
|
202
|
+
function cycleSortModel(current, colId, options = {}) {
|
|
203
|
+
if (typeof colId !== "string" || colId.length === 0) {
|
|
204
|
+
return current.slice();
|
|
205
|
+
}
|
|
206
|
+
if (colId === INDEX_COL_ID) return current.slice();
|
|
207
|
+
const multi = Boolean(options.multi);
|
|
208
|
+
const existing = current.findIndex((item2) => item2.colId === colId);
|
|
209
|
+
if (!multi) {
|
|
210
|
+
const only = current.length === 1 && current[0]?.colId === colId ? current[0] : null;
|
|
211
|
+
if (!only) return [{ colId, sort: "asc" }];
|
|
212
|
+
if (only.sort === "asc") return [{ colId, sort: "desc" }];
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
if (existing === -1) {
|
|
216
|
+
return [...current, { colId, sort: "asc" }];
|
|
217
|
+
}
|
|
218
|
+
const item = current[existing];
|
|
219
|
+
if (item?.sort === "asc") {
|
|
220
|
+
return current.map(
|
|
221
|
+
(entry, index) => index === existing ? { colId, sort: "desc" } : entry
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
return current.filter((_, index) => index !== existing);
|
|
225
|
+
}
|
|
226
|
+
function ariaSortForColumn(sortModel, colId) {
|
|
227
|
+
const item = sortModel.find((entry) => entry.colId === colId);
|
|
228
|
+
if (!item) return "none";
|
|
229
|
+
return item.sort === "asc" ? "ascending" : "descending";
|
|
230
|
+
}
|
|
231
|
+
function sortPriorityForColumn(sortModel, colId) {
|
|
232
|
+
const index = sortModel.findIndex((entry) => entry.colId === colId);
|
|
233
|
+
return index >= 0 ? index + 1 : void 0;
|
|
234
|
+
}
|
|
235
|
+
function isHeaderColumnSortable(col) {
|
|
236
|
+
if (col.fieldName === INDEX_COL_ID || col.fieldType === "index") return false;
|
|
237
|
+
if (col.columnDef?.sortable === false) return false;
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export { HEADER_SORT_CLICK_MAX_MOVE_PX, INDEX_COL_ID, applySort, ariaSortForColumn, compareSortValues, compareTypedValues, cycleSortModel, findSortedInsertIndex, isBlankSortValue, isHeaderColumnSortable, normalizeDigits, shouldCommitHeaderSortClick, sortPriorityForColumn };
|
|
242
|
+
//# sourceMappingURL=chunk-AU3RDJYQ.js.map
|
|
243
|
+
//# sourceMappingURL=chunk-AU3RDJYQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../engine/dataOps/sortModel.ts"],"names":["item"],"mappings":"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","file":"chunk-AU3RDJYQ.js","sourcesContent":["import type { FieldType } from '../../domain/types/ColumnSchema';\r\n\r\n/** Document-order column used as the final tie-breaker (PR-89). */\r\nexport const INDEX_COL_ID = 'index';\r\n\r\nexport type SortDirection = 'asc' | 'desc';\r\n\r\nexport type SortModelItem = {\r\n colId: string;\r\n sort: SortDirection;\r\n};\r\n\r\nexport type SortModel = readonly SortModelItem[];\r\n\r\nexport type SortValueComparator = (a: unknown, b: unknown) => number;\r\n\r\nexport type SortAccessor = {\r\n getValue: (rowId: number, colId: string) => unknown;\r\n getFieldType?: (colId: string) => FieldType | undefined;\r\n getComparator?: (colId: string) => SortValueComparator | undefined;\r\n};\r\n\r\nconst FA_COLLATOR = new Intl.Collator('fa', {\r\n numeric: true,\r\n sensitivity: 'base',\r\n});\r\n\r\nconst EASTERN_DIGITS = /[۰-۹٠-٩]/g;\r\nconst EASTERN_DIGIT_MAP: Record<string, string> = {\r\n '۰': '0',\r\n '۱': '1',\r\n '۲': '2',\r\n '۳': '3',\r\n '۴': '4',\r\n '۵': '5',\r\n '۶': '6',\r\n '۷': '7',\r\n '۸': '8',\r\n '۹': '9',\r\n '٠': '0',\r\n '١': '1',\r\n '٢': '2',\r\n '٣': '3',\r\n '٤': '4',\r\n '٥': '5',\r\n '٦': '6',\r\n '٧': '7',\r\n '٨': '8',\r\n '٩': '9',\r\n};\r\n\r\nexport function normalizeDigits(value: string): string {\r\n return value.replace(EASTERN_DIGITS, (ch) => EASTERN_DIGIT_MAP[ch] ?? ch);\r\n}\r\n\r\nexport function isBlankSortValue(value: unknown): boolean {\r\n if (value == null) return true;\r\n if (typeof value === 'number' && Number.isNaN(value)) return true;\r\n if (typeof value === 'string' && value.trim() === '') return true;\r\n return false;\r\n}\r\n\r\nfunction toNumber(value: unknown): number | null {\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : null;\r\n }\r\n if (typeof value === 'boolean') return value ? 1 : 0;\r\n if (typeof value === 'string') {\r\n const n = Number(normalizeDigits(value).replace(/,/g, '').trim());\r\n return Number.isFinite(n) ? n : null;\r\n }\r\n return null;\r\n}\r\n\r\nfunction toDateKey(value: unknown): number | null {\r\n if (value instanceof Date) {\r\n const t = value.getTime();\r\n return Number.isNaN(t) ? null : t;\r\n }\r\n if (typeof value === 'number' && Number.isFinite(value)) return value;\r\n if (typeof value === 'string') {\r\n const text = normalizeDigits(value).trim();\r\n if (!text) return null;\r\n const parsed = Date.parse(text);\r\n if (!Number.isNaN(parsed)) return parsed;\r\n const digits = text.replace(/\\D/g, '');\r\n if (digits.length >= 8) return Number(digits.slice(0, 8));\r\n }\r\n return null;\r\n}\r\n\r\nfunction toBoolean(value: unknown): boolean | null {\r\n if (typeof value === 'boolean') return value;\r\n if (value === 1 || value === '1' || value === 'true') return true;\r\n if (value === 0 || value === '0' || value === 'false') return false;\r\n return null;\r\n}\r\n\r\nfunction compareText(a: unknown, b: unknown): number {\r\n return FA_COLLATOR.compare(String(a), String(b));\r\n}\r\n\r\nfunction compareFinite(a: number, b: number): number {\r\n return a < b ? -1 : a > b ? 1 : 0;\r\n}\r\n\r\n/**\r\n * Ascending compare for a FieldType. Blank handling is done by `compareSortValues`.\r\n */\r\nexport function compareTypedValues(\r\n a: unknown,\r\n b: unknown,\r\n fieldType: FieldType | undefined,\r\n): number {\r\n switch (fieldType) {\r\n case 'number':\r\n case 'price':\r\n case 'index': {\r\n const na = toNumber(a);\r\n const nb = toNumber(b);\r\n if (na == null && nb == null) return compareText(a, b);\r\n if (na == null) return 1;\r\n if (nb == null) return -1;\r\n return compareFinite(na, nb);\r\n }\r\n case 'date': {\r\n const da = toDateKey(a);\r\n const db = toDateKey(b);\r\n if (da == null && db == null) return compareText(a, b);\r\n if (da == null) return 1;\r\n if (db == null) return -1;\r\n return compareFinite(da, db);\r\n }\r\n case 'checkbox': {\r\n const ba = toBoolean(a);\r\n const bb = toBoolean(b);\r\n if (ba == null && bb == null) return compareText(a, b);\r\n if (ba == null) return 1;\r\n if (bb == null) return -1;\r\n return Number(ba) - Number(bb);\r\n }\r\n default:\r\n return compareText(a, b);\r\n }\r\n}\r\n\r\nexport function compareSortValues(\r\n a: unknown,\r\n b: unknown,\r\n fieldType: FieldType | undefined,\r\n comparator: SortValueComparator | undefined,\r\n): number {\r\n if (comparator) return comparator(a, b);\r\n return compareTypedValues(a, b, fieldType);\r\n}\r\n\r\nfunction isSortDirection(value: string): value is SortDirection {\r\n return value === 'asc' || value === 'desc';\r\n}\r\n\r\nfunction resolveKeys(sortModel: SortModel): SortModelItem[] {\r\n const keys: SortModelItem[] = [];\r\n const seen = new Set<string>();\r\n for (const item of sortModel) {\r\n if (!item || typeof item.colId !== 'string' || item.colId.length === 0) {\r\n continue;\r\n }\r\n if (!isSortDirection(item.sort) || seen.has(item.colId)) continue;\r\n seen.add(item.colId);\r\n keys.push({ colId: item.colId, sort: item.sort });\r\n }\r\n if (!seen.has(INDEX_COL_ID)) {\r\n keys.push({ colId: INDEX_COL_ID, sort: 'asc' });\r\n }\r\n return keys;\r\n}\r\n\r\n/**\r\n * Pure multi-sort (PR-89). Does not mutate `rowIds`.\r\n * Null/blank values sort last in both directions. `index` is the last\r\n * tie-breaker so document order is preserved when sort keys match.\r\n */\r\nexport function applySort(\r\n rowIds: readonly number[],\r\n sortModel: SortModel,\r\n accessor: SortAccessor,\r\n): number[] {\r\n const keys = resolveKeys(sortModel);\r\n const decorated = rowIds.map((rowId, originalIndex) => ({\r\n rowId,\r\n originalIndex,\r\n }));\r\n\r\n decorated.sort((left, right) => {\r\n for (const key of keys) {\r\n const a = accessor.getValue(left.rowId, key.colId);\r\n const b = accessor.getValue(right.rowId, key.colId);\r\n const aBlank = isBlankSortValue(a);\r\n const bBlank = isBlankSortValue(b);\r\n if (aBlank || bBlank) {\r\n if (aBlank && bBlank) continue;\r\n return aBlank ? 1 : -1;\r\n }\r\n const fieldType =\r\n accessor.getFieldType?.(key.colId) ??\r\n (key.colId === INDEX_COL_ID ? 'index' : undefined);\r\n const cmp = compareSortValues(\r\n a,\r\n b,\r\n fieldType,\r\n accessor.getComparator?.(key.colId),\r\n );\r\n if (cmp !== 0) return key.sort === 'desc' ? -cmp : cmp;\r\n }\r\n return left.originalIndex - right.originalIndex;\r\n });\r\n\r\n return decorated.map((row) => row.rowId);\r\n}\r\n\r\n/**\r\n * Compare two row ids under the same rules as {@link applySort}\r\n * (without original-index stability — uses id as final tie-break).\r\n * Used for O(log n) binary insert into an already-sorted UI index (PR-99).\r\n */\r\nexport function compareRowIdsForSort(\r\n leftId: number,\r\n rightId: number,\r\n sortModel: SortModel,\r\n accessor: SortAccessor,\r\n): number {\r\n const keys = resolveKeys(sortModel);\r\n for (const key of keys) {\r\n const a = accessor.getValue(leftId, key.colId);\r\n const b = accessor.getValue(rightId, key.colId);\r\n const aBlank = isBlankSortValue(a);\r\n const bBlank = isBlankSortValue(b);\r\n if (aBlank || bBlank) {\r\n if (aBlank && bBlank) continue;\r\n return aBlank ? 1 : -1;\r\n }\r\n const fieldType =\r\n accessor.getFieldType?.(key.colId) ??\r\n (key.colId === INDEX_COL_ID ? 'index' : undefined);\r\n const cmp = compareSortValues(\r\n a,\r\n b,\r\n fieldType,\r\n accessor.getComparator?.(key.colId),\r\n );\r\n if (cmp !== 0) return key.sort === 'desc' ? -cmp : cmp;\r\n }\r\n return leftId - rightId;\r\n}\r\n\r\n/** Binary-search insert position for `rowId` into an already-sorted id list. */\r\nexport function findSortedInsertIndex(\r\n orderedIds: readonly number[],\r\n rowId: number,\r\n sortModel: SortModel,\r\n accessor: SortAccessor,\r\n): number {\r\n let lo = 0;\r\n let hi = orderedIds.length;\r\n while (lo < hi) {\r\n const mid = (lo + hi) >> 1;\r\n const midId = orderedIds[mid]!;\r\n if (compareRowIdsForSort(midId, rowId, sortModel, accessor) <= 0) {\r\n lo = mid + 1;\r\n } else {\r\n hi = mid;\r\n }\r\n }\r\n return lo;\r\n}\r\n\r\n/** Max pointer movement (px) that still counts as a header sort click (PR-91). */\r\nexport const HEADER_SORT_CLICK_MAX_MOVE_PX = 5;\r\n\r\n/**\r\n * True when pointer travel is below the drag threshold so a header click\r\n * should change sort (not a column reorder gesture).\r\n */\r\nexport function shouldCommitHeaderSortClick(movedPx: number): boolean {\r\n return Number.isFinite(movedPx) && movedPx < HEADER_SORT_CLICK_MAX_MOVE_PX;\r\n}\r\n\r\nexport type CycleSortModelOptions = {\r\n /** Shift+Click: keep other columns; otherwise replace with this column. */\r\n multi?: boolean;\r\n};\r\n\r\n/**\r\n * Header click cycle (PR-91): none → asc → desc → none.\r\n * Without `multi`, the model becomes a single column (or empty).\r\n * With `multi`, the column is appended / toggled / removed in place.\r\n */\r\nexport function cycleSortModel(\r\n current: SortModel,\r\n colId: string,\r\n options: CycleSortModelOptions = {},\r\n): SortModel {\r\n if (typeof colId !== 'string' || colId.length === 0) {\r\n return current.slice();\r\n }\r\n if (colId === INDEX_COL_ID) return current.slice();\r\n\r\n const multi = Boolean(options.multi);\r\n const existing = current.findIndex((item) => item.colId === colId);\r\n\r\n if (!multi) {\r\n const only =\r\n current.length === 1 && current[0]?.colId === colId ? current[0] : null;\r\n if (!only) return [{ colId, sort: 'asc' }];\r\n if (only.sort === 'asc') return [{ colId, sort: 'desc' }];\r\n return [];\r\n }\r\n\r\n if (existing === -1) {\r\n return [...current, { colId, sort: 'asc' }];\r\n }\r\n const item = current[existing];\r\n if (item?.sort === 'asc') {\r\n return current.map((entry, index) =>\r\n index === existing ? { colId, sort: 'desc' } : entry,\r\n );\r\n }\r\n return current.filter((_, index) => index !== existing);\r\n}\r\n\r\nexport type AriaSortValue = 'ascending' | 'descending' | 'none';\r\n\r\nexport function ariaSortForColumn(\r\n sortModel: SortModel,\r\n colId: string,\r\n): AriaSortValue {\r\n const item = sortModel.find((entry) => entry.colId === colId);\r\n if (!item) return 'none';\r\n return item.sort === 'asc' ? 'ascending' : 'descending';\r\n}\r\n\r\n/** 1-based priority for multi-sort badge; undefined when column is unsorted. */\r\nexport function sortPriorityForColumn(\r\n sortModel: SortModel,\r\n colId: string,\r\n): number | undefined {\r\n const index = sortModel.findIndex((entry) => entry.colId === colId);\r\n return index >= 0 ? index + 1 : undefined;\r\n}\r\n\r\n/** Index column and `sortable: false` are never header-sortable. */\r\nexport function isHeaderColumnSortable(col: {\r\n fieldName: string;\r\n fieldType?: string;\r\n columnDef?: { sortable?: boolean } | null;\r\n}): boolean {\r\n if (col.fieldName === INDEX_COL_ID || col.fieldType === 'index') return false;\r\n if (col.columnDef?.sortable === false) return false;\r\n return true;\r\n}\r\n"]}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkSX4VQXAA_cjs = require('./chunk-SX4VQXAA.cjs');
|
|
4
|
+
var chunkQZN7R2WP_cjs = require('./chunk-QZN7R2WP.cjs');
|
|
5
|
+
var chunkZ4QPZ3Z3_cjs = require('./chunk-Z4QPZ3Z3.cjs');
|
|
6
|
+
|
|
7
|
+
// ui/locales/types.ts
|
|
8
|
+
var LOCALE_META = {
|
|
9
|
+
fa: {
|
|
10
|
+
locale: "fa",
|
|
11
|
+
dir: "rtl",
|
|
12
|
+
intlLocale: "fa-IR",
|
|
13
|
+
numberingSystem: "arabext",
|
|
14
|
+
calendar: "persian"
|
|
15
|
+
},
|
|
16
|
+
en: {
|
|
17
|
+
locale: "en",
|
|
18
|
+
dir: "ltr",
|
|
19
|
+
intlLocale: "en-US",
|
|
20
|
+
numberingSystem: "latn",
|
|
21
|
+
calendar: "gregory"
|
|
22
|
+
},
|
|
23
|
+
ar: {
|
|
24
|
+
locale: "ar",
|
|
25
|
+
dir: "rtl",
|
|
26
|
+
intlLocale: "ar-SA",
|
|
27
|
+
numberingSystem: "arab",
|
|
28
|
+
calendar: "gregory"
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
function resolveLocaleMeta(locale, overrides) {
|
|
32
|
+
const base = LOCALE_META[locale] ?? LOCALE_META.fa;
|
|
33
|
+
if (!overrides?.numberingSystem) return base;
|
|
34
|
+
return { ...base, numberingSystem: overrides.numberingSystem };
|
|
35
|
+
}
|
|
36
|
+
function resolveDirection(locale, override) {
|
|
37
|
+
if (override === "rtl" || override === "ltr") return override;
|
|
38
|
+
return (LOCALE_META[locale] ?? LOCALE_META.fa).dir;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ui/locales/index.ts
|
|
42
|
+
var LOCALE_PACKS = {
|
|
43
|
+
fa: chunkSX4VQXAA_cjs.faMessages,
|
|
44
|
+
en: chunkQZN7R2WP_cjs.enMessages,
|
|
45
|
+
ar: chunkZ4QPZ3Z3_cjs.arMessages
|
|
46
|
+
};
|
|
47
|
+
function getLocalePack(locale) {
|
|
48
|
+
return LOCALE_PACKS[locale] ?? chunkSX4VQXAA_cjs.faMessages;
|
|
49
|
+
}
|
|
50
|
+
function metaFor(options) {
|
|
51
|
+
const locale = options?.locale ?? "fa";
|
|
52
|
+
return resolveLocaleMeta(locale, {
|
|
53
|
+
numberingSystem: options?.numberingSystem
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function formatLocaleNumber(value, options) {
|
|
57
|
+
if (value == null || value === "") return "";
|
|
58
|
+
const n = typeof value === "number" ? value : Number(value);
|
|
59
|
+
if (!Number.isFinite(n)) return String(value);
|
|
60
|
+
const meta = metaFor(options);
|
|
61
|
+
const {
|
|
62
|
+
locale: _l,
|
|
63
|
+
numberingSystem: ns,
|
|
64
|
+
...intlOpts
|
|
65
|
+
} = options ?? {};
|
|
66
|
+
return new Intl.NumberFormat(meta.intlLocale, {
|
|
67
|
+
numberingSystem: ns ?? meta.numberingSystem,
|
|
68
|
+
...intlOpts
|
|
69
|
+
}).format(n);
|
|
70
|
+
}
|
|
71
|
+
function formatLocaleDate(value, options) {
|
|
72
|
+
if (value == null || value === "") return null;
|
|
73
|
+
const date = typeof value === "number" ? new Date(value) : new Date(String(value));
|
|
74
|
+
if (Number.isNaN(date.getTime())) return null;
|
|
75
|
+
const meta = metaFor(options);
|
|
76
|
+
const {
|
|
77
|
+
locale: _l,
|
|
78
|
+
numberingSystem: ns,
|
|
79
|
+
...intlOpts
|
|
80
|
+
} = options ?? {};
|
|
81
|
+
const calendar = meta.calendar === "persian" ? "persian" : meta.calendar === "islamic" ? "islamic" : "gregory";
|
|
82
|
+
return new Intl.DateTimeFormat(meta.intlLocale, {
|
|
83
|
+
calendar,
|
|
84
|
+
numberingSystem: ns ?? meta.numberingSystem,
|
|
85
|
+
year: "numeric",
|
|
86
|
+
month: "2-digit",
|
|
87
|
+
day: "2-digit",
|
|
88
|
+
...intlOpts
|
|
89
|
+
}).format(date);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
exports.LOCALE_META = LOCALE_META;
|
|
93
|
+
exports.LOCALE_PACKS = LOCALE_PACKS;
|
|
94
|
+
exports.formatLocaleDate = formatLocaleDate;
|
|
95
|
+
exports.formatLocaleNumber = formatLocaleNumber;
|
|
96
|
+
exports.getLocalePack = getLocalePack;
|
|
97
|
+
exports.resolveDirection = resolveDirection;
|
|
98
|
+
exports.resolveLocaleMeta = resolveLocaleMeta;
|
|
99
|
+
//# sourceMappingURL=chunk-CILNIWYW.cjs.map
|
|
100
|
+
//# sourceMappingURL=chunk-CILNIWYW.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../ui/locales/types.ts","../ui/locales/index.ts"],"names":["faMessages","enMessages","arMessages"],"mappings":"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","file":"chunk-CILNIWYW.cjs","sourcesContent":["/** Locale pack types (PR-127). */\r\n\r\nexport type ERPTableLocale = 'fa' | 'en' | 'ar';\r\n\r\nexport type ERPTableMessages = Record<string, string>;\r\n\r\n/** Unicode numbering systems for Intl (PR-127). */\r\nexport type NumberingSystem = 'latn' | 'arab' | 'arabext';\r\n\r\nexport type LocaleMeta = {\r\n locale: ERPTableLocale;\r\n /** Default writing direction; host may override. */\r\n dir: 'rtl' | 'ltr';\r\n /** BCP 47 tag for Intl. */\r\n intlLocale: string;\r\n /** Default digit system. */\r\n numberingSystem: NumberingSystem;\r\n /** Default calendar for date display (PR-128 may replace with DateAdapter). */\r\n calendar: 'persian' | 'gregory' | 'islamic';\r\n};\r\n\r\nexport const LOCALE_META: Record<ERPTableLocale, LocaleMeta> = {\r\n fa: {\r\n locale: 'fa',\r\n dir: 'rtl',\r\n intlLocale: 'fa-IR',\r\n numberingSystem: 'arabext',\r\n calendar: 'persian',\r\n },\r\n en: {\r\n locale: 'en',\r\n dir: 'ltr',\r\n intlLocale: 'en-US',\r\n numberingSystem: 'latn',\r\n calendar: 'gregory',\r\n },\r\n ar: {\r\n locale: 'ar',\r\n dir: 'rtl',\r\n intlLocale: 'ar-SA',\r\n numberingSystem: 'arab',\r\n calendar: 'gregory',\r\n },\r\n};\r\n\r\nexport function resolveLocaleMeta(\r\n locale: ERPTableLocale,\r\n overrides?: {\r\n numberingSystem?: NumberingSystem;\r\n },\r\n): LocaleMeta {\r\n const base = LOCALE_META[locale] ?? LOCALE_META.fa;\r\n if (!overrides?.numberingSystem) return base;\r\n return { ...base, numberingSystem: overrides.numberingSystem };\r\n}\r\n\r\nexport function resolveDirection(\r\n locale: ERPTableLocale,\r\n override?: 'rtl' | 'ltr',\r\n): 'rtl' | 'ltr' {\r\n if (override === 'rtl' || override === 'ltr') return override;\r\n return (LOCALE_META[locale] ?? LOCALE_META.fa).dir;\r\n}\r\n","import { arMessages } from './ar';\r\nimport { enMessages } from './en';\r\nimport { faMessages } from './fa';\r\nimport {\r\n LOCALE_META,\r\n resolveDirection,\r\n resolveLocaleMeta,\r\n type ERPTableLocale,\r\n type ERPTableMessages,\r\n type LocaleMeta,\r\n type NumberingSystem,\r\n} from './types';\r\n\r\nexport type {\r\n ERPTableLocale,\r\n ERPTableMessages,\r\n LocaleMeta,\r\n NumberingSystem,\r\n} from './types';\r\nexport {\r\n LOCALE_META,\r\n resolveDirection,\r\n resolveLocaleMeta,\r\n} from './types';\r\nexport { faMessages } from './fa';\r\nexport { enMessages } from './en';\r\nexport { arMessages } from './ar';\r\n\r\nexport const LOCALE_PACKS: Record<ERPTableLocale, ERPTableMessages> = {\r\n fa: faMessages,\r\n en: enMessages,\r\n ar: arMessages,\r\n};\r\n\r\nexport function getLocalePack(locale: ERPTableLocale): ERPTableMessages {\r\n return LOCALE_PACKS[locale] ?? faMessages;\r\n}\r\n\r\nexport type FormatOptions = {\r\n locale?: ERPTableLocale;\r\n numberingSystem?: NumberingSystem;\r\n};\r\n\r\nfunction metaFor(options?: FormatOptions): LocaleMeta {\r\n const locale = options?.locale ?? 'fa';\r\n return resolveLocaleMeta(locale, {\r\n numberingSystem: options?.numberingSystem,\r\n });\r\n}\r\n\r\n/** Intl number formatting with configurable numberingSystem (PR-127). */\r\nexport function formatLocaleNumber(\r\n value: unknown,\r\n options?: FormatOptions & Intl.NumberFormatOptions,\r\n): string {\r\n if (value == null || value === '') return '';\r\n const n = typeof value === 'number' ? value : Number(value);\r\n if (!Number.isFinite(n)) return String(value);\r\n const meta = metaFor(options);\r\n const {\r\n locale: _l,\r\n numberingSystem: ns,\r\n ...intlOpts\r\n } = options ?? {};\r\n return new Intl.NumberFormat(meta.intlLocale, {\r\n numberingSystem: ns ?? meta.numberingSystem,\r\n ...intlOpts,\r\n }).format(n);\r\n}\r\n\r\n/** Intl date formatting; calendar follows locale meta until DateAdapter (PR-128). */\r\nexport function formatLocaleDate(\r\n value: unknown,\r\n options?: FormatOptions & Intl.DateTimeFormatOptions,\r\n): string | null {\r\n if (value == null || value === '') return null;\r\n const date =\r\n typeof value === 'number' ? new Date(value) : new Date(String(value));\r\n if (Number.isNaN(date.getTime())) return null;\r\n const meta = metaFor(options);\r\n const {\r\n locale: _l,\r\n numberingSystem: ns,\r\n ...intlOpts\r\n } = options ?? {};\r\n const calendar =\r\n meta.calendar === 'persian'\r\n ? 'persian'\r\n : meta.calendar === 'islamic'\r\n ? 'islamic'\r\n : 'gregory';\r\n return new Intl.DateTimeFormat(meta.intlLocale, {\r\n calendar,\r\n numberingSystem: ns ?? meta.numberingSystem,\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n ...intlOpts,\r\n }).format(date);\r\n}\r\n"]}
|