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,149 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// domain/value-objects/Viewport.ts
|
|
4
|
+
var Viewport = class _Viewport {
|
|
5
|
+
constructor(scrollOffset, viewportSize, rowHeight, overscan = 2) {
|
|
6
|
+
this.scrollOffset = scrollOffset;
|
|
7
|
+
this.viewportSize = viewportSize;
|
|
8
|
+
this.rowHeight = rowHeight;
|
|
9
|
+
this.overscan = overscan;
|
|
10
|
+
if (viewportSize <= 0) throw new Error("Viewport.viewportSize must be > 0");
|
|
11
|
+
if (rowHeight <= 0) throw new Error("Viewport.rowHeight must be > 0");
|
|
12
|
+
if (overscan < 0) throw new Error("Viewport.overscan must be >= 0");
|
|
13
|
+
if (scrollOffset < 0) throw new Error("Viewport.scrollOffset must be >= 0");
|
|
14
|
+
}
|
|
15
|
+
equals(other) {
|
|
16
|
+
return this.scrollOffset === other.scrollOffset && this.viewportSize === other.viewportSize && this.rowHeight === other.rowHeight && this.overscan === other.overscan;
|
|
17
|
+
}
|
|
18
|
+
withScrollOffset(scrollOffset) {
|
|
19
|
+
return new _Viewport(
|
|
20
|
+
Math.max(0, scrollOffset),
|
|
21
|
+
this.viewportSize,
|
|
22
|
+
this.rowHeight,
|
|
23
|
+
this.overscan
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
withViewportSize(viewportSize) {
|
|
27
|
+
return new _Viewport(
|
|
28
|
+
this.scrollOffset,
|
|
29
|
+
viewportSize,
|
|
30
|
+
this.rowHeight,
|
|
31
|
+
this.overscan
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
toJSON() {
|
|
35
|
+
return {
|
|
36
|
+
scrollOffset: this.scrollOffset,
|
|
37
|
+
viewportSize: this.viewportSize,
|
|
38
|
+
rowHeight: this.rowHeight,
|
|
39
|
+
overscan: this.overscan
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// domain/value-objects/index.ts
|
|
45
|
+
var CellValue = class {
|
|
46
|
+
constructor(value) {
|
|
47
|
+
this.value = value;
|
|
48
|
+
}
|
|
49
|
+
equals(other) {
|
|
50
|
+
return this.value === other.value;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
var CellDisplay = class {
|
|
54
|
+
constructor(value) {
|
|
55
|
+
this.value = value;
|
|
56
|
+
}
|
|
57
|
+
equals(other) {
|
|
58
|
+
return this.value === other.value;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
var _ColumnId = class _ColumnId {
|
|
62
|
+
constructor(value) {
|
|
63
|
+
this.value = value;
|
|
64
|
+
}
|
|
65
|
+
/** Shared instance per field name (PR-101) — avoids 100k×cols ColumnId objects. */
|
|
66
|
+
static for(value) {
|
|
67
|
+
let id = _ColumnId.interned.get(value);
|
|
68
|
+
if (!id) {
|
|
69
|
+
id = new _ColumnId(value);
|
|
70
|
+
_ColumnId.interned.set(value, id);
|
|
71
|
+
}
|
|
72
|
+
return id;
|
|
73
|
+
}
|
|
74
|
+
equals(other) {
|
|
75
|
+
return this.value === other.value;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
_ColumnId.interned = /* @__PURE__ */ new Map();
|
|
79
|
+
var ColumnId = _ColumnId;
|
|
80
|
+
var RowId = class {
|
|
81
|
+
constructor(value) {
|
|
82
|
+
this.value = value;
|
|
83
|
+
}
|
|
84
|
+
equals(other) {
|
|
85
|
+
return this.value === other.value;
|
|
86
|
+
}
|
|
87
|
+
set(id) {
|
|
88
|
+
this.value = id.value;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
var RowState = class {
|
|
92
|
+
constructor(value) {
|
|
93
|
+
this.value = value;
|
|
94
|
+
}
|
|
95
|
+
equals(other) {
|
|
96
|
+
return this.value === other;
|
|
97
|
+
}
|
|
98
|
+
set(rowState) {
|
|
99
|
+
this.value = rowState;
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
var RowStateEnum = /* @__PURE__ */ ((RowStateEnum2) => {
|
|
103
|
+
RowStateEnum2["Added"] = "Add";
|
|
104
|
+
RowStateEnum2["Modified"] = "Update";
|
|
105
|
+
RowStateEnum2["Deleted"] = "Delete";
|
|
106
|
+
RowStateEnum2["Unchanged"] = "None";
|
|
107
|
+
return RowStateEnum2;
|
|
108
|
+
})(RowStateEnum || {});
|
|
109
|
+
var Pagination = class _Pagination {
|
|
110
|
+
constructor(page, pageSize, totalRows) {
|
|
111
|
+
this.page = page;
|
|
112
|
+
this.pageSize = pageSize;
|
|
113
|
+
this.totalRows = totalRows;
|
|
114
|
+
this.totalPages = Math.max(1, Math.ceil(totalRows / pageSize));
|
|
115
|
+
this.canPrev = page > 1;
|
|
116
|
+
this.canNext = page < this.totalPages;
|
|
117
|
+
}
|
|
118
|
+
changePage(page) {
|
|
119
|
+
return new _Pagination(page, this.pageSize, this.totalRows);
|
|
120
|
+
}
|
|
121
|
+
changePageSize(size) {
|
|
122
|
+
return new _Pagination(
|
|
123
|
+
Math.min(this.page, Math.ceil(this.totalRows / size)),
|
|
124
|
+
size,
|
|
125
|
+
this.totalRows
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
toJSON() {
|
|
129
|
+
return {
|
|
130
|
+
page: this.page,
|
|
131
|
+
pageSize: this.pageSize,
|
|
132
|
+
totalRows: this.totalRows,
|
|
133
|
+
totalPages: this.totalPages,
|
|
134
|
+
canPrev: this.canPrev,
|
|
135
|
+
canNext: this.canNext
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
exports.CellDisplay = CellDisplay;
|
|
141
|
+
exports.CellValue = CellValue;
|
|
142
|
+
exports.ColumnId = ColumnId;
|
|
143
|
+
exports.Pagination = Pagination;
|
|
144
|
+
exports.RowId = RowId;
|
|
145
|
+
exports.RowState = RowState;
|
|
146
|
+
exports.RowStateEnum = RowStateEnum;
|
|
147
|
+
exports.Viewport = Viewport;
|
|
148
|
+
//# sourceMappingURL=chunk-NTV2UUAJ.cjs.map
|
|
149
|
+
//# sourceMappingURL=chunk-NTV2UUAJ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../domain/value-objects/Viewport.ts","../domain/value-objects/index.ts"],"names":["RowStateEnum"],"mappings":"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","file":"chunk-NTV2UUAJ.cjs","sourcesContent":["/**\r\n * View-state value object for virtual scrolling.\r\n * Lives in Domain types but is NOT an accounting invariant — Adapters drive it.\r\n */\r\nexport class Viewport {\r\n constructor(\r\n /** Vertical scroll offset in pixels. */\r\n public readonly scrollOffset: number,\r\n /** Visible viewport height in pixels. */\r\n public readonly viewportSize: number,\r\n /** Fixed row height in pixels (variable-height later). */\r\n public readonly rowHeight: number,\r\n /** Extra rows rendered above/below the window. */\r\n public readonly overscan: number = 2,\r\n ) {\r\n if (viewportSize <= 0) throw new Error('Viewport.viewportSize must be > 0');\r\n if (rowHeight <= 0) throw new Error('Viewport.rowHeight must be > 0');\r\n if (overscan < 0) throw new Error('Viewport.overscan must be >= 0');\r\n if (scrollOffset < 0) throw new Error('Viewport.scrollOffset must be >= 0');\r\n }\r\n\r\n equals(other: Viewport): boolean {\r\n return (\r\n this.scrollOffset === other.scrollOffset &&\r\n this.viewportSize === other.viewportSize &&\r\n this.rowHeight === other.rowHeight &&\r\n this.overscan === other.overscan\r\n );\r\n }\r\n\r\n withScrollOffset(scrollOffset: number): Viewport {\r\n return new Viewport(\r\n Math.max(0, scrollOffset),\r\n this.viewportSize,\r\n this.rowHeight,\r\n this.overscan,\r\n );\r\n }\r\n\r\n withViewportSize(viewportSize: number): Viewport {\r\n return new Viewport(\r\n this.scrollOffset,\r\n viewportSize,\r\n this.rowHeight,\r\n this.overscan,\r\n );\r\n }\r\n\r\n toJSON() {\r\n return {\r\n scrollOffset: this.scrollOffset,\r\n viewportSize: this.viewportSize,\r\n rowHeight: this.rowHeight,\r\n overscan: this.overscan,\r\n };\r\n }\r\n}\r\n\r\n/** Inclusive start, exclusive end — indices into the ordered row list. */\r\nexport type VisibleRange = {\r\n readonly startIndex: number;\r\n readonly endIndex: number;\r\n readonly startOffset: number;\r\n readonly endOffset: number;\r\n readonly totalHeight: number;\r\n readonly visibleCount: number;\r\n};\r\n","//domain/value-object\r\nexport class CellValue {\r\n constructor(public readonly value: unknown) {}\r\n\r\n equals(other: CellValue) {\r\n return this.value === other.value;\r\n }\r\n}\r\nexport class CellDisplay {\r\n constructor(public readonly value: unknown) {}\r\n\r\n equals(other: CellDisplay) {\r\n return this.value === other.value;\r\n }\r\n}\r\n\r\nexport class ColumnId {\r\n private static readonly interned = new Map<string, ColumnId>();\r\n\r\n constructor(public readonly value: string) { }\r\n\r\n /** Shared instance per field name (PR-101) — avoids 100k×cols ColumnId objects. */\r\n static for(value: string): ColumnId {\r\n let id = ColumnId.interned.get(value);\r\n if (!id) {\r\n id = new ColumnId(value);\r\n ColumnId.interned.set(value, id);\r\n }\r\n return id;\r\n }\r\n\r\n equals(other: ColumnId) {\r\n return this.value === other.value;\r\n }\r\n}\r\nexport type SelectOption = {\r\n label: string;\r\n value: string | number;\r\n};\r\nexport type KeyValue = {\r\n key: string;\r\n value: unknown;\r\n display: unknown;\r\n};\r\n\r\nexport type IRule = {\r\n type?:\r\n | string\r\n | \"array\"\r\n | \"object\"\r\n | \"enum\"\r\n | \"date\"\r\n | \"number\"\r\n | \"integer\"\r\n | \"float\"\r\n | \"boolean\"\r\n | \"email\"\r\n | \"url\"\r\n | \"hex\"\r\n | RegExp;\r\n required?: boolean;\r\n requiredIf?: () => boolean;\r\n whitespace?: boolean;\r\n message?: string;\r\n transform?: (value: unknown) => unknown;\r\n pattern?: string | RegExp;\r\n min?: number;\r\n max?: number;\r\n len?: number;\r\n enum?: unknown[];\r\n validator?: (rule: IRule, value: unknown, callback: (error?: string[]) => void) => void | Promise<void>;\r\n asyncValidator?: (rule: IRule, value: unknown) => Promise<void>;\r\n warningOnly?: boolean;\r\n validateTrigger?: string | string[];\r\n};\r\nexport class RowId {\r\n constructor(public value: number) {}\r\n equals(other: RowId) {\r\n return this.value === other.value;\r\n }\r\n set(id: RowId) {\r\n this.value = id.value;\r\n }\r\n}\r\nexport class TableId {\r\n constructor(public value: string) {}\r\n equals(other: TableId) {\r\n return this.value === other.value;\r\n }\r\n set(id: TableId) {\r\n this.value = id.value;\r\n }\r\n}\r\nexport class RowState {\r\n constructor(public value: RowStateEnum) {}\r\n equals(other: RowStateEnum) {\r\n return this.value === other;\r\n }\r\n set(rowState: RowStateEnum) {\r\n this.value = rowState;\r\n }\r\n}\r\n\r\nexport enum RowStateEnum {\r\n Added = \"Add\",\r\n Modified = \"Update\",\r\n Deleted = \"Delete\",\r\n Unchanged = \"None\",\r\n}\r\nexport enum RowOriginEnum {\r\n Persisted = \"Add\",\r\n New = \"Update\",\r\n}\r\nexport type TableActions = \"copy\" | \"cut\" | \"paste\" | \"pasteInsert\" | null\r\n\r\nexport { Viewport } from './Viewport';\r\nexport type { VisibleRange } from './Viewport';\r\n\r\nexport class Pagination {\r\n public readonly totalRows: number;\r\n public readonly totalPages: number;\r\n public readonly canPrev: boolean;\r\n public readonly canNext: boolean;\r\n\r\n constructor(\r\n public readonly page: number,\r\n public readonly pageSize: number,\r\n totalRows: number,\r\n ) {\r\n this.totalRows = totalRows;\r\n this.totalPages = Math.max(1, Math.ceil(totalRows / pageSize));\r\n this.canPrev = page > 1;\r\n this.canNext = page < this.totalPages;\r\n }\r\n\r\n changePage(page: number): Pagination {\r\n return new Pagination(page, this.pageSize, this.totalRows);\r\n }\r\n changePageSize(size: number): Pagination {\r\n return new Pagination(\r\n Math.min(this.page, Math.ceil(this.totalRows / size)),\r\n size,\r\n this.totalRows,\r\n );\r\n }\r\n\r\n toJSON() {\r\n return {\r\n page: this.page,\r\n pageSize: this.pageSize,\r\n totalRows: this.totalRows,\r\n totalPages: this.totalPages,\r\n canPrev: this.canPrev,\r\n canNext: this.canNext,\r\n };\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// infrastructure/presence/broadcastChannelTransport.ts
|
|
2
|
+
function createBroadcastChannelPresenceTransport(channelName) {
|
|
3
|
+
if (typeof BroadcastChannel === "undefined") {
|
|
4
|
+
return {
|
|
5
|
+
publish: () => {
|
|
6
|
+
},
|
|
7
|
+
subscribe: () => () => {
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
const channel = new BroadcastChannel(channelName);
|
|
12
|
+
return {
|
|
13
|
+
publish(message) {
|
|
14
|
+
channel.postMessage(message);
|
|
15
|
+
},
|
|
16
|
+
subscribe(listener) {
|
|
17
|
+
const onMessage = (event) => {
|
|
18
|
+
listener(event.data);
|
|
19
|
+
};
|
|
20
|
+
channel.addEventListener("message", onMessage);
|
|
21
|
+
return () => {
|
|
22
|
+
channel.removeEventListener("message", onMessage);
|
|
23
|
+
channel.close();
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { createBroadcastChannelPresenceTransport };
|
|
30
|
+
//# sourceMappingURL=chunk-PJQWHF6T.js.map
|
|
31
|
+
//# sourceMappingURL=chunk-PJQWHF6T.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../infrastructure/presence/broadcastChannelTransport.ts"],"names":[],"mappings":";AASO,SAAS,wCACd,WAAA,EACmB;AACnB,EAAA,IAAI,OAAO,qBAAqB,WAAA,EAAa;AAC3C,IAAA,OAAO;AAAA,MACL,SAAS,MAAM;AAAA,MAAC,CAAA;AAAA,MAChB,SAAA,EAAW,MAAM,MAAM;AAAA,MAAC;AAAA,KAC1B;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,IAAI,gBAAA,CAAiB,WAAW,CAAA;AAChD,EAAA,OAAO;AAAA,IACL,QAAQ,OAAA,EAAS;AACf,MAAA,OAAA,CAAQ,YAAY,OAAO,CAAA;AAAA,IAC7B,CAAA;AAAA,IACA,UAAU,QAAA,EAAU;AAClB,MAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyC;AAC1D,QAAA,QAAA,CAAS,MAAM,IAAI,CAAA;AAAA,MACrB,CAAA;AACA,MAAA,OAAA,CAAQ,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC7C,MAAA,OAAO,MAAM;AACX,QAAA,OAAA,CAAQ,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAChD,QAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,MAChB,CAAA;AAAA,IACF;AAAA,GACF;AACF","file":"chunk-PJQWHF6T.js","sourcesContent":["import type {\r\n PresenceMessage,\r\n PresenceTransport,\r\n} from '../../application/ports/PresencePort';\r\n\r\n/**\r\n * Browser BroadcastChannel presence transport (PR-139).\r\n * Channel name should be scoped per table: `pdg-presence:{store}:{tableKey}`.\r\n */\r\nexport function createBroadcastChannelPresenceTransport(\r\n channelName: string,\r\n): PresenceTransport {\r\n if (typeof BroadcastChannel === 'undefined') {\r\n return {\r\n publish: () => {},\r\n subscribe: () => () => {},\r\n };\r\n }\r\n const channel = new BroadcastChannel(channelName);\r\n return {\r\n publish(message) {\r\n channel.postMessage(message);\r\n },\r\n subscribe(listener) {\r\n const onMessage = (event: MessageEvent<PresenceMessage>) => {\r\n listener(event.data);\r\n };\r\n channel.addEventListener('message', onMessage);\r\n return () => {\r\n channel.removeEventListener('message', onMessage);\r\n channel.close();\r\n };\r\n },\r\n };\r\n}\r\n"]}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
// packages/plugins/excel/src/buildXlsxBlob.ts
|
|
2
|
+
var escapeXml = (value) => value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
3
|
+
var toColumnLetter = (index) => {
|
|
4
|
+
let n = index + 1;
|
|
5
|
+
let result = "";
|
|
6
|
+
while (n > 0) {
|
|
7
|
+
const rem = (n - 1) % 26;
|
|
8
|
+
result = String.fromCharCode(65 + rem) + result;
|
|
9
|
+
n = Math.floor((n - 1) / 26);
|
|
10
|
+
}
|
|
11
|
+
return result;
|
|
12
|
+
};
|
|
13
|
+
var crcTable = (() => {
|
|
14
|
+
const table = new Uint32Array(256);
|
|
15
|
+
for (let i = 0; i < 256; i += 1) {
|
|
16
|
+
let c = i;
|
|
17
|
+
for (let k = 0; k < 8; k += 1) {
|
|
18
|
+
c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;
|
|
19
|
+
}
|
|
20
|
+
table[i] = c >>> 0;
|
|
21
|
+
}
|
|
22
|
+
return table;
|
|
23
|
+
})();
|
|
24
|
+
var crc32 = (data) => {
|
|
25
|
+
let crc = 4294967295;
|
|
26
|
+
for (let i = 0; i < data.length; i += 1) {
|
|
27
|
+
crc = crcTable[(crc ^ data[i]) & 255] ^ crc >>> 8;
|
|
28
|
+
}
|
|
29
|
+
return (crc ^ 4294967295) >>> 0;
|
|
30
|
+
};
|
|
31
|
+
var textEncoder = new TextEncoder();
|
|
32
|
+
var buildZip = (entries) => {
|
|
33
|
+
const parts = [];
|
|
34
|
+
const centralParts = [];
|
|
35
|
+
let offset = 0;
|
|
36
|
+
for (const entry of entries) {
|
|
37
|
+
const nameBytes = textEncoder.encode(entry.name);
|
|
38
|
+
const data = entry.data;
|
|
39
|
+
const crc = crc32(data);
|
|
40
|
+
const size = data.length;
|
|
41
|
+
const local = new Uint8Array(30 + nameBytes.length);
|
|
42
|
+
const lv = new DataView(local.buffer);
|
|
43
|
+
lv.setUint32(0, 67324752, true);
|
|
44
|
+
lv.setUint16(4, 20, true);
|
|
45
|
+
lv.setUint16(6, 0, true);
|
|
46
|
+
lv.setUint16(8, 0, true);
|
|
47
|
+
lv.setUint16(10, 0, true);
|
|
48
|
+
lv.setUint16(12, 0, true);
|
|
49
|
+
lv.setUint32(14, crc, true);
|
|
50
|
+
lv.setUint32(18, size, true);
|
|
51
|
+
lv.setUint32(22, size, true);
|
|
52
|
+
lv.setUint16(26, nameBytes.length, true);
|
|
53
|
+
lv.setUint16(28, 0, true);
|
|
54
|
+
local.set(nameBytes, 30);
|
|
55
|
+
parts.push(local, data);
|
|
56
|
+
const central = new Uint8Array(46 + nameBytes.length);
|
|
57
|
+
const cv = new DataView(central.buffer);
|
|
58
|
+
cv.setUint32(0, 33639248, true);
|
|
59
|
+
cv.setUint16(4, 20, true);
|
|
60
|
+
cv.setUint16(6, 20, true);
|
|
61
|
+
cv.setUint16(8, 0, true);
|
|
62
|
+
cv.setUint16(10, 0, true);
|
|
63
|
+
cv.setUint16(12, 0, true);
|
|
64
|
+
cv.setUint16(14, 0, true);
|
|
65
|
+
cv.setUint32(16, crc, true);
|
|
66
|
+
cv.setUint32(20, size, true);
|
|
67
|
+
cv.setUint32(24, size, true);
|
|
68
|
+
cv.setUint16(28, nameBytes.length, true);
|
|
69
|
+
cv.setUint16(30, 0, true);
|
|
70
|
+
cv.setUint16(32, 0, true);
|
|
71
|
+
cv.setUint16(34, 0, true);
|
|
72
|
+
cv.setUint16(36, 0, true);
|
|
73
|
+
cv.setUint32(38, 0, true);
|
|
74
|
+
cv.setUint32(42, offset, true);
|
|
75
|
+
central.set(nameBytes, 46);
|
|
76
|
+
centralParts.push(central);
|
|
77
|
+
offset += local.length + data.length;
|
|
78
|
+
}
|
|
79
|
+
const centralSize = centralParts.reduce((sum, p) => sum + p.length, 0);
|
|
80
|
+
const end = new Uint8Array(22);
|
|
81
|
+
const ev = new DataView(end.buffer);
|
|
82
|
+
ev.setUint32(0, 101010256, true);
|
|
83
|
+
ev.setUint16(4, 0, true);
|
|
84
|
+
ev.setUint16(6, 0, true);
|
|
85
|
+
ev.setUint16(8, entries.length, true);
|
|
86
|
+
ev.setUint16(10, entries.length, true);
|
|
87
|
+
ev.setUint32(12, centralSize, true);
|
|
88
|
+
ev.setUint32(16, offset, true);
|
|
89
|
+
ev.setUint16(20, 0, true);
|
|
90
|
+
return new Blob([...parts, ...centralParts, end], {
|
|
91
|
+
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
var buildStylesXml = (direction) => {
|
|
95
|
+
const readingOrder = direction === "rtl" ? 2 : 1;
|
|
96
|
+
const horizontal = direction === "rtl" ? "right" : "left";
|
|
97
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
98
|
+
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
|
|
99
|
+
<fonts count="3">
|
|
100
|
+
<font><sz val="10"/><name val="Tahoma"/></font>
|
|
101
|
+
<font><b/><sz val="11"/><color rgb="FFFFFFFF"/><name val="Tahoma"/></font>
|
|
102
|
+
<font><b/><sz val="10"/><name val="Tahoma"/></font>
|
|
103
|
+
</fonts>
|
|
104
|
+
<fills count="4">
|
|
105
|
+
<fill><patternFill patternType="none"/></fill>
|
|
106
|
+
<fill><patternFill patternType="gray125"/></fill>
|
|
107
|
+
<fill><patternFill patternType="solid"><fgColor rgb="FF2F5496"/></patternFill></fill>
|
|
108
|
+
<fill><patternFill patternType="solid"><fgColor rgb="FFD6EAF8"/></patternFill></fill>
|
|
109
|
+
</fills>
|
|
110
|
+
<borders count="2">
|
|
111
|
+
<border><left/><right/><top/><bottom/><diagonal/></border>
|
|
112
|
+
<border>
|
|
113
|
+
<left style="thin"><color rgb="FFBDD7EE"/></left>
|
|
114
|
+
<right style="thin"><color rgb="FFBDD7EE"/></right>
|
|
115
|
+
<top style="thin"><color rgb="FFBDD7EE"/></top>
|
|
116
|
+
<bottom style="thin"><color rgb="FFBDD7EE"/></bottom>
|
|
117
|
+
</border>
|
|
118
|
+
</borders>
|
|
119
|
+
<cellStyleXfs count="1">
|
|
120
|
+
<xf numFmtId="0" fontId="0" fillId="0" borderId="0"/>
|
|
121
|
+
</cellStyleXfs>
|
|
122
|
+
<cellXfs count="6">
|
|
123
|
+
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>
|
|
124
|
+
<xf numFmtId="0" fontId="1" fillId="2" borderId="1" xfId="0" applyFont="1" applyFill="1" applyBorder="1" applyAlignment="1">
|
|
125
|
+
<alignment horizontal="center" vertical="center" wrapText="1" readingOrder="${readingOrder}"/>
|
|
126
|
+
</xf>
|
|
127
|
+
<xf numFmtId="0" fontId="0" fillId="3" borderId="1" xfId="0" applyFill="1" applyBorder="1" applyAlignment="1">
|
|
128
|
+
<alignment horizontal="${horizontal}" vertical="center" readingOrder="${readingOrder}"/>
|
|
129
|
+
</xf>
|
|
130
|
+
<xf numFmtId="0" fontId="0" fillId="0" borderId="1" xfId="0" applyBorder="1" applyAlignment="1">
|
|
131
|
+
<alignment horizontal="${horizontal}" vertical="center" readingOrder="${readingOrder}"/>
|
|
132
|
+
</xf>
|
|
133
|
+
<xf numFmtId="0" fontId="2" fillId="3" borderId="1" xfId="0" applyFont="1" applyFill="1" applyBorder="1" applyAlignment="1">
|
|
134
|
+
<alignment horizontal="center" vertical="center" readingOrder="${readingOrder}"/>
|
|
135
|
+
</xf>
|
|
136
|
+
<xf numFmtId="0" fontId="2" fillId="0" borderId="1" xfId="0" applyFont="1" applyBorder="1" applyAlignment="1">
|
|
137
|
+
<alignment horizontal="center" vertical="center" readingOrder="${readingOrder}"/>
|
|
138
|
+
</xf>
|
|
139
|
+
</cellXfs>
|
|
140
|
+
</styleSheet>`;
|
|
141
|
+
};
|
|
142
|
+
var inlineStrCell = (ref, text, styleId) => `<c r="${ref}" t="inlineStr" s="${styleId}"><is><t>${escapeXml(text)}</t></is></c>`;
|
|
143
|
+
var numberCell = (ref, value, styleId) => `<c r="${ref}" s="${styleId}"><v>${value}</v></c>`;
|
|
144
|
+
var buildSheetXml = (table, options) => {
|
|
145
|
+
const { direction, rowHeaderLabel } = options;
|
|
146
|
+
const rightToLeft = direction === "rtl" ? "1" : "0";
|
|
147
|
+
const totalCols = table.columns.length + 1;
|
|
148
|
+
const colsXml = Array.from({ length: totalCols }, (_, i) => {
|
|
149
|
+
const width = i === 0 ? 6 : 18;
|
|
150
|
+
return `<col min="${i + 1}" max="${i + 1}" width="${width}" customWidth="1"/>`;
|
|
151
|
+
}).join("");
|
|
152
|
+
const headerCells = [
|
|
153
|
+
inlineStrCell("A1", rowHeaderLabel, 1),
|
|
154
|
+
...table.columns.map(
|
|
155
|
+
(col, i) => inlineStrCell(`${toColumnLetter(i + 1)}1`, col.caption, 1)
|
|
156
|
+
)
|
|
157
|
+
].join("");
|
|
158
|
+
const bodyRows = table.rows.map((row, rowIndex) => {
|
|
159
|
+
const excelRow = rowIndex + 2;
|
|
160
|
+
const isGroup = table.rowKinds?.[rowIndex] === "group";
|
|
161
|
+
const isOdd = rowIndex % 2 === 0;
|
|
162
|
+
const dataStyle = isGroup ? 1 : isOdd ? 2 : 3;
|
|
163
|
+
const rowNumStyle = isOdd ? 4 : 5;
|
|
164
|
+
const outline = typeof table.outlineLevels?.[rowIndex] === "number" ? ` outlineLevel="${table.outlineLevels[rowIndex]}"` : "";
|
|
165
|
+
const cells = [
|
|
166
|
+
numberCell(`A${excelRow}`, rowIndex + 1, rowNumStyle),
|
|
167
|
+
...row.map(
|
|
168
|
+
(text, i) => inlineStrCell(
|
|
169
|
+
`${toColumnLetter(i + 1)}${excelRow}`,
|
|
170
|
+
text,
|
|
171
|
+
dataStyle
|
|
172
|
+
)
|
|
173
|
+
)
|
|
174
|
+
].join("");
|
|
175
|
+
return `<row r="${excelRow}" ht="18" customHeight="1"${outline}>${cells}</row>`;
|
|
176
|
+
}).join("");
|
|
177
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
178
|
+
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
|
179
|
+
<sheetViews>
|
|
180
|
+
<sheetView workbookViewId="0" rightToLeft="${rightToLeft}"/>
|
|
181
|
+
</sheetViews>
|
|
182
|
+
<cols>${colsXml}</cols>
|
|
183
|
+
<sheetData>
|
|
184
|
+
<row r="1" ht="22" customHeight="1">${headerCells}</row>
|
|
185
|
+
${bodyRows}
|
|
186
|
+
</sheetData>
|
|
187
|
+
</worksheet>`;
|
|
188
|
+
};
|
|
189
|
+
function buildXlsxBlob(table, options = {}) {
|
|
190
|
+
const direction = options.direction ?? "rtl";
|
|
191
|
+
const rowHeaderLabel = options.rowHeaderLabel ?? "\u0631\u062F\u06CC\u0641";
|
|
192
|
+
const sheetName = options.sheetName ?? "Sheet1";
|
|
193
|
+
const safeSheetName = (sheetName.slice(0, 31) || "Sheet1").replace(
|
|
194
|
+
/[\\/*?:\[\]]/g,
|
|
195
|
+
""
|
|
196
|
+
);
|
|
197
|
+
const contentTypes = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
198
|
+
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
|
|
199
|
+
<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
|
|
200
|
+
<Default Extension="xml" ContentType="application/xml"/>
|
|
201
|
+
<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>
|
|
202
|
+
<Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>
|
|
203
|
+
<Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/>
|
|
204
|
+
</Types>`;
|
|
205
|
+
const rootRels = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
206
|
+
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
|
207
|
+
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
|
|
208
|
+
</Relationships>`;
|
|
209
|
+
const workbook = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
210
|
+
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
|
211
|
+
<sheets>
|
|
212
|
+
<sheet name="${escapeXml(safeSheetName)}" sheetId="1" r:id="rId1"/>
|
|
213
|
+
</sheets>
|
|
214
|
+
</workbook>`;
|
|
215
|
+
const workbookRels = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
216
|
+
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
|
217
|
+
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>
|
|
218
|
+
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>
|
|
219
|
+
</Relationships>`;
|
|
220
|
+
const styles = buildStylesXml(direction);
|
|
221
|
+
const sheet = buildSheetXml(table, { direction, rowHeaderLabel });
|
|
222
|
+
return buildZip([
|
|
223
|
+
{ name: "[Content_Types].xml", data: textEncoder.encode(contentTypes) },
|
|
224
|
+
{ name: "_rels/.rels", data: textEncoder.encode(rootRels) },
|
|
225
|
+
{ name: "xl/workbook.xml", data: textEncoder.encode(workbook) },
|
|
226
|
+
{
|
|
227
|
+
name: "xl/_rels/workbook.xml.rels",
|
|
228
|
+
data: textEncoder.encode(workbookRels)
|
|
229
|
+
},
|
|
230
|
+
{ name: "xl/styles.xml", data: textEncoder.encode(styles) },
|
|
231
|
+
{ name: "xl/worksheets/sheet1.xml", data: textEncoder.encode(sheet) }
|
|
232
|
+
]);
|
|
233
|
+
}
|
|
234
|
+
function downloadBlob(blob, fileName) {
|
|
235
|
+
if (typeof document === "undefined") return;
|
|
236
|
+
const url = URL.createObjectURL(blob);
|
|
237
|
+
const anchor = document.createElement("a");
|
|
238
|
+
anchor.href = url;
|
|
239
|
+
anchor.download = fileName;
|
|
240
|
+
document.body.appendChild(anchor);
|
|
241
|
+
anchor.click();
|
|
242
|
+
document.body.removeChild(anchor);
|
|
243
|
+
URL.revokeObjectURL(url);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export { buildXlsxBlob, downloadBlob };
|
|
247
|
+
//# sourceMappingURL=chunk-PQY54EL5.js.map
|
|
248
|
+
//# sourceMappingURL=chunk-PQY54EL5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../packages/plugins/excel/src/buildXlsxBlob.ts"],"names":[],"mappings":"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","file":"chunk-PQY54EL5.js","sourcesContent":["import type { ExportTable } from './buildExportTable';\r\n\r\nconst escapeXml = (value: string) =>\r\n value\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n\r\n/** 0-based column index → A, B, … Z, AA, … */\r\nconst toColumnLetter = (index: number): string => {\r\n let n = index + 1;\r\n let result = '';\r\n while (n > 0) {\r\n const rem = (n - 1) % 26;\r\n result = String.fromCharCode(65 + rem) + result;\r\n n = Math.floor((n - 1) / 26);\r\n }\r\n return result;\r\n};\r\n\r\nconst crcTable = (() => {\r\n const table = new Uint32Array(256);\r\n for (let i = 0; i < 256; i += 1) {\r\n let c = i;\r\n for (let k = 0; k < 8; k += 1) {\r\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\r\n }\r\n table[i] = c >>> 0;\r\n }\r\n return table;\r\n})();\r\n\r\nconst crc32 = (data: Uint8Array): number => {\r\n let crc = 0xffffffff;\r\n for (let i = 0; i < data.length; i += 1) {\r\n crc = crcTable[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);\r\n }\r\n return (crc ^ 0xffffffff) >>> 0;\r\n};\r\n\r\nconst textEncoder = new TextEncoder();\r\n\r\ntype ZipEntry = { name: string; data: Uint8Array };\r\n\r\n/** Minimal ZIP (store / no compression) for OOXML .xlsx */\r\nconst buildZip = (entries: ZipEntry[]): Blob => {\r\n const parts: Uint8Array[] = [];\r\n const centralParts: Uint8Array[] = [];\r\n let offset = 0;\r\n\r\n for (const entry of entries) {\r\n const nameBytes = textEncoder.encode(entry.name);\r\n const data = entry.data;\r\n const crc = crc32(data);\r\n const size = data.length;\r\n\r\n const local = new Uint8Array(30 + nameBytes.length);\r\n const lv = new DataView(local.buffer);\r\n lv.setUint32(0, 0x04034b50, true);\r\n lv.setUint16(4, 20, true);\r\n lv.setUint16(6, 0, true);\r\n lv.setUint16(8, 0, true);\r\n lv.setUint16(10, 0, true);\r\n lv.setUint16(12, 0, true);\r\n lv.setUint32(14, crc, true);\r\n lv.setUint32(18, size, true);\r\n lv.setUint32(22, size, true);\r\n lv.setUint16(26, nameBytes.length, true);\r\n lv.setUint16(28, 0, true);\r\n local.set(nameBytes, 30);\r\n\r\n parts.push(local, data);\r\n\r\n const central = new Uint8Array(46 + nameBytes.length);\r\n const cv = new DataView(central.buffer);\r\n cv.setUint32(0, 0x02014b50, true);\r\n cv.setUint16(4, 20, true);\r\n cv.setUint16(6, 20, true);\r\n cv.setUint16(8, 0, true);\r\n cv.setUint16(10, 0, true);\r\n cv.setUint16(12, 0, true);\r\n cv.setUint16(14, 0, true);\r\n cv.setUint32(16, crc, true);\r\n cv.setUint32(20, size, true);\r\n cv.setUint32(24, size, true);\r\n cv.setUint16(28, nameBytes.length, true);\r\n cv.setUint16(30, 0, true);\r\n cv.setUint16(32, 0, true);\r\n cv.setUint16(34, 0, true);\r\n cv.setUint16(36, 0, true);\r\n cv.setUint32(38, 0, true);\r\n cv.setUint32(42, offset, true);\r\n central.set(nameBytes, 46);\r\n centralParts.push(central);\r\n\r\n offset += local.length + data.length;\r\n }\r\n\r\n const centralSize = centralParts.reduce((sum, p) => sum + p.length, 0);\r\n const end = new Uint8Array(22);\r\n const ev = new DataView(end.buffer);\r\n ev.setUint32(0, 0x06054b50, true);\r\n ev.setUint16(4, 0, true);\r\n ev.setUint16(6, 0, true);\r\n ev.setUint16(8, entries.length, true);\r\n ev.setUint16(10, entries.length, true);\r\n ev.setUint32(12, centralSize, true);\r\n ev.setUint32(16, offset, true);\r\n ev.setUint16(20, 0, true);\r\n\r\n return new Blob([...parts, ...centralParts, end] as BlobPart[], {\r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n });\r\n};\r\n\r\nconst buildStylesXml = (direction: 'rtl' | 'ltr') => {\r\n const readingOrder = direction === 'rtl' ? 2 : 1;\r\n const horizontal = direction === 'rtl' ? 'right' : 'left';\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">\r\n <fonts count=\"3\">\r\n <font><sz val=\"10\"/><name val=\"Tahoma\"/></font>\r\n <font><b/><sz val=\"11\"/><color rgb=\"FFFFFFFF\"/><name val=\"Tahoma\"/></font>\r\n <font><b/><sz val=\"10\"/><name val=\"Tahoma\"/></font>\r\n </fonts>\r\n <fills count=\"4\">\r\n <fill><patternFill patternType=\"none\"/></fill>\r\n <fill><patternFill patternType=\"gray125\"/></fill>\r\n <fill><patternFill patternType=\"solid\"><fgColor rgb=\"FF2F5496\"/></patternFill></fill>\r\n <fill><patternFill patternType=\"solid\"><fgColor rgb=\"FFD6EAF8\"/></patternFill></fill>\r\n </fills>\r\n <borders count=\"2\">\r\n <border><left/><right/><top/><bottom/><diagonal/></border>\r\n <border>\r\n <left style=\"thin\"><color rgb=\"FFBDD7EE\"/></left>\r\n <right style=\"thin\"><color rgb=\"FFBDD7EE\"/></right>\r\n <top style=\"thin\"><color rgb=\"FFBDD7EE\"/></top>\r\n <bottom style=\"thin\"><color rgb=\"FFBDD7EE\"/></bottom>\r\n </border>\r\n </borders>\r\n <cellStyleXfs count=\"1\">\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/>\r\n </cellStyleXfs>\r\n <cellXfs count=\"6\">\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>\r\n <xf numFmtId=\"0\" fontId=\"1\" fillId=\"2\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"center\" vertical=\"center\" wrapText=\"1\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"3\" borderId=\"1\" xfId=\"0\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"${horizontal}\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"${horizontal}\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"2\" fillId=\"3\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"center\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n <xf numFmtId=\"0\" fontId=\"2\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyBorder=\"1\" applyAlignment=\"1\">\r\n <alignment horizontal=\"center\" vertical=\"center\" readingOrder=\"${readingOrder}\"/>\r\n </xf>\r\n </cellXfs>\r\n</styleSheet>`;\r\n};\r\n\r\nconst inlineStrCell = (ref: string, text: string, styleId: number) =>\r\n `<c r=\"${ref}\" t=\"inlineStr\" s=\"${styleId}\"><is><t>${escapeXml(text)}</t></is></c>`;\r\n\r\nconst numberCell = (ref: string, value: number, styleId: number) =>\r\n `<c r=\"${ref}\" s=\"${styleId}\"><v>${value}</v></c>`;\r\n\r\nconst buildSheetXml = (\r\n table: ExportTable,\r\n options: { direction: 'rtl' | 'ltr'; rowHeaderLabel: string },\r\n): string => {\r\n const { direction, rowHeaderLabel } = options;\r\n const rightToLeft = direction === 'rtl' ? '1' : '0';\r\n const totalCols = table.columns.length + 1;\r\n\r\n const colsXml = Array.from({ length: totalCols }, (_, i) => {\r\n const width = i === 0 ? 6 : 18;\r\n return `<col min=\"${i + 1}\" max=\"${i + 1}\" width=\"${width}\" customWidth=\"1\"/>`;\r\n }).join('');\r\n\r\n const headerCells = [\r\n inlineStrCell('A1', rowHeaderLabel, 1),\r\n ...table.columns.map((col, i) =>\r\n inlineStrCell(`${toColumnLetter(i + 1)}1`, col.caption, 1),\r\n ),\r\n ].join('');\r\n\r\n const bodyRows = table.rows\r\n .map((row, rowIndex) => {\r\n const excelRow = rowIndex + 2;\r\n const isGroup = table.rowKinds?.[rowIndex] === 'group';\r\n const isOdd = rowIndex % 2 === 0;\r\n const dataStyle = isGroup ? 1 : isOdd ? 2 : 3;\r\n const rowNumStyle = isOdd ? 4 : 5;\r\n const outline =\r\n typeof table.outlineLevels?.[rowIndex] === 'number'\r\n ? ` outlineLevel=\"${table.outlineLevels[rowIndex]}\"`\r\n : '';\r\n\r\n const cells = [\r\n numberCell(`A${excelRow}`, rowIndex + 1, rowNumStyle),\r\n ...row.map((text, i) =>\r\n inlineStrCell(\r\n `${toColumnLetter(i + 1)}${excelRow}`,\r\n text,\r\n dataStyle,\r\n ),\r\n ),\r\n ].join('');\r\n\r\n return `<row r=\"${excelRow}\" ht=\"18\" customHeight=\"1\"${outline}>${cells}</row>`;\r\n })\r\n .join('');\r\n\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n <sheetViews>\r\n <sheetView workbookViewId=\"0\" rightToLeft=\"${rightToLeft}\"/>\r\n </sheetViews>\r\n <cols>${colsXml}</cols>\r\n <sheetData>\r\n <row r=\"1\" ht=\"22\" customHeight=\"1\">${headerCells}</row>\r\n ${bodyRows}\r\n </sheetData>\r\n</worksheet>`;\r\n};\r\n\r\nexport type BuildXlsxOptions = {\r\n sheetName?: string;\r\n direction?: 'rtl' | 'ltr';\r\n rowHeaderLabel?: string;\r\n};\r\n\r\nexport function buildXlsxBlob(\r\n table: ExportTable,\r\n options: BuildXlsxOptions = {},\r\n): Blob {\r\n const direction = options.direction ?? 'rtl';\r\n const rowHeaderLabel = options.rowHeaderLabel ?? 'ردیف';\r\n const sheetName = options.sheetName ?? 'Sheet1';\r\n\r\n const safeSheetName = (sheetName.slice(0, 31) || 'Sheet1').replace(\r\n /[\\\\/*?:\\[\\]]/g,\r\n '',\r\n );\r\n\r\n const contentTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\r\n <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\r\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\r\n <Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>\r\n <Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>\r\n <Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>\r\n</Types>`;\r\n\r\n const rootRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>\r\n</Relationships>`;\r\n\r\n const workbook = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">\r\n <sheets>\r\n <sheet name=\"${escapeXml(safeSheetName)}\" sheetId=\"1\" r:id=\"rId1\"/>\r\n </sheets>\r\n</workbook>`;\r\n\r\n const workbookRels = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet1.xml\"/>\r\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>\r\n</Relationships>`;\r\n\r\n const styles = buildStylesXml(direction);\r\n const sheet = buildSheetXml(table, { direction, rowHeaderLabel });\r\n\r\n return buildZip([\r\n { name: '[Content_Types].xml', data: textEncoder.encode(contentTypes) },\r\n { name: '_rels/.rels', data: textEncoder.encode(rootRels) },\r\n { name: 'xl/workbook.xml', data: textEncoder.encode(workbook) },\r\n {\r\n name: 'xl/_rels/workbook.xml.rels',\r\n data: textEncoder.encode(workbookRels),\r\n },\r\n { name: 'xl/styles.xml', data: textEncoder.encode(styles) },\r\n { name: 'xl/worksheets/sheet1.xml', data: textEncoder.encode(sheet) },\r\n ]);\r\n}\r\n\r\nexport function downloadBlob(blob: Blob, fileName: string): void {\r\n if (typeof document === 'undefined') return;\r\n const url = URL.createObjectURL(blob);\r\n const anchor = document.createElement('a');\r\n anchor.href = url;\r\n anchor.download = fileName;\r\n document.body.appendChild(anchor);\r\n anchor.click();\r\n document.body.removeChild(anchor);\r\n URL.revokeObjectURL(url);\r\n}\r\n"]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// application/presence/GridPresenceService.ts
|
|
4
|
+
var PEER_COLORS = [
|
|
5
|
+
"#0ea5e9",
|
|
6
|
+
"#f59e0b",
|
|
7
|
+
"#10b981",
|
|
8
|
+
"#ef4444",
|
|
9
|
+
"#8b5cf6",
|
|
10
|
+
"#ec4899"
|
|
11
|
+
];
|
|
12
|
+
function hashColor(id) {
|
|
13
|
+
let h = 0;
|
|
14
|
+
for (let i = 0; i < id.length; i += 1) {
|
|
15
|
+
h = h * 31 + id.charCodeAt(i) >>> 0;
|
|
16
|
+
}
|
|
17
|
+
return PEER_COLORS[h % PEER_COLORS.length];
|
|
18
|
+
}
|
|
19
|
+
var GridPresenceService = class {
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.options = options;
|
|
22
|
+
this.peers = /* @__PURE__ */ new Map();
|
|
23
|
+
this.listeners = /* @__PURE__ */ new Set();
|
|
24
|
+
this.unsub = null;
|
|
25
|
+
this.disposed = false;
|
|
26
|
+
const peerId = options.peerId ?? `peer:${options.actorId}:${Math.random().toString(36).slice(2, 9)}`;
|
|
27
|
+
this.local = {
|
|
28
|
+
peerId,
|
|
29
|
+
actorId: options.actorId,
|
|
30
|
+
label: options.label ?? options.actorId,
|
|
31
|
+
color: options.color ?? hashColor(peerId),
|
|
32
|
+
rowId: null,
|
|
33
|
+
columnId: null
|
|
34
|
+
};
|
|
35
|
+
this.staleMs = options.staleMs ?? 15e3;
|
|
36
|
+
this.unsub = options.transport.subscribe((message) => {
|
|
37
|
+
this.onMessage(message);
|
|
38
|
+
});
|
|
39
|
+
this.broadcast();
|
|
40
|
+
}
|
|
41
|
+
getLocal() {
|
|
42
|
+
return { ...this.local };
|
|
43
|
+
}
|
|
44
|
+
getPeers() {
|
|
45
|
+
this.pruneStale();
|
|
46
|
+
return [...this.peers.values()].filter(
|
|
47
|
+
(p) => p.peerId !== this.local.peerId
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
setActiveCell(rowId, columnId) {
|
|
51
|
+
if (this.disposed) return;
|
|
52
|
+
this.local.rowId = rowId;
|
|
53
|
+
this.local.columnId = columnId;
|
|
54
|
+
this.broadcast();
|
|
55
|
+
}
|
|
56
|
+
dispose() {
|
|
57
|
+
if (this.disposed) return;
|
|
58
|
+
this.disposed = true;
|
|
59
|
+
this.options.transport.publish({
|
|
60
|
+
kind: "leave",
|
|
61
|
+
peerId: this.local.peerId
|
|
62
|
+
});
|
|
63
|
+
this.unsub?.();
|
|
64
|
+
this.unsub = null;
|
|
65
|
+
this.peers.clear();
|
|
66
|
+
this.emit();
|
|
67
|
+
}
|
|
68
|
+
subscribe(listener) {
|
|
69
|
+
this.listeners.add(listener);
|
|
70
|
+
listener(this.getPeers());
|
|
71
|
+
return () => this.listeners.delete(listener);
|
|
72
|
+
}
|
|
73
|
+
broadcast() {
|
|
74
|
+
const peer = {
|
|
75
|
+
peerId: this.local.peerId,
|
|
76
|
+
actorId: this.local.actorId,
|
|
77
|
+
label: this.local.label,
|
|
78
|
+
color: this.local.color,
|
|
79
|
+
rowId: this.local.rowId,
|
|
80
|
+
columnId: this.local.columnId,
|
|
81
|
+
updatedAt: Date.now()
|
|
82
|
+
};
|
|
83
|
+
this.options.transport.publish({ kind: "presence", peer });
|
|
84
|
+
}
|
|
85
|
+
onMessage(message) {
|
|
86
|
+
if (message.kind === "leave") {
|
|
87
|
+
if (message.peerId === this.local.peerId) return;
|
|
88
|
+
this.peers.delete(message.peerId);
|
|
89
|
+
this.emit();
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (message.peer.peerId === this.local.peerId) return;
|
|
93
|
+
this.peers.set(message.peer.peerId, message.peer);
|
|
94
|
+
this.emit();
|
|
95
|
+
}
|
|
96
|
+
pruneStale() {
|
|
97
|
+
const cutoff = Date.now() - this.staleMs;
|
|
98
|
+
for (const [id, peer] of this.peers) {
|
|
99
|
+
if (peer.updatedAt < cutoff) this.peers.delete(id);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
emit() {
|
|
103
|
+
const snapshot = this.getPeers();
|
|
104
|
+
for (const listener of this.listeners) listener(snapshot);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
exports.GridPresenceService = GridPresenceService;
|
|
109
|
+
//# sourceMappingURL=chunk-Q7TBBUTX.cjs.map
|
|
110
|
+
//# sourceMappingURL=chunk-Q7TBBUTX.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../application/presence/GridPresenceService.ts"],"names":[],"mappings":"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","file":"chunk-Q7TBBUTX.cjs","sourcesContent":["import type {\r\n PresenceLocalState,\r\n PresenceMessage,\r\n PresencePeer,\r\n PresencePort,\r\n PresenceTransport,\r\n} from '../ports/PresencePort';\r\n\r\nconst PEER_COLORS = [\r\n '#0ea5e9',\r\n '#f59e0b',\r\n '#10b981',\r\n '#ef4444',\r\n '#8b5cf6',\r\n '#ec4899',\r\n];\r\n\r\nexport type GridPresenceServiceOptions = {\r\n readonly tableId: string;\r\n readonly actorId: string;\r\n readonly label?: string;\r\n readonly transport: PresenceTransport;\r\n readonly peerId?: string;\r\n readonly color?: string;\r\n /** Drop peers quieter than this (ms). Default 15s. */\r\n readonly staleMs?: number;\r\n};\r\n\r\nfunction hashColor(id: string): string {\r\n let h = 0;\r\n for (let i = 0; i < id.length; i += 1) {\r\n h = (h * 31 + id.charCodeAt(i)) >>> 0;\r\n }\r\n return PEER_COLORS[h % PEER_COLORS.length]!;\r\n}\r\n\r\n/**\r\n * PresencePort: broadcast local cursor/selection; track remote peers (PR-139).\r\n * Does not merge cell values — editing different cells stays conflict-free.\r\n */\r\nexport class GridPresenceService implements PresencePort {\r\n private readonly local: PresenceLocalState;\r\n private peers = new Map<string, PresencePeer>();\r\n private readonly listeners = new Set<\r\n (peers: readonly PresencePeer[]) => void\r\n >();\r\n private unsub: (() => void) | null = null;\r\n private disposed = false;\r\n private readonly staleMs: number;\r\n\r\n constructor(private readonly options: GridPresenceServiceOptions) {\r\n const peerId =\r\n options.peerId ??\r\n `peer:${options.actorId}:${Math.random().toString(36).slice(2, 9)}`;\r\n this.local = {\r\n peerId,\r\n actorId: options.actorId,\r\n label: options.label ?? options.actorId,\r\n color: options.color ?? hashColor(peerId),\r\n rowId: null,\r\n columnId: null,\r\n };\r\n this.staleMs = options.staleMs ?? 15_000;\r\n this.unsub = options.transport.subscribe((message) => {\r\n this.onMessage(message);\r\n });\r\n this.broadcast();\r\n }\r\n\r\n getLocal(): PresenceLocalState {\r\n return { ...this.local };\r\n }\r\n\r\n getPeers(): readonly PresencePeer[] {\r\n this.pruneStale();\r\n return [...this.peers.values()].filter(\r\n (p) => p.peerId !== this.local.peerId,\r\n );\r\n }\r\n\r\n setActiveCell(rowId: number | null, columnId: string | null): void {\r\n if (this.disposed) return;\r\n this.local.rowId = rowId;\r\n this.local.columnId = columnId;\r\n this.broadcast();\r\n }\r\n\r\n dispose(): void {\r\n if (this.disposed) return;\r\n this.disposed = true;\r\n this.options.transport.publish({\r\n kind: 'leave',\r\n peerId: this.local.peerId,\r\n });\r\n this.unsub?.();\r\n this.unsub = null;\r\n this.peers.clear();\r\n this.emit();\r\n }\r\n\r\n subscribe(listener: (peers: readonly PresencePeer[]) => void): () => void {\r\n this.listeners.add(listener);\r\n listener(this.getPeers());\r\n return () => this.listeners.delete(listener);\r\n }\r\n\r\n private broadcast(): void {\r\n const peer: PresencePeer = {\r\n peerId: this.local.peerId,\r\n actorId: this.local.actorId,\r\n label: this.local.label,\r\n color: this.local.color,\r\n rowId: this.local.rowId,\r\n columnId: this.local.columnId,\r\n updatedAt: Date.now(),\r\n };\r\n this.options.transport.publish({ kind: 'presence', peer });\r\n }\r\n\r\n private onMessage(message: PresenceMessage): void {\r\n if (message.kind === 'leave') {\r\n if (message.peerId === this.local.peerId) return;\r\n this.peers.delete(message.peerId);\r\n this.emit();\r\n return;\r\n }\r\n if (message.peer.peerId === this.local.peerId) return;\r\n this.peers.set(message.peer.peerId, message.peer);\r\n this.emit();\r\n }\r\n\r\n private pruneStale(): void {\r\n const cutoff = Date.now() - this.staleMs;\r\n for (const [id, peer] of this.peers) {\r\n if (peer.updatedAt < cutoff) this.peers.delete(id);\r\n }\r\n }\r\n\r\n private emit(): void {\r\n const snapshot = this.getPeers();\r\n for (const listener of this.listeners) listener(snapshot);\r\n }\r\n}\r\n"]}
|