@dcs-tech/ui 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ChartImageMenu-CuuFnW9q.js +1481 -0
- package/dist/{ChartView-Cehrcr05.js → ChartView-nS4f4EU_.js} +514 -514
- package/dist/{SummaryChart-y27q_BBN.js → SummaryChart-CVg6i2mx.js} +2 -2
- package/dist/{SummaryImage-DDNEEu_K.js → SummaryImage-CoEFzMl6.js} +2 -2
- package/dist/{SummarySeeAll-0dX-_LFe.js → SummarySeeAll-C_OUs3kn.js} +5 -5
- package/dist/assets/fileTask.worker-FQSUtwcz.js +1 -0
- package/dist/columnValue-K98ElfJc.js +610 -0
- package/dist/exportContext-CJaIv8R-.js +166 -0
- package/dist/{exportEngine-DL-jEXFU.js → exportEngine-CDLYHH0d.js} +137 -133
- package/dist/fileActions-KSaVGnaE.js +144 -0
- package/dist/{geometry-CG2nOEnw.js → geometry-ChwYB45B.js} +433 -497
- package/dist/index.js +8572 -8435
- package/dist/{defaults-DL745PK1.js → labels-CnqqTrne.js} +3 -79
- package/dist/runFileTask-BClLQjmv.js +109 -0
- package/dist/scrollArea-DAlVT5U7.js +214 -0
- package/dist/style.css +1 -1
- package/dist/{summaryChartData-Djo73zb8.js → summaryChartData-pNvzaEHp.js} +1 -1
- package/dist/types/components/Charts/parts.d.ts +1 -1
- package/dist/types/components/Collapsible/index.d.ts +1 -1
- package/dist/types/components/DataTable/DataTable.d.ts +1 -1
- package/dist/types/components/DataTable/cards/cardFields.d.ts +2 -4
- package/dist/types/components/DataTable/columnValue.d.ts +19 -0
- package/dist/types/components/DataTable/export/exportCells.d.ts +13 -0
- package/dist/types/components/DataTable/export/exportEngine.d.ts +2 -0
- package/dist/types/components/DataTable/export/useTableExport.d.ts +2 -0
- package/dist/types/components/DataTable/host.d.ts +2 -0
- package/dist/types/components/DataTable/index.d.ts +1 -1
- package/dist/types/components/DataTable/labels.d.ts +2 -0
- package/dist/types/components/DataTable/types.d.ts +11 -0
- package/dist/types/components/DataTable/useTable.d.ts +4 -1
- package/dist/types/components/DataTable/vendor/index.d.ts +1 -1
- package/dist/types/components/EditableTable/EditableTableCell.d.ts +1 -1
- package/dist/types/components/FileEngine/FileEngineContext.d.ts +17 -0
- package/dist/types/components/FileEngine/FileEngineProvider.d.ts +12 -0
- package/dist/types/components/FileEngine/FileJobsTray.d.ts +10 -0
- package/dist/types/components/FileEngine/index.d.ts +8 -0
- package/dist/types/components/FileEngine/labels.d.ts +29 -0
- package/dist/types/components/Toast/ToastHost.d.ts +1 -0
- package/dist/types/components/UIProvider/UIFormatContext.d.ts +7 -0
- package/dist/types/components/UIProvider/UILabelsContext.d.ts +116 -0
- package/dist/types/components/UIProvider/UIProvider.d.ts +6 -1
- package/dist/types/components/UIProvider/index.d.ts +4 -0
- package/dist/types/core/logic/collapsible.logic.d.ts +6 -1
- package/dist/types/core/logic/datePicker.logic.d.ts +5 -0
- package/dist/types/core/logic/exportSafety.logic.d.ts +1 -0
- package/dist/types/core/logic/fileQueue.logic.d.ts +28 -0
- package/dist/types/core/logic/format.logic.d.ts +4 -0
- package/dist/types/core/logic/index.d.ts +4 -0
- package/dist/types/core/logic/tableDate.logic.d.ts +7 -0
- package/dist/types/core/logic/tableSummary.logic.d.ts +2 -2
- package/dist/types/core/types/collapsible.types.d.ts +4 -16
- package/dist/types/core/types/fileEngine.types.d.ts +65 -0
- package/dist/types/core/types/format.types.d.ts +15 -0
- package/dist/types/core/types/index.d.ts +2 -0
- package/dist/types/core/types/table.types.d.ts +1 -0
- package/dist/types/{components/DataTable/vendor → file}/fileActions.d.ts +17 -7
- package/dist/types/file/fileEngine.d.ts +48 -0
- package/dist/types/file/tasks/fileTask.worker.d.ts +1 -0
- package/dist/types/file/tasks/runFileTask.d.ts +6 -0
- package/dist/types/file/workerPool.d.ts +17 -0
- package/dist/types/index.d.ts +9 -2
- package/package.json +1 -1
- package/dist/ChartImageMenu-HILSfn5A.js +0 -1115
- package/dist/exportContext-CdpsOzE8.js +0 -235
- package/dist/scrollArea-CkPGDYH2.js +0 -210
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { a as e, c as t,
|
|
2
|
+
import { a as e, c as t, i as n, n as r, o as i, r as a, s as o } from "./exportContext-CJaIv8R-.js";
|
|
3
|
+
import { a as s, c, i as l, o as u, r as d, s as f, u as p } from "./fileActions-KSaVGnaE.js";
|
|
3
4
|
import m from "exceljs";
|
|
4
5
|
// src/components/DataTable/export/exportEngine.ts
|
|
5
6
|
var h = (e) => JSON.stringify(e).replace(/</g, "\\u003c");
|
|
@@ -41,38 +42,41 @@ function v(e, t, n, r, i) {
|
|
|
41
42
|
}
|
|
42
43
|
return o;
|
|
43
44
|
}
|
|
44
|
-
function y(e, t,
|
|
45
|
-
let
|
|
45
|
+
function y(e, t, r, i, o, s) {
|
|
46
|
+
let c = (e) => {
|
|
46
47
|
if (e == null) return "";
|
|
47
48
|
let t = String(e);
|
|
48
49
|
return t.includes(",") || t.includes("\"") || t.includes("\n") ? `"${t.replace(/"/g, "\"\"")}"` : t;
|
|
49
|
-
},
|
|
50
|
-
if (
|
|
51
|
-
let e =
|
|
52
|
-
for (let [t, n] of e)
|
|
53
|
-
|
|
54
|
-
} else
|
|
55
|
-
if (
|
|
56
|
-
|
|
57
|
-
for (let [e, t] of Object.entries(
|
|
50
|
+
}, l = [];
|
|
51
|
+
if (o) {
|
|
52
|
+
let e = a(o);
|
|
53
|
+
for (let [t, n] of e) l.push(`${c(t)},${c(n)}`);
|
|
54
|
+
s && l.push(c(s)), l.push("");
|
|
55
|
+
} else s && (l.push(c(s)), l.push(""));
|
|
56
|
+
if (l.push(e.map(c).join(","), ...t.map((t) => e.map((e) => c(t[e])).join(","))), r && l.push(e.map((e) => c(r[e])).join(",")), i && Object.keys(i.items).length > 0) {
|
|
57
|
+
l.push(""), l.push(c(n(o).exportSummaryLabel));
|
|
58
|
+
for (let [e, t] of Object.entries(i.items)) l.push(`${c(e)},${c(t)}`);
|
|
58
59
|
}
|
|
59
|
-
for (let e of
|
|
60
|
-
|
|
61
|
-
for (let t of e.rows)
|
|
60
|
+
for (let e of i?.tables ?? []) {
|
|
61
|
+
l.push(""), l.push(c(e.title)), l.push(e.header.map(c).join(","));
|
|
62
|
+
for (let t of e.rows) l.push(`${c(t.label)},${c(t.count)}`);
|
|
62
63
|
}
|
|
63
|
-
return new Blob(["" +
|
|
64
|
+
return new Blob(["" + l.join("\n")], { type: "text/csv;charset=utf-8;" });
|
|
64
65
|
}
|
|
65
66
|
function b(e) {
|
|
66
|
-
if (e)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
if (e) {
|
|
68
|
+
if (e.numFmt) return e.numFmt;
|
|
69
|
+
switch (e.format) {
|
|
70
|
+
case "currency": return "#,##0.00";
|
|
71
|
+
case "number": return "#,##0";
|
|
72
|
+
case "percentage": return "0.00%";
|
|
73
|
+
case "date": return "DD/MM/YYYY";
|
|
74
|
+
default: return;
|
|
75
|
+
}
|
|
72
76
|
}
|
|
73
77
|
}
|
|
74
|
-
async function x(t,
|
|
75
|
-
let { totals:
|
|
78
|
+
async function x(t, i, a) {
|
|
79
|
+
let { totals: o, summary: s, style: c, sheetName: l, columnMeta: u, cellStyles: d, metadata: f, subtitle: p } = a || {}, h = new m.Workbook(), g = h.addWorksheet(l || "Sheet1"), _ = 0;
|
|
76
80
|
if (f) {
|
|
77
81
|
if (f.businessName) {
|
|
78
82
|
let e = g.addRow([f.businessName]);
|
|
@@ -101,9 +105,9 @@ async function x(t, n, r) {
|
|
|
101
105
|
color: { argb: "FF555555" }
|
|
102
106
|
}, t.length > 1 && g.mergeCells(_ + 1, 1, _ + 1, t.length), _++;
|
|
103
107
|
}
|
|
104
|
-
let
|
|
105
|
-
if (
|
|
106
|
-
let e = g.addRow([
|
|
108
|
+
let i = r(f);
|
|
109
|
+
if (i) {
|
|
110
|
+
let e = g.addRow([i]);
|
|
107
111
|
e.getCell(1).font = {
|
|
108
112
|
size: 9,
|
|
109
113
|
italic: !0
|
|
@@ -118,27 +122,27 @@ async function x(t, n, r) {
|
|
|
118
122
|
color: { argb: "FF555555" }
|
|
119
123
|
}, t.length > 1 && g.mergeCells(1, 1, 1, t.length), e++, g.addRow([]), e++, _ += e;
|
|
120
124
|
}
|
|
121
|
-
let v = _ + 1, y =
|
|
125
|
+
let v = _ + 1, y = c?.headerStyle?.fill || "#1a73e8", x = c?.headerStyle?.fontColor || "#FFFFFF", S = c?.headerStyle?.bold !== !1;
|
|
122
126
|
if (g.columns = t.map((e, t) => {
|
|
123
|
-
let
|
|
124
|
-
if (!
|
|
125
|
-
let t = Math.max(e.length, ...
|
|
126
|
-
|
|
127
|
+
let n = u?.[t], r = c?.columnStyles?.[e]?.width || n?.width;
|
|
128
|
+
if (!r) {
|
|
129
|
+
let t = Math.max(e.length, ...i.slice(0, 50).map((t) => String(t[e] ?? "").length));
|
|
130
|
+
r = Math.min(Math.max(t + 2, 10), 40);
|
|
127
131
|
}
|
|
128
132
|
return _ > 0 ? {
|
|
129
133
|
key: e,
|
|
130
|
-
width:
|
|
134
|
+
width: r
|
|
131
135
|
} : {
|
|
132
136
|
header: e,
|
|
133
137
|
key: e,
|
|
134
|
-
width:
|
|
138
|
+
width: r
|
|
135
139
|
};
|
|
136
140
|
}), _ > 0 && g.addRow(t), g.getRow(v).eachCell((e, n) => {
|
|
137
|
-
let r = u?.[n - 1], i =
|
|
141
|
+
let r = u?.[n - 1], i = c?.columnStyles?.[t[n - 1]]?.align;
|
|
138
142
|
e.font = {
|
|
139
143
|
bold: S,
|
|
140
144
|
color: { argb: x.replace("#", "FF") },
|
|
141
|
-
size:
|
|
145
|
+
size: c?.headerStyle?.fontSize || 11
|
|
142
146
|
}, e.fill = {
|
|
143
147
|
type: "pattern",
|
|
144
148
|
pattern: "solid",
|
|
@@ -152,20 +156,20 @@ async function x(t, n, r) {
|
|
|
152
156
|
} };
|
|
153
157
|
}), g.views = [{
|
|
154
158
|
state: "frozen",
|
|
155
|
-
ySplit:
|
|
156
|
-
xSplit:
|
|
157
|
-
}],
|
|
159
|
+
ySplit: c?.freezeRows ?? v,
|
|
160
|
+
xSplit: c?.freezeCols || 0
|
|
161
|
+
}], i.forEach((e, n) => {
|
|
158
162
|
let r = g.addRow(t.map((t) => e[t] ?? "")), i = n % 2 == 1;
|
|
159
163
|
r.eachCell((e, r) => {
|
|
160
|
-
let a = u?.[r - 1], o = t[r - 1],
|
|
164
|
+
let a = u?.[r - 1], o = t[r - 1], s = c?.columnStyles?.[o], l = d?.[n]?.[o], f = l?.align || s?.align || a?.align;
|
|
161
165
|
f && (e.alignment = {
|
|
162
166
|
horizontal: f,
|
|
163
167
|
vertical: "middle"
|
|
164
168
|
});
|
|
165
|
-
let p =
|
|
166
|
-
p && typeof e.value == "number" && (e.numFmt = p);
|
|
169
|
+
let p = s?.numFmt || b(a);
|
|
170
|
+
p && (typeof e.value == "number" || e.value instanceof Date) && (e.numFmt = p);
|
|
167
171
|
let m = {};
|
|
168
|
-
(
|
|
172
|
+
(s?.bold || l?.fontWeight === "bold") && (m.bold = !0), l?.color && (m.color = { argb: "FF" + l.color.replace("#", "") }), l?.fontSize && (m.size = l.fontSize), Object.keys(m).length > 0 && (e.font = m), l?.backgroundColor ? e.fill = {
|
|
169
173
|
type: "pattern",
|
|
170
174
|
pattern: "solid",
|
|
171
175
|
fgColor: { argb: "FF" + l.backgroundColor.replace("#", "") }
|
|
@@ -175,10 +179,10 @@ async function x(t, n, r) {
|
|
|
175
179
|
fgColor: { argb: "FFF8F9FA" }
|
|
176
180
|
});
|
|
177
181
|
});
|
|
178
|
-
}),
|
|
179
|
-
let e = t.map((e) =>
|
|
182
|
+
}), o) {
|
|
183
|
+
let e = t.map((e) => o[e] ?? ""), n = g.addRow(e), r = c?.totalsStyle?.fill || "#e8e8e8", i = c?.totalsStyle?.bold !== !1, a = c?.totalsStyle?.border || "thin";
|
|
180
184
|
n.eachCell((e, n) => {
|
|
181
|
-
let
|
|
185
|
+
let s = u?.[n - 1], l = t[n - 1], d = c?.columnStyles?.[l], f = s?.cellStyle?.(o[l], {}), p = f?.align || d?.align || s?.align, m = { bold: i };
|
|
182
186
|
f?.color && (m.color = { argb: "FF" + f.color.replace("#", "") }), f?.fontSize && (m.size = f.fontSize), e.font = m, e.fill = f?.backgroundColor ? {
|
|
183
187
|
type: "pattern",
|
|
184
188
|
pattern: "solid",
|
|
@@ -188,17 +192,17 @@ async function x(t, n, r) {
|
|
|
188
192
|
pattern: "solid",
|
|
189
193
|
fgColor: { argb: r.replace("#", "FF") }
|
|
190
194
|
}, e.border = { top: {
|
|
191
|
-
style:
|
|
195
|
+
style: a,
|
|
192
196
|
color: { argb: "FF333333" }
|
|
193
197
|
} }, p && (e.alignment = {
|
|
194
198
|
horizontal: p,
|
|
195
199
|
vertical: "middle"
|
|
196
200
|
});
|
|
197
|
-
let h = d?.numFmt || b(
|
|
198
|
-
h && typeof e.value == "number" && (e.numFmt = h);
|
|
201
|
+
let h = d?.numFmt || b(s);
|
|
202
|
+
h && (typeof e.value == "number" || e.value instanceof Date) && (e.numFmt = h);
|
|
199
203
|
});
|
|
200
204
|
}
|
|
201
|
-
if (
|
|
205
|
+
if (c?.autoFilter !== !1 && i.length > 0 && (g.autoFilter = {
|
|
202
206
|
from: {
|
|
203
207
|
row: v,
|
|
204
208
|
column: 1
|
|
@@ -207,19 +211,19 @@ async function x(t, n, r) {
|
|
|
207
211
|
row: v,
|
|
208
212
|
column: t.length
|
|
209
213
|
}
|
|
210
|
-
}),
|
|
214
|
+
}), s && Object.keys(s.items).length > 0) {
|
|
211
215
|
g.addRow([]);
|
|
212
|
-
let e = g.addRow([
|
|
216
|
+
let e = g.addRow([n(f).exportSummaryLabel]);
|
|
213
217
|
e.getCell(1).font = {
|
|
214
218
|
bold: !0,
|
|
215
219
|
size: 12
|
|
216
220
|
};
|
|
217
|
-
for (let [e, t] of Object.entries(
|
|
221
|
+
for (let [e, t] of Object.entries(s.items)) {
|
|
218
222
|
let n = g.addRow([e, t]);
|
|
219
223
|
n.getCell(1).font = { bold: !0 }, typeof t == "number" && (n.getCell(2).numFmt = "#,##0.00");
|
|
220
224
|
}
|
|
221
225
|
}
|
|
222
|
-
for (let e of
|
|
226
|
+
for (let e of s?.tables ?? []) {
|
|
223
227
|
g.addRow([]), g.addRow([e.title]).getCell(1).font = {
|
|
224
228
|
bold: !0,
|
|
225
229
|
size: 12
|
|
@@ -265,8 +269,8 @@ function S(t, n, r, i) {
|
|
|
265
269
|
} : t;
|
|
266
270
|
return a && i && (o.summary = a), new Blob([JSON.stringify(o, null, 2)], { type: "application/json" });
|
|
267
271
|
}
|
|
268
|
-
function C(t,
|
|
269
|
-
let { title:
|
|
272
|
+
function C(t, i, a) {
|
|
273
|
+
let { title: o, subtitle: s, totals: c, summary: l, customStyles: u, columnMeta: d, cellStyles: f, metadata: p, branding: m } = a || {}, g = n(p), _ = m ? `<footer class="export-footer">
|
|
270
274
|
${D(g.exportGeneratedFrom)} <strong>${D(m.name)}</strong>${m.url ? ` — <a href="${D(m.url)}" target="_blank" rel="noopener">${D(m.url.replace(/^https?:\/\//, ""))}</a>` : ""}
|
|
271
275
|
</footer>` : "", v = (e) => e == null ? "" : String(e).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">"), y = (e) => {
|
|
272
276
|
let t = d?.[e];
|
|
@@ -278,10 +282,10 @@ ${D(g.exportGeneratedFrom)} <strong>${D(m.name)}</strong>${m.url ? ` — <a
|
|
|
278
282
|
return a && (a.color && r.push(`color:${a.color}`), a.backgroundColor && r.push(`background:${a.backgroundColor}`), a.fontWeight && r.push(`font-weight:${a.fontWeight}`), a.fontSize && r.push(`font-size:${a.fontSize}px`), a.align && r.push(`text-align:${a.align}`)), r.length > 0 ? ` style="${r.join(";")}"` : i?.align ? ` style="text-align:${i.align}"` : "";
|
|
279
283
|
};
|
|
280
284
|
t.map((e, t) => `<th${y(t)}>${v(e)}</th>`).join("");
|
|
281
|
-
let x =
|
|
282
|
-
let n = d?.[t]?.cellStyle?.(
|
|
283
|
-
return i?.align && r.push(`text-align:${i.align}`), n?.color && r.push(`color:${n.color}`), n?.backgroundColor && r.push(`background:${n.backgroundColor}`), n?.fontWeight && r.push(`font-weight:${n.fontWeight}`), n?.fontSize && r.push(`font-size:${n.fontSize}px`), n?.align && r.push(`text-align:${n.align}`), `<td${r.length > 0 ? ` style="${r.join(";")}"` : ""}>${v(
|
|
284
|
-
}).join("")}</tr>` : "", C = l && Object.keys(l.items).length > 0 ? `<h3>Summary</h3><dl>${Object.entries(l.items).map(([e, t]) => `<dt>${v(e)}</dt><dd>${v(t)}</dd>`).join("")}</dl>` : "", w = (l?.tables ?? []).map((e) => `<div class="summary-group"><h4>${v(e.title)}</h4><table class="summary-table"><thead><tr><th>${v(e.header[0])}</th><th class="num">${v(e.header[1])}</th></tr></thead><tbody>${e.rows.map((e) => `<tr><td>${v(e.label)}</td><td class="num">${v(e.count)}</td></tr>`).join("")}</tbody></table></div>`).join(""), T = C || w ? `<div class="summary">${C}${w}</div>` : "", E = (/* @__PURE__ */ new Date()).toLocaleDateString(p?.locale ||
|
|
285
|
+
let x = i.map((e, n) => `<tr>${t.map((t, r) => `<td${b(n, t, r)}>${v(e[t])}</td>`).join("")}</tr>`).join("\n"), S = c ? `<tr class="totals">${t.map((e, t) => {
|
|
286
|
+
let n = d?.[t]?.cellStyle?.(c[e], {}), r = [], i = d?.[t];
|
|
287
|
+
return i?.align && r.push(`text-align:${i.align}`), n?.color && r.push(`color:${n.color}`), n?.backgroundColor && r.push(`background:${n.backgroundColor}`), n?.fontWeight && r.push(`font-weight:${n.fontWeight}`), n?.fontSize && r.push(`font-size:${n.fontSize}px`), n?.align && r.push(`text-align:${n.align}`), `<td${r.length > 0 ? ` style="${r.join(";")}"` : ""}>${v(c[e])}</td>`;
|
|
288
|
+
}).join("")}</tr>` : "", C = l && Object.keys(l.items).length > 0 ? `<h3>Summary</h3><dl>${Object.entries(l.items).map(([e, t]) => `<dt>${v(e)}</dt><dd>${v(t)}</dd>`).join("")}</dl>` : "", w = (l?.tables ?? []).map((e) => `<div class="summary-group"><h4>${v(e.title)}</h4><table class="summary-table"><thead><tr><th>${v(e.header[0])}</th><th class="num">${v(e.header[1])}</th></tr></thead><tbody>${e.rows.map((e) => `<tr><td>${v(e.label)}</td><td class="num">${v(e.count)}</td></tr>`).join("")}</tbody></table></div>`).join(""), T = C || w ? `<div class="summary">${C}${w}</div>` : "", E = (/* @__PURE__ */ new Date()).toLocaleDateString(p?.locale || void 0, {
|
|
285
289
|
day: "2-digit",
|
|
286
290
|
month: "2-digit",
|
|
287
291
|
year: "numeric"
|
|
@@ -290,7 +294,7 @@ ${D(g.exportGeneratedFrom)} <strong>${D(m.name)}</strong>${m.url ? ` — <a
|
|
|
290
294
|
<head>
|
|
291
295
|
<meta charset="UTF-8">
|
|
292
296
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
293
|
-
<title>${v(
|
|
297
|
+
<title>${v(o || g.export)}</title>
|
|
294
298
|
<style>
|
|
295
299
|
:root{--bg:#ffffff;--bg-alt:#f8f9fa;--bg-hover:#f0f4ff;--text:#1a1a1a;--text-secondary:#666;--text-muted:#888;--border:#e8e8e8;--border-strong:#333;--th-bg:#1a73e8;--th-bg-hover:#1557b0;--th-color:#fff;--input-border:#d0d0d0;--input-focus:#1a73e8;--meta-bg:#f8f9fa;--meta-border:#e8e8e8;--summary-bg:#f8f9fa;--totals-bg:#f5f5f5;--btn-bg:#1a73e8;--btn-color:#fff;--btn-hover:#1557b0;--btn-secondary-bg:#f0f0f0;--btn-secondary-color:#333;--btn-secondary-hover:#e0e0e0;--footer-bg:#f8f9fa;--footer-border:#e8e8e8}
|
|
296
300
|
[data-theme="dark"]{--bg:#1a1a2e;--bg-alt:#16213e;--bg-hover:#1a2745;--text:#e0e0e0;--text-secondary:#aaa;--text-muted:#888;--border:#2a2a4a;--border-strong:#555;--th-bg:#0f3460;--th-bg-hover:#1a4a7a;--th-color:#e0e0e0;--input-border:#3a3a5a;--input-focus:#4a8fe8;--meta-bg:#16213e;--meta-border:#2a2a4a;--summary-bg:#16213e;--totals-bg:#1a2745;--btn-bg:#0f3460;--btn-color:#e0e0e0;--btn-hover:#1a4a7a;--btn-secondary-bg:#2a2a4a;--btn-secondary-color:#ccc;--btn-secondary-hover:#3a3a5a;--footer-bg:#16213e;--footer-border:#2a2a4a}
|
|
@@ -359,15 +363,15 @@ ${p ? (() => {
|
|
|
359
363
|
let t = ["<div class=\"export-meta\">"];
|
|
360
364
|
p.businessName && t.push(`<h2>${v(p.businessName)}</h2>`);
|
|
361
365
|
let n = [];
|
|
362
|
-
p.businessAddress && n.push(`<span>${v(p.businessAddress)}</span>`), p.businessPhone && n.push(`<span>${v(p.businessPhone)}</span>`), p.taxNumber && n.push(`<span>${v(e(p))}: ${v(p.taxNumber)}</span>`), n.length > 0 && t.push(`<div class="meta-details">${n.join("")}</div>`),
|
|
363
|
-
let
|
|
364
|
-
return
|
|
366
|
+
p.businessAddress && n.push(`<span>${v(p.businessAddress)}</span>`), p.businessPhone && n.push(`<span>${v(p.businessPhone)}</span>`), p.taxNumber && n.push(`<span>${v(e(p))}: ${v(p.taxNumber)}</span>`), n.length > 0 && t.push(`<div class="meta-details">${n.join("")}</div>`), o && t.push(`<h3 style="margin:8px 0 4px;font-size:15px">${v(o)}</h3>`), s && t.push(`<div style="font-size:12px;color:var(--text-secondary);margin-bottom:4px">${v(s)}</div>`);
|
|
367
|
+
let i = r(p);
|
|
368
|
+
return i && t.push(`<div class="meta-filters">${v(i)}</div>`), t.push("</div>"), t.join("\n");
|
|
365
369
|
})() : ""}
|
|
366
|
-
${!p &&
|
|
367
|
-
${!p &&
|
|
370
|
+
${!p && o ? `<h1>${v(o)}</h1>` : ""}
|
|
371
|
+
${!p && s ? `<p class="subtitle">${v(s)}</p>` : ""}
|
|
368
372
|
<div class="toolbar">
|
|
369
373
|
<input type="text" id="globalSearch" placeholder="${v(g.exportHtmlSearch)}" aria-label="${v(g.exportHtmlSearch)}" autocomplete="off">
|
|
370
|
-
<span class="count" id="rowCount">${v(g.rowsInfo(String(
|
|
374
|
+
<span class="count" id="rowCount">${v(g.rowsInfo(String(i.length)))}</span>
|
|
371
375
|
<div class="toolbar-actions">
|
|
372
376
|
<button class="btn btn-primary" id="btnDownload" title="${v(g.exportDownloadAs("HTML"))}"><svg viewBox="0 0 24 24"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/></svg>${v(g.exportDownload)}</button>
|
|
373
377
|
<button class="btn btn-secondary" id="btnPrint" title="${v(g.exportPrint)}"><svg viewBox="0 0 24 24"><path d="M19 8H5c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3zm-3 11H8v-5h8v5zm3-7c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm-1-9H6v4h12V3z"/></svg>${v(g.exportPrint)}</button>
|
|
@@ -569,30 +573,30 @@ function T(e, t, n, r) {
|
|
|
569
573
|
]
|
|
570
574
|
};
|
|
571
575
|
}
|
|
572
|
-
function E(t,
|
|
573
|
-
let { pdfConfig:
|
|
576
|
+
function E(t, i, a) {
|
|
577
|
+
let { pdfConfig: o, totals: s, summary: c, subtitle: l, columnMeta: u, cellStyles: d, metadata: f, fontFor: p } = a || {}, m = n(f), h = (/* @__PURE__ */ new Date()).toLocaleDateString(f?.locale), _ = o?.title || m.export, v = o?.autoFit !== !1, y = o?.pageSize || "A4", b = o?.orientation || "portrait", x = o?.fontSize || 9, S = [
|
|
574
578
|
30,
|
|
575
579
|
30,
|
|
576
580
|
30,
|
|
577
581
|
40
|
|
578
582
|
];
|
|
579
|
-
if (v && !
|
|
580
|
-
let e = T(t,
|
|
581
|
-
y = e.pageSize, b = e.orientation,
|
|
583
|
+
if (v && !o?.orientation && !o?.pageSize) {
|
|
584
|
+
let e = T(t, i, u, o);
|
|
585
|
+
y = e.pageSize, b = e.orientation, o?.fontSize || (x = e.fontSize), S = e.margins;
|
|
582
586
|
}
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
587
|
+
o?.margin && (S = typeof o.margin == "number" ? [
|
|
588
|
+
o.margin,
|
|
589
|
+
o.margin,
|
|
590
|
+
o.margin,
|
|
591
|
+
o.margin
|
|
588
592
|
] : [
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
+
o.margin.left,
|
|
594
|
+
o.margin.top,
|
|
595
|
+
o.margin.right,
|
|
596
|
+
o.margin.bottom
|
|
593
597
|
]);
|
|
594
598
|
let C = (e) => {
|
|
595
|
-
let n =
|
|
599
|
+
let n = o?.columnStyles?.[t[e]];
|
|
596
600
|
return n?.align ? n.align : u?.[e]?.align || "left";
|
|
597
601
|
}, w = t.map((e, t) => ({
|
|
598
602
|
...g(e, { bold: !0 }, p),
|
|
@@ -600,7 +604,7 @@ function E(t, n, r) {
|
|
|
600
604
|
color: "white",
|
|
601
605
|
fillColor: "#1a73e8",
|
|
602
606
|
alignment: C(t)
|
|
603
|
-
})), E =
|
|
607
|
+
})), E = i.map((e, n) => t.map((t, r) => {
|
|
604
608
|
let i = d?.[n]?.[t];
|
|
605
609
|
return {
|
|
606
610
|
...g(e[t] == null ? "" : String(e[t]), {}, p),
|
|
@@ -610,10 +614,10 @@ function E(t, n, r) {
|
|
|
610
614
|
color: i?.color || void 0,
|
|
611
615
|
bold: i?.fontWeight === "bold" || void 0
|
|
612
616
|
};
|
|
613
|
-
})), D =
|
|
614
|
-
let n = u?.[t]?.cellStyle?.(
|
|
617
|
+
})), D = s ? t.map((e, t) => {
|
|
618
|
+
let n = u?.[t]?.cellStyle?.(s[e], {});
|
|
615
619
|
return {
|
|
616
|
-
...g(
|
|
620
|
+
...g(s[e] == null ? "" : String(s[e]), { bold: !0 }, p),
|
|
617
621
|
fontSize: x,
|
|
618
622
|
fillColor: n?.backgroundColor || "#e8e8e8",
|
|
619
623
|
alignment: n?.align || C(t),
|
|
@@ -665,7 +669,7 @@ function E(t, n, r) {
|
|
|
665
669
|
4
|
|
666
670
|
]
|
|
667
671
|
});
|
|
668
|
-
let n = [
|
|
672
|
+
let n = [r(f), m.exportGenerated(h)].filter(Boolean).join(" | ");
|
|
669
673
|
M.push({
|
|
670
674
|
...g(n, {}, p),
|
|
671
675
|
fontSize: 8,
|
|
@@ -697,7 +701,7 @@ function E(t, n, r) {
|
|
|
697
701
|
4
|
|
698
702
|
]
|
|
699
703
|
}), M.push({
|
|
700
|
-
text: `${m.rowsInfo(String(
|
|
704
|
+
text: `${m.rowsInfo(String(i.length))} | ${m.exportGenerated(h)}`,
|
|
701
705
|
fontSize: 9,
|
|
702
706
|
color: "#888",
|
|
703
707
|
margin: [
|
|
@@ -723,7 +727,7 @@ function E(t, n, r) {
|
|
|
723
727
|
paddingTop: () => j,
|
|
724
728
|
paddingBottom: () => j
|
|
725
729
|
}
|
|
726
|
-
}),
|
|
730
|
+
}), c && Object.keys(c.items).length > 0) {
|
|
727
731
|
M.push({
|
|
728
732
|
text: "",
|
|
729
733
|
margin: [
|
|
@@ -742,7 +746,7 @@ function E(t, n, r) {
|
|
|
742
746
|
6
|
|
743
747
|
]
|
|
744
748
|
});
|
|
745
|
-
let e = Object.entries(
|
|
749
|
+
let e = Object.entries(c.items).map(([e, t]) => [{
|
|
746
750
|
...g(e, { bold: !0 }, p),
|
|
747
751
|
fontSize: 9
|
|
748
752
|
}, {
|
|
@@ -757,7 +761,7 @@ function E(t, n, r) {
|
|
|
757
761
|
layout: "noBorders"
|
|
758
762
|
});
|
|
759
763
|
}
|
|
760
|
-
for (let e of
|
|
764
|
+
for (let e of c?.tables ?? []) {
|
|
761
765
|
M.push({
|
|
762
766
|
text: "",
|
|
763
767
|
margin: [
|
|
@@ -818,73 +822,73 @@ function E(t, n, r) {
|
|
|
818
822
|
}
|
|
819
823
|
var D = (e) => String(e ?? "").replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
820
824
|
function O(e, t, n) {
|
|
821
|
-
let { title: r, subtitle: i, totals:
|
|
822
|
-
if (i &&
|
|
823
|
-
|
|
824
|
-
for (let [e, t] of
|
|
825
|
-
|
|
825
|
+
let { title: r, subtitle: i, totals: o, summary: s, metadata: c } = n || {}, l = D, u = (t) => e.map((e) => ` <field name="${l(e)}">${l(t[e])}</field>`).join("\n"), d = ["<?xml version=\"1.0\" encoding=\"UTF-8\"?>", `<export${r ? ` title="${l(r)}"` : ""} generated="${(/* @__PURE__ */ new Date()).toISOString()}">`];
|
|
826
|
+
if (i && d.push(` <subtitle>${l(i)}</subtitle>`), c) {
|
|
827
|
+
d.push(" <metadata>");
|
|
828
|
+
for (let [e, t] of a(c)) d.push(` <item name="${l(e)}">${l(t)}</item>`);
|
|
829
|
+
d.push(" </metadata>");
|
|
826
830
|
}
|
|
827
|
-
|
|
828
|
-
for (let e of t)
|
|
829
|
-
if (
|
|
830
|
-
|
|
831
|
-
for (let [e, t] of Object.entries(
|
|
832
|
-
for (let e of
|
|
833
|
-
|
|
834
|
-
for (let t of e.rows)
|
|
835
|
-
|
|
831
|
+
d.push(` <rows count="${t.length}">`);
|
|
832
|
+
for (let e of t) d.push(" <row>", u(e), " </row>");
|
|
833
|
+
if (d.push(" </rows>"), o && d.push(" <totals>", u(o), " </totals>"), s && (Object.keys(s.items).length > 0 || s.tables?.length)) {
|
|
834
|
+
d.push(" <summary>");
|
|
835
|
+
for (let [e, t] of Object.entries(s.items)) d.push(` <item name="${l(e)}">${l(t)}</item>`);
|
|
836
|
+
for (let e of s.tables || []) {
|
|
837
|
+
d.push(` <table title="${l(e.title)}" label="${l(e.header[0])}" count="${l(e.header[1])}">`);
|
|
838
|
+
for (let t of e.rows) d.push(` <row label="${l(t.label)}" count="${t.count}" />`);
|
|
839
|
+
d.push(" </table>");
|
|
836
840
|
}
|
|
837
|
-
|
|
841
|
+
d.push(" </summary>");
|
|
838
842
|
}
|
|
839
|
-
return
|
|
843
|
+
return d.push("</export>"), new Blob([d.join("\n")], { type: "application/xml;charset=utf-8;" });
|
|
840
844
|
}
|
|
841
|
-
async function k(e, t,
|
|
842
|
-
let
|
|
845
|
+
async function k(e, t, r, i) {
|
|
846
|
+
let a = i?.totals ?? v(r, t, i?.totalKeys, i?.columns, n(i?.metadata)), o = i?.summary, s = i?.metadata, c = i?.subtitle || i?.pdf?.subtitle, l = i?.columnMeta ?? (i?.columns ? _(i.columns, t) : void 0);
|
|
843
847
|
switch (e) {
|
|
844
|
-
case "csv": return y(t,
|
|
845
|
-
case "xlsx": return await x(t,
|
|
846
|
-
totals:
|
|
848
|
+
case "csv": return y(t, r, a, o, s, c);
|
|
849
|
+
case "xlsx": return await x(t, r, {
|
|
850
|
+
totals: a,
|
|
847
851
|
summary: o,
|
|
848
|
-
style:
|
|
849
|
-
sheetName:
|
|
852
|
+
style: i?.xlsx,
|
|
853
|
+
sheetName: i?.xlsx?.sheetName,
|
|
850
854
|
columnMeta: l,
|
|
851
|
-
cellStyles:
|
|
855
|
+
cellStyles: i?.cellStyles,
|
|
852
856
|
metadata: s,
|
|
853
857
|
subtitle: c
|
|
854
858
|
});
|
|
855
|
-
case "json": return S(
|
|
856
|
-
case "html": return C(t,
|
|
857
|
-
title:
|
|
859
|
+
case "json": return S(r, o, s, c);
|
|
860
|
+
case "html": return C(t, r, {
|
|
861
|
+
title: i?.html?.title || i?.title || i?.pdf?.title,
|
|
858
862
|
subtitle: c,
|
|
859
|
-
totals:
|
|
863
|
+
totals: a,
|
|
860
864
|
summary: o,
|
|
861
|
-
customStyles:
|
|
865
|
+
customStyles: i?.html?.styles,
|
|
862
866
|
columnMeta: l,
|
|
863
|
-
cellStyles:
|
|
867
|
+
cellStyles: i?.cellStyles,
|
|
864
868
|
metadata: s,
|
|
865
|
-
branding:
|
|
869
|
+
branding: i?.branding
|
|
866
870
|
});
|
|
867
|
-
case "xml": return O(t,
|
|
868
|
-
title:
|
|
871
|
+
case "xml": return O(t, r, {
|
|
872
|
+
title: i?.title,
|
|
869
873
|
subtitle: c,
|
|
870
|
-
totals:
|
|
874
|
+
totals: a,
|
|
871
875
|
summary: o,
|
|
872
876
|
metadata: s
|
|
873
877
|
});
|
|
874
|
-
case "pdf": return C(t,
|
|
875
|
-
title:
|
|
878
|
+
case "pdf": return C(t, r, {
|
|
879
|
+
title: i?.pdf?.title || i?.title || n(i?.metadata).export,
|
|
876
880
|
subtitle: c,
|
|
877
|
-
totals:
|
|
881
|
+
totals: a,
|
|
878
882
|
summary: o,
|
|
879
883
|
customStyles: `
|
|
880
|
-
@page{size:${
|
|
881
|
-
body{font-size:${
|
|
884
|
+
@page{size:${i?.pdf?.pageSize || "A4"} ${i?.pdf?.orientation || "portrait"};margin:15mm}
|
|
885
|
+
body{font-size:${i?.pdf?.fontSize || 10}pt}
|
|
882
886
|
`,
|
|
883
887
|
columnMeta: l,
|
|
884
|
-
cellStyles:
|
|
888
|
+
cellStyles: i?.cellStyles,
|
|
885
889
|
metadata: s
|
|
886
890
|
});
|
|
887
|
-
default: return y(t,
|
|
891
|
+
default: return y(t, r, a, o, s, c);
|
|
888
892
|
}
|
|
889
893
|
}
|
|
890
|
-
export {
|
|
894
|
+
export { i as autoFormatValue, o as buildBusinessMeta, _ as buildColumnMeta, k as buildExportBlob, d as downloadBlob, l as executeFileAction, r as formatContextLine, a as formatMetadataLines, y as generateCSV, C as generateHTML, S as generateJSON, E as generateTablePDFDocDef, x as generateXLSX, O as generateXML, s as getExtension, u as getFormatLabel, f as openPreview, t as prepareExportRows, c as rawDataToBlob, p as shareFile };
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
// src/file/fileActions.ts
|
|
3
|
+
var e = {
|
|
4
|
+
pdf: ".pdf",
|
|
5
|
+
xlsx: ".xlsx",
|
|
6
|
+
csv: ".csv",
|
|
7
|
+
html: ".html",
|
|
8
|
+
json: ".json",
|
|
9
|
+
xml: ".xml",
|
|
10
|
+
png: ".png"
|
|
11
|
+
}, t = {
|
|
12
|
+
pdf: "application/pdf",
|
|
13
|
+
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
14
|
+
csv: "text/csv;charset=utf-8;",
|
|
15
|
+
html: "text/html;charset=utf-8;",
|
|
16
|
+
json: "application/json",
|
|
17
|
+
xml: "application/xml;charset=utf-8;",
|
|
18
|
+
png: "image/png"
|
|
19
|
+
};
|
|
20
|
+
async function n(e, n) {
|
|
21
|
+
let { runFileTask: r } = await import("./runFileTask-BClLQjmv.js").then((e) => e.n), i = await r({
|
|
22
|
+
kind: "pdf",
|
|
23
|
+
document: e,
|
|
24
|
+
fonts: n ? {
|
|
25
|
+
fonts: n.fonts,
|
|
26
|
+
vfs: n.vfs
|
|
27
|
+
} : void 0
|
|
28
|
+
}, { progress: () => {} });
|
|
29
|
+
return new Blob([i], { type: t.pdf });
|
|
30
|
+
}
|
|
31
|
+
async function r(e, r, i) {
|
|
32
|
+
if (r instanceof Blob) return r;
|
|
33
|
+
switch (e) {
|
|
34
|
+
case "pdf": return n(r, i);
|
|
35
|
+
case "json": return new Blob([JSON.stringify(r, null, 2)], { type: t.json });
|
|
36
|
+
case "csv":
|
|
37
|
+
case "html":
|
|
38
|
+
case "xml": return new Blob([typeof r == "string" ? r : String(r)], { type: t[e] });
|
|
39
|
+
case "xlsx": return new Blob([r], { type: t.xlsx });
|
|
40
|
+
default: return new Blob([typeof r == "string" ? r : JSON.stringify(r)]);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function i(e) {
|
|
44
|
+
return String(e ?? "").replace(/[\\/:*?"<>|\u0000-\u001F]/g, " ").replace(/\./g, " ").replace(/\s+/g, " ").replace(/[\s.]+$/, "").trim().slice(0, 120) || "file";
|
|
45
|
+
}
|
|
46
|
+
function a(e) {
|
|
47
|
+
let t = String(e ?? ""), n = t.lastIndexOf("."), r = n > 0 && /^\.[A-Za-z0-9]{1,5}$/.test(t.slice(n)) ? t.slice(n) : "";
|
|
48
|
+
return i(r ? t.slice(0, n) : t) + r;
|
|
49
|
+
}
|
|
50
|
+
function o(e, t) {
|
|
51
|
+
let n = URL.createObjectURL(e), r = document.createElement("a");
|
|
52
|
+
r.href = n, r.download = a(t), document.body.appendChild(r), r.click(), document.body.removeChild(r), URL.revokeObjectURL(n);
|
|
53
|
+
}
|
|
54
|
+
async function s(e, t, n) {
|
|
55
|
+
let r = new File([e], a(t), { type: e.type });
|
|
56
|
+
if (navigator.share && navigator.canShare?.({ files: [r] })) try {
|
|
57
|
+
return await navigator.share({
|
|
58
|
+
title: n || t,
|
|
59
|
+
files: [r]
|
|
60
|
+
}), !0;
|
|
61
|
+
} catch (e) {
|
|
62
|
+
if (e?.name === "AbortError") return !1;
|
|
63
|
+
}
|
|
64
|
+
if (e.type.includes("text") || e.type.includes("json") || e.type.includes("csv")) try {
|
|
65
|
+
let t = await e.text();
|
|
66
|
+
return await navigator.clipboard.writeText(t), !0;
|
|
67
|
+
} catch {}
|
|
68
|
+
return o(e, t), !0;
|
|
69
|
+
}
|
|
70
|
+
function c(e, t, n) {
|
|
71
|
+
if (t === "html" || t === "pdf" || t === "json" || t === "xml") {
|
|
72
|
+
let t = URL.createObjectURL(e), r = window.open(t, "_blank");
|
|
73
|
+
if (r) {
|
|
74
|
+
if (n) {
|
|
75
|
+
let e = () => {
|
|
76
|
+
try {
|
|
77
|
+
r.document.title = n;
|
|
78
|
+
} catch {}
|
|
79
|
+
};
|
|
80
|
+
r.addEventListener("load", e), setTimeout(e, 100);
|
|
81
|
+
}
|
|
82
|
+
setTimeout(() => URL.revokeObjectURL(t), 6e4);
|
|
83
|
+
}
|
|
84
|
+
return { type: "new_tab" };
|
|
85
|
+
}
|
|
86
|
+
return { type: "modal" };
|
|
87
|
+
}
|
|
88
|
+
async function l(e, t, n) {
|
|
89
|
+
if (t === "pdf") u(e);
|
|
90
|
+
else if (t === "html") {
|
|
91
|
+
let t = URL.createObjectURL(e), n = window.open(t, "_blank");
|
|
92
|
+
n && (n.addEventListener("load", () => n.print()), setTimeout(() => URL.revokeObjectURL(t), 6e4));
|
|
93
|
+
} else o(e, n);
|
|
94
|
+
}
|
|
95
|
+
function u(e) {
|
|
96
|
+
let t = URL.createObjectURL(e), n = document.createElement("iframe");
|
|
97
|
+
n.style.display = "none", n.src = t, document.body.appendChild(n), n.addEventListener("load", () => {
|
|
98
|
+
try {
|
|
99
|
+
n.contentWindow?.print();
|
|
100
|
+
} catch {
|
|
101
|
+
window.open(t, "_blank");
|
|
102
|
+
}
|
|
103
|
+
setTimeout(() => {
|
|
104
|
+
n.remove(), URL.revokeObjectURL(t);
|
|
105
|
+
}, 6e4);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async function d(e, t, n, i, a, u) {
|
|
109
|
+
let d = await r(n, e, u);
|
|
110
|
+
switch (i) {
|
|
111
|
+
case "download":
|
|
112
|
+
o(d, t);
|
|
113
|
+
break;
|
|
114
|
+
case "share":
|
|
115
|
+
await s(d, t, a);
|
|
116
|
+
break;
|
|
117
|
+
case "preview":
|
|
118
|
+
c(d, n, a || t);
|
|
119
|
+
break;
|
|
120
|
+
case "print":
|
|
121
|
+
await l(d, n, t);
|
|
122
|
+
break;
|
|
123
|
+
case "open": {
|
|
124
|
+
let e = URL.createObjectURL(d);
|
|
125
|
+
window.open(e, "_blank"), setTimeout(() => URL.revokeObjectURL(e), 6e4);
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function f(t) {
|
|
131
|
+
return e[t] || "";
|
|
132
|
+
}
|
|
133
|
+
function p(e) {
|
|
134
|
+
return {
|
|
135
|
+
csv: "CSV",
|
|
136
|
+
xlsx: "Excel",
|
|
137
|
+
json: "JSON",
|
|
138
|
+
pdf: "PDF",
|
|
139
|
+
html: "HTML",
|
|
140
|
+
xml: "XML",
|
|
141
|
+
png: "Image"
|
|
142
|
+
}[e] || e.toUpperCase();
|
|
143
|
+
}
|
|
144
|
+
export { f as a, r as c, d as i, i as l, n, p as o, o as r, c as s, t, s as u };
|