persian-data-grid 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/OFL.txt +93 -0
  2. package/README.md +179 -22
  3. package/dist/ERPTableGroupRow-J5Z2LRC5.cjs +131 -0
  4. package/dist/ERPTableGroupRow-J5Z2LRC5.cjs.map +1 -0
  5. package/dist/ERPTableGroupRow-PSAPAHGL.js +125 -0
  6. package/dist/ERPTableGroupRow-PSAPAHGL.js.map +1 -0
  7. package/dist/GridPlugin-CJCaYnlw.d.ts +57 -0
  8. package/dist/GridPlugin-oxhq8AsM.d.cts +57 -0
  9. package/dist/GridPresenceService-GEH6535Q.js +3 -0
  10. package/dist/GridPresenceService-GEH6535Q.js.map +1 -0
  11. package/dist/GridPresenceService-RDN5FXHQ.cjs +12 -0
  12. package/dist/GridPresenceService-RDN5FXHQ.cjs.map +1 -0
  13. package/dist/GridSession-B-9lLcoB.d.cts +2492 -0
  14. package/dist/GridSession-Bc7UIawO.d.ts +2492 -0
  15. package/dist/GridSyncService-KTLB4KP3.js +3 -0
  16. package/dist/GridSyncService-KTLB4KP3.js.map +1 -0
  17. package/dist/GridSyncService-TAPAHABV.cjs +12 -0
  18. package/dist/GridSyncService-TAPAHABV.cjs.map +1 -0
  19. package/dist/PdfRenderer-1HFh6UeR.d.ts +22 -0
  20. package/dist/PdfRenderer-CBg7hWNS.d.cts +22 -0
  21. package/dist/RemoteApi-CCQxiSf1.d.cts +28 -0
  22. package/dist/RemoteApi-CCQxiSf1.d.ts +28 -0
  23. package/dist/SelectImpl-NM4O4IGW.js +447 -0
  24. package/dist/SelectImpl-NM4O4IGW.js.map +1 -0
  25. package/dist/SelectImpl-W2EI4T7O.cjs +453 -0
  26. package/dist/SelectImpl-W2EI4T7O.cjs.map +1 -0
  27. package/dist/UITableController-Cuwq481K.d.cts +632 -0
  28. package/dist/UITableController-DU8RopUM.d.ts +632 -0
  29. package/dist/VazirmatnPdfRenderer-BCMpC1zy.d.cts +96 -0
  30. package/dist/VazirmatnPdfRenderer-Dz_G-m3c.d.ts +96 -0
  31. package/dist/adapters/arian-erp.cjs +77 -0
  32. package/dist/adapters/arian-erp.cjs.map +1 -0
  33. package/dist/adapters/arian-erp.d.cts +60 -0
  34. package/dist/adapters/arian-erp.d.ts +60 -0
  35. package/dist/adapters/arian-erp.js +71 -0
  36. package/dist/adapters/arian-erp.js.map +1 -0
  37. package/dist/appendAtEnd-RHIQRG2W.cjs +35 -0
  38. package/dist/appendAtEnd-RHIQRG2W.cjs.map +1 -0
  39. package/dist/appendAtEnd-TJEABLGD.js +33 -0
  40. package/dist/appendAtEnd-TJEABLGD.js.map +1 -0
  41. package/dist/applyImportedRows-BO6yxoAN.d.cts +135 -0
  42. package/dist/applyImportedRows-D4zVY8uD.d.ts +135 -0
  43. package/dist/applyRowVisibilityHandler-KS6TMCBN.js +83 -0
  44. package/dist/applyRowVisibilityHandler-KS6TMCBN.js.map +1 -0
  45. package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs +85 -0
  46. package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs.map +1 -0
  47. package/dist/broadcastChannelTransport-FHUMV76O.cjs +12 -0
  48. package/dist/broadcastChannelTransport-FHUMV76O.cjs.map +1 -0
  49. package/dist/broadcastChannelTransport-MIH53VNZ.js +3 -0
  50. package/dist/broadcastChannelTransport-MIH53VNZ.js.map +1 -0
  51. package/dist/callbackRemoteApi-BlXO5NJz.d.ts +30 -0
  52. package/dist/callbackRemoteApi-DgnXH-i0.d.cts +30 -0
  53. package/dist/cellRenderContext-DB7V_mlu.d.ts +42 -0
  54. package/dist/cellRenderContext-DG5BOlxK.d.cts +42 -0
  55. package/dist/chunk-2BJCRYOS.cjs +936 -0
  56. package/dist/chunk-2BJCRYOS.cjs.map +1 -0
  57. package/dist/chunk-3Y3KKGEC.js +3 -0
  58. package/dist/chunk-3Y3KKGEC.js.map +1 -0
  59. package/dist/chunk-5ALMNLUR.cjs +1408 -0
  60. package/dist/chunk-5ALMNLUR.cjs.map +1 -0
  61. package/dist/chunk-5HKVMPBD.js +937 -0
  62. package/dist/chunk-5HKVMPBD.js.map +1 -0
  63. package/dist/chunk-633KP74Z.js +189 -0
  64. package/dist/chunk-633KP74Z.js.map +1 -0
  65. package/dist/chunk-6XBXZPBW.js +298 -0
  66. package/dist/chunk-6XBXZPBW.js.map +1 -0
  67. package/dist/chunk-77UXAJII.js +112 -0
  68. package/dist/chunk-77UXAJII.js.map +1 -0
  69. package/dist/chunk-ASPTRYRD.cjs +21 -0
  70. package/dist/chunk-ASPTRYRD.cjs.map +1 -0
  71. package/dist/chunk-AU3RDJYQ.js +243 -0
  72. package/dist/chunk-AU3RDJYQ.js.map +1 -0
  73. package/dist/chunk-BHDRUZH5.cjs +33 -0
  74. package/dist/chunk-BHDRUZH5.cjs.map +1 -0
  75. package/dist/chunk-BLYVOV3G.cjs +191 -0
  76. package/dist/chunk-BLYVOV3G.cjs.map +1 -0
  77. package/dist/chunk-CILNIWYW.cjs +100 -0
  78. package/dist/chunk-CILNIWYW.cjs.map +1 -0
  79. package/dist/chunk-DFFP7SJ6.cjs +257 -0
  80. package/dist/chunk-DFFP7SJ6.cjs.map +1 -0
  81. package/dist/chunk-DXRCYW42.cjs +568 -0
  82. package/dist/chunk-DXRCYW42.cjs.map +1 -0
  83. package/dist/chunk-EBV6HGZB.cjs +33 -0
  84. package/dist/chunk-EBV6HGZB.cjs.map +1 -0
  85. package/dist/chunk-EHHHC5JV.js +832 -0
  86. package/dist/chunk-EHHHC5JV.js.map +1 -0
  87. package/dist/chunk-F4PYOYHR.js +112 -0
  88. package/dist/chunk-F4PYOYHR.js.map +1 -0
  89. package/dist/chunk-GQEDLUMB.js +168 -0
  90. package/dist/chunk-GQEDLUMB.js.map +1 -0
  91. package/dist/chunk-H2LESGMX.cjs +319 -0
  92. package/dist/chunk-H2LESGMX.cjs.map +1 -0
  93. package/dist/chunk-HTNJT2QU.js +11674 -0
  94. package/dist/chunk-HTNJT2QU.js.map +1 -0
  95. package/dist/chunk-IIISFUW4.cjs +11786 -0
  96. package/dist/chunk-IIISFUW4.cjs.map +1 -0
  97. package/dist/chunk-IMPCRWYP.cjs +251 -0
  98. package/dist/chunk-IMPCRWYP.cjs.map +1 -0
  99. package/dist/chunk-IPPIXOVQ.js +317 -0
  100. package/dist/chunk-IPPIXOVQ.js.map +1 -0
  101. package/dist/chunk-J4XJ4UBC.js +1404 -0
  102. package/dist/chunk-J4XJ4UBC.js.map +1 -0
  103. package/dist/chunk-J7CPPFXT.cjs +89 -0
  104. package/dist/chunk-J7CPPFXT.cjs.map +1 -0
  105. package/dist/chunk-JOICD47Q.cjs +41 -0
  106. package/dist/chunk-JOICD47Q.cjs.map +1 -0
  107. package/dist/chunk-KHMG6EI2.js +13 -0
  108. package/dist/chunk-KHMG6EI2.js.map +1 -0
  109. package/dist/chunk-KMRURD5J.cjs +15 -0
  110. package/dist/chunk-KMRURD5J.cjs.map +1 -0
  111. package/dist/chunk-KRJG3KMP.cjs +174 -0
  112. package/dist/chunk-KRJG3KMP.cjs.map +1 -0
  113. package/dist/chunk-KUBVDIF7.cjs +653 -0
  114. package/dist/chunk-KUBVDIF7.cjs.map +1 -0
  115. package/dist/chunk-KYAOSBQN.js +31 -0
  116. package/dist/chunk-KYAOSBQN.js.map +1 -0
  117. package/dist/chunk-LJ7LMEXO.js +36 -0
  118. package/dist/chunk-LJ7LMEXO.js.map +1 -0
  119. package/dist/chunk-MT3KLB2Q.cjs +944 -0
  120. package/dist/chunk-MT3KLB2Q.cjs.map +1 -0
  121. package/dist/chunk-MU3RY46O.js +932 -0
  122. package/dist/chunk-MU3RY46O.js.map +1 -0
  123. package/dist/chunk-MUQQKPWR.js +84 -0
  124. package/dist/chunk-MUQQKPWR.js.map +1 -0
  125. package/dist/chunk-N7SJTINL.cjs +4 -0
  126. package/dist/chunk-N7SJTINL.cjs.map +1 -0
  127. package/dist/chunk-NTV2UUAJ.cjs +149 -0
  128. package/dist/chunk-NTV2UUAJ.cjs.map +1 -0
  129. package/dist/chunk-PJQWHF6T.js +31 -0
  130. package/dist/chunk-PJQWHF6T.js.map +1 -0
  131. package/dist/chunk-PQY54EL5.js +248 -0
  132. package/dist/chunk-PQY54EL5.js.map +1 -0
  133. package/dist/chunk-PXCHPZTP.cjs +839 -0
  134. package/dist/chunk-PXCHPZTP.cjs.map +1 -0
  135. package/dist/chunk-Q7TBBUTX.cjs +110 -0
  136. package/dist/chunk-Q7TBBUTX.cjs.map +1 -0
  137. package/dist/chunk-QQMU44KJ.js +612 -0
  138. package/dist/chunk-QQMU44KJ.js.map +1 -0
  139. package/dist/chunk-QZN7R2WP.cjs +114 -0
  140. package/dist/chunk-QZN7R2WP.cjs.map +1 -0
  141. package/dist/chunk-RKVSJU46.js +35 -0
  142. package/dist/chunk-RKVSJU46.js.map +1 -0
  143. package/dist/chunk-RM6ZWNT3.js +561 -0
  144. package/dist/chunk-RM6ZWNT3.js.map +1 -0
  145. package/dist/chunk-SX4VQXAA.cjs +114 -0
  146. package/dist/chunk-SX4VQXAA.cjs.map +1 -0
  147. package/dist/chunk-SZ7BLAY3.js +92 -0
  148. package/dist/chunk-SZ7BLAY3.js.map +1 -0
  149. package/dist/chunk-TN4MG6FY.js +112 -0
  150. package/dist/chunk-TN4MG6FY.js.map +1 -0
  151. package/dist/chunk-UC7PHDM6.cjs +331 -0
  152. package/dist/chunk-UC7PHDM6.cjs.map +1 -0
  153. package/dist/chunk-UXVLYUUW.js +108 -0
  154. package/dist/chunk-UXVLYUUW.js.map +1 -0
  155. package/dist/chunk-VVGYRZ7S.cjs +38 -0
  156. package/dist/chunk-VVGYRZ7S.cjs.map +1 -0
  157. package/dist/chunk-W5256BJ4.js +56 -0
  158. package/dist/chunk-W5256BJ4.js.map +1 -0
  159. package/dist/chunk-WUMOSOEK.cjs +62 -0
  160. package/dist/chunk-WUMOSOEK.cjs.map +1 -0
  161. package/dist/chunk-XLRE2J25.js +140 -0
  162. package/dist/chunk-XLRE2J25.js.map +1 -0
  163. package/dist/chunk-Y6W5V2CI.js +19 -0
  164. package/dist/chunk-Y6W5V2CI.js.map +1 -0
  165. package/dist/chunk-Z4QPZ3Z3.cjs +114 -0
  166. package/dist/chunk-Z4QPZ3Z3.cjs.map +1 -0
  167. package/dist/createEngineGridQuery-Dmq3i5v3.d.cts +884 -0
  168. package/dist/createEngineGridQuery-Mt1hc33m.d.ts +884 -0
  169. package/dist/date-picker-jalali.cjs +263 -0
  170. package/dist/date-picker-jalali.cjs.map +1 -0
  171. package/dist/date-picker-jalali.d.cts +62 -0
  172. package/dist/date-picker-jalali.d.ts +62 -0
  173. package/dist/date-picker-jalali.js +256 -0
  174. package/dist/date-picker-jalali.js.map +1 -0
  175. package/dist/finance.cjs +205 -0
  176. package/dist/finance.cjs.map +1 -0
  177. package/dist/finance.d.cts +90 -0
  178. package/dist/finance.d.ts +90 -0
  179. package/dist/finance.js +157 -0
  180. package/dist/finance.js.map +1 -0
  181. package/dist/foldedColumn-IHDT4ARZ.cjs +66 -0
  182. package/dist/foldedColumn-IHDT4ARZ.cjs.map +1 -0
  183. package/dist/foldedColumn-TFURUKFG.js +64 -0
  184. package/dist/foldedColumn-TFURUKFG.js.map +1 -0
  185. package/dist/headless.cjs +729 -0
  186. package/dist/headless.cjs.map +1 -0
  187. package/dist/headless.d.cts +504 -0
  188. package/dist/headless.d.ts +504 -0
  189. package/dist/headless.js +226 -0
  190. package/dist/headless.js.map +1 -0
  191. package/dist/index-DN8M8Jkq.d.cts +14 -0
  192. package/dist/index-DmzL-F_o.d.ts +14 -0
  193. package/dist/index.cjs +8002 -11409
  194. package/dist/index.cjs.map +1 -1
  195. package/dist/index.d.cts +437 -2305
  196. package/dist/index.d.ts +437 -2305
  197. package/dist/index.js +7244 -11083
  198. package/dist/index.js.map +1 -1
  199. package/dist/locales/ar.cjs +12 -0
  200. package/dist/locales/ar.cjs.map +1 -0
  201. package/dist/locales/ar.d.cts +6 -0
  202. package/dist/locales/ar.d.ts +6 -0
  203. package/dist/locales/ar.js +3 -0
  204. package/dist/locales/ar.js.map +1 -0
  205. package/dist/locales/en.cjs +12 -0
  206. package/dist/locales/en.cjs.map +1 -0
  207. package/dist/locales/en.d.cts +6 -0
  208. package/dist/locales/en.d.ts +6 -0
  209. package/dist/locales/en.js +3 -0
  210. package/dist/locales/en.js.map +1 -0
  211. package/dist/locales/fa.cjs +12 -0
  212. package/dist/locales/fa.cjs.map +1 -0
  213. package/dist/locales/fa.d.cts +6 -0
  214. package/dist/locales/fa.d.ts +6 -0
  215. package/dist/locales/fa.js +3 -0
  216. package/dist/locales/fa.js.map +1 -0
  217. package/dist/locales/index.cjs +51 -0
  218. package/dist/locales/index.cjs.map +1 -0
  219. package/dist/locales/index.d.cts +5 -0
  220. package/dist/locales/index.d.ts +5 -0
  221. package/dist/locales/index.js +6 -0
  222. package/dist/locales/index.js.map +1 -0
  223. package/dist/memoryRecords-AWDKUJ2F.cjs +50 -0
  224. package/dist/memoryRecords-AWDKUJ2F.cjs.map +1 -0
  225. package/dist/memoryRecords-OJTGXLRH.js +47 -0
  226. package/dist/memoryRecords-OJTGXLRH.js.map +1 -0
  227. package/dist/pagedFooterTotals-DXCGDO6F.cjs +27 -0
  228. package/dist/pagedFooterTotals-DXCGDO6F.cjs.map +1 -0
  229. package/dist/pagedFooterTotals-ORWKUNE7.js +25 -0
  230. package/dist/pagedFooterTotals-ORWKUNE7.js.map +1 -0
  231. package/dist/pagedKit-MFGAJFSK.cjs +134 -0
  232. package/dist/pagedKit-MFGAJFSK.cjs.map +1 -0
  233. package/dist/pagedKit-WYWY4LRV.js +127 -0
  234. package/dist/pagedKit-WYWY4LRV.js.map +1 -0
  235. package/dist/pagedSearch-HCPJW7VM.js +38 -0
  236. package/dist/pagedSearch-HCPJW7VM.js.map +1 -0
  237. package/dist/pagedSearch-U3WCG4GN.cjs +42 -0
  238. package/dist/pagedSearch-U3WCG4GN.cjs.map +1 -0
  239. package/dist/plugins/csv.cjs +124 -0
  240. package/dist/plugins/csv.cjs.map +1 -0
  241. package/dist/plugins/csv.d.cts +44 -0
  242. package/dist/plugins/csv.d.ts +44 -0
  243. package/dist/plugins/csv.js +120 -0
  244. package/dist/plugins/csv.js.map +1 -0
  245. package/dist/plugins/excel.cjs +52 -0
  246. package/dist/plugins/excel.cjs.map +1 -0
  247. package/dist/plugins/excel.d.cts +14 -0
  248. package/dist/plugins/excel.d.ts +14 -0
  249. package/dist/plugins/excel.js +7 -0
  250. package/dist/plugins/excel.js.map +1 -0
  251. package/dist/plugins/pdf/fonts/vazirmatn.cjs +50 -0
  252. package/dist/plugins/pdf/fonts/vazirmatn.cjs.map +1 -0
  253. package/dist/plugins/pdf/fonts/vazirmatn.d.cts +24 -0
  254. package/dist/plugins/pdf/fonts/vazirmatn.d.ts +24 -0
  255. package/dist/plugins/pdf/fonts/vazirmatn.js +39 -0
  256. package/dist/plugins/pdf/fonts/vazirmatn.js.map +1 -0
  257. package/dist/plugins/pdf.cjs +24 -0
  258. package/dist/plugins/pdf.cjs.map +1 -0
  259. package/dist/plugins/pdf.d.cts +21 -0
  260. package/dist/plugins/pdf.d.ts +21 -0
  261. package/dist/plugins/pdf.js +7 -0
  262. package/dist/plugins/pdf.js.map +1 -0
  263. package/dist/presence.cjs +56 -0
  264. package/dist/presence.cjs.map +1 -0
  265. package/dist/presence.d.cts +17 -0
  266. package/dist/presence.d.ts +17 -0
  267. package/dist/presence.js +54 -0
  268. package/dist/presence.js.map +1 -0
  269. package/dist/rebuildRowVisibility-66EAZ356.cjs +21 -0
  270. package/dist/rebuildRowVisibility-66EAZ356.cjs.map +1 -0
  271. package/dist/rebuildRowVisibility-6TYM5BP2.js +19 -0
  272. package/dist/rebuildRowVisibility-6TYM5BP2.js.map +1 -0
  273. package/dist/styles.css +1440 -0
  274. package/dist/sync.cjs +148 -0
  275. package/dist/sync.cjs.map +1 -0
  276. package/dist/sync.d.cts +17 -0
  277. package/dist/sync.d.ts +17 -0
  278. package/dist/sync.js +146 -0
  279. package/dist/sync.js.map +1 -0
  280. package/dist/types-D__47BKv.d.cts +23 -0
  281. package/dist/types-D__47BKv.d.ts +23 -0
  282. package/package.json +184 -28
