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 +0,0 @@
1
- {"version":3,"sources":["../infrastructure/date/gregorianAdapter.ts","../infrastructure/date/jalaliCalendarModel.ts","../ui/theme/GridTheme.ts","../ui/theme/resolveActiveTheme.ts","../ui/theme/applyCssVars.ts","../ui/host/messages.ts","../ui/host/ERPTableHost.tsx","../ui/host/dependOn.ts","../ui/host/bindGridHostEvents.ts","../ui/host/useMediaQuery.ts","../ui/host/useRemoteQuery.ts","../ui/host/toast.ts","../ui/host/useGridHostEvents.ts"],"names":["normalizeDigits","pad2","gregorianDateToJalali","jalaliToGregorianDate","jalaliMonthLength","getLocalePack","jalaliAdapter","createContext","useMemo","resolveDirection","useEffect","jsx","useContext","subscribeCatalogHostEvents","useState","useCallback","useRef"],"mappings":"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","file":"chunk-KUBVDIF7.cjs","sourcesContent":["import type { DateAdapter } from '../../application/ports/DateAdapter';\r\nimport { normalizeDigits } from '../../engine/dataOps/sortModel';\r\nimport { pad2 } from './jalaliMath';\r\n\r\nconst ISO_RE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\r\nconst SLASH_RE = /^(\\d{4})[/\\-.](\\d{1,2})[/\\-.](\\d{1,2})$/;\r\n\r\nfunction utcDay(y: number, m: number, d: number): Date {\r\n return new Date(Date.UTC(y, m - 1, d, 12, 0, 0));\r\n}\r\n\r\nfunction asUtcDay(date: Date): Date {\r\n return utcDay(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate());\r\n}\r\n\r\n/** Gregorian calendar adapter (PR-128 / D21). */\r\nexport const gregorianAdapter: DateAdapter = {\r\n id: 'gregory',\r\n\r\n parse(input: unknown): Date | null {\r\n if (input == null || input === '') return null;\r\n if (input instanceof Date && !Number.isNaN(input.getTime())) {\r\n return asUtcDay(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 : asUtcDay(d);\r\n }\r\n const text = normalizeDigits(String(input).trim());\r\n const iso = ISO_RE.exec(text);\r\n if (iso) {\r\n return utcDay(Number(iso[1]), Number(iso[2]), Number(iso[3]));\r\n }\r\n const slash = SLASH_RE.exec(text);\r\n if (slash) {\r\n return utcDay(Number(slash[1]), Number(slash[2]), Number(slash[3]));\r\n }\r\n const fallback = new Date(text);\r\n return Number.isNaN(fallback.getTime()) ? null : asUtcDay(fallback);\r\n },\r\n\r\n format(date: Date): string {\r\n const d = asUtcDay(date);\r\n return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`;\r\n },\r\n\r\n addDays(date: Date, days: number): Date {\r\n const next = asUtcDay(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 d = asUtcDay(date);\r\n return utcDay(d.getUTCFullYear(), d.getUTCMonth() + 1, 1);\r\n },\r\n\r\n compare(a: Date, b: Date): number {\r\n return asUtcDay(a).getTime() - asUtcDay(b).getTime();\r\n },\r\n};\r\n","/**\r\n * Pure Jalali month-grid helpers for the internal picker (PR-140).\r\n */\r\n\r\nimport {\r\n gregorianDateToJalali,\r\n jalaliMonthLength,\r\n jalaliToGregorianDate,\r\n} from './jalaliMath';\r\n\r\nexport type JalaliYmd = { jy: number; jm: number; jd: number };\r\n\r\nexport type CalendarCell = {\r\n ymd: JalaliYmd;\r\n date: Date;\r\n inCurrentMonth: boolean;\r\n /** 0 = Saturday … 6 = Friday (Jalali week starts Saturday). */\r\n weekday: number;\r\n};\r\n\r\nconst MONTH_NAMES_FA = [\r\n 'فروردین',\r\n 'اردیبهشت',\r\n 'خرداد',\r\n 'تیر',\r\n 'مرداد',\r\n 'شهریور',\r\n 'مهر',\r\n 'آبان',\r\n 'آذر',\r\n 'دی',\r\n 'بهمن',\r\n 'اسفند',\r\n] as const;\r\n\r\nexport const JALALI_WEEKDAY_LABELS_FA = [\r\n 'ش',\r\n 'ی',\r\n 'د',\r\n 'س',\r\n 'چ',\r\n 'پ',\r\n 'ج',\r\n] as const;\r\n\r\nexport function jalaliMonthName(jm: number): string {\r\n return MONTH_NAMES_FA[jm - 1] ?? String(jm);\r\n}\r\n\r\nexport function toJalaliYmd(date: Date): JalaliYmd {\r\n return gregorianDateToJalali(utcNoon(date));\r\n}\r\n\r\nexport function fromJalaliYmd(ymd: JalaliYmd): Date {\r\n return jalaliToGregorianDate(ymd.jy, ymd.jm, ymd.jd);\r\n}\r\n\r\nexport function sameJalaliDay(a: Date, b: Date): boolean {\r\n const x = toJalaliYmd(a);\r\n const y = toJalaliYmd(b);\r\n return x.jy === y.jy && x.jm === y.jm && x.jd === y.jd;\r\n}\r\n\r\nexport function compareJalaliDay(a: Date, b: Date): number {\r\n return utcNoon(a).getTime() - utcNoon(b).getTime();\r\n}\r\n\r\nexport function addJalaliMonths(\r\n jy: number,\r\n jm: number,\r\n delta: number,\r\n): { jy: number; jm: number } {\r\n const idx = jy * 12 + (jm - 1) + delta;\r\n return {\r\n jy: Math.floor(idx / 12),\r\n jm: (idx % 12) + 1,\r\n };\r\n}\r\n\r\n/**\r\n * 6×7 grid of days for a Jalali month. Week starts Saturday.\r\n * Leading/trailing cells may belong to adjacent months (`inCurrentMonth: false`).\r\n */\r\nexport function buildJalaliMonthGrid(jy: number, jm: number): CalendarCell[] {\r\n const first = jalaliToGregorianDate(jy, jm, 1);\r\n const jsDow = first.getUTCDay();\r\n const jalaliWeekStart = (jsDow + 1) % 7;\r\n const daysInMonth = jalaliMonthLength(jy, jm);\r\n const cells: CalendarCell[] = [];\r\n\r\n for (let i = 0; i < 42; i += 1) {\r\n const offset = i - jalaliWeekStart;\r\n let cellJy = jy;\r\n let cellJm = jm;\r\n let cellJd: number;\r\n let inCurrentMonth = true;\r\n\r\n if (offset < 0) {\r\n const prev = addJalaliMonths(jy, jm, -1);\r\n cellJy = prev.jy;\r\n cellJm = prev.jm;\r\n cellJd = jalaliMonthLength(cellJy, cellJm) + offset + 1;\r\n inCurrentMonth = false;\r\n } else if (offset >= daysInMonth) {\r\n const next = addJalaliMonths(jy, jm, 1);\r\n cellJy = next.jy;\r\n cellJm = next.jm;\r\n cellJd = offset - daysInMonth + 1;\r\n inCurrentMonth = false;\r\n } else {\r\n cellJd = offset + 1;\r\n }\r\n\r\n const date = jalaliToGregorianDate(cellJy, cellJm, cellJd);\r\n cells.push({\r\n ymd: { jy: cellJy, jm: cellJm, jd: cellJd },\r\n date,\r\n inCurrentMonth,\r\n weekday: i % 7,\r\n });\r\n }\r\n return cells;\r\n}\r\n\r\nexport type DateRangeValue = {\r\n start: Date | null;\r\n end: Date | null;\r\n};\r\n\r\nexport function isDateInRange(date: Date, range: DateRangeValue): boolean {\r\n if (!range.start) return false;\r\n if (!range.end) return sameJalaliDay(date, range.start);\r\n const t = utcNoon(date).getTime();\r\n const a = utcNoon(range.start).getTime();\r\n const b = utcNoon(range.end).getTime();\r\n return t >= Math.min(a, b) && t <= Math.max(a, b);\r\n}\r\n\r\nfunction utcNoon(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","export type ThemeParams = {\r\n backgroundColor: string;\r\n foregroundColor: string;\r\n accentColor: string;\r\n headerBackgroundColor: string;\r\n rowStripeColor: string;\r\n rowSelectedColor: string;\r\n borderColor: string;\r\n dangerColor: string;\r\n searchMatchColor: string;\r\n fontFamily: string;\r\n rowHeight: number;\r\n cellFontSize: number;\r\n borderRadius: string;\r\n};\r\n\r\nexport type ThemeCssVars = Record<string, string>;\r\n\r\n/** `--erp-*` mirrors `--pdg-*` for one version (PR-87 / D13). */\r\nfunction aliasErpTokens(vars: ThemeCssVars): ThemeCssVars {\r\n const out: ThemeCssVars = {};\r\n for (const [key, value] of Object.entries(vars)) {\r\n if (key.startsWith('--pdg-')) {\r\n out[`--erp-${key.slice('--pdg-'.length)}`] = value;\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nexport class GridTheme {\r\n constructor(\r\n readonly params: ThemeParams,\r\n readonly extraCssVars: ThemeCssVars = {},\r\n ) {}\r\n\r\n withParams(partial: Partial<ThemeParams>): GridTheme {\r\n return new GridTheme({ ...this.params, ...partial }, this.extraCssVars);\r\n }\r\n\r\n withExtraCssVars(extra: ThemeCssVars): GridTheme {\r\n return new GridTheme(this.params, { ...this.extraCssVars, ...extra });\r\n }\r\n\r\n toCssVars(): ThemeCssVars {\r\n const p = this.params;\r\n const roles: ThemeCssVars = {\r\n '--pdg-bg': p.backgroundColor,\r\n '--pdg-fg': p.foregroundColor,\r\n '--pdg-accent': p.accentColor,\r\n '--pdg-header-bg': p.headerBackgroundColor,\r\n '--pdg-row-stripe': p.rowStripeColor,\r\n '--pdg-row-selected': p.rowSelectedColor,\r\n '--pdg-border': p.borderColor,\r\n '--pdg-danger': p.dangerColor,\r\n '--pdg-search-match': p.searchMatchColor,\r\n '--pdg-font': p.fontFamily,\r\n '--pdg-row-height': `${p.rowHeight}px`,\r\n '--pdg-font-size': `${p.cellFontSize}px`,\r\n '--pdg-radius': p.borderRadius,\r\n };\r\n return {\r\n ...roles,\r\n ...aliasErpTokens(roles),\r\n ...this.extraCssVars,\r\n ...aliasErpTokens(this.extraCssVars),\r\n };\r\n }\r\n}\r\n\r\n/** Default grid chrome — same computed colors as the CSS palette aliases. */\r\nexport const themeDefault = new GridTheme({\r\n backgroundColor: '#fff',\r\n foregroundColor: '#292929',\r\n accentColor: '#0658b0',\r\n headerBackgroundColor: '#f4f4f4',\r\n rowStripeColor: '#ddecfd',\r\n rowSelectedColor: '#dbeafe',\r\n borderColor: '#ececec',\r\n dangerColor: '#dc2626',\r\n searchMatchColor: '#facc15',\r\n fontFamily: 'IRANSans, Tahoma, sans-serif',\r\n rowHeight: 40,\r\n cellFontSize: 12,\r\n borderRadius: '0.25rem',\r\n});\r\n\r\n/** @deprecated Use {@link themeDefault}. Removed in 1.0.0. */\r\nexport const themeErp = themeDefault;\r\n\r\n/** Dark chrome. Palette extras keep leftover gray utilities readable. */\r\nconst DARK_PALETTE_VARS: ThemeCssVars = {\r\n '--pdg-main-white': '#171717',\r\n '--pdg-main-black': '#f4f4f4',\r\n '--pdg-gray-3': '#262626',\r\n '--pdg-gray-5': '#404040',\r\n '--pdg-gray-6': '#525252',\r\n '--pdg-gray-7': '#a3a3a3',\r\n '--pdg-gray-8': '#d4d4d4',\r\n '--pdg-gray-85': '#d4d4d4',\r\n '--pdg-gray-9': '#e5e5e5',\r\n '--pdg-gray-10': '#f5f5f5',\r\n '--pdg-gray-11': '#fafafa',\r\n '--pdg-black-6': '#f4f4f4',\r\n '--pdg-blue-6': '#60a5fa',\r\n '--pdg-blue-11': '#1e3a5f',\r\n '--pdg-blue-100': '#1e3a8a',\r\n '--pdg-red-100': '#7f1d1d',\r\n '--pdg-red-300': '#fca5a5',\r\n '--pdg-red-600': '#f87171',\r\n '--pdg-yellow-200': '#854d0e',\r\n '--pdg-yellow-400': '#eab308',\r\n '--pdg-zinc-200': '#3f3f46',\r\n '--pdg-neutral-500': '#a3a3a3',\r\n '--pdg-gray-100': '#27272a',\r\n '--pdg-scrollbar': '#525252',\r\n '--pdg-overlay': 'rgba(0, 0, 0, 0.55)',\r\n};\r\n\r\nexport const themeDark = themeDefault\r\n .withParams({\r\n backgroundColor: '#171717',\r\n foregroundColor: '#f4f4f4',\r\n accentColor: '#60a5fa',\r\n headerBackgroundColor: '#262626',\r\n rowStripeColor: '#1e3a5f',\r\n rowSelectedColor: '#1e3a8a',\r\n borderColor: '#404040',\r\n dangerColor: '#f87171',\r\n searchMatchColor: '#eab308',\r\n })\r\n .withExtraCssVars(DARK_PALETTE_VARS);\r\n\r\n/** @deprecated Use {@link themeDark}. Removed in 1.0.0. */\r\nexport const themeErpDark = themeDark;\r\n","import {\r\n GridTheme,\r\n type ThemeParams,\r\n themeErp,\r\n themeErpDark,\r\n} from './GridTheme';\r\n\r\nexport function themeParamsEqual(a: ThemeParams, b: ThemeParams): boolean {\r\n return (\r\n a.backgroundColor === b.backgroundColor &&\r\n a.foregroundColor === b.foregroundColor &&\r\n a.accentColor === b.accentColor &&\r\n a.headerBackgroundColor === b.headerBackgroundColor &&\r\n a.rowStripeColor === b.rowStripeColor &&\r\n a.rowSelectedColor === b.rowSelectedColor &&\r\n a.borderColor === b.borderColor &&\r\n a.dangerColor === b.dangerColor &&\r\n a.searchMatchColor === b.searchMatchColor &&\r\n a.fontFamily === b.fontFamily &&\r\n a.rowHeight === b.rowHeight &&\r\n a.cellFontSize === b.cellFontSize &&\r\n a.borderRadius === b.borderRadius\r\n );\r\n}\r\n\r\nexport function isStockLightTheme(theme: GridTheme): boolean {\r\n return themeParamsEqual(theme.params, themeErp.params);\r\n}\r\n\r\nexport function isStockDarkTheme(theme: GridTheme): boolean {\r\n return themeParamsEqual(theme.params, themeErpDark.params);\r\n}\r\n\r\n/** Built-in light/dark. Any `withParams` change locks the product toggle. */\r\nexport function isStockTheme(theme: GridTheme): boolean {\r\n return isStockLightTheme(theme) || isStockDarkTheme(theme);\r\n}\r\n\r\nexport function resolveActiveTheme(input: {\r\n requested?: GridTheme;\r\n preferDark: boolean;\r\n}): { theme: GridTheme; locked: boolean } {\r\n const requested = input.requested ?? themeErp;\r\n const locked = !isStockTheme(requested);\r\n if (locked) return { theme: requested, locked: true };\r\n return {\r\n theme: input.preferDark ? themeErpDark : themeErp,\r\n locked: false,\r\n };\r\n}\r\n","import type { CSSProperties } from 'react';\r\n\r\nimport type { GridTheme, ThemeCssVars } from './GridTheme';\r\nimport { themeErp } from './GridTheme';\r\n\r\nlet lastVars: ThemeCssVars = themeErp.toCssVars();\r\n\r\nexport function rememberThemeVars(vars: ThemeCssVars): void {\r\n lastVars = vars;\r\n}\r\n\r\nexport function getRememberedThemeVars(): ThemeCssVars {\r\n return lastVars;\r\n}\r\n\r\nexport function themeToStyle(\r\n theme: GridTheme,\r\n extra?: CSSProperties,\r\n): CSSProperties {\r\n return { ...theme.toCssVars(), ...extra } as CSSProperties;\r\n}\r\n\r\n/** Copy last (or given) theme vars onto an imperative DOM node (toasts). */\r\nexport function assignThemeVars(\r\n el: HTMLElement,\r\n vars: ThemeCssVars = lastVars,\r\n): void {\r\n for (const [key, value] of Object.entries(vars)) {\r\n el.style.setProperty(key, value);\r\n }\r\n}\r\n","import {\r\n getLocalePack,\r\n type ERPTableLocale,\r\n type ERPTableMessages,\r\n} from '../locales';\r\n\r\nexport type { ERPTableLocale, ERPTableMessages } from '../locales';\r\nexport {\r\n arMessages,\r\n enMessages,\r\n faMessages,\r\n formatLocaleDate,\r\n formatLocaleNumber,\r\n getLocalePack,\r\n LOCALE_META,\r\n LOCALE_PACKS,\r\n resolveDirection,\r\n resolveLocaleMeta,\r\n} from '../locales';\r\nexport type { LocaleMeta, NumberingSystem } from '../locales';\r\n\r\n/** @deprecated Prefer `faMessages` from `persian-data-grid/locales/fa`. */\r\nexport const FA_MESSAGES: ERPTableMessages = getLocalePack('fa');\r\n/** @deprecated Prefer `enMessages` from `persian-data-grid/locales/en`. */\r\nexport const EN_MESSAGES: ERPTableMessages = getLocalePack('en');\r\n/** Arabic pack alias (PR-127). */\r\nexport const AR_MESSAGES: ERPTableMessages = getLocalePack('ar');\r\n\r\nexport function translate(\r\n key: string,\r\n locale: ERPTableLocale,\r\n overrides?: Partial<ERPTableMessages>,\r\n): string {\r\n const pack = getLocalePack(locale);\r\n return overrides?.[key] ?? pack[key] ?? key;\r\n}\r\n\r\n/** Replace `{name}` tokens in a message template (PR-125). */\r\nexport function formatMessage(\r\n template: string,\r\n vars: Record<string, string | number>,\r\n): string {\r\n return template.replace(/\\{(\\w+)\\}/g, (_, name: string) => {\r\n const value = vars[name];\r\n return value == null ? `{${name}}` : String(value);\r\n });\r\n}\r\n","\"use client\";\r\n\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n type CSSProperties,\r\n type ReactNode,\r\n} from 'react';\r\n\r\nimport type { DateAdapter } from '../../application/ports/DateAdapter';\r\nimport type { UseDependOnHook } from './dependOn';\r\nimport type { RemoteApi } from '../../application/ports/RemoteApi';\r\nimport type { ColumnMenuItemsConfig } from '../../engine/dataOps/columnMenu';\r\nimport {\r\n gregorianAdapter,\r\n jalaliAdapter,\r\n} from '../../infrastructure/date';\r\nimport type { CellComponentMap } from '../cellRenderer/cellRegistry';\r\nimport type { ColumnMenuActionEvent } from '../desktop/ColumnMenuPopover';\r\nimport type { FilterComponentMap } from '../filters';\r\nimport {\r\n GridTheme,\r\n rememberThemeVars,\r\n themeErp,\r\n themeToStyle,\r\n} from '../theme';\r\nimport {\r\n formatMessage,\r\n resolveDirection,\r\n type ERPTableLocale,\r\n type ERPTableMessages,\r\n type NumberingSystem,\r\n translate,\r\n} from './messages';\r\n\r\nexport type ERPTableToastKind = 'success' | 'error';\r\n\r\nexport type ERPTableHostValue = {\r\n locale: ERPTableLocale;\r\n direction: 'rtl' | 'ltr';\r\n /** Intl digit system (PR-127). Default from locale meta. */\r\n numberingSystem?: NumberingSystem;\r\n /**\r\n * Calendar port (PR-128 / D21). Default: `jalaliAdapter` for `fa`,\r\n * otherwise `gregorianAdapter`.\r\n */\r\n dateAdapter?: DateAdapter;\r\n remoteApi?: RemoteApi;\r\n messages?: Partial<ERPTableMessages>;\r\n onToast?: (kind: ERPTableToastKind, message: string, detail?: unknown) => void;\r\n theme?: GridTheme;\r\n themeToggle?: boolean;\r\n themeLocked?: boolean;\r\n onToggleTheme?: () => void;\r\n components?: CellComponentMap;\r\n /** Custom column filter UIs (PR-95). Keys match `ColumnDef.filter`. */\r\n filterComponents?: FilterComponentMap;\r\n /** Column header menu items (PR-114). */\r\n columnMenuItems?: ColumnMenuItemsConfig;\r\n /** Custom column menu action handler (PR-114). */\r\n onColumnMenuAction?: (event: ColumnMenuActionEvent) => void;\r\n /**\r\n * Resolves `dependOn` values for remote lists (e.g. from the form that owns\r\n * the grid — Redux, React context, …). Default: static item values.\r\n */\r\n useDependOn?: UseDependOnHook;\r\n};\r\n\r\nfunction defaultDateAdapter(locale: ERPTableLocale): DateAdapter {\r\n return locale === 'fa' ? jalaliAdapter : gregorianAdapter;\r\n}\r\n\r\nconst ERPTableHostContext = createContext<ERPTableHostValue>({\r\n locale: 'fa',\r\n direction: 'rtl',\r\n dateAdapter: jalaliAdapter,\r\n theme: themeErp,\r\n themeToggle: true,\r\n themeLocked: false,\r\n});\r\n\r\nexport function ERPTableHostProvider({\r\n children,\r\n locale = 'fa',\r\n direction,\r\n numberingSystem,\r\n dateAdapter,\r\n remoteApi,\r\n messages,\r\n onToast,\r\n theme = themeErp,\r\n themeToggle = true,\r\n themeLocked = false,\r\n onToggleTheme,\r\n components,\r\n filterComponents,\r\n columnMenuItems,\r\n onColumnMenuAction,\r\n useDependOn,\r\n}: ERPTableHostValue & { children: ReactNode }) {\r\n const value = useMemo<ERPTableHostValue>(\r\n () => ({\r\n locale,\r\n direction: resolveDirection(locale, direction),\r\n numberingSystem,\r\n dateAdapter: dateAdapter ?? defaultDateAdapter(locale),\r\n remoteApi,\r\n messages,\r\n onToast,\r\n theme,\r\n themeToggle,\r\n themeLocked,\r\n onToggleTheme,\r\n components,\r\n filterComponents,\r\n columnMenuItems,\r\n onColumnMenuAction,\r\n useDependOn,\r\n }),\r\n [\r\n locale,\r\n direction,\r\n numberingSystem,\r\n dateAdapter,\r\n remoteApi,\r\n messages,\r\n onToast,\r\n theme,\r\n themeToggle,\r\n themeLocked,\r\n onToggleTheme,\r\n components,\r\n filterComponents,\r\n columnMenuItems,\r\n onColumnMenuAction,\r\n useDependOn,\r\n ],\r\n );\r\n\r\n useEffect(() => {\r\n rememberThemeVars(theme.toCssVars());\r\n }, [theme]);\r\n\r\n return (\r\n <ERPTableHostContext.Provider value={value}>\r\n {children}\r\n </ERPTableHostContext.Provider>\r\n );\r\n}\r\n\r\nexport function useERPTableHost(): ERPTableHostValue {\r\n return useContext(ERPTableHostContext);\r\n}\r\n\r\nexport function useERPTableTheme(): GridTheme {\r\n return useERPTableHost().theme ?? themeErp;\r\n}\r\n\r\n/** Merge theme CSS vars into a portal node that mounts on `document.body`. */\r\nexport function useThemePortalStyle(extra?: CSSProperties): CSSProperties {\r\n const theme = useERPTableTheme();\r\n return themeToStyle(theme, extra);\r\n}\r\n\r\nexport function useTranslations() {\r\n const { locale, messages } = useERPTableHost();\r\n return (key: string, vars?: Record<string, string | number>) => {\r\n const raw = translate(key, locale, messages);\r\n return vars ? formatMessage(raw, vars) : raw;\r\n };\r\n}\r\n\r\nexport function useLocale(): ERPTableLocale {\r\n return useERPTableHost().locale;\r\n}\r\n\r\nexport function useNumberingSystem(): NumberingSystem | undefined {\r\n return useERPTableHost().numberingSystem;\r\n}\r\n\r\nexport function useDateAdapter(): DateAdapter {\r\n return useERPTableHost().dateAdapter ?? jalaliAdapter;\r\n}\r\n\r\nexport function useDirection(): 'rtl' | 'ltr' {\r\n return useERPTableHost().direction;\r\n}\r\n","\"use client\";\r\n\r\nimport { useERPTableHost } from './ERPTableHost';\r\n\r\n/** One dependency: a named sibling field and (optionally) its current value. */\r\nexport type DependOnItem =\r\n | string\r\n | { fieldName: string; value?: unknown };\r\nexport type DependOn = DependOnItem | DependOnItem[];\r\n\r\nexport type DependValueResolver = (item: DependOnItem) => unknown;\r\n\r\nexport type UseDependOnOptions = {\r\n /**\r\n * Ask the host to resolve dependency values (e.g. from the form that owns\r\n * the grid). When false/omitted, the `value` carried by each item is used.\r\n */\r\n enabled?: boolean;\r\n /** Send `value.value` when a resolved value is an option-like object. */\r\n unwrapObjectValue?: boolean;\r\n};\r\n\r\nexport type UseDependOnResult = {\r\n /** `{ [fieldName]: value }` to merge into a remote request body. */\r\n dependencyBody: Record<string, unknown>;\r\n /** Every dependency has a value (true when there is no dependOn). */\r\n isReady: boolean;\r\n /** Stable string that changes when the dependencies change. */\r\n dependencyKey: string;\r\n};\r\n\r\n/**\r\n * Host-injectable dependency resolver. The arianERP host implements this on\r\n * top of Redux page data; the default implementation reads the static values\r\n * carried by the `dependOn` items.\r\n */\r\nexport type UseDependOnHook = (\r\n dependOn?: DependOn | null,\r\n options?: UseDependOnOptions,\r\n) => UseDependOnResult;\r\n\r\nconst toList = (dependOn?: DependOn | null): DependOnItem[] =>\r\n !dependOn ? [] : Array.isArray(dependOn) ? dependOn : [dependOn];\r\n\r\nexport const getDependFieldName = (item: DependOnItem): string =>\r\n typeof item === 'string' ? item : item.fieldName;\r\n\r\n/** The value carried by the item itself; a bare field name carries none. */\r\nexport const getStaticDependValue: DependValueResolver = (item) =>\r\n typeof item === 'object' ? item.value : undefined;\r\n\r\n/** True when every dependency resolves to a non-null value (or there are none). */\r\nexport const hasDependValue = (\r\n dependOn?: DependOn | null,\r\n resolve: DependValueResolver = getStaticDependValue,\r\n): boolean => toList(dependOn).every((item) => resolve(item) != null);\r\n\r\n/** Builds the `{ [fieldName]: value }` part of a request body. */\r\nexport const buildDependencyBody = (\r\n dependOn?: DependOn | null,\r\n resolve: DependValueResolver = getStaticDependValue,\r\n): Record<string, unknown> =>\r\n Object.fromEntries(\r\n toList(dependOn).map((item) => [getDependFieldName(item), resolve(item)]),\r\n );\r\n\r\n/** Default `UseDependOnHook`: static values carried by the items. */\r\nexport const useStaticDependOn: UseDependOnHook = (dependOn, options) => {\r\n const unwrap = (value: unknown) =>\r\n options?.unwrapObjectValue &&\r\n value !== null &&\r\n typeof value === 'object' &&\r\n !Array.isArray(value) &&\r\n 'value' in value\r\n ? (value as { value: unknown }).value\r\n : value;\r\n const resolve: DependValueResolver = (item) => unwrap(getStaticDependValue(item));\r\n return {\r\n isReady: hasDependValue(dependOn, resolve),\r\n dependencyBody: buildDependencyBody(dependOn, resolve),\r\n dependencyKey: JSON.stringify(dependOn ?? null),\r\n };\r\n};\r\n\r\n/** Resolve dependency values through the host hook, falling back to static. */\r\nexport const useHostDependOn: UseDependOnHook = (dependOn, options) => {\r\n const host = useERPTableHost();\r\n const hook = host.useDependOn ?? useStaticDependOn;\r\n return hook(dependOn, options);\r\n};\r\n","import type { EventStore } from '../../application/ports/EventStore';\r\nimport {\r\n subscribeCatalogHostEvents,\r\n type CatalogHostEventHandlers,\r\n type CellFocusedEvent,\r\n type SelectionChangedEvent,\r\n} from '../../application/events/hostGridEvents';\r\nimport type { GridApi } from '../../infrastructure/ui/createGridApi';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\n\r\nexport type GridReadyEvent<TRow = unknown> = {\r\n api: GridApi<TRow>;\r\n};\r\n\r\nexport type GridHostEventHandlers<TRow = unknown> = CatalogHostEventHandlers<TRow> & {\r\n onSelectionChanged?: (event: SelectionChangedEvent<TRow>) => void;\r\n onCellFocused?: (event: CellFocusedEvent) => void;\r\n onGridReady?: (event: GridReadyEvent<TRow>) => void;\r\n};\r\n\r\nfunction selectedKeysEqual(\r\n a: Record<number, boolean> | null | undefined,\r\n b: Record<number, boolean> | null | undefined,\r\n): boolean {\r\n const left = Object.keys(a ?? {});\r\n const right = Object.keys(b ?? {});\r\n if (left.length !== right.length) return false;\r\n return left.every((key) => {\r\n const id = Number(key);\r\n return Boolean(a?.[id]) === Boolean(b?.[id]);\r\n });\r\n}\r\n\r\nfunction activeCellEqual(\r\n a: { rowId?: number; columnId?: string } | null | undefined,\r\n b: { rowId?: number; columnId?: string } | null | undefined,\r\n): boolean {\r\n return a?.rowId === b?.rowId && a?.columnId === b?.columnId;\r\n}\r\n\r\nfunction selectedRowIds(\r\n selected: Record<number, boolean> | null | undefined,\r\n): number[] {\r\n return Object.keys(selected ?? {})\r\n .map(Number)\r\n .filter((id) => Number.isFinite(id) && Boolean(selected?.[id]));\r\n}\r\n\r\n/**\r\n * Subscribe to EVENT_CATALOG (`EventStore`) plus the existing view store\r\n * (selection / focus). One unsubscribe. Not a second event bus.\r\n */\r\nexport function bindGridHostEvents<TRow = unknown>(\r\n input: {\r\n eventStore: EventStore;\r\n controller: UITableController;\r\n tableKey: string;\r\n handlers: GridHostEventHandlers<TRow>;\r\n },\r\n): () => void {\r\n const { eventStore, controller, tableKey, handlers } = input;\r\n\r\n const unsubCatalog = subscribeCatalogHostEvents(\r\n eventStore,\r\n {\r\n tableId: tableKey,\r\n getRowData: (rowId) =>\r\n controller.getAllRows()?.find((row) => row.id.value === rowId)?.data as\r\n | TRow\r\n | undefined,\r\n getAllRowData: () =>\r\n (controller.getAllRows() ?? [])\r\n .map((row) => row.data)\r\n .filter((data): data is TRow => data !== undefined),\r\n },\r\n handlers,\r\n );\r\n\r\n const unsubSelection = controller.subscribeSelected(\r\n () => controller.getSelectedRows(),\r\n (selected) => {\r\n const ids = selectedRowIds(selected);\r\n const rows = controller.getAllRows() ?? [];\r\n const selectedRows = ids\r\n .map((id) => rows.find((row) => row.id.value === id)?.data)\r\n .filter((data): data is TRow => data !== undefined);\r\n handlers.onSelectionChanged?.({\r\n selectedRowIds: ids,\r\n selectedRows,\r\n });\r\n },\r\n selectedKeysEqual,\r\n );\r\n\r\n const unsubFocus = controller.subscribeSelected(\r\n () => controller.getActiveCell(),\r\n (cell) => {\r\n handlers.onCellFocused?.({\r\n rowId: cell?.rowId ?? null,\r\n colId: cell?.columnId ?? null,\r\n });\r\n },\r\n activeCellEqual,\r\n );\r\n\r\n return () => {\r\n unsubCatalog();\r\n unsubSelection();\r\n unsubFocus();\r\n };\r\n}\r\n","\"use client\";\r\n\r\nimport { useEffect, useState } from 'react';\r\n\r\nconst QUERIES: Record<string, string> = {\r\n XLUP: '(min-width: 1024px)',\r\n XXLUP: '(min-width: 1366px)',\r\n};\r\n\r\nexport function useMediaQuery(query: string): { match: boolean | null } {\r\n const media = QUERIES[query] ?? query;\r\n const [match, setMatch] = useState<boolean | null>(() => {\r\n if (typeof window === 'undefined') return null;\r\n return window.matchMedia(media).matches;\r\n });\r\n\r\n useEffect(() => {\r\n const mql = window.matchMedia(media);\r\n const onChange = () => setMatch(mql.matches);\r\n onChange();\r\n mql.addEventListener('change', onChange);\r\n return () => mql.removeEventListener('change', onChange);\r\n }, [media]);\r\n\r\n return { match };\r\n}\r\n","\"use client\";\r\n\r\nimport { useCallback, useEffect, useState } from 'react';\r\n\r\nimport { useERPTableHost } from './ERPTableHost';\r\n\r\ntype UseRemoteQueryArgs = {\r\n url?: string;\r\n body?: Record<string, unknown>;\r\n skip?: boolean;\r\n noCache?: boolean;\r\n};\r\n\r\nexport function useRemoteQuery<T = unknown>(args: UseRemoteQueryArgs) {\r\n const { remoteApi } = useERPTableHost();\r\n const [data, setData] = useState<{ Data?: T; TotalCount?: number; ReturnCount?: number; Result?: string } | null>(null);\r\n const [isFetching, setIsFetching] = useState(false);\r\n\r\n const refetch = useCallback(async () => {\r\n if (!args.url || args.skip || !remoteApi) {\r\n setData(null);\r\n return;\r\n }\r\n setIsFetching(true);\r\n try {\r\n const response = await remoteApi.request<{\r\n Data?: T;\r\n TotalCount?: number;\r\n ReturnCount?: number;\r\n Result?: string;\r\n }>({\r\n endpoint: args.url,\r\n params: args.body,\r\n method: 'POST',\r\n });\r\n setData(response ?? null);\r\n } finally {\r\n setIsFetching(false);\r\n }\r\n }, [args.url, args.skip, args.noCache, JSON.stringify(args.body ?? {}), remoteApi]);\r\n\r\n useEffect(() => {\r\n void refetch();\r\n }, [refetch]);\r\n\r\n return { data, isFetching, refetch };\r\n}\r\n\r\n/**\r\n * Imperative counterpart of {@link useRemoteQuery} (RTK `useGet…Mutation`\r\n * style): nothing is fetched until `trigger` is called, and body/url changes\r\n * never refetch on their own.\r\n */\r\nexport function useLazyRemote<T = unknown>() {\r\n const { remoteApi } = useERPTableHost();\r\n const [data, setData] = useState<{ Data?: T; TotalCount?: number; ReturnCount?: number; Result?: string } | null>(null);\r\n const [isFetching, setIsFetching] = useState(false);\r\n\r\n const trigger = useCallback(\r\n async (args: { url?: string; body?: Record<string, unknown> }) => {\r\n if (!args.url || !remoteApi) {\r\n setData(null);\r\n return;\r\n }\r\n setIsFetching(true);\r\n try {\r\n const response = await remoteApi.request<{\r\n Data?: T;\r\n TotalCount?: number;\r\n ReturnCount?: number;\r\n Result?: string;\r\n }>({ endpoint: args.url, params: args.body, method: 'POST' });\r\n setData(response ?? null);\r\n } finally {\r\n setIsFetching(false);\r\n }\r\n },\r\n [remoteApi],\r\n );\r\n\r\n return [trigger, { data, isFetching }] as const;\r\n}\r\n","import { assignThemeVars } from '../theme';\r\nimport { useERPTableHost } from './ERPTableHost';\r\n\r\nexport function showSuccessToast(message?: unknown, _detail?: unknown): void {\r\n const text = String(message ?? '');\r\n emitToast('success', text);\r\n}\r\n\r\nexport function showErrorToast(message?: unknown, _detail?: unknown): void {\r\n const text = String(message ?? '');\r\n emitToast('error', text);\r\n}\r\n\r\nfunction emitToast(kind: 'success' | 'error', message: string): void {\r\n if (typeof document === 'undefined') return;\r\n const existing = document.querySelector('.erp-table-toast');\r\n existing?.remove();\r\n const el = document.createElement('div');\r\n el.className = `erp-table-toast is-${kind}`;\r\n el.textContent = message;\r\n assignThemeVars(el);\r\n document.body.appendChild(el);\r\n window.setTimeout(() => el.remove(), 2800);\r\n}\r\n\r\n/** Host can wrap this if it wants toasts routed through its own UI. */\r\nexport function useHostToast() {\r\n const host = useERPTableHost();\r\n return {\r\n success: (message: string, detail?: unknown) => {\r\n if (host.onToast) host.onToast('success', message, detail);\r\n else showSuccessToast(message, detail);\r\n },\r\n error: (message: string, detail?: unknown) => {\r\n if (host.onToast) host.onToast('error', message, detail);\r\n else showErrorToast(message, detail);\r\n },\r\n };\r\n}\r\n","import { useEffect, useRef } from 'react';\r\n\r\nimport type { EventStore } from '../../application/ports/EventStore';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport {\r\n bindGridHostEvents,\r\n type GridHostEventHandlers,\r\n} from './bindGridHostEvents';\r\n\r\nexport type UseGridHostEventsInput<TRow = unknown> = GridHostEventHandlers<TRow> & {\r\n ready: boolean;\r\n controller: UITableController | null;\r\n eventStore: EventStore | null;\r\n tableKey: string;\r\n};\r\n\r\n/**\r\n * ERPTable wiring for PR-85. Handlers are read from a ref so EventStore\r\n * subscribeAll is not torn down when the host passes inline lambdas.\r\n */\r\nexport function useGridHostEvents<TRow = unknown>(\r\n input: UseGridHostEventsInput<TRow>,\r\n): void {\r\n const handlersRef = useRef<GridHostEventHandlers<TRow>>(input);\r\n handlersRef.current = input;\r\n\r\n useEffect(() => {\r\n if (!input.ready || !input.controller || !input.eventStore) return;\r\n return bindGridHostEvents<TRow>({\r\n eventStore: input.eventStore,\r\n controller: input.controller,\r\n tableKey: input.tableKey,\r\n handlers: {\r\n onCellValueChanged: (event) =>\r\n handlersRef.current.onCellValueChanged?.(event),\r\n onRowValueChanged: (event) =>\r\n handlersRef.current.onRowValueChanged?.(event),\r\n onRowDataUpdated: (event) =>\r\n handlersRef.current.onRowDataUpdated?.(event),\r\n onSelectionChanged: (event) =>\r\n handlersRef.current.onSelectionChanged?.(event),\r\n onCellFocused: (event) => handlersRef.current.onCellFocused?.(event),\r\n },\r\n });\r\n }, [input.ready, input.controller, input.eventStore, input.tableKey]);\r\n}\r\n"]}
@@ -1,31 +0,0 @@
1
- // packages/plugins/excel/src/formatExportValue.ts
2
- function formatExportValue(val, fieldType) {
3
- if (val == null || val === "") {
4
- return fieldType === "selectOption" ? "" : "";
5
- }
6
- switch (fieldType) {
7
- case "checkbox":
8
- return val ? "\u2714" : "\u2718";
9
- case "price":
10
- return `${val}`.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
11
- case "date":
12
- if (typeof val === "string" && val.length > 0) {
13
- try {
14
- return new Intl.DateTimeFormat("fa-IR-u-ca-persian", {
15
- year: "numeric",
16
- month: "2-digit",
17
- day: "2-digit"
18
- }).format(new Date(val));
19
- } catch {
20
- return String(val);
21
- }
22
- }
23
- return "";
24
- default:
25
- return String(val);
26
- }
27
- }
28
-
29
- export { formatExportValue };
30
- //# sourceMappingURL=chunk-KYAOSBQN.js.map
31
- //# sourceMappingURL=chunk-KYAOSBQN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../packages/plugins/excel/src/formatExportValue.ts"],"names":[],"mappings":";AAIO,SAAS,iBAAA,CACd,KACA,SAAA,EACQ;AACR,EAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,KAAQ,EAAA,EAAI;AAC7B,IAAA,OAAO,SAAA,KAAc,iBAAiB,EAAA,GAAK,EAAA;AAAA,EAC7C;AAEA,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,UAAA;AACH,MAAA,OAAO,MAAM,QAAA,GAAM,QAAA;AAAA,IACrB,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,CAAG,OAAA,CAAQ,yBAAyB,GAAG,CAAA;AAAA,IACtD,KAAK,MAAA;AACH,MAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC7C,QAAA,IAAI;AACF,UAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,oBAAA,EAAsB;AAAA,YACnD,IAAA,EAAM,SAAA;AAAA,YACN,KAAA,EAAO,SAAA;AAAA,YACP,GAAA,EAAK;AAAA,WACN,CAAA,CAAE,MAAA,CAAO,IAAI,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,QACzB,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,OAAO,GAAG,CAAA;AAAA,QACnB;AAAA,MACF;AACA,MAAA,OAAO,EAAA;AAAA,IACT;AACE,MAAA,OAAO,OAAO,GAAG,CAAA;AAAA;AAEvB","file":"chunk-KYAOSBQN.js","sourcesContent":["/**\r\n * Pure string formatter for Excel/PDF export (no React).\r\n * Mirrors ui/helper valueParser for common field types.\r\n */\r\nexport function formatExportValue(\r\n val: unknown,\r\n fieldType?: string,\r\n): string {\r\n if (val == null || val === '') {\r\n return fieldType === 'selectOption' ? '' : '';\r\n }\r\n\r\n switch (fieldType) {\r\n case 'checkbox':\r\n return val ? '✔' : '✘';\r\n case 'price':\r\n return `${val}`.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\r\n case 'date':\r\n if (typeof val === 'string' && val.length > 0) {\r\n try {\r\n return new Intl.DateTimeFormat('fa-IR-u-ca-persian', {\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n }).format(new Date(val));\r\n } catch {\r\n return String(val);\r\n }\r\n }\r\n return '';\r\n default:\r\n return String(val);\r\n }\r\n}\r\n"]}
@@ -1 +0,0 @@
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":["buildExportTable","buildXlsxBlob","downloadBlob","strFromU8","unzipSync","formatExportValue","hasMeaningfulValue"],"mappings":"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","file":"chunk-PXCHPZTP.cjs","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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../infrastructure/date/gregorianAdapter.ts","../infrastructure/date/jalaliCalendarModel.ts","../ui/theme/GridTheme.ts","../ui/theme/resolveActiveTheme.ts","../ui/theme/applyCssVars.ts","../ui/host/messages.ts","../ui/host/ERPTableHost.tsx","../ui/host/dependOn.ts","../ui/host/bindGridHostEvents.ts","../ui/host/useMediaQuery.ts","../ui/host/useRemoteQuery.ts","../ui/host/toast.ts","../ui/host/useGridHostEvents.ts"],"names":["useEffect","useState"],"mappings":"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","file":"chunk-QQMU44KJ.js","sourcesContent":["import type { DateAdapter } from '../../application/ports/DateAdapter';\r\nimport { normalizeDigits } from '../../engine/dataOps/sortModel';\r\nimport { pad2 } from './jalaliMath';\r\n\r\nconst ISO_RE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\r\nconst SLASH_RE = /^(\\d{4})[/\\-.](\\d{1,2})[/\\-.](\\d{1,2})$/;\r\n\r\nfunction utcDay(y: number, m: number, d: number): Date {\r\n return new Date(Date.UTC(y, m - 1, d, 12, 0, 0));\r\n}\r\n\r\nfunction asUtcDay(date: Date): Date {\r\n return utcDay(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate());\r\n}\r\n\r\n/** Gregorian calendar adapter (PR-128 / D21). */\r\nexport const gregorianAdapter: DateAdapter = {\r\n id: 'gregory',\r\n\r\n parse(input: unknown): Date | null {\r\n if (input == null || input === '') return null;\r\n if (input instanceof Date && !Number.isNaN(input.getTime())) {\r\n return asUtcDay(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 : asUtcDay(d);\r\n }\r\n const text = normalizeDigits(String(input).trim());\r\n const iso = ISO_RE.exec(text);\r\n if (iso) {\r\n return utcDay(Number(iso[1]), Number(iso[2]), Number(iso[3]));\r\n }\r\n const slash = SLASH_RE.exec(text);\r\n if (slash) {\r\n return utcDay(Number(slash[1]), Number(slash[2]), Number(slash[3]));\r\n }\r\n const fallback = new Date(text);\r\n return Number.isNaN(fallback.getTime()) ? null : asUtcDay(fallback);\r\n },\r\n\r\n format(date: Date): string {\r\n const d = asUtcDay(date);\r\n return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`;\r\n },\r\n\r\n addDays(date: Date, days: number): Date {\r\n const next = asUtcDay(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 d = asUtcDay(date);\r\n return utcDay(d.getUTCFullYear(), d.getUTCMonth() + 1, 1);\r\n },\r\n\r\n compare(a: Date, b: Date): number {\r\n return asUtcDay(a).getTime() - asUtcDay(b).getTime();\r\n },\r\n};\r\n","/**\r\n * Pure Jalali month-grid helpers for the internal picker (PR-140).\r\n */\r\n\r\nimport {\r\n gregorianDateToJalali,\r\n jalaliMonthLength,\r\n jalaliToGregorianDate,\r\n} from './jalaliMath';\r\n\r\nexport type JalaliYmd = { jy: number; jm: number; jd: number };\r\n\r\nexport type CalendarCell = {\r\n ymd: JalaliYmd;\r\n date: Date;\r\n inCurrentMonth: boolean;\r\n /** 0 = Saturday … 6 = Friday (Jalali week starts Saturday). */\r\n weekday: number;\r\n};\r\n\r\nconst MONTH_NAMES_FA = [\r\n 'فروردین',\r\n 'اردیبهشت',\r\n 'خرداد',\r\n 'تیر',\r\n 'مرداد',\r\n 'شهریور',\r\n 'مهر',\r\n 'آبان',\r\n 'آذر',\r\n 'دی',\r\n 'بهمن',\r\n 'اسفند',\r\n] as const;\r\n\r\nexport const JALALI_WEEKDAY_LABELS_FA = [\r\n 'ش',\r\n 'ی',\r\n 'د',\r\n 'س',\r\n 'چ',\r\n 'پ',\r\n 'ج',\r\n] as const;\r\n\r\nexport function jalaliMonthName(jm: number): string {\r\n return MONTH_NAMES_FA[jm - 1] ?? String(jm);\r\n}\r\n\r\nexport function toJalaliYmd(date: Date): JalaliYmd {\r\n return gregorianDateToJalali(utcNoon(date));\r\n}\r\n\r\nexport function fromJalaliYmd(ymd: JalaliYmd): Date {\r\n return jalaliToGregorianDate(ymd.jy, ymd.jm, ymd.jd);\r\n}\r\n\r\nexport function sameJalaliDay(a: Date, b: Date): boolean {\r\n const x = toJalaliYmd(a);\r\n const y = toJalaliYmd(b);\r\n return x.jy === y.jy && x.jm === y.jm && x.jd === y.jd;\r\n}\r\n\r\nexport function compareJalaliDay(a: Date, b: Date): number {\r\n return utcNoon(a).getTime() - utcNoon(b).getTime();\r\n}\r\n\r\nexport function addJalaliMonths(\r\n jy: number,\r\n jm: number,\r\n delta: number,\r\n): { jy: number; jm: number } {\r\n const idx = jy * 12 + (jm - 1) + delta;\r\n return {\r\n jy: Math.floor(idx / 12),\r\n jm: (idx % 12) + 1,\r\n };\r\n}\r\n\r\n/**\r\n * 6×7 grid of days for a Jalali month. Week starts Saturday.\r\n * Leading/trailing cells may belong to adjacent months (`inCurrentMonth: false`).\r\n */\r\nexport function buildJalaliMonthGrid(jy: number, jm: number): CalendarCell[] {\r\n const first = jalaliToGregorianDate(jy, jm, 1);\r\n const jsDow = first.getUTCDay();\r\n const jalaliWeekStart = (jsDow + 1) % 7;\r\n const daysInMonth = jalaliMonthLength(jy, jm);\r\n const cells: CalendarCell[] = [];\r\n\r\n for (let i = 0; i < 42; i += 1) {\r\n const offset = i - jalaliWeekStart;\r\n let cellJy = jy;\r\n let cellJm = jm;\r\n let cellJd: number;\r\n let inCurrentMonth = true;\r\n\r\n if (offset < 0) {\r\n const prev = addJalaliMonths(jy, jm, -1);\r\n cellJy = prev.jy;\r\n cellJm = prev.jm;\r\n cellJd = jalaliMonthLength(cellJy, cellJm) + offset + 1;\r\n inCurrentMonth = false;\r\n } else if (offset >= daysInMonth) {\r\n const next = addJalaliMonths(jy, jm, 1);\r\n cellJy = next.jy;\r\n cellJm = next.jm;\r\n cellJd = offset - daysInMonth + 1;\r\n inCurrentMonth = false;\r\n } else {\r\n cellJd = offset + 1;\r\n }\r\n\r\n const date = jalaliToGregorianDate(cellJy, cellJm, cellJd);\r\n cells.push({\r\n ymd: { jy: cellJy, jm: cellJm, jd: cellJd },\r\n date,\r\n inCurrentMonth,\r\n weekday: i % 7,\r\n });\r\n }\r\n return cells;\r\n}\r\n\r\nexport type DateRangeValue = {\r\n start: Date | null;\r\n end: Date | null;\r\n};\r\n\r\nexport function isDateInRange(date: Date, range: DateRangeValue): boolean {\r\n if (!range.start) return false;\r\n if (!range.end) return sameJalaliDay(date, range.start);\r\n const t = utcNoon(date).getTime();\r\n const a = utcNoon(range.start).getTime();\r\n const b = utcNoon(range.end).getTime();\r\n return t >= Math.min(a, b) && t <= Math.max(a, b);\r\n}\r\n\r\nfunction utcNoon(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","export type ThemeParams = {\r\n backgroundColor: string;\r\n foregroundColor: string;\r\n accentColor: string;\r\n headerBackgroundColor: string;\r\n rowStripeColor: string;\r\n rowSelectedColor: string;\r\n borderColor: string;\r\n dangerColor: string;\r\n searchMatchColor: string;\r\n fontFamily: string;\r\n rowHeight: number;\r\n cellFontSize: number;\r\n borderRadius: string;\r\n};\r\n\r\nexport type ThemeCssVars = Record<string, string>;\r\n\r\n/** `--erp-*` mirrors `--pdg-*` for one version (PR-87 / D13). */\r\nfunction aliasErpTokens(vars: ThemeCssVars): ThemeCssVars {\r\n const out: ThemeCssVars = {};\r\n for (const [key, value] of Object.entries(vars)) {\r\n if (key.startsWith('--pdg-')) {\r\n out[`--erp-${key.slice('--pdg-'.length)}`] = value;\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nexport class GridTheme {\r\n constructor(\r\n readonly params: ThemeParams,\r\n readonly extraCssVars: ThemeCssVars = {},\r\n ) {}\r\n\r\n withParams(partial: Partial<ThemeParams>): GridTheme {\r\n return new GridTheme({ ...this.params, ...partial }, this.extraCssVars);\r\n }\r\n\r\n withExtraCssVars(extra: ThemeCssVars): GridTheme {\r\n return new GridTheme(this.params, { ...this.extraCssVars, ...extra });\r\n }\r\n\r\n toCssVars(): ThemeCssVars {\r\n const p = this.params;\r\n const roles: ThemeCssVars = {\r\n '--pdg-bg': p.backgroundColor,\r\n '--pdg-fg': p.foregroundColor,\r\n '--pdg-accent': p.accentColor,\r\n '--pdg-header-bg': p.headerBackgroundColor,\r\n '--pdg-row-stripe': p.rowStripeColor,\r\n '--pdg-row-selected': p.rowSelectedColor,\r\n '--pdg-border': p.borderColor,\r\n '--pdg-danger': p.dangerColor,\r\n '--pdg-search-match': p.searchMatchColor,\r\n '--pdg-font': p.fontFamily,\r\n '--pdg-row-height': `${p.rowHeight}px`,\r\n '--pdg-font-size': `${p.cellFontSize}px`,\r\n '--pdg-radius': p.borderRadius,\r\n };\r\n return {\r\n ...roles,\r\n ...aliasErpTokens(roles),\r\n ...this.extraCssVars,\r\n ...aliasErpTokens(this.extraCssVars),\r\n };\r\n }\r\n}\r\n\r\n/** Default grid chrome — same computed colors as the CSS palette aliases. */\r\nexport const themeDefault = new GridTheme({\r\n backgroundColor: '#fff',\r\n foregroundColor: '#292929',\r\n accentColor: '#0658b0',\r\n headerBackgroundColor: '#f4f4f4',\r\n rowStripeColor: '#ddecfd',\r\n rowSelectedColor: '#dbeafe',\r\n borderColor: '#ececec',\r\n dangerColor: '#dc2626',\r\n searchMatchColor: '#facc15',\r\n fontFamily: 'IRANSans, Tahoma, sans-serif',\r\n rowHeight: 40,\r\n cellFontSize: 12,\r\n borderRadius: '0.25rem',\r\n});\r\n\r\n/** @deprecated Use {@link themeDefault}. Removed in 1.0.0. */\r\nexport const themeErp = themeDefault;\r\n\r\n/** Dark chrome. Palette extras keep leftover gray utilities readable. */\r\nconst DARK_PALETTE_VARS: ThemeCssVars = {\r\n '--pdg-main-white': '#171717',\r\n '--pdg-main-black': '#f4f4f4',\r\n '--pdg-gray-3': '#262626',\r\n '--pdg-gray-5': '#404040',\r\n '--pdg-gray-6': '#525252',\r\n '--pdg-gray-7': '#a3a3a3',\r\n '--pdg-gray-8': '#d4d4d4',\r\n '--pdg-gray-85': '#d4d4d4',\r\n '--pdg-gray-9': '#e5e5e5',\r\n '--pdg-gray-10': '#f5f5f5',\r\n '--pdg-gray-11': '#fafafa',\r\n '--pdg-black-6': '#f4f4f4',\r\n '--pdg-blue-6': '#60a5fa',\r\n '--pdg-blue-11': '#1e3a5f',\r\n '--pdg-blue-100': '#1e3a8a',\r\n '--pdg-red-100': '#7f1d1d',\r\n '--pdg-red-300': '#fca5a5',\r\n '--pdg-red-600': '#f87171',\r\n '--pdg-yellow-200': '#854d0e',\r\n '--pdg-yellow-400': '#eab308',\r\n '--pdg-zinc-200': '#3f3f46',\r\n '--pdg-neutral-500': '#a3a3a3',\r\n '--pdg-gray-100': '#27272a',\r\n '--pdg-scrollbar': '#525252',\r\n '--pdg-overlay': 'rgba(0, 0, 0, 0.55)',\r\n};\r\n\r\nexport const themeDark = themeDefault\r\n .withParams({\r\n backgroundColor: '#171717',\r\n foregroundColor: '#f4f4f4',\r\n accentColor: '#60a5fa',\r\n headerBackgroundColor: '#262626',\r\n rowStripeColor: '#1e3a5f',\r\n rowSelectedColor: '#1e3a8a',\r\n borderColor: '#404040',\r\n dangerColor: '#f87171',\r\n searchMatchColor: '#eab308',\r\n })\r\n .withExtraCssVars(DARK_PALETTE_VARS);\r\n\r\n/** @deprecated Use {@link themeDark}. Removed in 1.0.0. */\r\nexport const themeErpDark = themeDark;\r\n","import {\r\n GridTheme,\r\n type ThemeParams,\r\n themeErp,\r\n themeErpDark,\r\n} from './GridTheme';\r\n\r\nexport function themeParamsEqual(a: ThemeParams, b: ThemeParams): boolean {\r\n return (\r\n a.backgroundColor === b.backgroundColor &&\r\n a.foregroundColor === b.foregroundColor &&\r\n a.accentColor === b.accentColor &&\r\n a.headerBackgroundColor === b.headerBackgroundColor &&\r\n a.rowStripeColor === b.rowStripeColor &&\r\n a.rowSelectedColor === b.rowSelectedColor &&\r\n a.borderColor === b.borderColor &&\r\n a.dangerColor === b.dangerColor &&\r\n a.searchMatchColor === b.searchMatchColor &&\r\n a.fontFamily === b.fontFamily &&\r\n a.rowHeight === b.rowHeight &&\r\n a.cellFontSize === b.cellFontSize &&\r\n a.borderRadius === b.borderRadius\r\n );\r\n}\r\n\r\nexport function isStockLightTheme(theme: GridTheme): boolean {\r\n return themeParamsEqual(theme.params, themeErp.params);\r\n}\r\n\r\nexport function isStockDarkTheme(theme: GridTheme): boolean {\r\n return themeParamsEqual(theme.params, themeErpDark.params);\r\n}\r\n\r\n/** Built-in light/dark. Any `withParams` change locks the product toggle. */\r\nexport function isStockTheme(theme: GridTheme): boolean {\r\n return isStockLightTheme(theme) || isStockDarkTheme(theme);\r\n}\r\n\r\nexport function resolveActiveTheme(input: {\r\n requested?: GridTheme;\r\n preferDark: boolean;\r\n}): { theme: GridTheme; locked: boolean } {\r\n const requested = input.requested ?? themeErp;\r\n const locked = !isStockTheme(requested);\r\n if (locked) return { theme: requested, locked: true };\r\n return {\r\n theme: input.preferDark ? themeErpDark : themeErp,\r\n locked: false,\r\n };\r\n}\r\n","import type { CSSProperties } from 'react';\r\n\r\nimport type { GridTheme, ThemeCssVars } from './GridTheme';\r\nimport { themeErp } from './GridTheme';\r\n\r\nlet lastVars: ThemeCssVars = themeErp.toCssVars();\r\n\r\nexport function rememberThemeVars(vars: ThemeCssVars): void {\r\n lastVars = vars;\r\n}\r\n\r\nexport function getRememberedThemeVars(): ThemeCssVars {\r\n return lastVars;\r\n}\r\n\r\nexport function themeToStyle(\r\n theme: GridTheme,\r\n extra?: CSSProperties,\r\n): CSSProperties {\r\n return { ...theme.toCssVars(), ...extra } as CSSProperties;\r\n}\r\n\r\n/** Copy last (or given) theme vars onto an imperative DOM node (toasts). */\r\nexport function assignThemeVars(\r\n el: HTMLElement,\r\n vars: ThemeCssVars = lastVars,\r\n): void {\r\n for (const [key, value] of Object.entries(vars)) {\r\n el.style.setProperty(key, value);\r\n }\r\n}\r\n","import {\r\n getLocalePack,\r\n type ERPTableLocale,\r\n type ERPTableMessages,\r\n} from '../locales';\r\n\r\nexport type { ERPTableLocale, ERPTableMessages } from '../locales';\r\nexport {\r\n arMessages,\r\n enMessages,\r\n faMessages,\r\n formatLocaleDate,\r\n formatLocaleNumber,\r\n getLocalePack,\r\n LOCALE_META,\r\n LOCALE_PACKS,\r\n resolveDirection,\r\n resolveLocaleMeta,\r\n} from '../locales';\r\nexport type { LocaleMeta, NumberingSystem } from '../locales';\r\n\r\n/** @deprecated Prefer `faMessages` from `persian-data-grid/locales/fa`. */\r\nexport const FA_MESSAGES: ERPTableMessages = getLocalePack('fa');\r\n/** @deprecated Prefer `enMessages` from `persian-data-grid/locales/en`. */\r\nexport const EN_MESSAGES: ERPTableMessages = getLocalePack('en');\r\n/** Arabic pack alias (PR-127). */\r\nexport const AR_MESSAGES: ERPTableMessages = getLocalePack('ar');\r\n\r\nexport function translate(\r\n key: string,\r\n locale: ERPTableLocale,\r\n overrides?: Partial<ERPTableMessages>,\r\n): string {\r\n const pack = getLocalePack(locale);\r\n return overrides?.[key] ?? pack[key] ?? key;\r\n}\r\n\r\n/** Replace `{name}` tokens in a message template (PR-125). */\r\nexport function formatMessage(\r\n template: string,\r\n vars: Record<string, string | number>,\r\n): string {\r\n return template.replace(/\\{(\\w+)\\}/g, (_, name: string) => {\r\n const value = vars[name];\r\n return value == null ? `{${name}}` : String(value);\r\n });\r\n}\r\n","\"use client\";\r\n\r\nimport React, {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n type CSSProperties,\r\n type ReactNode,\r\n} from 'react';\r\n\r\nimport type { DateAdapter } from '../../application/ports/DateAdapter';\r\nimport type { UseDependOnHook } from './dependOn';\r\nimport type { RemoteApi } from '../../application/ports/RemoteApi';\r\nimport type { ColumnMenuItemsConfig } from '../../engine/dataOps/columnMenu';\r\nimport {\r\n gregorianAdapter,\r\n jalaliAdapter,\r\n} from '../../infrastructure/date';\r\nimport type { CellComponentMap } from '../cellRenderer/cellRegistry';\r\nimport type { ColumnMenuActionEvent } from '../desktop/ColumnMenuPopover';\r\nimport type { FilterComponentMap } from '../filters';\r\nimport {\r\n GridTheme,\r\n rememberThemeVars,\r\n themeErp,\r\n themeToStyle,\r\n} from '../theme';\r\nimport {\r\n formatMessage,\r\n resolveDirection,\r\n type ERPTableLocale,\r\n type ERPTableMessages,\r\n type NumberingSystem,\r\n translate,\r\n} from './messages';\r\n\r\nexport type ERPTableToastKind = 'success' | 'error';\r\n\r\nexport type ERPTableHostValue = {\r\n locale: ERPTableLocale;\r\n direction: 'rtl' | 'ltr';\r\n /** Intl digit system (PR-127). Default from locale meta. */\r\n numberingSystem?: NumberingSystem;\r\n /**\r\n * Calendar port (PR-128 / D21). Default: `jalaliAdapter` for `fa`,\r\n * otherwise `gregorianAdapter`.\r\n */\r\n dateAdapter?: DateAdapter;\r\n remoteApi?: RemoteApi;\r\n messages?: Partial<ERPTableMessages>;\r\n onToast?: (kind: ERPTableToastKind, message: string, detail?: unknown) => void;\r\n theme?: GridTheme;\r\n themeToggle?: boolean;\r\n themeLocked?: boolean;\r\n onToggleTheme?: () => void;\r\n components?: CellComponentMap;\r\n /** Custom column filter UIs (PR-95). Keys match `ColumnDef.filter`. */\r\n filterComponents?: FilterComponentMap;\r\n /** Column header menu items (PR-114). */\r\n columnMenuItems?: ColumnMenuItemsConfig;\r\n /** Custom column menu action handler (PR-114). */\r\n onColumnMenuAction?: (event: ColumnMenuActionEvent) => void;\r\n /**\r\n * Resolves `dependOn` values for remote lists (e.g. from the form that owns\r\n * the grid — Redux, React context, …). Default: static item values.\r\n */\r\n useDependOn?: UseDependOnHook;\r\n};\r\n\r\nfunction defaultDateAdapter(locale: ERPTableLocale): DateAdapter {\r\n return locale === 'fa' ? jalaliAdapter : gregorianAdapter;\r\n}\r\n\r\nconst ERPTableHostContext = createContext<ERPTableHostValue>({\r\n locale: 'fa',\r\n direction: 'rtl',\r\n dateAdapter: jalaliAdapter,\r\n theme: themeErp,\r\n themeToggle: true,\r\n themeLocked: false,\r\n});\r\n\r\nexport function ERPTableHostProvider({\r\n children,\r\n locale = 'fa',\r\n direction,\r\n numberingSystem,\r\n dateAdapter,\r\n remoteApi,\r\n messages,\r\n onToast,\r\n theme = themeErp,\r\n themeToggle = true,\r\n themeLocked = false,\r\n onToggleTheme,\r\n components,\r\n filterComponents,\r\n columnMenuItems,\r\n onColumnMenuAction,\r\n useDependOn,\r\n}: ERPTableHostValue & { children: ReactNode }) {\r\n const value = useMemo<ERPTableHostValue>(\r\n () => ({\r\n locale,\r\n direction: resolveDirection(locale, direction),\r\n numberingSystem,\r\n dateAdapter: dateAdapter ?? defaultDateAdapter(locale),\r\n remoteApi,\r\n messages,\r\n onToast,\r\n theme,\r\n themeToggle,\r\n themeLocked,\r\n onToggleTheme,\r\n components,\r\n filterComponents,\r\n columnMenuItems,\r\n onColumnMenuAction,\r\n useDependOn,\r\n }),\r\n [\r\n locale,\r\n direction,\r\n numberingSystem,\r\n dateAdapter,\r\n remoteApi,\r\n messages,\r\n onToast,\r\n theme,\r\n themeToggle,\r\n themeLocked,\r\n onToggleTheme,\r\n components,\r\n filterComponents,\r\n columnMenuItems,\r\n onColumnMenuAction,\r\n useDependOn,\r\n ],\r\n );\r\n\r\n useEffect(() => {\r\n rememberThemeVars(theme.toCssVars());\r\n }, [theme]);\r\n\r\n return (\r\n <ERPTableHostContext.Provider value={value}>\r\n {children}\r\n </ERPTableHostContext.Provider>\r\n );\r\n}\r\n\r\nexport function useERPTableHost(): ERPTableHostValue {\r\n return useContext(ERPTableHostContext);\r\n}\r\n\r\nexport function useERPTableTheme(): GridTheme {\r\n return useERPTableHost().theme ?? themeErp;\r\n}\r\n\r\n/** Merge theme CSS vars into a portal node that mounts on `document.body`. */\r\nexport function useThemePortalStyle(extra?: CSSProperties): CSSProperties {\r\n const theme = useERPTableTheme();\r\n return themeToStyle(theme, extra);\r\n}\r\n\r\nexport function useTranslations() {\r\n const { locale, messages } = useERPTableHost();\r\n return (key: string, vars?: Record<string, string | number>) => {\r\n const raw = translate(key, locale, messages);\r\n return vars ? formatMessage(raw, vars) : raw;\r\n };\r\n}\r\n\r\nexport function useLocale(): ERPTableLocale {\r\n return useERPTableHost().locale;\r\n}\r\n\r\nexport function useNumberingSystem(): NumberingSystem | undefined {\r\n return useERPTableHost().numberingSystem;\r\n}\r\n\r\nexport function useDateAdapter(): DateAdapter {\r\n return useERPTableHost().dateAdapter ?? jalaliAdapter;\r\n}\r\n\r\nexport function useDirection(): 'rtl' | 'ltr' {\r\n return useERPTableHost().direction;\r\n}\r\n","\"use client\";\r\n\r\nimport { useERPTableHost } from './ERPTableHost';\r\n\r\n/** One dependency: a named sibling field and (optionally) its current value. */\r\nexport type DependOnItem =\r\n | string\r\n | { fieldName: string; value?: unknown };\r\nexport type DependOn = DependOnItem | DependOnItem[];\r\n\r\nexport type DependValueResolver = (item: DependOnItem) => unknown;\r\n\r\nexport type UseDependOnOptions = {\r\n /**\r\n * Ask the host to resolve dependency values (e.g. from the form that owns\r\n * the grid). When false/omitted, the `value` carried by each item is used.\r\n */\r\n enabled?: boolean;\r\n /** Send `value.value` when a resolved value is an option-like object. */\r\n unwrapObjectValue?: boolean;\r\n};\r\n\r\nexport type UseDependOnResult = {\r\n /** `{ [fieldName]: value }` to merge into a remote request body. */\r\n dependencyBody: Record<string, unknown>;\r\n /** Every dependency has a value (true when there is no dependOn). */\r\n isReady: boolean;\r\n /** Stable string that changes when the dependencies change. */\r\n dependencyKey: string;\r\n};\r\n\r\n/**\r\n * Host-injectable dependency resolver. The arianERP host implements this on\r\n * top of Redux page data; the default implementation reads the static values\r\n * carried by the `dependOn` items.\r\n */\r\nexport type UseDependOnHook = (\r\n dependOn?: DependOn | null,\r\n options?: UseDependOnOptions,\r\n) => UseDependOnResult;\r\n\r\nconst toList = (dependOn?: DependOn | null): DependOnItem[] =>\r\n !dependOn ? [] : Array.isArray(dependOn) ? dependOn : [dependOn];\r\n\r\nexport const getDependFieldName = (item: DependOnItem): string =>\r\n typeof item === 'string' ? item : item.fieldName;\r\n\r\n/** The value carried by the item itself; a bare field name carries none. */\r\nexport const getStaticDependValue: DependValueResolver = (item) =>\r\n typeof item === 'object' ? item.value : undefined;\r\n\r\n/** True when every dependency resolves to a non-null value (or there are none). */\r\nexport const hasDependValue = (\r\n dependOn?: DependOn | null,\r\n resolve: DependValueResolver = getStaticDependValue,\r\n): boolean => toList(dependOn).every((item) => resolve(item) != null);\r\n\r\n/** Builds the `{ [fieldName]: value }` part of a request body. */\r\nexport const buildDependencyBody = (\r\n dependOn?: DependOn | null,\r\n resolve: DependValueResolver = getStaticDependValue,\r\n): Record<string, unknown> =>\r\n Object.fromEntries(\r\n toList(dependOn).map((item) => [getDependFieldName(item), resolve(item)]),\r\n );\r\n\r\n/** Default `UseDependOnHook`: static values carried by the items. */\r\nexport const useStaticDependOn: UseDependOnHook = (dependOn, options) => {\r\n const unwrap = (value: unknown) =>\r\n options?.unwrapObjectValue &&\r\n value !== null &&\r\n typeof value === 'object' &&\r\n !Array.isArray(value) &&\r\n 'value' in value\r\n ? (value as { value: unknown }).value\r\n : value;\r\n const resolve: DependValueResolver = (item) => unwrap(getStaticDependValue(item));\r\n return {\r\n isReady: hasDependValue(dependOn, resolve),\r\n dependencyBody: buildDependencyBody(dependOn, resolve),\r\n dependencyKey: JSON.stringify(dependOn ?? null),\r\n };\r\n};\r\n\r\n/** Resolve dependency values through the host hook, falling back to static. */\r\nexport const useHostDependOn: UseDependOnHook = (dependOn, options) => {\r\n const host = useERPTableHost();\r\n const hook = host.useDependOn ?? useStaticDependOn;\r\n return hook(dependOn, options);\r\n};\r\n","import type { EventStore } from '../../application/ports/EventStore';\r\nimport {\r\n subscribeCatalogHostEvents,\r\n type CatalogHostEventHandlers,\r\n type CellFocusedEvent,\r\n type SelectionChangedEvent,\r\n} from '../../application/events/hostGridEvents';\r\nimport type { GridApi } from '../../infrastructure/ui/createGridApi';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\n\r\nexport type GridReadyEvent<TRow = unknown> = {\r\n api: GridApi<TRow>;\r\n};\r\n\r\nexport type GridHostEventHandlers<TRow = unknown> = CatalogHostEventHandlers<TRow> & {\r\n onSelectionChanged?: (event: SelectionChangedEvent<TRow>) => void;\r\n onCellFocused?: (event: CellFocusedEvent) => void;\r\n onGridReady?: (event: GridReadyEvent<TRow>) => void;\r\n};\r\n\r\nfunction selectedKeysEqual(\r\n a: Record<number, boolean> | null | undefined,\r\n b: Record<number, boolean> | null | undefined,\r\n): boolean {\r\n const left = Object.keys(a ?? {});\r\n const right = Object.keys(b ?? {});\r\n if (left.length !== right.length) return false;\r\n return left.every((key) => {\r\n const id = Number(key);\r\n return Boolean(a?.[id]) === Boolean(b?.[id]);\r\n });\r\n}\r\n\r\nfunction activeCellEqual(\r\n a: { rowId?: number; columnId?: string } | null | undefined,\r\n b: { rowId?: number; columnId?: string } | null | undefined,\r\n): boolean {\r\n return a?.rowId === b?.rowId && a?.columnId === b?.columnId;\r\n}\r\n\r\nfunction selectedRowIds(\r\n selected: Record<number, boolean> | null | undefined,\r\n): number[] {\r\n return Object.keys(selected ?? {})\r\n .map(Number)\r\n .filter((id) => Number.isFinite(id) && Boolean(selected?.[id]));\r\n}\r\n\r\n/**\r\n * Subscribe to EVENT_CATALOG (`EventStore`) plus the existing view store\r\n * (selection / focus). One unsubscribe. Not a second event bus.\r\n */\r\nexport function bindGridHostEvents<TRow = unknown>(\r\n input: {\r\n eventStore: EventStore;\r\n controller: UITableController;\r\n tableKey: string;\r\n handlers: GridHostEventHandlers<TRow>;\r\n },\r\n): () => void {\r\n const { eventStore, controller, tableKey, handlers } = input;\r\n\r\n const unsubCatalog = subscribeCatalogHostEvents(\r\n eventStore,\r\n {\r\n tableId: tableKey,\r\n getRowData: (rowId) =>\r\n controller.getAllRows()?.find((row) => row.id.value === rowId)?.data as\r\n | TRow\r\n | undefined,\r\n getAllRowData: () =>\r\n (controller.getAllRows() ?? [])\r\n .map((row) => row.data)\r\n .filter((data): data is TRow => data !== undefined),\r\n },\r\n handlers,\r\n );\r\n\r\n const unsubSelection = controller.subscribeSelected(\r\n () => controller.getSelectedRows(),\r\n (selected) => {\r\n const ids = selectedRowIds(selected);\r\n const rows = controller.getAllRows() ?? [];\r\n const selectedRows = ids\r\n .map((id) => rows.find((row) => row.id.value === id)?.data)\r\n .filter((data): data is TRow => data !== undefined);\r\n handlers.onSelectionChanged?.({\r\n selectedRowIds: ids,\r\n selectedRows,\r\n });\r\n },\r\n selectedKeysEqual,\r\n );\r\n\r\n const unsubFocus = controller.subscribeSelected(\r\n () => controller.getActiveCell(),\r\n (cell) => {\r\n handlers.onCellFocused?.({\r\n rowId: cell?.rowId ?? null,\r\n colId: cell?.columnId ?? null,\r\n });\r\n },\r\n activeCellEqual,\r\n );\r\n\r\n return () => {\r\n unsubCatalog();\r\n unsubSelection();\r\n unsubFocus();\r\n };\r\n}\r\n","\"use client\";\r\n\r\nimport { useEffect, useState } from 'react';\r\n\r\nconst QUERIES: Record<string, string> = {\r\n XLUP: '(min-width: 1024px)',\r\n XXLUP: '(min-width: 1366px)',\r\n};\r\n\r\nexport function useMediaQuery(query: string): { match: boolean | null } {\r\n const media = QUERIES[query] ?? query;\r\n const [match, setMatch] = useState<boolean | null>(() => {\r\n if (typeof window === 'undefined') return null;\r\n return window.matchMedia(media).matches;\r\n });\r\n\r\n useEffect(() => {\r\n const mql = window.matchMedia(media);\r\n const onChange = () => setMatch(mql.matches);\r\n onChange();\r\n mql.addEventListener('change', onChange);\r\n return () => mql.removeEventListener('change', onChange);\r\n }, [media]);\r\n\r\n return { match };\r\n}\r\n","\"use client\";\r\n\r\nimport { useCallback, useEffect, useState } from 'react';\r\n\r\nimport { useERPTableHost } from './ERPTableHost';\r\n\r\ntype UseRemoteQueryArgs = {\r\n url?: string;\r\n body?: Record<string, unknown>;\r\n skip?: boolean;\r\n noCache?: boolean;\r\n};\r\n\r\nexport function useRemoteQuery<T = unknown>(args: UseRemoteQueryArgs) {\r\n const { remoteApi } = useERPTableHost();\r\n const [data, setData] = useState<{ Data?: T; TotalCount?: number; ReturnCount?: number; Result?: string } | null>(null);\r\n const [isFetching, setIsFetching] = useState(false);\r\n\r\n const refetch = useCallback(async () => {\r\n if (!args.url || args.skip || !remoteApi) {\r\n setData(null);\r\n return;\r\n }\r\n setIsFetching(true);\r\n try {\r\n const response = await remoteApi.request<{\r\n Data?: T;\r\n TotalCount?: number;\r\n ReturnCount?: number;\r\n Result?: string;\r\n }>({\r\n endpoint: args.url,\r\n params: args.body,\r\n method: 'POST',\r\n });\r\n setData(response ?? null);\r\n } finally {\r\n setIsFetching(false);\r\n }\r\n }, [args.url, args.skip, args.noCache, JSON.stringify(args.body ?? {}), remoteApi]);\r\n\r\n useEffect(() => {\r\n void refetch();\r\n }, [refetch]);\r\n\r\n return { data, isFetching, refetch };\r\n}\r\n\r\n/**\r\n * Imperative counterpart of {@link useRemoteQuery} (RTK `useGet…Mutation`\r\n * style): nothing is fetched until `trigger` is called, and body/url changes\r\n * never refetch on their own.\r\n */\r\nexport function useLazyRemote<T = unknown>() {\r\n const { remoteApi } = useERPTableHost();\r\n const [data, setData] = useState<{ Data?: T; TotalCount?: number; ReturnCount?: number; Result?: string } | null>(null);\r\n const [isFetching, setIsFetching] = useState(false);\r\n\r\n const trigger = useCallback(\r\n async (args: { url?: string; body?: Record<string, unknown> }) => {\r\n if (!args.url || !remoteApi) {\r\n setData(null);\r\n return;\r\n }\r\n setIsFetching(true);\r\n try {\r\n const response = await remoteApi.request<{\r\n Data?: T;\r\n TotalCount?: number;\r\n ReturnCount?: number;\r\n Result?: string;\r\n }>({ endpoint: args.url, params: args.body, method: 'POST' });\r\n setData(response ?? null);\r\n } finally {\r\n setIsFetching(false);\r\n }\r\n },\r\n [remoteApi],\r\n );\r\n\r\n return [trigger, { data, isFetching }] as const;\r\n}\r\n","import { assignThemeVars } from '../theme';\r\nimport { useERPTableHost } from './ERPTableHost';\r\n\r\nexport function showSuccessToast(message?: unknown, _detail?: unknown): void {\r\n const text = String(message ?? '');\r\n emitToast('success', text);\r\n}\r\n\r\nexport function showErrorToast(message?: unknown, _detail?: unknown): void {\r\n const text = String(message ?? '');\r\n emitToast('error', text);\r\n}\r\n\r\nfunction emitToast(kind: 'success' | 'error', message: string): void {\r\n if (typeof document === 'undefined') return;\r\n const existing = document.querySelector('.erp-table-toast');\r\n existing?.remove();\r\n const el = document.createElement('div');\r\n el.className = `erp-table-toast is-${kind}`;\r\n el.textContent = message;\r\n assignThemeVars(el);\r\n document.body.appendChild(el);\r\n window.setTimeout(() => el.remove(), 2800);\r\n}\r\n\r\n/** Host can wrap this if it wants toasts routed through its own UI. */\r\nexport function useHostToast() {\r\n const host = useERPTableHost();\r\n return {\r\n success: (message: string, detail?: unknown) => {\r\n if (host.onToast) host.onToast('success', message, detail);\r\n else showSuccessToast(message, detail);\r\n },\r\n error: (message: string, detail?: unknown) => {\r\n if (host.onToast) host.onToast('error', message, detail);\r\n else showErrorToast(message, detail);\r\n },\r\n };\r\n}\r\n","import { useEffect, useRef } from 'react';\r\n\r\nimport type { EventStore } from '../../application/ports/EventStore';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport {\r\n bindGridHostEvents,\r\n type GridHostEventHandlers,\r\n} from './bindGridHostEvents';\r\n\r\nexport type UseGridHostEventsInput<TRow = unknown> = GridHostEventHandlers<TRow> & {\r\n ready: boolean;\r\n controller: UITableController | null;\r\n eventStore: EventStore | null;\r\n tableKey: string;\r\n};\r\n\r\n/**\r\n * ERPTable wiring for PR-85. Handlers are read from a ref so EventStore\r\n * subscribeAll is not torn down when the host passes inline lambdas.\r\n */\r\nexport function useGridHostEvents<TRow = unknown>(\r\n input: UseGridHostEventsInput<TRow>,\r\n): void {\r\n const handlersRef = useRef<GridHostEventHandlers<TRow>>(input);\r\n handlersRef.current = input;\r\n\r\n useEffect(() => {\r\n if (!input.ready || !input.controller || !input.eventStore) return;\r\n return bindGridHostEvents<TRow>({\r\n eventStore: input.eventStore,\r\n controller: input.controller,\r\n tableKey: input.tableKey,\r\n handlers: {\r\n onCellValueChanged: (event) =>\r\n handlersRef.current.onCellValueChanged?.(event),\r\n onRowValueChanged: (event) =>\r\n handlersRef.current.onRowValueChanged?.(event),\r\n onRowDataUpdated: (event) =>\r\n handlersRef.current.onRowDataUpdated?.(event),\r\n onSelectionChanged: (event) =>\r\n handlersRef.current.onSelectionChanged?.(event),\r\n onCellFocused: (event) => handlersRef.current.onCellFocused?.(event),\r\n },\r\n });\r\n }, [input.ready, input.controller, input.eventStore, input.tableKey]);\r\n}\r\n"]}