@extable/core 0.3.3 → 0.3.4
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/core.css +1 -0
- package/dist/index +5328 -0
- package/dist/index.css +1 -1
- package/dist/index.js +1696 -2643
- package/dist/index.js.map +1 -1
- package/dist/index.map +1 -0
- package/dist/numberIO-CmW6eOR7.js +978 -0
- package/dist/numberIO-CmW6eOR7.js.map +1 -0
- package/dist/ssr/htmlBuilder.d.ts +11 -0
- package/dist/ssr/index +338 -0
- package/dist/ssr/index.d.ts +2 -0
- package/dist/ssr/index.js +480 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/ssr/index.map +1 -0
- package/dist/ssr/nodeShims.d.ts +14 -0
- package/dist/ssr/renderer.d.ts +27 -0
- package/dist/ssr/styleSerializer.d.ts +10 -0
- package/package.json +10 -4
- package/src/styles.css +885 -0
- package/style.css +1 -0
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
import { v as at, g as rt, c as X, u as st, R as V, H as J, D as Q, d as _, e as N, h as it, i as lt, j as z, p as ct, k as dt, a as Y, b as tt, m as q, t as ut } from "../numberIO-CmW6eOR7.js";
|
|
2
|
+
class et {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.parts = [];
|
|
5
|
+
}
|
|
6
|
+
openTag(e, t) {
|
|
7
|
+
let o = `<${e}`;
|
|
8
|
+
if (t)
|
|
9
|
+
for (const [i, a] of Object.entries(t))
|
|
10
|
+
a === !0 ? o += ` ${i}` : a !== !1 && a !== null && a !== void 0 && (o += ` ${i}="${I(String(a))}"`);
|
|
11
|
+
return o += ">", this.parts.push(o), this;
|
|
12
|
+
}
|
|
13
|
+
tag(e, t, o) {
|
|
14
|
+
let i = `<${e}`;
|
|
15
|
+
if (t)
|
|
16
|
+
for (const [a, c] of Object.entries(t))
|
|
17
|
+
c === !0 ? i += ` ${a}` : c !== !1 && c !== null && c !== void 0 && (i += ` ${a}="${I(String(c))}"`);
|
|
18
|
+
return i += ">", i += I(o), i += `</${e}>`, this.parts.push(i), this;
|
|
19
|
+
}
|
|
20
|
+
closeTag(e) {
|
|
21
|
+
return this.parts.push(`</${e}>`), this;
|
|
22
|
+
}
|
|
23
|
+
text(e) {
|
|
24
|
+
return this.parts.push(I(e)), this;
|
|
25
|
+
}
|
|
26
|
+
html(e) {
|
|
27
|
+
return this.parts.push(e), this;
|
|
28
|
+
}
|
|
29
|
+
build() {
|
|
30
|
+
return this.parts.join("");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function I(n) {
|
|
34
|
+
return n.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/\"/g, """).replace(/'/g, "'");
|
|
35
|
+
}
|
|
36
|
+
function O(n) {
|
|
37
|
+
const e = [];
|
|
38
|
+
for (const [t, o] of Object.entries(n)) {
|
|
39
|
+
if (o == null || o === !1) continue;
|
|
40
|
+
const i = gt(t);
|
|
41
|
+
e.push(`${i}:${String(o)};`);
|
|
42
|
+
}
|
|
43
|
+
return e.join("");
|
|
44
|
+
}
|
|
45
|
+
class ft {
|
|
46
|
+
constructor() {
|
|
47
|
+
this.rules = /* @__PURE__ */ new Map();
|
|
48
|
+
}
|
|
49
|
+
addRule(e, t) {
|
|
50
|
+
const o = this.rules.get(e) ?? {};
|
|
51
|
+
this.rules.set(e, { ...o, ...t });
|
|
52
|
+
}
|
|
53
|
+
build(e) {
|
|
54
|
+
const t = e?.minify ?? !1, o = [];
|
|
55
|
+
for (const [i, a] of this.rules.entries()) {
|
|
56
|
+
const c = O(a);
|
|
57
|
+
c && (t ? o.push(`${i}{${c}}`) : o.push(`${i} { ${c} }`));
|
|
58
|
+
}
|
|
59
|
+
return o.join(t ? "" : `
|
|
60
|
+
`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function gt(n) {
|
|
64
|
+
return n.startsWith("--") ? n : n.includes("-") ? n.toLowerCase() : n.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`);
|
|
65
|
+
}
|
|
66
|
+
function mt(n) {
|
|
67
|
+
const e = n.cssMode ?? "inline", t = n.wrapWithRoot ?? !1, o = at(n.defaultClass) ?? [], i = n.defaultStyle, a = n.includeStyles ?? !1, c = n.includeRawAttributes ?? !1, f = n.data ?? [], $ = {}, v = n.schema, T = v.columns, F = rt(v, $), y = T.some((s) => !!s.formula), B = T.some((s) => !!s.conditionalStyle) || !!v.row?.conditionalStyle, r = a && e !== "inline" ? new ft() : null, d = [], h = /* @__PURE__ */ new Map(), w = a ? /* @__PURE__ */ new Map() : null, g = T.map((s) => {
|
|
68
|
+
const u = String(s.key);
|
|
69
|
+
h.set(u, yt(s, a)), w && w.set(u, X(s));
|
|
70
|
+
const m = ["extable-cell"];
|
|
71
|
+
s.type === "boolean" && m.push("extable-boolean");
|
|
72
|
+
const M = s.wrapText;
|
|
73
|
+
m.push(M ? "cell-wrap" : "cell-nowrap");
|
|
74
|
+
const W = s.style?.align ?? (s.type === "number" || s.type === "int" || s.type === "uint" ? "right" : "left");
|
|
75
|
+
return m.push(W === "right" ? "align-right" : "align-left"), {
|
|
76
|
+
col: s,
|
|
77
|
+
colKey: u,
|
|
78
|
+
baseClass: m.join(" "),
|
|
79
|
+
tdAttrPrefix: ` class="${m.join(" ")} extable-editable" data-col-key="${I(
|
|
80
|
+
u
|
|
81
|
+
)}"`,
|
|
82
|
+
isActionType: s.type === "button" || s.type === "link"
|
|
83
|
+
};
|
|
84
|
+
}), k = T.some((s) => !!(s.readonly || s.style?.readonly || s.style?.disabled)) || f.some((s) => !!s._readonly);
|
|
85
|
+
if (!a && !c && !y && !B && !k)
|
|
86
|
+
return bt({
|
|
87
|
+
data: f,
|
|
88
|
+
columns: T,
|
|
89
|
+
columnMeta: g,
|
|
90
|
+
colWidths: F,
|
|
91
|
+
wrapWithRoot: t,
|
|
92
|
+
defaultClass: o,
|
|
93
|
+
defaultStyle: i,
|
|
94
|
+
valueFormatters: h
|
|
95
|
+
});
|
|
96
|
+
const C = new st(f, v, $), D = C.listRows(), b = t ? ["extable-root", ...o] : o, L = b.length ? `.${b[0]}` : 'table[data-extable-renderer="html"]';
|
|
97
|
+
if (r && e !== "inline")
|
|
98
|
+
for (const s of T) {
|
|
99
|
+
const u = U(X(s));
|
|
100
|
+
Object.keys(u).length !== 0 && r.addRule(`${L} tbody td[data-col-key="${String(s.key)}"]`, u);
|
|
101
|
+
}
|
|
102
|
+
const R = { width: `${V + F.reduce((s, u) => s + (u ?? 0), 0)}px` };
|
|
103
|
+
!t && i && Object.assign(R, P(i));
|
|
104
|
+
const S = {
|
|
105
|
+
"data-extable-renderer": "html"
|
|
106
|
+
};
|
|
107
|
+
!t && b.length && (S.class = b.join(" "));
|
|
108
|
+
const p = O(R);
|
|
109
|
+
p && (S.style = p);
|
|
110
|
+
const l = new et();
|
|
111
|
+
if (t) {
|
|
112
|
+
const s = {
|
|
113
|
+
class: b.join(" ").trim()
|
|
114
|
+
};
|
|
115
|
+
if (i) {
|
|
116
|
+
const u = O(P(i));
|
|
117
|
+
u && (s.style = u);
|
|
118
|
+
}
|
|
119
|
+
l.openTag("div", s), l.openTag("div", { class: "extable-shell" }), l.openTag("div", { class: "extable-viewport" });
|
|
120
|
+
}
|
|
121
|
+
l.openTag("table", S), l.openTag("thead"), l.openTag("tr", { style: `height:${J}px;` });
|
|
122
|
+
const H = {
|
|
123
|
+
class: "extable-row-header extable-corner",
|
|
124
|
+
"data-col-key": "",
|
|
125
|
+
style: `width:${V}px;`
|
|
126
|
+
};
|
|
127
|
+
return l.tag("th", H, ""), T.forEach((s, u) => {
|
|
128
|
+
const m = {
|
|
129
|
+
"data-col-key": s.key
|
|
130
|
+
}, M = F[u] ?? s.width;
|
|
131
|
+
M && (m.style = `width:${M}px;`), l.openTag("th", m), l.openTag("div", { class: "extable-col-header" }), l.tag("span", { class: "extable-col-header-text" }, s.header ?? String(s.key)), l.openTag("button", {
|
|
132
|
+
type: "button",
|
|
133
|
+
class: "extable-filter-sort-trigger",
|
|
134
|
+
"data-extable-fs-open": "1",
|
|
135
|
+
"data-extable-col-key": s.key,
|
|
136
|
+
title: "Filter / Sort"
|
|
137
|
+
}), l.html(nt()), l.closeTag("button"), l.closeTag("div"), l.closeTag("th");
|
|
138
|
+
}), l.closeTag("tr"), l.closeTag("thead"), l.openTag("tbody"), D.forEach((s, u) => {
|
|
139
|
+
const m = {
|
|
140
|
+
style: `height:${Q}px;`
|
|
141
|
+
};
|
|
142
|
+
l.openTag("tr", m);
|
|
143
|
+
const M = {
|
|
144
|
+
class: "extable-row-header"
|
|
145
|
+
}, W = C.getDisplayIndex(s.id) ?? "";
|
|
146
|
+
l.openTag("th", M).text(String(W)).closeTag("th");
|
|
147
|
+
for (const j of g)
|
|
148
|
+
pt({
|
|
149
|
+
html: l,
|
|
150
|
+
row: s,
|
|
151
|
+
rowIndex: u,
|
|
152
|
+
meta: j,
|
|
153
|
+
dataModel: C,
|
|
154
|
+
cssMode: e,
|
|
155
|
+
cssBuilder: r,
|
|
156
|
+
rootSelector: L,
|
|
157
|
+
errors: d,
|
|
158
|
+
valueFormatters: h,
|
|
159
|
+
baseStyles: w,
|
|
160
|
+
includeStyles: a,
|
|
161
|
+
includeRawAttributes: c,
|
|
162
|
+
hasInteraction: k
|
|
163
|
+
});
|
|
164
|
+
l.closeTag("tr");
|
|
165
|
+
}), l.closeTag("tbody"), l.closeTag("table"), t && (l.closeTag("div"), l.openTag("div", { class: "extable-overlay-layer" }).closeTag("div"), l.closeTag("div"), l.closeTag("div")), {
|
|
166
|
+
html: l.build(),
|
|
167
|
+
css: r?.build({ minify: !0 }),
|
|
168
|
+
metadata: {
|
|
169
|
+
rowCount: D.length,
|
|
170
|
+
columnCount: T.length,
|
|
171
|
+
hasFormulas: y,
|
|
172
|
+
hasConditionalStyles: B,
|
|
173
|
+
errors: d
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function bt(n) {
|
|
178
|
+
const {
|
|
179
|
+
data: e,
|
|
180
|
+
columns: t,
|
|
181
|
+
columnMeta: o,
|
|
182
|
+
colWidths: i,
|
|
183
|
+
wrapWithRoot: a,
|
|
184
|
+
defaultClass: c,
|
|
185
|
+
defaultStyle: f,
|
|
186
|
+
valueFormatters: $
|
|
187
|
+
} = n, v = a ? ["extable-root", ...c] : c;
|
|
188
|
+
let T = V;
|
|
189
|
+
for (const d of i) T += d;
|
|
190
|
+
const F = { width: `${T}px` };
|
|
191
|
+
!a && f && Object.assign(F, P(f));
|
|
192
|
+
const y = {
|
|
193
|
+
"data-extable-renderer": "html"
|
|
194
|
+
};
|
|
195
|
+
!a && v.length && (y.class = v.join(" "));
|
|
196
|
+
const B = O(F);
|
|
197
|
+
B && (y.style = B);
|
|
198
|
+
const r = new et();
|
|
199
|
+
if (a) {
|
|
200
|
+
const d = {
|
|
201
|
+
class: v.join(" ").trim()
|
|
202
|
+
};
|
|
203
|
+
if (f) {
|
|
204
|
+
const h = O(P(f));
|
|
205
|
+
h && (d.style = h);
|
|
206
|
+
}
|
|
207
|
+
r.openTag("div", d), r.openTag("div", { class: "extable-shell" }), r.openTag("div", { class: "extable-viewport" });
|
|
208
|
+
}
|
|
209
|
+
r.openTag("table", y), r.openTag("thead"), r.openTag("tr", { style: `height:${J}px;` }), r.tag(
|
|
210
|
+
"th",
|
|
211
|
+
{
|
|
212
|
+
class: "extable-row-header extable-corner",
|
|
213
|
+
"data-col-key": "",
|
|
214
|
+
style: `width:${V}px;`
|
|
215
|
+
},
|
|
216
|
+
""
|
|
217
|
+
), t.forEach((d, h) => {
|
|
218
|
+
const w = {
|
|
219
|
+
"data-col-key": d.key
|
|
220
|
+
}, g = i[h] ?? d.width;
|
|
221
|
+
g && (w.style = `width:${g}px;`), r.openTag("th", w), r.openTag("div", { class: "extable-col-header" }), r.tag("span", { class: "extable-col-header-text" }, d.header ?? String(d.key)), r.openTag("button", {
|
|
222
|
+
type: "button",
|
|
223
|
+
class: "extable-filter-sort-trigger",
|
|
224
|
+
"data-extable-fs-open": "1",
|
|
225
|
+
"data-extable-col-key": d.key,
|
|
226
|
+
title: "Filter / Sort"
|
|
227
|
+
}), r.html(nt()), r.closeTag("button"), r.closeTag("div"), r.closeTag("th");
|
|
228
|
+
}), r.closeTag("tr"), r.closeTag("thead"), r.openTag("tbody");
|
|
229
|
+
for (let d = 0; d < e.length; d += 1) {
|
|
230
|
+
const h = e[d];
|
|
231
|
+
r.openTag("tr", {
|
|
232
|
+
style: `height:${Q}px;`
|
|
233
|
+
}), r.tag("th", { class: "extable-row-header" }, String(d + 1));
|
|
234
|
+
for (const w of o) {
|
|
235
|
+
const { col: g, colKey: k, tdAttrPrefix: A, isActionType: C } = w, D = $.get(k), b = h[k], L = D ? D(b) : { text: String(b ?? "") }, E = g.type === "tags" ? G(b) : null, R = C ? g.type === "button" ? Y(b) : tt(b) : null, S = C ? g.type === "button" ? _(b) : N(b) : "", p = C && R && S;
|
|
236
|
+
if (E && E.length)
|
|
237
|
+
r.openTag("td", {
|
|
238
|
+
class: `${w.baseClass} extable-editable`,
|
|
239
|
+
"data-col-key": g.key
|
|
240
|
+
}), r.openTag("div", { class: "extable-tag-list" }), E.forEach((l, H) => {
|
|
241
|
+
r.openTag("span", { class: "extable-tag" }), r.tag("span", { class: "extable-tag-label" }, l), r.openTag("button", {
|
|
242
|
+
type: "button",
|
|
243
|
+
class: "extable-tag-remove",
|
|
244
|
+
"data-extable-tag-remove": "1",
|
|
245
|
+
"data-extable-tag-index": String(H),
|
|
246
|
+
disabled: !1
|
|
247
|
+
}), r.text("×"), r.closeTag("button"), r.closeTag("span");
|
|
248
|
+
}), r.closeTag("div"), r.closeTag("td");
|
|
249
|
+
else if (p)
|
|
250
|
+
r.openTag("td", {
|
|
251
|
+
class: `${w.baseClass} extable-editable`,
|
|
252
|
+
"data-col-key": g.key
|
|
253
|
+
}), g.type === "button" ? r.tag(
|
|
254
|
+
"button",
|
|
255
|
+
{ class: "extable-action-button", "data-extable-action": "button", type: "button" },
|
|
256
|
+
S
|
|
257
|
+
) : r.tag(
|
|
258
|
+
"span",
|
|
259
|
+
{ class: "extable-action-link", "data-extable-action": "link" },
|
|
260
|
+
S
|
|
261
|
+
), r.closeTag("td");
|
|
262
|
+
else {
|
|
263
|
+
const l = I(S || L.text);
|
|
264
|
+
r.html(`<td${A}>${l}</td>`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
r.closeTag("tr");
|
|
268
|
+
}
|
|
269
|
+
return r.closeTag("tbody"), r.closeTag("table"), a && (r.closeTag("div"), r.openTag("div", { class: "extable-overlay-layer" }).closeTag("div"), r.closeTag("div"), r.closeTag("div")), {
|
|
270
|
+
html: r.build(),
|
|
271
|
+
metadata: {
|
|
272
|
+
rowCount: e.length,
|
|
273
|
+
columnCount: t.length,
|
|
274
|
+
hasFormulas: !1,
|
|
275
|
+
hasConditionalStyles: !1,
|
|
276
|
+
errors: []
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
function pt(n) {
|
|
281
|
+
const {
|
|
282
|
+
html: e,
|
|
283
|
+
row: t,
|
|
284
|
+
rowIndex: o,
|
|
285
|
+
meta: i,
|
|
286
|
+
dataModel: a,
|
|
287
|
+
cssMode: c,
|
|
288
|
+
cssBuilder: f,
|
|
289
|
+
rootSelector: $,
|
|
290
|
+
errors: v,
|
|
291
|
+
valueFormatters: T,
|
|
292
|
+
baseStyles: F,
|
|
293
|
+
includeStyles: y,
|
|
294
|
+
includeRawAttributes: B,
|
|
295
|
+
hasInteraction: r
|
|
296
|
+
} = n, { col: d, colKey: h, baseClass: w, isActionType: g } = i, k = r ? a.getCellInteraction(t.id, d.key) : { readonly: !1, muted: !1, disabled: !1 };
|
|
297
|
+
let A = w;
|
|
298
|
+
k.readonly ? A += " extable-readonly" : A += " extable-editable", k.muted && (A += " extable-readonly-muted"), k.disabled && (A += " extable-disabled");
|
|
299
|
+
const C = y ? a.resolveConditionalStyle(t.id, d) : { delta: null, forceErrorText: !1 }, D = y ? a.getCellStyle(t.id, d.key) : null, b = y ? F?.get(h) ?? {} : {}, L = y && C.delta ? q(b, C.delta) : b, E = y && D ? q(L, D) : L, R = y ? a.getCellDiagnostic(t.id, d.key) : null;
|
|
300
|
+
R && (A += R.level === "warning" ? " extable-diag-warning" : " extable-diag-error");
|
|
301
|
+
const S = a.getRawCell(t.id, d.key), p = a.resolveCellValue(t.id, d);
|
|
302
|
+
let l = p.textOverride ?? (C.forceErrorText ? "#ERROR" : void 0);
|
|
303
|
+
p.diagnostic?.source === "formula" && (l || (l = "#ERROR"), v.push({ row: o, col: h, message: p.diagnostic.message }));
|
|
304
|
+
const H = T.get(h), s = l ? { text: l } : H ? H(p.value) : { text: String(p.value ?? "") }, u = s.color && s.color !== E.textColor ? { ...E, textColor: s.color } : E, m = d.type === "tags" && !l ? G(p.value) : null, M = g ? d.type === "button" ? Y(p.value) : tt(p.value) : null, W = g ? d.type === "button" ? _(p.value) : N(p.value) : "", j = {
|
|
305
|
+
class: A,
|
|
306
|
+
"data-col-key": d.key
|
|
307
|
+
};
|
|
308
|
+
if (y && R && (j["data-extable-diag-message"] = R.message), B) {
|
|
309
|
+
const x = ut(S, p.value, d);
|
|
310
|
+
if (x !== null)
|
|
311
|
+
j["data-raw"] = x;
|
|
312
|
+
else {
|
|
313
|
+
const K = S == null ? "" : String(S);
|
|
314
|
+
j["data-raw"] = K;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
if (y) {
|
|
318
|
+
if (c === "inline" || c === "both") {
|
|
319
|
+
if (Z(u)) {
|
|
320
|
+
const x = O(U(u));
|
|
321
|
+
x && (j.style = x);
|
|
322
|
+
}
|
|
323
|
+
} else if (c === "external" && f && Z(u)) {
|
|
324
|
+
const x = `${$} tbody tr:nth-child(${o + 1}) td[data-col-key="${h}"]`;
|
|
325
|
+
f.addRule(x, U(u));
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
const ot = g && !l && M && W;
|
|
329
|
+
if (m && m.length)
|
|
330
|
+
e.openTag("td", j), e.openTag("div", { class: "extable-tag-list" }), m.forEach((x, K) => {
|
|
331
|
+
e.openTag("span", { class: "extable-tag" }), e.tag("span", { class: "extable-tag-label" }, x), e.openTag("button", {
|
|
332
|
+
type: "button",
|
|
333
|
+
class: "extable-tag-remove",
|
|
334
|
+
"data-extable-tag-remove": "1",
|
|
335
|
+
"data-extable-tag-index": String(K),
|
|
336
|
+
disabled: k.readonly || k.disabled
|
|
337
|
+
}), e.text("×"), e.closeTag("button"), e.closeTag("span");
|
|
338
|
+
}), e.closeTag("div"), e.closeTag("td");
|
|
339
|
+
else if (ot) {
|
|
340
|
+
e.openTag("td", j);
|
|
341
|
+
const x = {
|
|
342
|
+
class: d.type === "button" ? "extable-action-button" : "extable-action-link",
|
|
343
|
+
"data-extable-action": d.type
|
|
344
|
+
};
|
|
345
|
+
k.disabled && (x.class = `${x.class} extable-action-disabled`), d.type === "button" ? (x.type = "button", e.tag("button", x, W)) : e.tag("span", x, W), e.closeTag("td");
|
|
346
|
+
} else
|
|
347
|
+
e.tag("td", j, W || s.text);
|
|
348
|
+
}
|
|
349
|
+
function yt(n, e) {
|
|
350
|
+
if (!e)
|
|
351
|
+
return ht(n);
|
|
352
|
+
if (n.type === "button")
|
|
353
|
+
return (t) => t == null ? { text: "" } : { text: _(t) || String(t) };
|
|
354
|
+
if (n.type === "link")
|
|
355
|
+
return (t) => t == null ? { text: "" } : { text: N(t) || String(t) };
|
|
356
|
+
if (n.type === "tags")
|
|
357
|
+
return (t) => {
|
|
358
|
+
if (t == null) return { text: "" };
|
|
359
|
+
const o = G(t);
|
|
360
|
+
return o ? { text: o.join(", ") } : { text: String(t) };
|
|
361
|
+
};
|
|
362
|
+
if (n.type === "enum")
|
|
363
|
+
return (t) => {
|
|
364
|
+
if (t == null) return { text: "" };
|
|
365
|
+
if (t && typeof t == "object") {
|
|
366
|
+
const o = t;
|
|
367
|
+
if (o.kind === "enum" && typeof o.value == "string")
|
|
368
|
+
return { text: o.value };
|
|
369
|
+
}
|
|
370
|
+
return { text: String(t) };
|
|
371
|
+
};
|
|
372
|
+
if (n.type === "boolean")
|
|
373
|
+
return (t) => t == null ? { text: "" } : n.format === "checkbox" || !n.format ? { text: t ? "☑" : "☐" } : Array.isArray(n.format) && n.format.length >= 2 ? { text: String(t ? n.format[0] : n.format[1]) } : { text: t ? String(n.format) : "" };
|
|
374
|
+
if (n.type === "number") {
|
|
375
|
+
const t = n.format;
|
|
376
|
+
if ((t?.format ?? "decimal") === "scientific")
|
|
377
|
+
return (c) => {
|
|
378
|
+
if (c == null) return { text: "" };
|
|
379
|
+
if (typeof c != "number") return { text: String(c) };
|
|
380
|
+
const f = it(c, {
|
|
381
|
+
format: "scientific",
|
|
382
|
+
precision: t?.precision
|
|
383
|
+
}), $ = t?.negativeRed && c < 0 ? "#b91c1c" : void 0;
|
|
384
|
+
return { text: f, color: $ };
|
|
385
|
+
};
|
|
386
|
+
const i = {};
|
|
387
|
+
t?.scale !== void 0 && (i.minimumFractionDigits = t.scale, i.maximumFractionDigits = t.scale), i.useGrouping = !!t?.thousandSeparator;
|
|
388
|
+
const a = new Intl.NumberFormat("en-US", i);
|
|
389
|
+
return (c) => {
|
|
390
|
+
if (c == null) return { text: "" };
|
|
391
|
+
if (typeof c != "number") return { text: String(c) };
|
|
392
|
+
const f = a.format(c), $ = t?.negativeRed && c < 0 ? "#b91c1c" : void 0;
|
|
393
|
+
return { text: f, color: $ };
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
if (n.type === "int" || n.type === "uint") {
|
|
397
|
+
const t = n.format, o = t?.format ?? "decimal";
|
|
398
|
+
if (o === "binary" || o === "octal" || o === "hex")
|
|
399
|
+
return (a) => {
|
|
400
|
+
if (a == null) return { text: "" };
|
|
401
|
+
if (typeof a != "number") return { text: String(a) };
|
|
402
|
+
const c = lt(a, o), f = t?.negativeRed && a < 0 ? "#b91c1c" : void 0;
|
|
403
|
+
return { text: c, color: f };
|
|
404
|
+
};
|
|
405
|
+
const i = new Intl.NumberFormat("en-US", {
|
|
406
|
+
minimumFractionDigits: 0,
|
|
407
|
+
maximumFractionDigits: 0,
|
|
408
|
+
useGrouping: !!t?.thousandSeparator
|
|
409
|
+
});
|
|
410
|
+
return (a) => {
|
|
411
|
+
if (a == null) return { text: "" };
|
|
412
|
+
if (typeof a != "number") return { text: String(a) };
|
|
413
|
+
const c = i.format(a), f = t?.negativeRed && a < 0 ? "#b91c1c" : void 0;
|
|
414
|
+
return { text: c, color: f };
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
if (n.type === "date" || n.type === "time" || n.type === "datetime") {
|
|
418
|
+
const t = n.format, o = n.type === "date" ? z(t, "date") : n.type === "time" ? z(t, "time") : z(t, "datetime");
|
|
419
|
+
return (i) => {
|
|
420
|
+
if (i == null) return { text: "" };
|
|
421
|
+
let a = null;
|
|
422
|
+
return i instanceof Date ? a = i : typeof i == "string" && (a = ct(i)), a ? { text: dt(a, o) } : { text: String(i) };
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
return (t) => t == null ? { text: "" } : { text: String(t) };
|
|
426
|
+
}
|
|
427
|
+
function ht(n) {
|
|
428
|
+
return n.type === "button" ? (e) => e == null ? { text: "" } : { text: _(e) || String(e) } : n.type === "link" ? (e) => e == null ? { text: "" } : { text: N(e) || String(e) } : n.type === "tags" ? (e) => {
|
|
429
|
+
if (e == null) return { text: "" };
|
|
430
|
+
const t = G(e);
|
|
431
|
+
return t ? { text: t.join(", ") } : { text: String(e) };
|
|
432
|
+
} : n.type === "enum" ? (e) => {
|
|
433
|
+
if (e == null) return { text: "" };
|
|
434
|
+
if (e && typeof e == "object") {
|
|
435
|
+
const t = e;
|
|
436
|
+
if (t.kind === "enum" && typeof t.value == "string")
|
|
437
|
+
return { text: t.value };
|
|
438
|
+
}
|
|
439
|
+
return { text: String(e) };
|
|
440
|
+
} : (e) => e == null ? { text: "" } : { text: String(e) };
|
|
441
|
+
}
|
|
442
|
+
function G(n) {
|
|
443
|
+
if (Array.isArray(n) && n.every((e) => typeof e == "string"))
|
|
444
|
+
return n;
|
|
445
|
+
if (n && typeof n == "object") {
|
|
446
|
+
const e = n;
|
|
447
|
+
if (e.kind === "tags") {
|
|
448
|
+
const t = e.values;
|
|
449
|
+
if (Array.isArray(t))
|
|
450
|
+
return t.filter((o) => typeof o == "string");
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
return null;
|
|
454
|
+
}
|
|
455
|
+
function Z(n) {
|
|
456
|
+
return !!(n.backgroundColor || n.textColor || n.bold || n.italic || n.underline || n.strike);
|
|
457
|
+
}
|
|
458
|
+
function U(n) {
|
|
459
|
+
const e = {};
|
|
460
|
+
n.backgroundColor && (e.backgroundColor = n.backgroundColor), n.textColor && (e.color = n.textColor), n.bold && (e.fontWeight = "600"), n.italic && (e.fontStyle = "italic");
|
|
461
|
+
const t = [];
|
|
462
|
+
return n.underline && t.push("underline"), n.strike && t.push("line-through"), t.length && (e.textDecorationLine = t.join(" ")), e;
|
|
463
|
+
}
|
|
464
|
+
function nt() {
|
|
465
|
+
return `
|
|
466
|
+
<svg viewBox="0 0 24 24" width="16" height="16" aria-hidden="true" focusable="false">
|
|
467
|
+
<path d="M3 5h18l-7 8v6l-4 2v-8L3 5z" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"/>
|
|
468
|
+
</svg>
|
|
469
|
+
`.trim();
|
|
470
|
+
}
|
|
471
|
+
function P(n) {
|
|
472
|
+
const e = {};
|
|
473
|
+
for (const [t, o] of Object.entries(n))
|
|
474
|
+
o == null || o === "" || typeof o != "string" && typeof o != "number" || (e[t] = o);
|
|
475
|
+
return e;
|
|
476
|
+
}
|
|
477
|
+
export {
|
|
478
|
+
mt as renderTableHTML
|
|
479
|
+
};
|
|
480
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/ssr/htmlBuilder.ts","../../src/ssr/styleSerializer.ts","../../src/ssr/renderer.ts"],"sourcesContent":["export type HTMLAttributeValue = string | number | boolean | null | undefined;\n\nexport class HTMLBuilder {\n private parts: string[] = [];\n\n openTag(tag: string, attrs?: Record<string, HTMLAttributeValue>): this {\n let html = `<${tag}`;\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (value === true) {\n html += ` ${key}`;\n } else if (value !== false && value !== null && value !== undefined) {\n html += ` ${key}=\"${escapeHtml(String(value))}\"`;\n }\n }\n }\n html += \">\";\n this.parts.push(html);\n return this;\n }\n\n tag(tag: string, attrs: Record<string, HTMLAttributeValue> | undefined, content: string): this {\n let html = `<${tag}`;\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (value === true) {\n html += ` ${key}`;\n } else if (value !== false && value !== null && value !== undefined) {\n html += ` ${key}=\"${escapeHtml(String(value))}\"`;\n }\n }\n }\n html += \">\";\n html += escapeHtml(content);\n html += `</${tag}>`;\n this.parts.push(html);\n return this;\n }\n\n closeTag(tag: string): this {\n this.parts.push(`</${tag}>`);\n return this;\n }\n\n text(content: string): this {\n this.parts.push(escapeHtml(content));\n return this;\n }\n\n html(content: string): this {\n this.parts.push(content);\n return this;\n }\n\n build(): string {\n return this.parts.join(\"\");\n }\n}\n\nexport function escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\\\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n","export type CSSValue = string | number | null | undefined | false;\nexport type CSSStyleMap = Record<string, CSSValue>;\n\nexport function serializeStyle(style: CSSStyleMap): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(style)) {\n if (value === null || value === undefined || value === false) continue;\n const prop = toKebabCase(key);\n parts.push(`${prop}:${String(value)};`);\n }\n return parts.join(\"\");\n}\n\nexport class CSSBuilder {\n private rules = new Map<string, CSSStyleMap>();\n\n addRule(selector: string, style: CSSStyleMap) {\n const prev = this.rules.get(selector) ?? {};\n this.rules.set(selector, { ...prev, ...style });\n }\n\n build(options?: { minify?: boolean }): string {\n const minify = options?.minify ?? false;\n const lines: string[] = [];\n for (const [selector, style] of this.rules.entries()) {\n const body = serializeStyle(style);\n if (!body) continue;\n if (minify) {\n lines.push(`${selector}{${body}}`);\n } else {\n lines.push(`${selector} { ${body} }`);\n }\n }\n return lines.join(minify ? \"\" : \"\\n\");\n }\n}\n\nfunction toKebabCase(input: string): string {\n if (input.startsWith(\"--\")) return input;\n if (input.includes(\"-\")) return input.toLowerCase();\n return input.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n}\n","import { DataModel } from \"../dataModel\";\nimport { columnFormatToStyle, mergeStyle } from \"../styleResolver\";\nimport type {\n ColumnSchema,\n InternalRow,\n NumberFormat,\n IntegerFormat,\n Schema,\n View,\n RowObject,\n ResolvedCellStyle,\n} from \"../types\";\nimport { coerceDatePattern, formatDateLite, parseIsoDate } from \"../dateUtils\";\nimport { formatIntegerWithPrefix, formatNumberForEdit } from \"../numberIO\";\nimport { toRawValue } from \"../cellValueCodec\";\nimport { getButtonLabel, getLinkLabel, resolveButtonAction, resolveLinkAction } from \"../actionValue\";\nimport { DEFAULT_ROW_HEIGHT_PX, HEADER_HEIGHT_PX, ROW_HEADER_WIDTH_PX, getColumnWidths } from \"../geometry\";\nimport { toArray } from \"../utils\";\nimport { HTMLBuilder, escapeHtml } from \"./htmlBuilder\";\nimport { CSSBuilder, type CSSStyleMap, serializeStyle } from \"./styleSerializer\";\n\nexport interface SSROptions<T extends object = Record<string, unknown>> {\n data: T[] | null | undefined;\n schema: Schema<any>;\n cssMode?: \"inline\" | \"external\" | \"both\";\n wrapWithRoot?: boolean;\n defaultClass?: string | string[];\n defaultStyle?: Partial<CSSStyleDeclaration>;\n includeStyles?: boolean;\n includeRawAttributes?: boolean;\n}\n\nexport interface SSRResult {\n html: string;\n css?: string;\n metadata: {\n rowCount: number;\n columnCount: number;\n hasFormulas: boolean;\n hasConditionalStyles: boolean;\n errors: Array<{ row: number; col: string; message: string }>;\n };\n}\n\nexport function renderTableHTML<T extends object = Record<string, unknown>>(\n options: SSROptions<T>,\n): SSRResult {\n const cssMode = options.cssMode ?? \"inline\";\n const wrapWithRoot = options.wrapWithRoot ?? false;\n const defaultClass = toArray(options.defaultClass) ?? [];\n const defaultStyle = options.defaultStyle;\n const includeStyles = options.includeStyles ?? false;\n const includeRawAttributes = options.includeRawAttributes ?? false;\n const data = (options.data ?? []) as RowObject[];\n\n const baseView: View = {};\n const schema = options.schema;\n const columns = schema.columns;\n const colWidths = getColumnWidths(schema, baseView);\n const hasFormulas = columns.some((c) => Boolean(c.formula));\n const hasConditionalStyles =\n columns.some((c) => Boolean(c.conditionalStyle)) || Boolean(schema.row?.conditionalStyle);\n\n const cssBuilder = includeStyles && cssMode !== \"inline\" ? new CSSBuilder() : null;\n const errors: Array<{ row: number; col: string; message: string }> = [];\n const valueFormatters = new Map<string, (value: unknown) => { text: string; color?: string }>();\n const baseStyles = includeStyles ? new Map<string, ResolvedCellStyle>() : null;\n const columnMeta = columns.map((col) => {\n const colKey = String(col.key);\n valueFormatters.set(colKey, createValueFormatter(col, includeStyles));\n if (baseStyles) baseStyles.set(colKey, columnFormatToStyle(col));\n const baseClasses = [\"extable-cell\"];\n if (col.type === \"boolean\") baseClasses.push(\"extable-boolean\");\n const wrap = col.wrapText;\n baseClasses.push(wrap ? \"cell-wrap\" : \"cell-nowrap\");\n const align =\n col.style?.align ??\n (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\" ? \"right\" : \"left\");\n baseClasses.push(align === \"right\" ? \"align-right\" : \"align-left\");\n return {\n col,\n colKey,\n baseClass: baseClasses.join(\" \"),\n tdAttrPrefix: ` class=\"${baseClasses.join(\" \")} extable-editable\" data-col-key=\"${escapeHtml(\n colKey,\n )}\"`,\n isActionType: col.type === \"button\" || col.type === \"link\",\n };\n });\n const hasInteraction =\n columns.some((col) => Boolean(col.readonly || col.style?.readonly || col.style?.disabled)) ||\n data.some((row) => Boolean(row._readonly));\n const useFastPath =\n !includeStyles &&\n !includeRawAttributes &&\n !hasFormulas &&\n !hasConditionalStyles &&\n !hasInteraction;\n\n if (useFastPath) {\n return renderFastTableHTML({\n data,\n columns,\n columnMeta,\n colWidths,\n wrapWithRoot,\n defaultClass,\n defaultStyle,\n valueFormatters,\n });\n }\n\n const dataModel = new DataModel(data, schema, baseView);\n const rows = dataModel.listRows();\n\n const rootClasses = wrapWithRoot ? [\"extable-root\", ...defaultClass] : defaultClass;\n const rootSelector = rootClasses.length ? `.${rootClasses[0]}` : 'table[data-extable-renderer=\"html\"]';\n\n if (cssBuilder && cssMode !== \"inline\") {\n for (const col of columns) {\n const baseStyle = resolvedStyleToMap(columnFormatToStyle(col));\n if (Object.keys(baseStyle).length === 0) continue;\n cssBuilder.addRule(`${rootSelector} tbody td[data-col-key=\\\"${String(col.key)}\\\"]`, baseStyle);\n }\n }\n\n const totalWidth = ROW_HEADER_WIDTH_PX + colWidths.reduce((acc, w) => acc + (w ?? 0), 0);\n const tableStyle: CSSStyleMap = { width: `${totalWidth}px` };\n if (!wrapWithRoot && defaultStyle) {\n Object.assign(tableStyle, normalizeStyle(defaultStyle));\n }\n const tableAttrs: Record<string, string | number | boolean> = {\n \"data-extable-renderer\": \"html\",\n };\n if (!wrapWithRoot && rootClasses.length) {\n tableAttrs.class = rootClasses.join(\" \");\n }\n const tableStyleAttr = serializeStyle(tableStyle);\n if (tableStyleAttr) {\n tableAttrs.style = tableStyleAttr;\n }\n\n const html = new HTMLBuilder();\n if (wrapWithRoot) {\n const rootAttrs: Record<string, string | number | boolean> = {\n class: rootClasses.join(\" \").trim(),\n };\n if (defaultStyle) {\n const rootStyle = serializeStyle(normalizeStyle(defaultStyle));\n if (rootStyle) rootAttrs.style = rootStyle;\n }\n html.openTag(\"div\", rootAttrs);\n html.openTag(\"div\", { class: \"extable-shell\" });\n html.openTag(\"div\", { class: \"extable-viewport\" });\n }\n\n html.openTag(\"table\", tableAttrs);\n html.openTag(\"thead\");\n html.openTag(\"tr\", { style: `height:${HEADER_HEIGHT_PX}px;` });\n\n const rowHeaderAttrs: Record<string, string | number | boolean> = {\n class: \"extable-row-header extable-corner\",\n \"data-col-key\": \"\",\n style: `width:${ROW_HEADER_WIDTH_PX}px;`,\n };\n html.tag(\"th\", rowHeaderAttrs, \"\");\n\n columns.forEach((col, colIndex) => {\n const thAttrs: Record<string, string | number | boolean> = {\n \"data-col-key\": col.key,\n };\n const width = colWidths[colIndex] ?? col.width;\n if (width) thAttrs.style = `width:${width}px;`;\n\n html.openTag(\"th\", thAttrs);\n html.openTag(\"div\", { class: \"extable-col-header\" });\n html.tag(\"span\", { class: \"extable-col-header-text\" }, col.header ?? String(col.key));\n html.openTag(\"button\", {\n type: \"button\",\n class: \"extable-filter-sort-trigger\",\n \"data-extable-fs-open\": \"1\",\n \"data-extable-col-key\": col.key,\n title: \"Filter / Sort\",\n });\n html.html(svgFunnel());\n html.closeTag(\"button\");\n html.closeTag(\"div\");\n html.closeTag(\"th\");\n });\n\n html.closeTag(\"tr\");\n html.closeTag(\"thead\");\n html.openTag(\"tbody\");\n\n rows.forEach((row, rowIndex) => {\n const trAttrs: Record<string, string | number | boolean> = {\n style: `height:${DEFAULT_ROW_HEIGHT_PX}px;`,\n };\n html.openTag(\"tr\", trAttrs);\n\n const rowHeader: Record<string, string | number | boolean> = {\n class: \"extable-row-header\",\n };\n const displayIndex = dataModel.getDisplayIndex(row.id) ?? \"\";\n html.openTag(\"th\", rowHeader).text(String(displayIndex)).closeTag(\"th\");\n\n for (const meta of columnMeta) {\n renderCell({\n html,\n row,\n rowIndex,\n meta,\n dataModel,\n cssMode,\n cssBuilder,\n rootSelector,\n errors,\n valueFormatters,\n baseStyles,\n includeStyles,\n includeRawAttributes,\n hasInteraction,\n });\n }\n\n html.closeTag(\"tr\");\n });\n\n html.closeTag(\"tbody\");\n html.closeTag(\"table\");\n\n if (wrapWithRoot) {\n html.closeTag(\"div\");\n html.openTag(\"div\", { class: \"extable-overlay-layer\" }).closeTag(\"div\");\n html.closeTag(\"div\");\n html.closeTag(\"div\");\n }\n\n return {\n html: html.build(),\n css: cssBuilder?.build({ minify: true }),\n metadata: {\n rowCount: rows.length,\n columnCount: columns.length,\n hasFormulas,\n hasConditionalStyles,\n errors,\n },\n };\n}\n\nfunction renderFastTableHTML(options: {\n data: RowObject[];\n columns: ColumnSchema[];\n columnMeta: Array<{\n col: ColumnSchema;\n colKey: string;\n baseClass: string;\n tdAttrPrefix: string;\n isActionType: boolean;\n }>;\n colWidths: number[];\n wrapWithRoot: boolean;\n defaultClass: string[];\n defaultStyle: Partial<CSSStyleDeclaration> | undefined;\n valueFormatters: Map<string, (value: unknown) => { text: string; color?: string }>;\n}): SSRResult {\n const {\n data,\n columns,\n columnMeta,\n colWidths,\n wrapWithRoot,\n defaultClass,\n defaultStyle,\n valueFormatters,\n } = options;\n const rootClasses = wrapWithRoot ? [\"extable-root\", ...defaultClass] : defaultClass;\n\n let totalWidth = ROW_HEADER_WIDTH_PX;\n for (const width of colWidths) totalWidth += width;\n const tableStyle: CSSStyleMap = { width: `${totalWidth}px` };\n if (!wrapWithRoot && defaultStyle) {\n Object.assign(tableStyle, normalizeStyle(defaultStyle));\n }\n const tableAttrs: Record<string, string | number | boolean> = {\n \"data-extable-renderer\": \"html\",\n };\n if (!wrapWithRoot && rootClasses.length) {\n tableAttrs.class = rootClasses.join(\" \");\n }\n const tableStyleAttr = serializeStyle(tableStyle);\n if (tableStyleAttr) {\n tableAttrs.style = tableStyleAttr;\n }\n\n const html = new HTMLBuilder();\n if (wrapWithRoot) {\n const rootAttrs: Record<string, string | number | boolean> = {\n class: rootClasses.join(\" \").trim(),\n };\n if (defaultStyle) {\n const rootStyle = serializeStyle(normalizeStyle(defaultStyle));\n if (rootStyle) rootAttrs.style = rootStyle;\n }\n html.openTag(\"div\", rootAttrs);\n html.openTag(\"div\", { class: \"extable-shell\" });\n html.openTag(\"div\", { class: \"extable-viewport\" });\n }\n\n html.openTag(\"table\", tableAttrs);\n html.openTag(\"thead\");\n html.openTag(\"tr\", { style: `height:${HEADER_HEIGHT_PX}px;` });\n html.tag(\n \"th\",\n {\n class: \"extable-row-header extable-corner\",\n \"data-col-key\": \"\",\n style: `width:${ROW_HEADER_WIDTH_PX}px;`,\n },\n \"\",\n );\n columns.forEach((col, colIndex) => {\n const thAttrs: Record<string, string | number | boolean> = {\n \"data-col-key\": col.key,\n };\n const width = colWidths[colIndex] ?? col.width;\n if (width) thAttrs.style = `width:${width}px;`;\n html.openTag(\"th\", thAttrs);\n html.openTag(\"div\", { class: \"extable-col-header\" });\n html.tag(\"span\", { class: \"extable-col-header-text\" }, col.header ?? String(col.key));\n html.openTag(\"button\", {\n type: \"button\",\n class: \"extable-filter-sort-trigger\",\n \"data-extable-fs-open\": \"1\",\n \"data-extable-col-key\": col.key,\n title: \"Filter / Sort\",\n });\n html.html(svgFunnel());\n html.closeTag(\"button\");\n html.closeTag(\"div\");\n html.closeTag(\"th\");\n });\n html.closeTag(\"tr\");\n html.closeTag(\"thead\");\n html.openTag(\"tbody\");\n\n for (let rowIndex = 0; rowIndex < data.length; rowIndex += 1) {\n const row = data[rowIndex] as RowObject;\n html.openTag(\"tr\", {\n style: `height:${DEFAULT_ROW_HEIGHT_PX}px;`,\n });\n html.tag(\"th\", { class: \"extable-row-header\" }, String(rowIndex + 1));\n for (const meta of columnMeta) {\n const { col, colKey, tdAttrPrefix, isActionType } = meta;\n const formatter = valueFormatters.get(colKey);\n const value = (row as Record<string, unknown>)[colKey];\n const formatted = formatter ? formatter(value) : { text: String(value ?? \"\") };\n const tagValues = col.type === \"tags\" ? resolveTagValues(value) : null;\n const actionValue = isActionType\n ? col.type === \"button\"\n ? resolveButtonAction(value)\n : resolveLinkAction(value)\n : null;\n const actionLabel = isActionType\n ? col.type === \"button\"\n ? getButtonLabel(value)\n : getLinkLabel(value)\n : \"\";\n const hasActionContent = isActionType && actionValue && actionLabel;\n if (tagValues && tagValues.length) {\n html.openTag(\"td\", {\n class: `${meta.baseClass} extable-editable`,\n \"data-col-key\": col.key,\n });\n html.openTag(\"div\", { class: \"extable-tag-list\" });\n tagValues.forEach((tag, index) => {\n html.openTag(\"span\", { class: \"extable-tag\" });\n html.tag(\"span\", { class: \"extable-tag-label\" }, tag);\n html.openTag(\"button\", {\n type: \"button\",\n class: \"extable-tag-remove\",\n \"data-extable-tag-remove\": \"1\",\n \"data-extable-tag-index\": String(index),\n disabled: false,\n });\n html.text(\"×\");\n html.closeTag(\"button\");\n html.closeTag(\"span\");\n });\n html.closeTag(\"div\");\n html.closeTag(\"td\");\n } else if (hasActionContent) {\n html.openTag(\"td\", {\n class: `${meta.baseClass} extable-editable`,\n \"data-col-key\": col.key,\n });\n if (col.type === \"button\") {\n html.tag(\n \"button\",\n { class: \"extable-action-button\", \"data-extable-action\": \"button\", type: \"button\" },\n actionLabel,\n );\n } else {\n html.tag(\n \"span\",\n { class: \"extable-action-link\", \"data-extable-action\": \"link\" },\n actionLabel,\n );\n }\n html.closeTag(\"td\");\n } else {\n const text = escapeHtml(actionLabel || formatted.text);\n html.html(`<td${tdAttrPrefix}>${text}</td>`);\n }\n }\n html.closeTag(\"tr\");\n }\n\n html.closeTag(\"tbody\");\n html.closeTag(\"table\");\n\n if (wrapWithRoot) {\n html.closeTag(\"div\");\n html.openTag(\"div\", { class: \"extable-overlay-layer\" }).closeTag(\"div\");\n html.closeTag(\"div\");\n html.closeTag(\"div\");\n }\n\n return {\n html: html.build(),\n metadata: {\n rowCount: data.length,\n columnCount: columns.length,\n hasFormulas: false,\n hasConditionalStyles: false,\n errors: [],\n },\n };\n}\n\nfunction renderCell(options: {\n html: HTMLBuilder;\n row: InternalRow;\n rowIndex: number;\n meta: {\n col: ColumnSchema;\n colKey: string;\n baseClass: string;\n isActionType: boolean;\n };\n dataModel: DataModel;\n cssMode: \"inline\" | \"external\" | \"both\";\n cssBuilder: CSSBuilder | null;\n rootSelector: string;\n errors: Array<{ row: number; col: string; message: string }>;\n valueFormatters: Map<string, (value: unknown) => { text: string; color?: string }>;\n baseStyles: Map<string, ResolvedCellStyle> | null;\n includeStyles: boolean;\n includeRawAttributes: boolean;\n hasInteraction: boolean;\n}) {\n const {\n html,\n row,\n rowIndex,\n meta,\n dataModel,\n cssMode,\n cssBuilder,\n rootSelector,\n errors,\n valueFormatters,\n baseStyles,\n includeStyles,\n includeRawAttributes,\n hasInteraction,\n } = options;\n\n const { col, colKey, baseClass, isActionType } = meta;\n\n const interaction = hasInteraction\n ? dataModel.getCellInteraction(row.id, col.key)\n : { readonly: false, muted: false, disabled: false };\n let className = baseClass;\n if (interaction.readonly) className += \" extable-readonly\";\n else className += \" extable-editable\";\n if (interaction.muted) className += \" extable-readonly-muted\";\n if (interaction.disabled) className += \" extable-disabled\";\n\n const condRes = includeStyles\n ? dataModel.resolveConditionalStyle(row.id, col)\n : { delta: null, forceErrorText: false };\n const cellStyle = includeStyles ? dataModel.getCellStyle(row.id, col.key) : null;\n const baseStyle = includeStyles ? baseStyles?.get(colKey) ?? {} : {};\n const withCond = includeStyles && condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const resolved = includeStyles && cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n\n const diagnostic = includeStyles ? dataModel.getCellDiagnostic(row.id, col.key) : null;\n if (diagnostic) {\n className += diagnostic.level === \"warning\" ? \" extable-diag-warning\" : \" extable-diag-error\";\n }\n\n const raw = dataModel.getRawCell(row.id, col.key);\n const valueRes = dataModel.resolveCellValue(row.id, col);\n let textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n\n if (valueRes.diagnostic?.source === \"formula\") {\n if (!textOverride) textOverride = \"#ERROR\";\n errors.push({ row: rowIndex, col: colKey, message: valueRes.diagnostic.message });\n }\n\n const formatter = valueFormatters.get(colKey);\n const formatted = textOverride\n ? { text: textOverride }\n : (formatter ? formatter(valueRes.value) : { text: String(valueRes.value ?? \"\") });\n const resolvedWithFormat =\n formatted.color && formatted.color !== resolved.textColor\n ? { ...resolved, textColor: formatted.color }\n : resolved;\n\n const tagValues = col.type === \"tags\" && !textOverride ? resolveTagValues(valueRes.value) : null;\n const actionValue = isActionType\n ? col.type === \"button\"\n ? resolveButtonAction(valueRes.value)\n : resolveLinkAction(valueRes.value)\n : null;\n const actionLabel = isActionType\n ? col.type === \"button\"\n ? getButtonLabel(valueRes.value)\n : getLinkLabel(valueRes.value)\n : \"\";\n\n const tdAttrs: Record<string, string | number | boolean> = {\n class: className,\n \"data-col-key\": col.key,\n };\n\n if (includeStyles && diagnostic) tdAttrs[\"data-extable-diag-message\"] = diagnostic.message;\n\n if (includeRawAttributes) {\n const rawNumbered = toRawValue(raw, valueRes.value, col);\n if (rawNumbered !== null) {\n tdAttrs[\"data-raw\"] = rawNumbered;\n } else {\n const rawStr = raw === null || raw === undefined ? \"\" : String(raw);\n tdAttrs[\"data-raw\"] = rawStr;\n }\n }\n\n if (includeStyles) {\n if (cssMode === \"inline\" || cssMode === \"both\") {\n if (hasRenderableStyle(resolvedWithFormat)) {\n const inlineStyle = serializeStyle(resolvedStyleToMap(resolvedWithFormat));\n if (inlineStyle) tdAttrs.style = inlineStyle;\n }\n } else if (cssMode === \"external\" && cssBuilder && hasRenderableStyle(resolvedWithFormat)) {\n const selector = `${rootSelector} tbody tr:nth-child(${rowIndex + 1}) td[data-col-key=\\\"${colKey}\\\"]`;\n cssBuilder.addRule(selector, resolvedStyleToMap(resolvedWithFormat));\n }\n }\n\n const hasActionContent = isActionType && !textOverride && actionValue && actionLabel;\n if (tagValues && tagValues.length) {\n html.openTag(\"td\", tdAttrs);\n html.openTag(\"div\", { class: \"extable-tag-list\" });\n tagValues.forEach((tag, index) => {\n html.openTag(\"span\", { class: \"extable-tag\" });\n html.tag(\"span\", { class: \"extable-tag-label\" }, tag);\n html.openTag(\"button\", {\n type: \"button\",\n class: \"extable-tag-remove\",\n \"data-extable-tag-remove\": \"1\",\n \"data-extable-tag-index\": String(index),\n disabled: interaction.readonly || interaction.disabled,\n });\n html.text(\"×\");\n html.closeTag(\"button\");\n html.closeTag(\"span\");\n });\n html.closeTag(\"div\");\n html.closeTag(\"td\");\n } else if (hasActionContent) {\n html.openTag(\"td\", tdAttrs);\n const actionAttrs: Record<string, string | number | boolean> = {\n class: col.type === \"button\" ? \"extable-action-button\" : \"extable-action-link\",\n \"data-extable-action\": col.type,\n };\n if (interaction.disabled) {\n actionAttrs.class = `${actionAttrs.class} extable-action-disabled`;\n }\n if (col.type === \"button\") {\n actionAttrs.type = \"button\";\n html.tag(\"button\", actionAttrs, actionLabel);\n } else {\n html.tag(\"span\", actionAttrs, actionLabel);\n }\n html.closeTag(\"td\");\n } else {\n html.tag(\"td\", tdAttrs, actionLabel || formatted.text);\n }\n}\n\nfunction createValueFormatter(\n col: ColumnSchema,\n includeStyles: boolean,\n): (value: unknown) => { text: string; color?: string } {\n if (!includeStyles) {\n return createFastValueFormatter(col);\n }\n if (col.type === \"button\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n const label = getButtonLabel(value);\n return { text: label || String(value) };\n };\n }\n if (col.type === \"link\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n const label = getLinkLabel(value);\n return { text: label || String(value) };\n };\n }\n if (col.type === \"tags\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n const tags = resolveTagValues(value);\n if (tags) return { text: tags.join(\", \") };\n return { text: String(value) };\n };\n }\n if (col.type === \"enum\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"enum\" && typeof obj.value === \"string\") {\n return { text: obj.value };\n }\n }\n return { text: String(value) };\n };\n }\n if (col.type === \"boolean\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n if (col.format === \"checkbox\" || !col.format) {\n return { text: value ? \"☑\" : \"☐\" };\n }\n if (Array.isArray(col.format) && col.format.length >= 2) {\n return { text: value ? String(col.format[0]) : String(col.format[1]) };\n }\n return { text: value ? String(col.format) : \"\" };\n };\n }\n if (col.type === \"number\") {\n const fmt = col.format as NumberFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n if (typeof value !== \"number\") return { text: String(value) };\n const text = formatNumberForEdit(value, {\n format: \"scientific\",\n precision: fmt?.precision,\n });\n const color = fmt?.negativeRed && value < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n };\n }\n const opts: Intl.NumberFormatOptions = {};\n if (fmt?.scale !== undefined) {\n opts.minimumFractionDigits = fmt.scale;\n opts.maximumFractionDigits = fmt.scale;\n }\n opts.useGrouping = Boolean(fmt?.thousandSeparator);\n const formatter = new Intl.NumberFormat(\"en-US\", opts);\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n if (typeof value !== \"number\") return { text: String(value) };\n const text = formatter.format(value);\n const color = fmt?.negativeRed && value < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n };\n }\n if (col.type === \"int\" || col.type === \"uint\") {\n const fmt = col.format as IntegerFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n if (typeof value !== \"number\") return { text: String(value) };\n const text = formatIntegerWithPrefix(value, token);\n const color = fmt?.negativeRed && value < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n };\n }\n const formatter = new Intl.NumberFormat(\"en-US\", {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n useGrouping: Boolean(fmt?.thousandSeparator),\n });\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n if (typeof value !== \"number\") return { text: String(value) };\n const text = formatter.format(value);\n const color = fmt?.negativeRed && value < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n };\n }\n if (col.type === \"date\" || col.type === \"time\" || col.type === \"datetime\") {\n const fmtValue = col.format as string | undefined;\n const fmt =\n col.type === \"date\"\n ? coerceDatePattern(fmtValue, \"date\")\n : col.type === \"time\"\n ? coerceDatePattern(fmtValue, \"time\")\n : coerceDatePattern(fmtValue, \"datetime\");\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n let d: Date | null = null;\n if (value instanceof Date) d = value;\n else if (typeof value === \"string\") d = parseIsoDate(value);\n if (!d) return { text: String(value) };\n return { text: formatDateLite(d, fmt) };\n };\n }\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n return { text: String(value) };\n };\n}\n\nfunction createFastValueFormatter(col: ColumnSchema): (value: unknown) => { text: string; color?: string } {\n if (col.type === \"button\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n const label = getButtonLabel(value);\n return { text: label || String(value) };\n };\n }\n if (col.type === \"link\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n const label = getLinkLabel(value);\n return { text: label || String(value) };\n };\n }\n if (col.type === \"tags\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n const tags = resolveTagValues(value);\n if (tags) return { text: tags.join(\", \") };\n return { text: String(value) };\n };\n }\n if (col.type === \"enum\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"enum\" && typeof obj.value === \"string\") {\n return { text: obj.value };\n }\n }\n return { text: String(value) };\n };\n }\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n return { text: String(value) };\n };\n}\n\nfunction resolveTagValues(value: unknown): string[] | null {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"tags\") {\n const values = obj.values;\n if (Array.isArray(values)) {\n return values.filter((v): v is string => typeof v === \"string\");\n }\n }\n }\n return null;\n}\n\nfunction hasRenderableStyle(style: ResolvedCellStyle): boolean {\n return Boolean(\n style.backgroundColor ||\n style.textColor ||\n style.bold ||\n style.italic ||\n style.underline ||\n style.strike,\n );\n}\n\nfunction resolvedStyleToMap(style: ResolvedCellStyle): CSSStyleMap {\n const css: CSSStyleMap = {};\n if (style.backgroundColor) css.backgroundColor = style.backgroundColor;\n if (style.textColor) css.color = style.textColor;\n if (style.bold) css.fontWeight = \"600\";\n if (style.italic) css.fontStyle = \"italic\";\n const dec: string[] = [];\n if (style.underline) dec.push(\"underline\");\n if (style.strike) dec.push(\"line-through\");\n if (dec.length) css.textDecorationLine = dec.join(\" \");\n return css;\n}\n\nfunction svgFunnel() {\n return `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M3 5h18l-7 8v6l-4 2v-8L3 5z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"/>\n </svg>\n `.trim();\n}\n\nfunction normalizeStyle(style: Partial<CSSStyleDeclaration>): CSSStyleMap {\n const out: CSSStyleMap = {};\n for (const [key, value] of Object.entries(style)) {\n if (value === undefined || value === null || value === \"\") continue;\n if (typeof value !== \"string\" && typeof value !== \"number\") continue;\n out[key] = value;\n }\n return out;\n}\n"],"names":["HTMLBuilder","tag","attrs","html","key","value","escapeHtml","content","text","serializeStyle","style","parts","prop","toKebabCase","CSSBuilder","selector","prev","options","minify","lines","body","input","m","renderTableHTML","cssMode","wrapWithRoot","defaultClass","toArray","defaultStyle","includeStyles","includeRawAttributes","data","baseView","schema","columns","colWidths","getColumnWidths","hasFormulas","c","hasConditionalStyles","cssBuilder","errors","valueFormatters","baseStyles","columnMeta","col","colKey","createValueFormatter","columnFormatToStyle","baseClasses","wrap","align","hasInteraction","row","renderFastTableHTML","dataModel","DataModel","rows","rootClasses","rootSelector","baseStyle","resolvedStyleToMap","tableStyle","ROW_HEADER_WIDTH_PX","acc","w","normalizeStyle","tableAttrs","tableStyleAttr","rootAttrs","rootStyle","HEADER_HEIGHT_PX","rowHeaderAttrs","colIndex","thAttrs","width","svgFunnel","rowIndex","trAttrs","DEFAULT_ROW_HEIGHT_PX","rowHeader","displayIndex","meta","renderCell","totalWidth","tdAttrPrefix","isActionType","formatter","formatted","tagValues","resolveTagValues","actionValue","resolveButtonAction","resolveLinkAction","actionLabel","getButtonLabel","getLinkLabel","hasActionContent","index","baseClass","interaction","className","condRes","cellStyle","withCond","mergeStyle","resolved","diagnostic","raw","valueRes","textOverride","resolvedWithFormat","tdAttrs","rawNumbered","toRawValue","rawStr","hasRenderableStyle","inlineStyle","actionAttrs","createFastValueFormatter","tags","obj","fmt","formatNumberForEdit","color","opts","token","formatIntegerWithPrefix","fmtValue","coerceDatePattern","d","parseIsoDate","formatDateLite","v","values","css","dec","out"],"mappings":"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"}
|