persian-data-grid 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/OFL.txt +93 -0
  2. package/README.md +179 -22
  3. package/dist/ERPTableGroupRow-J5Z2LRC5.cjs +131 -0
  4. package/dist/ERPTableGroupRow-J5Z2LRC5.cjs.map +1 -0
  5. package/dist/ERPTableGroupRow-PSAPAHGL.js +125 -0
  6. package/dist/ERPTableGroupRow-PSAPAHGL.js.map +1 -0
  7. package/dist/GridPlugin-CJCaYnlw.d.ts +57 -0
  8. package/dist/GridPlugin-oxhq8AsM.d.cts +57 -0
  9. package/dist/GridPresenceService-GEH6535Q.js +3 -0
  10. package/dist/GridPresenceService-GEH6535Q.js.map +1 -0
  11. package/dist/GridPresenceService-RDN5FXHQ.cjs +12 -0
  12. package/dist/GridPresenceService-RDN5FXHQ.cjs.map +1 -0
  13. package/dist/GridSession-B-9lLcoB.d.cts +2492 -0
  14. package/dist/GridSession-Bc7UIawO.d.ts +2492 -0
  15. package/dist/GridSyncService-KTLB4KP3.js +3 -0
  16. package/dist/GridSyncService-KTLB4KP3.js.map +1 -0
  17. package/dist/GridSyncService-TAPAHABV.cjs +12 -0
  18. package/dist/GridSyncService-TAPAHABV.cjs.map +1 -0
  19. package/dist/PdfRenderer-1HFh6UeR.d.ts +22 -0
  20. package/dist/PdfRenderer-CBg7hWNS.d.cts +22 -0
  21. package/dist/RemoteApi-CCQxiSf1.d.cts +28 -0
  22. package/dist/RemoteApi-CCQxiSf1.d.ts +28 -0
  23. package/dist/SelectImpl-NM4O4IGW.js +447 -0
  24. package/dist/SelectImpl-NM4O4IGW.js.map +1 -0
  25. package/dist/SelectImpl-W2EI4T7O.cjs +453 -0
  26. package/dist/SelectImpl-W2EI4T7O.cjs.map +1 -0
  27. package/dist/UITableController-Cuwq481K.d.cts +632 -0
  28. package/dist/UITableController-DU8RopUM.d.ts +632 -0
  29. package/dist/VazirmatnPdfRenderer-BCMpC1zy.d.cts +96 -0
  30. package/dist/VazirmatnPdfRenderer-Dz_G-m3c.d.ts +96 -0
  31. package/dist/adapters/arian-erp.cjs +77 -0
  32. package/dist/adapters/arian-erp.cjs.map +1 -0
  33. package/dist/adapters/arian-erp.d.cts +60 -0
  34. package/dist/adapters/arian-erp.d.ts +60 -0
  35. package/dist/adapters/arian-erp.js +71 -0
  36. package/dist/adapters/arian-erp.js.map +1 -0
  37. package/dist/appendAtEnd-RHIQRG2W.cjs +35 -0
  38. package/dist/appendAtEnd-RHIQRG2W.cjs.map +1 -0
  39. package/dist/appendAtEnd-TJEABLGD.js +33 -0
  40. package/dist/appendAtEnd-TJEABLGD.js.map +1 -0
  41. package/dist/applyImportedRows-BO6yxoAN.d.cts +135 -0
  42. package/dist/applyImportedRows-D4zVY8uD.d.ts +135 -0
  43. package/dist/applyRowVisibilityHandler-KS6TMCBN.js +83 -0
  44. package/dist/applyRowVisibilityHandler-KS6TMCBN.js.map +1 -0
  45. package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs +85 -0
  46. package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs.map +1 -0
  47. package/dist/broadcastChannelTransport-FHUMV76O.cjs +12 -0
  48. package/dist/broadcastChannelTransport-FHUMV76O.cjs.map +1 -0
  49. package/dist/broadcastChannelTransport-MIH53VNZ.js +3 -0
  50. package/dist/broadcastChannelTransport-MIH53VNZ.js.map +1 -0
  51. package/dist/callbackRemoteApi-BlXO5NJz.d.ts +30 -0
  52. package/dist/callbackRemoteApi-DgnXH-i0.d.cts +30 -0
  53. package/dist/cellRenderContext-DB7V_mlu.d.ts +42 -0
  54. package/dist/cellRenderContext-DG5BOlxK.d.cts +42 -0
  55. package/dist/chunk-2BJCRYOS.cjs +936 -0
  56. package/dist/chunk-2BJCRYOS.cjs.map +1 -0
  57. package/dist/chunk-3Y3KKGEC.js +3 -0
  58. package/dist/chunk-3Y3KKGEC.js.map +1 -0
  59. package/dist/chunk-5ALMNLUR.cjs +1408 -0
  60. package/dist/chunk-5ALMNLUR.cjs.map +1 -0
  61. package/dist/chunk-5HKVMPBD.js +937 -0
  62. package/dist/chunk-5HKVMPBD.js.map +1 -0
  63. package/dist/chunk-633KP74Z.js +189 -0
  64. package/dist/chunk-633KP74Z.js.map +1 -0
  65. package/dist/chunk-6XBXZPBW.js +298 -0
  66. package/dist/chunk-6XBXZPBW.js.map +1 -0
  67. package/dist/chunk-77UXAJII.js +112 -0
  68. package/dist/chunk-77UXAJII.js.map +1 -0
  69. package/dist/chunk-ASPTRYRD.cjs +21 -0
  70. package/dist/chunk-ASPTRYRD.cjs.map +1 -0
  71. package/dist/chunk-AU3RDJYQ.js +243 -0
  72. package/dist/chunk-AU3RDJYQ.js.map +1 -0
  73. package/dist/chunk-BHDRUZH5.cjs +33 -0
  74. package/dist/chunk-BHDRUZH5.cjs.map +1 -0
  75. package/dist/chunk-BLYVOV3G.cjs +191 -0
  76. package/dist/chunk-BLYVOV3G.cjs.map +1 -0
  77. package/dist/chunk-CILNIWYW.cjs +100 -0
  78. package/dist/chunk-CILNIWYW.cjs.map +1 -0
  79. package/dist/chunk-DFFP7SJ6.cjs +257 -0
  80. package/dist/chunk-DFFP7SJ6.cjs.map +1 -0
  81. package/dist/chunk-DXRCYW42.cjs +568 -0
  82. package/dist/chunk-DXRCYW42.cjs.map +1 -0
  83. package/dist/chunk-EBV6HGZB.cjs +33 -0
  84. package/dist/chunk-EBV6HGZB.cjs.map +1 -0
  85. package/dist/chunk-EHHHC5JV.js +832 -0
  86. package/dist/chunk-EHHHC5JV.js.map +1 -0
  87. package/dist/chunk-F4PYOYHR.js +112 -0
  88. package/dist/chunk-F4PYOYHR.js.map +1 -0
  89. package/dist/chunk-GQEDLUMB.js +168 -0
  90. package/dist/chunk-GQEDLUMB.js.map +1 -0
  91. package/dist/chunk-H2LESGMX.cjs +319 -0
  92. package/dist/chunk-H2LESGMX.cjs.map +1 -0
  93. package/dist/chunk-HTNJT2QU.js +11674 -0
  94. package/dist/chunk-HTNJT2QU.js.map +1 -0
  95. package/dist/chunk-IIISFUW4.cjs +11786 -0
  96. package/dist/chunk-IIISFUW4.cjs.map +1 -0
  97. package/dist/chunk-IMPCRWYP.cjs +251 -0
  98. package/dist/chunk-IMPCRWYP.cjs.map +1 -0
  99. package/dist/chunk-IPPIXOVQ.js +317 -0
  100. package/dist/chunk-IPPIXOVQ.js.map +1 -0
  101. package/dist/chunk-J4XJ4UBC.js +1404 -0
  102. package/dist/chunk-J4XJ4UBC.js.map +1 -0
  103. package/dist/chunk-J7CPPFXT.cjs +89 -0
  104. package/dist/chunk-J7CPPFXT.cjs.map +1 -0
  105. package/dist/chunk-JOICD47Q.cjs +41 -0
  106. package/dist/chunk-JOICD47Q.cjs.map +1 -0
  107. package/dist/chunk-KHMG6EI2.js +13 -0
  108. package/dist/chunk-KHMG6EI2.js.map +1 -0
  109. package/dist/chunk-KMRURD5J.cjs +15 -0
  110. package/dist/chunk-KMRURD5J.cjs.map +1 -0
  111. package/dist/chunk-KRJG3KMP.cjs +174 -0
  112. package/dist/chunk-KRJG3KMP.cjs.map +1 -0
  113. package/dist/chunk-KUBVDIF7.cjs +653 -0
  114. package/dist/chunk-KUBVDIF7.cjs.map +1 -0
  115. package/dist/chunk-KYAOSBQN.js +31 -0
  116. package/dist/chunk-KYAOSBQN.js.map +1 -0
  117. package/dist/chunk-LJ7LMEXO.js +36 -0
  118. package/dist/chunk-LJ7LMEXO.js.map +1 -0
  119. package/dist/chunk-MT3KLB2Q.cjs +944 -0
  120. package/dist/chunk-MT3KLB2Q.cjs.map +1 -0
  121. package/dist/chunk-MU3RY46O.js +932 -0
  122. package/dist/chunk-MU3RY46O.js.map +1 -0
  123. package/dist/chunk-MUQQKPWR.js +84 -0
  124. package/dist/chunk-MUQQKPWR.js.map +1 -0
  125. package/dist/chunk-N7SJTINL.cjs +4 -0
  126. package/dist/chunk-N7SJTINL.cjs.map +1 -0
  127. package/dist/chunk-NTV2UUAJ.cjs +149 -0
  128. package/dist/chunk-NTV2UUAJ.cjs.map +1 -0
  129. package/dist/chunk-PJQWHF6T.js +31 -0
  130. package/dist/chunk-PJQWHF6T.js.map +1 -0
  131. package/dist/chunk-PQY54EL5.js +248 -0
  132. package/dist/chunk-PQY54EL5.js.map +1 -0
  133. package/dist/chunk-PXCHPZTP.cjs +839 -0
  134. package/dist/chunk-PXCHPZTP.cjs.map +1 -0
  135. package/dist/chunk-Q7TBBUTX.cjs +110 -0
  136. package/dist/chunk-Q7TBBUTX.cjs.map +1 -0
  137. package/dist/chunk-QQMU44KJ.js +612 -0
  138. package/dist/chunk-QQMU44KJ.js.map +1 -0
  139. package/dist/chunk-QZN7R2WP.cjs +114 -0
  140. package/dist/chunk-QZN7R2WP.cjs.map +1 -0
  141. package/dist/chunk-RKVSJU46.js +35 -0
  142. package/dist/chunk-RKVSJU46.js.map +1 -0
  143. package/dist/chunk-RM6ZWNT3.js +561 -0
  144. package/dist/chunk-RM6ZWNT3.js.map +1 -0
  145. package/dist/chunk-SX4VQXAA.cjs +114 -0
  146. package/dist/chunk-SX4VQXAA.cjs.map +1 -0
  147. package/dist/chunk-SZ7BLAY3.js +92 -0
  148. package/dist/chunk-SZ7BLAY3.js.map +1 -0
  149. package/dist/chunk-TN4MG6FY.js +112 -0
  150. package/dist/chunk-TN4MG6FY.js.map +1 -0
  151. package/dist/chunk-UC7PHDM6.cjs +331 -0
  152. package/dist/chunk-UC7PHDM6.cjs.map +1 -0
  153. package/dist/chunk-UXVLYUUW.js +108 -0
  154. package/dist/chunk-UXVLYUUW.js.map +1 -0
  155. package/dist/chunk-VVGYRZ7S.cjs +38 -0
  156. package/dist/chunk-VVGYRZ7S.cjs.map +1 -0
  157. package/dist/chunk-W5256BJ4.js +56 -0
  158. package/dist/chunk-W5256BJ4.js.map +1 -0
  159. package/dist/chunk-WUMOSOEK.cjs +62 -0
  160. package/dist/chunk-WUMOSOEK.cjs.map +1 -0
  161. package/dist/chunk-XLRE2J25.js +140 -0
  162. package/dist/chunk-XLRE2J25.js.map +1 -0
  163. package/dist/chunk-Y6W5V2CI.js +19 -0
  164. package/dist/chunk-Y6W5V2CI.js.map +1 -0
  165. package/dist/chunk-Z4QPZ3Z3.cjs +114 -0
  166. package/dist/chunk-Z4QPZ3Z3.cjs.map +1 -0
  167. package/dist/createEngineGridQuery-Dmq3i5v3.d.cts +884 -0
  168. package/dist/createEngineGridQuery-Mt1hc33m.d.ts +884 -0
  169. package/dist/date-picker-jalali.cjs +263 -0
  170. package/dist/date-picker-jalali.cjs.map +1 -0
  171. package/dist/date-picker-jalali.d.cts +62 -0
  172. package/dist/date-picker-jalali.d.ts +62 -0
  173. package/dist/date-picker-jalali.js +256 -0
  174. package/dist/date-picker-jalali.js.map +1 -0
  175. package/dist/finance.cjs +205 -0
  176. package/dist/finance.cjs.map +1 -0
  177. package/dist/finance.d.cts +90 -0
  178. package/dist/finance.d.ts +90 -0
  179. package/dist/finance.js +157 -0
  180. package/dist/finance.js.map +1 -0
  181. package/dist/foldedColumn-IHDT4ARZ.cjs +66 -0
  182. package/dist/foldedColumn-IHDT4ARZ.cjs.map +1 -0
  183. package/dist/foldedColumn-TFURUKFG.js +64 -0
  184. package/dist/foldedColumn-TFURUKFG.js.map +1 -0
  185. package/dist/headless.cjs +729 -0
  186. package/dist/headless.cjs.map +1 -0
  187. package/dist/headless.d.cts +504 -0
  188. package/dist/headless.d.ts +504 -0
  189. package/dist/headless.js +226 -0
  190. package/dist/headless.js.map +1 -0
  191. package/dist/index-DN8M8Jkq.d.cts +14 -0
  192. package/dist/index-DmzL-F_o.d.ts +14 -0
  193. package/dist/index.cjs +8002 -11409
  194. package/dist/index.cjs.map +1 -1
  195. package/dist/index.d.cts +437 -2305
  196. package/dist/index.d.ts +437 -2305
  197. package/dist/index.js +7244 -11083
  198. package/dist/index.js.map +1 -1
  199. package/dist/locales/ar.cjs +12 -0
  200. package/dist/locales/ar.cjs.map +1 -0
  201. package/dist/locales/ar.d.cts +6 -0
  202. package/dist/locales/ar.d.ts +6 -0
  203. package/dist/locales/ar.js +3 -0
  204. package/dist/locales/ar.js.map +1 -0
  205. package/dist/locales/en.cjs +12 -0
  206. package/dist/locales/en.cjs.map +1 -0
  207. package/dist/locales/en.d.cts +6 -0
  208. package/dist/locales/en.d.ts +6 -0
  209. package/dist/locales/en.js +3 -0
  210. package/dist/locales/en.js.map +1 -0
  211. package/dist/locales/fa.cjs +12 -0
  212. package/dist/locales/fa.cjs.map +1 -0
  213. package/dist/locales/fa.d.cts +6 -0
  214. package/dist/locales/fa.d.ts +6 -0
  215. package/dist/locales/fa.js +3 -0
  216. package/dist/locales/fa.js.map +1 -0
  217. package/dist/locales/index.cjs +51 -0
  218. package/dist/locales/index.cjs.map +1 -0
  219. package/dist/locales/index.d.cts +5 -0
  220. package/dist/locales/index.d.ts +5 -0
  221. package/dist/locales/index.js +6 -0
  222. package/dist/locales/index.js.map +1 -0
  223. package/dist/memoryRecords-AWDKUJ2F.cjs +50 -0
  224. package/dist/memoryRecords-AWDKUJ2F.cjs.map +1 -0
  225. package/dist/memoryRecords-OJTGXLRH.js +47 -0
  226. package/dist/memoryRecords-OJTGXLRH.js.map +1 -0
  227. package/dist/pagedFooterTotals-DXCGDO6F.cjs +27 -0
  228. package/dist/pagedFooterTotals-DXCGDO6F.cjs.map +1 -0
  229. package/dist/pagedFooterTotals-ORWKUNE7.js +25 -0
  230. package/dist/pagedFooterTotals-ORWKUNE7.js.map +1 -0
  231. package/dist/pagedKit-MFGAJFSK.cjs +134 -0
  232. package/dist/pagedKit-MFGAJFSK.cjs.map +1 -0
  233. package/dist/pagedKit-WYWY4LRV.js +127 -0
  234. package/dist/pagedKit-WYWY4LRV.js.map +1 -0
  235. package/dist/pagedSearch-HCPJW7VM.js +38 -0
  236. package/dist/pagedSearch-HCPJW7VM.js.map +1 -0
  237. package/dist/pagedSearch-U3WCG4GN.cjs +42 -0
  238. package/dist/pagedSearch-U3WCG4GN.cjs.map +1 -0
  239. package/dist/plugins/csv.cjs +124 -0
  240. package/dist/plugins/csv.cjs.map +1 -0
  241. package/dist/plugins/csv.d.cts +44 -0
  242. package/dist/plugins/csv.d.ts +44 -0
  243. package/dist/plugins/csv.js +120 -0
  244. package/dist/plugins/csv.js.map +1 -0
  245. package/dist/plugins/excel.cjs +52 -0
  246. package/dist/plugins/excel.cjs.map +1 -0
  247. package/dist/plugins/excel.d.cts +14 -0
  248. package/dist/plugins/excel.d.ts +14 -0
  249. package/dist/plugins/excel.js +7 -0
  250. package/dist/plugins/excel.js.map +1 -0
  251. package/dist/plugins/pdf/fonts/vazirmatn.cjs +50 -0
  252. package/dist/plugins/pdf/fonts/vazirmatn.cjs.map +1 -0
  253. package/dist/plugins/pdf/fonts/vazirmatn.d.cts +24 -0
  254. package/dist/plugins/pdf/fonts/vazirmatn.d.ts +24 -0
  255. package/dist/plugins/pdf/fonts/vazirmatn.js +39 -0
  256. package/dist/plugins/pdf/fonts/vazirmatn.js.map +1 -0
  257. package/dist/plugins/pdf.cjs +24 -0
  258. package/dist/plugins/pdf.cjs.map +1 -0
  259. package/dist/plugins/pdf.d.cts +21 -0
  260. package/dist/plugins/pdf.d.ts +21 -0
  261. package/dist/plugins/pdf.js +7 -0
  262. package/dist/plugins/pdf.js.map +1 -0
  263. package/dist/presence.cjs +56 -0
  264. package/dist/presence.cjs.map +1 -0
  265. package/dist/presence.d.cts +17 -0
  266. package/dist/presence.d.ts +17 -0
  267. package/dist/presence.js +54 -0
  268. package/dist/presence.js.map +1 -0
  269. package/dist/rebuildRowVisibility-66EAZ356.cjs +21 -0
  270. package/dist/rebuildRowVisibility-66EAZ356.cjs.map +1 -0
  271. package/dist/rebuildRowVisibility-6TYM5BP2.js +19 -0
  272. package/dist/rebuildRowVisibility-6TYM5BP2.js.map +1 -0
  273. package/dist/styles.css +1440 -0
  274. package/dist/sync.cjs +148 -0
  275. package/dist/sync.cjs.map +1 -0
  276. package/dist/sync.d.cts +17 -0
  277. package/dist/sync.d.ts +17 -0
  278. package/dist/sync.js +146 -0
  279. package/dist/sync.js.map +1 -0
  280. package/dist/types-D__47BKv.d.cts +23 -0
  281. package/dist/types-D__47BKv.d.ts +23 -0
  282. package/package.json +184 -28
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/plugins/excel/src/ExcelExportPlugin.ts","../packages/plugins/excel/src/applyImportedRows.ts","../packages/plugins/excel/src/mapImportedSheet.ts","../packages/plugins/excel/src/parseXlsxBlob.ts","../packages/plugins/excel/src/ExcelImportPlugin.ts","../packages/plugins/excel/src/exportActiveCollectionToExcelStreaming.ts","../packages/plugins/excel/src/exportActiveCollectionToExcel.ts"],"names":["downloadBlob","hasMeaningfulValue"],"mappings":"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","file":"chunk-EHHHC5JV.js","sourcesContent":["import type {\r\n ExportRequestedPayload,\r\n GridEvent,\r\n} from '../../../../domain/types/GridEvent';\r\nimport type {\r\n GridPlugin,\r\n GridPluginContext,\r\n} from '../../../../application/plugins/GridPlugin';\r\nimport { buildExportTable } from './buildExportTable';\r\nimport { buildXlsxBlob, downloadBlob } from './buildXlsxBlob';\r\n\r\nexport type ExcelExportPluginOptions = {\r\n /** Skip browser download (useful in tests / Node). */\r\n download?: boolean;\r\n onBlob?: (blob: Blob, meta: { fileName: string; rowCount: number; columnCount: number }) => void;\r\n};\r\n\r\n/**\r\n * Subscribes to EXPORT_REQUESTED (format=xlsx); never mutates Domain.\r\n */\r\nexport class ExcelExportPlugin implements GridPlugin {\r\n readonly name = 'excel-export';\r\n private unsub: (() => void) | null = null;\r\n\r\n constructor(private readonly options: ExcelExportPluginOptions = {}) {}\r\n\r\n register(ctx: GridPluginContext): void {\r\n this.unsub = ctx.bus.subscribeAll((event) => {\r\n void this.onEvent(ctx, event);\r\n });\r\n }\r\n\r\n dispose(): void {\r\n this.unsub?.();\r\n this.unsub = null;\r\n }\r\n\r\n private async onEvent(\r\n ctx: GridPluginContext,\r\n event: GridEvent,\r\n ): Promise<void> {\r\n if (event.type !== 'EXPORT_REQUESTED') return;\r\n if (event.tableId !== ctx.tableId) return;\r\n\r\n const payload = event.payload as ExportRequestedPayload;\r\n if (payload.format !== 'xlsx') return;\r\n\r\n try {\r\n const source = ctx.query.getExportSource(payload.collectionScope ?? 'active');\r\n if (!source) {\r\n throw new Error('NO_EXPORT_SOURCE');\r\n }\r\n\r\n const table = buildExportTable(source);\r\n if (table.columns.length === 0 && table.rows.length === 0) {\r\n throw new Error('NO_COLUMNS');\r\n }\r\n\r\n const fileName =\r\n payload.fileName ??\r\n `export-${new Date().toISOString().slice(0, 10)}.xlsx`;\r\n\r\n const blob = buildXlsxBlob(table, {\r\n sheetName: payload.sheetName,\r\n direction: payload.direction ?? 'rtl',\r\n });\r\n\r\n const columnCount = table.columns.length + 1;\r\n const rowCount = table.rows.length;\r\n\r\n if (this.options.download !== false) {\r\n downloadBlob(blob, fileName);\r\n }\r\n this.options.onBlob?.(blob, { fileName, rowCount, columnCount });\r\n\r\n await ctx.bus.publish({\r\n eventId: `${Date.now()}-xlsx-ok`,\r\n type: 'XLSX_EXPORT_COMPLETED',\r\n tableId: ctx.tableId,\r\n streamId: `table/${ctx.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: event.actorId,\r\n correlationId: event.correlationId,\r\n causationId: event.eventId,\r\n payload: {\r\n format: 'xlsx' as const,\r\n rowCount,\r\n columnCount,\r\n },\r\n });\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n await ctx.bus.publish({\r\n eventId: `${Date.now()}-xlsx-fail`,\r\n type: 'XLSX_EXPORT_FAILED',\r\n tableId: ctx.tableId,\r\n streamId: `table/${ctx.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: event.actorId,\r\n correlationId: event.correlationId,\r\n causationId: event.eventId,\r\n payload: {\r\n format: 'xlsx' as const,\r\n code: message === 'NO_COLUMNS' || message === 'NO_EXPORT_SOURCE'\r\n ? message\r\n : 'EXPORT_FAILED',\r\n message,\r\n },\r\n });\r\n }\r\n }\r\n}\r\n","import type { GridSession } from '../../../../application/session/GridSession';\r\nimport type { ImportCellKv } from './mapImportedSheet';\r\n\r\nexport type ApplyImportedRowsResult = {\r\n rowCount: number;\r\n};\r\n\r\n/**\r\n * Applies imported cell matrices through the engine (ADD_NEW_ROWS) so\r\n * CachedTableRepository / IndexedDB persistence stays on the normal path.\r\n *\r\n * Uses a synthetic unique `index` token only for dedupe in Table.addNewRows;\r\n * addNewRow still auto-assigns the real index cell.\r\n */\r\nexport async function applyImportedRows(\r\n session: GridSession,\r\n rows: ImportCellKv[][],\r\n): Promise<ApplyImportedRowsResult> {\r\n if (rows.length === 0) {\r\n return { rowCount: 0 };\r\n }\r\n\r\n const stamp = Date.now();\r\n const engine = session.getEngine();\r\n const payload = rows.map((cells, i) => [\r\n {\r\n key: 'index',\r\n value: `import-${stamp}-${i}`,\r\n display: `import-${stamp}-${i}`,\r\n },\r\n ...cells.filter((c) => c.key !== 'index'),\r\n ]);\r\n\r\n await engine.dispatch({\r\n type: 'ADD_NEW_ROWS',\r\n store: session.store,\r\n tableKey: session.tableKey,\r\n detailFieldKey: 'index',\r\n rows: payload,\r\n autoActivate: false,\r\n });\r\n\r\n return { rowCount: rows.length };\r\n}\r\n","import type { ExportColumnDef } from '../../../../application/plugins/GridPlugin';\r\nimport type { ParsedXlsxSheet } from './parseXlsxBlob';\r\n\r\nexport type ImportCellKv = {\r\n key: string;\r\n value: unknown;\r\n display: unknown;\r\n};\r\n\r\nexport type MappedImportRows = {\r\n columns: Array<{ fieldName: string; fieldType?: string }>;\r\n /** One KeyValue[] per data row (no index column). */\r\n rows: ImportCellKv[][];\r\n};\r\n\r\nfunction normalizeHeader(h: string): string {\r\n return h.trim().toLowerCase().replace(/\\s+/g, ' ');\r\n}\r\n\r\nfunction coerceValue(raw: string, fieldType?: string): unknown {\r\n const text = raw.trim();\r\n if (text === '') return '';\r\n\r\n switch (fieldType) {\r\n case 'number':\r\n case 'price': {\r\n const n = Number(text.replace(/,/g, ''));\r\n return Number.isFinite(n) ? n : text;\r\n }\r\n case 'checkbox': {\r\n const lower = text.toLowerCase();\r\n if (['1', 'true', 'yes', '✔', 'y'].includes(lower)) return true;\r\n if (['0', 'false', 'no', '✘', 'n'].includes(lower)) return false;\r\n return text;\r\n }\r\n default:\r\n return text;\r\n }\r\n}\r\n\r\n/**\r\n * Maps sheet headers to export/query columns by caption or fieldName.\r\n * Skips index/static columns.\r\n */\r\nexport function mapImportedSheet(\r\n sheet: ParsedXlsxSheet,\r\n columns: readonly ExportColumnDef[],\r\n): MappedImportRows {\r\n const importable = columns.filter(\r\n (c) =>\r\n c.fieldName !== 'index' &&\r\n c.fieldType !== 'index' &&\r\n c.fieldType !== 'static',\r\n );\r\n\r\n const byCaption = new Map<string, ExportColumnDef>();\r\n const byField = new Map<string, ExportColumnDef>();\r\n for (const col of importable) {\r\n byField.set(normalizeHeader(col.fieldName), col);\r\n if (col.fieldCaption) {\r\n byCaption.set(normalizeHeader(col.fieldCaption), col);\r\n }\r\n }\r\n\r\n const mappedCols: Array<{ fieldName: string; fieldType?: string; colIndex: number }> =\r\n [];\r\n\r\n sheet.headers.forEach((header, colIndex) => {\r\n const key = normalizeHeader(header);\r\n if (!key) return;\r\n const col = byCaption.get(key) ?? byField.get(key);\r\n if (!col) return;\r\n if (mappedCols.some((m) => m.fieldName === col.fieldName)) return;\r\n mappedCols.push({\r\n fieldName: col.fieldName,\r\n fieldType: col.fieldType,\r\n colIndex,\r\n });\r\n });\r\n\r\n // If headers did not match, fall back to positional mapping of importable columns.\r\n if (mappedCols.length === 0 && sheet.headers.length > 0) {\r\n importable.forEach((col, i) => {\r\n if (i < sheet.headers.length) {\r\n mappedCols.push({\r\n fieldName: col.fieldName,\r\n fieldType: col.fieldType,\r\n colIndex: i,\r\n });\r\n }\r\n });\r\n }\r\n\r\n const rows: ImportCellKv[][] = sheet.rows.map((line) =>\r\n mappedCols.map((m) => {\r\n const raw = line[m.colIndex] ?? '';\r\n const value = coerceValue(raw, m.fieldType);\r\n return { key: m.fieldName, value, display: value };\r\n }),\r\n );\r\n\r\n return {\r\n columns: mappedCols.map(({ fieldName, fieldType }) => ({\r\n fieldName,\r\n fieldType,\r\n })),\r\n rows,\r\n };\r\n}\r\n","import { strFromU8, unzipSync } from 'fflate';\r\n\r\nexport type ParsedXlsxSheet = {\r\n /** First row cells (header captions / field names). */\r\n headers: string[];\r\n /** Body rows; each row length matches headers (padded with ''). */\r\n rows: string[][];\r\n};\r\n\r\nconst textDecoder = new TextDecoder('utf-8');\r\n\r\nfunction toUint8Array(data: Blob | ArrayBuffer | Uint8Array): Promise<Uint8Array> {\r\n if (data instanceof Uint8Array) return Promise.resolve(data);\r\n if (data instanceof ArrayBuffer) return Promise.resolve(new Uint8Array(data));\r\n return data.arrayBuffer().then((buf) => new Uint8Array(buf));\r\n}\r\n\r\nfunction decodeXml(bytes: Uint8Array): string {\r\n return strFromU8(bytes) || textDecoder.decode(bytes);\r\n}\r\n\r\n/** A1 / AA12 → 0-based column index */\r\nfunction colIndexFromRef(ref: string): number {\r\n const letters = ref.match(/^([A-Za-z]+)/)?.[1];\r\n if (!letters) return 0;\r\n let n = 0;\r\n for (const ch of letters.toUpperCase()) {\r\n n = n * 26 + (ch.charCodeAt(0) - 64);\r\n }\r\n return n - 1;\r\n}\r\n\r\nfunction parseSharedStrings(xml: string): string[] {\r\n const out: string[] = [];\r\n // <si>…<t>…</t>…</si> (may include rich text runs)\r\n const siRe = /<si\\b[^>]*>([\\s\\S]*?)<\\/si>/gi;\r\n let m: RegExpExecArray | null;\r\n while ((m = siRe.exec(xml))) {\r\n const inner = m[1];\r\n const parts: string[] = [];\r\n const tRe = /<t\\b[^>]*>([\\s\\S]*?)<\\/t>/gi;\r\n let tm: RegExpExecArray | null;\r\n while ((tm = tRe.exec(inner))) {\r\n parts.push(decodeXmlEntities(tm[1]));\r\n }\r\n out.push(parts.join(''));\r\n }\r\n return out;\r\n}\r\n\r\nfunction decodeXmlEntities(s: string): string {\r\n return s\r\n .replace(/&lt;/g, '<')\r\n .replace(/&gt;/g, '>')\r\n .replace(/&quot;/g, '\"')\r\n .replace(/&apos;/g, \"'\")\r\n .replace(/&amp;/g, '&');\r\n}\r\n\r\nfunction findSheetPath(\r\n files: Record<string, Uint8Array>,\r\n sheetName?: string,\r\n): string {\r\n const preferred = 'xl/worksheets/sheet1.xml';\r\n if (!sheetName) {\r\n if (files[preferred]) return preferred;\r\n const first = Object.keys(files).find((k) =>\r\n /^xl\\/worksheets\\/sheet\\d+\\.xml$/i.test(k),\r\n );\r\n if (!first) throw new Error('NO_SHEET');\r\n return first;\r\n }\r\n\r\n const workbook = files['xl/workbook.xml'];\r\n if (!workbook) throw new Error('NO_WORKBOOK');\r\n const wbXml = decodeXml(workbook);\r\n const sheetRe =\r\n /<sheet\\b[^>]*name=\"([^\"]+)\"[^>]*r:id=\"([^\"]+)\"[^>]*\\/?>/gi;\r\n const nameToRid = new Map<string, string>();\r\n let sm: RegExpExecArray | null;\r\n while ((sm = sheetRe.exec(wbXml))) {\r\n nameToRid.set(sm[1], sm[2]);\r\n }\r\n const rid = nameToRid.get(sheetName);\r\n if (!rid) throw new Error('SHEET_NOT_FOUND');\r\n\r\n const rels = files['xl/_rels/workbook.xml.rels'];\r\n if (!rels) throw new Error('NO_RELS');\r\n const relsXml = decodeXml(rels);\r\n const relRe =\r\n /<Relationship\\b[^>]*Id=\"([^\"]+)\"[^>]*Target=\"([^\"]+)\"[^>]*\\/?>/gi;\r\n let rm: RegExpExecArray | null;\r\n while ((rm = relRe.exec(relsXml))) {\r\n if (rm[1] === rid) {\r\n const target = rm[2].replace(/^\\//, '');\r\n const path = target.startsWith('xl/') ? target : `xl/${target}`;\r\n if (!files[path]) throw new Error('NO_SHEET');\r\n return path;\r\n }\r\n }\r\n throw new Error('SHEET_NOT_FOUND');\r\n}\r\n\r\ntype CellVal = { col: number; text: string };\r\n\r\nfunction parseSheetRows(\r\n sheetXml: string,\r\n shared: string[],\r\n): { headers: string[]; rows: string[][] } {\r\n const rowRe = /<row\\b[^>]*>([\\s\\S]*?)<\\/row>/gi;\r\n const matrix: CellVal[][] = [];\r\n\r\n let rowMatch: RegExpExecArray | null;\r\n while ((rowMatch = rowRe.exec(sheetXml))) {\r\n const rowXml = rowMatch[1];\r\n const cells: CellVal[] = [];\r\n const cellRe = /<c\\b([^>]*)>([\\s\\S]*?)<\\/c>|<c\\b([^>]*)\\/>/gi;\r\n let cm: RegExpExecArray | null;\r\n while ((cm = cellRe.exec(rowXml))) {\r\n const attrs = cm[1] ?? cm[3] ?? '';\r\n const body = cm[2] ?? '';\r\n const ref = attrs.match(/\\br=\"([^\"]+)\"/)?.[1] ?? '';\r\n const t = attrs.match(/\\bt=\"([^\"]+)\"/)?.[1] ?? '';\r\n const col = colIndexFromRef(ref);\r\n\r\n let text = '';\r\n if (t === 'inlineStr') {\r\n const tm = body.match(/<t\\b[^>]*>([\\s\\S]*?)<\\/t>/i);\r\n text = tm ? decodeXmlEntities(tm[1]) : '';\r\n } else if (t === 's') {\r\n const vm = body.match(/<v\\b[^>]*>([\\s\\S]*?)<\\/v>/i);\r\n const idx = vm ? Number(vm[1]) : -1;\r\n text = idx >= 0 ? (shared[idx] ?? '') : '';\r\n } else {\r\n const vm = body.match(/<v\\b[^>]*>([\\s\\S]*?)<\\/v>/i);\r\n text = vm ? decodeXmlEntities(vm[1]) : '';\r\n }\r\n cells.push({ col, text });\r\n }\r\n matrix.push(cells);\r\n }\r\n\r\n if (matrix.length === 0) {\r\n return { headers: [], rows: [] };\r\n }\r\n\r\n const maxCol = Math.max(\r\n 0,\r\n ...matrix.flatMap((r) => r.map((c) => c.col)),\r\n );\r\n\r\n const dense = matrix.map((rowCells) => {\r\n const line = Array.from({ length: maxCol + 1 }, () => '');\r\n for (const c of rowCells) {\r\n if (c.col >= 0 && c.col <= maxCol) line[c.col] = c.text;\r\n }\r\n return line;\r\n });\r\n\r\n // Exported files put a row-number column in A; drop it when header looks like ردیف/Row/#.\r\n const header = dense[0] ?? [];\r\n const rowHeaderHints = new Set(['ردیف', 'row', '#', 'row · actions', 'row number']);\r\n const dropFirst =\r\n header.length > 1 &&\r\n rowHeaderHints.has(header[0].trim().toLowerCase());\r\n\r\n const slice = (line: string[]) => (dropFirst ? line.slice(1) : line);\r\n const headers = slice(header).map((h) => h.trim());\r\n const rows = dense\r\n .slice(1)\r\n .map(slice)\r\n .map((line) => {\r\n const padded = Array.from({ length: headers.length }, (_, i) => line[i] ?? '');\r\n return padded;\r\n })\r\n .filter((line) => line.some((c) => c.trim() !== ''));\r\n\r\n return { headers, rows };\r\n}\r\n\r\n/**\r\n * Parses a minimal OOXML .xlsx (store or deflate) into a string matrix.\r\n * Supports shared strings and inlineStr (as produced by buildXlsxBlob).\r\n */\r\nexport async function parseXlsxBlob(\r\n data: Blob | ArrayBuffer | Uint8Array,\r\n options?: { sheetName?: string },\r\n): Promise<ParsedXlsxSheet> {\r\n const bytes = await toUint8Array(data);\r\n let files: Record<string, Uint8Array>;\r\n try {\r\n files = unzipSync(bytes);\r\n } catch {\r\n throw new Error('INVALID_XLSX');\r\n }\r\n\r\n const sharedPath = Object.keys(files).find((k) =>\r\n /xl\\/sharedStrings\\.xml$/i.test(k),\r\n );\r\n const shared = sharedPath\r\n ? parseSharedStrings(decodeXml(files[sharedPath]))\r\n : [];\r\n\r\n const sheetPath = findSheetPath(files, options?.sheetName);\r\n return parseSheetRows(decodeXml(files[sheetPath]), shared);\r\n}\r\n","import type {\r\n GridEvent,\r\n ImportRequestedPayload,\r\n} from '../../../../domain/types/GridEvent';\r\nimport type {\r\n GridPlugin,\r\n GridPluginContext,\r\n} from '../../../../application/plugins/GridPlugin';\r\nimport { applyImportedRows } from './applyImportedRows';\r\nimport { mapImportedSheet } from './mapImportedSheet';\r\nimport { parseXlsxBlob } from './parseXlsxBlob';\r\n\r\nexport type ExcelImportPluginOptions = {\r\n onImported?: (meta: { rowCount: number; columnCount: number }) => void;\r\n};\r\n\r\n/**\r\n * Subscribes to IMPORT_REQUESTED (format=xlsx); mutates domain only via\r\n * session/engine commands (never touches Entity directly).\r\n */\r\nexport class ExcelImportPlugin implements GridPlugin {\r\n readonly name = 'excel-import';\r\n private unsub: (() => void) | null = null;\r\n\r\n constructor(private readonly options: ExcelImportPluginOptions = {}) {}\r\n\r\n register(ctx: GridPluginContext): void {\r\n this.unsub = ctx.bus.subscribeAll((event) => {\r\n void this.onEvent(ctx, event);\r\n });\r\n }\r\n\r\n dispose(): void {\r\n this.unsub?.();\r\n this.unsub = null;\r\n }\r\n\r\n private async onEvent(\r\n ctx: GridPluginContext,\r\n event: GridEvent,\r\n ): Promise<void> {\r\n if (event.type !== 'IMPORT_REQUESTED') return;\r\n if (event.tableId !== ctx.tableId) return;\r\n\r\n const payload = event.payload as ImportRequestedPayload;\r\n if (payload.format !== 'xlsx') return;\r\n\r\n try {\r\n const correlationId = event.correlationId;\r\n if (!correlationId) {\r\n throw new Error('NO_IMPORT_DATA');\r\n }\r\n const bytes = ctx.resolveImportData?.(correlationId);\r\n if (!bytes || bytes.byteLength === 0) {\r\n throw new Error('NO_IMPORT_DATA');\r\n }\r\n\r\n const source = ctx.query.getExportSource(payload.collectionScope ?? 'active');\r\n if (!source) {\r\n throw new Error('NO_IMPORT_TARGET');\r\n }\r\n\r\n const sheet = await parseXlsxBlob(bytes, {\r\n sheetName: payload.sheetName,\r\n });\r\n if (sheet.headers.length === 0) {\r\n throw new Error('NO_COLUMNS');\r\n }\r\n\r\n const mapped = mapImportedSheet(sheet, source.columns);\r\n if (mapped.columns.length === 0) {\r\n throw new Error('NO_COLUMN_MATCH');\r\n }\r\n\r\n const { rowCount } = await applyImportedRows(ctx.session, mapped.rows);\r\n const columnCount = mapped.columns.length;\r\n\r\n this.options.onImported?.({ rowCount, columnCount });\r\n\r\n await ctx.bus.publish({\r\n eventId: `${Date.now()}-xlsx-import-ok`,\r\n type: 'XLSX_IMPORT_COMPLETED',\r\n tableId: ctx.tableId,\r\n streamId: `table/${ctx.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: event.actorId,\r\n correlationId: event.correlationId,\r\n causationId: event.eventId,\r\n payload: {\r\n format: 'xlsx' as const,\r\n rowCount,\r\n columnCount,\r\n },\r\n });\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n const known = new Set([\r\n 'NO_IMPORT_DATA',\r\n 'NO_IMPORT_TARGET',\r\n 'NO_COLUMNS',\r\n 'NO_COLUMN_MATCH',\r\n 'INVALID_XLSX',\r\n 'NO_SHEET',\r\n 'SHEET_NOT_FOUND',\r\n ]);\r\n await ctx.bus.publish({\r\n eventId: `${Date.now()}-xlsx-import-fail`,\r\n type: 'XLSX_IMPORT_FAILED',\r\n tableId: ctx.tableId,\r\n streamId: `table/${ctx.tableId}/view`,\r\n version: 0,\r\n occurredAt: Date.now(),\r\n actorId: event.actorId,\r\n correlationId: event.correlationId,\r\n causationId: event.eventId,\r\n payload: {\r\n format: 'xlsx' as const,\r\n code: known.has(message) ? message : 'IMPORT_FAILED',\r\n message,\r\n },\r\n });\r\n }\r\n }\r\n}\r\n","/**\r\n * Streaming xlsx export for page-window mode (persistence 'paged-idb').\r\n *\r\n * Memory Iron Rule: two cursor passes over IndexedDB (columns-with-data, then\r\n * chunk-by-chunk XML coalesced into Blobs) — the dataset is never in the heap.\r\n * Ported from the arianERP host table; used by `exportActiveCollectionToExcel`\r\n * when the controller is in paged mode.\r\n */\r\nimport { RowStateEnum } from '../../../../domain/value-objects';\r\nimport type { ColumnSchema } from '../../../../domain/types/ColumnSchema';\r\nimport type { UITableController } from '../../../../infrastructure/ui/UITableController';\r\nimport { formatExportValue } from './formatExportValue';\r\n\r\nconst EMPTY_PLACEHOLDERS = new Set(['انتخاب کنید', 'select', 'Select']);\r\n\r\nconst escapeXml = (value: string) =>\r\n value\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&apos;');\r\n\r\nconst hasMeaningfulValue = (value: unknown) =>\r\n value !== undefined && value !== null && value !== '';\r\n\r\n/** Plain serialized cell as streamed from IndexedDB. */\r\ntype StreamCell = { value: unknown; originalValue: unknown; display: unknown };\r\ntype StreamRecord = {\r\n rowId: number;\r\n collection: string;\r\n sortIndex: number;\r\n rowState: string;\r\n cells: Record<string, StreamCell>;\r\n};\r\n\r\nconst getExportColumns = (controller: UITableController): ColumnSchema[] => {\r\n const view = controller.getViewState();\r\n const columns =\r\n view?.activeCollectionColumn?.length\r\n ? view.activeCollectionColumn\r\n : (view?.columns ?? []);\r\n\r\n return columns\r\n .filter((col) => col.fieldType !== 'index')\r\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n};\r\n\r\nconst isExportableRecord = (record: StreamRecord): boolean => {\r\n if (record.rowState === RowStateEnum.Deleted) return false;\r\n\r\n return Object.entries(record.cells).some(\r\n ([key, cell]) => key !== 'index' && hasMeaningfulValue(cell.value),\r\n );\r\n};\r\n\r\nconst getRecordExportText = (record: StreamRecord, column: ColumnSchema): string => {\r\n const cell = record.cells[column.fieldName];\r\n if (!cell) return '';\r\n\r\n const raw = cell.display ?? cell.value;\r\n if (!hasMeaningfulValue(raw)) return '';\r\n\r\n const text = formatExportValue(raw, column.fieldType).trim();\r\n if (!text || EMPTY_PLACEHOLDERS.has(text)) return '';\r\n\r\n return text;\r\n};\r\n\r\n/** 0-based column index → A, B, … Z, AA, … */\r\nconst toColumnLetter = (index: number): string => {\r\n let n = index + 1;\r\n let result = '';\r\n while (n > 0) {\r\n const rem = (n - 1) % 26;\r\n result = String.fromCharCode(65 + rem) + result;\r\n n = Math.floor((n - 1) / 26);\r\n }\r\n return result;\r\n};\r\n\r\nconst crcTable = (() => {\r\n const table = new Uint32Array(256);\r\n for (let i = 0; i < 256; i += 1) {\r\n let c = i;\r\n for (let k = 0; k < 8; k += 1) {\r\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 8;\r\n c = c >>> 0;\r\n }\r\n table[i] = c >>> 0;\r\n }\r\n return table;\r\n})();\r\n\r\nconst crc32 = (data: Uint8Array): number => {\r\n let crc = 0xffffffff;\r\n for (let i = 0; i < data.length; i += 1) {\r\n crc = crcTable[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);\r\n }\r\n return (crc ^ 0xffffffff) >>> 0;\r\n};\r\n\r\n/** Rolling CRC32 over a byte stream (chunk-by-chunk, no full buffer). */\r\nclass IncrementalCrc {\r\n private crc = 0xffffffff;\r\n private length = 0;\r\n\r\n update(data: Uint8Array): void {\r\n for (let i = 0; i < data.length; i += 1) {\r\n this.crc = crcTable[(this.crc ^ data[i]) & 0xff] ^ (this.crc >>> 8);\r\n this.crc = this.crc >>> 0;\r\n }\r\n this.length += data.length;\r\n }\r\n\r\n finish(): { crc: number; size: number } {\r\n return { crc: (this.crc ^ 0xffffffff) >>> 0, size: this.length };\r\n }\r\n}\r\n\r\nconst textEncoder = new TextEncoder();\r\n\r\ntype ZipEntry = { name: string; data: Uint8Array<ArrayBuffer> | Blob; crc?: number; size?: number };\r\n\r\n/** Minimal ZIP (store / no compression) for OOXML .xlsx. */\r\nconst buildZip = (entries: ZipEntry[]): Blob => {\r\n const parts: BlobPart[] = [];\r\n const centralParts: Uint8Array[] = [];\r\n let offset = 0;\r\n\r\n for (const entry of entries) {\r\n const nameBytes = textEncoder.encode(entry.name);\r\n const data = entry.data;\r\n const size =\r\n entry.size ?? (data instanceof Uint8Array ? data.length : data.size);\r\n const crc = entry.crc ?? (data instanceof Uint8Array ? crc32(data) : 0);\r\n\r\n const local = new Uint8Array(30 + nameBytes.length);\r\n const lv = new DataView(local.buffer);\r\n lv.setUint32(0, 0x04034b50, true);\r\n lv.setUint16(4, 20, true);\r\n lv.setUint16(6, 0, true);\r\n lv.setUint16(8, 0, true); // store\r\n lv.setUint16(10, 0, true);\r\n lv.setUint16(12, 0, true);\r\n lv.setUint32(14, crc, true);\r\n lv.setUint32(18, size, true);\r\n lv.setUint32(22, size, true);\r\n lv.setUint16(26, nameBytes.length, true);\r\n lv.setUint16(28, 0, true);\r\n local.set(nameBytes, 30);\r\n\r\n parts.push(local, data);\r\n\r\n const central = new Uint8Array(46 + nameBytes.length);\r\n const cv = new DataView(central.buffer);\r\n cv.setUint32(0, 0x02014b50, true);\r\n cv.setUint16(4, 20, true);\r\n cv.setUint16(6, 20, true);\r\n cv.setUint16(8, 0, true);\r\n cv.setUint16(10, 0, true);\r\n cv.setUint16(12, 0, true);\r\n cv.setUint16(14, 0, true);\r\n cv.setUint32(16, crc, true);\r\n cv.setUint32(20, size, true);\r\n cv.setUint32(24, size, true);\r\n cv.setUint16(28, nameBytes.length, true);\r\n cv.setUint16(30, 0, true);\r\n cv.setUint16(32, 0, true);\r\n cv.setUint16(34, 0, true);\r\n cv.setUint16(36, 0, true);\r\n cv.setUint32(38, 0, true);\r\n cv.setUint32(42, offset, true);\r\n central.set(nameBytes, 46);\r\n centralParts.push(central);\r\n\r\n offset += local.length + size;\r\n }\r\n\r\n const centralSize = centralParts.reduce((sum, p) => sum + p.length, 0);\r\n const end = new Uint8Array(22);\r\n const ev = new DataView(end.buffer);\r\n ev.setUint32(0, 0x06054b50, true);\r\n ev.setUint16(4, 0, true);\r\n ev.setUint16(6, 0, true);\r\n ev.setUint16(8, entries.length, true);\r\n ev.setUint16(10, entries.length, true);\r\n ev.setUint32(12, centralSize, true);\r\n ev.setUint32(16, offset, true);\r\n ev.setUint16(20, 0, true);\r\n\r\n return new Blob([...parts, ...centralParts, end] as BlobPart[], {\r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n });\r\n};\r\n\r\nconst buildStylesXml = (direction: 'rtl' | 'ltr') => {\r\n // OOXML readingOrder: 1 = LTR, 2 = RTL\r\n const readingOrder = direction === 'rtl' ? 2 : 1;\r\n const horizontal = direction === 'rtl' ? 'right' : 'left';\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\r\n <fonts count=\"3\">\r\n <font><sz val=\"10\"/><name val=\"Tahoma\"/></font>\r\n <font><b/><sz val=\"11\"/><color rgb=\"FFFFFFFF\"/><name val=\"Tahoma\"/></font>\r\n <font><b/><sz val=\"10\"/><name val=\"Tahoma\"/></font>\r\n </fonts>\r\n <fills count=\"4\">\r\n <fill><patternFill patternType=\"none\"/></fill>\r\n <fill><patternFill patternType=\"gray125\"/></fill>\r\n <fill><patternFill patternType=\"solid\"><fgColor rgb=\"FF2F5496\"/></patternFill></fill>\r\n <fill><patternFill patternType=\"solid\"><fgColor rgb=\"FFD6EAF8\"/></patternFill></fill>\r\n </fills>\r\n <borders count=\"2\">\r\n <border><left/><right/><top/><bottom/><diagonal/></border>\r\n <border>\r\n <left style=\"thin\"><color rgb=\"FFBDD7EE\"/></left>\r\n <right style=\"thin\"><color rgb=\"FFBDD7EE\"/></right>\r\n <top style=\"thin\"><color rgb=\"FFBDD7EE\"/></top>\r\n <bottom style=\"thin\"><color rgb=\"FFBDD7EE\"/></bottom>\r\n </border>\r\n </borders>\r\n <cellStyleXfs count=\"1\">\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/>\r\n </cellStyleXfs>\r\n <cellXfs count=\"6\">\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>\r\n <xf numFmtId=\"0\" fontId=\"1\" fillId=\"2\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"center\" vertical=\"center\" wrapText=\"1\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"3\" borderId=\"1\" xfId=\"0\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"${horizontal}\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"${horizontal}\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"2\" fillId=\"3\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"center\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"2\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"center\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n </cellXfs>\r\n</styleSheet>`;\r\n};\r\n\r\nconst inlineStrCell = (ref: string, text: string, styleId: number) =>\r\n `<c r=\"${ref}\" t=\"inlineStr\" s=\"${styleId}\"><is><t>${escapeXml(text)}</t></is></c>`;\r\n\r\nconst numberCell = (ref: string, value: number, styleId: number) =>\r\n `<c r=\"${ref}\" s=\"${styleId}\"><v>${value}</v></c>`;\r\n\r\nconst recordToRowXml = (\r\n record: StreamRecord,\r\n columns: ColumnSchema[],\r\n excelRow: number,\r\n): string => {\r\n const isOdd = (excelRow - 2) % 2 === 0;\r\n const dataStyle = isOdd ? 2 : 3;\r\n const rowNumStyle = isOdd ? 4 : 5;\r\n\r\n const cells = [\r\n numberCell(`A${excelRow}`, excelRow - 1, rowNumStyle),\r\n ...columns.map((col, i) =>\r\n inlineStrCell(\r\n `${toColumnLetter(i + 1)}${excelRow}`,\r\n getRecordExportText(record, col),\r\n dataStyle,\r\n ),\r\n ),\r\n ].join('');\r\n\r\n return `<row r=\"${excelRow}\" ht=\"18\" customHeight=\"1\">${cells}</row>`;\r\n};\r\n\r\nconst buildSheetHeaderXml = (\r\n columns: ColumnSchema[],\r\n options: { direction: 'rtl' | 'ltr'; rowHeaderLabel: string },\r\n): string => {\r\n const { direction, rowHeaderLabel } = options;\r\n const rightToLeft = direction === 'rtl' ? '1' : '0';\r\n const totalCols = columns.length + 1;\r\n\r\n const colsXml = Array.from({ length: totalCols }, (_, i) => {\r\n const width = i === 0 ? 6 : 18;\r\n return `<col min=\"${i + 1}\" max=\"${i + 1}\" width=\"${width}\" customWidth=\"1\"/>`;\r\n }).join('');\r\n\r\n const headerCells = [\r\n inlineStrCell('A1', rowHeaderLabel, 1),\r\n ...columns.map((col, i) =>\r\n inlineStrCell(\r\n `${toColumnLetter(i + 1)}1`,\r\n col.fieldCaption ?? col.fieldName,\r\n 1,\r\n ),\r\n ),\r\n ].join('');\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n <sheetViews>\r\n <sheetView workbookViewId=\"0\" rightToLeft=\"${rightToLeft}\"/>\r\n </sheetViews>\r\n <cols>${colsXml}</cols>\r\n <sheetData>\r\n <row r=\"1\" ht=\"22\" customHeight=\"1\">${headerCells}</row>`;\r\n};\r\n\r\n/**\r\n * Pass 1: stream records to find which columns have data (same semantics as\r\n * the previous full-array getColumnsWithData) — nothing retained per row.\r\n */\r\nconst findColumnsWithData = async (\r\n controller: UITableController,\r\n candidates: ColumnSchema[],\r\n): Promise<ColumnSchema[]> => {\r\n const pending = new Set(candidates.map((c) => c.fieldName));\r\n const byField = new Map(candidates.map((c) => [c.fieldName, c]));\r\n\r\n await controller.iterateRowsFromDb('active', async (records) => {\r\n for (const record of records) {\r\n if (!isExportableRecord(record)) continue;\r\n for (const field of Array.from(pending)) {\r\n if (getRecordExportText(record, byField.get(field)!) !== '') {\r\n pending.delete(field);\r\n }\r\n }\r\n if (pending.size === 0) return false; // early stop\r\n }\r\n });\r\n\r\n return candidates.filter((c) => !pending.has(c.fieldName));\r\n};\r\n\r\n/**\r\n * Pass 2: stream records again, converting each filtered row to an XML chunk\r\n * immediately. Chunks are coalesced into disk-backed Blobs periodically, so\r\n * the JS heap holds only the current batch — the full dataset never lands\r\n * in memory. The sheet's CRC32 and size are computed incrementally so the\r\n * ZIP entry metadata is known without buffering the whole sheet.\r\n */\r\nconst buildSheetBlobStreaming = async (\r\n controller: UITableController,\r\n columns: ColumnSchema[],\r\n options: { direction: 'rtl' | 'ltr'; rowHeaderLabel: string },\r\n): Promise<{ blob: Blob; rowCount: number; crc: number; size: number }> => {\r\n const crc = new IncrementalCrc();\r\n const blobParts: BlobPart[] = [];\r\n let pendingChunks: Uint8Array[] = [];\r\n let pendingBytes = 0;\r\n let rowCount = 0;\r\n\r\n const pushChunk = (text: string) => {\r\n const bytes = textEncoder.encode(text);\r\n crc.update(bytes);\r\n pendingChunks.push(bytes);\r\n pendingBytes += bytes.length;\r\n // Coalesce into a Blob so bytes leave the JS heap (browser blob store).\r\n if (pendingBytes >= 4 * 1024 * 1024) {\r\n blobParts.push(new Blob(pendingChunks as BlobPart[]));\r\n pendingChunks = [];\r\n pendingBytes = 0;\r\n }\r\n };\r\n\r\n pushChunk(buildSheetHeaderXml(columns, options));\r\n\r\n await controller.iterateRowsFromDb('active', async (records) => {\r\n for (const record of records) {\r\n if (!isExportableRecord(record)) continue;\r\n rowCount += 1;\r\n // Excel row numbers are 1-based with the header at row 1.\r\n pushChunk(recordToRowXml(record, columns, rowCount + 1));\r\n }\r\n });\r\n\r\n pushChunk(`\r\n </sheetData>\r\n</worksheet>`);\r\n\r\n if (pendingChunks.length > 0) {\r\n blobParts.push(new Blob(pendingChunks as BlobPart[]));\r\n }\r\n\r\n const { crc: sheetCrc, size } = crc.finish();\r\n return { blob: new Blob(blobParts), rowCount, crc: sheetCrc, size };\r\n};\r\n\r\nconst downloadBlob = (blob: Blob, fileName: string) => {\r\n const url = URL.createObjectURL(blob);\r\n const anchor = document.createElement('a');\r\n anchor.href = url;\r\n anchor.download = fileName;\r\n document.body.appendChild(anchor);\r\n anchor.click();\r\n document.body.removeChild(anchor);\r\n URL.revokeObjectURL(url);\r\n};\r\n\r\nexport type ExportActiveCollectionResult = {\r\n rowCount: number;\r\n columnCount: number;\r\n};\r\n\r\nexport type ExportActiveCollectionOptions = {\r\n fileName?: string;\r\n sheetName?: string;\r\n direction?: 'rtl' | 'ltr';\r\n rowHeaderLabel?: string;\r\n /** When false, skip browser download (tests). */\r\n download?: boolean;\r\n};\r\n\r\n/**\r\n * Exports all meaningful rows of the active collection (streamed from\r\n * IndexedDB — the source of truth) with column captions to Excel.\r\n * The dataset streams through in bounded batches; the full row set is never\r\n * held in the JS heap, so a 50k-row export costs the same heap as a 10-row one.\r\n * Sheet direction follows app RTL/LTR (Excel / Google Sheets sheet view).\r\n */\r\nexport async function exportActiveCollectionToExcelStreaming(\r\n controller: UITableController,\r\n options?: ExportActiveCollectionOptions,\r\n): Promise<ExportActiveCollectionResult> {\r\n const allColumns = getExportColumns(controller);\r\n // Two-pass streaming preserves the previous behavior of dropping columns\r\n // that have no data in any exported row.\r\n const columns = await findColumnsWithData(controller, allColumns);\r\n\r\n const direction = options?.direction ?? 'rtl';\r\n const rowHeaderLabel = options?.rowHeaderLabel ?? 'ردیف';\r\n const sheetName = options?.sheetName ?? 'Sheet1';\r\n const fileName =\r\n options?.fileName ??\r\n `export-${new Date().toISOString().slice(0, 10)}.xlsx`;\r\n\r\n // Yield so UI can paint loading state before the streaming build.\r\n await new Promise<void>((resolve) => {\r\n if (typeof setTimeout === 'function') setTimeout(resolve, 0);\r\n else resolve();\r\n });\r\n\r\n const { blob: sheetBlob, rowCount, crc: sheetCrc, size: sheetSize } =\r\n await buildSheetBlobStreaming(controller, columns, {\r\n direction,\r\n rowHeaderLabel,\r\n });\r\n\r\n if (columns.length === 0 && rowCount === 0) {\r\n throw new Error('NO_COLUMNS');\r\n }\r\n\r\n const safeSheetName = (sheetName.slice(0, 31) || 'Sheet1').replace(\r\n /[\\\\/*?:\\[\\]]/g,\r\n '',\r\n );\r\n\r\n const contentTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\r\n <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\r\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\r\n <Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>\r\n <Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>\r\n <Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>\r\n</Types>`;\r\n\r\n const rootRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>\r\n</Relationships>`;\r\n\r\n const workbook = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n <sheets>\r\n <sheet name=\"${escapeXml(safeSheetName)}\" sheetId=\"1\" r:id=\"rId1\"/>\r\n </sheets>\r\n</workbook>`;\r\n\r\n const workbookRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet1.xml\"/>\r\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>\r\n</Relationships>`;\r\n\r\n const styles = buildStylesXml(direction);\r\n\r\n const zip = buildZip([\r\n { name: '[Content_Types].xml', data: textEncoder.encode(contentTypes) },\r\n { name: '_rels/.rels', data: textEncoder.encode(rootRels) },\r\n { name: 'xl/workbook.xml', data: textEncoder.encode(workbook) },\r\n {\r\n name: 'xl/_rels/workbook.xml.rels',\r\n data: textEncoder.encode(workbookRels),\r\n },\r\n { name: 'xl/styles.xml', data: textEncoder.encode(styles) },\r\n {\r\n name: 'xl/worksheets/sheet1.xml',\r\n data: sheetBlob,\r\n crc: sheetCrc,\r\n size: sheetSize,\r\n },\r\n ]);\r\n if (options?.download !== false) downloadBlob(zip, fileName);\r\n\r\n // +1 for the synthetic row-number column\r\n return { rowCount, columnCount: columns.length + 1 };\r\n}\r\n","import type { UITableController } from '../../../../infrastructure/ui/UITableController';\r\nimport { RowStateEnum } from '../../../../domain/value-objects';\r\nimport type { ExportSource } from '../../../../application/plugins/GridPlugin';\r\nimport { buildExportTable } from './buildExportTable';\r\nimport { buildXlsxBlob, downloadBlob } from './buildXlsxBlob';\r\nimport { exportActiveCollectionToExcelStreaming } from './exportActiveCollectionToExcelStreaming';\r\n\r\nexport type ExportActiveCollectionResult = {\r\n rowCount: number;\r\n columnCount: number;\r\n};\r\n\r\nexport type ExportActiveCollectionOptions = {\r\n fileName?: string;\r\n sheetName?: string;\r\n direction?: 'rtl' | 'ltr';\r\n rowHeaderLabel?: string;\r\n /** When false, skip browser download (tests). */\r\n download?: boolean;\r\n};\r\n\r\nconst hasMeaningfulValue = (value: unknown) =>\r\n value !== undefined && value !== null && value !== '';\r\n\r\n/**\r\n * Imperative facade used by ERP toolbar buttons.\r\n * Prefer PluginHost.requestExport + ExcelExportPlugin for event-driven hosts.\r\n */\r\nexport async function exportActiveCollectionToExcel(\r\n controller: UITableController,\r\n options?: ExportActiveCollectionOptions,\r\n): Promise<ExportActiveCollectionResult> {\r\n // Page-window mode: only one page is in RAM — stream the full set from\r\n // IndexedDB instead of materializing rows.\r\n if (controller.isPagedWindow()) {\r\n return exportActiveCollectionToExcelStreaming(controller, options);\r\n }\r\n const view = controller.getViewState();\r\n const columns = (\r\n view?.activeCollectionColumn?.length\r\n ? view.activeCollectionColumn\r\n : (view?.columns ?? [])\r\n )\r\n .filter((col) => col.fieldType !== 'index')\r\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n\r\n const rows = (controller.getAllRows() ?? []).filter((row) => {\r\n if (row.rowState.value === RowStateEnum.Deleted) return false;\r\n return Array.from(row.getCells().entries()).some(\r\n ([key, cell]) => key !== 'index' && hasMeaningfulValue(cell.getValue()),\r\n );\r\n });\r\n\r\n const source: ExportSource = {\r\n columns: columns.map((col) => ({\r\n fieldName: col.fieldName,\r\n fieldCaption: col.fieldCaption,\r\n fieldType: col.fieldType,\r\n order: col.order,\r\n })),\r\n rows: rows.map((row) => ({\r\n id: row.id.value,\r\n rowState: String(row.rowState.value),\r\n cells: Object.fromEntries(\r\n [...row.getCells()].map(([key, cell]) => [\r\n key,\r\n { value: cell.getValue(), display: cell.getDisplay() },\r\n ]),\r\n ),\r\n })),\r\n };\r\n\r\n const table = buildExportTable(source);\r\n if (table.columns.length === 0 && table.rows.length === 0) {\r\n throw new Error('NO_COLUMNS');\r\n }\r\n\r\n const direction = options?.direction ?? 'rtl';\r\n const rowHeaderLabel = options?.rowHeaderLabel ?? 'ردیف';\r\n const sheetName = options?.sheetName ?? 'Sheet1';\r\n const fileName =\r\n options?.fileName ??\r\n `export-${new Date().toISOString().slice(0, 10)}.xlsx`;\r\n\r\n await new Promise<void>((resolve) => {\r\n if (typeof setTimeout === 'function') setTimeout(resolve, 0);\r\n else resolve();\r\n });\r\n\r\n const blob = buildXlsxBlob(table, {\r\n direction,\r\n rowHeaderLabel,\r\n sheetName,\r\n });\r\n\r\n if (options?.download !== false) {\r\n downloadBlob(blob, fileName);\r\n }\r\n\r\n return { rowCount: table.rows.length, columnCount: table.columns.length + 1 };\r\n}\r\n"]}
@@ -0,0 +1,112 @@
1
+ // ui/locales/fa.ts
2
+ var faMessages = {
3
+ "general.addNewRow": "\u0627\u0641\u0632\u0648\u062F\u0646 \u0633\u0637\u0631",
4
+ "general.copy": "\u06A9\u067E\u06CC",
5
+ "general.cut": "\u0628\u0631\u0634",
6
+ "general.paste": "\u0686\u0633\u0628\u0627\u0646\u062F\u0646",
7
+ "general.delete": "\u062D\u0630\u0641",
8
+ "general.chooseFromList": "\u0627\u0646\u062A\u062E\u0627\u0628 \u0627\u0632 \u0644\u06CC\u0633\u062A",
9
+ "general.toggle": "\u0627\u0646\u062A\u062E\u0627\u0628 \u0647\u0645\u0647",
10
+ "general.exportToExcel": "\u062E\u0631\u0648\u062C\u06CC \u0627\u06A9\u0633\u0644",
11
+ "general.exportToExcelSuccess": "\u062E\u0631\u0648\u062C\u06CC \u0627\u06A9\u0633\u0644 \u0628\u0627 \u0645\u0648\u0641\u0642\u06CC\u062A \u0627\u0646\u062C\u0627\u0645 \u0634\u062F",
12
+ "general.exportToExcelError": "\u062E\u0631\u0648\u062C\u06CC \u0627\u06A9\u0633\u0644 \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062F",
13
+ "general.exportToPdf": "\u062E\u0631\u0648\u062C\u06CC PDF",
14
+ "general.exportToPdfSuccess": "\u062E\u0631\u0648\u062C\u06CC PDF \u0628\u0627 \u0645\u0648\u0641\u0642\u06CC\u062A \u0627\u0646\u062C\u0627\u0645 \u0634\u062F",
15
+ "general.exportToPdfError": "\u062E\u0631\u0648\u062C\u06CC PDF \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062F",
16
+ "general.importFromExcel": "\u0648\u0631\u0648\u062F \u0627\u0632 \u0627\u06A9\u0633\u0644",
17
+ "general.importFromExcelSuccess": "\u0648\u0631\u0648\u062F \u0627\u06A9\u0633\u0644 \u0628\u0627 \u0645\u0648\u0641\u0642\u06CC\u062A \u0627\u0646\u062C\u0627\u0645 \u0634\u062F",
18
+ "general.importFromExcelError": "\u0648\u0631\u0648\u062F \u0627\u06A9\u0633\u0644 \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062F",
19
+ "general.selected": "\u0627\u0646\u062A\u062E\u0627\u0628 \u0634\u062F\u0647",
20
+ "general.search": "\u062C\u0633\u062A\u062C\u0648",
21
+ "general.selectField": "\u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0646\u06CC\u062F",
22
+ "general.selectPlaceholder": "\u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0646\u06CC\u062F",
23
+ "general.choice": "\u0627\u0646\u062A\u062E\u0627\u0628 \u0633\u062A\u0648\u0646",
24
+ "general.prev": "\u0642\u0628\u0644\u06CC",
25
+ "general.next": "\u0628\u0639\u062F\u06CC",
26
+ "general.noData": "\u062F\u0627\u062F\u0647\u200C\u0627\u06CC \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u062F",
27
+ "general.loading": "\u062F\u0631 \u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC\u2026",
28
+ "general.footerTotal": "\u062C\u0645\u0639",
29
+ "general.footerAvg": "\u0645\u06CC\u0627\u0646\u06AF\u06CC\u0646",
30
+ "general.replicateRow": "\u062A\u06A9\u062B\u06CC\u0631 \u0633\u0637\u0631",
31
+ "general.edit": "\u0648\u06CC\u0631\u0627\u06CC\u0634",
32
+ "general.rowEdit": "\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0633\u0637\u0631",
33
+ "general.row": "\u0633\u0637\u0631",
34
+ "general.selectRow": "\u0627\u0646\u062A\u062E\u0627\u0628 \u0633\u0637\u0631",
35
+ "general.save": "\u0630\u062E\u06CC\u0631\u0647",
36
+ "general.notActive": "\u063A\u06CC\u0631\u0641\u0639\u0627\u0644",
37
+ "general.add": "\u0627\u0641\u0632\u0648\u062F\u0646",
38
+ "general.themeDark": "\u062A\u0645 \u062A\u06CC\u0631\u0647",
39
+ "general.themeLight": "\u062A\u0645 \u0631\u0648\u0634\u0646",
40
+ "general.toolbar": "\u0646\u0648\u0627\u0631 \u0639\u0645\u0644\u06CC\u0627\u062A",
41
+ "general.filter": "\u0641\u06CC\u0644\u062A\u0631",
42
+ "general.filterApply": "\u0627\u0639\u0645\u0627\u0644",
43
+ "general.filterClear": "\u067E\u0627\u06A9 \u06A9\u0631\u062F\u0646",
44
+ "general.filterActive": "\u0641\u06CC\u0644\u062A\u0631 \u0641\u0639\u0627\u0644",
45
+ "general.rowsIn": "\u0633\u0637\u0631 \u062F\u0631",
46
+ "general.page": "\u0635\u0641\u062D\u0647",
47
+ "general.validationInRow": "\u062F\u0631 \u0633\u0637\u0631",
48
+ "general.validationInColumn": "\u062F\u0631 \u0633\u062A\u0648\u0646",
49
+ "general.loadMore": "\u0646\u0645\u0627\u06CC\u0634 \u0628\u06CC\u0634\u062A\u0631 ({visible} \u0627\u0632 {total})",
50
+ "general.searchFound": "{count} \u0645\u0648\u0631\u062F \u067E\u06CC\u062F\u0627 \u0634\u062F",
51
+ "general.searchNotFound": "\u0645\u0648\u0631\u062F\u06CC \u06CC\u0627\u0641\u062A \u0646\u0634\u062F",
52
+ "general.searchPosition": "{current} \u0627\u0632 {total}",
53
+ "columnMenu.open": "\u0645\u0646\u0648\u06CC \u0633\u062A\u0648\u0646",
54
+ "columnMenu.sortAsc": "\u0645\u0631\u062A\u0628\u200C\u0633\u0627\u0632\u06CC \u0635\u0639\u0648\u062F\u06CC",
55
+ "columnMenu.sortDesc": "\u0645\u0631\u062A\u0628\u200C\u0633\u0627\u0632\u06CC \u0646\u0632\u0648\u0644\u06CC",
56
+ "columnMenu.sortNone": "\u0628\u062F\u0648\u0646 \u0645\u0631\u062A\u0628\u200C\u0633\u0627\u0632\u06CC",
57
+ "columnMenu.filter": "\u0641\u06CC\u0644\u062A\u0631\u2026",
58
+ "columnMenu.hideColumn": "\u0645\u062E\u0641\u06CC \u06A9\u0631\u062F\u0646 \u0633\u062A\u0648\u0646",
59
+ "columnMenu.pinStart": "\u0633\u0646\u062C\u0627\u0642 \u0634\u0631\u0648\u0639",
60
+ "columnMenu.pinEnd": "\u0633\u0646\u062C\u0627\u0642 \u067E\u0627\u06CC\u0627\u0646",
61
+ "columnMenu.pinNone": "\u0628\u062F\u0648\u0646 \u0633\u0646\u062C\u0627\u0642",
62
+ "columnMenu.autoSize": "\u0627\u0646\u062F\u0627\u0632\u0647 \u062E\u0648\u062F\u06A9\u0627\u0631",
63
+ "columnMenu.columnsPanel": "\u062A\u0646\u0638\u06CC\u0645 \u0633\u062A\u0648\u0646\u200C\u0647\u0627",
64
+ "a11y.sortedAsc": "\u0645\u0631\u062A\u0628 \u0634\u062F \u0628\u0631 \u0627\u0633\u0627\u0633 {column} \u0635\u0639\u0648\u062F\u06CC",
65
+ "a11y.sortedDesc": "\u0645\u0631\u062A\u0628 \u0634\u062F \u0628\u0631 \u0627\u0633\u0627\u0633 {column} \u0646\u0632\u0648\u0644\u06CC",
66
+ "a11y.sortCleared": "\u0645\u0631\u062A\u0628\u200C\u0633\u0627\u0632\u06CC \u0628\u0631\u062F\u0627\u0634\u062A\u0647 \u0634\u062F",
67
+ "a11y.filterResult": "{visible} \u0631\u062F\u06CC\u0641 \u0627\u0632 {total} \u067E\u0633 \u0627\u0632 \u0641\u06CC\u0644\u062A\u0631",
68
+ "a11y.filterCleared": "\u0641\u06CC\u0644\u062A\u0631 \u0628\u0631\u062F\u0627\u0634\u062A\u0647 \u0634\u062F",
69
+ "a11y.rowsSelected": "{count} \u0631\u062F\u06CC\u0641 \u0627\u0646\u062A\u062E\u0627\u0628 \u0634\u062F",
70
+ "a11y.selectionCleared": "\u0627\u0646\u062A\u062E\u0627\u0628 \u0628\u0631\u062F\u0627\u0634\u062A\u0647 \u0634\u062F",
71
+ "a11y.validationError": "\u062E\u0637\u0627\u06CC \u0627\u0639\u062A\u0628\u0627\u0631\u0633\u0646\u062C\u06CC: {message}",
72
+ "a11y.validationGeneric": "\u062E\u0637\u0627\u06CC \u0627\u0639\u062A\u0628\u0627\u0631\u0633\u0646\u062C\u06CC",
73
+ "history.title": "\u062A\u0627\u0631\u06CC\u062E\u0686\u0647",
74
+ "history.empty": "\u0647\u0646\u0648\u0632 \u062A\u0627\u0631\u06CC\u062E\u0686\u0647\u200C\u0627\u06CC \u0646\u06CC\u0633\u062A. \u06CC\u06A9 \u0633\u0644\u0648\u0644 \u0631\u0627 \u0648\u06CC\u0631\u0627\u06CC\u0634 \u06A9\u0646\u06CC\u062F.",
75
+ "history.severity": "\u0634\u062F\u062A",
76
+ "history.category": "\u062F\u0633\u062A\u0647",
77
+ "history.filterAll": "\u0647\u0645\u0647",
78
+ "history.severity.info": "\u0627\u0637\u0644\u0627\u0639",
79
+ "history.severity.warning": "\u0647\u0634\u062F\u0627\u0631",
80
+ "history.severity.error": "\u062E\u0637\u0627",
81
+ "history.category.data": "\u062F\u0627\u062F\u0647",
82
+ "history.category.structure": "\u0633\u0627\u062E\u062A\u0627\u0631",
83
+ "history.category.view": "\u0646\u0645\u0627\u06CC\u0634",
84
+ "history.category.system": "\u0633\u06CC\u0633\u062A\u0645",
85
+ "history.restore": "\u0628\u0627\u0632\u06AF\u0631\u062F\u0627\u0646\u06CC \u0645\u0642\u062F\u0627\u0631 \u0642\u0628\u0644\u06CC",
86
+ "offline.online": "\u0622\u0646\u0644\u0627\u06CC\u0646",
87
+ "offline.offline": "\u0622\u0641\u0644\u0627\u06CC\u0646",
88
+ "offline.pendingCount": "{count} \u062A\u063A\u06CC\u06CC\u0631 \u0630\u062E\u06CC\u0631\u0647\u200C\u0646\u0634\u062F\u0647",
89
+ "offline.pendingEmpty": "\u0647\u0645\u0647 \u062A\u063A\u06CC\u06CC\u0631\u0627\u062A \u0645\u062D\u0644\u06CC \u0630\u062E\u06CC\u0631\u0647 \u0634\u062F",
90
+ "sync.policy": "\u0633\u06CC\u0627\u0633\u062A \u062A\u0639\u0627\u0631\u0636",
91
+ "sync.policy.lastWriteWins": "\u0622\u062E\u0631\u06CC\u0646 \u0646\u0648\u0634\u062A\u0647 \u0628\u0631\u0646\u062F\u0647",
92
+ "sync.policy.serverWins": "\u0633\u0631\u0648\u0631 \u0628\u0631\u0646\u062F\u0647",
93
+ "sync.policy.manual": "\u062F\u0633\u062A\u06CC",
94
+ "sync.now": "\u0647\u0645\u06AF\u0627\u0645\u200C\u0633\u0627\u0632\u06CC",
95
+ "sync.syncing": "\u062F\u0631 \u062D\u0627\u0644 \u0647\u0645\u06AF\u0627\u0645\u200C\u0633\u0627\u0632\u06CC\u2026",
96
+ "sync.unavailable": "\u0627\u0646\u062A\u0642\u0627\u0644 \u0647\u0645\u06AF\u0627\u0645\u200C\u0633\u0627\u0632\u06CC \u067E\u06CC\u06A9\u0631\u0628\u0646\u062F\u06CC \u0646\u0634\u062F\u0647",
97
+ "sync.result": "\u0627\u0631\u0633\u0627\u0644 {pushed}\u060C \u062F\u0631\u06CC\u0627\u0641\u062A {pulled}\u060C \u062A\u0639\u0627\u0631\u0636 {conflicts}",
98
+ "sync.local": "\u0645\u062D\u0644\u06CC",
99
+ "sync.remote": "\u0633\u0631\u0648\u0631",
100
+ "sync.keepLocal": "\u0646\u06AF\u0647\u200C\u062F\u0627\u0634\u062A\u0646 \u0645\u062D\u0644\u06CC",
101
+ "sync.keepRemote": "\u0646\u06AF\u0647\u200C\u062F\u0627\u0634\u062A\u0646 \u0633\u0631\u0648\u0631",
102
+ "date.pickDate": "\u0627\u0646\u062A\u062E\u0627\u0628 \u062A\u0627\u0631\u06CC\u062E",
103
+ "date.pickRange": "\u0627\u0646\u062A\u062E\u0627\u0628 \u0628\u0627\u0632\u0647",
104
+ "date.clear": "\u067E\u0627\u06A9 \u06A9\u0631\u062F\u0646",
105
+ "date.calendar": "\u062A\u0642\u0648\u06CC\u0645 \u062C\u0644\u0627\u0644\u06CC",
106
+ "date.prevMonth": "\u0645\u0627\u0647 \u0642\u0628\u0644",
107
+ "date.nextMonth": "\u0645\u0627\u0647 \u0628\u0639\u062F"
108
+ };
109
+
110
+ export { faMessages };
111
+ //# sourceMappingURL=chunk-F4PYOYHR.js.map
112
+ //# sourceMappingURL=chunk-F4PYOYHR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../ui/locales/fa.ts"],"names":[],"mappings":"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","file":"chunk-F4PYOYHR.js","sourcesContent":["import type { ERPTableMessages } from './types';\r\n\r\n/** Persian (fa) message pack — source of truth for keys (PR-127). */\r\nexport const faMessages: ERPTableMessages = {\r\n 'general.addNewRow': 'افزودن سطر',\r\n 'general.copy': 'کپی',\r\n 'general.cut': 'برش',\r\n 'general.paste': 'چسباندن',\r\n 'general.delete': 'حذف',\r\n 'general.chooseFromList': 'انتخاب از لیست',\r\n 'general.toggle': 'انتخاب همه',\r\n 'general.exportToExcel': 'خروجی اکسل',\r\n 'general.exportToExcelSuccess': 'خروجی اکسل با موفقیت انجام شد',\r\n 'general.exportToExcelError': 'خروجی اکسل ناموفق بود',\r\n 'general.exportToPdf': 'خروجی PDF',\r\n 'general.exportToPdfSuccess': 'خروجی PDF با موفقیت انجام شد',\r\n 'general.exportToPdfError': 'خروجی PDF ناموفق بود',\r\n 'general.importFromExcel': 'ورود از اکسل',\r\n 'general.importFromExcelSuccess': 'ورود اکسل با موفقیت انجام شد',\r\n 'general.importFromExcelError': 'ورود اکسل ناموفق بود',\r\n 'general.selected': 'انتخاب شده',\r\n 'general.search': 'جستجو',\r\n 'general.selectField': 'انتخاب کنید',\r\n 'general.selectPlaceholder': 'انتخاب کنید',\r\n 'general.choice': 'انتخاب ستون',\r\n 'general.prev': 'قبلی',\r\n 'general.next': 'بعدی',\r\n 'general.noData': 'داده‌ای وجود ندارد',\r\n 'general.loading': 'در حال بارگذاری…',\r\n 'general.footerTotal': 'جمع',\r\n 'general.footerAvg': 'میانگین',\r\n 'general.replicateRow': 'تکثیر سطر',\r\n 'general.edit': 'ویرایش',\r\n 'general.rowEdit': 'ویرایش سطر',\r\n 'general.row': 'سطر',\r\n 'general.selectRow': 'انتخاب سطر',\r\n 'general.save': 'ذخیره',\r\n 'general.notActive': 'غیرفعال',\r\n 'general.add': 'افزودن',\r\n 'general.themeDark': 'تم تیره',\r\n 'general.themeLight': 'تم روشن',\r\n 'general.toolbar': 'نوار عملیات',\r\n 'general.filter': 'فیلتر',\r\n 'general.filterApply': 'اعمال',\r\n 'general.filterClear': 'پاک کردن',\r\n 'general.filterActive': 'فیلتر فعال',\r\n 'general.rowsIn': 'سطر در',\r\n 'general.page': 'صفحه',\r\n 'general.validationInRow': 'در سطر',\r\n 'general.validationInColumn': 'در ستون',\r\n 'general.loadMore': 'نمایش بیشتر ({visible} از {total})',\r\n 'general.searchFound': '{count} مورد پیدا شد',\r\n 'general.searchNotFound': 'موردی یافت نشد',\r\n 'general.searchPosition': '{current} از {total}',\r\n 'columnMenu.open': 'منوی ستون',\r\n 'columnMenu.sortAsc': 'مرتب‌سازی صعودی',\r\n 'columnMenu.sortDesc': 'مرتب‌سازی نزولی',\r\n 'columnMenu.sortNone': 'بدون مرتب‌سازی',\r\n 'columnMenu.filter': 'فیلتر…',\r\n 'columnMenu.hideColumn': 'مخفی کردن ستون',\r\n 'columnMenu.pinStart': 'سنجاق شروع',\r\n 'columnMenu.pinEnd': 'سنجاق پایان',\r\n 'columnMenu.pinNone': 'بدون سنجاق',\r\n 'columnMenu.autoSize': 'اندازه خودکار',\r\n 'columnMenu.columnsPanel': 'تنظیم ستون‌ها',\r\n 'a11y.sortedAsc': 'مرتب شد بر اساس {column} صعودی',\r\n 'a11y.sortedDesc': 'مرتب شد بر اساس {column} نزولی',\r\n 'a11y.sortCleared': 'مرتب‌سازی برداشته شد',\r\n 'a11y.filterResult': '{visible} ردیف از {total} پس از فیلتر',\r\n 'a11y.filterCleared': 'فیلتر برداشته شد',\r\n 'a11y.rowsSelected': '{count} ردیف انتخاب شد',\r\n 'a11y.selectionCleared': 'انتخاب برداشته شد',\r\n 'a11y.validationError': 'خطای اعتبارسنجی: {message}',\r\n 'a11y.validationGeneric': 'خطای اعتبارسنجی',\r\n 'history.title': 'تاریخچه',\r\n 'history.empty': 'هنوز تاریخچه‌ای نیست. یک سلول را ویرایش کنید.',\r\n 'history.severity': 'شدت',\r\n 'history.category': 'دسته',\r\n 'history.filterAll': 'همه',\r\n 'history.severity.info': 'اطلاع',\r\n 'history.severity.warning': 'هشدار',\r\n 'history.severity.error': 'خطا',\r\n 'history.category.data': 'داده',\r\n 'history.category.structure': 'ساختار',\r\n 'history.category.view': 'نمایش',\r\n 'history.category.system': 'سیستم',\r\n 'history.restore': 'بازگردانی مقدار قبلی',\r\n 'offline.online': 'آنلاین',\r\n 'offline.offline': 'آفلاین',\r\n 'offline.pendingCount': '{count} تغییر ذخیره‌نشده',\r\n 'offline.pendingEmpty': 'همه تغییرات محلی ذخیره شد',\r\n 'sync.policy': 'سیاست تعارض',\r\n 'sync.policy.lastWriteWins': 'آخرین نوشته برنده',\r\n 'sync.policy.serverWins': 'سرور برنده',\r\n 'sync.policy.manual': 'دستی',\r\n 'sync.now': 'همگام‌سازی',\r\n 'sync.syncing': 'در حال همگام‌سازی…',\r\n 'sync.unavailable': 'انتقال همگام‌سازی پیکربندی نشده',\r\n 'sync.result': 'ارسال {pushed}، دریافت {pulled}، تعارض {conflicts}',\r\n 'sync.local': 'محلی',\r\n 'sync.remote': 'سرور',\r\n 'sync.keepLocal': 'نگه‌داشتن محلی',\r\n 'sync.keepRemote': 'نگه‌داشتن سرور',\r\n 'date.pickDate': 'انتخاب تاریخ',\r\n 'date.pickRange': 'انتخاب بازه',\r\n 'date.clear': 'پاک کردن',\r\n 'date.calendar': 'تقویم جلالی',\r\n 'date.prevMonth': 'ماه قبل',\r\n 'date.nextMonth': 'ماه بعد',\r\n};\r\n\r\nexport default faMessages;\r\n"]}
@@ -0,0 +1,168 @@
1
+ import { normalizeDigits } from './chunk-AU3RDJYQ.js';
2
+
3
+ // infrastructure/date/jalaliMath.ts
4
+ function isJalaliLeap(jy) {
5
+ return jalaliLeapOffset(jy) === 0;
6
+ }
7
+ function jalaliLeapOffset(jy) {
8
+ const breaks = [
9
+ -61,
10
+ 9,
11
+ 38,
12
+ 199,
13
+ 426,
14
+ 686,
15
+ 756,
16
+ 818,
17
+ 1111,
18
+ 1181,
19
+ 1210,
20
+ 1635,
21
+ 2060,
22
+ 2097,
23
+ 2192,
24
+ 2262,
25
+ 2324,
26
+ 2394,
27
+ 2456,
28
+ 3178
29
+ ];
30
+ const bl = breaks.length;
31
+ let jp = breaks[0];
32
+ let jump = 0;
33
+ for (let i = 1; i < bl; i += 1) {
34
+ const jm = breaks[i];
35
+ jump = jm - jp;
36
+ if (jy < jm) break;
37
+ jp = jm;
38
+ }
39
+ let n = jy - jp;
40
+ if (jump - n < 6) n = n - jump + Math.floor((jump + 4) / 33) * 33;
41
+ let leap = ((n + 1) % 33 - 1) % 4;
42
+ if (leap === -1) leap = 4;
43
+ return leap;
44
+ }
45
+ function jalaliMonthLength(jy, jm) {
46
+ if (jm <= 6) return 31;
47
+ if (jm <= 11) return 30;
48
+ return isJalaliLeap(jy) ? 30 : 29;
49
+ }
50
+ function jalaliToGregorian(jy, jm, jd) {
51
+ const r = jalaliToJdn(jy, jm, jd);
52
+ return jdnToGregorian(r);
53
+ }
54
+ function gregorianToJalali(gy, gm, gd) {
55
+ return jdnToJalali(gregorianToJdn(gy, gm, gd));
56
+ }
57
+ function jalaliToGregorianDate(jy, jm, jd) {
58
+ const g = jalaliToGregorian(jy, jm, jd);
59
+ return new Date(Date.UTC(g.gy, g.gm - 1, g.gd, 12, 0, 0));
60
+ }
61
+ function gregorianDateToJalali(date) {
62
+ return gregorianToJalali(
63
+ date.getUTCFullYear(),
64
+ date.getUTCMonth() + 1,
65
+ date.getUTCDate()
66
+ );
67
+ }
68
+ function pad2(n) {
69
+ return String(n).padStart(2, "0");
70
+ }
71
+ function div(a, b) {
72
+ return Math.floor(a / b);
73
+ }
74
+ function gregorianToJdn(gy, gm, gd) {
75
+ const a = div(14 - gm, 12);
76
+ const y = gy + 4800 - a;
77
+ const m = gm + 12 * a - 3;
78
+ return gd + div(153 * m + 2, 5) + 365 * y + div(y, 4) - div(y, 100) + div(y, 400) - 32045;
79
+ }
80
+ function jdnToGregorian(jdn) {
81
+ let a = jdn + 32044;
82
+ const b = div(4 * a + 3, 146097);
83
+ a -= div(146097 * b, 4);
84
+ const c = div(4 * a + 3, 1461);
85
+ a -= div(1461 * c, 4);
86
+ const d = div(5 * a + 2, 153);
87
+ const gd = a - div(153 * d + 2, 5) + 1;
88
+ const gm = d + 3 - 12 * div(d, 10);
89
+ const gy = 100 * b + c - 4800 + div(d, 10);
90
+ return { gy, gm, gd };
91
+ }
92
+ function jalaliToJdn(jy, jm, jd) {
93
+ const epbase = jy - (jy >= 0 ? 474 : 473);
94
+ const epyear = 474 + epbase % 2820;
95
+ return jd + (jm <= 7 ? (jm - 1) * 31 : (jm - 1) * 30 + 6) + div(epyear * 682 - 110, 2816) + (epyear - 1) * 365 + div(epbase, 2820) * 1029983 + (1948320 - 1);
96
+ }
97
+ function jdnToJalali(jdn) {
98
+ const depoch = jdn - jalaliToJdn(475, 1, 1);
99
+ const cycle = div(depoch, 1029983);
100
+ const cyear = depoch % 1029983;
101
+ let ycycle;
102
+ if (cyear === 1029982) {
103
+ ycycle = 2820;
104
+ } else {
105
+ const aux1 = div(cyear, 366);
106
+ const aux2 = cyear % 366;
107
+ ycycle = div(2134 * aux1 + 2816 * aux2 + 2815, 1028522) + aux1 + 1;
108
+ }
109
+ const jy = ycycle + 2820 * cycle + 474;
110
+ const yday = jdn - jalaliToJdn(jy, 1, 1) + 1;
111
+ const jm = yday <= 186 ? Math.ceil(yday / 31) : Math.ceil((yday - 6) / 30);
112
+ const jd = jdn - jalaliToJdn(jy, jm, 1) + 1;
113
+ return { jy, jm, jd };
114
+ }
115
+
116
+ // infrastructure/date/jalaliAdapter.ts
117
+ var JALALI_RE = /^(\d{4})[/\-.](\d{1,2})[/\-.](\d{1,2})$/;
118
+ function utcDay(date) {
119
+ return new Date(
120
+ Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 12)
121
+ );
122
+ }
123
+ function parseTimestamp(input) {
124
+ if (input instanceof Date && !Number.isNaN(input.getTime())) {
125
+ return utcDay(input);
126
+ }
127
+ if (typeof input === "number" && Number.isFinite(input)) {
128
+ const d = new Date(input);
129
+ return Number.isNaN(d.getTime()) ? null : utcDay(d);
130
+ }
131
+ return null;
132
+ }
133
+ var jalaliAdapter = {
134
+ id: "jalali",
135
+ parse(input) {
136
+ if (input == null || input === "") return null;
137
+ const fromTs = parseTimestamp(input);
138
+ if (fromTs) return fromTs;
139
+ const text = normalizeDigits(String(input).trim());
140
+ const m = JALALI_RE.exec(text);
141
+ if (!m) return null;
142
+ const jy = Number(m[1]);
143
+ const jm = Number(m[2]);
144
+ const jd = Number(m[3]);
145
+ if (jm < 1 || jm > 12 || jd < 1 || jd > 31) return null;
146
+ return jalaliToGregorianDate(jy, jm, jd);
147
+ },
148
+ format(date) {
149
+ const { jy, jm, jd } = gregorianDateToJalali(utcDay(date));
150
+ return `${jy}/${pad2(jm)}/${pad2(jd)}`;
151
+ },
152
+ addDays(date, days) {
153
+ const next = utcDay(date);
154
+ next.setUTCDate(next.getUTCDate() + days);
155
+ return next;
156
+ },
157
+ startOfMonth(date) {
158
+ const { jy, jm } = gregorianDateToJalali(utcDay(date));
159
+ return jalaliToGregorianDate(jy, jm, 1);
160
+ },
161
+ compare(a, b) {
162
+ return utcDay(a).getTime() - utcDay(b).getTime();
163
+ }
164
+ };
165
+
166
+ export { gregorianDateToJalali, jalaliAdapter, jalaliMonthLength, jalaliToGregorianDate, pad2 };
167
+ //# sourceMappingURL=chunk-GQEDLUMB.js.map
168
+ //# sourceMappingURL=chunk-GQEDLUMB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../infrastructure/date/jalaliMath.ts","../infrastructure/date/jalaliAdapter.ts"],"names":[],"mappings":"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","file":"chunk-GQEDLUMB.js","sourcesContent":["/**\r\n * Jalali ↔ Gregorian conversion (PR-128).\r\n * Algorithm adapted from the public-domain jalaali-js approach.\r\n */\r\n\r\nexport function isJalaliLeap(jy: number): boolean {\r\n return jalaliLeapOffset(jy) === 0;\r\n}\r\n\r\nfunction jalaliLeapOffset(jy: number): number {\r\n const breaks = [\r\n -61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210, 1635, 2060, 2097,\r\n 2192, 2262, 2324, 2394, 2456, 3178,\r\n ];\r\n const bl = breaks.length;\r\n let jp = breaks[0]!;\r\n let jump = 0;\r\n for (let i = 1; i < bl; i += 1) {\r\n const jm = breaks[i]!;\r\n jump = jm - jp;\r\n if (jy < jm) break;\r\n jp = jm;\r\n }\r\n let n = jy - jp;\r\n if (jump - n < 6) n = n - jump + Math.floor((jump + 4) / 33) * 33;\r\n let leap = ((((n + 1) % 33) - 1) % 4);\r\n if (leap === -1) leap = 4;\r\n return leap;\r\n}\r\n\r\nexport function jalaliMonthLength(jy: number, jm: number): number {\r\n if (jm <= 6) return 31;\r\n if (jm <= 11) return 30;\r\n return isJalaliLeap(jy) ? 30 : 29;\r\n}\r\n\r\nexport function jalaliToGregorian(\r\n jy: number,\r\n jm: number,\r\n jd: number,\r\n): { gy: number; gm: number; gd: number } {\r\n const r = jalaliToJdn(jy, jm, jd);\r\n return jdnToGregorian(r);\r\n}\r\n\r\nexport function gregorianToJalali(\r\n gy: number,\r\n gm: number,\r\n gd: number,\r\n): { jy: number; jm: number; jd: number } {\r\n return jdnToJalali(gregorianToJdn(gy, gm, gd));\r\n}\r\n\r\nexport function jalaliToGregorianDate(jy: number, jm: number, jd: number): Date {\r\n const g = jalaliToGregorian(jy, jm, jd);\r\n return new Date(Date.UTC(g.gy, g.gm - 1, g.gd, 12, 0, 0));\r\n}\r\n\r\nexport function gregorianDateToJalali(date: Date): {\r\n jy: number;\r\n jm: number;\r\n jd: number;\r\n} {\r\n return gregorianToJalali(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth() + 1,\r\n date.getUTCDate(),\r\n );\r\n}\r\n\r\nexport function pad2(n: number): string {\r\n return String(n).padStart(2, '0');\r\n}\r\n\r\nfunction div(a: number, b: number): number {\r\n return Math.floor(a / b);\r\n}\r\n\r\nfunction gregorianToJdn(gy: number, gm: number, gd: number): number {\r\n const a = div(14 - gm, 12);\r\n const y = gy + 4800 - a;\r\n const m = gm + 12 * a - 3;\r\n return (\r\n gd +\r\n div(153 * m + 2, 5) +\r\n 365 * y +\r\n div(y, 4) -\r\n div(y, 100) +\r\n div(y, 400) -\r\n 32045\r\n );\r\n}\r\n\r\nfunction jdnToGregorian(jdn: number): { gy: number; gm: number; gd: number } {\r\n let a = jdn + 32044;\r\n const b = div(4 * a + 3, 146097);\r\n a -= div(146097 * b, 4);\r\n const c = div(4 * a + 3, 1461);\r\n a -= div(1461 * c, 4);\r\n const d = div(5 * a + 2, 153);\r\n const gd = a - div(153 * d + 2, 5) + 1;\r\n const gm = d + 3 - 12 * div(d, 10);\r\n const gy = 100 * b + c - 4800 + div(d, 10);\r\n return { gy, gm, gd };\r\n}\r\n\r\nfunction jalaliToJdn(jy: number, jm: number, jd: number): number {\r\n const epbase = jy - (jy >= 0 ? 474 : 473);\r\n const epyear = 474 + (epbase % 2820);\r\n return (\r\n jd +\r\n (jm <= 7 ? (jm - 1) * 31 : (jm - 1) * 30 + 6) +\r\n div(epyear * 682 - 110, 2816) +\r\n (epyear - 1) * 365 +\r\n div(epbase, 2820) * 1029983 +\r\n (1948320 - 1)\r\n );\r\n}\r\n\r\nfunction jdnToJalali(jdn: number): { jy: number; jm: number; jd: number } {\r\n const depoch = jdn - jalaliToJdn(475, 1, 1);\r\n const cycle = div(depoch, 1029983);\r\n const cyear = depoch % 1029983;\r\n let ycycle: number;\r\n if (cyear === 1029982) {\r\n ycycle = 2820;\r\n } else {\r\n const aux1 = div(cyear, 366);\r\n const aux2 = cyear % 366;\r\n ycycle = div(2134 * aux1 + 2816 * aux2 + 2815, 1028522) + aux1 + 1;\r\n }\r\n const jy = ycycle + 2820 * cycle + 474;\r\n const yday = jdn - jalaliToJdn(jy, 1, 1) + 1;\r\n const jm = yday <= 186 ? Math.ceil(yday / 31) : Math.ceil((yday - 6) / 30);\r\n const jd = jdn - jalaliToJdn(jy, jm, 1) + 1;\r\n return { jy, jm, jd };\r\n}\r\n","import type { DateAdapter } from '../../application/ports/DateAdapter';\r\nimport { normalizeDigits } from '../../engine/dataOps/sortModel';\r\nimport {\r\n gregorianDateToJalali,\r\n jalaliToGregorianDate,\r\n pad2,\r\n} from './jalaliMath';\r\n\r\nconst JALALI_RE = /^(\\d{4})[/\\-.](\\d{1,2})[/\\-.](\\d{1,2})$/;\r\n\r\nfunction utcDay(date: Date): Date {\r\n return new Date(\r\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 12),\r\n );\r\n}\r\n\r\nfunction parseTimestamp(input: unknown): Date | null {\r\n if (input instanceof Date && !Number.isNaN(input.getTime())) {\r\n return utcDay(input);\r\n }\r\n if (typeof input === 'number' && Number.isFinite(input)) {\r\n const d = new Date(input);\r\n return Number.isNaN(d.getTime()) ? null : utcDay(d);\r\n }\r\n return null;\r\n}\r\n\r\n/** Default calendar for Persian hosts (PR-128 / D21). */\r\nexport const jalaliAdapter: DateAdapter = {\r\n id: 'jalali',\r\n\r\n parse(input: unknown): Date | null {\r\n if (input == null || input === '') return null;\r\n const fromTs = parseTimestamp(input);\r\n if (fromTs) return fromTs;\r\n const text = normalizeDigits(String(input).trim());\r\n const m = JALALI_RE.exec(text);\r\n if (!m) return null;\r\n const jy = Number(m[1]);\r\n const jm = Number(m[2]);\r\n const jd = Number(m[3]);\r\n if (jm < 1 || jm > 12 || jd < 1 || jd > 31) return null;\r\n return jalaliToGregorianDate(jy, jm, jd);\r\n },\r\n\r\n format(date: Date): string {\r\n const { jy, jm, jd } = gregorianDateToJalali(utcDay(date));\r\n return `${jy}/${pad2(jm)}/${pad2(jd)}`;\r\n },\r\n\r\n addDays(date: Date, days: number): Date {\r\n const next = utcDay(date);\r\n next.setUTCDate(next.getUTCDate() + days);\r\n return next;\r\n },\r\n\r\n startOfMonth(date: Date): Date {\r\n const { jy, jm } = gregorianDateToJalali(utcDay(date));\r\n return jalaliToGregorianDate(jy, jm, 1);\r\n },\r\n\r\n compare(a: Date, b: Date): number {\r\n return utcDay(a).getTime() - utcDay(b).getTime();\r\n },\r\n};\r\n"]}