persian-data-grid 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/OFL.txt +93 -0
  2. package/README.md +179 -22
  3. package/dist/ERPTableGroupRow-E5Q6FYDS.js +125 -0
  4. package/dist/ERPTableGroupRow-E5Q6FYDS.js.map +1 -0
  5. package/dist/ERPTableGroupRow-F2IPDYL5.cjs +131 -0
  6. package/dist/ERPTableGroupRow-F2IPDYL5.cjs.map +1 -0
  7. package/dist/GridPlugin-Bewn0X51.d.ts +57 -0
  8. package/dist/GridPlugin-DewWufGZ.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-CeIfVFck.d.ts +2625 -0
  14. package/dist/GridSession-CmQn2RnL.d.cts +2625 -0
  15. package/dist/GridSyncService-3JQLEY65.cjs +12 -0
  16. package/dist/GridSyncService-3JQLEY65.cjs.map +1 -0
  17. package/dist/GridSyncService-GECXGEKL.js +3 -0
  18. package/dist/GridSyncService-GECXGEKL.js.map +1 -0
  19. package/dist/PdfRenderer-B9FJaCo_.d.cts +22 -0
  20. package/dist/PdfRenderer-bN7ca_Aj.d.ts +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-C71LXBiX.d.ts +678 -0
  28. package/dist/UITableController-CIwnHIw8.d.cts +678 -0
  29. package/dist/VazirmatnPdfRenderer-CpCqA-Wh.d.cts +96 -0
  30. package/dist/VazirmatnPdfRenderer-D46smncn.d.ts +96 -0
  31. package/dist/adapters/arian-erp.cjs +89 -0
  32. package/dist/adapters/arian-erp.cjs.map +1 -0
  33. package/dist/adapters/arian-erp.d.cts +62 -0
  34. package/dist/adapters/arian-erp.d.ts +62 -0
  35. package/dist/adapters/arian-erp.js +79 -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-C2fWYoPy.d.cts +135 -0
  42. package/dist/applyImportedRows-Cqh_N_0k.d.ts +135 -0
  43. package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs +86 -0
  44. package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs.map +1 -0
  45. package/dist/applyRowVisibilityHandler-ZLZXQEGY.js +84 -0
  46. package/dist/applyRowVisibilityHandler-ZLZXQEGY.js.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-BYLjmSI6.d.ts +51 -0
  52. package/dist/callbackRemoteApi-Cv26MmSD.d.cts +51 -0
  53. package/dist/cellRenderContext-BaNh4qn_.d.ts +42 -0
  54. package/dist/cellRenderContext-DvngkptV.d.cts +42 -0
  55. package/dist/chunk-27ALJSZP.js +12187 -0
  56. package/dist/chunk-27ALJSZP.js.map +1 -0
  57. package/dist/chunk-3HP3HQCW.cjs +688 -0
  58. package/dist/chunk-3HP3HQCW.cjs.map +1 -0
  59. package/dist/chunk-3Y3KKGEC.js +3 -0
  60. package/dist/chunk-3Y3KKGEC.js.map +1 -0
  61. package/dist/chunk-52LFOPXD.cjs +588 -0
  62. package/dist/chunk-52LFOPXD.cjs.map +1 -0
  63. package/dist/chunk-5ALMNLUR.cjs +1408 -0
  64. package/dist/chunk-5ALMNLUR.cjs.map +1 -0
  65. package/dist/chunk-5HKVMPBD.js +937 -0
  66. package/dist/chunk-5HKVMPBD.js.map +1 -0
  67. package/dist/chunk-72IVAOTK.cjs +38 -0
  68. package/dist/chunk-72IVAOTK.cjs.map +1 -0
  69. package/dist/chunk-77UXAJII.js +112 -0
  70. package/dist/chunk-77UXAJII.js.map +1 -0
  71. package/dist/chunk-7GWV5HGO.js +36 -0
  72. package/dist/chunk-7GWV5HGO.js.map +1 -0
  73. package/dist/chunk-7T6AWRPU.js +581 -0
  74. package/dist/chunk-7T6AWRPU.js.map +1 -0
  75. package/dist/chunk-AU3RDJYQ.js +243 -0
  76. package/dist/chunk-AU3RDJYQ.js.map +1 -0
  77. package/dist/chunk-CILNIWYW.cjs +100 -0
  78. package/dist/chunk-CILNIWYW.cjs.map +1 -0
  79. package/dist/chunk-CMQ4VLCW.cjs +840 -0
  80. package/dist/chunk-CMQ4VLCW.cjs.map +1 -0
  81. package/dist/chunk-DFFP7SJ6.cjs +257 -0
  82. package/dist/chunk-DFFP7SJ6.cjs.map +1 -0
  83. package/dist/chunk-E2J533UH.cjs +53 -0
  84. package/dist/chunk-E2J533UH.cjs.map +1 -0
  85. package/dist/chunk-EBV6HGZB.cjs +33 -0
  86. package/dist/chunk-EBV6HGZB.cjs.map +1 -0
  87. package/dist/chunk-F4PYOYHR.js +112 -0
  88. package/dist/chunk-F4PYOYHR.js.map +1 -0
  89. package/dist/chunk-F6EMC75A.cjs +34 -0
  90. package/dist/chunk-F6EMC75A.cjs.map +1 -0
  91. package/dist/chunk-GKE33FOJ.js +32 -0
  92. package/dist/chunk-GKE33FOJ.js.map +1 -0
  93. package/dist/chunk-GQEDLUMB.js +168 -0
  94. package/dist/chunk-GQEDLUMB.js.map +1 -0
  95. package/dist/chunk-HLOHWFOA.js +645 -0
  96. package/dist/chunk-HLOHWFOA.js.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-KCNTKYUY.js +206 -0
  108. package/dist/chunk-KCNTKYUY.js.map +1 -0
  109. package/dist/chunk-KHMG6EI2.js +13 -0
  110. package/dist/chunk-KHMG6EI2.js.map +1 -0
  111. package/dist/chunk-KMRURD5J.cjs +15 -0
  112. package/dist/chunk-KMRURD5J.cjs.map +1 -0
  113. package/dist/chunk-KRJG3KMP.cjs +174 -0
  114. package/dist/chunk-KRJG3KMP.cjs.map +1 -0
  115. package/dist/chunk-LY27YAXE.cjs +208 -0
  116. package/dist/chunk-LY27YAXE.cjs.map +1 -0
  117. package/dist/chunk-MT3KLB2Q.cjs +944 -0
  118. package/dist/chunk-MT3KLB2Q.cjs.map +1 -0
  119. package/dist/chunk-MUQQKPWR.js +84 -0
  120. package/dist/chunk-MUQQKPWR.js.map +1 -0
  121. package/dist/chunk-N7SJTINL.cjs +4 -0
  122. package/dist/chunk-N7SJTINL.cjs.map +1 -0
  123. package/dist/chunk-NB5GCGHL.js +833 -0
  124. package/dist/chunk-NB5GCGHL.js.map +1 -0
  125. package/dist/chunk-NQUVAJQA.js +298 -0
  126. package/dist/chunk-NQUVAJQA.js.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-Q7TBBUTX.cjs +110 -0
  134. package/dist/chunk-Q7TBBUTX.cjs.map +1 -0
  135. package/dist/chunk-QZN7R2WP.cjs +114 -0
  136. package/dist/chunk-QZN7R2WP.cjs.map +1 -0
  137. package/dist/chunk-RKVSJU46.js +35 -0
  138. package/dist/chunk-RKVSJU46.js.map +1 -0
  139. package/dist/chunk-SVO62ZV2.js +50 -0
  140. package/dist/chunk-SVO62ZV2.js.map +1 -0
  141. package/dist/chunk-SX4VQXAA.cjs +114 -0
  142. package/dist/chunk-SX4VQXAA.cjs.map +1 -0
  143. package/dist/chunk-SZ7BLAY3.js +92 -0
  144. package/dist/chunk-SZ7BLAY3.js.map +1 -0
  145. package/dist/chunk-TN4MG6FY.js +112 -0
  146. package/dist/chunk-TN4MG6FY.js.map +1 -0
  147. package/dist/chunk-UC7PHDM6.cjs +331 -0
  148. package/dist/chunk-UC7PHDM6.cjs.map +1 -0
  149. package/dist/chunk-UXVLYUUW.js +108 -0
  150. package/dist/chunk-UXVLYUUW.js.map +1 -0
  151. package/dist/chunk-VBAZ77Q4.js +932 -0
  152. package/dist/chunk-VBAZ77Q4.js.map +1 -0
  153. package/dist/chunk-VSAFQTW5.cjs +319 -0
  154. package/dist/chunk-VSAFQTW5.cjs.map +1 -0
  155. package/dist/chunk-VYJQ2HTA.cjs +936 -0
  156. package/dist/chunk-VYJQ2HTA.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-WTHTVKVI.cjs +12299 -0
  160. package/dist/chunk-WTHTVKVI.cjs.map +1 -0
  161. package/dist/chunk-WUMOSOEK.cjs +62 -0
  162. package/dist/chunk-WUMOSOEK.cjs.map +1 -0
  163. package/dist/chunk-XLRE2J25.js +140 -0
  164. package/dist/chunk-XLRE2J25.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-BBkud5oE.d.ts +939 -0
  168. package/dist/createEngineGridQuery-D-fgO_jg.d.cts +939 -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 +508 -0
  188. package/dist/headless.d.ts +508 -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 +8060 -11409
  194. package/dist/index.cjs.map +1 -1
  195. package/dist/index.d.cts +457 -2305
  196. package/dist/index.d.ts +457 -2305
  197. package/dist/index.js +7302 -11084
  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 +185 -29
