persian-data-grid 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/README.md +1 -1
  2. package/dist/{ERPTableGroupRow-PSAPAHGL.js → ERPTableGroupRow-E5Q6FYDS.js} +4 -4
  3. package/dist/{ERPTableGroupRow-PSAPAHGL.js.map → ERPTableGroupRow-E5Q6FYDS.js.map} +1 -1
  4. package/dist/{ERPTableGroupRow-J5Z2LRC5.cjs → ERPTableGroupRow-F2IPDYL5.cjs} +9 -9
  5. package/dist/{ERPTableGroupRow-J5Z2LRC5.cjs.map → ERPTableGroupRow-F2IPDYL5.cjs.map} +1 -1
  6. package/dist/{GridPlugin-CJCaYnlw.d.ts → GridPlugin-Bewn0X51.d.ts} +1 -1
  7. package/dist/{GridPlugin-oxhq8AsM.d.cts → GridPlugin-DewWufGZ.d.cts} +1 -1
  8. package/dist/{GridSession-Bc7UIawO.d.ts → GridSession-CeIfVFck.d.ts} +142 -9
  9. package/dist/{GridSession-B-9lLcoB.d.cts → GridSession-CmQn2RnL.d.cts} +142 -9
  10. package/dist/GridSyncService-3JQLEY65.cjs +12 -0
  11. package/dist/{GridSyncService-TAPAHABV.cjs.map → GridSyncService-3JQLEY65.cjs.map} +1 -1
  12. package/dist/GridSyncService-GECXGEKL.js +3 -0
  13. package/dist/{GridSyncService-KTLB4KP3.js.map → GridSyncService-GECXGEKL.js.map} +1 -1
  14. package/dist/{PdfRenderer-CBg7hWNS.d.cts → PdfRenderer-B9FJaCo_.d.cts} +1 -1
  15. package/dist/{PdfRenderer-1HFh6UeR.d.ts → PdfRenderer-bN7ca_Aj.d.ts} +1 -1
  16. package/dist/{UITableController-DU8RopUM.d.ts → UITableController-C71LXBiX.d.ts} +48 -2
  17. package/dist/{UITableController-Cuwq481K.d.cts → UITableController-CIwnHIw8.d.cts} +48 -2
  18. package/dist/{VazirmatnPdfRenderer-BCMpC1zy.d.cts → VazirmatnPdfRenderer-CpCqA-Wh.d.cts} +2 -2
  19. package/dist/{VazirmatnPdfRenderer-Dz_G-m3c.d.ts → VazirmatnPdfRenderer-D46smncn.d.ts} +2 -2
  20. package/dist/adapters/arian-erp.cjs +16 -4
  21. package/dist/adapters/arian-erp.cjs.map +1 -1
  22. package/dist/adapters/arian-erp.d.cts +3 -1
  23. package/dist/adapters/arian-erp.d.ts +3 -1
  24. package/dist/adapters/arian-erp.js +11 -3
  25. package/dist/adapters/arian-erp.js.map +1 -1
  26. package/dist/{applyImportedRows-BO6yxoAN.d.cts → applyImportedRows-C2fWYoPy.d.cts} +3 -3
  27. package/dist/{applyImportedRows-D4zVY8uD.d.ts → applyImportedRows-Cqh_N_0k.d.ts} +3 -3
  28. package/dist/{applyRowVisibilityHandler-LXCOGESZ.cjs → applyRowVisibilityHandler-Q64ZFC7A.cjs} +7 -6
  29. package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs.map +1 -0
  30. package/dist/{applyRowVisibilityHandler-KS6TMCBN.js → applyRowVisibilityHandler-ZLZXQEGY.js} +6 -5
  31. package/dist/applyRowVisibilityHandler-ZLZXQEGY.js.map +1 -0
  32. package/dist/callbackRemoteApi-BYLjmSI6.d.ts +51 -0
  33. package/dist/callbackRemoteApi-Cv26MmSD.d.cts +51 -0
  34. package/dist/{cellRenderContext-DB7V_mlu.d.ts → cellRenderContext-BaNh4qn_.d.ts} +2 -2
  35. package/dist/{cellRenderContext-DG5BOlxK.d.cts → cellRenderContext-DvngkptV.d.cts} +2 -2
  36. package/dist/{chunk-HTNJT2QU.js → chunk-27ALJSZP.js} +617 -104
  37. package/dist/chunk-27ALJSZP.js.map +1 -0
  38. package/dist/{chunk-KUBVDIF7.cjs → chunk-3HP3HQCW.cjs} +52 -17
  39. package/dist/chunk-3HP3HQCW.cjs.map +1 -0
  40. package/dist/{chunk-DXRCYW42.cjs → chunk-52LFOPXD.cjs} +43 -23
  41. package/dist/chunk-52LFOPXD.cjs.map +1 -0
  42. package/dist/{chunk-VVGYRZ7S.cjs → chunk-72IVAOTK.cjs} +4 -4
  43. package/dist/{chunk-VVGYRZ7S.cjs.map → chunk-72IVAOTK.cjs.map} +1 -1
  44. package/dist/{chunk-LJ7LMEXO.js → chunk-7GWV5HGO.js} +3 -3
  45. package/dist/{chunk-LJ7LMEXO.js.map → chunk-7GWV5HGO.js.map} +1 -1
  46. package/dist/{chunk-RM6ZWNT3.js → chunk-7T6AWRPU.js} +43 -23
  47. package/dist/chunk-7T6AWRPU.js.map +1 -0
  48. package/dist/{chunk-PXCHPZTP.cjs → chunk-CMQ4VLCW.cjs} +8 -7
  49. package/dist/{chunk-EHHHC5JV.js.map → chunk-CMQ4VLCW.cjs.map} +1 -1
  50. package/dist/chunk-E2J533UH.cjs +53 -0
  51. package/dist/chunk-E2J533UH.cjs.map +1 -0
  52. package/dist/chunk-F6EMC75A.cjs +34 -0
  53. package/dist/chunk-F6EMC75A.cjs.map +1 -0
  54. package/dist/chunk-GKE33FOJ.js +32 -0
  55. package/dist/chunk-GKE33FOJ.js.map +1 -0
  56. package/dist/{chunk-QQMU44KJ.js → chunk-HLOHWFOA.js} +52 -19
  57. package/dist/chunk-HLOHWFOA.js.map +1 -0
  58. package/dist/{chunk-633KP74Z.js → chunk-KCNTKYUY.js} +19 -2
  59. package/dist/chunk-KCNTKYUY.js.map +1 -0
  60. package/dist/{chunk-BLYVOV3G.cjs → chunk-LY27YAXE.cjs} +19 -2
  61. package/dist/chunk-LY27YAXE.cjs.map +1 -0
  62. package/dist/{chunk-EHHHC5JV.js → chunk-NB5GCGHL.js} +5 -4
  63. package/dist/chunk-NB5GCGHL.js.map +1 -0
  64. package/dist/{chunk-6XBXZPBW.js → chunk-NQUVAJQA.js} +3 -3
  65. package/dist/{chunk-6XBXZPBW.js.map → chunk-NQUVAJQA.js.map} +1 -1
  66. package/dist/chunk-SVO62ZV2.js +50 -0
  67. package/dist/chunk-SVO62ZV2.js.map +1 -0
  68. package/dist/{chunk-MU3RY46O.js → chunk-VBAZ77Q4.js} +3 -3
  69. package/dist/{chunk-MU3RY46O.js.map → chunk-VBAZ77Q4.js.map} +1 -1
  70. package/dist/{chunk-H2LESGMX.cjs → chunk-VSAFQTW5.cjs} +4 -4
  71. package/dist/{chunk-H2LESGMX.cjs.map → chunk-VSAFQTW5.cjs.map} +1 -1
  72. package/dist/{chunk-2BJCRYOS.cjs → chunk-VYJQ2HTA.cjs} +5 -5
  73. package/dist/{chunk-2BJCRYOS.cjs.map → chunk-VYJQ2HTA.cjs.map} +1 -1
  74. package/dist/{chunk-IIISFUW4.cjs → chunk-WTHTVKVI.cjs} +621 -108
  75. package/dist/chunk-WTHTVKVI.cjs.map +1 -0
  76. package/dist/{createEngineGridQuery-Mt1hc33m.d.ts → createEngineGridQuery-BBkud5oE.d.ts} +61 -6
  77. package/dist/{createEngineGridQuery-Dmq3i5v3.d.cts → createEngineGridQuery-D-fgO_jg.d.cts} +61 -6
  78. package/dist/date-picker-jalali.cjs +17 -17
  79. package/dist/date-picker-jalali.d.cts +3 -3
  80. package/dist/date-picker-jalali.d.ts +3 -3
  81. package/dist/date-picker-jalali.js +1 -1
  82. package/dist/headless.cjs +102 -102
  83. package/dist/headless.d.cts +13 -9
  84. package/dist/headless.d.ts +13 -9
  85. package/dist/headless.js +4 -4
  86. package/dist/index.cjs +440 -382
  87. package/dist/index.cjs.map +1 -1
  88. package/dist/index.d.cts +34 -14
  89. package/dist/index.d.ts +34 -14
  90. package/dist/index.js +200 -143
  91. package/dist/index.js.map +1 -1
  92. package/dist/plugins/csv.cjs +3 -3
  93. package/dist/plugins/csv.d.cts +2 -2
  94. package/dist/plugins/csv.d.ts +2 -2
  95. package/dist/plugins/csv.js +2 -2
  96. package/dist/plugins/excel.cjs +11 -11
  97. package/dist/plugins/excel.d.cts +4 -4
  98. package/dist/plugins/excel.d.ts +4 -4
  99. package/dist/plugins/excel.js +3 -3
  100. package/dist/plugins/pdf/fonts/vazirmatn.cjs +6 -6
  101. package/dist/plugins/pdf/fonts/vazirmatn.d.cts +4 -4
  102. package/dist/plugins/pdf/fonts/vazirmatn.d.ts +4 -4
  103. package/dist/plugins/pdf/fonts/vazirmatn.js +3 -3
  104. package/dist/plugins/pdf.cjs +5 -5
  105. package/dist/plugins/pdf.d.cts +5 -5
  106. package/dist/plugins/pdf.d.ts +5 -5
  107. package/dist/plugins/pdf.js +2 -2
  108. package/dist/presence.d.cts +3 -3
  109. package/dist/presence.d.ts +3 -3
  110. package/dist/sync.cjs +2 -2
  111. package/dist/sync.d.cts +3 -3
  112. package/dist/sync.d.ts +3 -3
  113. package/dist/sync.js +1 -1
  114. package/package.json +3 -3
  115. package/dist/GridSyncService-KTLB4KP3.js +0 -3
  116. package/dist/GridSyncService-TAPAHABV.cjs +0 -12
  117. package/dist/applyRowVisibilityHandler-KS6TMCBN.js.map +0 -1
  118. package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs.map +0 -1
  119. package/dist/callbackRemoteApi-BlXO5NJz.d.ts +0 -30
  120. package/dist/callbackRemoteApi-DgnXH-i0.d.cts +0 -30
  121. package/dist/chunk-633KP74Z.js.map +0 -1
  122. package/dist/chunk-ASPTRYRD.cjs +0 -21
  123. package/dist/chunk-ASPTRYRD.cjs.map +0 -1
  124. package/dist/chunk-BHDRUZH5.cjs +0 -33
  125. package/dist/chunk-BHDRUZH5.cjs.map +0 -1
  126. package/dist/chunk-BLYVOV3G.cjs.map +0 -1
  127. package/dist/chunk-DXRCYW42.cjs.map +0 -1
  128. package/dist/chunk-HTNJT2QU.js.map +0 -1
  129. package/dist/chunk-IIISFUW4.cjs.map +0 -1
  130. package/dist/chunk-KUBVDIF7.cjs.map +0 -1
  131. package/dist/chunk-KYAOSBQN.js +0 -31
  132. package/dist/chunk-KYAOSBQN.js.map +0 -1
  133. package/dist/chunk-PXCHPZTP.cjs.map +0 -1
  134. package/dist/chunk-QQMU44KJ.js.map +0 -1
  135. package/dist/chunk-RM6ZWNT3.js.map +0 -1
  136. package/dist/chunk-Y6W5V2CI.js +0 -19
  137. package/dist/chunk-Y6W5V2CI.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../packages/plugins/excel/src/buildExportTable.ts"],"names":[],"mappings":";;;AAMA,IAAM,qCAAqB,IAAI,GAAA,CAAI,CAAC,+DAAA,EAAe,QAAA,EAAU,QAAQ,CAAC,CAAA;AAYtE,IAAM,qBAAqB,CAAC,KAAA,KAC1B,UAAU,MAAA,IAAa,KAAA,KAAU,QAAQ,KAAA,KAAU,EAAA;AAErD,SAAS,QAAA,CACP,QACA,MAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAC1C,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAElB,EAAA,MAAM,MAAM,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,UAAU,IAAA,CAAK,KAAA;AACnE,EAAA,IAAI,CAAC,kBAAA,CAAmB,GAAG,CAAA,EAAG,OAAO,EAAA;AAErC,EAAA,MAAM,OAAO,iBAAA,CAAkB,GAAA,EAAK,MAAA,CAAO,SAAS,EAAE,IAAA,EAAK;AAC3D,EAAA,IAAI,CAAC,IAAA,IAAQ,kBAAA,CAAmB,GAAA,CAAI,IAAI,GAAG,OAAO,EAAA;AAClD,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,iBAAiB,MAAA,EAAmC;AAClE,EAAA,MAAM,eAAA,GAAkB,OAAO,OAAA,CAAQ,MAAA;AAAA,IAAO,CAAC,MAAA,KAC7C,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,QAAA,CAAS,GAAA,EAAK,MAAM,CAAA,KAAM,EAAE;AAAA,GACxD;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACnC,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,OAAA,EAAS,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE;AAAA,KAC/B,CAAE,CAAA;AAAA,IACF,IAAA,EAAM,OAAO,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,QACrB,eAAA,CAAgB,GAAA,CAAI,CAAC,GAAA,KAAQ,QAAA,CAAS,GAAA,EAAK,GAAG,CAAC;AAAA,KACjD;AAAA,IACA,QAAA,EAAU,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,QAAQ,MAAM,CAAA;AAAA,IACrD,aAAA,EAAe,OAAO,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,GAAA,KAC9B,OAAO,IAAI,YAAA,KAAiB,QAAA,GAAW,IAAI,YAAA,GAAe;AAAA;AAC5D,GACF;AACF","file":"chunk-LJ7LMEXO.js","sourcesContent":["import type {\r\n ExportColumnDef,\r\n ExportSource,\r\n} from '../../../../application/plugins/GridPlugin';\r\nimport { formatExportValue } from './formatExportValue';\r\n\r\nconst EMPTY_PLACEHOLDERS = new Set(['انتخاب کنید', 'select', 'Select']);\r\n\r\nexport type ExportTable = {\r\n columns: Array<{ fieldName: string; caption: string }>;\r\n /** Parallel to columns; already stringified cell text */\r\n rows: string[][];\r\n /** Parallel to rows (PR-122). Absent ⇒ all leaf. */\r\n rowKinds?: Array<'group' | 'leaf' | 'total'>;\r\n /** Excel outlineLevel per data row (PR-122). */\r\n outlineLevels?: number[];\r\n};\r\n\r\nconst hasMeaningfulValue = (value: unknown) =>\r\n value !== undefined && value !== null && value !== '';\r\n\r\nfunction cellText(\r\n source: ExportSource['rows'][number],\r\n column: ExportColumnDef,\r\n): string {\r\n const cell = source.cells[column.fieldName];\r\n if (!cell) return '';\r\n\r\n const raw = hasMeaningfulValue(cell.display) ? 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 return text;\r\n}\r\n\r\n/**\r\n * Builds a dense string matrix from ExportSource (plugin query port).\r\n */\r\nexport function buildExportTable(source: ExportSource): ExportTable {\r\n const columnsWithData = source.columns.filter((column) =>\r\n source.rows.some((row) => cellText(row, column) !== ''),\r\n );\r\n\r\n return {\r\n columns: columnsWithData.map((c) => ({\r\n fieldName: c.fieldName,\r\n caption: c.fieldCaption ?? c.fieldName,\r\n })),\r\n rows: source.rows.map((row) =>\r\n columnsWithData.map((col) => cellText(row, col)),\r\n ),\r\n rowKinds: source.rows.map((row) => row.kind ?? 'leaf'),\r\n outlineLevels: source.rows.map((row) =>\r\n typeof row.outlineLevel === 'number' ? row.outlineLevel : 0,\r\n ),\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../packages/plugins/excel/src/buildExportTable.ts"],"names":[],"mappings":";;;AAMA,IAAM,qCAAqB,IAAI,GAAA,CAAI,CAAC,+DAAA,EAAe,QAAA,EAAU,QAAQ,CAAC,CAAA;AAYtE,IAAM,qBAAqB,CAAC,KAAA,KAC1B,UAAU,MAAA,IAAa,KAAA,KAAU,QAAQ,KAAA,KAAU,EAAA;AAErD,SAAS,QAAA,CACP,QACA,MAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAC1C,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAElB,EAAA,MAAM,MAAM,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,UAAU,IAAA,CAAK,KAAA;AACnE,EAAA,IAAI,CAAC,kBAAA,CAAmB,GAAG,CAAA,EAAG,OAAO,EAAA;AAErC,EAAA,MAAM,OAAO,iBAAA,CAAkB,GAAA,EAAK,MAAA,CAAO,SAAS,EAAE,IAAA,EAAK;AAC3D,EAAA,IAAI,CAAC,IAAA,IAAQ,kBAAA,CAAmB,GAAA,CAAI,IAAI,GAAG,OAAO,EAAA;AAClD,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,iBAAiB,MAAA,EAAmC;AAClE,EAAA,MAAM,eAAA,GAAkB,OAAO,OAAA,CAAQ,MAAA;AAAA,IAAO,CAAC,MAAA,KAC7C,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,QAAA,CAAS,GAAA,EAAK,MAAM,CAAA,KAAM,EAAE;AAAA,GACxD;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACnC,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,OAAA,EAAS,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE;AAAA,KAC/B,CAAE,CAAA;AAAA,IACF,IAAA,EAAM,OAAO,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,QACrB,eAAA,CAAgB,GAAA,CAAI,CAAC,GAAA,KAAQ,QAAA,CAAS,GAAA,EAAK,GAAG,CAAC;AAAA,KACjD;AAAA,IACA,QAAA,EAAU,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,QAAQ,MAAM,CAAA;AAAA,IACrD,aAAA,EAAe,OAAO,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,GAAA,KAC9B,OAAO,IAAI,YAAA,KAAiB,QAAA,GAAW,IAAI,YAAA,GAAe;AAAA;AAC5D,GACF;AACF","file":"chunk-7GWV5HGO.js","sourcesContent":["import type {\r\n ExportColumnDef,\r\n ExportSource,\r\n} from '../../../../application/plugins/GridPlugin';\r\nimport { formatExportValue } from './formatExportValue';\r\n\r\nconst EMPTY_PLACEHOLDERS = new Set(['انتخاب کنید', 'select', 'Select']);\r\n\r\nexport type ExportTable = {\r\n columns: Array<{ fieldName: string; caption: string }>;\r\n /** Parallel to columns; already stringified cell text */\r\n rows: string[][];\r\n /** Parallel to rows (PR-122). Absent ⇒ all leaf. */\r\n rowKinds?: Array<'group' | 'leaf' | 'total'>;\r\n /** Excel outlineLevel per data row (PR-122). */\r\n outlineLevels?: number[];\r\n};\r\n\r\nconst hasMeaningfulValue = (value: unknown) =>\r\n value !== undefined && value !== null && value !== '';\r\n\r\nfunction cellText(\r\n source: ExportSource['rows'][number],\r\n column: ExportColumnDef,\r\n): string {\r\n const cell = source.cells[column.fieldName];\r\n if (!cell) return '';\r\n\r\n const raw = hasMeaningfulValue(cell.display) ? 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 return text;\r\n}\r\n\r\n/**\r\n * Builds a dense string matrix from ExportSource (plugin query port).\r\n */\r\nexport function buildExportTable(source: ExportSource): ExportTable {\r\n const columnsWithData = source.columns.filter((column) =>\r\n source.rows.some((row) => cellText(row, column) !== ''),\r\n );\r\n\r\n return {\r\n columns: columnsWithData.map((c) => ({\r\n fieldName: c.fieldName,\r\n caption: c.fieldCaption ?? c.fieldName,\r\n })),\r\n rows: source.rows.map((row) =>\r\n columnsWithData.map((col) => cellText(row, col)),\r\n ),\r\n rowKinds: source.rows.map((row) => row.kind ?? 'leaf'),\r\n outlineLevels: source.rows.map((row) =>\r\n typeof row.outlineLevel === 'number' ? row.outlineLevel : 0,\r\n ),\r\n };\r\n}\r\n"]}
@@ -23,7 +23,7 @@ function logError(audit, error, context) {
23
23
  });
24
24
  }