@@ -0,0 +1,298 @@
1
+ import { isIndexColumn, resolveColumnPinned, computeLayoutColumnWidths, partitionColumnsByPin, sumColumnWidths, ViewportCalculator, resolveColumnWidth } from './chunk-IPPIXOVQ.js';
2
+ import { useDirection } from './chunk-QQMU44KJ.js';
3
+ import React2, { createContext, useState, useMemo, useEffect, useContext } from 'react';
4
+ import { jsx, Fragment } from 'react/jsx-runtime';
5
+
6
+ // ui/a11y/gridRoles.ts
7
+ var ARIA_HEADER_ROW_INDEX = 1;
8
+ function ariaColIndex(visibleIndex) {
9
+ return visibleIndex + 1;
10
+ }
11
+ function ariaDataRowIndex(absoluteIndex, pinnedTopCount = 0) {
12
+ return absoluteIndex + 2 + pinnedTopCount;
13
+ }
14
+ function ariaPinnedTopRowIndex(indexInPinned) {
15
+ return indexInPinned + 2;
16
+ }
17
+ function ariaPinnedBottomRowIndex(indexInPinned, dataRowCount, pinnedTopCount = 0) {
18
+ return pinnedTopCount + dataRowCount + 2 + indexInPinned;
19
+ }
20
+ function ariaFooterRowIndex(dataRowCount, pinnedTopCount = 0, pinnedBottomCount = 0) {
21
+ return dataRowCount + pinnedTopCount + pinnedBottomCount + 2;
22
+ }
23
+ function ariaGridRowCount(dataRowCount, hasFooter, pinnedTopCount = 0, pinnedBottomCount = 0) {
24
+ const footerRows = typeof hasFooter === "number" ? hasFooter : hasFooter ? 1 : 0;
25
+ return 1 + pinnedTopCount + dataRowCount + pinnedBottomCount + footerRows;
26
+ }
27
+ function ariaToken(value) {
28
+ return value.replace(/[^A-Za-z0-9_-]/g, "_");
29
+ }
30
+ function gridCellDomId(tableKey, rowId, columnId) {
31
+ return `erp-cell-${ariaToken(tableKey)}-${rowId}-${ariaToken(columnId)}`;
32
+ }
33
+ function isAriaSelectedCell(active, rowId, columnId) {
34
+ return !!active && active.rowId === rowId && active.columnId === columnId;
35
+ }
36
+ function gridCellA11y(tableKey, rowId, columnId, active) {
37
+ return {
38
+ id: gridCellDomId(tableKey, rowId, columnId),
39
+ "aria-selected": isAriaSelectedCell(active, rowId, columnId)
40
+ };
41
+ }
42
+
43
+ // ui/columnPin.ts
44
+ function columnPinSide(column) {
45
+ const pin = resolveColumnPinned(column);
46
+ if (pin === "start" || pin === "end") return pin;
47
+ return null;
48
+ }
49
+ function columnPinClassName(column) {
50
+ if (isIndexColumn(column)) return "erp-col-pin-start erp-col-pin-index";
51
+ const side = columnPinSide(column);
52
+ if (side === "start") return "erp-col-pin-start";
53
+ if (side === "end") return "erp-col-pin-end";
54
+ return "";
55
+ }
56
+ function indexPinClassName(column) {
57
+ return columnPinClassName(column);
58
+ }
59
+ function columnPinDataAttr(column) {
60
+ if (isIndexColumn(column)) return "index";
61
+ return columnPinSide(column) ?? void 0;
62
+ }
63
+ function indexPinDataAttr(column) {
64
+ const attr = columnPinDataAttr(column);
65
+ return attr === "index" ? "index" : void 0;
66
+ }
67
+ function columnPinStyle(column, startOffsets, endOffsets) {
68
+ const side = columnPinSide(column);
69
+ if (side === "start") {
70
+ const offset = startOffsets[column.fieldName];
71
+ if (offset === void 0) return void 0;
72
+ return { insetInlineStart: offset };
73
+ }
74
+ if (side === "end") {
75
+ const offset = endOffsets[column.fieldName];
76
+ if (offset === void 0) return void 0;
77
+ return { insetInlineEnd: offset };
78
+ }
79
+ return void 0;
80
+ }
81
+ function columnPinCellProps(column, startOffsets, endOffsets) {
82
+ return {
83
+ className: columnPinClassName(column),
84
+ "data-erp-col-pin": columnPinDataAttr(column),
85
+ style: columnPinStyle(column, startOffsets, endOffsets)
86
+ };
87
+ }
88
+ var EMPTY = {
89
+ allVisible: [],
90
+ pinnedStart: [],
91
+ pinned: [],
92
+ pinnedEnd: [],
93
+ scrollable: [],
94
+ scrollableAbsIndices: [],
95
+ spacerStart: 0,
96
+ spacerEnd: 0,
97
+ pinnedStartWidth: 0,
98
+ pinnedWidth: 0,
99
+ pinnedEndWidth: 0,
100
+ startPinOffsets: {},
101
+ endPinOffsets: {},
102
+ totalWidth: 0,
103
+ layoutWidths: {},
104
+ mountedScrollableCount: 0
105
+ };
106
+ var ColumnWindowContext = createContext(EMPTY);
107
+ function scrollOffsetFromInlineStart(el, direction) {
108
+ const { scrollLeft, scrollWidth, clientWidth } = el;
109
+ if (direction === "ltr") return Math.max(0, scrollLeft);
110
+ if (scrollLeft < 0) return Math.max(0, -scrollLeft);
111
+ const max = Math.max(0, scrollWidth - clientWidth);
112
+ return Math.max(0, max - scrollLeft);
113
+ }
114
+ function buildColumnWindowModel(allVisible, columnWidths, scrollOffset, viewportSize, overscan = 1, flexContainerWidth = viewportSize) {
115
+ const layoutWidths = computeLayoutColumnWidths(
116
+ allVisible,
117
+ columnWidths,
118
+ flexContainerWidth
119
+ );
120
+ const widthOf = (col) => layoutWidths[col.fieldName] ?? resolveColumnWidth(col, columnWidths);
121
+ const { pinnedStart, scrollable: scrollableAll, pinnedEnd, scrollableAbs } = partitionColumnsByPin(allVisible);
122
+ const pinnedStartWidth = sumColumnWidths(pinnedStart, widthOf);
123
+ const pinnedEndWidth = sumColumnWidths(pinnedEnd, widthOf);
124
+ const scrollableWidths = scrollableAll.map(widthOf);
125
+ const range = ViewportCalculator.calculateColumns(
126
+ scrollableWidths,
127
+ scrollOffset,
128
+ viewportSize,
129
+ pinnedStartWidth,
130
+ overscan,
131
+ pinnedEndWidth
132
+ );
133
+ const scrollable = scrollableAll.slice(range.startIndex, range.endIndex);
134
+ const scrollableAbsIndices = scrollableAbs.slice(
135
+ range.startIndex,
136
+ range.endIndex
137
+ );
138
+ const totalScrollable = range.totalScrollableWidth;
139
+ const spacerCells = (range.spacerStart > 0 ? 1 : 0) + (range.spacerEnd > 0 ? 1 : 0);
140
+ let startCursor = 0;
141
+ const startPinOffsets = {};
142
+ for (const col of pinnedStart) {
143
+ startPinOffsets[col.fieldName] = startCursor;
144
+ startCursor += widthOf(col);
145
+ }
146
+ let endCursor = 0;
147
+ const endPinOffsets = {};
148
+ for (let i = pinnedEnd.length - 1; i >= 0; i -= 1) {
149
+ const col = pinnedEnd[i];
150
+ endPinOffsets[col.fieldName] = endCursor;
151
+ endCursor += widthOf(col);
152
+ }
153
+ return {
154
+ allVisible,
155
+ pinnedStart,
156
+ pinned: pinnedStart,
157
+ pinnedEnd,
158
+ scrollable,
159
+ scrollableAbsIndices,
160
+ spacerStart: range.spacerStart,
161
+ spacerEnd: range.spacerEnd,
162
+ pinnedStartWidth,
163
+ pinnedWidth: pinnedStartWidth,
164
+ pinnedEndWidth,
165
+ startPinOffsets,
166
+ endPinOffsets,
167
+ totalWidth: pinnedStartWidth + totalScrollable + pinnedEndWidth,
168
+ layoutWidths,
169
+ mountedScrollableCount: scrollable.length + spacerCells
170
+ };
171
+ }
172
+ function ColumnWindowProvider({
173
+ scrollRef,
174
+ columns,
175
+ columnWidths,
176
+ overscan = 1,
177
+ onViewportWidthChange,
178
+ children
179
+ }) {
180
+ const direction = useDirection();
181
+ const [scrollOffset, setScrollOffset] = useState(0);
182
+ const [viewportSize, setViewportSize] = useState(1024);
183
+ const allVisible = useMemo(
184
+ () => columns.filter((c) => !c.hidden),
185
+ [columns]
186
+ );
187
+ useEffect(() => {
188
+ const el = scrollRef.current;
189
+ if (!el) return;
190
+ const update = () => {
191
+ setScrollOffset(scrollOffsetFromInlineStart(el, direction));
192
+ const w = el.clientWidth || 1024;
193
+ setViewportSize(w);
194
+ onViewportWidthChange?.(w);
195
+ };
196
+ update();
197
+ el.addEventListener("scroll", update, { passive: true });
198
+ const ro = typeof ResizeObserver !== "undefined" ? new ResizeObserver(() => update()) : null;
199
+ ro?.observe(el);
200
+ return () => {
201
+ el.removeEventListener("scroll", update);
202
+ ro?.disconnect();
203
+ };
204
+ }, [scrollRef, direction, allVisible.length, columnWidths, onViewportWidthChange]);
205
+ const value = useMemo(
206
+ () => buildColumnWindowModel(
207
+ allVisible,
208
+ columnWidths,
209
+ scrollOffset,
210
+ viewportSize,
211
+ overscan
212
+ ),
213
+ [allVisible, columnWidths, scrollOffset, viewportSize, overscan]
214
+ );
215
+ return /* @__PURE__ */ jsx(ColumnWindowContext.Provider, { value, children });
216
+ }
217
+ function useColumnWindowOrAll(columns, columnWidths) {
218
+ const ctx = useContext(ColumnWindowContext);
219
+ const allVisible = columns.filter((c) => !c.hidden);
220
+ if (ctx.allVisible.length > 0) return ctx;
221
+ return buildColumnWindowModel(allVisible, columnWidths, 0, 1e9, 0, 0);
222
+ }
223
+ function renderPinnedColumns(cols, model, renderColumn, keyPrefix) {
224
+ const nodes = [];
225
+ for (const col of cols) {
226
+ const abs = model.allVisible.findIndex((c) => c.fieldName === col.fieldName);
227
+ nodes.push(
228
+ /* @__PURE__ */ jsx(React2.Fragment, { children: renderColumn(col, abs >= 0 ? abs : 0) }, `${keyPrefix}-${col.fieldName}`)
229
+ );
230
+ }
231
+ return nodes;
232
+ }
233
+ function ColumnWindowCells({
234
+ window: model,
235
+ renderColumn,
236
+ spacerElement: Spacer,
237
+ spacerRole = "presentation",
238
+ spacerStyle
239
+ }) {
240
+ const nodes = [];
241
+ nodes.push(
242
+ ...renderPinnedColumns(model.pinnedStart, model, renderColumn, "pin-start")
243
+ );
244
+ if (model.spacerStart > 0) {
245
+ nodes.push(
246
+ /* @__PURE__ */ jsx(
247
+ Spacer,
248
+ {
249
+ "aria-hidden": true,
250
+ role: spacerRole,
251
+ "data-pdg-col-spacer": "start",
252
+ style: {
253
+ width: model.spacerStart,
254
+ minWidth: model.spacerStart,
255
+ padding: 0,
256
+ border: "none",
257
+ ...spacerStyle
258
+ }
259
+ },
260
+ "pdg-col-spacer-start"
261
+ )
262
+ );
263
+ }
264
+ model.scrollable.forEach((col, i) => {
265
+ const abs = model.scrollableAbsIndices[i] ?? i;
266
+ nodes.push(
267
+ /* @__PURE__ */ jsx(React2.Fragment, { children: renderColumn(col, abs) }, `scr-${col.fieldName}`)
268
+ );
269
+ });
270
+ if (model.spacerEnd > 0) {
271
+ nodes.push(
272
+ /* @__PURE__ */ jsx(
273
+ Spacer,
274
+ {
275
+ "aria-hidden": true,
276
+ role: spacerRole,
277
+ "data-pdg-col-spacer": "end",
278
+ style: {
279
+ width: model.spacerEnd,
280
+ minWidth: model.spacerEnd,
281
+ padding: 0,
282
+ border: "none",
283
+ ...spacerStyle
284
+ }
285
+ },
286
+ "pdg-col-spacer-end"
287
+ )
288
+ );
289
+ }
290
+ nodes.push(
291
+ ...renderPinnedColumns(model.pinnedEnd, model, renderColumn, "pin-end")
292
+ );
293
+ return /* @__PURE__ */ jsx(Fragment, { children: nodes });
294
+ }
295
+
296
+ export { ARIA_HEADER_ROW_INDEX, ColumnWindowCells, ColumnWindowProvider, ariaColIndex, ariaDataRowIndex, ariaFooterRowIndex, ariaGridRowCount, ariaPinnedBottomRowIndex, ariaPinnedTopRowIndex, columnPinCellProps, columnPinClassName, gridCellA11y, gridCellDomId, indexPinClassName, indexPinDataAttr, useColumnWindowOrAll };
297
+ //# sourceMappingURL=chunk-6XBXZPBW.js.map
298
+ //# sourceMappingURL=chunk-6XBXZPBW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../ui/a11y/gridRoles.ts","../ui/columnPin.ts","../ui/virtual/columnWindow.tsx","../ui/virtual/ColumnWindowCells.tsx"],"names":["jsx","React"],"mappings":"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","file":"chunk-6XBXZPBW.js","sourcesContent":["/** Header occupies ARIA row 1. Data rows start at 2 (or after pinned top). */\r\nexport const ARIA_HEADER_ROW_INDEX = 1;\r\n\r\n/** 1-based `aria-colindex` from 0-based visible column order. */\r\nexport function ariaColIndex(visibleIndex: number): number {\r\n return visibleIndex + 1;\r\n}\r\n\r\n/**\r\n * 1-based `aria-rowindex` for a data row.\r\n * `absoluteIndex` is 0-based in the full collection (not the mounted DOM window).\r\n * `pinnedTopCount` shifts indices when pinned-top rows occupy slots after the header (PR-116).\r\n */\r\nexport function ariaDataRowIndex(\r\n absoluteIndex: number,\r\n pinnedTopCount = 0,\r\n): number {\r\n return absoluteIndex + 2 + pinnedTopCount;\r\n}\r\n\r\n/** Pinned-top rows sit immediately after the header (PR-116). */\r\nexport function ariaPinnedTopRowIndex(indexInPinned: number): number {\r\n return indexInPinned + 2;\r\n}\r\n\r\n/** Pinned-bottom rows sit after all data rows (PR-116). */\r\nexport function ariaPinnedBottomRowIndex(\r\n indexInPinned: number,\r\n dataRowCount: number,\r\n pinnedTopCount = 0,\r\n): number {\r\n return pinnedTopCount + dataRowCount + 2 + indexInPinned;\r\n}\r\n\r\nexport function ariaFooterRowIndex(\r\n dataRowCount: number,\r\n pinnedTopCount = 0,\r\n pinnedBottomCount = 0,\r\n): number {\r\n return dataRowCount + pinnedTopCount + pinnedBottomCount + 2;\r\n}\r\n\r\nexport function ariaGridRowCount(\r\n dataRowCount: number,\r\n hasFooter: boolean | number,\r\n pinnedTopCount = 0,\r\n pinnedBottomCount = 0,\r\n): number {\r\n const footerRows =\r\n typeof hasFooter === 'number' ? hasFooter : hasFooter ? 1 : 0;\r\n return (\r\n 1 +\r\n pinnedTopCount +\r\n dataRowCount +\r\n pinnedBottomCount +\r\n footerRows\r\n );\r\n}\r\n\r\nfunction ariaToken(value: string): string {\r\n return value.replace(/[^A-Za-z0-9_-]/g, '_');\r\n}\r\n\r\n/** Stable DOM id for `aria-activedescendant` on the grid. */\r\nexport function gridCellDomId(\r\n tableKey: string,\r\n rowId: number,\r\n columnId: string,\r\n): string {\r\n return `erp-cell-${ariaToken(tableKey)}-${rowId}-${ariaToken(columnId)}`;\r\n}\r\n\r\nexport function isAriaSelectedCell(\r\n active: { rowId: number; columnId: string } | null | undefined,\r\n rowId: number,\r\n columnId: string,\r\n): boolean {\r\n return !!active && active.rowId === rowId && active.columnId === columnId;\r\n}\r\n\r\nexport function gridCellA11y(\r\n tableKey: string,\r\n rowId: number,\r\n columnId: string,\r\n active: { rowId: number; columnId: string } | null | undefined,\r\n): { id: string; 'aria-selected': boolean } {\r\n return {\r\n id: gridCellDomId(tableKey, rowId, columnId),\r\n 'aria-selected': isAriaSelectedCell(active, rowId, columnId),\r\n };\r\n}\r\n","import type { CSSProperties } from 'react';\r\n\r\nimport type { ColumnSchema } from '../bootstrap/type';\r\nimport {\r\n computeEndPinOffsets,\r\n computePinOffsets,\r\n resolveColumnPinned,\r\n type ColumnPinSide,\r\n} from '../engine/dataOps/columnPin';\r\nimport { isIndexColumn, type ColumnWidthHint } from '../engine/columnWidth';\r\n\r\n/** D19: any column may pin; index always pins at inline-start. */\r\nexport function columnPinSide(column: ColumnSchema): ColumnPinSide | null {\r\n const pin = resolveColumnPinned(column);\r\n if (pin === 'start' || pin === 'end') return pin;\r\n return null;\r\n}\r\n\r\nexport function columnPinClassName(column: ColumnWidthHint): string {\r\n if (isIndexColumn(column)) return 'erp-col-pin-start erp-col-pin-index';\r\n const side = columnPinSide(column as ColumnSchema);\r\n if (side === 'start') return 'erp-col-pin-start';\r\n if (side === 'end') return 'erp-col-pin-end';\r\n return '';\r\n}\r\n\r\n/** @deprecated Use `columnPinDataAttr` — kept for existing DOM hooks. */\r\nexport function indexPinClassName(column: ColumnWidthHint): string {\r\n return columnPinClassName(column);\r\n}\r\n\r\nexport function columnPinDataAttr(\r\n column: ColumnWidthHint,\r\n): ColumnPinSide | 'index' | undefined {\r\n if (isIndexColumn(column)) return 'index';\r\n return columnPinSide(column as ColumnSchema) ?? undefined;\r\n}\r\n\r\n/** @deprecated Use `columnPinDataAttr`. */\r\nexport function indexPinDataAttr(\r\n column: ColumnWidthHint,\r\n): 'index' | undefined {\r\n const attr = columnPinDataAttr(column);\r\n return attr === 'index' ? 'index' : undefined;\r\n}\r\n\r\nexport function columnPinStyle(\r\n column: ColumnSchema,\r\n startOffsets: Record<string, number>,\r\n endOffsets: Record<string, number>,\r\n): CSSProperties | undefined {\r\n const side = columnPinSide(column);\r\n if (side === 'start') {\r\n const offset = startOffsets[column.fieldName];\r\n if (offset === undefined) return undefined;\r\n return { insetInlineStart: offset };\r\n }\r\n if (side === 'end') {\r\n const offset = endOffsets[column.fieldName];\r\n if (offset === undefined) return undefined;\r\n return { insetInlineEnd: offset };\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function columnPinCellProps(\r\n column: ColumnSchema,\r\n startOffsets: Record<string, number>,\r\n endOffsets: Record<string, number>,\r\n): {\r\n className: string;\r\n 'data-erp-col-pin': ReturnType<typeof columnPinDataAttr>;\r\n style: CSSProperties | undefined;\r\n} {\r\n return {\r\n className: columnPinClassName(column),\r\n 'data-erp-col-pin': columnPinDataAttr(column),\r\n style: columnPinStyle(column, startOffsets, endOffsets),\r\n };\r\n}\r\n\r\nexport function buildPinOffsetMaps(\r\n pinnedStart: readonly ColumnSchema[],\r\n pinnedEnd: readonly ColumnSchema[],\r\n resolveWidth: (col: ColumnSchema) => number,\r\n): {\r\n startOffsets: Record<string, number>;\r\n endOffsets: Record<string, number>;\r\n} {\r\n return {\r\n startOffsets: computePinOffsets(pinnedStart, resolveWidth),\r\n endOffsets: computeEndPinOffsets(pinnedEnd, resolveWidth),\r\n };\r\n}\r\n","\"use client\";\r\n\r\n\r\n\r\nimport React, {\r\n\r\n createContext,\r\n\r\n useContext,\r\n\r\n useEffect,\r\n\r\n useMemo,\r\n\r\n useState,\r\n\r\n type ReactNode,\r\n\r\n type RefObject,\r\n\r\n} from 'react';\r\n\r\n\r\n\r\nimport type { ColumnSchema } from '../../bootstrap/type';\r\n\r\nimport { partitionColumnsByPin, sumColumnWidths } from '../../engine/dataOps/columnPin';\r\nimport { computeLayoutColumnWidths } from '../../engine/dataOps/columnLayout';\r\nimport { resolveColumnWidth } from '../../engine/columnWidth';\r\n\r\nimport { ViewportCalculator } from '../../engine/ViewportCalculator';\r\n\r\nimport { useDirection } from '../host';\r\n\r\n\r\n\r\nexport type ColumnWindowModel = {\r\n\r\n /** Full non-hidden column list (document order). */\r\n\r\n allVisible: ColumnSchema[];\r\n\r\n /** Inline-start pinned columns (includes index). */\r\n\r\n pinnedStart: ColumnSchema[];\r\n\r\n /** @deprecated alias for pinnedStart */\r\n\r\n pinned: ColumnSchema[];\r\n\r\n pinnedEnd: ColumnSchema[];\r\n\r\n /** Visible scrollable slice only. */\r\n\r\n scrollable: ColumnSchema[];\r\n\r\n /** Absolute indices into `allVisible` for scrollable slice entries. */\r\n\r\n scrollableAbsIndices: number[];\r\n\r\n spacerStart: number;\r\n\r\n spacerEnd: number;\r\n\r\n pinnedStartWidth: number;\r\n\r\n /** @deprecated alias for pinnedStartWidth */\r\n\r\n pinnedWidth: number;\r\n\r\n pinnedEndWidth: number;\r\n\r\n startPinOffsets: Record<string, number>;\r\n\r\n endPinOffsets: Record<string, number>;\r\n\r\n totalWidth: number;\r\n\r\n /** Effective widths after flex distribution (PR-112). */\r\n layoutWidths: Record<string, number>;\r\n\r\n /** Number of `<th>` / data cells that should mount (pins + slice + spacers). */\r\n\r\n mountedScrollableCount: number;\r\n\r\n};\r\n\r\n\r\n\r\nconst EMPTY: ColumnWindowModel = {\r\n\r\n allVisible: [],\r\n\r\n pinnedStart: [],\r\n\r\n pinned: [],\r\n\r\n pinnedEnd: [],\r\n\r\n scrollable: [],\r\n\r\n scrollableAbsIndices: [],\r\n\r\n spacerStart: 0,\r\n\r\n spacerEnd: 0,\r\n\r\n pinnedStartWidth: 0,\r\n\r\n pinnedWidth: 0,\r\n\r\n pinnedEndWidth: 0,\r\n\r\n startPinOffsets: {},\r\n\r\n endPinOffsets: {},\r\n\r\n totalWidth: 0,\r\n\r\n layoutWidths: {},\r\n\r\n mountedScrollableCount: 0,\r\n\r\n};\r\n\r\n\r\n\r\nconst ColumnWindowContext = createContext<ColumnWindowModel>(EMPTY);\r\n\r\n\r\n\r\n/** Normalize scroll position to distance from inline-start (px ≥ 0). */\r\n\r\nexport function scrollOffsetFromInlineStart(\r\n\r\n el: HTMLElement,\r\n\r\n direction: 'rtl' | 'ltr',\r\n\r\n): number {\r\n\r\n const { scrollLeft, scrollWidth, clientWidth } = el;\r\n\r\n if (direction === 'ltr') return Math.max(0, scrollLeft);\r\n\r\n if (scrollLeft < 0) return Math.max(0, -scrollLeft);\r\n\r\n const max = Math.max(0, scrollWidth - clientWidth);\r\n\r\n return Math.max(0, max - scrollLeft);\r\n\r\n}\r\n\r\n\r\n\r\nexport function buildColumnWindowModel(\r\n\r\n allVisible: ColumnSchema[],\r\n\r\n columnWidths: Record<string, number> | undefined,\r\n\r\n scrollOffset: number,\r\n\r\n viewportSize: number,\r\n\r\n overscan = 1,\r\n\r\n flexContainerWidth = viewportSize,\r\n\r\n): ColumnWindowModel {\r\n\r\n const layoutWidths = computeLayoutColumnWidths(\r\n allVisible,\r\n columnWidths,\r\n flexContainerWidth,\r\n );\r\n\r\n const widthOf = (col: ColumnSchema) =>\r\n layoutWidths[col.fieldName] ?? resolveColumnWidth(col, columnWidths);\r\n\r\n\r\n\r\n const { pinnedStart, scrollable: scrollableAll, pinnedEnd, scrollableAbs } =\r\n\r\n partitionColumnsByPin(allVisible);\r\n\r\n\r\n\r\n const pinnedStartWidth = sumColumnWidths(pinnedStart, widthOf);\r\n\r\n const pinnedEndWidth = sumColumnWidths(pinnedEnd, widthOf);\r\n\r\n\r\n\r\n const scrollableWidths = scrollableAll.map(widthOf);\r\n\r\n const range = ViewportCalculator.calculateColumns(\r\n\r\n scrollableWidths,\r\n\r\n scrollOffset,\r\n\r\n viewportSize,\r\n\r\n pinnedStartWidth,\r\n\r\n overscan,\r\n\r\n pinnedEndWidth,\r\n\r\n );\r\n\r\n const scrollable = scrollableAll.slice(range.startIndex, range.endIndex);\r\n\r\n const scrollableAbsIndices = scrollableAbs.slice(\r\n\r\n range.startIndex,\r\n\r\n range.endIndex,\r\n\r\n );\r\n\r\n const totalScrollable = range.totalScrollableWidth;\r\n\r\n const spacerCells =\r\n\r\n (range.spacerStart > 0 ? 1 : 0) + (range.spacerEnd > 0 ? 1 : 0);\r\n\r\n\r\n\r\n let startCursor = 0;\r\n\r\n const startPinOffsets: Record<string, number> = {};\r\n\r\n for (const col of pinnedStart) {\r\n\r\n startPinOffsets[col.fieldName] = startCursor;\r\n\r\n startCursor += widthOf(col);\r\n\r\n }\r\n\r\n\r\n\r\n let endCursor = 0;\r\n\r\n const endPinOffsets: Record<string, number> = {};\r\n\r\n for (let i = pinnedEnd.length - 1; i >= 0; i -= 1) {\r\n\r\n const col = pinnedEnd[i]!;\r\n\r\n endPinOffsets[col.fieldName] = endCursor;\r\n\r\n endCursor += widthOf(col);\r\n\r\n }\r\n\r\n\r\n\r\n return {\r\n\r\n allVisible,\r\n\r\n pinnedStart,\r\n\r\n pinned: pinnedStart,\r\n\r\n pinnedEnd,\r\n\r\n scrollable,\r\n\r\n scrollableAbsIndices,\r\n\r\n spacerStart: range.spacerStart,\r\n\r\n spacerEnd: range.spacerEnd,\r\n\r\n pinnedStartWidth,\r\n\r\n pinnedWidth: pinnedStartWidth,\r\n\r\n pinnedEndWidth,\r\n\r\n startPinOffsets: startPinOffsets,\r\n\r\n endPinOffsets,\r\n\r\n totalWidth: pinnedStartWidth + totalScrollable + pinnedEndWidth,\r\n\r\n layoutWidths,\r\n\r\n mountedScrollableCount: scrollable.length + spacerCells,\r\n\r\n };\r\n\r\n}\r\n\r\n\r\n\r\ntype ProviderProps = {\r\n\r\n scrollRef: RefObject<HTMLElement | null>;\r\n\r\n columns: ColumnSchema[];\r\n\r\n columnWidths?: Record<string, number>;\r\n\r\n overscan?: number;\r\n\r\n onViewportWidthChange?: (width: number) => void;\r\n\r\n children: ReactNode;\r\n\r\n};\r\n\r\n\r\n\r\nexport function ColumnWindowProvider({\r\n\r\n scrollRef,\r\n\r\n columns,\r\n\r\n columnWidths,\r\n\r\n overscan = 1,\r\n\r\n onViewportWidthChange,\r\n\r\n children,\r\n\r\n}: ProviderProps) {\r\n\r\n const direction = useDirection();\r\n\r\n const [scrollOffset, setScrollOffset] = useState(0);\r\n\r\n const [viewportSize, setViewportSize] = useState(1024);\r\n\r\n\r\n\r\n const allVisible = useMemo(\r\n\r\n () => columns.filter((c) => !c.hidden),\r\n\r\n [columns],\r\n\r\n );\r\n\r\n\r\n\r\n useEffect(() => {\r\n\r\n const el = scrollRef.current;\r\n\r\n if (!el) return;\r\n\r\n\r\n\r\n const update = () => {\r\n\r\n setScrollOffset(scrollOffsetFromInlineStart(el, direction));\r\n\r\n const w = el.clientWidth || 1024;\r\n\r\n setViewportSize(w);\r\n\r\n onViewportWidthChange?.(w);\r\n\r\n };\r\n\r\n update();\r\n\r\n el.addEventListener('scroll', update, { passive: true });\r\n\r\n const ro =\r\n\r\n typeof ResizeObserver !== 'undefined'\r\n\r\n ? new ResizeObserver(() => update())\r\n\r\n : null;\r\n\r\n ro?.observe(el);\r\n\r\n return () => {\r\n\r\n el.removeEventListener('scroll', update);\r\n\r\n ro?.disconnect();\r\n\r\n };\r\n\r\n }, [scrollRef, direction, allVisible.length, columnWidths, onViewportWidthChange]);\r\n\r\n\r\n\r\n const value = useMemo(\r\n\r\n () =>\r\n\r\n buildColumnWindowModel(\r\n\r\n allVisible,\r\n\r\n columnWidths,\r\n\r\n scrollOffset,\r\n\r\n viewportSize,\r\n\r\n overscan,\r\n\r\n ),\r\n\r\n [allVisible, columnWidths, scrollOffset, viewportSize, overscan],\r\n\r\n );\r\n\r\n\r\n\r\n return (\r\n\r\n <ColumnWindowContext.Provider value={value}>\r\n\r\n {children}\r\n\r\n </ColumnWindowContext.Provider>\r\n\r\n );\r\n\r\n}\r\n\r\n\r\n\r\nexport function useColumnWindow(): ColumnWindowModel {\r\n\r\n return useContext(ColumnWindowContext);\r\n\r\n}\r\n\r\n\r\n\r\n/** Fallback when provider is absent: render every visible column. */\r\n\r\nexport function useColumnWindowOrAll(\r\n\r\n columns: ColumnSchema[],\r\n\r\n columnWidths?: Record<string, number>,\r\n\r\n): ColumnWindowModel {\r\n\r\n const ctx = useContext(ColumnWindowContext);\r\n\r\n const allVisible = columns.filter((c) => !c.hidden);\r\n\r\n if (ctx.allVisible.length > 0) return ctx;\r\n\r\n return buildColumnWindowModel(allVisible, columnWidths, 0, 1e9, 0, 0);\r\n\r\n}\r\n\r\n\r\n","\"use client\";\r\n\r\n\r\n\r\nimport React, { type CSSProperties, type ReactNode } from 'react';\r\n\r\n\r\n\r\nimport type { ColumnSchema } from '../../bootstrap/type';\r\n\r\nimport type { ColumnWindowModel } from './columnWindow';\r\n\r\n\r\n\r\ntype SpacerKind = 'start' | 'end';\r\n\r\n\r\n\r\ntype Props = {\r\n\r\n window: ColumnWindowModel;\r\n\r\n /** Render a real pinned / scrollable column cell. */\r\n\r\n renderColumn: (col: ColumnSchema, absoluteIndex: number) => ReactNode;\r\n\r\n /** Element type for horizontal spacers (`th` in header, `td` elsewhere). */\r\n\r\n spacerElement: 'th' | 'td';\r\n\r\n spacerRole?: 'columnheader' | 'presentation' | 'gridcell';\r\n\r\n spacerStyle?: CSSProperties;\r\n\r\n};\r\n\r\n\r\n\r\nfunction renderPinnedColumns(\r\n\r\n cols: ColumnSchema[],\r\n\r\n model: ColumnWindowModel,\r\n\r\n renderColumn: Props['renderColumn'],\r\n\r\n keyPrefix: string,\r\n\r\n) {\r\n\r\n const nodes: ReactNode[] = [];\r\n\r\n for (const col of cols) {\r\n\r\n const abs = model.allVisible.findIndex((c) => c.fieldName === col.fieldName);\r\n\r\n nodes.push(\r\n\r\n <React.Fragment key={`${keyPrefix}-${col.fieldName}`}>\r\n\r\n {renderColumn(col, abs >= 0 ? abs : 0)}\r\n\r\n </React.Fragment>,\r\n\r\n );\r\n\r\n }\r\n\r\n return nodes;\r\n\r\n}\r\n\r\n\r\n\r\n/**\r\n\r\n * Shared column chrome for header / body / footer (PR-98 / PR-110):\r\n\r\n * pin start → spacerStart → scrollable window → spacerEnd → pin end.\r\n\r\n */\r\n\r\nexport function ColumnWindowCells({\r\n\r\n window: model,\r\n\r\n renderColumn,\r\n\r\n spacerElement: Spacer,\r\n\r\n spacerRole = 'presentation',\r\n\r\n spacerStyle,\r\n\r\n}: Props) {\r\n\r\n const nodes: ReactNode[] = [];\r\n\r\n\r\n\r\n nodes.push(\r\n\r\n ...renderPinnedColumns(model.pinnedStart, model, renderColumn, 'pin-start'),\r\n\r\n );\r\n\r\n\r\n\r\n if (model.spacerStart > 0) {\r\n\r\n nodes.push(\r\n\r\n <Spacer\r\n\r\n key=\"pdg-col-spacer-start\"\r\n\r\n aria-hidden\r\n\r\n role={spacerRole}\r\n\r\n data-pdg-col-spacer=\"start\"\r\n\r\n style={{\r\n\r\n width: model.spacerStart,\r\n\r\n minWidth: model.spacerStart,\r\n\r\n padding: 0,\r\n\r\n border: 'none',\r\n\r\n ...spacerStyle,\r\n\r\n }}\r\n\r\n />,\r\n\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n model.scrollable.forEach((col, i) => {\r\n\r\n const abs = model.scrollableAbsIndices[i] ?? i;\r\n\r\n nodes.push(\r\n\r\n <React.Fragment key={`scr-${col.fieldName}`}>\r\n\r\n {renderColumn(col, abs)}\r\n\r\n </React.Fragment>,\r\n\r\n );\r\n\r\n });\r\n\r\n\r\n\r\n if (model.spacerEnd > 0) {\r\n\r\n nodes.push(\r\n\r\n <Spacer\r\n\r\n key=\"pdg-col-spacer-end\"\r\n\r\n aria-hidden\r\n\r\n role={spacerRole}\r\n\r\n data-pdg-col-spacer=\"end\"\r\n\r\n style={{\r\n\r\n width: model.spacerEnd,\r\n\r\n minWidth: model.spacerEnd,\r\n\r\n padding: 0,\r\n\r\n border: 'none',\r\n\r\n ...spacerStyle,\r\n\r\n }}\r\n\r\n />,\r\n\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n nodes.push(\r\n\r\n ...renderPinnedColumns(model.pinnedEnd, model, renderColumn, 'pin-end'),\r\n\r\n );\r\n\r\n\r\n\r\n return <>{nodes}</>;\r\n\r\n}\r\n\r\n\r\n\r\nexport type { SpacerKind };\r\n\r\n\r\n"]}
@@ -0,0 +1,112 @@
1
+ // ui/locales/en.ts
2
+ var enMessages = {
3
+ "general.addNewRow": "Add row",
4
+ "general.copy": "Copy",
5
+ "general.cut": "Cut",
6
+ "general.paste": "Paste",
7
+ "general.delete": "Delete",
8
+ "general.chooseFromList": "Choose from list",
9
+ "general.toggle": "Select all",
10
+ "general.exportToExcel": "Export to Excel",
11
+ "general.exportToExcelSuccess": "Excel export succeeded",
12
+ "general.exportToExcelError": "Excel export failed",
13
+ "general.exportToPdf": "Export to PDF",
14
+ "general.exportToPdfSuccess": "PDF export succeeded",
15
+ "general.exportToPdfError": "PDF export failed",
16
+ "general.importFromExcel": "Import from Excel",
17
+ "general.importFromExcelSuccess": "Excel import succeeded",
18
+ "general.importFromExcelError": "Excel import failed",
19
+ "general.selected": "Selected",
20
+ "general.search": "Search",
21
+ "general.selectField": "Select",
22
+ "general.selectPlaceholder": "Select",
23
+ "general.choice": "Choose column",
24
+ "general.prev": "Previous",
25
+ "general.next": "Next",
26
+ "general.noData": "No data",
27
+ "general.loading": "Loading\u2026",
28
+ "general.footerTotal": "Total",
29
+ "general.footerAvg": "Average",
30
+ "general.replicateRow": "Duplicate row",
31
+ "general.edit": "Edit",
32
+ "general.rowEdit": "Edit row",
33
+ "general.row": "Row",
34
+ "general.selectRow": "Select row",
35
+ "general.save": "Save",
36
+ "general.notActive": "Inactive",
37
+ "general.add": "Add",
38
+ "general.themeDark": "Dark theme",
39
+ "general.themeLight": "Light theme",
40
+ "general.toolbar": "Toolbar",
41
+ "general.filter": "Filter",
42
+ "general.filterApply": "Apply",
43
+ "general.filterClear": "Clear",
44
+ "general.filterActive": "Filter active",
45
+ "general.rowsIn": "rows in",
46
+ "general.page": "pages",
47
+ "general.validationInRow": "In row",
48
+ "general.validationInColumn": "in column",
49
+ "general.loadMore": "Show more ({visible} of {total})",
50
+ "general.searchFound": "{count} matches found",
51
+ "general.searchNotFound": "No matches",
52
+ "general.searchPosition": "{current} of {total}",
53
+ "columnMenu.open": "Column menu",
54
+ "columnMenu.sortAsc": "Sort ascending",
55
+ "columnMenu.sortDesc": "Sort descending",
56
+ "columnMenu.sortNone": "Clear sort",
57
+ "columnMenu.filter": "Filter\u2026",
58
+ "columnMenu.hideColumn": "Hide column",
59
+ "columnMenu.pinStart": "Pin left",
60
+ "columnMenu.pinEnd": "Pin right",
61
+ "columnMenu.pinNone": "Unpin",
62
+ "columnMenu.autoSize": "Auto-size column",
63
+ "columnMenu.columnsPanel": "Configure columns",
64
+ "a11y.sortedAsc": "Sorted by {column} ascending",
65
+ "a11y.sortedDesc": "Sorted by {column} descending",
66
+ "a11y.sortCleared": "Sort cleared",
67
+ "a11y.filterResult": "{visible} of {total} rows after filter",
68
+ "a11y.filterCleared": "Filter cleared",
69
+ "a11y.rowsSelected": "{count} rows selected",
70
+ "a11y.selectionCleared": "Selection cleared",
71
+ "a11y.validationError": "Validation error: {message}",
72
+ "a11y.validationGeneric": "Validation error",
73
+ "history.title": "History",
74
+ "history.empty": "No history yet. Edit a cell to append events.",
75
+ "history.severity": "Severity",
76
+ "history.category": "Category",
77
+ "history.filterAll": "All",
78
+ "history.severity.info": "Info",
79
+ "history.severity.warning": "Warning",
80
+ "history.severity.error": "Error",
81
+ "history.category.data": "Data",
82
+ "history.category.structure": "Structure",
83
+ "history.category.view": "View",
84
+ "history.category.system": "System",
85
+ "history.restore": "Restore previous value",
86
+ "offline.online": "Online",
87
+ "offline.offline": "Offline",
88
+ "offline.pendingCount": "{count} unsaved changes",
89
+ "offline.pendingEmpty": "All changes saved locally",
90
+ "sync.policy": "Conflict policy",
91
+ "sync.policy.lastWriteWins": "Last write wins",
92
+ "sync.policy.serverWins": "Server wins",
93
+ "sync.policy.manual": "Manual",
94
+ "sync.now": "Sync now",
95
+ "sync.syncing": "Syncing\u2026",
96
+ "sync.unavailable": "Sync transport not configured",
97
+ "sync.result": "Pushed {pushed}, pulled {pulled}, conflicts {conflicts}",
98
+ "sync.local": "Local",
99
+ "sync.remote": "Remote",
100
+ "sync.keepLocal": "Keep local",
101
+ "sync.keepRemote": "Keep remote",
102
+ "date.pickDate": "Pick a date",
103
+ "date.pickRange": "Pick a range",
104
+ "date.clear": "Clear",
105
+ "date.calendar": "Jalali calendar",
106
+ "date.prevMonth": "Previous month",
107
+ "date.nextMonth": "Next month"
108
+ };
109
+
110
+ export { enMessages };
111
+ //# sourceMappingURL=chunk-77UXAJII.js.map
112
+ //# sourceMappingURL=chunk-77UXAJII.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../ui/locales/en.ts"],"names":[],"mappings":"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","file":"chunk-77UXAJII.js","sourcesContent":["import type { ERPTableMessages } from './types';\r\n\r\n/** English (en) message pack (PR-127). */\r\nexport const enMessages: ERPTableMessages = {\r\n 'general.addNewRow': 'Add row',\r\n 'general.copy': 'Copy',\r\n 'general.cut': 'Cut',\r\n 'general.paste': 'Paste',\r\n 'general.delete': 'Delete',\r\n 'general.chooseFromList': 'Choose from list',\r\n 'general.toggle': 'Select all',\r\n 'general.exportToExcel': 'Export to Excel',\r\n 'general.exportToExcelSuccess': 'Excel export succeeded',\r\n 'general.exportToExcelError': 'Excel export failed',\r\n 'general.exportToPdf': 'Export to PDF',\r\n 'general.exportToPdfSuccess': 'PDF export succeeded',\r\n 'general.exportToPdfError': 'PDF export failed',\r\n 'general.importFromExcel': 'Import from Excel',\r\n 'general.importFromExcelSuccess': 'Excel import succeeded',\r\n 'general.importFromExcelError': 'Excel import failed',\r\n 'general.selected': 'Selected',\r\n 'general.search': 'Search',\r\n 'general.selectField': 'Select',\r\n 'general.selectPlaceholder': 'Select',\r\n 'general.choice': 'Choose column',\r\n 'general.prev': 'Previous',\r\n 'general.next': 'Next',\r\n 'general.noData': 'No data',\r\n 'general.loading': 'Loading…',\r\n 'general.footerTotal': 'Total',\r\n 'general.footerAvg': 'Average',\r\n 'general.replicateRow': 'Duplicate row',\r\n 'general.edit': 'Edit',\r\n 'general.rowEdit': 'Edit row',\r\n 'general.row': 'Row',\r\n 'general.selectRow': 'Select row',\r\n 'general.save': 'Save',\r\n 'general.notActive': 'Inactive',\r\n 'general.add': 'Add',\r\n 'general.themeDark': 'Dark theme',\r\n 'general.themeLight': 'Light theme',\r\n 'general.toolbar': 'Toolbar',\r\n 'general.filter': 'Filter',\r\n 'general.filterApply': 'Apply',\r\n 'general.filterClear': 'Clear',\r\n 'general.filterActive': 'Filter active',\r\n 'general.rowsIn': 'rows in',\r\n 'general.page': 'pages',\r\n 'general.validationInRow': 'In row',\r\n 'general.validationInColumn': 'in column',\r\n 'general.loadMore': 'Show more ({visible} of {total})',\r\n 'general.searchFound': '{count} matches found',\r\n 'general.searchNotFound': 'No matches',\r\n 'general.searchPosition': '{current} of {total}',\r\n 'columnMenu.open': 'Column menu',\r\n 'columnMenu.sortAsc': 'Sort ascending',\r\n 'columnMenu.sortDesc': 'Sort descending',\r\n 'columnMenu.sortNone': 'Clear sort',\r\n 'columnMenu.filter': 'Filter…',\r\n 'columnMenu.hideColumn': 'Hide column',\r\n 'columnMenu.pinStart': 'Pin left',\r\n 'columnMenu.pinEnd': 'Pin right',\r\n 'columnMenu.pinNone': 'Unpin',\r\n 'columnMenu.autoSize': 'Auto-size column',\r\n 'columnMenu.columnsPanel': 'Configure columns',\r\n 'a11y.sortedAsc': 'Sorted by {column} ascending',\r\n 'a11y.sortedDesc': 'Sorted by {column} descending',\r\n 'a11y.sortCleared': 'Sort cleared',\r\n 'a11y.filterResult': '{visible} of {total} rows after filter',\r\n 'a11y.filterCleared': 'Filter cleared',\r\n 'a11y.rowsSelected': '{count} rows selected',\r\n 'a11y.selectionCleared': 'Selection cleared',\r\n 'a11y.validationError': 'Validation error: {message}',\r\n 'a11y.validationGeneric': 'Validation error',\r\n 'history.title': 'History',\r\n 'history.empty': 'No history yet. Edit a cell to append events.',\r\n 'history.severity': 'Severity',\r\n 'history.category': 'Category',\r\n 'history.filterAll': 'All',\r\n 'history.severity.info': 'Info',\r\n 'history.severity.warning': 'Warning',\r\n 'history.severity.error': 'Error',\r\n 'history.category.data': 'Data',\r\n 'history.category.structure': 'Structure',\r\n 'history.category.view': 'View',\r\n 'history.category.system': 'System',\r\n 'history.restore': 'Restore previous value',\r\n 'offline.online': 'Online',\r\n 'offline.offline': 'Offline',\r\n 'offline.pendingCount': '{count} unsaved changes',\r\n 'offline.pendingEmpty': 'All changes saved locally',\r\n 'sync.policy': 'Conflict policy',\r\n 'sync.policy.lastWriteWins': 'Last write wins',\r\n 'sync.policy.serverWins': 'Server wins',\r\n 'sync.policy.manual': 'Manual',\r\n 'sync.now': 'Sync now',\r\n 'sync.syncing': 'Syncing…',\r\n 'sync.unavailable': 'Sync transport not configured',\r\n 'sync.result': 'Pushed {pushed}, pulled {pulled}, conflicts {conflicts}',\r\n 'sync.local': 'Local',\r\n 'sync.remote': 'Remote',\r\n 'sync.keepLocal': 'Keep local',\r\n 'sync.keepRemote': 'Keep remote',\r\n 'date.pickDate': 'Pick a date',\r\n 'date.pickRange': 'Pick a range',\r\n 'date.clear': 'Clear',\r\n 'date.calendar': 'Jalali calendar',\r\n 'date.prevMonth': 'Previous month',\r\n 'date.nextMonth': 'Next month',\r\n};\r\n\r\nexport default enMessages;\r\n"]}
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ // infrastructure/Repositories/callbackRemoteApi.ts
4
+ var CallbackRemoteApi = class {
5
+ constructor(send, onError) {
6
+ this.send = send;
7
+ this.onError = onError;
8
+ }
9
+ async request(input) {
10
+ try {
11
+ return await this.send(input);
12
+ } catch (error) {
13
+ this.onError?.(error);
14
+ throw error;
15
+ }
16
+ }
17
+ };
18
+
19
+ exports.CallbackRemoteApi = CallbackRemoteApi;
20
+ //# sourceMappingURL=chunk-ASPTRYRD.cjs.map
21
+ //# sourceMappingURL=chunk-ASPTRYRD.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../infrastructure/Repositories/callbackRemoteApi.ts"],"names":[],"mappings":";;;AAuBO,IAAM,oBAAN,MAA6C;AAAA,EAClD,WAAA,CACmB,MACA,OAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAEH,MAAM,QAA6B,KAAA,EAA6C;AAC9E,IAAA,IAAI;AACF,MAAA,OAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,IAC/B,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,UAAU,KAAK,CAAA;AACpB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF","file":"chunk-ASPTRYRD.cjs","sourcesContent":["import type { RemoteApi } from '../../application/ports/RemoteApi';\r\n\r\nexport type RemoteApiRequest = {\r\n endpoint: string;\r\n params?: Record<string, unknown>;\r\n method?: 'GET' | 'POST';\r\n};\r\n\r\n/**\r\n * Wraps ANY host transport as a `RemoteApi` port — the grid never learns how\r\n * requests are authenticated or where defaults come from.\r\n *\r\n * arianERP example (RTK Query base query with token refresh + Redux defaults):\r\n *\r\n * const remoteApi = new CallbackRemoteApi(async ({ endpoint, params, method }) => {\r\n * const res = await baseQueryByToken(\r\n * { url: endpoint, method: method ?? 'POST', body: params ?? {} },\r\n * { getState: () => store.getState(), dispatch: store.dispatch } as never,\r\n * {},\r\n * );\r\n * return res.data;\r\n * });\r\n */\r\nexport class CallbackRemoteApi implements RemoteApi {\r\n constructor(\r\n private readonly send: (request: RemoteApiRequest) => Promise<unknown>,\r\n private readonly onError?: (error: unknown) => void,\r\n ) {}\r\n\r\n async request<TResponse = unknown>(input: RemoteApiRequest): Promise<TResponse> {\r\n try {\r\n return (await this.send(input)) as TResponse;\r\n } catch (error) {\r\n this.onError?.(error);\r\n throw error;\r\n }\r\n }\r\n}\r\n"]}