package/dist/sync.cjs ADDED
@@ -0,0 +1,148 @@
1
+ 'use strict';
2
+
3
+ var chunk3HP3HQCW_cjs = require('./chunk-3HP3HQCW.cjs');
4
+ require('./chunk-CILNIWYW.cjs');
5
+ require('./chunk-SX4VQXAA.cjs');
6
+ require('./chunk-QZN7R2WP.cjs');
7
+ require('./chunk-Z4QPZ3Z3.cjs');
8
+ require('./chunk-KRJG3KMP.cjs');
9
+ require('./chunk-J7CPPFXT.cjs');
10
+ require('./chunk-DFFP7SJ6.cjs');
11
+ var react = require('react');
12
+ var jsxRuntime = require('react/jsx-runtime');
13
+
14
+ var POLICIES = [
15
+ "lastWriteWins",
16
+ "serverWins",
17
+ "manual"
18
+ ];
19
+ function GridSyncPanel({ controller, className }) {
20
+ const t = chunk3HP3HQCW_cjs.useTranslations();
21
+ const [policy, setPolicy] = react.useState(
22
+ () => controller.getSyncPolicy()
23
+ );
24
+ const [conflicts, setConflicts] = react.useState(
25
+ () => controller.getOpenSyncConflicts()
26
+ );
27
+ const [busy, setBusy] = react.useState(false);
28
+ const [lastMessage, setLastMessage] = react.useState(null);
29
+ react.useEffect(() => {
30
+ setPolicy(controller.getSyncPolicy());
31
+ return controller.subscribeSyncConflicts(setConflicts);
32
+ }, [controller]);
33
+ if (!controller.getSyncPort()) {
34
+ return null;
35
+ }
36
+ const onPolicyChange = (next) => {
37
+ controller.setSyncPolicy(next);
38
+ setPolicy(next);
39
+ };
40
+ const onSync = async () => {
41
+ setBusy(true);
42
+ setLastMessage(null);
43
+ try {
44
+ const result = await controller.syncNow();
45
+ if (!result) {
46
+ setLastMessage(t("sync.unavailable"));
47
+ return;
48
+ }
49
+ setLastMessage(
50
+ t("sync.result", {
51
+ pushed: result.pushed,
52
+ pulled: result.pulled,
53
+ conflicts: result.conflicts.length
54
+ })
55
+ );
56
+ setConflicts(controller.getOpenSyncConflicts());
57
+ } finally {
58
+ setBusy(false);
59
+ }
60
+ };
61
+ const onResolve = async (conflictId, choice) => {
62
+ setBusy(true);
63
+ try {
64
+ await controller.resolveSyncConflict(conflictId, choice);
65
+ setConflicts(controller.getOpenSyncConflicts());
66
+ } finally {
67
+ setBusy(false);
68
+ }
69
+ };
70
+ return /* @__PURE__ */ jsxRuntime.jsxs(
71
+ "aside",
72
+ {
73
+ className: ["pdg-sync-panel", className].filter(Boolean).join(" "),
74
+ "data-pdg-sync-panel": "",
75
+ children: [
76
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "pdg-sync-panel__row", children: [
77
+ /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "pdg-sync-panel__policy", children: [
78
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("sync.policy") }),
79
+ /* @__PURE__ */ jsxRuntime.jsx(
80
+ "select",
81
+ {
82
+ "data-pdg-sync-policy": "",
83
+ value: policy ?? "lastWriteWins",
84
+ disabled: busy,
85
+ onChange: (e) => onPolicyChange(e.target.value),
86
+ children: POLICIES.map((p) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: p, children: t(`sync.policy.${p}`) }, p))
87
+ }
88
+ )
89
+ ] }),
90
+ /* @__PURE__ */ jsxRuntime.jsx(
91
+ "button",
92
+ {
93
+ type: "button",
94
+ "data-pdg-sync-now": "",
95
+ disabled: busy,
96
+ onClick: () => void onSync(),
97
+ children: busy ? t("sync.syncing") : t("sync.now")
98
+ }
99
+ )
100
+ ] }),
101
+ lastMessage ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "pdg-sync-panel__status", "data-pdg-sync-status": "", children: lastMessage }) : null,
102
+ conflicts.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "pdg-sync-panel__conflicts", "data-pdg-sync-conflicts": "", children: conflicts.map((c) => /* @__PURE__ */ jsxRuntime.jsxs("li", { "data-pdg-sync-conflict": c.id, children: [
103
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "pdg-sync-panel__conflict-key", children: [
104
+ c.key.rowId,
105
+ ":",
106
+ c.key.columnId
107
+ ] }),
108
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "pdg-sync-panel__conflict-values", children: [
109
+ t("sync.local"),
110
+ ": ",
111
+ String(c.local.value),
112
+ " / ",
113
+ t("sync.remote"),
114
+ ":",
115
+ " ",
116
+ String(c.remote.value)
117
+ ] }),
118
+ policy === "manual" ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "pdg-sync-panel__conflict-actions", children: [
119
+ /* @__PURE__ */ jsxRuntime.jsx(
120
+ "button",
121
+ {
122
+ type: "button",
123
+ "data-pdg-sync-keep-local": "",
124
+ disabled: busy,
125
+ onClick: () => void onResolve(c.id, "local"),
126
+ children: t("sync.keepLocal")
127
+ }
128
+ ),
129
+ /* @__PURE__ */ jsxRuntime.jsx(
130
+ "button",
131
+ {
132
+ type: "button",
133
+ "data-pdg-sync-keep-remote": "",
134
+ disabled: busy,
135
+ onClick: () => void onResolve(c.id, "remote"),
136
+ children: t("sync.keepRemote")
137
+ }
138
+ )
139
+ ] }) : null
140
+ ] }, c.id)) }) : null
141
+ ]
142
+ }
143
+ );
144
+ }
145
+
146
+ exports.GridSyncPanel = GridSyncPanel;
147
+ //# sourceMappingURL=sync.cjs.map
148
+ //# sourceMappingURL=sync.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../ui/sync/GridSyncPanel.tsx"],"names":["useTranslations","useState","useEffect","jsxs","jsx"],"mappings":"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","file":"sync.cjs","sourcesContent":["'use client';\r\n\r\nimport React, { useEffect, useState } from 'react';\r\n\r\nimport type {\r\n ManualResolution,\r\n SyncConflict,\r\n SyncConflictPolicy,\r\n} from '../../application/ports/SyncPort';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { useTranslations } from '../host';\r\n\r\nexport type GridSyncPanelProps = {\r\n controller: UITableController;\r\n className?: string;\r\n};\r\n\r\nconst POLICIES: SyncConflictPolicy[] = [\r\n 'lastWriteWins',\r\n 'serverWins',\r\n 'manual',\r\n];\r\n\r\n/**\r\n * Sync policy + conflict resolution UI (PR-138).\r\n * Requires `createGrid({ syncTransport })`.\r\n */\r\nexport function GridSyncPanel({ controller, className }: GridSyncPanelProps) {\r\n const t = useTranslations();\r\n const [policy, setPolicy] = useState<SyncConflictPolicy | undefined>(() =>\r\n controller.getSyncPolicy(),\r\n );\r\n const [conflicts, setConflicts] = useState<readonly SyncConflict[]>(() =>\r\n controller.getOpenSyncConflicts(),\r\n );\r\n const [busy, setBusy] = useState(false);\r\n const [lastMessage, setLastMessage] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n setPolicy(controller.getSyncPolicy());\r\n return controller.subscribeSyncConflicts(setConflicts);\r\n }, [controller]);\r\n\r\n if (!controller.getSyncPort()) {\r\n return null;\r\n }\r\n\r\n const onPolicyChange = (next: SyncConflictPolicy) => {\r\n controller.setSyncPolicy(next);\r\n setPolicy(next);\r\n };\r\n\r\n const onSync = async () => {\r\n setBusy(true);\r\n setLastMessage(null);\r\n try {\r\n const result = await controller.syncNow();\r\n if (!result) {\r\n setLastMessage(t('sync.unavailable'));\r\n return;\r\n }\r\n setLastMessage(\r\n t('sync.result', {\r\n pushed: result.pushed,\r\n pulled: result.pulled,\r\n conflicts: result.conflicts.length,\r\n }),\r\n );\r\n setConflicts(controller.getOpenSyncConflicts());\r\n } finally {\r\n setBusy(false);\r\n }\r\n };\r\n\r\n const onResolve = async (\r\n conflictId: string,\r\n choice: ManualResolution,\r\n ) => {\r\n setBusy(true);\r\n try {\r\n await controller.resolveSyncConflict(conflictId, choice);\r\n setConflicts(controller.getOpenSyncConflicts());\r\n } finally {\r\n setBusy(false);\r\n }\r\n };\r\n\r\n return (\r\n <aside\r\n className={['pdg-sync-panel', className].filter(Boolean).join(' ')}\r\n data-pdg-sync-panel=\"\"\r\n >\r\n <div className=\"pdg-sync-panel__row\">\r\n <label className=\"pdg-sync-panel__policy\">\r\n <span>{t('sync.policy')}</span>\r\n <select\r\n data-pdg-sync-policy=\"\"\r\n value={policy ?? 'lastWriteWins'}\r\n disabled={busy}\r\n onChange={(e) =>\r\n onPolicyChange(e.target.value as SyncConflictPolicy)\r\n }\r\n >\r\n {POLICIES.map((p) => (\r\n <option key={p} value={p}>\r\n {t(`sync.policy.${p}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n <button\r\n type=\"button\"\r\n data-pdg-sync-now=\"\"\r\n disabled={busy}\r\n onClick={() => void onSync()}\r\n >\r\n {busy ? t('sync.syncing') : t('sync.now')}\r\n </button>\r\n </div>\r\n {lastMessage ? (\r\n <p className=\"pdg-sync-panel__status\" data-pdg-sync-status=\"\">\r\n {lastMessage}\r\n </p>\r\n ) : null}\r\n {conflicts.length > 0 ? (\r\n <ul className=\"pdg-sync-panel__conflicts\" data-pdg-sync-conflicts=\"\">\r\n {conflicts.map((c) => (\r\n <li key={c.id} data-pdg-sync-conflict={c.id}>\r\n <span className=\"pdg-sync-panel__conflict-key\">\r\n {c.key.rowId}:{c.key.columnId}\r\n </span>\r\n <span className=\"pdg-sync-panel__conflict-values\">\r\n {t('sync.local')}: {String(c.local.value)} / {t('sync.remote')}:{' '}\r\n {String(c.remote.value)}\r\n </span>\r\n {policy === 'manual' ? (\r\n <span className=\"pdg-sync-panel__conflict-actions\">\r\n <button\r\n type=\"button\"\r\n data-pdg-sync-keep-local=\"\"\r\n disabled={busy}\r\n onClick={() => void onResolve(c.id, 'local')}\r\n >\r\n {t('sync.keepLocal')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n data-pdg-sync-keep-remote=\"\"\r\n disabled={busy}\r\n onClick={() => void onResolve(c.id, 'remote')}\r\n >\r\n {t('sync.keepRemote')}\r\n </button>\r\n </span>\r\n ) : null}\r\n </li>\r\n ))}\r\n </ul>\r\n ) : null}\r\n </aside>\r\n );\r\n}\r\n"]}
@@ -0,0 +1,17 @@
1
+ import React__default from 'react';
2
+ import { U as UITableController } from './UITableController-CIwnHIw8.cjs';
3
+ export { M as ManualResolution, S as SyncConflict, e as SyncConflictPolicy, f as SyncConflictSide, g as SyncPort, h as SyncResult, i as SyncTransport } from './UITableController-CIwnHIw8.cjs';
4
+ import './GridSession-CmQn2RnL.cjs';
5
+ import './RemoteApi-CCQxiSf1.cjs';
6
+
7
+ type GridSyncPanelProps = {
8
+ controller: UITableController;
9
+ className?: string;
10
+ };
11
+ /**
12
+ * Sync policy + conflict resolution UI (PR-138).
13
+ * Requires `createGrid({ syncTransport })`.
14
+ */
15
+ declare function GridSyncPanel({ controller, className }: GridSyncPanelProps): React__default.JSX.Element | null;
16
+
17
+ export { GridSyncPanel, type GridSyncPanelProps };
package/dist/sync.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import React__default from 'react';
2
+ import { U as UITableController } from './UITableController-C71LXBiX.js';
3
+ export { M as ManualResolution, S as SyncConflict, e as SyncConflictPolicy, f as SyncConflictSide, g as SyncPort, h as SyncResult, i as SyncTransport } from './UITableController-C71LXBiX.js';
4
+ import './GridSession-CeIfVFck.js';
5
+ import './RemoteApi-CCQxiSf1.js';
6
+
7
+ type GridSyncPanelProps = {
8
+ controller: UITableController;
9
+ className?: string;
10
+ };
11
+ /**
12
+ * Sync policy + conflict resolution UI (PR-138).
13
+ * Requires `createGrid({ syncTransport })`.
14
+ */
15
+ declare function GridSyncPanel({ controller, className }: GridSyncPanelProps): React__default.JSX.Element | null;
16
+
17
+ export { GridSyncPanel, type GridSyncPanelProps };
package/dist/sync.js ADDED
@@ -0,0 +1,146 @@
1
+ import { useTranslations } from './chunk-HLOHWFOA.js';
2
+ import './chunk-SZ7BLAY3.js';
3
+ import './chunk-F4PYOYHR.js';
4
+ import './chunk-77UXAJII.js';
5
+ import './chunk-TN4MG6FY.js';
6
+ import './chunk-GQEDLUMB.js';
7
+ import './chunk-MUQQKPWR.js';
8
+ import './chunk-AU3RDJYQ.js';
9
+ import { useState, useEffect } from 'react';
10
+ import { jsxs, jsx } from 'react/jsx-runtime';
11
+
12
+ var POLICIES = [
13
+ "lastWriteWins",
14
+ "serverWins",
15
+ "manual"
16
+ ];
17
+ function GridSyncPanel({ controller, className }) {
18
+ const t = useTranslations();
19
+ const [policy, setPolicy] = useState(
20
+ () => controller.getSyncPolicy()
21
+ );
22
+ const [conflicts, setConflicts] = useState(
23
+ () => controller.getOpenSyncConflicts()
24
+ );
25
+ const [busy, setBusy] = useState(false);
26
+ const [lastMessage, setLastMessage] = useState(null);
27
+ useEffect(() => {
28
+ setPolicy(controller.getSyncPolicy());
29
+ return controller.subscribeSyncConflicts(setConflicts);
30
+ }, [controller]);
31
+ if (!controller.getSyncPort()) {
32
+ return null;
33
+ }
34
+ const onPolicyChange = (next) => {
35
+ controller.setSyncPolicy(next);
36
+ setPolicy(next);
37
+ };
38
+ const onSync = async () => {
39
+ setBusy(true);
40
+ setLastMessage(null);
41
+ try {
42
+ const result = await controller.syncNow();
43
+ if (!result) {
44
+ setLastMessage(t("sync.unavailable"));
45
+ return;
46
+ }
47
+ setLastMessage(
48
+ t("sync.result", {
49
+ pushed: result.pushed,
50
+ pulled: result.pulled,
51
+ conflicts: result.conflicts.length
52
+ })
53
+ );
54
+ setConflicts(controller.getOpenSyncConflicts());
55
+ } finally {
56
+ setBusy(false);
57
+ }
58
+ };
59
+ const onResolve = async (conflictId, choice) => {
60
+ setBusy(true);
61
+ try {
62
+ await controller.resolveSyncConflict(conflictId, choice);
63
+ setConflicts(controller.getOpenSyncConflicts());
64
+ } finally {
65
+ setBusy(false);
66
+ }
67
+ };
68
+ return /* @__PURE__ */ jsxs(
69
+ "aside",
70
+ {
71
+ className: ["pdg-sync-panel", className].filter(Boolean).join(" "),
72
+ "data-pdg-sync-panel": "",
73
+ children: [
74
+ /* @__PURE__ */ jsxs("div", { className: "pdg-sync-panel__row", children: [
75
+ /* @__PURE__ */ jsxs("label", { className: "pdg-sync-panel__policy", children: [
76
+ /* @__PURE__ */ jsx("span", { children: t("sync.policy") }),
77
+ /* @__PURE__ */ jsx(
78
+ "select",
79
+ {
80
+ "data-pdg-sync-policy": "",
81
+ value: policy ?? "lastWriteWins",
82
+ disabled: busy,
83
+ onChange: (e) => onPolicyChange(e.target.value),
84
+ children: POLICIES.map((p) => /* @__PURE__ */ jsx("option", { value: p, children: t(`sync.policy.${p}`) }, p))
85
+ }
86
+ )
87
+ ] }),
88
+ /* @__PURE__ */ jsx(
89
+ "button",
90
+ {
91
+ type: "button",
92
+ "data-pdg-sync-now": "",
93
+ disabled: busy,
94
+ onClick: () => void onSync(),
95
+ children: busy ? t("sync.syncing") : t("sync.now")
96
+ }
97
+ )
98
+ ] }),
99
+ lastMessage ? /* @__PURE__ */ jsx("p", { className: "pdg-sync-panel__status", "data-pdg-sync-status": "", children: lastMessage }) : null,
100
+ conflicts.length > 0 ? /* @__PURE__ */ jsx("ul", { className: "pdg-sync-panel__conflicts", "data-pdg-sync-conflicts": "", children: conflicts.map((c) => /* @__PURE__ */ jsxs("li", { "data-pdg-sync-conflict": c.id, children: [
101
+ /* @__PURE__ */ jsxs("span", { className: "pdg-sync-panel__conflict-key", children: [
102
+ c.key.rowId,
103
+ ":",
104
+ c.key.columnId
105
+ ] }),
106
+ /* @__PURE__ */ jsxs("span", { className: "pdg-sync-panel__conflict-values", children: [
107
+ t("sync.local"),
108
+ ": ",
109
+ String(c.local.value),
110
+ " / ",
111
+ t("sync.remote"),
112
+ ":",
113
+ " ",
114
+ String(c.remote.value)
115
+ ] }),
116
+ policy === "manual" ? /* @__PURE__ */ jsxs("span", { className: "pdg-sync-panel__conflict-actions", children: [
117
+ /* @__PURE__ */ jsx(
118
+ "button",
119
+ {
120
+ type: "button",
121
+ "data-pdg-sync-keep-local": "",
122
+ disabled: busy,
123
+ onClick: () => void onResolve(c.id, "local"),
124
+ children: t("sync.keepLocal")
125
+ }
126
+ ),
127
+ /* @__PURE__ */ jsx(
128
+ "button",
129
+ {
130
+ type: "button",
131
+ "data-pdg-sync-keep-remote": "",
132
+ disabled: busy,
133
+ onClick: () => void onResolve(c.id, "remote"),
134
+ children: t("sync.keepRemote")
135
+ }
136
+ )
137
+ ] }) : null
138
+ ] }, c.id)) }) : null
139
+ ]
140
+ }
141
+ );
142
+ }
143
+
144
+ export { GridSyncPanel };
145
+ //# sourceMappingURL=sync.js.map
146
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../ui/sync/GridSyncPanel.tsx"],"names":[],"mappings":"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","file":"sync.js","sourcesContent":["'use client';\r\n\r\nimport React, { useEffect, useState } from 'react';\r\n\r\nimport type {\r\n ManualResolution,\r\n SyncConflict,\r\n SyncConflictPolicy,\r\n} from '../../application/ports/SyncPort';\r\nimport type { UITableController } from '../../infrastructure/ui/UITableController';\r\nimport { useTranslations } from '../host';\r\n\r\nexport type GridSyncPanelProps = {\r\n controller: UITableController;\r\n className?: string;\r\n};\r\n\r\nconst POLICIES: SyncConflictPolicy[] = [\r\n 'lastWriteWins',\r\n 'serverWins',\r\n 'manual',\r\n];\r\n\r\n/**\r\n * Sync policy + conflict resolution UI (PR-138).\r\n * Requires `createGrid({ syncTransport })`.\r\n */\r\nexport function GridSyncPanel({ controller, className }: GridSyncPanelProps) {\r\n const t = useTranslations();\r\n const [policy, setPolicy] = useState<SyncConflictPolicy | undefined>(() =>\r\n controller.getSyncPolicy(),\r\n );\r\n const [conflicts, setConflicts] = useState<readonly SyncConflict[]>(() =>\r\n controller.getOpenSyncConflicts(),\r\n );\r\n const [busy, setBusy] = useState(false);\r\n const [lastMessage, setLastMessage] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n setPolicy(controller.getSyncPolicy());\r\n return controller.subscribeSyncConflicts(setConflicts);\r\n }, [controller]);\r\n\r\n if (!controller.getSyncPort()) {\r\n return null;\r\n }\r\n\r\n const onPolicyChange = (next: SyncConflictPolicy) => {\r\n controller.setSyncPolicy(next);\r\n setPolicy(next);\r\n };\r\n\r\n const onSync = async () => {\r\n setBusy(true);\r\n setLastMessage(null);\r\n try {\r\n const result = await controller.syncNow();\r\n if (!result) {\r\n setLastMessage(t('sync.unavailable'));\r\n return;\r\n }\r\n setLastMessage(\r\n t('sync.result', {\r\n pushed: result.pushed,\r\n pulled: result.pulled,\r\n conflicts: result.conflicts.length,\r\n }),\r\n );\r\n setConflicts(controller.getOpenSyncConflicts());\r\n } finally {\r\n setBusy(false);\r\n }\r\n };\r\n\r\n const onResolve = async (\r\n conflictId: string,\r\n choice: ManualResolution,\r\n ) => {\r\n setBusy(true);\r\n try {\r\n await controller.resolveSyncConflict(conflictId, choice);\r\n setConflicts(controller.getOpenSyncConflicts());\r\n } finally {\r\n setBusy(false);\r\n }\r\n };\r\n\r\n return (\r\n <aside\r\n className={['pdg-sync-panel', className].filter(Boolean).join(' ')}\r\n data-pdg-sync-panel=\"\"\r\n >\r\n <div className=\"pdg-sync-panel__row\">\r\n <label className=\"pdg-sync-panel__policy\">\r\n <span>{t('sync.policy')}</span>\r\n <select\r\n data-pdg-sync-policy=\"\"\r\n value={policy ?? 'lastWriteWins'}\r\n disabled={busy}\r\n onChange={(e) =>\r\n onPolicyChange(e.target.value as SyncConflictPolicy)\r\n }\r\n >\r\n {POLICIES.map((p) => (\r\n <option key={p} value={p}>\r\n {t(`sync.policy.${p}`)}\r\n </option>\r\n ))}\r\n </select>\r\n </label>\r\n <button\r\n type=\"button\"\r\n data-pdg-sync-now=\"\"\r\n disabled={busy}\r\n onClick={() => void onSync()}\r\n >\r\n {busy ? t('sync.syncing') : t('sync.now')}\r\n </button>\r\n </div>\r\n {lastMessage ? (\r\n <p className=\"pdg-sync-panel__status\" data-pdg-sync-status=\"\">\r\n {lastMessage}\r\n </p>\r\n ) : null}\r\n {conflicts.length > 0 ? (\r\n <ul className=\"pdg-sync-panel__conflicts\" data-pdg-sync-conflicts=\"\">\r\n {conflicts.map((c) => (\r\n <li key={c.id} data-pdg-sync-conflict={c.id}>\r\n <span className=\"pdg-sync-panel__conflict-key\">\r\n {c.key.rowId}:{c.key.columnId}\r\n </span>\r\n <span className=\"pdg-sync-panel__conflict-values\">\r\n {t('sync.local')}: {String(c.local.value)} / {t('sync.remote')}:{' '}\r\n {String(c.remote.value)}\r\n </span>\r\n {policy === 'manual' ? (\r\n <span className=\"pdg-sync-panel__conflict-actions\">\r\n <button\r\n type=\"button\"\r\n data-pdg-sync-keep-local=\"\"\r\n disabled={busy}\r\n onClick={() => void onResolve(c.id, 'local')}\r\n >\r\n {t('sync.keepLocal')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n data-pdg-sync-keep-remote=\"\"\r\n disabled={busy}\r\n onClick={() => void onResolve(c.id, 'remote')}\r\n >\r\n {t('sync.keepRemote')}\r\n </button>\r\n </span>\r\n ) : null}\r\n </li>\r\n ))}\r\n </ul>\r\n ) : null}\r\n </aside>\r\n );\r\n}\r\n"]}
@@ -0,0 +1,23 @@
1
+ /** Locale pack types (PR-127). */
2
+ type ERPTableLocale = 'fa' | 'en' | 'ar';
3
+ type ERPTableMessages = Record<string, string>;
4
+ /** Unicode numbering systems for Intl (PR-127). */
5
+ type NumberingSystem = 'latn' | 'arab' | 'arabext';
6
+ type LocaleMeta = {
7
+ locale: ERPTableLocale;
8
+ /** Default writing direction; host may override. */
9
+ dir: 'rtl' | 'ltr';
10
+ /** BCP 47 tag for Intl. */
11
+ intlLocale: string;
12
+ /** Default digit system. */
13
+ numberingSystem: NumberingSystem;
14
+ /** Default calendar for date display (PR-128 may replace with DateAdapter). */
15
+ calendar: 'persian' | 'gregory' | 'islamic';
16
+ };
17
+ declare const LOCALE_META: Record<ERPTableLocale, LocaleMeta>;
18
+ declare function resolveLocaleMeta(locale: ERPTableLocale, overrides?: {
19
+ numberingSystem?: NumberingSystem;
20
+ }): LocaleMeta;
21
+ declare function resolveDirection(locale: ERPTableLocale, override?: 'rtl' | 'ltr'): 'rtl' | 'ltr';
22
+
23
+ export { type ERPTableLocale as E, LOCALE_META as L, type NumberingSystem as N, type ERPTableMessages as a, type LocaleMeta as b, resolveLocaleMeta as c, resolveDirection as r };
@@ -0,0 +1,23 @@
1
+ /** Locale pack types (PR-127). */
2
+ type ERPTableLocale = 'fa' | 'en' | 'ar';
3
+ type ERPTableMessages = Record<string, string>;
4
+ /** Unicode numbering systems for Intl (PR-127). */
5
+ type NumberingSystem = 'latn' | 'arab' | 'arabext';
6
+ type LocaleMeta = {
7
+ locale: ERPTableLocale;
8
+ /** Default writing direction; host may override. */
9
+ dir: 'rtl' | 'ltr';
10
+ /** BCP 47 tag for Intl. */
11
+ intlLocale: string;
12
+ /** Default digit system. */
13
+ numberingSystem: NumberingSystem;
14
+ /** Default calendar for date display (PR-128 may replace with DateAdapter). */
15
+ calendar: 'persian' | 'gregory' | 'islamic';
16
+ };
17
+ declare const LOCALE_META: Record<ERPTableLocale, LocaleMeta>;
18
+ declare function resolveLocaleMeta(locale: ERPTableLocale, overrides?: {
19
+ numberingSystem?: NumberingSystem;
20
+ }): LocaleMeta;
21
+ declare function resolveDirection(locale: ERPTableLocale, override?: 'rtl' | 'ltr'): 'rtl' | 'ltr';
22
+
23
+ export { type ERPTableLocale as E, LOCALE_META as L, type NumberingSystem as N, type ERPTableMessages as a, type LocaleMeta as b, resolveLocaleMeta as c, resolveDirection as r };