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.
- package/OFL.txt +93 -0
- package/README.md +179 -22
- package/dist/ERPTableGroupRow-J5Z2LRC5.cjs +131 -0
- package/dist/ERPTableGroupRow-J5Z2LRC5.cjs.map +1 -0
- package/dist/ERPTableGroupRow-PSAPAHGL.js +125 -0
- package/dist/ERPTableGroupRow-PSAPAHGL.js.map +1 -0
- package/dist/GridPlugin-CJCaYnlw.d.ts +57 -0
- package/dist/GridPlugin-oxhq8AsM.d.cts +57 -0
- package/dist/GridPresenceService-GEH6535Q.js +3 -0
- package/dist/GridPresenceService-GEH6535Q.js.map +1 -0
- package/dist/GridPresenceService-RDN5FXHQ.cjs +12 -0
- package/dist/GridPresenceService-RDN5FXHQ.cjs.map +1 -0
- package/dist/GridSession-B-9lLcoB.d.cts +2492 -0
- package/dist/GridSession-Bc7UIawO.d.ts +2492 -0
- package/dist/GridSyncService-KTLB4KP3.js +3 -0
- package/dist/GridSyncService-KTLB4KP3.js.map +1 -0
- package/dist/GridSyncService-TAPAHABV.cjs +12 -0
- package/dist/GridSyncService-TAPAHABV.cjs.map +1 -0
- package/dist/PdfRenderer-1HFh6UeR.d.ts +22 -0
- package/dist/PdfRenderer-CBg7hWNS.d.cts +22 -0
- package/dist/RemoteApi-CCQxiSf1.d.cts +28 -0
- package/dist/RemoteApi-CCQxiSf1.d.ts +28 -0
- package/dist/SelectImpl-NM4O4IGW.js +447 -0
- package/dist/SelectImpl-NM4O4IGW.js.map +1 -0
- package/dist/SelectImpl-W2EI4T7O.cjs +453 -0
- package/dist/SelectImpl-W2EI4T7O.cjs.map +1 -0
- package/dist/UITableController-Cuwq481K.d.cts +632 -0
- package/dist/UITableController-DU8RopUM.d.ts +632 -0
- package/dist/VazirmatnPdfRenderer-BCMpC1zy.d.cts +96 -0
- package/dist/VazirmatnPdfRenderer-Dz_G-m3c.d.ts +96 -0
- package/dist/adapters/arian-erp.cjs +77 -0
- package/dist/adapters/arian-erp.cjs.map +1 -0
- package/dist/adapters/arian-erp.d.cts +60 -0
- package/dist/adapters/arian-erp.d.ts +60 -0
- package/dist/adapters/arian-erp.js +71 -0
- package/dist/adapters/arian-erp.js.map +1 -0
- package/dist/appendAtEnd-RHIQRG2W.cjs +35 -0
- package/dist/appendAtEnd-RHIQRG2W.cjs.map +1 -0
- package/dist/appendAtEnd-TJEABLGD.js +33 -0
- package/dist/appendAtEnd-TJEABLGD.js.map +1 -0
- package/dist/applyImportedRows-BO6yxoAN.d.cts +135 -0
- package/dist/applyImportedRows-D4zVY8uD.d.ts +135 -0
- package/dist/applyRowVisibilityHandler-KS6TMCBN.js +83 -0
- package/dist/applyRowVisibilityHandler-KS6TMCBN.js.map +1 -0
- package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs +85 -0
- package/dist/applyRowVisibilityHandler-LXCOGESZ.cjs.map +1 -0
- package/dist/broadcastChannelTransport-FHUMV76O.cjs +12 -0
- package/dist/broadcastChannelTransport-FHUMV76O.cjs.map +1 -0
- package/dist/broadcastChannelTransport-MIH53VNZ.js +3 -0
- package/dist/broadcastChannelTransport-MIH53VNZ.js.map +1 -0
- package/dist/callbackRemoteApi-BlXO5NJz.d.ts +30 -0
- package/dist/callbackRemoteApi-DgnXH-i0.d.cts +30 -0
- package/dist/cellRenderContext-DB7V_mlu.d.ts +42 -0
- package/dist/cellRenderContext-DG5BOlxK.d.cts +42 -0
- package/dist/chunk-2BJCRYOS.cjs +936 -0
- package/dist/chunk-2BJCRYOS.cjs.map +1 -0
- package/dist/chunk-3Y3KKGEC.js +3 -0
- package/dist/chunk-3Y3KKGEC.js.map +1 -0
- package/dist/chunk-5ALMNLUR.cjs +1408 -0
- package/dist/chunk-5ALMNLUR.cjs.map +1 -0
- package/dist/chunk-5HKVMPBD.js +937 -0
- package/dist/chunk-5HKVMPBD.js.map +1 -0
- package/dist/chunk-633KP74Z.js +189 -0
- package/dist/chunk-633KP74Z.js.map +1 -0
- package/dist/chunk-6XBXZPBW.js +298 -0
- package/dist/chunk-6XBXZPBW.js.map +1 -0
- package/dist/chunk-77UXAJII.js +112 -0
- package/dist/chunk-77UXAJII.js.map +1 -0
- package/dist/chunk-ASPTRYRD.cjs +21 -0
- package/dist/chunk-ASPTRYRD.cjs.map +1 -0
- package/dist/chunk-AU3RDJYQ.js +243 -0
- package/dist/chunk-AU3RDJYQ.js.map +1 -0
- package/dist/chunk-BHDRUZH5.cjs +33 -0
- package/dist/chunk-BHDRUZH5.cjs.map +1 -0
- package/dist/chunk-BLYVOV3G.cjs +191 -0
- package/dist/chunk-BLYVOV3G.cjs.map +1 -0
- package/dist/chunk-CILNIWYW.cjs +100 -0
- package/dist/chunk-CILNIWYW.cjs.map +1 -0
- package/dist/chunk-DFFP7SJ6.cjs +257 -0
- package/dist/chunk-DFFP7SJ6.cjs.map +1 -0
- package/dist/chunk-DXRCYW42.cjs +568 -0
- package/dist/chunk-DXRCYW42.cjs.map +1 -0
- package/dist/chunk-EBV6HGZB.cjs +33 -0
- package/dist/chunk-EBV6HGZB.cjs.map +1 -0
- package/dist/chunk-EHHHC5JV.js +832 -0
- package/dist/chunk-EHHHC5JV.js.map +1 -0
- package/dist/chunk-F4PYOYHR.js +112 -0
- package/dist/chunk-F4PYOYHR.js.map +1 -0
- package/dist/chunk-GQEDLUMB.js +168 -0
- package/dist/chunk-GQEDLUMB.js.map +1 -0
- package/dist/chunk-H2LESGMX.cjs +319 -0
- package/dist/chunk-H2LESGMX.cjs.map +1 -0
- package/dist/chunk-HTNJT2QU.js +11674 -0
- package/dist/chunk-HTNJT2QU.js.map +1 -0
- package/dist/chunk-IIISFUW4.cjs +11786 -0
- package/dist/chunk-IIISFUW4.cjs.map +1 -0
- package/dist/chunk-IMPCRWYP.cjs +251 -0
- package/dist/chunk-IMPCRWYP.cjs.map +1 -0
- package/dist/chunk-IPPIXOVQ.js +317 -0
- package/dist/chunk-IPPIXOVQ.js.map +1 -0
- package/dist/chunk-J4XJ4UBC.js +1404 -0
- package/dist/chunk-J4XJ4UBC.js.map +1 -0
- package/dist/chunk-J7CPPFXT.cjs +89 -0
- package/dist/chunk-J7CPPFXT.cjs.map +1 -0
- package/dist/chunk-JOICD47Q.cjs +41 -0
- package/dist/chunk-JOICD47Q.cjs.map +1 -0
- package/dist/chunk-KHMG6EI2.js +13 -0
- package/dist/chunk-KHMG6EI2.js.map +1 -0
- package/dist/chunk-KMRURD5J.cjs +15 -0
- package/dist/chunk-KMRURD5J.cjs.map +1 -0
- package/dist/chunk-KRJG3KMP.cjs +174 -0
- package/dist/chunk-KRJG3KMP.cjs.map +1 -0
- package/dist/chunk-KUBVDIF7.cjs +653 -0
- package/dist/chunk-KUBVDIF7.cjs.map +1 -0
- package/dist/chunk-KYAOSBQN.js +31 -0
- package/dist/chunk-KYAOSBQN.js.map +1 -0
- package/dist/chunk-LJ7LMEXO.js +36 -0
- package/dist/chunk-LJ7LMEXO.js.map +1 -0
- package/dist/chunk-MT3KLB2Q.cjs +944 -0
- package/dist/chunk-MT3KLB2Q.cjs.map +1 -0
- package/dist/chunk-MU3RY46O.js +932 -0
- package/dist/chunk-MU3RY46O.js.map +1 -0
- package/dist/chunk-MUQQKPWR.js +84 -0
- package/dist/chunk-MUQQKPWR.js.map +1 -0
- package/dist/chunk-N7SJTINL.cjs +4 -0
- package/dist/chunk-N7SJTINL.cjs.map +1 -0
- package/dist/chunk-NTV2UUAJ.cjs +149 -0
- package/dist/chunk-NTV2UUAJ.cjs.map +1 -0
- package/dist/chunk-PJQWHF6T.js +31 -0
- package/dist/chunk-PJQWHF6T.js.map +1 -0
- package/dist/chunk-PQY54EL5.js +248 -0
- package/dist/chunk-PQY54EL5.js.map +1 -0
- package/dist/chunk-PXCHPZTP.cjs +839 -0
- package/dist/chunk-PXCHPZTP.cjs.map +1 -0
- package/dist/chunk-Q7TBBUTX.cjs +110 -0
- package/dist/chunk-Q7TBBUTX.cjs.map +1 -0
- package/dist/chunk-QQMU44KJ.js +612 -0
- package/dist/chunk-QQMU44KJ.js.map +1 -0
- package/dist/chunk-QZN7R2WP.cjs +114 -0
- package/dist/chunk-QZN7R2WP.cjs.map +1 -0
- package/dist/chunk-RKVSJU46.js +35 -0
- package/dist/chunk-RKVSJU46.js.map +1 -0
- package/dist/chunk-RM6ZWNT3.js +561 -0
- package/dist/chunk-RM6ZWNT3.js.map +1 -0
- package/dist/chunk-SX4VQXAA.cjs +114 -0
- package/dist/chunk-SX4VQXAA.cjs.map +1 -0
- package/dist/chunk-SZ7BLAY3.js +92 -0
- package/dist/chunk-SZ7BLAY3.js.map +1 -0
- package/dist/chunk-TN4MG6FY.js +112 -0
- package/dist/chunk-TN4MG6FY.js.map +1 -0
- package/dist/chunk-UC7PHDM6.cjs +331 -0
- package/dist/chunk-UC7PHDM6.cjs.map +1 -0
- package/dist/chunk-UXVLYUUW.js +108 -0
- package/dist/chunk-UXVLYUUW.js.map +1 -0
- package/dist/chunk-VVGYRZ7S.cjs +38 -0
- package/dist/chunk-VVGYRZ7S.cjs.map +1 -0
- package/dist/chunk-W5256BJ4.js +56 -0
- package/dist/chunk-W5256BJ4.js.map +1 -0
- package/dist/chunk-WUMOSOEK.cjs +62 -0
- package/dist/chunk-WUMOSOEK.cjs.map +1 -0
- package/dist/chunk-XLRE2J25.js +140 -0
- package/dist/chunk-XLRE2J25.js.map +1 -0
- package/dist/chunk-Y6W5V2CI.js +19 -0
- package/dist/chunk-Y6W5V2CI.js.map +1 -0
- package/dist/chunk-Z4QPZ3Z3.cjs +114 -0
- package/dist/chunk-Z4QPZ3Z3.cjs.map +1 -0
- package/dist/createEngineGridQuery-Dmq3i5v3.d.cts +884 -0
- package/dist/createEngineGridQuery-Mt1hc33m.d.ts +884 -0
- package/dist/date-picker-jalali.cjs +263 -0
- package/dist/date-picker-jalali.cjs.map +1 -0
- package/dist/date-picker-jalali.d.cts +62 -0
- package/dist/date-picker-jalali.d.ts +62 -0
- package/dist/date-picker-jalali.js +256 -0
- package/dist/date-picker-jalali.js.map +1 -0
- package/dist/finance.cjs +205 -0
- package/dist/finance.cjs.map +1 -0
- package/dist/finance.d.cts +90 -0
- package/dist/finance.d.ts +90 -0
- package/dist/finance.js +157 -0
- package/dist/finance.js.map +1 -0
- package/dist/foldedColumn-IHDT4ARZ.cjs +66 -0
- package/dist/foldedColumn-IHDT4ARZ.cjs.map +1 -0
- package/dist/foldedColumn-TFURUKFG.js +64 -0
- package/dist/foldedColumn-TFURUKFG.js.map +1 -0
- package/dist/headless.cjs +729 -0
- package/dist/headless.cjs.map +1 -0
- package/dist/headless.d.cts +504 -0
- package/dist/headless.d.ts +504 -0
- package/dist/headless.js +226 -0
- package/dist/headless.js.map +1 -0
- package/dist/index-DN8M8Jkq.d.cts +14 -0
- package/dist/index-DmzL-F_o.d.ts +14 -0
- package/dist/index.cjs +8002 -11409
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +437 -2305
- package/dist/index.d.ts +437 -2305
- package/dist/index.js +7244 -11083
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.cjs +12 -0
- package/dist/locales/ar.cjs.map +1 -0
- package/dist/locales/ar.d.cts +6 -0
- package/dist/locales/ar.d.ts +6 -0
- package/dist/locales/ar.js +3 -0
- package/dist/locales/ar.js.map +1 -0
- package/dist/locales/en.cjs +12 -0
- package/dist/locales/en.cjs.map +1 -0
- package/dist/locales/en.d.cts +6 -0
- package/dist/locales/en.d.ts +6 -0
- package/dist/locales/en.js +3 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/locales/fa.cjs +12 -0
- package/dist/locales/fa.cjs.map +1 -0
- package/dist/locales/fa.d.cts +6 -0
- package/dist/locales/fa.d.ts +6 -0
- package/dist/locales/fa.js +3 -0
- package/dist/locales/fa.js.map +1 -0
- package/dist/locales/index.cjs +51 -0
- package/dist/locales/index.cjs.map +1 -0
- package/dist/locales/index.d.cts +5 -0
- package/dist/locales/index.d.ts +5 -0
- package/dist/locales/index.js +6 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/memoryRecords-AWDKUJ2F.cjs +50 -0
- package/dist/memoryRecords-AWDKUJ2F.cjs.map +1 -0
- package/dist/memoryRecords-OJTGXLRH.js +47 -0
- package/dist/memoryRecords-OJTGXLRH.js.map +1 -0
- package/dist/pagedFooterTotals-DXCGDO6F.cjs +27 -0
- package/dist/pagedFooterTotals-DXCGDO6F.cjs.map +1 -0
- package/dist/pagedFooterTotals-ORWKUNE7.js +25 -0
- package/dist/pagedFooterTotals-ORWKUNE7.js.map +1 -0
- package/dist/pagedKit-MFGAJFSK.cjs +134 -0
- package/dist/pagedKit-MFGAJFSK.cjs.map +1 -0
- package/dist/pagedKit-WYWY4LRV.js +127 -0
- package/dist/pagedKit-WYWY4LRV.js.map +1 -0
- package/dist/pagedSearch-HCPJW7VM.js +38 -0
- package/dist/pagedSearch-HCPJW7VM.js.map +1 -0
- package/dist/pagedSearch-U3WCG4GN.cjs +42 -0
- package/dist/pagedSearch-U3WCG4GN.cjs.map +1 -0
- package/dist/plugins/csv.cjs +124 -0
- package/dist/plugins/csv.cjs.map +1 -0
- package/dist/plugins/csv.d.cts +44 -0
- package/dist/plugins/csv.d.ts +44 -0
- package/dist/plugins/csv.js +120 -0
- package/dist/plugins/csv.js.map +1 -0
- package/dist/plugins/excel.cjs +52 -0
- package/dist/plugins/excel.cjs.map +1 -0
- package/dist/plugins/excel.d.cts +14 -0
- package/dist/plugins/excel.d.ts +14 -0
- package/dist/plugins/excel.js +7 -0
- package/dist/plugins/excel.js.map +1 -0
- package/dist/plugins/pdf/fonts/vazirmatn.cjs +50 -0
- package/dist/plugins/pdf/fonts/vazirmatn.cjs.map +1 -0
- package/dist/plugins/pdf/fonts/vazirmatn.d.cts +24 -0
- package/dist/plugins/pdf/fonts/vazirmatn.d.ts +24 -0
- package/dist/plugins/pdf/fonts/vazirmatn.js +39 -0
- package/dist/plugins/pdf/fonts/vazirmatn.js.map +1 -0
- package/dist/plugins/pdf.cjs +24 -0
- package/dist/plugins/pdf.cjs.map +1 -0
- package/dist/plugins/pdf.d.cts +21 -0
- package/dist/plugins/pdf.d.ts +21 -0
- package/dist/plugins/pdf.js +7 -0
- package/dist/plugins/pdf.js.map +1 -0
- package/dist/presence.cjs +56 -0
- package/dist/presence.cjs.map +1 -0
- package/dist/presence.d.cts +17 -0
- package/dist/presence.d.ts +17 -0
- package/dist/presence.js +54 -0
- package/dist/presence.js.map +1 -0
- package/dist/rebuildRowVisibility-66EAZ356.cjs +21 -0
- package/dist/rebuildRowVisibility-66EAZ356.cjs.map +1 -0
- package/dist/rebuildRowVisibility-6TYM5BP2.js +19 -0
- package/dist/rebuildRowVisibility-6TYM5BP2.js.map +1 -0
- package/dist/styles.css +1440 -0
- package/dist/sync.cjs +148 -0
- package/dist/sync.cjs.map +1 -0
- package/dist/sync.d.cts +17 -0
- package/dist/sync.d.ts +17 -0
- package/dist/sync.js +146 -0
- package/dist/sync.js.map +1 -0
- package/dist/types-D__47BKv.d.cts +23 -0
- package/dist/types-D__47BKv.d.ts +23 -0
- package/package.json +184 -28
package/dist/sync.cjs
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkKUBVDIF7_cjs = require('./chunk-KUBVDIF7.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 = chunkKUBVDIF7_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"]}
|
package/dist/sync.d.cts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
import { U as UITableController } from './UITableController-Cuwq481K.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-Cuwq481K.cjs';
|
|
4
|
+
import './GridSession-B-9lLcoB.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-DU8RopUM.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-DU8RopUM.js';
|
|
4
|
+
import './GridSession-Bc7UIawO.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-QQMU44KJ.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
|
package/dist/sync.js.map
ADDED
|
@@ -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 };
|