25
25
  }
26
- async function applyRemoteVisibilityRules(dynamic, input) {
26
+ async function applyRemoteVisibilityRules(dynamic, input, audit) {
27
27
  const {
28
28
  table,
29
29
  rowId,
@@ -32,34 +32,41 @@ async function applyRemoteVisibilityRules(dynamic, input) {
32
32
  clearDependents = true
33
33
  } = input;
34
34
  const meta = dynamic?.columnMeta;
35
- if (!meta) return;
35
+ if (!meta) return true;
36
36
  const colKey = `${table.getActiveCollectionName() ?? "default"}_${changedColumnId.value}`;
37
37
  const changedMeta = meta.get(colKey) ?? meta.get(changedColumnId.value);
38
38
  const resolveOn = changedMeta?.resolveOn;
39
- if (!resolveOn) return;
40
- if (resolveOn.fieldName !== changedColumnId.value) return;
39
+ if (!resolveOn) return true;
40
+ if (resolveOn.fieldName !== changedColumnId.value) return true;
41
41
  const row = table.getRows().find((r) => r.id.value === rowId.value);
42
- if (!row) return;
42
+ if (!row) return true;
43
43
  const rowValues = {};
44
44
  for (const [colId, cell] of row.getCells().entries()) {
45
45
  rowValues[colId] = cell.getValue();
46
46
  }
47
- if (newValue == null || newValue === "") return;
47
+ if (newValue == null || newValue === "") return true;
48
48
  const params = typeof resolveOn.buildParams === "function" ? resolveOn.buildParams(rowValues) : { value: newValue };
49
- const response = await dynamic.remoteApi.request({
50
- endpoint: resolveOn.endpoint,
51
- params,
52
- method: "POST"
53
- });
54
- resolveOn.getResponse?.(response, row);
55
- const flags = resolveOn.mapFlags?.(response) ?? {};
49
+ let response;
50
+ let failed = false;
51
+ try {
52
+ response = await dynamic.remoteApi.request({
53
+ endpoint: resolveOn.endpoint,
54
+ params,
55
+ method: "POST"
56
+ });
57
+ } catch (error) {
58
+ failed = true;
59
+ if (audit) logError(audit, error, `resolveOn[${resolveOn.endpoint}]`);
60
+ }
61
+ if (!failed) resolveOn.getResponse?.(response, row);
62
+ const flags = failed ? {} : resolveOn.mapFlags?.(response) ?? {};
56
63
  const toShow = [];
57
64
  const visibilityCondition = {};
58
65
  const activeCollection = table.getActiveCollectionName() ?? "default";
59
66
  meta.forEach((colCfg) => {
60
67
  if ((colCfg.fieldCollection ?? "default") !== activeCollection) return;
61
68
  const v = colCfg.visibility;
62
- if (v?.kind === "whenRemoteFlag" && v.sourceFieldName === changedColumnId.value) {
69
+ if (!failed && v?.kind === "whenRemoteFlag" && v.sourceFieldName === changedColumnId.value) {
63
70
  const colId = new ColumnId(colCfg.fieldName);
64
71
  const schema = table.getColumnSchema(colId);
65
72
  const flagValue = flags[v.flag] ?? false;
@@ -78,7 +85,8 @@ async function applyRemoteVisibilityRules(dynamic, input) {
78
85
  if (toShow.length > 0) {
79
86
  table.addColumns(toShow);
80
87
  }
81
- row.setVisibilityCondition(visibilityCondition);
88
+ if (!failed) row.setVisibilityCondition(visibilityCondition);
89
+ return !failed;
82
90
  }
83
91
  var ChangeCellValueHandler = class {
84
92
  constructor(repo, audit, permissionPolicy, dynamic) {
@@ -167,7 +175,7 @@ var ChangeCellValueHandler = class {
167
175
  }
168
176
  /* ── helpers ─────────────────────────────────────────────────────── */
169
177
  applyRemoteVisibilityRules(input) {
170
- return applyRemoteVisibilityRules(this.dynamic, input);
178
+ return applyRemoteVisibilityRules(this.dynamic, input, this.audit);
171
179
  }
172
180
  async applyComputedColumns(input) {
173
181
  const { table, rowId, changedColumnId, remoteApi } = input;
@@ -204,8 +212,14 @@ var ChangeCellValueHandler = class {
204
212
  const targetColId = new ColumnId(targetField);
205
213
  const schema = table.getColumnSchema(targetColId);
206
214
  if (!schema || !colCfg.computed) continue;
207
- const rawValue = colCfg.computed.compute(rowValues, remoteApi);
208
- const newValue = rawValue instanceof Promise ? await rawValue : rawValue;
215
+ let newValue;
216
+ try {
217
+ const rawValue = colCfg.computed.compute(rowValues, remoteApi);
218
+ newValue = rawValue instanceof Promise ? await rawValue : rawValue;
219
+ } catch (error) {
220
+ logError(this.audit, error, `computed[${targetField}]`);
221
+ continue;
222
+ }
209
223
  const validated = this.validateCellValue(schema.fieldType, newValue);
210
224
  if (validated.value instanceof Promise) {
211
225
  throw new Error(
@@ -443,7 +457,7 @@ var ApplyDynamicProjectionHandler = class {
443
457
  }
444
458
  /* ── helpers (identical to ChangeCellValueHandler) ───────────────── */
445
459
  applyRemoteVisibilityRules(input) {
446
- return applyRemoteVisibilityRules(this.dynamic, input);
460
+ return applyRemoteVisibilityRules(this.dynamic, input, this.audit);
447
461
  }
448
462
  async applyComputedColumns(input) {
449
463
  const { table, rowId, changedColumnId, remoteApi } = input;
@@ -478,8 +492,14 @@ var ApplyDynamicProjectionHandler = class {
478
492
  const targetColId = new ColumnId(targetField);
479
493
  const schema = table.getColumnSchema(targetColId);
480
494
  if (!schema || !colCfg.computed) continue;
481
- const rawValue = colCfg.computed.compute(rowValues, remoteApi);
482
- const newValue = rawValue instanceof Promise ? await rawValue : rawValue;
495
+ let newValue;
496
+ try {
497
+ const rawValue = colCfg.computed.compute(rowValues, remoteApi);
498
+ newValue = rawValue instanceof Promise ? await rawValue : rawValue;
499
+ } catch (error) {
500
+ logError(this.audit, error, `computed[${targetField}]`);
501
+ continue;
502
+ }
483
503
  const validated = this.validateCellValue(schema.fieldType, newValue);
484
504
  if (validated.value instanceof Promise) {
485
505
  throw new Error(`Computed column "${targetField}" returned a Promise after validation`);
@@ -557,5 +577,5 @@ var ApplyDynamicProjectionHandler = class {
557
577
  };
558
578
 
559
579
  export { ApplyDynamicProjectionHandler, ChangeCellDisplayValueHandler, ChangeCellValueHandler, SaveDescriptionHandler, applyRemoteVisibilityRules, logError };
560
- //# sourceMappingURL=chunk-RM6ZWNT3.js.map
561
- //# sourceMappingURL=chunk-RM6ZWNT3.js.map
580
+ //# sourceMappingURL=chunk-7T6AWRPU.js.map
581
+ //# sourceMappingURL=chunk-7T6AWRPU.js.map
@@ -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"]}
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkVVGYRZ7S_cjs = require('./chunk-VVGYRZ7S.cjs');
3
+ var chunk72IVAOTK_cjs = require('./chunk-72IVAOTK.cjs');
4
4
  var chunkIMPCRWYP_cjs = require('./chunk-IMPCRWYP.cjs');
5
- var chunkBHDRUZH5_cjs = require('./chunk-BHDRUZH5.cjs');
5
+ var chunkF6EMC75A_cjs = require('./chunk-F6EMC75A.cjs');
6
6
  var fflate = require('fflate');
7
7
 
8
8
  // packages/plugins/excel/src/ExcelExportPlugin.ts
@@ -31,7 +31,7 @@ var ExcelExportPlugin = class {
31
31
  if (!source) {
32
32
  throw new Error("NO_EXPORT_SOURCE");
33
33
  }
34
- const table = chunkVVGYRZ7S_cjs.buildExportTable(source);
34
+ const table = chunk72IVAOTK_cjs.buildExportTable(source);
35
35
  if (table.columns.length === 0 && table.rows.length === 0) {
36
36
  throw new Error("NO_COLUMNS");
37
37
  }
@@ -443,7 +443,7 @@ var getRecordExportText = (record, column) => {
443
443
  if (!cell) return "";
444
444
  const raw = cell.display ?? cell.value;
445
445
  if (!hasMeaningfulValue(raw)) return "";
446
- const text = chunkBHDRUZH5_cjs.formatExportValue(raw, column.fieldType).trim();
446
+ const text = chunkF6EMC75A_cjs.formatExportValue(raw, column.fieldType).trim();
447
447
  if (!text || EMPTY_PLACEHOLDERS.has(text)) return "";
448
448
  return text;
449
449
  };
@@ -777,6 +777,7 @@ async function exportActiveCollectionToExcelStreaming(controller, options) {
777
777
  // packages/plugins/excel/src/exportActiveCollectionToExcel.ts
778
778
  var hasMeaningfulValue2 = (value) => value !== void 0 && value !== null && value !== "";
779
779
  async function exportActiveCollectionToExcel(controller, options) {
780
+ await controller.flushCellEdit();
780
781
  if (controller.isPagedWindow()) {
781
782
  return exportActiveCollectionToExcelStreaming(controller, options);
782
783
  }
@@ -806,7 +807,7 @@ async function exportActiveCollectionToExcel(controller, options) {
806
807
  )
807
808
  }))
808
809
  };
809
- const table = chunkVVGYRZ7S_cjs.buildExportTable(source);
810
+ const table = chunk72IVAOTK_cjs.buildExportTable(source);
810
811
  if (table.columns.length === 0 && table.rows.length === 0) {
811
812
  throw new Error("NO_COLUMNS");
812
813
  }
@@ -835,5 +836,5 @@ exports.applyImportedRows = applyImportedRows;
835
836
  exports.exportActiveCollectionToExcel = exportActiveCollectionToExcel;
836
837
  exports.mapImportedSheet = mapImportedSheet;
837
838
  exports.parseXlsxBlob = parseXlsxBlob;
838
- //# sourceMappingURL=chunk-PXCHPZTP.cjs.map
839
- //# sourceMappingURL=chunk-PXCHPZTP.cjs.map
839
+ //# sourceMappingURL=chunk-CMQ4VLCW.cjs.map
840
+ //# sourceMappingURL=chunk-CMQ4VLCW.cjs.map