@ktnpm_devops/react-component 0.2.1 → 0.3.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/index.cjs +34 -33
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -33
- package/dist/index.js.map +1 -1
- package/dist/index10.cjs +15 -4
- package/dist/index10.cjs.map +1 -1
- package/dist/index10.js +15 -4
- package/dist/index10.js.map +1 -1
- package/dist/index11.cjs +4 -16
- package/dist/index11.cjs.map +1 -1
- package/dist/index11.js +4 -16
- package/dist/index11.js.map +1 -1
- package/dist/index12.cjs +16 -10
- package/dist/index12.cjs.map +1 -1
- package/dist/index12.js +16 -10
- package/dist/index12.js.map +1 -1
- package/dist/index13.cjs +10 -100
- package/dist/index13.cjs.map +1 -1
- package/dist/index13.js +11 -101
- package/dist/index13.js.map +1 -1
- package/dist/index14.cjs +100 -20
- package/dist/index14.cjs.map +1 -1
- package/dist/index14.js +101 -21
- package/dist/index14.js.map +1 -1
- package/dist/index15.cjs +20 -90
- package/dist/index15.cjs.map +1 -1
- package/dist/index15.js +21 -91
- package/dist/index15.js.map +1 -1
- package/dist/index16.cjs +85 -153
- package/dist/index16.cjs.map +1 -1
- package/dist/index16.js +87 -155
- package/dist/index16.js.map +1 -1
- package/dist/index17.cjs +150 -128
- package/dist/index17.cjs.map +1 -1
- package/dist/index17.js +150 -128
- package/dist/index17.js.map +1 -1
- package/dist/index18.cjs +121 -106
- package/dist/index18.cjs.map +1 -1
- package/dist/index18.js +122 -107
- package/dist/index18.js.map +1 -1
- package/dist/index19.cjs +121 -17
- package/dist/index19.cjs.map +1 -1
- package/dist/index19.js +121 -17
- package/dist/index19.js.map +1 -1
- package/dist/index20.cjs +17 -8
- package/dist/index20.cjs.map +1 -1
- package/dist/index20.js +18 -9
- package/dist/index20.js.map +1 -1
- package/dist/index21.cjs +7 -130
- package/dist/index21.cjs.map +1 -1
- package/dist/index21.js +9 -132
- package/dist/index21.js.map +1 -1
- package/dist/index22.cjs +128 -35
- package/dist/index22.cjs.map +1 -1
- package/dist/index22.js +129 -36
- package/dist/index22.js.map +1 -1
- package/dist/index23.cjs +36 -222
- package/dist/index23.cjs.map +1 -1
- package/dist/index23.js +37 -223
- package/dist/index23.js.map +1 -1
- package/dist/index24.cjs +218 -28
- package/dist/index24.cjs.map +1 -1
- package/dist/index24.js +220 -30
- package/dist/index24.js.map +1 -1
- package/dist/index25.cjs +29 -73
- package/dist/index25.cjs.map +1 -1
- package/dist/index25.js +31 -75
- package/dist/index25.js.map +1 -1
- package/dist/index26.cjs +69 -144
- package/dist/index26.cjs.map +1 -1
- package/dist/index26.js +70 -145
- package/dist/index26.js.map +1 -1
- package/dist/index27.cjs +152 -7
- package/dist/index27.cjs.map +1 -1
- package/dist/index27.js +154 -9
- package/dist/index27.js.map +1 -1
- package/dist/index28.cjs +8 -17
- package/dist/index28.cjs.map +1 -1
- package/dist/index28.js +9 -18
- package/dist/index28.js.map +1 -1
- package/dist/index29.cjs +15 -75
- package/dist/index29.cjs.map +1 -1
- package/dist/index29.js +16 -76
- package/dist/index29.js.map +1 -1
- package/dist/index3.cjs +76 -16
- package/dist/index3.cjs.map +1 -1
- package/dist/index3.js +76 -16
- package/dist/index3.js.map +1 -1
- package/dist/index30.cjs +68 -134
- package/dist/index30.cjs.map +1 -1
- package/dist/index30.js +70 -136
- package/dist/index30.js.map +1 -1
- package/dist/index31.cjs +136 -98
- package/dist/index31.cjs.map +1 -1
- package/dist/index31.js +137 -99
- package/dist/index31.js.map +1 -1
- package/dist/index32.cjs +105 -6
- package/dist/index32.cjs.map +1 -1
- package/dist/index32.js +106 -7
- package/dist/index32.js.map +1 -1
- package/dist/index33.cjs +6 -216
- package/dist/index33.cjs.map +1 -1
- package/dist/index33.js +7 -217
- package/dist/index33.js.map +1 -1
- package/dist/index34.cjs +215 -7
- package/dist/index34.cjs.map +1 -1
- package/dist/index34.js +217 -9
- package/dist/index34.js.map +1 -1
- package/dist/index35.cjs +10 -16
- package/dist/index35.cjs.map +1 -1
- package/dist/index35.js +9 -15
- package/dist/index35.js.map +1 -1
- package/dist/index36.cjs +15 -6
- package/dist/index36.cjs.map +1 -1
- package/dist/index36.js +15 -6
- package/dist/index36.js.map +1 -1
- package/dist/index37.cjs +4 -1
- package/dist/index37.cjs.map +1 -1
- package/dist/index37.js +4 -1
- package/dist/index37.js.map +1 -1
- package/dist/index38.cjs +11 -2
- package/dist/index38.cjs.map +1 -1
- package/dist/index38.js +11 -2
- package/dist/index38.js.map +1 -1
- package/dist/index39.cjs +67 -21
- package/dist/index39.cjs.map +1 -1
- package/dist/index39.js +66 -20
- package/dist/index39.js.map +1 -1
- package/dist/index4.cjs +12 -8
- package/dist/index4.cjs.map +1 -1
- package/dist/index4.js +12 -8
- package/dist/index4.js.map +1 -1
- package/dist/index40.cjs +39 -67
- package/dist/index40.cjs.map +1 -1
- package/dist/index40.js +38 -66
- package/dist/index40.js.map +1 -1
- package/dist/index41.cjs +15 -33
- package/dist/index41.cjs.map +1 -1
- package/dist/index41.js +16 -34
- package/dist/index41.js.map +1 -1
- package/dist/index42.cjs +52 -16
- package/dist/index42.cjs.map +1 -1
- package/dist/index42.js +52 -16
- package/dist/index42.js.map +1 -1
- package/dist/index43.cjs +13 -10
- package/dist/index43.cjs.map +1 -1
- package/dist/index43.js +13 -10
- package/dist/index43.js.map +1 -1
- package/dist/index44.cjs +29 -17
- package/dist/index44.cjs.map +1 -1
- package/dist/index44.js +29 -17
- package/dist/index44.js.map +1 -1
- package/dist/index45.cjs +19 -134
- package/dist/index45.cjs.map +1 -1
- package/dist/index45.js +18 -133
- package/dist/index45.js.map +1 -1
- package/dist/index46.cjs +13 -40
- package/dist/index46.cjs.map +1 -1
- package/dist/index46.js +13 -40
- package/dist/index46.js.map +1 -1
- package/dist/index47.cjs +2 -29
- package/dist/index47.cjs.map +1 -1
- package/dist/index47.js +3 -30
- package/dist/index47.js.map +1 -1
- package/dist/index48.cjs +2 -53
- package/dist/index48.cjs.map +1 -1
- package/dist/index48.js +3 -54
- package/dist/index48.js.map +1 -1
- package/dist/index49.cjs +3 -30
- package/dist/index49.cjs.map +1 -1
- package/dist/index49.js +3 -30
- package/dist/index49.js.map +1 -1
- package/dist/index5.cjs +9 -16
- package/dist/index5.cjs.map +1 -1
- package/dist/index5.js +10 -17
- package/dist/index5.js.map +1 -1
- package/dist/index50.cjs +34 -34
- package/dist/index50.js +34 -34
- package/dist/index51.cjs +49 -19
- package/dist/index51.cjs.map +1 -1
- package/dist/index51.js +50 -20
- package/dist/index51.js.map +1 -1
- package/dist/index52.cjs +16 -13
- package/dist/index52.cjs.map +1 -1
- package/dist/index52.js +16 -13
- package/dist/index52.js.map +1 -1
- package/dist/index53.cjs +35 -32
- package/dist/index53.cjs.map +1 -1
- package/dist/index53.js +35 -32
- package/dist/index53.js.map +1 -1
- package/dist/index54.cjs +53 -5
- package/dist/index54.cjs.map +1 -1
- package/dist/index54.js +54 -6
- package/dist/index54.js.map +1 -1
- package/dist/index55.cjs +134 -19
- package/dist/index55.cjs.map +1 -1
- package/dist/index55.js +133 -18
- package/dist/index55.js.map +1 -1
- package/dist/index56.cjs +40 -10
- package/dist/index56.cjs.map +1 -1
- package/dist/index56.js +40 -10
- package/dist/index56.js.map +1 -1
- package/dist/index57.cjs +26 -8
- package/dist/index57.cjs.map +1 -1
- package/dist/index57.js +27 -9
- package/dist/index57.js.map +1 -1
- package/dist/index58.cjs +22 -19
- package/dist/index58.cjs.map +1 -1
- package/dist/index58.js +22 -19
- package/dist/index58.js.map +1 -1
- package/dist/index59.cjs +10 -79
- package/dist/index59.cjs.map +1 -1
- package/dist/index59.js +10 -79
- package/dist/index59.js.map +1 -1
- package/dist/index6.cjs +19 -65
- package/dist/index6.cjs.map +1 -1
- package/dist/index6.js +19 -65
- package/dist/index6.js.map +1 -1
- package/dist/index60.cjs +19 -22
- package/dist/index60.cjs.map +1 -1
- package/dist/index60.js +20 -23
- package/dist/index60.js.map +1 -1
- package/dist/index61.cjs +54 -27
- package/dist/index61.cjs.map +1 -1
- package/dist/index61.js +55 -28
- package/dist/index61.js.map +1 -1
- package/dist/index62.cjs +37 -13
- package/dist/index62.cjs.map +1 -1
- package/dist/index62.js +38 -14
- package/dist/index62.js.map +1 -1
- package/dist/index63.cjs +16 -49
- package/dist/index63.cjs.map +1 -1
- package/dist/index63.js +16 -49
- package/dist/index63.js.map +1 -1
- package/dist/index64.cjs +16 -37
- package/dist/index64.cjs.map +1 -1
- package/dist/index64.js +16 -37
- package/dist/index64.js.map +1 -1
- package/dist/index65.cjs +18 -0
- package/dist/index65.cjs.map +1 -0
- package/dist/index65.js +18 -0
- package/dist/index65.js.map +1 -0
- package/dist/index7.cjs +58 -75
- package/dist/index7.cjs.map +1 -1
- package/dist/index7.js +58 -75
- package/dist/index7.js.map +1 -1
- package/dist/index8.cjs +82 -15
- package/dist/index8.cjs.map +1 -1
- package/dist/index8.js +82 -15
- package/dist/index8.js.map +1 -1
- package/dist/index9.cjs +14 -15
- package/dist/index9.cjs.map +1 -1
- package/dist/index9.js +15 -16
- package/dist/index9.js.map +1 -1
- package/dist/style.css +271 -0
- package/dist/tokens/semantic-tokens.css +21 -0
- package/dist/tokens/tokens.d.ts +35 -0
- package/dist/tokens/tokens.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/index2.cjs +0 -44
- package/dist/index2.cjs.map +0 -1
- package/dist/index2.js +0 -44
- package/dist/index2.js.map +0 -1
package/dist/index65.cjs
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const root = "krc-root-la9-1";
|
|
4
|
+
const logo = "krc-logo-b73UT";
|
|
5
|
+
const card = "krc-card-1ev-q";
|
|
6
|
+
const footer = "krc-footer-E0B15";
|
|
7
|
+
const styles = {
|
|
8
|
+
root,
|
|
9
|
+
logo,
|
|
10
|
+
card,
|
|
11
|
+
footer
|
|
12
|
+
};
|
|
13
|
+
exports.card = card;
|
|
14
|
+
exports.default = styles;
|
|
15
|
+
exports.footer = footer;
|
|
16
|
+
exports.logo = logo;
|
|
17
|
+
exports.root = root;
|
|
18
|
+
//# sourceMappingURL=index65.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index65.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
|
package/dist/index65.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const root = "krc-root-la9-1";
|
|
2
|
+
const logo = "krc-logo-b73UT";
|
|
3
|
+
const card = "krc-card-1ev-q";
|
|
4
|
+
const footer = "krc-footer-E0B15";
|
|
5
|
+
const styles = {
|
|
6
|
+
root,
|
|
7
|
+
logo,
|
|
8
|
+
card,
|
|
9
|
+
footer
|
|
10
|
+
};
|
|
11
|
+
export {
|
|
12
|
+
card,
|
|
13
|
+
styles as default,
|
|
14
|
+
footer,
|
|
15
|
+
logo,
|
|
16
|
+
root
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=index65.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index65.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
|
package/dist/index7.cjs
CHANGED
|
@@ -1,85 +1,68 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
return normalized || "export";
|
|
3
|
+
const truncateWithEllipsis = (value, maxLength = 36) => {
|
|
4
|
+
if (value.length <= maxLength) return value;
|
|
5
|
+
if (maxLength <= 3) return value.slice(0, maxLength);
|
|
6
|
+
return `${value.slice(0, maxLength - 3)}...`;
|
|
8
7
|
};
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
link.href = url;
|
|
22
|
-
link.download = filename;
|
|
23
|
-
document.body.appendChild(link);
|
|
24
|
-
link.click();
|
|
25
|
-
document.body.removeChild(link);
|
|
26
|
-
URL.revokeObjectURL(url);
|
|
27
|
-
};
|
|
28
|
-
const exportTableToCsv = (table, filename) => {
|
|
29
|
-
if (table.length === 0) return;
|
|
30
|
-
const csv = buildCsv(table);
|
|
31
|
-
const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
|
|
32
|
-
const finalName = filename.endsWith(".csv") ? filename : `${filename}.csv`;
|
|
33
|
-
triggerDownload(blob, finalName);
|
|
8
|
+
const formatNumber = (value, options) => Number.isFinite(value) ? value.toLocaleString(void 0, options) : "0";
|
|
9
|
+
const formatBytes = (value) => {
|
|
10
|
+
if (!Number.isFinite(value) || value === 0) return "0 B";
|
|
11
|
+
const units = ["B", "KB", "MB", "GB", "TB", "PB"];
|
|
12
|
+
let index = 0;
|
|
13
|
+
let current = Math.abs(value);
|
|
14
|
+
while (current >= 1024 && index < units.length - 1) {
|
|
15
|
+
current /= 1024;
|
|
16
|
+
index += 1;
|
|
17
|
+
}
|
|
18
|
+
const formatted = current.toFixed(current >= 10 || index === 0 ? 0 : 1);
|
|
19
|
+
return `${value < 0 ? "-" : ""}${formatted} ${units[index]}`;
|
|
34
20
|
};
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
21
|
+
const DATETIME_FORMATTERS = /* @__PURE__ */ new Map();
|
|
22
|
+
const getDateTimeFormatter = (timeZone, withSeconds) => {
|
|
23
|
+
const key = `${timeZone}-${withSeconds ? "s" : "n"}`;
|
|
24
|
+
const cached = DATETIME_FORMATTERS.get(key);
|
|
25
|
+
if (cached) return cached;
|
|
26
|
+
const formatter = new Intl.DateTimeFormat(void 0, {
|
|
27
|
+
year: "numeric",
|
|
28
|
+
month: "2-digit",
|
|
29
|
+
day: "2-digit",
|
|
30
|
+
hour: "2-digit",
|
|
31
|
+
minute: "2-digit",
|
|
32
|
+
second: withSeconds ? "2-digit" : void 0,
|
|
33
|
+
hour12: false,
|
|
34
|
+
timeZone
|
|
35
|
+
});
|
|
36
|
+
DATETIME_FORMATTERS.set(key, formatter);
|
|
37
|
+
return formatter;
|
|
43
38
|
};
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
-
if (
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
39
|
+
const formatDataTimestamp = (value, options = {}) => {
|
|
40
|
+
const { fallback = "Unknown", withSeconds = false, timeZone = "UTC", showTimeZoneLabel = false } = options;
|
|
41
|
+
if (!value) return fallback;
|
|
42
|
+
const date = new Date(value);
|
|
43
|
+
if (Number.isNaN(date.getTime())) return typeof value === "string" ? value : fallback;
|
|
44
|
+
const formatter = getDateTimeFormatter(timeZone, withSeconds);
|
|
45
|
+
const formatted = formatter.format(date);
|
|
46
|
+
return showTimeZoneLabel ? `${formatted} ${timeZone}` : formatted;
|
|
51
47
|
};
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
const tableHtml = buildTableHtml(table);
|
|
56
|
-
win.document.write("<!DOCTYPE html>");
|
|
57
|
-
win.document.write(`<html><head><title>${title}</title>`);
|
|
58
|
-
win.document.write(
|
|
59
|
-
"<style>body{font-family:Arial,Helvetica,sans-serif;padding:24px;color:#1f2937;}h1{font-size:20px;margin-bottom:16px;}img{max-width:100%;height:auto;margin-bottom:16px;border:1px solid #e5e7eb;border-radius:12px;}table{border-collapse:collapse;width:100%;}th,td{border:1px solid #d1d5db;padding:8px;text-align:left;font-size:12px;}th{background:#f3f4f6;text-transform:uppercase;letter-spacing:0.05em;font-weight:600;}</style>"
|
|
60
|
-
);
|
|
61
|
-
win.document.write("</head><body>");
|
|
62
|
-
win.document.write(`<h1>${title}</h1>`);
|
|
63
|
-
win.document.write(`<img src="${chartDataUrl}" alt="${title}" />`);
|
|
64
|
-
win.document.write(tableHtml);
|
|
65
|
-
win.document.write("</body></html>");
|
|
66
|
-
win.document.close();
|
|
67
|
-
win.focus();
|
|
68
|
-
setTimeout(() => win.print(), 300);
|
|
48
|
+
const formatLocalISOString = (date) => {
|
|
49
|
+
const pad = (n) => `${n}`.padStart(2, "0");
|
|
50
|
+
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;
|
|
69
51
|
};
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const suffixSanitized = sanitizeFilename(suffix);
|
|
74
|
-
return `${base}-${suffixSanitized}`;
|
|
52
|
+
const generateUUID = () => {
|
|
53
|
+
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
54
|
+
return crypto.randomUUID();
|
|
75
55
|
}
|
|
76
|
-
return
|
|
56
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
|
|
57
|
+
const r = Math.random() * 16 | 0;
|
|
58
|
+
const v = c === "x" ? r : r & 3 | 8;
|
|
59
|
+
return v.toString(16);
|
|
60
|
+
});
|
|
77
61
|
};
|
|
78
|
-
exports.
|
|
79
|
-
exports.
|
|
80
|
-
exports.
|
|
81
|
-
exports.
|
|
82
|
-
exports.
|
|
83
|
-
exports.
|
|
84
|
-
exports.toStringTable = toStringTable;
|
|
62
|
+
exports.formatBytes = formatBytes;
|
|
63
|
+
exports.formatDataTimestamp = formatDataTimestamp;
|
|
64
|
+
exports.formatLocalISOString = formatLocalISOString;
|
|
65
|
+
exports.formatNumber = formatNumber;
|
|
66
|
+
exports.generateUUID = generateUUID;
|
|
67
|
+
exports.truncateWithEllipsis = truncateWithEllipsis;
|
|
85
68
|
//# sourceMappingURL=index7.cjs.map
|
package/dist/index7.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index7.cjs","sources":["../src/utils/
|
|
1
|
+
{"version":3,"file":"index7.cjs","sources":["../src/utils/format.ts"],"sourcesContent":["export const truncateWithEllipsis = (value: string, maxLength = 36) => {\n if (value.length <= maxLength) return value;\n if (maxLength <= 3) return value.slice(0, maxLength);\n return `${value.slice(0, maxLength - 3)}...`;\n};\n\nexport const formatNumber = (value: number, options?: Intl.NumberFormatOptions) =>\n Number.isFinite(value) ? value.toLocaleString(undefined, options) : '0';\n\nexport const formatBytes = (value: number): string => {\n if (!Number.isFinite(value) || value === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\n let index = 0;\n let current = Math.abs(value);\n while (current >= 1024 && index < units.length - 1) {\n current /= 1024;\n index += 1;\n }\n const formatted = current.toFixed(current >= 10 || index === 0 ? 0 : 1);\n return `${value < 0 ? '-' : ''}${formatted} ${units[index]}`;\n};\n\ninterface FormatDataTimestampOptions {\n fallback?: string;\n withSeconds?: boolean;\n timeZone?: string;\n showTimeZoneLabel?: boolean;\n}\n\nconst DATETIME_FORMATTERS = new Map<string, Intl.DateTimeFormat>();\n\nconst getDateTimeFormatter = (timeZone: string, withSeconds: boolean) => {\n const key = `${timeZone}-${withSeconds ? 's' : 'n'}`;\n const cached = DATETIME_FORMATTERS.get(key);\n if (cached) return cached;\n const formatter = new Intl.DateTimeFormat(undefined, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: withSeconds ? '2-digit' : undefined,\n hour12: false,\n timeZone,\n });\n DATETIME_FORMATTERS.set(key, formatter);\n return formatter;\n};\n\nexport const formatDataTimestamp = (\n value: string | null | undefined,\n options: FormatDataTimestampOptions = {},\n): string => {\n const { fallback = 'Unknown', withSeconds = false, timeZone = 'UTC', showTimeZoneLabel = false } =\n options;\n if (!value) return fallback;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return typeof value === 'string' ? value : fallback;\n const formatter = getDateTimeFormatter(timeZone, withSeconds);\n const formatted = formatter.format(date);\n return showTimeZoneLabel ? `${formatted} ${timeZone}` : formatted;\n};\n\nexport const formatLocalISOString = (date: Date): string => {\n const pad = (n: number) => `${n}`.padStart(2, '0');\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n};\n\nexport const generateUUID = (): string => {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n"],"names":[],"mappings":";;AAAO,MAAM,uBAAuB,CAAC,OAAe,YAAY,OAAO;AACrE,MAAI,MAAM,UAAU,UAAW,QAAO;AACtC,MAAI,aAAa,EAAG,QAAO,MAAM,MAAM,GAAG,SAAS;AACnD,SAAO,GAAG,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC;AACzC;AAEO,MAAM,eAAe,CAAC,OAAe,YAC1C,OAAO,SAAS,KAAK,IAAI,MAAM,eAAe,QAAW,OAAO,IAAI;AAE/D,MAAM,cAAc,CAAC,UAA0B;AACpD,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,UAAU,EAAG,QAAO;AACnD,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI;AAChD,MAAI,QAAQ;AACZ,MAAI,UAAU,KAAK,IAAI,KAAK;AAC5B,SAAO,WAAW,QAAQ,QAAQ,MAAM,SAAS,GAAG;AAClD,eAAW;AACX,aAAS;AAAA,EACX;AACA,QAAM,YAAY,QAAQ,QAAQ,WAAW,MAAM,UAAU,IAAI,IAAI,CAAC;AACtE,SAAO,GAAG,QAAQ,IAAI,MAAM,EAAE,GAAG,SAAS,IAAI,MAAM,KAAK,CAAC;AAC5D;AASA,MAAM,0CAA0B,IAAA;AAEhC,MAAM,uBAAuB,CAAC,UAAkB,gBAAyB;AACvE,QAAM,MAAM,GAAG,QAAQ,IAAI,cAAc,MAAM,GAAG;AAClD,QAAM,SAAS,oBAAoB,IAAI,GAAG;AAC1C,MAAI,OAAQ,QAAO;AACnB,QAAM,YAAY,IAAI,KAAK,eAAe,QAAW;AAAA,IACnD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ,cAAc,YAAY;AAAA,IAClC,QAAQ;AAAA,IACR;AAAA,EAAA,CACD;AACD,sBAAoB,IAAI,KAAK,SAAS;AACtC,SAAO;AACT;AAEO,MAAM,sBAAsB,CACjC,OACA,UAAsC,OAC3B;AACX,QAAM,EAAE,WAAW,WAAW,cAAc,OAAO,WAAW,OAAO,oBAAoB,MAAA,IACvF;AACF,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,MAAI,OAAO,MAAM,KAAK,QAAA,CAAS,EAAG,QAAO,OAAO,UAAU,WAAW,QAAQ;AAC7E,QAAM,YAAY,qBAAqB,UAAU,WAAW;AAC5D,QAAM,YAAY,UAAU,OAAO,IAAI;AACvC,SAAO,oBAAoB,GAAG,SAAS,IAAI,QAAQ,KAAK;AAC1D;AAEO,MAAM,uBAAuB,CAAC,SAAuB;AAC1D,QAAM,MAAM,CAAC,MAAc,GAAG,CAAC,GAAG,SAAS,GAAG,GAAG;AACjD,SAAO,GAAG,KAAK,YAAA,CAAa,IAAI,IAAI,KAAK,SAAA,IAAa,CAAC,CAAC,IAAI,IAAI,KAAK,SAAS,CAAC,IAAI,IAAI,KAAK,SAAA,CAAU,CAAC,IAAI,IAAI,KAAK,WAAA,CAAY,CAAC,IAAI,IAAI,KAAK,WAAA,CAAY,CAAC;AAC7J;AAEO,MAAM,eAAe,MAAc;AACxC,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AAC5E,WAAO,OAAO,WAAA;AAAA,EAChB;AACA,SAAO,uCAAuC,QAAQ,SAAS,CAAC,MAAM;AACpE,UAAM,IAAK,KAAK,OAAA,IAAW,KAAM;AACjC,UAAM,IAAI,MAAM,MAAM,IAAK,IAAI,IAAO;AACtC,WAAO,EAAE,SAAS,EAAE;AAAA,EACtB,CAAC;AACH;;;;;;;"}
|
package/dist/index7.js
CHANGED
|
@@ -1,85 +1,68 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
return normalized || "export";
|
|
1
|
+
const truncateWithEllipsis = (value, maxLength = 36) => {
|
|
2
|
+
if (value.length <= maxLength) return value;
|
|
3
|
+
if (maxLength <= 3) return value.slice(0, maxLength);
|
|
4
|
+
return `${value.slice(0, maxLength - 3)}...`;
|
|
6
5
|
};
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
link.href = url;
|
|
20
|
-
link.download = filename;
|
|
21
|
-
document.body.appendChild(link);
|
|
22
|
-
link.click();
|
|
23
|
-
document.body.removeChild(link);
|
|
24
|
-
URL.revokeObjectURL(url);
|
|
25
|
-
};
|
|
26
|
-
const exportTableToCsv = (table, filename) => {
|
|
27
|
-
if (table.length === 0) return;
|
|
28
|
-
const csv = buildCsv(table);
|
|
29
|
-
const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
|
|
30
|
-
const finalName = filename.endsWith(".csv") ? filename : `${filename}.csv`;
|
|
31
|
-
triggerDownload(blob, finalName);
|
|
6
|
+
const formatNumber = (value, options) => Number.isFinite(value) ? value.toLocaleString(void 0, options) : "0";
|
|
7
|
+
const formatBytes = (value) => {
|
|
8
|
+
if (!Number.isFinite(value) || value === 0) return "0 B";
|
|
9
|
+
const units = ["B", "KB", "MB", "GB", "TB", "PB"];
|
|
10
|
+
let index = 0;
|
|
11
|
+
let current = Math.abs(value);
|
|
12
|
+
while (current >= 1024 && index < units.length - 1) {
|
|
13
|
+
current /= 1024;
|
|
14
|
+
index += 1;
|
|
15
|
+
}
|
|
16
|
+
const formatted = current.toFixed(current >= 10 || index === 0 ? 0 : 1);
|
|
17
|
+
return `${value < 0 ? "-" : ""}${formatted} ${units[index]}`;
|
|
32
18
|
};
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
19
|
+
const DATETIME_FORMATTERS = /* @__PURE__ */ new Map();
|
|
20
|
+
const getDateTimeFormatter = (timeZone, withSeconds) => {
|
|
21
|
+
const key = `${timeZone}-${withSeconds ? "s" : "n"}`;
|
|
22
|
+
const cached = DATETIME_FORMATTERS.get(key);
|
|
23
|
+
if (cached) return cached;
|
|
24
|
+
const formatter = new Intl.DateTimeFormat(void 0, {
|
|
25
|
+
year: "numeric",
|
|
26
|
+
month: "2-digit",
|
|
27
|
+
day: "2-digit",
|
|
28
|
+
hour: "2-digit",
|
|
29
|
+
minute: "2-digit",
|
|
30
|
+
second: withSeconds ? "2-digit" : void 0,
|
|
31
|
+
hour12: false,
|
|
32
|
+
timeZone
|
|
33
|
+
});
|
|
34
|
+
DATETIME_FORMATTERS.set(key, formatter);
|
|
35
|
+
return formatter;
|
|
41
36
|
};
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
if (
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
37
|
+
const formatDataTimestamp = (value, options = {}) => {
|
|
38
|
+
const { fallback = "Unknown", withSeconds = false, timeZone = "UTC", showTimeZoneLabel = false } = options;
|
|
39
|
+
if (!value) return fallback;
|
|
40
|
+
const date = new Date(value);
|
|
41
|
+
if (Number.isNaN(date.getTime())) return typeof value === "string" ? value : fallback;
|
|
42
|
+
const formatter = getDateTimeFormatter(timeZone, withSeconds);
|
|
43
|
+
const formatted = formatter.format(date);
|
|
44
|
+
return showTimeZoneLabel ? `${formatted} ${timeZone}` : formatted;
|
|
49
45
|
};
|
|
50
|
-
const
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
const tableHtml = buildTableHtml(table);
|
|
54
|
-
win.document.write("<!DOCTYPE html>");
|
|
55
|
-
win.document.write(`<html><head><title>${title}</title>`);
|
|
56
|
-
win.document.write(
|
|
57
|
-
"<style>body{font-family:Arial,Helvetica,sans-serif;padding:24px;color:#1f2937;}h1{font-size:20px;margin-bottom:16px;}img{max-width:100%;height:auto;margin-bottom:16px;border:1px solid #e5e7eb;border-radius:12px;}table{border-collapse:collapse;width:100%;}th,td{border:1px solid #d1d5db;padding:8px;text-align:left;font-size:12px;}th{background:#f3f4f6;text-transform:uppercase;letter-spacing:0.05em;font-weight:600;}</style>"
|
|
58
|
-
);
|
|
59
|
-
win.document.write("</head><body>");
|
|
60
|
-
win.document.write(`<h1>${title}</h1>`);
|
|
61
|
-
win.document.write(`<img src="${chartDataUrl}" alt="${title}" />`);
|
|
62
|
-
win.document.write(tableHtml);
|
|
63
|
-
win.document.write("</body></html>");
|
|
64
|
-
win.document.close();
|
|
65
|
-
win.focus();
|
|
66
|
-
setTimeout(() => win.print(), 300);
|
|
46
|
+
const formatLocalISOString = (date) => {
|
|
47
|
+
const pad = (n) => `${n}`.padStart(2, "0");
|
|
48
|
+
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;
|
|
67
49
|
};
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const suffixSanitized = sanitizeFilename(suffix);
|
|
72
|
-
return `${base}-${suffixSanitized}`;
|
|
50
|
+
const generateUUID = () => {
|
|
51
|
+
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
52
|
+
return crypto.randomUUID();
|
|
73
53
|
}
|
|
74
|
-
return
|
|
54
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
|
|
55
|
+
const r = Math.random() * 16 | 0;
|
|
56
|
+
const v = c === "x" ? r : r & 3 | 8;
|
|
57
|
+
return v.toString(16);
|
|
58
|
+
});
|
|
75
59
|
};
|
|
76
60
|
export {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
toStringTable
|
|
61
|
+
formatBytes,
|
|
62
|
+
formatDataTimestamp,
|
|
63
|
+
formatLocalISOString,
|
|
64
|
+
formatNumber,
|
|
65
|
+
generateUUID,
|
|
66
|
+
truncateWithEllipsis
|
|
84
67
|
};
|
|
85
68
|
//# sourceMappingURL=index7.js.map
|
package/dist/index7.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index7.js","sources":["../src/utils/
|
|
1
|
+
{"version":3,"file":"index7.js","sources":["../src/utils/format.ts"],"sourcesContent":["export const truncateWithEllipsis = (value: string, maxLength = 36) => {\n if (value.length <= maxLength) return value;\n if (maxLength <= 3) return value.slice(0, maxLength);\n return `${value.slice(0, maxLength - 3)}...`;\n};\n\nexport const formatNumber = (value: number, options?: Intl.NumberFormatOptions) =>\n Number.isFinite(value) ? value.toLocaleString(undefined, options) : '0';\n\nexport const formatBytes = (value: number): string => {\n if (!Number.isFinite(value) || value === 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\n let index = 0;\n let current = Math.abs(value);\n while (current >= 1024 && index < units.length - 1) {\n current /= 1024;\n index += 1;\n }\n const formatted = current.toFixed(current >= 10 || index === 0 ? 0 : 1);\n return `${value < 0 ? '-' : ''}${formatted} ${units[index]}`;\n};\n\ninterface FormatDataTimestampOptions {\n fallback?: string;\n withSeconds?: boolean;\n timeZone?: string;\n showTimeZoneLabel?: boolean;\n}\n\nconst DATETIME_FORMATTERS = new Map<string, Intl.DateTimeFormat>();\n\nconst getDateTimeFormatter = (timeZone: string, withSeconds: boolean) => {\n const key = `${timeZone}-${withSeconds ? 's' : 'n'}`;\n const cached = DATETIME_FORMATTERS.get(key);\n if (cached) return cached;\n const formatter = new Intl.DateTimeFormat(undefined, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: withSeconds ? '2-digit' : undefined,\n hour12: false,\n timeZone,\n });\n DATETIME_FORMATTERS.set(key, formatter);\n return formatter;\n};\n\nexport const formatDataTimestamp = (\n value: string | null | undefined,\n options: FormatDataTimestampOptions = {},\n): string => {\n const { fallback = 'Unknown', withSeconds = false, timeZone = 'UTC', showTimeZoneLabel = false } =\n options;\n if (!value) return fallback;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return typeof value === 'string' ? value : fallback;\n const formatter = getDateTimeFormatter(timeZone, withSeconds);\n const formatted = formatter.format(date);\n return showTimeZoneLabel ? `${formatted} ${timeZone}` : formatted;\n};\n\nexport const formatLocalISOString = (date: Date): string => {\n const pad = (n: number) => `${n}`.padStart(2, '0');\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n};\n\nexport const generateUUID = (): string => {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n"],"names":[],"mappings":"AAAO,MAAM,uBAAuB,CAAC,OAAe,YAAY,OAAO;AACrE,MAAI,MAAM,UAAU,UAAW,QAAO;AACtC,MAAI,aAAa,EAAG,QAAO,MAAM,MAAM,GAAG,SAAS;AACnD,SAAO,GAAG,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC;AACzC;AAEO,MAAM,eAAe,CAAC,OAAe,YAC1C,OAAO,SAAS,KAAK,IAAI,MAAM,eAAe,QAAW,OAAO,IAAI;AAE/D,MAAM,cAAc,CAAC,UAA0B;AACpD,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,UAAU,EAAG,QAAO;AACnD,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI;AAChD,MAAI,QAAQ;AACZ,MAAI,UAAU,KAAK,IAAI,KAAK;AAC5B,SAAO,WAAW,QAAQ,QAAQ,MAAM,SAAS,GAAG;AAClD,eAAW;AACX,aAAS;AAAA,EACX;AACA,QAAM,YAAY,QAAQ,QAAQ,WAAW,MAAM,UAAU,IAAI,IAAI,CAAC;AACtE,SAAO,GAAG,QAAQ,IAAI,MAAM,EAAE,GAAG,SAAS,IAAI,MAAM,KAAK,CAAC;AAC5D;AASA,MAAM,0CAA0B,IAAA;AAEhC,MAAM,uBAAuB,CAAC,UAAkB,gBAAyB;AACvE,QAAM,MAAM,GAAG,QAAQ,IAAI,cAAc,MAAM,GAAG;AAClD,QAAM,SAAS,oBAAoB,IAAI,GAAG;AAC1C,MAAI,OAAQ,QAAO;AACnB,QAAM,YAAY,IAAI,KAAK,eAAe,QAAW;AAAA,IACnD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ,cAAc,YAAY;AAAA,IAClC,QAAQ;AAAA,IACR;AAAA,EAAA,CACD;AACD,sBAAoB,IAAI,KAAK,SAAS;AACtC,SAAO;AACT;AAEO,MAAM,sBAAsB,CACjC,OACA,UAAsC,OAC3B;AACX,QAAM,EAAE,WAAW,WAAW,cAAc,OAAO,WAAW,OAAO,oBAAoB,MAAA,IACvF;AACF,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,MAAI,OAAO,MAAM,KAAK,QAAA,CAAS,EAAG,QAAO,OAAO,UAAU,WAAW,QAAQ;AAC7E,QAAM,YAAY,qBAAqB,UAAU,WAAW;AAC5D,QAAM,YAAY,UAAU,OAAO,IAAI;AACvC,SAAO,oBAAoB,GAAG,SAAS,IAAI,QAAQ,KAAK;AAC1D;AAEO,MAAM,uBAAuB,CAAC,SAAuB;AAC1D,QAAM,MAAM,CAAC,MAAc,GAAG,CAAC,GAAG,SAAS,GAAG,GAAG;AACjD,SAAO,GAAG,KAAK,YAAA,CAAa,IAAI,IAAI,KAAK,SAAA,IAAa,CAAC,CAAC,IAAI,IAAI,KAAK,SAAS,CAAC,IAAI,IAAI,KAAK,SAAA,CAAU,CAAC,IAAI,IAAI,KAAK,WAAA,CAAY,CAAC,IAAI,IAAI,KAAK,WAAA,CAAY,CAAC;AAC7J;AAEO,MAAM,eAAe,MAAc;AACxC,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AAC5E,WAAO,OAAO,WAAA;AAAA,EAChB;AACA,SAAO,uCAAuC,QAAQ,SAAS,CAAC,MAAM;AACpE,UAAM,IAAK,KAAK,OAAA,IAAW,KAAM;AACjC,UAAM,IAAI,MAAM,MAAM,IAAK,IAAI,IAAO;AACtC,WAAO,EAAE,SAAS,EAAE;AAAA,EACtB,CAAC;AACH;"}
|
package/dist/index8.cjs
CHANGED
|
@@ -1,18 +1,85 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
3
|
+
const ensureString = (value) => value === null || value === void 0 ? "" : String(value);
|
|
4
|
+
const toStringTable = (table) => table.map((row) => row.map((cell) => ensureString(cell)));
|
|
5
|
+
const sanitizeFilename = (value) => {
|
|
6
|
+
const normalized = value.normalize().replace(/[^\p{L}\p{N}]+/gu, "-").replace(/^-+|-+$/g, "").toLowerCase();
|
|
7
|
+
return normalized || "export";
|
|
8
|
+
};
|
|
9
|
+
const buildCsv = (table) => {
|
|
10
|
+
const rows = toStringTable(table);
|
|
11
|
+
return rows.map(
|
|
12
|
+
(row) => row.map((cell) => {
|
|
13
|
+
const escaped = cell.replace(/"/g, '""');
|
|
14
|
+
return /[",\n]/.test(escaped) ? `"${escaped}"` : escaped;
|
|
15
|
+
}).join(",")
|
|
16
|
+
).join("\r\n");
|
|
17
|
+
};
|
|
18
|
+
const triggerDownload = (blob, filename) => {
|
|
19
|
+
const link = document.createElement("a");
|
|
20
|
+
const url = URL.createObjectURL(blob);
|
|
21
|
+
link.href = url;
|
|
22
|
+
link.download = filename;
|
|
23
|
+
document.body.appendChild(link);
|
|
24
|
+
link.click();
|
|
25
|
+
document.body.removeChild(link);
|
|
26
|
+
URL.revokeObjectURL(url);
|
|
27
|
+
};
|
|
28
|
+
const exportTableToCsv = (table, filename) => {
|
|
29
|
+
if (table.length === 0) return;
|
|
30
|
+
const csv = buildCsv(table);
|
|
31
|
+
const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
|
|
32
|
+
const finalName = filename.endsWith(".csv") ? filename : `${filename}.csv`;
|
|
33
|
+
triggerDownload(blob, finalName);
|
|
34
|
+
};
|
|
35
|
+
const getChartPngDataUrl = (chart) => chart.getDataURL({ type: "png", pixelRatio: 2, backgroundColor: "#ffffff" });
|
|
36
|
+
const downloadImageDataUrl = (dataUrl, filename) => {
|
|
37
|
+
const link = document.createElement("a");
|
|
38
|
+
link.href = dataUrl;
|
|
39
|
+
link.download = filename;
|
|
40
|
+
document.body.appendChild(link);
|
|
41
|
+
link.click();
|
|
42
|
+
document.body.removeChild(link);
|
|
43
|
+
};
|
|
44
|
+
const buildTableHtml = (table) => {
|
|
45
|
+
const rows = toStringTable(table);
|
|
46
|
+
if (rows.length === 0) return "";
|
|
47
|
+
const [header, ...body] = rows;
|
|
48
|
+
const thead = `<thead><tr>${header.map((c) => `<th>${c}</th>`).join("")}</tr></thead>`;
|
|
49
|
+
const tbody = body.map((r) => `<tr>${r.map((c) => `<td>${c}</td>`).join("")}</tr>`).join("");
|
|
50
|
+
return `<table>${thead}<tbody>${tbody}</tbody></table>`;
|
|
51
|
+
};
|
|
52
|
+
const openPrintWindowWithChart = (title, chartDataUrl, table) => {
|
|
53
|
+
const win = window.open("", "_blank");
|
|
54
|
+
if (!win) return;
|
|
55
|
+
const tableHtml = buildTableHtml(table);
|
|
56
|
+
win.document.write("<!DOCTYPE html>");
|
|
57
|
+
win.document.write(`<html><head><title>${title}</title>`);
|
|
58
|
+
win.document.write(
|
|
59
|
+
"<style>body{font-family:Arial,Helvetica,sans-serif;padding:24px;color:#1f2937;}h1{font-size:20px;margin-bottom:16px;}img{max-width:100%;height:auto;margin-bottom:16px;border:1px solid #e5e7eb;border-radius:12px;}table{border-collapse:collapse;width:100%;}th,td{border:1px solid #d1d5db;padding:8px;text-align:left;font-size:12px;}th{background:#f3f4f6;text-transform:uppercase;letter-spacing:0.05em;font-weight:600;}</style>"
|
|
60
|
+
);
|
|
61
|
+
win.document.write("</head><body>");
|
|
62
|
+
win.document.write(`<h1>${title}</h1>`);
|
|
63
|
+
win.document.write(`<img src="${chartDataUrl}" alt="${title}" />`);
|
|
64
|
+
win.document.write(tableHtml);
|
|
65
|
+
win.document.write("</body></html>");
|
|
66
|
+
win.document.close();
|
|
67
|
+
win.focus();
|
|
68
|
+
setTimeout(() => win.print(), 300);
|
|
69
|
+
};
|
|
70
|
+
const composeFilename = (title, suffix) => {
|
|
71
|
+
const base = sanitizeFilename(title);
|
|
72
|
+
if (suffix && suffix.trim().length > 0) {
|
|
73
|
+
const suffixSanitized = sanitizeFilename(suffix);
|
|
74
|
+
return `${base}-${suffixSanitized}`;
|
|
75
|
+
}
|
|
76
|
+
return base;
|
|
77
|
+
};
|
|
78
|
+
exports.composeFilename = composeFilename;
|
|
79
|
+
exports.downloadImageDataUrl = downloadImageDataUrl;
|
|
80
|
+
exports.exportTableToCsv = exportTableToCsv;
|
|
81
|
+
exports.getChartPngDataUrl = getChartPngDataUrl;
|
|
82
|
+
exports.openPrintWindowWithChart = openPrintWindowWithChart;
|
|
83
|
+
exports.sanitizeFilename = sanitizeFilename;
|
|
84
|
+
exports.toStringTable = toStringTable;
|
|
18
85
|
//# sourceMappingURL=index8.cjs.map
|
package/dist/index8.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index8.cjs","sources":["../src/
|
|
1
|
+
{"version":3,"file":"index8.cjs","sources":["../src/utils/chartExport.ts"],"sourcesContent":["export type TableData = Array<Array<string | number>>;\n\nconst ensureString = (value: string | number): string =>\n value === null || value === undefined ? '' : String(value);\n\nexport const toStringTable = (table: TableData): string[][] =>\n table.map((row) => row.map((cell) => ensureString(cell)));\n\nexport const sanitizeFilename = (value: string): string => {\n const normalized = value\n .normalize()\n .replace(/[^\\p{L}\\p{N}]+/gu, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n return normalized || 'export';\n};\n\nconst buildCsv = (table: TableData): string => {\n const rows = toStringTable(table);\n return rows\n .map((row) =>\n row\n .map((cell) => {\n const escaped = cell.replace(/\"/g, '\"\"');\n return /[\",\\n]/.test(escaped) ? `\"${escaped}\"` : escaped;\n })\n .join(','),\n )\n .join('\\r\\n');\n};\n\nconst triggerDownload = (blob: Blob, filename: string) => {\n const link = document.createElement('a');\n const url = URL.createObjectURL(blob);\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n};\n\nexport const exportTableToCsv = (table: TableData, filename: string) => {\n if (table.length === 0) return;\n const csv = buildCsv(table);\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const finalName = filename.endsWith('.csv') ? filename : `${filename}.csv`;\n triggerDownload(blob, finalName);\n};\n\nexport const getChartPngDataUrl = (chart: { getDataURL: (opts: Record<string, unknown>) => string }): string =>\n chart.getDataURL({ type: 'png', pixelRatio: 2, backgroundColor: '#ffffff' });\n\nexport const downloadImageDataUrl = (dataUrl: string, filename: string) => {\n const link = document.createElement('a');\n link.href = dataUrl;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n\nconst buildTableHtml = (table: TableData): string => {\n const rows = toStringTable(table);\n if (rows.length === 0) return '';\n const [header, ...body] = rows;\n const thead = `<thead><tr>${header.map((c) => `<th>${c}</th>`).join('')}</tr></thead>`;\n const tbody = body.map((r) => `<tr>${r.map((c) => `<td>${c}</td>`).join('')}</tr>`).join('');\n return `<table>${thead}<tbody>${tbody}</tbody></table>`;\n};\n\nexport const openPrintWindowWithChart = (title: string, chartDataUrl: string, table: TableData) => {\n const win = window.open('', '_blank');\n if (!win) return;\n const tableHtml = buildTableHtml(table);\n win.document.write('<!DOCTYPE html>');\n win.document.write(`<html><head><title>${title}</title>`);\n win.document.write(\n '<style>body{font-family:Arial,Helvetica,sans-serif;padding:24px;color:#1f2937;}h1{font-size:20px;margin-bottom:16px;}img{max-width:100%;height:auto;margin-bottom:16px;border:1px solid #e5e7eb;border-radius:12px;}table{border-collapse:collapse;width:100%;}th,td{border:1px solid #d1d5db;padding:8px;text-align:left;font-size:12px;}th{background:#f3f4f6;text-transform:uppercase;letter-spacing:0.05em;font-weight:600;}</style>',\n );\n win.document.write('</head><body>');\n win.document.write(`<h1>${title}</h1>`);\n win.document.write(`<img src=\"${chartDataUrl}\" alt=\"${title}\" />`);\n win.document.write(tableHtml);\n win.document.write('</body></html>');\n win.document.close();\n win.focus();\n setTimeout(() => win.print(), 300);\n};\n\nexport const composeFilename = (title: string, suffix?: string) => {\n const base = sanitizeFilename(title);\n if (suffix && suffix.trim().length > 0) {\n const suffixSanitized = sanitizeFilename(suffix);\n return suffixSanitized ? `${base}-${suffixSanitized}` : base;\n }\n return base;\n};\n"],"names":[],"mappings":"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"}
|