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.
- package/OFL.txt +93 -0
- package/README.md +179 -22
- package/dist/ERPTableGroupRow-E5Q6FYDS.js +125 -0
- package/dist/ERPTableGroupRow-E5Q6FYDS.js.map +1 -0
- package/dist/ERPTableGroupRow-F2IPDYL5.cjs +131 -0
- package/dist/ERPTableGroupRow-F2IPDYL5.cjs.map +1 -0
- package/dist/GridPlugin-Bewn0X51.d.ts +57 -0
- package/dist/GridPlugin-DewWufGZ.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-CeIfVFck.d.ts +2625 -0
- package/dist/GridSession-CmQn2RnL.d.cts +2625 -0
- package/dist/GridSyncService-3JQLEY65.cjs +12 -0
- package/dist/GridSyncService-3JQLEY65.cjs.map +1 -0
- package/dist/GridSyncService-GECXGEKL.js +3 -0
- package/dist/GridSyncService-GECXGEKL.js.map +1 -0
- package/dist/PdfRenderer-B9FJaCo_.d.cts +22 -0
- package/dist/PdfRenderer-bN7ca_Aj.d.ts +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-C71LXBiX.d.ts +678 -0
- package/dist/UITableController-CIwnHIw8.d.cts +678 -0
- package/dist/VazirmatnPdfRenderer-CpCqA-Wh.d.cts +96 -0
- package/dist/VazirmatnPdfRenderer-D46smncn.d.ts +96 -0
- package/dist/adapters/arian-erp.cjs +89 -0
- package/dist/adapters/arian-erp.cjs.map +1 -0
- package/dist/adapters/arian-erp.d.cts +62 -0
- package/dist/adapters/arian-erp.d.ts +62 -0
- package/dist/adapters/arian-erp.js +79 -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-C2fWYoPy.d.cts +135 -0
- package/dist/applyImportedRows-Cqh_N_0k.d.ts +135 -0
- package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs +86 -0
- package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs.map +1 -0
- package/dist/applyRowVisibilityHandler-ZLZXQEGY.js +84 -0
- package/dist/applyRowVisibilityHandler-ZLZXQEGY.js.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-BYLjmSI6.d.ts +51 -0
- package/dist/callbackRemoteApi-Cv26MmSD.d.cts +51 -0
- package/dist/cellRenderContext-BaNh4qn_.d.ts +42 -0
- package/dist/cellRenderContext-DvngkptV.d.cts +42 -0
- package/dist/chunk-27ALJSZP.js +12187 -0
- package/dist/chunk-27ALJSZP.js.map +1 -0
- package/dist/chunk-3HP3HQCW.cjs +688 -0
- package/dist/chunk-3HP3HQCW.cjs.map +1 -0
- package/dist/chunk-3Y3KKGEC.js +3 -0
- package/dist/chunk-3Y3KKGEC.js.map +1 -0
- package/dist/chunk-52LFOPXD.cjs +588 -0
- package/dist/chunk-52LFOPXD.cjs.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-72IVAOTK.cjs +38 -0
- package/dist/chunk-72IVAOTK.cjs.map +1 -0
- package/dist/chunk-77UXAJII.js +112 -0
- package/dist/chunk-77UXAJII.js.map +1 -0
- package/dist/chunk-7GWV5HGO.js +36 -0
- package/dist/chunk-7GWV5HGO.js.map +1 -0
- package/dist/chunk-7T6AWRPU.js +581 -0
- package/dist/chunk-7T6AWRPU.js.map +1 -0
- package/dist/chunk-AU3RDJYQ.js +243 -0
- package/dist/chunk-AU3RDJYQ.js.map +1 -0
- package/dist/chunk-CILNIWYW.cjs +100 -0
- package/dist/chunk-CILNIWYW.cjs.map +1 -0
- package/dist/chunk-CMQ4VLCW.cjs +840 -0
- package/dist/chunk-CMQ4VLCW.cjs.map +1 -0
- package/dist/chunk-DFFP7SJ6.cjs +257 -0
- package/dist/chunk-DFFP7SJ6.cjs.map +1 -0
- package/dist/chunk-E2J533UH.cjs +53 -0
- package/dist/chunk-E2J533UH.cjs.map +1 -0
- package/dist/chunk-EBV6HGZB.cjs +33 -0
- package/dist/chunk-EBV6HGZB.cjs.map +1 -0
- package/dist/chunk-F4PYOYHR.js +112 -0
- package/dist/chunk-F4PYOYHR.js.map +1 -0
- package/dist/chunk-F6EMC75A.cjs +34 -0
- package/dist/chunk-F6EMC75A.cjs.map +1 -0
- package/dist/chunk-GKE33FOJ.js +32 -0
- package/dist/chunk-GKE33FOJ.js.map +1 -0
- package/dist/chunk-GQEDLUMB.js +168 -0
- package/dist/chunk-GQEDLUMB.js.map +1 -0
- package/dist/chunk-HLOHWFOA.js +645 -0
- package/dist/chunk-HLOHWFOA.js.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-KCNTKYUY.js +206 -0
- package/dist/chunk-KCNTKYUY.js.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-LY27YAXE.cjs +208 -0
- package/dist/chunk-LY27YAXE.cjs.map +1 -0
- package/dist/chunk-MT3KLB2Q.cjs +944 -0
- package/dist/chunk-MT3KLB2Q.cjs.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-NB5GCGHL.js +833 -0
- package/dist/chunk-NB5GCGHL.js.map +1 -0
- package/dist/chunk-NQUVAJQA.js +298 -0
- package/dist/chunk-NQUVAJQA.js.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-Q7TBBUTX.cjs +110 -0
- package/dist/chunk-Q7TBBUTX.cjs.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-SVO62ZV2.js +50 -0
- package/dist/chunk-SVO62ZV2.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-VBAZ77Q4.js +932 -0
- package/dist/chunk-VBAZ77Q4.js.map +1 -0
- package/dist/chunk-VSAFQTW5.cjs +319 -0
- package/dist/chunk-VSAFQTW5.cjs.map +1 -0
- package/dist/chunk-VYJQ2HTA.cjs +936 -0
- package/dist/chunk-VYJQ2HTA.cjs.map +1 -0
- package/dist/chunk-W5256BJ4.js +56 -0
- package/dist/chunk-W5256BJ4.js.map +1 -0
- package/dist/chunk-WTHTVKVI.cjs +12299 -0
- package/dist/chunk-WTHTVKVI.cjs.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-Z4QPZ3Z3.cjs +114 -0
- package/dist/chunk-Z4QPZ3Z3.cjs.map +1 -0
- package/dist/createEngineGridQuery-BBkud5oE.d.ts +939 -0
- package/dist/createEngineGridQuery-D-fgO_jg.d.cts +939 -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 +508 -0
- package/dist/headless.d.ts +508 -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 +8060 -11409
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +457 -2305
- package/dist/index.d.ts +457 -2305
- package/dist/index.js +7302 -11084
- 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 +185 -29
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { G as GridPlugin, a as GridPluginContext, E as ExportSource } from './GridPlugin-DewWufGZ.cjs';
|
|
2
|
+
import { P as PdfRenderer, a as PdfRenderOptions } from './PdfRenderer-B9FJaCo_.cjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Document PDF template options (PR-141).
|
|
6
|
+
* Consumed by {@link VazirmatnPdfRenderer} for ERP voucher-style output.
|
|
7
|
+
*/
|
|
8
|
+
type DocumentPdfLogo = {
|
|
9
|
+
/** Raw JPEG bytes (DCTDecode). PNG is not supported in this slice. */
|
|
10
|
+
jpegBytes: Uint8Array;
|
|
11
|
+
/** Display width in PDF points. Default 64. */
|
|
12
|
+
width?: number;
|
|
13
|
+
/** Display height in PDF points. Default 48. */
|
|
14
|
+
height?: number;
|
|
15
|
+
};
|
|
16
|
+
type DocumentPdfHeader = {
|
|
17
|
+
/** Primary header title (defaults to render `title` option). */
|
|
18
|
+
title?: string;
|
|
19
|
+
subtitle?: string;
|
|
20
|
+
/** Extra meta lines (doc no, date, …). */
|
|
21
|
+
meta?: readonly string[];
|
|
22
|
+
};
|
|
23
|
+
type DocumentPdfFooter = {
|
|
24
|
+
text?: string;
|
|
25
|
+
/** Default true when a template is provided. */
|
|
26
|
+
showPageNumber?: boolean;
|
|
27
|
+
/** Tokens: `{page}` `{pages}`. Default `{page} / {pages}`. */
|
|
28
|
+
pageNumberFormat?: string;
|
|
29
|
+
};
|
|
30
|
+
type DocumentPdfSignature = {
|
|
31
|
+
label?: string;
|
|
32
|
+
/** Blank ruled lines under the label. Default 2. */
|
|
33
|
+
lines?: number;
|
|
34
|
+
};
|
|
35
|
+
type DocumentPdfStamp = {
|
|
36
|
+
label?: string;
|
|
37
|
+
};
|
|
38
|
+
type DocumentPdfPageTotals = {
|
|
39
|
+
/** Column fieldNames to sum on each page (price/number). */
|
|
40
|
+
columns: readonly string[];
|
|
41
|
+
label?: string;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* ERP document chrome for Persian PDF export.
|
|
45
|
+
* When omitted, {@link VazirmatnPdfRenderer} keeps the simple title + table layout.
|
|
46
|
+
*/
|
|
47
|
+
type DocumentPdfTemplate = {
|
|
48
|
+
header?: DocumentPdfHeader;
|
|
49
|
+
footer?: DocumentPdfFooter;
|
|
50
|
+
logo?: DocumentPdfLogo;
|
|
51
|
+
/** Repeat column headers on every page. Default true. */
|
|
52
|
+
repeatTableHeader?: boolean;
|
|
53
|
+
signature?: DocumentPdfSignature;
|
|
54
|
+
stamp?: DocumentPdfStamp;
|
|
55
|
+
pageTotals?: DocumentPdfPageTotals;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
type PdfExportPluginOptions = {
|
|
59
|
+
renderer?: PdfRenderer;
|
|
60
|
+
download?: boolean;
|
|
61
|
+
/** Document chrome for VazirmatnPdfRenderer (PR-141). */
|
|
62
|
+
template?: DocumentPdfTemplate;
|
|
63
|
+
onBlob?: (blob: Blob, meta: {
|
|
64
|
+
fileName: string;
|
|
65
|
+
rowCount: number;
|
|
66
|
+
}) => void;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Subscribes to EXPORT_REQUESTED (format=pdf); Domain stays untouched.
|
|
70
|
+
*
|
|
71
|
+
* Default renderer is legacy `TextPdfRenderer` so `./plugins/pdf` stays free of
|
|
72
|
+
* font bytes (PR-76 / D15). For Persian PDF:
|
|
73
|
+
* `import { createVazirmatnPdfExportPlugin } from 'persian-data-grid/plugins/pdf/fonts/vazirmatn'`.
|
|
74
|
+
*/
|
|
75
|
+
declare class PdfExportPlugin implements GridPlugin {
|
|
76
|
+
private readonly options;
|
|
77
|
+
readonly name = "pdf-export";
|
|
78
|
+
private unsub;
|
|
79
|
+
private readonly renderer;
|
|
80
|
+
constructor(options?: PdfExportPluginOptions);
|
|
81
|
+
register(ctx: GridPluginContext): void;
|
|
82
|
+
dispose(): void;
|
|
83
|
+
private onEvent;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Persian table PDF: embeds Vazirmatn (OFL) as CIDFontType2, RTL grid, no 8×40 cap.
|
|
88
|
+
* PR-141: optional {@link DocumentPdfTemplate} for document chrome.
|
|
89
|
+
*/
|
|
90
|
+
declare class VazirmatnPdfRenderer implements PdfRenderer {
|
|
91
|
+
private readonly fontBytes;
|
|
92
|
+
constructor(fontBytes: Uint8Array);
|
|
93
|
+
render(source: ExportSource, options?: PdfRenderOptions): Promise<Blob>;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export { type DocumentPdfFooter as D, type PdfExportPluginOptions as P, VazirmatnPdfRenderer as V, PdfExportPlugin as a, type DocumentPdfHeader as b, type DocumentPdfLogo as c, type DocumentPdfPageTotals as d, type DocumentPdfSignature as e, type DocumentPdfStamp as f, type DocumentPdfTemplate as g };
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { G as GridPlugin, a as GridPluginContext, E as ExportSource } from './GridPlugin-Bewn0X51.js';
|
|
2
|
+
import { P as PdfRenderer, a as PdfRenderOptions } from './PdfRenderer-bN7ca_Aj.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Document PDF template options (PR-141).
|
|
6
|
+
* Consumed by {@link VazirmatnPdfRenderer} for ERP voucher-style output.
|
|
7
|
+
*/
|
|
8
|
+
type DocumentPdfLogo = {
|
|
9
|
+
/** Raw JPEG bytes (DCTDecode). PNG is not supported in this slice. */
|
|
10
|
+
jpegBytes: Uint8Array;
|
|
11
|
+
/** Display width in PDF points. Default 64. */
|
|
12
|
+
width?: number;
|
|
13
|
+
/** Display height in PDF points. Default 48. */
|
|
14
|
+
height?: number;
|
|
15
|
+
};
|
|
16
|
+
type DocumentPdfHeader = {
|
|
17
|
+
/** Primary header title (defaults to render `title` option). */
|
|
18
|
+
title?: string;
|
|
19
|
+
subtitle?: string;
|
|
20
|
+
/** Extra meta lines (doc no, date, …). */
|
|
21
|
+
meta?: readonly string[];
|
|
22
|
+
};
|
|
23
|
+
type DocumentPdfFooter = {
|
|
24
|
+
text?: string;
|
|
25
|
+
/** Default true when a template is provided. */
|
|
26
|
+
showPageNumber?: boolean;
|
|
27
|
+
/** Tokens: `{page}` `{pages}`. Default `{page} / {pages}`. */
|
|
28
|
+
pageNumberFormat?: string;
|
|
29
|
+
};
|
|
30
|
+
type DocumentPdfSignature = {
|
|
31
|
+
label?: string;
|
|
32
|
+
/** Blank ruled lines under the label. Default 2. */
|
|
33
|
+
lines?: number;
|
|
34
|
+
};
|
|
35
|
+
type DocumentPdfStamp = {
|
|
36
|
+
label?: string;
|
|
37
|
+
};
|
|
38
|
+
type DocumentPdfPageTotals = {
|
|
39
|
+
/** Column fieldNames to sum on each page (price/number). */
|
|
40
|
+
columns: readonly string[];
|
|
41
|
+
label?: string;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* ERP document chrome for Persian PDF export.
|
|
45
|
+
* When omitted, {@link VazirmatnPdfRenderer} keeps the simple title + table layout.
|
|
46
|
+
*/
|
|
47
|
+
type DocumentPdfTemplate = {
|
|
48
|
+
header?: DocumentPdfHeader;
|
|
49
|
+
footer?: DocumentPdfFooter;
|
|
50
|
+
logo?: DocumentPdfLogo;
|
|
51
|
+
/** Repeat column headers on every page. Default true. */
|
|
52
|
+
repeatTableHeader?: boolean;
|
|
53
|
+
signature?: DocumentPdfSignature;
|
|
54
|
+
stamp?: DocumentPdfStamp;
|
|
55
|
+
pageTotals?: DocumentPdfPageTotals;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
type PdfExportPluginOptions = {
|
|
59
|
+
renderer?: PdfRenderer;
|
|
60
|
+
download?: boolean;
|
|
61
|
+
/** Document chrome for VazirmatnPdfRenderer (PR-141). */
|
|
62
|
+
template?: DocumentPdfTemplate;
|
|
63
|
+
onBlob?: (blob: Blob, meta: {
|
|
64
|
+
fileName: string;
|
|
65
|
+
rowCount: number;
|
|
66
|
+
}) => void;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Subscribes to EXPORT_REQUESTED (format=pdf); Domain stays untouched.
|
|
70
|
+
*
|
|
71
|
+
* Default renderer is legacy `TextPdfRenderer` so `./plugins/pdf` stays free of
|
|
72
|
+
* font bytes (PR-76 / D15). For Persian PDF:
|
|
73
|
+
* `import { createVazirmatnPdfExportPlugin } from 'persian-data-grid/plugins/pdf/fonts/vazirmatn'`.
|
|
74
|
+
*/
|
|
75
|
+
declare class PdfExportPlugin implements GridPlugin {
|
|
76
|
+
private readonly options;
|
|
77
|
+
readonly name = "pdf-export";
|
|
78
|
+
private unsub;
|
|
79
|
+
private readonly renderer;
|
|
80
|
+
constructor(options?: PdfExportPluginOptions);
|
|
81
|
+
register(ctx: GridPluginContext): void;
|
|
82
|
+
dispose(): void;
|
|
83
|
+
private onEvent;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Persian table PDF: embeds Vazirmatn (OFL) as CIDFontType2, RTL grid, no 8×40 cap.
|
|
88
|
+
* PR-141: optional {@link DocumentPdfTemplate} for document chrome.
|
|
89
|
+
*/
|
|
90
|
+
declare class VazirmatnPdfRenderer implements PdfRenderer {
|
|
91
|
+
private readonly fontBytes;
|
|
92
|
+
constructor(fontBytes: Uint8Array);
|
|
93
|
+
render(source: ExportSource, options?: PdfRenderOptions): Promise<Blob>;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export { type DocumentPdfFooter as D, type PdfExportPluginOptions as P, VazirmatnPdfRenderer as V, PdfExportPlugin as a, type DocumentPdfHeader as b, type DocumentPdfLogo as c, type DocumentPdfPageTotals as d, type DocumentPdfSignature as e, type DocumentPdfStamp as f, type DocumentPdfTemplate as g };
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkE2J533UH_cjs = require('../chunk-E2J533UH.cjs');
|
|
4
|
+
|
|
5
|
+
// infrastructure/Repositories/fetchRemoteApi.ts
|
|
6
|
+
function readCookie(name) {
|
|
7
|
+
if (typeof document === "undefined") return "";
|
|
8
|
+
const cookies = document.cookie.split(";");
|
|
9
|
+
const cookie = cookies.find((item) => item.trim().startsWith(`${name}=`));
|
|
10
|
+
if (!cookie) return "";
|
|
11
|
+
return cookie.trim().slice(name.length + 1);
|
|
12
|
+
}
|
|
13
|
+
function readErpDefaults() {
|
|
14
|
+
if (typeof window === "undefined") return {};
|
|
15
|
+
try {
|
|
16
|
+
const storage = localStorage.getItem("persist:arianERP");
|
|
17
|
+
const parsedStorage = JSON.parse(storage ?? "{}");
|
|
18
|
+
const parsedConfig = JSON.parse(parsedStorage.config ?? "{}");
|
|
19
|
+
return parsedConfig.defaultConfigs ?? {};
|
|
20
|
+
} catch {
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function joinUrl(baseUrl, endpoint) {
|
|
25
|
+
if (/^https?:\/\//i.test(endpoint)) return endpoint;
|
|
26
|
+
const base = baseUrl.replace(/\/$/, "");
|
|
27
|
+
const path = endpoint.startsWith("/") ? endpoint : `/${endpoint}`;
|
|
28
|
+
return `${base}${path}`;
|
|
29
|
+
}
|
|
30
|
+
var FetchRemoteApi = class {
|
|
31
|
+
constructor(err, options = {}) {
|
|
32
|
+
this.err = err;
|
|
33
|
+
this.options = options;
|
|
34
|
+
}
|
|
35
|
+
async request(input) {
|
|
36
|
+
try {
|
|
37
|
+
const defaults = this.options.getDefaults?.() ?? readErpDefaults();
|
|
38
|
+
const token = this.options.getToken ? this.options.getToken() ?? "" : readCookie("_auth");
|
|
39
|
+
const method = input.method ?? "POST";
|
|
40
|
+
const url = joinUrl(this.options.baseUrl ?? "", input.endpoint);
|
|
41
|
+
const payload = method === "GET" ? void 0 : {
|
|
42
|
+
...input.params ?? {},
|
|
43
|
+
Defaults: {
|
|
44
|
+
CurrencyId: defaults.CurrencyId?.id,
|
|
45
|
+
CashierId: defaults.CashierId?.id,
|
|
46
|
+
PlaceId: defaults.PlaceId?.id,
|
|
47
|
+
YearId: defaults.YearId?.id,
|
|
48
|
+
LangId: defaults.LanguageId?.id
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const headers = {
|
|
52
|
+
"Content-Type": "application/json"
|
|
53
|
+
};
|
|
54
|
+
if (token) headers.Authorization = `Bearer ${token}`;
|
|
55
|
+
const res = await (this.options.fetcher ?? fetch)(url, {
|
|
56
|
+
method,
|
|
57
|
+
headers,
|
|
58
|
+
body: payload ? JSON.stringify(payload) : void 0
|
|
59
|
+
});
|
|
60
|
+
if (!res.ok) {
|
|
61
|
+
throw new Error(
|
|
62
|
+
`RemoteApi request failed: HTTP ${res.status} ${input.endpoint}`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
return await res.json();
|
|
67
|
+
} catch {
|
|
68
|
+
throw new Error(
|
|
69
|
+
`RemoteApi response is not valid JSON: HTTP ${res.status} ${input.endpoint}`
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
} catch (error) {
|
|
73
|
+
this.err?.handle(error, "FetchRemoteApi.request");
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
Object.defineProperty(exports, "CallbackRemoteApi", {
|
|
80
|
+
enumerable: true,
|
|
81
|
+
get: function () { return chunkE2J533UH_cjs.CallbackRemoteApi; }
|
|
82
|
+
});
|
|
83
|
+
Object.defineProperty(exports, "createBaseQueryRemoteApi", {
|
|
84
|
+
enumerable: true,
|
|
85
|
+
get: function () { return chunkE2J533UH_cjs.createBaseQueryRemoteApi; }
|
|
86
|
+
});
|
|
87
|
+
exports.FetchRemoteApi = FetchRemoteApi;
|
|
88
|
+
//# sourceMappingURL=arian-erp.cjs.map
|
|
89
|
+
//# sourceMappingURL=arian-erp.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../infrastructure/Repositories/fetchRemoteApi.ts"],"names":[],"mappings":"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","file":"arian-erp.cjs","sourcesContent":["import { EngineErrorHandler } from '../../engine/EngineErrorHandler';\nimport { RemoteApi } from '../../application/ports/RemoteApi';\n\nexport type ErpDefaults = {\n PlaceId?: { id?: number };\n YearId?: { id?: number };\n LanguageId?: { id?: number };\n CashierId?: { id?: number };\n CurrencyId?: { id?: number };\n};\n\nfunction readCookie(name: string): string {\n if (typeof document === 'undefined') return '';\n const cookies = document.cookie.split(';');\n const cookie = cookies.find((item) => item.trim().startsWith(`${name}=`));\n if (!cookie) return '';\n return cookie.trim().slice(name.length + 1);\n}\n\nfunction readErpDefaults(): ErpDefaults {\n if (typeof window === 'undefined') return {};\n try {\n const storage = localStorage.getItem('persist:arianERP');\n const parsedStorage = JSON.parse(storage ?? '{}');\n const parsedConfig = JSON.parse(parsedStorage.config ?? '{}');\n return parsedConfig.defaultConfigs ?? {};\n } catch {\n return {};\n }\n}\n\nfunction joinUrl(baseUrl: string, endpoint: string): string {\n if (/^https?:\\/\\//i.test(endpoint)) return endpoint;\n const base = baseUrl.replace(/\\/$/, '');\n const path = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n return `${base}${path}`;\n}\n\n/**\n * Host-injected RemoteApi for arianERP.\n * Not the package default — pass `remoteApi={new FetchRemoteApi()}` from the ERP host.\n * Reads auth cookie `_auth` and redux-persist `persist:arianERP`, then POSTs JSON\n * (relative URLs work on the ERP host).\n * Non-2xx responses and non-JSON bodies reject with an `Error` naming the HTTP\n * status and endpoint (also reported through the optional error handler).\n * See `examples/host-arian-erp/host-arian-erp.md`.\n */\nexport type FetchRemoteApiOptions = {\n baseUrl?: string;\n /** Inject the bearer token (e.g. from the host's auth store). Default: cookie `_auth`. */\n getToken?: () => string | undefined | null;\n /** Inject ERP defaults (e.g. from Redux). Default: localStorage `persist:arianERP`. */\n getDefaults?: () => ErpDefaults;\n /** Custom fetch (tests, interceptors, token refresh). Default: global `fetch`. */\n fetcher?: typeof fetch;\n};\n\nexport class FetchRemoteApi implements RemoteApi {\n constructor(\n private readonly err?: EngineErrorHandler,\n private readonly options: FetchRemoteApiOptions = {},\n ) {}\n\n async request<TResponse = unknown>(input: {\n endpoint: string;\n params?: Record<string, unknown>;\n method?: 'GET' | 'POST';\n }): Promise<TResponse> {\n try {\n const defaults = this.options.getDefaults?.() ?? readErpDefaults();\n const token = this.options.getToken\n ? (this.options.getToken() ?? '')\n : readCookie('_auth');\n const method = input.method ?? 'POST';\n const url = joinUrl(this.options.baseUrl ?? '', input.endpoint);\n const payload =\n method === 'GET'\n ? undefined\n : {\n ...(input.params ?? {}),\n Defaults: {\n CurrencyId: defaults.CurrencyId?.id,\n CashierId: defaults.CashierId?.id,\n PlaceId: defaults.PlaceId?.id,\n YearId: defaults.YearId?.id,\n LangId: defaults.LanguageId?.id,\n },\n };\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const res = await (this.options.fetcher ?? fetch)(url, {\n method,\n headers,\n body: payload ? JSON.stringify(payload) : undefined,\n });\n if (!res.ok) {\n // Never hand an error body to callers as if it were data.\n throw new Error(\n `RemoteApi request failed: HTTP ${res.status} ${input.endpoint}`,\n );\n }\n try {\n return (await res.json()) as TResponse;\n } catch {\n throw new Error(\n `RemoteApi response is not valid JSON: HTTP ${res.status} ${input.endpoint}`,\n );\n }\n } catch (error) {\n this.err?.handle(error, 'FetchRemoteApi.request');\n throw error;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { C as ConsoleAuditLogger, R as RemoteApi } from '../RemoteApi-CCQxiSf1.cjs';
|
|
2
|
+
export { B as BaseQueryResult, C as CallbackRemoteApi, R as RemoteApiRequest, c as createBaseQueryRemoteApi } from '../callbackRemoteApi-Cv26MmSD.cjs';
|
|
3
|
+
|
|
4
|
+
declare class EngineErrorHandler {
|
|
5
|
+
private readonly audit;
|
|
6
|
+
constructor(audit: ConsoleAuditLogger);
|
|
7
|
+
/**
|
|
8
|
+
* همهی خطاها — چه DomainError چه runtime error — از اینجا رد میشن
|
|
9
|
+
* و از طریق ConsoleAuditLogger لاگ میشن.
|
|
10
|
+
*/
|
|
11
|
+
handle(error: unknown, context?: string): void;
|
|
12
|
+
/** برای جاهایی که store یا table پیدا نشد */
|
|
13
|
+
notFound(entity: string, key: string, context?: string): void;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type ErpDefaults = {
|
|
17
|
+
PlaceId?: {
|
|
18
|
+
id?: number;
|
|
19
|
+
};
|
|
20
|
+
YearId?: {
|
|
21
|
+
id?: number;
|
|
22
|
+
};
|
|
23
|
+
LanguageId?: {
|
|
24
|
+
id?: number;
|
|
25
|
+
};
|
|
26
|
+
CashierId?: {
|
|
27
|
+
id?: number;
|
|
28
|
+
};
|
|
29
|
+
CurrencyId?: {
|
|
30
|
+
id?: number;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Host-injected RemoteApi for arianERP.
|
|
35
|
+
* Not the package default — pass `remoteApi={new FetchRemoteApi()}` from the ERP host.
|
|
36
|
+
* Reads auth cookie `_auth` and redux-persist `persist:arianERP`, then POSTs JSON
|
|
37
|
+
* (relative URLs work on the ERP host).
|
|
38
|
+
* Non-2xx responses and non-JSON bodies reject with an `Error` naming the HTTP
|
|
39
|
+
* status and endpoint (also reported through the optional error handler).
|
|
40
|
+
* See `examples/host-arian-erp/host-arian-erp.md`.
|
|
41
|
+
*/
|
|
42
|
+
type FetchRemoteApiOptions = {
|
|
43
|
+
baseUrl?: string;
|
|
44
|
+
/** Inject the bearer token (e.g. from the host's auth store). Default: cookie `_auth`. */
|
|
45
|
+
getToken?: () => string | undefined | null;
|
|
46
|
+
/** Inject ERP defaults (e.g. from Redux). Default: localStorage `persist:arianERP`. */
|
|
47
|
+
getDefaults?: () => ErpDefaults;
|
|
48
|
+
/** Custom fetch (tests, interceptors, token refresh). Default: global `fetch`. */
|
|
49
|
+
fetcher?: typeof fetch;
|
|
50
|
+
};
|
|
51
|
+
declare class FetchRemoteApi implements RemoteApi {
|
|
52
|
+
private readonly err?;
|
|
53
|
+
private readonly options;
|
|
54
|
+
constructor(err?: EngineErrorHandler | undefined, options?: FetchRemoteApiOptions);
|
|
55
|
+
request<TResponse = unknown>(input: {
|
|
56
|
+
endpoint: string;
|
|
57
|
+
params?: Record<string, unknown>;
|
|
58
|
+
method?: 'GET' | 'POST';
|
|
59
|
+
}): Promise<TResponse>;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { type ErpDefaults, FetchRemoteApi, type FetchRemoteApiOptions };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { C as ConsoleAuditLogger, R as RemoteApi } from '../RemoteApi-CCQxiSf1.js';
|
|
2
|
+
export { B as BaseQueryResult, C as CallbackRemoteApi, R as RemoteApiRequest, c as createBaseQueryRemoteApi } from '../callbackRemoteApi-BYLjmSI6.js';
|
|
3
|
+
|
|
4
|
+
declare class EngineErrorHandler {
|
|
5
|
+
private readonly audit;
|
|
6
|
+
constructor(audit: ConsoleAuditLogger);
|
|
7
|
+
/**
|
|
8
|
+
* همهی خطاها — چه DomainError چه runtime error — از اینجا رد میشن
|
|
9
|
+
* و از طریق ConsoleAuditLogger لاگ میشن.
|
|
10
|
+
*/
|
|
11
|
+
handle(error: unknown, context?: string): void;
|
|
12
|
+
/** برای جاهایی که store یا table پیدا نشد */
|
|
13
|
+
notFound(entity: string, key: string, context?: string): void;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type ErpDefaults = {
|
|
17
|
+
PlaceId?: {
|
|
18
|
+
id?: number;
|
|
19
|
+
};
|
|
20
|
+
YearId?: {
|
|
21
|
+
id?: number;
|
|
22
|
+
};
|
|
23
|
+
LanguageId?: {
|
|
24
|
+
id?: number;
|
|
25
|
+
};
|
|
26
|
+
CashierId?: {
|
|
27
|
+
id?: number;
|
|
28
|
+
};
|
|
29
|
+
CurrencyId?: {
|
|
30
|
+
id?: number;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Host-injected RemoteApi for arianERP.
|
|
35
|
+
* Not the package default — pass `remoteApi={new FetchRemoteApi()}` from the ERP host.
|
|
36
|
+
* Reads auth cookie `_auth` and redux-persist `persist:arianERP`, then POSTs JSON
|
|
37
|
+
* (relative URLs work on the ERP host).
|
|
38
|
+
* Non-2xx responses and non-JSON bodies reject with an `Error` naming the HTTP
|
|
39
|
+
* status and endpoint (also reported through the optional error handler).
|
|
40
|
+
* See `examples/host-arian-erp/host-arian-erp.md`.
|
|
41
|
+
*/
|
|
42
|
+
type FetchRemoteApiOptions = {
|
|
43
|
+
baseUrl?: string;
|
|
44
|
+
/** Inject the bearer token (e.g. from the host's auth store). Default: cookie `_auth`. */
|
|
45
|
+
getToken?: () => string | undefined | null;
|
|
46
|
+
/** Inject ERP defaults (e.g. from Redux). Default: localStorage `persist:arianERP`. */
|
|
47
|
+
getDefaults?: () => ErpDefaults;
|
|
48
|
+
/** Custom fetch (tests, interceptors, token refresh). Default: global `fetch`. */
|
|
49
|
+
fetcher?: typeof fetch;
|
|
50
|
+
};
|
|
51
|
+
declare class FetchRemoteApi implements RemoteApi {
|
|
52
|
+
private readonly err?;
|
|
53
|
+
private readonly options;
|
|
54
|
+
constructor(err?: EngineErrorHandler | undefined, options?: FetchRemoteApiOptions);
|
|
55
|
+
request<TResponse = unknown>(input: {
|
|
56
|
+
endpoint: string;
|
|
57
|
+
params?: Record<string, unknown>;
|
|
58
|
+
method?: 'GET' | 'POST';
|
|
59
|
+
}): Promise<TResponse>;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { type ErpDefaults, FetchRemoteApi, type FetchRemoteApiOptions };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export { CallbackRemoteApi, createBaseQueryRemoteApi } from '../chunk-SVO62ZV2.js';
|
|
2
|
+
|
|
3
|
+
// infrastructure/Repositories/fetchRemoteApi.ts
|
|
4
|
+
function readCookie(name) {
|
|
5
|
+
if (typeof document === "undefined") return "";
|
|
6
|
+
const cookies = document.cookie.split(";");
|
|
7
|
+
const cookie = cookies.find((item) => item.trim().startsWith(`${name}=`));
|
|
8
|
+
if (!cookie) return "";
|
|
9
|
+
return cookie.trim().slice(name.length + 1);
|
|
10
|
+
}
|
|
11
|
+
function readErpDefaults() {
|
|
12
|
+
if (typeof window === "undefined") return {};
|
|
13
|
+
try {
|
|
14
|
+
const storage = localStorage.getItem("persist:arianERP");
|
|
15
|
+
const parsedStorage = JSON.parse(storage ?? "{}");
|
|
16
|
+
const parsedConfig = JSON.parse(parsedStorage.config ?? "{}");
|
|
17
|
+
return parsedConfig.defaultConfigs ?? {};
|
|
18
|
+
} catch {
|
|
19
|
+
return {};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function joinUrl(baseUrl, endpoint) {
|
|
23
|
+
if (/^https?:\/\//i.test(endpoint)) return endpoint;
|
|
24
|
+
const base = baseUrl.replace(/\/$/, "");
|
|
25
|
+
const path = endpoint.startsWith("/") ? endpoint : `/${endpoint}`;
|
|
26
|
+
return `${base}${path}`;
|
|
27
|
+
}
|
|
28
|
+
var FetchRemoteApi = class {
|
|
29
|
+
constructor(err, options = {}) {
|
|
30
|
+
this.err = err;
|
|
31
|
+
this.options = options;
|
|
32
|
+
}
|
|
33
|
+
async request(input) {
|
|
34
|
+
try {
|
|
35
|
+
const defaults = this.options.getDefaults?.() ?? readErpDefaults();
|
|
36
|
+
const token = this.options.getToken ? this.options.getToken() ?? "" : readCookie("_auth");
|
|
37
|
+
const method = input.method ?? "POST";
|
|
38
|
+
const url = joinUrl(this.options.baseUrl ?? "", input.endpoint);
|
|
39
|
+
const payload = method === "GET" ? void 0 : {
|
|
40
|
+
...input.params ?? {},
|
|
41
|
+
Defaults: {
|
|
42
|
+
CurrencyId: defaults.CurrencyId?.id,
|
|
43
|
+
CashierId: defaults.CashierId?.id,
|
|
44
|
+
PlaceId: defaults.PlaceId?.id,
|
|
45
|
+
YearId: defaults.YearId?.id,
|
|
46
|
+
LangId: defaults.LanguageId?.id
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const headers = {
|
|
50
|
+
"Content-Type": "application/json"
|
|
51
|
+
};
|
|
52
|
+
if (token) headers.Authorization = `Bearer ${token}`;
|
|
53
|
+
const res = await (this.options.fetcher ?? fetch)(url, {
|
|
54
|
+
method,
|
|
55
|
+
headers,
|
|
56
|
+
body: payload ? JSON.stringify(payload) : void 0
|
|
57
|
+
});
|
|
58
|
+
if (!res.ok) {
|
|
59
|
+
throw new Error(
|
|
60
|
+
`RemoteApi request failed: HTTP ${res.status} ${input.endpoint}`
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
return await res.json();
|
|
65
|
+
} catch {
|
|
66
|
+
throw new Error(
|
|
67
|
+
`RemoteApi response is not valid JSON: HTTP ${res.status} ${input.endpoint}`
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
} catch (error) {
|
|
71
|
+
this.err?.handle(error, "FetchRemoteApi.request");
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export { FetchRemoteApi };
|
|
78
|
+
//# sourceMappingURL=arian-erp.js.map
|
|
79
|
+
//# sourceMappingURL=arian-erp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../infrastructure/Repositories/fetchRemoteApi.ts"],"names":[],"mappings":"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","file":"arian-erp.js","sourcesContent":["import { EngineErrorHandler } from '../../engine/EngineErrorHandler';\nimport { RemoteApi } from '../../application/ports/RemoteApi';\n\nexport type ErpDefaults = {\n PlaceId?: { id?: number };\n YearId?: { id?: number };\n LanguageId?: { id?: number };\n CashierId?: { id?: number };\n CurrencyId?: { id?: number };\n};\n\nfunction readCookie(name: string): string {\n if (typeof document === 'undefined') return '';\n const cookies = document.cookie.split(';');\n const cookie = cookies.find((item) => item.trim().startsWith(`${name}=`));\n if (!cookie) return '';\n return cookie.trim().slice(name.length + 1);\n}\n\nfunction readErpDefaults(): ErpDefaults {\n if (typeof window === 'undefined') return {};\n try {\n const storage = localStorage.getItem('persist:arianERP');\n const parsedStorage = JSON.parse(storage ?? '{}');\n const parsedConfig = JSON.parse(parsedStorage.config ?? '{}');\n return parsedConfig.defaultConfigs ?? {};\n } catch {\n return {};\n }\n}\n\nfunction joinUrl(baseUrl: string, endpoint: string): string {\n if (/^https?:\\/\\//i.test(endpoint)) return endpoint;\n const base = baseUrl.replace(/\\/$/, '');\n const path = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n return `${base}${path}`;\n}\n\n/**\n * Host-injected RemoteApi for arianERP.\n * Not the package default — pass `remoteApi={new FetchRemoteApi()}` from the ERP host.\n * Reads auth cookie `_auth` and redux-persist `persist:arianERP`, then POSTs JSON\n * (relative URLs work on the ERP host).\n * Non-2xx responses and non-JSON bodies reject with an `Error` naming the HTTP\n * status and endpoint (also reported through the optional error handler).\n * See `examples/host-arian-erp/host-arian-erp.md`.\n */\nexport type FetchRemoteApiOptions = {\n baseUrl?: string;\n /** Inject the bearer token (e.g. from the host's auth store). Default: cookie `_auth`. */\n getToken?: () => string | undefined | null;\n /** Inject ERP defaults (e.g. from Redux). Default: localStorage `persist:arianERP`. */\n getDefaults?: () => ErpDefaults;\n /** Custom fetch (tests, interceptors, token refresh). Default: global `fetch`. */\n fetcher?: typeof fetch;\n};\n\nexport class FetchRemoteApi implements RemoteApi {\n constructor(\n private readonly err?: EngineErrorHandler,\n private readonly options: FetchRemoteApiOptions = {},\n ) {}\n\n async request<TResponse = unknown>(input: {\n endpoint: string;\n params?: Record<string, unknown>;\n method?: 'GET' | 'POST';\n }): Promise<TResponse> {\n try {\n const defaults = this.options.getDefaults?.() ?? readErpDefaults();\n const token = this.options.getToken\n ? (this.options.getToken() ?? '')\n : readCookie('_auth');\n const method = input.method ?? 'POST';\n const url = joinUrl(this.options.baseUrl ?? '', input.endpoint);\n const payload =\n method === 'GET'\n ? undefined\n : {\n ...(input.params ?? {}),\n Defaults: {\n CurrencyId: defaults.CurrencyId?.id,\n CashierId: defaults.CashierId?.id,\n PlaceId: defaults.PlaceId?.id,\n YearId: defaults.YearId?.id,\n LangId: defaults.LanguageId?.id,\n },\n };\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const res = await (this.options.fetcher ?? fetch)(url, {\n method,\n headers,\n body: payload ? JSON.stringify(payload) : undefined,\n });\n if (!res.ok) {\n // Never hand an error body to callers as if it were data.\n throw new Error(\n `RemoteApi request failed: HTTP ${res.status} ${input.endpoint}`,\n );\n }\n try {\n return (await res.json()) as TResponse;\n } catch {\n throw new Error(\n `RemoteApi response is not valid JSON: HTTP ${res.status} ${input.endpoint}`,\n );\n }\n } catch (error) {\n this.err?.handle(error, 'FetchRemoteApi.request');\n throw error;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkNTV2UUAJ_cjs = require('./chunk-NTV2UUAJ.cjs');
|
|
4
|
+
|
|
5
|
+
// application/handlers/appendAtEnd.ts
|
|
6
|
+
async function appendAtEndAndShowLastPage(repo, store, tableKey, table, data) {
|
|
7
|
+
let maxIndex = 0;
|
|
8
|
+
let existingCount = 0;
|
|
9
|
+
await repo.iterateRowRecords(store, tableKey, "active", async (records) => {
|
|
10
|
+
for (const rec of records) {
|
|
11
|
+
existingCount += 1;
|
|
12
|
+
const n = Number(rec.cells["index"]?.value ?? 0);
|
|
13
|
+
if (Number.isFinite(n) && n > maxIndex) maxIndex = n;
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
const nextIndex = maxIndex + 1;
|
|
17
|
+
const newTotal = Math.max(table.getPagination().totalRows, existingCount) + 1;
|
|
18
|
+
const pageSize = Math.max(1, table.getPagination().pageSize);
|
|
19
|
+
const lastPage = Math.max(1, Math.ceil(newTotal / pageSize));
|
|
20
|
+
const event = table.addNewRow(data, nextIndex);
|
|
21
|
+
table.setPagination(new chunkNTV2UUAJ_cjs.Pagination(lastPage, pageSize, newTotal));
|
|
22
|
+
await repo.save(store, table);
|
|
23
|
+
const loaded = await repo.loadPage(store, tableKey, lastPage, pageSize);
|
|
24
|
+
if (loaded) {
|
|
25
|
+
if (loaded.getPagination().totalRows !== newTotal || loaded.getPagination().page !== lastPage) {
|
|
26
|
+
loaded.setPagination(new chunkNTV2UUAJ_cjs.Pagination(lastPage, pageSize, newTotal));
|
|
27
|
+
await repo.save(store, loaded);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return event;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
exports.appendAtEndAndShowLastPage = appendAtEndAndShowLastPage;
|
|
34
|
+
//# sourceMappingURL=appendAtEnd-RHIQRG2W.cjs.map
|
|
35
|
+
//# sourceMappingURL=appendAtEnd-RHIQRG2W.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../application/handlers/appendAtEnd.ts"],"names":["Pagination"],"mappings":";;;;;AAcA,eAAsB,0BAAA,CACpB,IAAA,EACA,KAAA,EACA,QAAA,EACA,OACA,IAAA,EACmB;AACnB,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,MAAM,KAAK,iBAAA,CAAkB,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,OAAM,OAAA,KAAW;AACvE,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,aAAA,IAAiB,CAAA;AAGjB,MAAA,MAAM,IAAI,MAAA,CAAO,GAAA,CAAI,MAAM,OAAO,CAAA,EAAG,SAAS,CAAC,CAAA;AAC/C,MAAA,IAAI,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,GAAI,UAAU,QAAA,GAAW,CAAA;AAAA,IACrD;AAAA,EACF,CAAC,CAAA;AACD,EAAA,MAAM,YAAY,QAAA,GAAW,CAAA;AAG7B,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,KAAA,CAAM,eAAc,CAAE,SAAA,EAAW,aAAa,CAAA,GAAI,CAAA;AAC5E,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,aAAA,GAAgB,QAAQ,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,QAAA,GAAW,QAAQ,CAAC,CAAA;AAE3D,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,IAAA,EAAM,SAAS,CAAA;AAE7C,EAAA,KAAA,CAAM,cAAc,IAAIA,4BAAA,CAAW,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAC,CAAA;AAEhE,EAAA,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAE5B,EAAA,MAAM,SAAS,MAAM,IAAA,CAAK,SAAS,KAAA,EAAO,QAAA,EAAU,UAAU,QAAQ,CAAA;AACtE,EAAA,IAAI,MAAA,EAAQ;AAEV,IAAA,IACE,MAAA,CAAO,eAAc,CAAE,SAAA,KAAc,YACrC,MAAA,CAAO,aAAA,EAAc,CAAE,IAAA,KAAS,QAAA,EAChC;AACA,MAAA,MAAA,CAAO,cAAc,IAAIA,4BAAA,CAAW,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAC,CAAA;AACjE,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT","file":"appendAtEnd-RHIQRG2W.cjs","sourcesContent":["// application/handlers/appendAtEnd.ts — page-window ('paged-idb') helper.\r\nimport { RowAdded } from '../../domain/events';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport { KeyValue, Pagination } from '../../domain/value-objects';\r\nimport { WindowedTableRepository } from '../ports/TableRepository';\r\n\r\n/**\r\n * Append a row at the end of the full dataset (IndexedDB SoT), bump totalRows,\r\n * then load the last page into the RAM window so UI/pagination stay correct.\r\n *\r\n * Memory Iron Rule: max index + row count are computed with ONE streaming\r\n * cursor pass over IndexedDB (batch-bounded heap) — never a full getAllRows\r\n * hydration of the dataset.\r\n */\r\nexport async function appendAtEndAndShowLastPage(\r\n repo: WindowedTableRepository,\r\n store: string,\r\n tableKey: string,\r\n table: Table,\r\n data?: KeyValue[],\r\n): Promise<RowAdded> {\r\n let maxIndex = 0;\r\n let existingCount = 0;\r\n await repo.iterateRowRecords(store, tableKey, 'active', async records => {\r\n for (const rec of records) {\r\n existingCount += 1;\r\n // Same semantics as the former getAllRows reduce: cell 'index' value,\r\n // 0 when missing/non-numeric.\r\n const n = Number(rec.cells['index']?.value ?? 0);\r\n if (Number.isFinite(n) && n > maxIndex) maxIndex = n;\r\n }\r\n });\r\n const nextIndex = maxIndex + 1;\r\n\r\n // Meta may be stale (stuck at pageSize); trust the larger of meta vs real count\r\n const newTotal = Math.max(table.getPagination().totalRows, existingCount) + 1;\r\n const pageSize = Math.max(1, table.getPagination().pageSize);\r\n const lastPage = Math.max(1, Math.ceil(newTotal / pageSize));\r\n\r\n const event = table.addNewRow(data, nextIndex);\r\n // Force correct totals/page (addNewRow may have used a stale base totalRows)\r\n table.setPagination(new Pagination(lastPage, pageSize, newTotal));\r\n\r\n await repo.save(store, table);\r\n\r\n const loaded = await repo.loadPage(store, tableKey, lastPage, pageSize);\r\n if (loaded) {\r\n // Ensure RAM window carries the corrected pagination after load\r\n if (\r\n loaded.getPagination().totalRows !== newTotal ||\r\n loaded.getPagination().page !== lastPage\r\n ) {\r\n loaded.setPagination(new Pagination(lastPage, pageSize, newTotal));\r\n await repo.save(store, loaded);\r\n }\r\n }\r\n\r\n return event;\r\n}\r\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Pagination } from './chunk-XLRE2J25.js';
|
|
2
|
+
|
|
3
|
+
// application/handlers/appendAtEnd.ts
|
|
4
|
+
async function appendAtEndAndShowLastPage(repo, store, tableKey, table, data) {
|
|
5
|
+
let maxIndex = 0;
|
|
6
|
+
let existingCount = 0;
|
|
7
|
+
await repo.iterateRowRecords(store, tableKey, "active", async (records) => {
|
|
8
|
+
for (const rec of records) {
|
|
9
|
+
existingCount += 1;
|
|
10
|
+
const n = Number(rec.cells["index"]?.value ?? 0);
|
|
11
|
+
if (Number.isFinite(n) && n > maxIndex) maxIndex = n;
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
const nextIndex = maxIndex + 1;
|
|
15
|
+
const newTotal = Math.max(table.getPagination().totalRows, existingCount) + 1;
|
|
16
|
+
const pageSize = Math.max(1, table.getPagination().pageSize);
|
|
17
|
+
const lastPage = Math.max(1, Math.ceil(newTotal / pageSize));
|
|
18
|
+
const event = table.addNewRow(data, nextIndex);
|
|
19
|
+
table.setPagination(new Pagination(lastPage, pageSize, newTotal));
|
|
20
|
+
await repo.save(store, table);
|
|
21
|
+
const loaded = await repo.loadPage(store, tableKey, lastPage, pageSize);
|
|
22
|
+
if (loaded) {
|
|
23
|
+
if (loaded.getPagination().totalRows !== newTotal || loaded.getPagination().page !== lastPage) {
|
|
24
|
+
loaded.setPagination(new Pagination(lastPage, pageSize, newTotal));
|
|
25
|
+
await repo.save(store, loaded);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return event;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { appendAtEndAndShowLastPage };
|
|
32
|
+
//# sourceMappingURL=appendAtEnd-TJEABLGD.js.map
|
|
33
|
+
//# sourceMappingURL=appendAtEnd-TJEABLGD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../application/handlers/appendAtEnd.ts"],"names":[],"mappings":";;;AAcA,eAAsB,0BAAA,CACpB,IAAA,EACA,KAAA,EACA,QAAA,EACA,OACA,IAAA,EACmB;AACnB,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,MAAM,KAAK,iBAAA,CAAkB,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,OAAM,OAAA,KAAW;AACvE,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,aAAA,IAAiB,CAAA;AAGjB,MAAA,MAAM,IAAI,MAAA,CAAO,GAAA,CAAI,MAAM,OAAO,CAAA,EAAG,SAAS,CAAC,CAAA;AAC/C,MAAA,IAAI,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,GAAI,UAAU,QAAA,GAAW,CAAA;AAAA,IACrD;AAAA,EACF,CAAC,CAAA;AACD,EAAA,MAAM,YAAY,QAAA,GAAW,CAAA;AAG7B,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,KAAA,CAAM,eAAc,CAAE,SAAA,EAAW,aAAa,CAAA,GAAI,CAAA;AAC5E,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,aAAA,GAAgB,QAAQ,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,QAAA,GAAW,QAAQ,CAAC,CAAA;AAE3D,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,IAAA,EAAM,SAAS,CAAA;AAE7C,EAAA,KAAA,CAAM,cAAc,IAAI,UAAA,CAAW,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAC,CAAA;AAEhE,EAAA,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAE5B,EAAA,MAAM,SAAS,MAAM,IAAA,CAAK,SAAS,KAAA,EAAO,QAAA,EAAU,UAAU,QAAQ,CAAA;AACtE,EAAA,IAAI,MAAA,EAAQ;AAEV,IAAA,IACE,MAAA,CAAO,eAAc,CAAE,SAAA,KAAc,YACrC,MAAA,CAAO,aAAA,EAAc,CAAE,IAAA,KAAS,QAAA,EAChC;AACA,MAAA,MAAA,CAAO,cAAc,IAAI,UAAA,CAAW,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAC,CAAA;AACjE,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT","file":"appendAtEnd-TJEABLGD.js","sourcesContent":["// application/handlers/appendAtEnd.ts — page-window ('paged-idb') helper.\r\nimport { RowAdded } from '../../domain/events';\r\nimport { Table } from '../../domain/entities/Table';\r\nimport { KeyValue, Pagination } from '../../domain/value-objects';\r\nimport { WindowedTableRepository } from '../ports/TableRepository';\r\n\r\n/**\r\n * Append a row at the end of the full dataset (IndexedDB SoT), bump totalRows,\r\n * then load the last page into the RAM window so UI/pagination stay correct.\r\n *\r\n * Memory Iron Rule: max index + row count are computed with ONE streaming\r\n * cursor pass over IndexedDB (batch-bounded heap) — never a full getAllRows\r\n * hydration of the dataset.\r\n */\r\nexport async function appendAtEndAndShowLastPage(\r\n repo: WindowedTableRepository,\r\n store: string,\r\n tableKey: string,\r\n table: Table,\r\n data?: KeyValue[],\r\n): Promise<RowAdded> {\r\n let maxIndex = 0;\r\n let existingCount = 0;\r\n await repo.iterateRowRecords(store, tableKey, 'active', async records => {\r\n for (const rec of records) {\r\n existingCount += 1;\r\n // Same semantics as the former getAllRows reduce: cell 'index' value,\r\n // 0 when missing/non-numeric.\r\n const n = Number(rec.cells['index']?.value ?? 0);\r\n if (Number.isFinite(n) && n > maxIndex) maxIndex = n;\r\n }\r\n });\r\n const nextIndex = maxIndex + 1;\r\n\r\n // Meta may be stale (stuck at pageSize); trust the larger of meta vs real count\r\n const newTotal = Math.max(table.getPagination().totalRows, existingCount) + 1;\r\n const pageSize = Math.max(1, table.getPagination().pageSize);\r\n const lastPage = Math.max(1, Math.ceil(newTotal / pageSize));\r\n\r\n const event = table.addNewRow(data, nextIndex);\r\n // Force correct totals/page (addNewRow may have used a stale base totalRows)\r\n table.setPagination(new Pagination(lastPage, pageSize, newTotal));\r\n\r\n await repo.save(store, table);\r\n\r\n const loaded = await repo.loadPage(store, tableKey, lastPage, pageSize);\r\n if (loaded) {\r\n // Ensure RAM window carries the corrected pagination after load\r\n if (\r\n loaded.getPagination().totalRows !== newTotal ||\r\n loaded.getPagination().page !== lastPage\r\n ) {\r\n loaded.setPagination(new Pagination(lastPage, pageSize, newTotal));\r\n await repo.save(store, loaded);\r\n }\r\n }\r\n\r\n return event;\r\n}\r\n"]}
|