@bicharts/chart-host 0.6.76 → 0.6.78
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/adapters.mjs +75 -0
- package/dist/card.mjs +234 -0
- package/dist/chunk-BFN4NY22.mjs +3286 -0
- package/dist/{chunk-ZEXMBZHP.mjs → chunk-L554L6HF.mjs} +40 -3830
- package/dist/chunk-M7VM6F73.mjs +614 -0
- package/dist/chunk-MGAO2DR7.mjs +543 -0
- package/dist/index.mjs +72 -664
- package/dist/react.mjs +3 -1
- package/dist/types/adapters/d3.d.ts +3 -0
- package/dist/types/adapters/index.d.ts +3 -0
- package/dist/types/adapters/types.d.ts +108 -0
- package/dist/types/card.d.ts +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/selectionCardChrome.d.ts +29 -0
- package/package.json +11 -1
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
/*! @bicharts/chart-host — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; Natural Earth and US Census/TIGER (public domain). Full text: NOTICE in this package. */
|
|
2
|
+
import {
|
|
3
|
+
computeSelectionCard,
|
|
4
|
+
formatSourceDate,
|
|
5
|
+
formatSourceDateFor,
|
|
6
|
+
isExcelDateFormat,
|
|
7
|
+
normaliseAggregation
|
|
8
|
+
} from "./chunk-M7VM6F73.mjs";
|
|
2
9
|
import {
|
|
3
10
|
ANNOTATION_CLASS,
|
|
4
11
|
ANNOTATION_LAYER_CLASS,
|
|
@@ -15,25 +22,20 @@ import {
|
|
|
15
22
|
DARK_TEXT,
|
|
16
23
|
FIT_CONTENT_SELECTOR,
|
|
17
24
|
GLYPH_SAMPLE_N,
|
|
18
|
-
L,
|
|
19
25
|
LABEL_CONTRAST_CAP,
|
|
20
26
|
LABEL_CONTRAST_DONE_ATTR,
|
|
21
27
|
LABEL_PILL_CLASS,
|
|
22
28
|
LIGHT_TEXT,
|
|
23
29
|
MAX_FRAME_GROW_FACTOR,
|
|
24
30
|
MIN_CONTRAST,
|
|
25
|
-
MIN_HIT_BAND_PX,
|
|
26
31
|
MIN_RAMP_FILLS,
|
|
27
32
|
PAGE_MATCH_TOLERANCE,
|
|
28
33
|
PHANTOM_FRACTION,
|
|
29
34
|
PILL_MIN_ALPHA,
|
|
30
35
|
PILL_MIN_COVERAGE,
|
|
31
36
|
PILL_OPAQUE_ALPHA,
|
|
32
|
-
Qe,
|
|
33
|
-
Qn,
|
|
34
37
|
SAME_SHADE_DELTA_E,
|
|
35
38
|
SCROLL_SLACK_PX,
|
|
36
|
-
SELECTION_GLYPH_CLASS,
|
|
37
39
|
STRADDLE_COLS,
|
|
38
40
|
STRADDLE_MIN_SHARE,
|
|
39
41
|
STRADDLE_PILL_ALPHA,
|
|
@@ -41,8 +43,6 @@ import {
|
|
|
41
43
|
STRADDLE_TARGET_CONTRAST,
|
|
42
44
|
VALUE_AXIS_MIN_FIT,
|
|
43
45
|
WHITE_TEXT_BG_LUM,
|
|
44
|
-
Zn,
|
|
45
|
-
_3,
|
|
46
46
|
applyLabelContrast,
|
|
47
47
|
assembleD3,
|
|
48
48
|
autoRampCanvas,
|
|
@@ -54,13 +54,10 @@ import {
|
|
|
54
54
|
cellSuppressesNormalize,
|
|
55
55
|
censusClippedText,
|
|
56
56
|
censusColourSpread,
|
|
57
|
-
censusHitBands,
|
|
58
57
|
censusMarks,
|
|
59
58
|
censusValuePlacement,
|
|
60
59
|
clearGeoCache,
|
|
61
|
-
clearSelectionGlyphs,
|
|
62
60
|
clippedTextFlag,
|
|
63
|
-
collectD3GlyphCenters,
|
|
64
61
|
colourSpreadFlag,
|
|
65
62
|
compileRenderFn,
|
|
66
63
|
compositeOver,
|
|
@@ -68,57 +65,41 @@ import {
|
|
|
68
65
|
contrastRatio,
|
|
69
66
|
createChartGroup,
|
|
70
67
|
createChartHost,
|
|
71
|
-
createMarkResolver,
|
|
72
68
|
ctmScaleOf,
|
|
73
69
|
decideLabelColor,
|
|
74
70
|
deltaEHex,
|
|
75
|
-
ensureCrossfilterHitTargets,
|
|
76
71
|
explainRenderFailure,
|
|
77
72
|
fitReadingFor,
|
|
78
73
|
fitRenderedChart,
|
|
79
74
|
geoAssetFor,
|
|
80
75
|
geoFromCache,
|
|
81
76
|
glyphSampleGrid,
|
|
82
|
-
hitBandFlag,
|
|
83
77
|
invalidSentinelReason,
|
|
84
78
|
isBlankRender,
|
|
85
79
|
isHorizontalLabelRow,
|
|
86
|
-
isInsideControl,
|
|
87
80
|
isInvalidSentinelError,
|
|
88
81
|
isPhantomBox,
|
|
89
82
|
isPillBackdropAlpha,
|
|
90
|
-
l,
|
|
91
83
|
labelBand,
|
|
92
|
-
le,
|
|
93
84
|
loadGeo,
|
|
94
|
-
markKeyOf,
|
|
95
85
|
measureContainerBoxes,
|
|
96
86
|
minContrastOver,
|
|
97
87
|
needsScroll,
|
|
98
88
|
newIdScope,
|
|
99
|
-
nextClickedMarks,
|
|
100
|
-
nextSelection,
|
|
101
89
|
noopViewStateProvider,
|
|
102
|
-
o,
|
|
103
|
-
paintSelectionGlyphs,
|
|
104
90
|
pickColorOver,
|
|
105
91
|
pillBacksGlyph,
|
|
106
92
|
pinScrolledAxis,
|
|
107
93
|
planAxisPin,
|
|
108
94
|
planFrameGrow,
|
|
109
|
-
planSelectionPaint,
|
|
110
|
-
qe,
|
|
111
95
|
registerGeo,
|
|
112
96
|
registerGeoAsset,
|
|
113
97
|
relativeLuminance,
|
|
114
98
|
requiredD3Plugins,
|
|
115
99
|
resolveAutoColorScale,
|
|
116
100
|
resolveOptions,
|
|
117
|
-
rowIdxsFromMark,
|
|
118
|
-
sameRowSet,
|
|
119
101
|
scopeChartIds,
|
|
120
102
|
scrollFitFor,
|
|
121
|
-
selectionRuleOf,
|
|
122
103
|
sessionViewStateProvider,
|
|
123
104
|
straddleSampleGrid,
|
|
124
105
|
straddles,
|
|
@@ -130,7 +111,31 @@ import {
|
|
|
130
111
|
toSourceRows,
|
|
131
112
|
unpinScrolledAxis,
|
|
132
113
|
valuePlacementFlag
|
|
133
|
-
} from "./chunk-
|
|
114
|
+
} from "./chunk-BFN4NY22.mjs";
|
|
115
|
+
import {
|
|
116
|
+
_3,
|
|
117
|
+
l,
|
|
118
|
+
o
|
|
119
|
+
} from "./chunk-L554L6HF.mjs";
|
|
120
|
+
import {
|
|
121
|
+
MIN_HIT_BAND_PX,
|
|
122
|
+
SELECTION_GLYPH_CLASS,
|
|
123
|
+
censusHitBands,
|
|
124
|
+
clearSelectionGlyphs,
|
|
125
|
+
collectD3GlyphCenters,
|
|
126
|
+
createMarkResolver,
|
|
127
|
+
ensureCrossfilterHitTargets,
|
|
128
|
+
hitBandFlag,
|
|
129
|
+
isInsideControl,
|
|
130
|
+
markKeyOf,
|
|
131
|
+
nextClickedMarks,
|
|
132
|
+
nextSelection,
|
|
133
|
+
paintSelectionGlyphs,
|
|
134
|
+
planSelectionPaint,
|
|
135
|
+
rowIdxsFromMark,
|
|
136
|
+
sameRowSet,
|
|
137
|
+
selectionRuleOf
|
|
138
|
+
} from "./chunk-MGAO2DR7.mjs";
|
|
134
139
|
import "./chunk-A2GMXZP7.mjs";
|
|
135
140
|
import {
|
|
136
141
|
ACTIVE_TICK_CLASS,
|
|
@@ -317,7 +322,7 @@ function planTrivialChart(data) {
|
|
|
317
322
|
}
|
|
318
323
|
if (dataCols.length !== 1) return null;
|
|
319
324
|
const idx = dataCols[0];
|
|
320
|
-
const
|
|
325
|
+
const name = columnName(allCols[idx]) || "Value";
|
|
321
326
|
const finish = (kind, reason, source) => ({
|
|
322
327
|
kind,
|
|
323
328
|
reason,
|
|
@@ -329,7 +334,7 @@ function planTrivialChart(data) {
|
|
|
329
334
|
return finish(
|
|
330
335
|
"card",
|
|
331
336
|
"One row of one column holds a single value, so this is a card. No generation was needed and none was used.",
|
|
332
|
-
cardSource(idx,
|
|
337
|
+
cardSource(idx, name)
|
|
333
338
|
);
|
|
334
339
|
}
|
|
335
340
|
if (isNumericColumn(rows, idx)) {
|
|
@@ -337,7 +342,7 @@ function planTrivialChart(data) {
|
|
|
337
342
|
return finish(
|
|
338
343
|
"histogram",
|
|
339
344
|
"A single numeric column has one defensible chart: the distribution of its values. No generation was needed and none was used.",
|
|
340
|
-
histogramSource(idx,
|
|
345
|
+
histogramSource(idx, name)
|
|
341
346
|
);
|
|
342
347
|
}
|
|
343
348
|
const distinct = /* @__PURE__ */ new Set();
|
|
@@ -350,7 +355,7 @@ function planTrivialChart(data) {
|
|
|
350
355
|
return finish(
|
|
351
356
|
"frequency-bar",
|
|
352
357
|
"A single categorical column has one defensible chart: how often each value occurs. No generation was needed and none was used.",
|
|
353
|
-
frequencySource(idx,
|
|
358
|
+
frequencySource(idx, name)
|
|
354
359
|
);
|
|
355
360
|
}
|
|
356
361
|
function compileTrivialSource(source) {
|
|
@@ -391,7 +396,7 @@ var PRELUDE = `
|
|
|
391
396
|
}
|
|
392
397
|
container.replaceChildren();
|
|
393
398
|
`;
|
|
394
|
-
function cardSource(idx,
|
|
399
|
+
function cardSource(idx, name) {
|
|
395
400
|
return `function render(container, data, options) {${PRELUDE}
|
|
396
401
|
var raw = rows[0] ? rows[0][${idx}] : null;
|
|
397
402
|
var blank = (raw === null || raw === undefined || raw === '');
|
|
@@ -423,13 +428,13 @@ function cardSource(idx, name2) {
|
|
|
423
428
|
label.style.marginTop = '6px'; label.style.textAlign = 'center';
|
|
424
429
|
label.style.maxWidth = '100%'; label.style.overflow = 'hidden';
|
|
425
430
|
label.style.textOverflow = 'ellipsis'; label.style.whiteSpace = 'nowrap';
|
|
426
|
-
label.textContent = ${lit(
|
|
431
|
+
label.textContent = ${lit(name)};
|
|
427
432
|
|
|
428
433
|
root.appendChild(value); root.appendChild(label);
|
|
429
434
|
container.appendChild(root);
|
|
430
435
|
}`;
|
|
431
436
|
}
|
|
432
|
-
function frequencySource(idx,
|
|
437
|
+
function frequencySource(idx, name) {
|
|
433
438
|
return `function render(container, data, options) {${PRELUDE}
|
|
434
439
|
var counts = new Map();
|
|
435
440
|
for (var r = 0; r < rows.length; r++) {
|
|
@@ -449,7 +454,7 @@ function frequencySource(idx, name2) {
|
|
|
449
454
|
var barH = Math.min(bandH - 3, 26);
|
|
450
455
|
|
|
451
456
|
var title = svgEl('text', { x: 8, y: CF + 2, 'font-size': CF, 'font-weight': '700', fill: FG });
|
|
452
|
-
title.textContent = ${lit(
|
|
457
|
+
title.textContent = ${lit(name)} + ' \\u2014 count of ' + fmt(rows.length) + ' rows';
|
|
453
458
|
svg.appendChild(title);
|
|
454
459
|
|
|
455
460
|
entries.forEach(function (e, i) {
|
|
@@ -488,7 +493,7 @@ function frequencySource(idx, name2) {
|
|
|
488
493
|
container.appendChild(svg);
|
|
489
494
|
}`;
|
|
490
495
|
}
|
|
491
|
-
function histogramSource(idx,
|
|
496
|
+
function histogramSource(idx, name) {
|
|
492
497
|
return `function render(container, data, options) {${PRELUDE}
|
|
493
498
|
var vals = [];
|
|
494
499
|
for (var r = 0; r < rows.length; r++) {
|
|
@@ -524,7 +529,7 @@ function histogramSource(idx, name2) {
|
|
|
524
529
|
var bw = plotW / binCount;
|
|
525
530
|
|
|
526
531
|
var title = svgEl('text', { x: padL, y: CF + 2, 'font-size': CF, 'font-weight': '700', fill: FG });
|
|
527
|
-
title.textContent = ${lit(
|
|
532
|
+
title.textContent = ${lit(name)} + ' \\u2014 distribution of ' + fmt(vals.length) + ' values';
|
|
528
533
|
svg.appendChild(title);
|
|
529
534
|
|
|
530
535
|
bins.forEach(function (idxs, i) {
|
|
@@ -1200,20 +1205,20 @@ function normalizeFilterTerm(raw) {
|
|
|
1200
1205
|
return raw.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().replace(/\s+/g, " ").trim();
|
|
1201
1206
|
}
|
|
1202
1207
|
var FILTER_MIN_TERM_CHARS = 2;
|
|
1203
|
-
function startsAWord(
|
|
1204
|
-
for (let i2 =
|
|
1208
|
+
function startsAWord(name, t2) {
|
|
1209
|
+
for (let i2 = name.indexOf(t2); i2 >= 0; i2 = name.indexOf(t2, i2 + 1)) {
|
|
1205
1210
|
if (i2 === 0) return true;
|
|
1206
|
-
const prev =
|
|
1211
|
+
const prev = name.charCodeAt(i2 - 1);
|
|
1207
1212
|
const alnum = prev >= 97 && prev <= 122 || prev >= 48 && prev <= 57;
|
|
1208
1213
|
if (!alnum) return true;
|
|
1209
1214
|
}
|
|
1210
1215
|
return false;
|
|
1211
1216
|
}
|
|
1212
|
-
function looseFormWithWordStarts(
|
|
1217
|
+
function looseFormWithWordStarts(name) {
|
|
1213
1218
|
let form = "";
|
|
1214
1219
|
const starts = /* @__PURE__ */ new Set();
|
|
1215
1220
|
let prevAlnum = false;
|
|
1216
|
-
for (const ch of
|
|
1221
|
+
for (const ch of name) {
|
|
1217
1222
|
const piece = l(ch);
|
|
1218
1223
|
const code = ch.charCodeAt(0);
|
|
1219
1224
|
const alnum = code >= 97 && code <= 122 || code >= 48 && code <= 57;
|
|
@@ -1242,13 +1247,13 @@ function filterQualifyRows(rows, term, read, style = DEFAULT_FILTER_MATCH_STYLE)
|
|
|
1242
1247
|
const byDesc = [];
|
|
1243
1248
|
for (const row of all) {
|
|
1244
1249
|
const f2 = read(row);
|
|
1245
|
-
const
|
|
1246
|
-
if (
|
|
1247
|
-
if (
|
|
1248
|
-
(startsAWord(
|
|
1250
|
+
const name = normalizeFilterTerm(f2.name);
|
|
1251
|
+
if (name === "") continue;
|
|
1252
|
+
if (name.indexOf(t2) >= 0) {
|
|
1253
|
+
(startsAWord(name, t2) ? atWordStart : midWord).push(row);
|
|
1249
1254
|
continue;
|
|
1250
1255
|
}
|
|
1251
|
-
if (loose && startsALooseWord(looseFormWithWordStarts(
|
|
1256
|
+
if (loose && startsALooseWord(looseFormWithWordStarts(name), loose)) {
|
|
1252
1257
|
atWordStart.push(row);
|
|
1253
1258
|
continue;
|
|
1254
1259
|
}
|
|
@@ -1354,603 +1359,6 @@ function qualifyTableRows(rows) {
|
|
|
1354
1359
|
}));
|
|
1355
1360
|
}
|
|
1356
1361
|
|
|
1357
|
-
// src/sourceDateFormat.ts
|
|
1358
|
-
function formatSourceDate(raw, opts = {}) {
|
|
1359
|
-
const d2 = toDate(raw);
|
|
1360
|
-
if (!d2) return null;
|
|
1361
|
-
const dayFrame = L(d2);
|
|
1362
|
-
const frame = dayFrame ?? (opts.dialect === "dotnet" ? "local" : "utc");
|
|
1363
|
-
const p3 = partsIn(d2, frame);
|
|
1364
|
-
const format = cleanFormat(opts.format, opts.dialect);
|
|
1365
|
-
if (format && opts.dialect) {
|
|
1366
|
-
const rendered = renderFormat(format, p3, opts.dialect, opts.culture);
|
|
1367
|
-
if (rendered) return rendered;
|
|
1368
|
-
}
|
|
1369
|
-
return localeDate(p3, !!dayFrame, opts.culture);
|
|
1370
|
-
}
|
|
1371
|
-
function formatSourceDateFor(raw, columnName2, formats, culture) {
|
|
1372
|
-
return formatSourceDate(raw, {
|
|
1373
|
-
format: formats?.byColumn?.[columnName2] ?? null,
|
|
1374
|
-
dialect: formats?.dialect,
|
|
1375
|
-
culture
|
|
1376
|
-
});
|
|
1377
|
-
}
|
|
1378
|
-
var ISO_LIKE_RE = /^\s*\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?\s*$/;
|
|
1379
|
-
function toDate(raw) {
|
|
1380
|
-
if (raw instanceof Date) return isNaN(raw.getTime()) ? null : raw;
|
|
1381
|
-
if (typeof raw !== "string" || !ISO_LIKE_RE.test(raw)) return null;
|
|
1382
|
-
const d2 = le(raw.trim());
|
|
1383
|
-
return d2 && !isNaN(d2.getTime()) ? d2 : null;
|
|
1384
|
-
}
|
|
1385
|
-
function partsIn(d2, frame) {
|
|
1386
|
-
return frame === "utc" ? {
|
|
1387
|
-
year: d2.getUTCFullYear(),
|
|
1388
|
-
month: d2.getUTCMonth() + 1,
|
|
1389
|
-
day: d2.getUTCDate(),
|
|
1390
|
-
hours: d2.getUTCHours(),
|
|
1391
|
-
minutes: d2.getUTCMinutes(),
|
|
1392
|
-
seconds: d2.getUTCSeconds(),
|
|
1393
|
-
ms: d2.getUTCMilliseconds(),
|
|
1394
|
-
weekday: d2.getUTCDay()
|
|
1395
|
-
} : {
|
|
1396
|
-
year: d2.getFullYear(),
|
|
1397
|
-
month: d2.getMonth() + 1,
|
|
1398
|
-
day: d2.getDate(),
|
|
1399
|
-
hours: d2.getHours(),
|
|
1400
|
-
minutes: d2.getMinutes(),
|
|
1401
|
-
seconds: d2.getSeconds(),
|
|
1402
|
-
ms: d2.getMilliseconds(),
|
|
1403
|
-
weekday: d2.getDay()
|
|
1404
|
-
};
|
|
1405
|
-
}
|
|
1406
|
-
function utcAnchor(p3) {
|
|
1407
|
-
const d2 = new Date(Date.UTC(p3.year, p3.month - 1, p3.day, p3.hours, p3.minutes, p3.seconds, p3.ms));
|
|
1408
|
-
if (p3.year >= 0 && p3.year < 100) d2.setUTCFullYear(p3.year);
|
|
1409
|
-
return d2;
|
|
1410
|
-
}
|
|
1411
|
-
function localeDate(p3, wholeDay, culture) {
|
|
1412
|
-
const anchor = utcAnchor(p3);
|
|
1413
|
-
try {
|
|
1414
|
-
const o3 = { dateStyle: "medium", timeZone: "UTC" };
|
|
1415
|
-
if (!wholeDay) o3.timeStyle = p3.seconds || p3.ms ? "medium" : "short";
|
|
1416
|
-
return new Intl.DateTimeFormat(culture || void 0, o3).format(anchor);
|
|
1417
|
-
} catch {
|
|
1418
|
-
const iso = anchor.toISOString();
|
|
1419
|
-
return wholeDay ? iso.slice(0, 10) : `${iso.slice(0, 10)} ${iso.slice(11, 19)}`;
|
|
1420
|
-
}
|
|
1421
|
-
}
|
|
1422
|
-
function cleanFormat(raw, dialect) {
|
|
1423
|
-
if (!raw || !dialect) return null;
|
|
1424
|
-
let s2 = firstSection(String(raw), dialect);
|
|
1425
|
-
if (dialect === "excel") {
|
|
1426
|
-
s2 = s2.replace(/\[(h{1,2}|m{1,2}|s{1,2})\]/gi, "$1").replace(/\[[^\]]*\]/g, "");
|
|
1427
|
-
}
|
|
1428
|
-
if (!s2.trim() || /^general$/i.test(s2.trim())) return null;
|
|
1429
|
-
return hasDateToken(s2, dialect) ? s2 : null;
|
|
1430
|
-
}
|
|
1431
|
-
function isExcelDateFormat(raw) {
|
|
1432
|
-
if (!raw) return false;
|
|
1433
|
-
const bare = stripLiterals(firstSection(String(raw), "excel"), "excel");
|
|
1434
|
-
if (/\[(h+|m+|s+)\]/i.test(bare)) return false;
|
|
1435
|
-
const tokens = bare.replace(/\[[^\]]*\]/g, "").trim();
|
|
1436
|
-
if (!tokens || /^general$/i.test(tokens)) return false;
|
|
1437
|
-
return /[ymdhs]/i.test(tokens);
|
|
1438
|
-
}
|
|
1439
|
-
function firstSection(s2, dialect) {
|
|
1440
|
-
let out = "";
|
|
1441
|
-
let quote = "";
|
|
1442
|
-
for (let i2 = 0; i2 < s2.length; i2++) {
|
|
1443
|
-
const ch = s2[i2];
|
|
1444
|
-
if (quote) {
|
|
1445
|
-
out += ch;
|
|
1446
|
-
if (ch === quote) quote = "";
|
|
1447
|
-
continue;
|
|
1448
|
-
}
|
|
1449
|
-
if (ch === '"' || dialect === "dotnet" && ch === "'") {
|
|
1450
|
-
quote = ch;
|
|
1451
|
-
out += ch;
|
|
1452
|
-
continue;
|
|
1453
|
-
}
|
|
1454
|
-
if (ch === "\\") {
|
|
1455
|
-
out += ch + (s2[i2 + 1] ?? "");
|
|
1456
|
-
i2++;
|
|
1457
|
-
continue;
|
|
1458
|
-
}
|
|
1459
|
-
if (ch === ";") break;
|
|
1460
|
-
out += ch;
|
|
1461
|
-
}
|
|
1462
|
-
return out;
|
|
1463
|
-
}
|
|
1464
|
-
function hasDateToken(s2, dialect) {
|
|
1465
|
-
const stripped = stripLiterals(s2, dialect);
|
|
1466
|
-
return dialect === "excel" ? /[ymdhs]/i.test(stripped) : /[yMdHhmsft]/.test(stripped);
|
|
1467
|
-
}
|
|
1468
|
-
function stripLiterals(s2, dialect) {
|
|
1469
|
-
let out = "";
|
|
1470
|
-
for (let i2 = 0; i2 < s2.length; i2++) {
|
|
1471
|
-
const ch = s2[i2];
|
|
1472
|
-
if (ch === "\\" || dialect === "dotnet" && ch === "%") {
|
|
1473
|
-
i2++;
|
|
1474
|
-
continue;
|
|
1475
|
-
}
|
|
1476
|
-
if (dialect === "excel" && (ch === "_" || ch === "*")) {
|
|
1477
|
-
i2++;
|
|
1478
|
-
continue;
|
|
1479
|
-
}
|
|
1480
|
-
if (ch === '"' || dialect === "dotnet" && ch === "'") {
|
|
1481
|
-
const end = s2.indexOf(ch, i2 + 1);
|
|
1482
|
-
i2 = end < 0 ? s2.length : end;
|
|
1483
|
-
continue;
|
|
1484
|
-
}
|
|
1485
|
-
out += ch;
|
|
1486
|
-
}
|
|
1487
|
-
return out;
|
|
1488
|
-
}
|
|
1489
|
-
var EXCEL_TOKENS = [
|
|
1490
|
-
[/^am\/pm/i, "meridiemLong"],
|
|
1491
|
-
[/^a\/p/i, "meridiemShort"],
|
|
1492
|
-
[/^y{3,}/i, "year4"],
|
|
1493
|
-
[/^y{1,2}/i, "year2"],
|
|
1494
|
-
[/^m{5,}/i, "monthNarrow"],
|
|
1495
|
-
[/^m{4}/i, "monthLong"],
|
|
1496
|
-
[/^m{3}/i, "monthShort"],
|
|
1497
|
-
[/^m{2}/i, "mAmbiguous2"],
|
|
1498
|
-
[/^m/i, "mAmbiguous1"],
|
|
1499
|
-
[/^d{4,}/i, "weekdayLong"],
|
|
1500
|
-
[/^d{3}/i, "weekdayShort"],
|
|
1501
|
-
[/^d{2}/i, "day2"],
|
|
1502
|
-
[/^d/i, "day1"],
|
|
1503
|
-
[/^h{2,}/i, "hour2"],
|
|
1504
|
-
[/^h/i, "hour1"],
|
|
1505
|
-
[/^s{2,}/i, "second2"],
|
|
1506
|
-
[/^s/i, "second1"]
|
|
1507
|
-
];
|
|
1508
|
-
var DOTNET_TOKENS = [
|
|
1509
|
-
[/^y{3,}/, "year4"],
|
|
1510
|
-
[/^y{1,2}/, "year2"],
|
|
1511
|
-
[/^M{4,}/, "monthLong"],
|
|
1512
|
-
[/^M{3}/, "monthShort"],
|
|
1513
|
-
[/^M{2}/, "month2"],
|
|
1514
|
-
[/^M/, "month1"],
|
|
1515
|
-
[/^d{4,}/, "weekdayLong"],
|
|
1516
|
-
[/^d{3}/, "weekdayShort"],
|
|
1517
|
-
[/^d{2}/, "day2"],
|
|
1518
|
-
[/^d/, "day1"],
|
|
1519
|
-
[/^H{2,}/, "hour2"],
|
|
1520
|
-
[/^H/, "hour1"],
|
|
1521
|
-
[/^h{2,}/, "hour2"],
|
|
1522
|
-
[/^h/, "hour1"],
|
|
1523
|
-
[/^m{2,}/, "minute2"],
|
|
1524
|
-
[/^m/, "minute1"],
|
|
1525
|
-
[/^s{2,}/, "second2"],
|
|
1526
|
-
[/^s/, "second1"],
|
|
1527
|
-
[/^f+/, "fraction"],
|
|
1528
|
-
[/^tt/, "meridiemLong"],
|
|
1529
|
-
[/^t/, "meridiemShort"]
|
|
1530
|
-
];
|
|
1531
|
-
function tokenize(s2, dialect) {
|
|
1532
|
-
const table = dialect === "excel" ? EXCEL_TOKENS : DOTNET_TOKENS;
|
|
1533
|
-
const out = [];
|
|
1534
|
-
let i2 = 0;
|
|
1535
|
-
while (i2 < s2.length) {
|
|
1536
|
-
const ch = s2[i2];
|
|
1537
|
-
if (ch === "\\" || dialect === "dotnet" && ch === "%") {
|
|
1538
|
-
if (i2 + 1 < s2.length) out.push({ kind: "literal", text: s2[i2 + 1] });
|
|
1539
|
-
i2 += 2;
|
|
1540
|
-
continue;
|
|
1541
|
-
}
|
|
1542
|
-
if (ch === '"' || dialect === "dotnet" && ch === "'") {
|
|
1543
|
-
const end = s2.indexOf(ch, i2 + 1);
|
|
1544
|
-
out.push({ kind: "literal", text: end < 0 ? s2.slice(i2 + 1) : s2.slice(i2 + 1, end) });
|
|
1545
|
-
i2 = end < 0 ? s2.length : end + 1;
|
|
1546
|
-
continue;
|
|
1547
|
-
}
|
|
1548
|
-
const rest = s2.slice(i2);
|
|
1549
|
-
let matched = false;
|
|
1550
|
-
for (const [re, kind] of table) {
|
|
1551
|
-
const m2 = re.exec(rest);
|
|
1552
|
-
if (m2) {
|
|
1553
|
-
out.push({ kind });
|
|
1554
|
-
i2 += m2[0].length;
|
|
1555
|
-
matched = true;
|
|
1556
|
-
break;
|
|
1557
|
-
}
|
|
1558
|
-
}
|
|
1559
|
-
if (!matched) {
|
|
1560
|
-
out.push({ kind: "literal", text: ch });
|
|
1561
|
-
i2++;
|
|
1562
|
-
}
|
|
1563
|
-
}
|
|
1564
|
-
return out;
|
|
1565
|
-
}
|
|
1566
|
-
function resolveAmbiguousM(tokens) {
|
|
1567
|
-
const isHour = (t2) => t2.kind === "hour1" || t2.kind === "hour2";
|
|
1568
|
-
const isSecond = (t2) => t2.kind === "second1" || t2.kind === "second2";
|
|
1569
|
-
for (let i2 = 0; i2 < tokens.length; i2++) {
|
|
1570
|
-
const t2 = tokens[i2];
|
|
1571
|
-
if (t2.kind !== "mAmbiguous1" && t2.kind !== "mAmbiguous2") continue;
|
|
1572
|
-
const two = t2.kind === "mAmbiguous2";
|
|
1573
|
-
let minute = false;
|
|
1574
|
-
for (let j2 = i2 - 1; j2 >= 0; j2--) {
|
|
1575
|
-
if (tokens[j2].kind === "literal") continue;
|
|
1576
|
-
minute = isHour(tokens[j2]);
|
|
1577
|
-
break;
|
|
1578
|
-
}
|
|
1579
|
-
if (!minute) {
|
|
1580
|
-
for (let j2 = i2 + 1; j2 < tokens.length; j2++) {
|
|
1581
|
-
if (tokens[j2].kind === "literal") continue;
|
|
1582
|
-
minute = isSecond(tokens[j2]);
|
|
1583
|
-
break;
|
|
1584
|
-
}
|
|
1585
|
-
}
|
|
1586
|
-
t2.kind = minute ? two ? "minute2" : "minute1" : two ? "month2" : "month1";
|
|
1587
|
-
}
|
|
1588
|
-
}
|
|
1589
|
-
var EN_MONTHS_LONG = [
|
|
1590
|
-
"January",
|
|
1591
|
-
"February",
|
|
1592
|
-
"March",
|
|
1593
|
-
"April",
|
|
1594
|
-
"May",
|
|
1595
|
-
"June",
|
|
1596
|
-
"July",
|
|
1597
|
-
"August",
|
|
1598
|
-
"September",
|
|
1599
|
-
"October",
|
|
1600
|
-
"November",
|
|
1601
|
-
"December"
|
|
1602
|
-
];
|
|
1603
|
-
var EN_MONTHS_SHORT = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
1604
|
-
var EN_DAYS_LONG = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
|
|
1605
|
-
var EN_DAYS_SHORT = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
1606
|
-
function name(p3, kind, width, culture) {
|
|
1607
|
-
try {
|
|
1608
|
-
const opts = kind === "month" ? { month: width, timeZone: "UTC" } : { weekday: width === "narrow" ? "short" : width, timeZone: "UTC" };
|
|
1609
|
-
return new Intl.DateTimeFormat(culture || void 0, opts).format(utcAnchor(p3));
|
|
1610
|
-
} catch {
|
|
1611
|
-
if (kind === "month") {
|
|
1612
|
-
const long = EN_MONTHS_LONG[p3.month - 1] ?? "";
|
|
1613
|
-
if (width === "long") return long;
|
|
1614
|
-
return width === "narrow" ? long.slice(0, 1) : EN_MONTHS_SHORT[p3.month - 1] ?? "";
|
|
1615
|
-
}
|
|
1616
|
-
return (width === "long" ? EN_DAYS_LONG[p3.weekday] : EN_DAYS_SHORT[p3.weekday]) ?? "";
|
|
1617
|
-
}
|
|
1618
|
-
}
|
|
1619
|
-
var p2 = (n2) => (n2 < 10 ? "0" : "") + n2;
|
|
1620
|
-
function renderFormat(format, p3, dialect, culture) {
|
|
1621
|
-
const tokens = tokenize(format, dialect);
|
|
1622
|
-
if (dialect === "excel") resolveAmbiguousM(tokens);
|
|
1623
|
-
const twelve = tokens.some((t2) => t2.kind === "meridiemLong" || t2.kind === "meridiemShort");
|
|
1624
|
-
const hour12 = () => {
|
|
1625
|
-
const h2 = p3.hours % 12;
|
|
1626
|
-
return h2 === 0 ? 12 : h2;
|
|
1627
|
-
};
|
|
1628
|
-
let out = "";
|
|
1629
|
-
let sawField = false;
|
|
1630
|
-
for (const t2 of tokens) {
|
|
1631
|
-
switch (t2.kind) {
|
|
1632
|
-
case "literal":
|
|
1633
|
-
out += t2.text ?? "";
|
|
1634
|
-
break;
|
|
1635
|
-
case "year4":
|
|
1636
|
-
out += String(p3.year);
|
|
1637
|
-
sawField = true;
|
|
1638
|
-
break;
|
|
1639
|
-
case "year2":
|
|
1640
|
-
out += p2((p3.year % 100 + 100) % 100);
|
|
1641
|
-
sawField = true;
|
|
1642
|
-
break;
|
|
1643
|
-
case "monthLong":
|
|
1644
|
-
out += name(p3, "month", "long", culture);
|
|
1645
|
-
sawField = true;
|
|
1646
|
-
break;
|
|
1647
|
-
case "monthShort":
|
|
1648
|
-
out += name(p3, "month", "short", culture);
|
|
1649
|
-
sawField = true;
|
|
1650
|
-
break;
|
|
1651
|
-
case "monthNarrow":
|
|
1652
|
-
out += name(p3, "month", "long", culture).slice(0, 1);
|
|
1653
|
-
sawField = true;
|
|
1654
|
-
break;
|
|
1655
|
-
case "month2":
|
|
1656
|
-
out += p2(p3.month);
|
|
1657
|
-
sawField = true;
|
|
1658
|
-
break;
|
|
1659
|
-
case "month1":
|
|
1660
|
-
out += String(p3.month);
|
|
1661
|
-
sawField = true;
|
|
1662
|
-
break;
|
|
1663
|
-
case "weekdayLong":
|
|
1664
|
-
out += name(p3, "weekday", "long", culture);
|
|
1665
|
-
sawField = true;
|
|
1666
|
-
break;
|
|
1667
|
-
case "weekdayShort":
|
|
1668
|
-
out += name(p3, "weekday", "short", culture);
|
|
1669
|
-
sawField = true;
|
|
1670
|
-
break;
|
|
1671
|
-
case "day2":
|
|
1672
|
-
out += p2(p3.day);
|
|
1673
|
-
sawField = true;
|
|
1674
|
-
break;
|
|
1675
|
-
case "day1":
|
|
1676
|
-
out += String(p3.day);
|
|
1677
|
-
sawField = true;
|
|
1678
|
-
break;
|
|
1679
|
-
case "hour2":
|
|
1680
|
-
out += p2(twelve ? hour12() : p3.hours);
|
|
1681
|
-
sawField = true;
|
|
1682
|
-
break;
|
|
1683
|
-
case "hour1":
|
|
1684
|
-
out += String(twelve ? hour12() : p3.hours);
|
|
1685
|
-
sawField = true;
|
|
1686
|
-
break;
|
|
1687
|
-
case "minute2":
|
|
1688
|
-
out += p2(p3.minutes);
|
|
1689
|
-
sawField = true;
|
|
1690
|
-
break;
|
|
1691
|
-
case "minute1":
|
|
1692
|
-
out += String(p3.minutes);
|
|
1693
|
-
sawField = true;
|
|
1694
|
-
break;
|
|
1695
|
-
case "second2":
|
|
1696
|
-
out += p2(p3.seconds);
|
|
1697
|
-
sawField = true;
|
|
1698
|
-
break;
|
|
1699
|
-
case "second1":
|
|
1700
|
-
out += String(p3.seconds);
|
|
1701
|
-
sawField = true;
|
|
1702
|
-
break;
|
|
1703
|
-
case "fraction":
|
|
1704
|
-
out += String(p3.ms).padStart(3, "0");
|
|
1705
|
-
sawField = true;
|
|
1706
|
-
break;
|
|
1707
|
-
case "meridiemLong":
|
|
1708
|
-
out += p3.hours < 12 ? "AM" : "PM";
|
|
1709
|
-
sawField = true;
|
|
1710
|
-
break;
|
|
1711
|
-
case "meridiemShort":
|
|
1712
|
-
out += p3.hours < 12 ? "A" : "P";
|
|
1713
|
-
sawField = true;
|
|
1714
|
-
break;
|
|
1715
|
-
}
|
|
1716
|
-
}
|
|
1717
|
-
return sawField && out.trim() ? out : null;
|
|
1718
|
-
}
|
|
1719
|
-
|
|
1720
|
-
// src/selectionCard.ts
|
|
1721
|
-
var SYNTHETIC_PREFIX = "__";
|
|
1722
|
-
var NUMERIC_DATATYPE = /int|double|decimal|single|float|number|currency|money/i;
|
|
1723
|
-
function normaliseAggregation(raw) {
|
|
1724
|
-
const s2 = String(raw ?? "").trim().toLowerCase();
|
|
1725
|
-
if (!s2) return "sum";
|
|
1726
|
-
if (/^(avg|average|mean)$/.test(s2)) return "average";
|
|
1727
|
-
if (/^(min|minimum)$/.test(s2)) return "min";
|
|
1728
|
-
if (/^(max|maximum)$/.test(s2)) return "max";
|
|
1729
|
-
if (/^(count|countrows)$/.test(s2)) return "count";
|
|
1730
|
-
if (/^(median|med)$/.test(s2)) return "median";
|
|
1731
|
-
if (/^(distinctcount|dcount|countdistinct|uniques?)$/.test(s2)) return "distinctcount";
|
|
1732
|
-
return "sum";
|
|
1733
|
-
}
|
|
1734
|
-
function aggLabel(agg) {
|
|
1735
|
-
switch (agg) {
|
|
1736
|
-
case "average":
|
|
1737
|
-
return "Average";
|
|
1738
|
-
case "min":
|
|
1739
|
-
return "Min";
|
|
1740
|
-
case "max":
|
|
1741
|
-
return "Max";
|
|
1742
|
-
case "count":
|
|
1743
|
-
return "Count";
|
|
1744
|
-
case "median":
|
|
1745
|
-
return "Median";
|
|
1746
|
-
case "distinctcount":
|
|
1747
|
-
return "Distinct";
|
|
1748
|
-
default:
|
|
1749
|
-
return "Sum";
|
|
1750
|
-
}
|
|
1751
|
-
}
|
|
1752
|
-
function measureLineLabel(agg, name2) {
|
|
1753
|
-
const col = String(name2 ?? "");
|
|
1754
|
-
const prefix = aggLabel(agg) + " of ";
|
|
1755
|
-
return col.trim().toLowerCase().startsWith(prefix.toLowerCase()) ? col.trim() : prefix + col;
|
|
1756
|
-
}
|
|
1757
|
-
function isSynthetic(name2) {
|
|
1758
|
-
return String(name2 ?? "").startsWith(SYNTHETIC_PREFIX);
|
|
1759
|
-
}
|
|
1760
|
-
function isMeasureColumn(col) {
|
|
1761
|
-
if (!col || isSynthetic(col.name)) return false;
|
|
1762
|
-
if (col.isMeasure === true) return true;
|
|
1763
|
-
return NUMERIC_DATATYPE.test(String(col.dataType ?? ""));
|
|
1764
|
-
}
|
|
1765
|
-
function isRealColumn(col) {
|
|
1766
|
-
return !!col && !isSynthetic(col.name);
|
|
1767
|
-
}
|
|
1768
|
-
function isSerialisedDateColumn(col) {
|
|
1769
|
-
return /^datetime/i.test(String(col?.dataType ?? ""));
|
|
1770
|
-
}
|
|
1771
|
-
function displayText(col, raw, opts) {
|
|
1772
|
-
if (raw == null || raw === "") return "(blank)";
|
|
1773
|
-
if (isSerialisedDateColumn(col)) {
|
|
1774
|
-
const shown = formatSourceDate(raw, {
|
|
1775
|
-
format: opts.sourceFormats?.byColumn?.[String(col?.name ?? "")] ?? null,
|
|
1776
|
-
dialect: opts.sourceFormats?.dialect,
|
|
1777
|
-
culture: opts.cultureCode
|
|
1778
|
-
});
|
|
1779
|
-
if (shown) return shown;
|
|
1780
|
-
}
|
|
1781
|
-
return String(raw);
|
|
1782
|
-
}
|
|
1783
|
-
function isSuppressed(col) {
|
|
1784
|
-
return qe(col).suppressed;
|
|
1785
|
-
}
|
|
1786
|
-
function resolveAgg(col, requested, auto) {
|
|
1787
|
-
const fallback = () => {
|
|
1788
|
-
const d2 = Zn(col);
|
|
1789
|
-
return d2 === "first" ? "count" : d2;
|
|
1790
|
-
};
|
|
1791
|
-
if (auto) return fallback();
|
|
1792
|
-
return Qe(col).indexOf(requested) >= 0 ? requested : fallback();
|
|
1793
|
-
}
|
|
1794
|
-
function toNumber(v2) {
|
|
1795
|
-
if (v2 == null || v2 === "") return null;
|
|
1796
|
-
const n2 = typeof v2 === "number" ? v2 : Number(v2);
|
|
1797
|
-
return Number.isFinite(n2) ? n2 : null;
|
|
1798
|
-
}
|
|
1799
|
-
function reduce(values, agg, distinctRaw) {
|
|
1800
|
-
if (agg === "count") return values.length;
|
|
1801
|
-
if (agg === "distinctcount") return new Set(distinctRaw.map((v2) => v2 == null ? "\0" : String(v2))).size;
|
|
1802
|
-
if (!values.length) return null;
|
|
1803
|
-
switch (agg) {
|
|
1804
|
-
case "average":
|
|
1805
|
-
return values.reduce((a2, b2) => a2 + b2, 0) / values.length;
|
|
1806
|
-
case "min":
|
|
1807
|
-
return Math.min(...values);
|
|
1808
|
-
case "max":
|
|
1809
|
-
return Math.max(...values);
|
|
1810
|
-
case "median": {
|
|
1811
|
-
const s2 = [...values].sort((a2, b2) => a2 - b2);
|
|
1812
|
-
const m2 = s2.length >> 1;
|
|
1813
|
-
return s2.length % 2 ? s2[m2] : (s2[m2 - 1] + s2[m2]) / 2;
|
|
1814
|
-
}
|
|
1815
|
-
default:
|
|
1816
|
-
return values.reduce((a2, b2) => a2 + b2, 0);
|
|
1817
|
-
}
|
|
1818
|
-
}
|
|
1819
|
-
function fmtNumber(v2, culture) {
|
|
1820
|
-
try {
|
|
1821
|
-
const abs = Math.abs(v2);
|
|
1822
|
-
const opts = abs >= 1e6 ? { notation: "compact", maximumFractionDigits: 1 } : { maximumFractionDigits: abs < 10 ? 2 : 0 };
|
|
1823
|
-
return new Intl.NumberFormat(culture || void 0, opts).format(v2);
|
|
1824
|
-
} catch {
|
|
1825
|
-
return String(Math.round(v2 * 100) / 100);
|
|
1826
|
-
}
|
|
1827
|
-
}
|
|
1828
|
-
function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
|
|
1829
|
-
const columns = payload?.columns ?? [];
|
|
1830
|
-
const rows = payload?.rows ?? [];
|
|
1831
|
-
if (!columns.length || !rows.length) return null;
|
|
1832
|
-
const wanted = Array.from(new Set((selectedRowIdxs ?? []).filter((n2) => Number.isInteger(n2))));
|
|
1833
|
-
if (!wanted.length) return null;
|
|
1834
|
-
const rowIdxCol = columns.findIndex((c2) => c2?.name === "__rowIdx__");
|
|
1835
|
-
let byIdx = null;
|
|
1836
|
-
if (rowIdxCol >= 0) {
|
|
1837
|
-
byIdx = /* @__PURE__ */ new Map();
|
|
1838
|
-
for (let r2 = 0; r2 < rows.length; r2++) {
|
|
1839
|
-
const v2 = toNumber(rows[r2]?.[rowIdxCol]);
|
|
1840
|
-
if (v2 != null) byIdx.set(v2, r2);
|
|
1841
|
-
}
|
|
1842
|
-
}
|
|
1843
|
-
const positions = [];
|
|
1844
|
-
for (const idx of wanted) {
|
|
1845
|
-
const pos = byIdx ? byIdx.get(idx) : idx;
|
|
1846
|
-
if (pos != null && pos >= 0 && pos < rows.length) positions.push(pos);
|
|
1847
|
-
}
|
|
1848
|
-
if (!positions.length) return null;
|
|
1849
|
-
const auto = String(opts.aggregation ?? "").trim().length === 0;
|
|
1850
|
-
const agg = normaliseAggregation(opts.aggregation);
|
|
1851
|
-
const maxMeasures = opts.maxMeasures ?? 4;
|
|
1852
|
-
const maxHeaderValues = opts.maxHeaderValues ?? 3;
|
|
1853
|
-
const maxDimensions = opts.maxDimensions ?? 2;
|
|
1854
|
-
const dimIdx = columns.findIndex((c2) => c2 && !isSynthetic(c2.name) && !isMeasureColumn(c2));
|
|
1855
|
-
let header;
|
|
1856
|
-
if (dimIdx >= 0) {
|
|
1857
|
-
const seen = [];
|
|
1858
|
-
const set = /* @__PURE__ */ new Set();
|
|
1859
|
-
for (const p3 of positions) {
|
|
1860
|
-
const s2 = displayText(columns[dimIdx], rows[p3]?.[dimIdx], opts);
|
|
1861
|
-
if (!set.has(s2)) {
|
|
1862
|
-
set.add(s2);
|
|
1863
|
-
seen.push(s2);
|
|
1864
|
-
}
|
|
1865
|
-
if (seen.length > maxHeaderValues) break;
|
|
1866
|
-
}
|
|
1867
|
-
header = seen.length > maxHeaderValues ? `${positions.length} marks` : seen.join(", ");
|
|
1868
|
-
} else {
|
|
1869
|
-
header = `${positions.length} mark${positions.length === 1 ? "" : "s"}`;
|
|
1870
|
-
}
|
|
1871
|
-
const measureCols = [];
|
|
1872
|
-
const suppressedColumns = [];
|
|
1873
|
-
for (let c2 = 0; c2 < columns.length; c2++) {
|
|
1874
|
-
if (!isMeasureColumn(columns[c2])) continue;
|
|
1875
|
-
if (isSuppressed(columns[c2])) {
|
|
1876
|
-
suppressedColumns.push(String(columns[c2]?.name ?? ""));
|
|
1877
|
-
continue;
|
|
1878
|
-
}
|
|
1879
|
-
measureCols.push(c2);
|
|
1880
|
-
}
|
|
1881
|
-
const shown = measureCols.slice(0, maxMeasures);
|
|
1882
|
-
const lines = [];
|
|
1883
|
-
for (const c2 of shown) {
|
|
1884
|
-
const col = columns[c2];
|
|
1885
|
-
const colAgg = resolveAgg(col, agg, auto);
|
|
1886
|
-
const selVals = [];
|
|
1887
|
-
const selRaw = [];
|
|
1888
|
-
for (const p3 of positions) {
|
|
1889
|
-
const n2 = toNumber(rows[p3]?.[c2]);
|
|
1890
|
-
selRaw.push(rows[p3]?.[c2]);
|
|
1891
|
-
if (n2 != null) selVals.push(n2);
|
|
1892
|
-
}
|
|
1893
|
-
const value = reduce(selVals, colAgg, selRaw);
|
|
1894
|
-
let sharePct = null;
|
|
1895
|
-
if (Qn(col, colAgg) && value != null) {
|
|
1896
|
-
const allVals = [];
|
|
1897
|
-
const allRaw = [];
|
|
1898
|
-
for (let r2 = 0; r2 < rows.length; r2++) {
|
|
1899
|
-
const n2 = toNumber(rows[r2]?.[c2]);
|
|
1900
|
-
allRaw.push(rows[r2]?.[c2]);
|
|
1901
|
-
if (n2 != null) allVals.push(n2);
|
|
1902
|
-
}
|
|
1903
|
-
const total = reduce(allVals, colAgg, allRaw);
|
|
1904
|
-
if (total != null && total > 0) sharePct = value / total * 100;
|
|
1905
|
-
}
|
|
1906
|
-
lines.push({
|
|
1907
|
-
column: String(col?.name ?? ""),
|
|
1908
|
-
label: measureLineLabel(colAgg, String(col?.name ?? "")),
|
|
1909
|
-
value,
|
|
1910
|
-
valueText: value == null ? "\u2014" : fmtNumber(value, opts.cultureCode),
|
|
1911
|
-
sharePct,
|
|
1912
|
-
shareText: sharePct == null ? "" : `${sharePct < 0.1 ? "<0.1" : sharePct.toFixed(1)}% of total`,
|
|
1913
|
-
aggregation: colAgg
|
|
1914
|
-
});
|
|
1915
|
-
}
|
|
1916
|
-
const dimensionLines = [];
|
|
1917
|
-
for (let c2 = 0; c2 < columns.length && dimensionLines.length < maxDimensions; c2++) {
|
|
1918
|
-
if (c2 === dimIdx) continue;
|
|
1919
|
-
if (!isRealColumn(columns[c2]) || isMeasureColumn(columns[c2])) continue;
|
|
1920
|
-
const name2 = String(columns[c2]?.name ?? "");
|
|
1921
|
-
const distinct = /* @__PURE__ */ new Set();
|
|
1922
|
-
let firstText = "";
|
|
1923
|
-
for (const p3 of positions) {
|
|
1924
|
-
const raw = rows[p3]?.[c2];
|
|
1925
|
-
const key = raw == null || raw === "" ? "(blank)" : String(raw);
|
|
1926
|
-
if (!distinct.size) firstText = displayText(columns[c2], raw, opts);
|
|
1927
|
-
distinct.add(key);
|
|
1928
|
-
}
|
|
1929
|
-
if (!distinct.size) continue;
|
|
1930
|
-
const single = distinct.size === 1;
|
|
1931
|
-
dimensionLines.push({
|
|
1932
|
-
column: name2,
|
|
1933
|
-
label: single ? name2 : `Distinct ${name2}`,
|
|
1934
|
-
value: single ? null : distinct.size,
|
|
1935
|
-
valueText: single ? firstText : fmtNumber(distinct.size, opts.cultureCode),
|
|
1936
|
-
sharePct: null,
|
|
1937
|
-
shareText: "",
|
|
1938
|
-
aggregation: single ? "first" : "distinctcount"
|
|
1939
|
-
});
|
|
1940
|
-
}
|
|
1941
|
-
return {
|
|
1942
|
-
header,
|
|
1943
|
-
lines,
|
|
1944
|
-
dimensionLines,
|
|
1945
|
-
suppressedColumns,
|
|
1946
|
-
rowsText: `${positions.length} of ${rows.length} rows`,
|
|
1947
|
-
selectedRows: positions.length,
|
|
1948
|
-
totalRows: rows.length,
|
|
1949
|
-
hiddenMeasures: Math.max(0, measureCols.length - shown.length),
|
|
1950
|
-
aggregation: agg
|
|
1951
|
-
};
|
|
1952
|
-
}
|
|
1953
|
-
|
|
1954
1362
|
// src/summaryText.ts
|
|
1955
1363
|
function composeSummaryText(codeSummary, warningMsg) {
|
|
1956
1364
|
let sumText = String(codeSummary ?? "");
|
|
@@ -2049,8 +1457,8 @@ function p(t2, r2, n2, e2) {
|
|
|
2049
1457
|
}
|
|
2050
1458
|
else u3 = NaN;
|
|
2051
1459
|
return 360 * u3;
|
|
2052
|
-
})(t2, r2, n2, "i" === e2), h2 = 0, c2 = (i2 + a2) / 2, l3 = i2 - a2,
|
|
2053
|
-
return "v" === e2 && (h2 = 0 === i2 ? 0 : l3 / i2), i2 !== a2 && "l" === e2 && (h2 = c2 > 0.5 ? l3 / (2 - i2 - a2) : l3 / (i2 + a2)), "i" === e2 && (h2 = f2 > 0 ? 1 - a2 / f2 : 0), h2 *= 100, c2 *= 100, f2 *= 100, "l" === e2 ? [u2, h2, c2] : "v" === e2 ? [u2, h2,
|
|
1460
|
+
})(t2, r2, n2, "i" === e2), h2 = 0, c2 = (i2 + a2) / 2, l3 = i2 - a2, p2 = i2, f2 = (t2 + r2 + n2) / 3;
|
|
1461
|
+
return "v" === e2 && (h2 = 0 === i2 ? 0 : l3 / i2), i2 !== a2 && "l" === e2 && (h2 = c2 > 0.5 ? l3 / (2 - i2 - a2) : l3 / (i2 + a2)), "i" === e2 && (h2 = f2 > 0 ? 1 - a2 / f2 : 0), h2 *= 100, c2 *= 100, f2 *= 100, "l" === e2 ? [u2, h2, c2] : "v" === e2 ? [u2, h2, p2 *= 100] : [u2, h2, f2];
|
|
2054
1462
|
}
|
|
2055
1463
|
var f = function(t2, r2, n2) {
|
|
2056
1464
|
return p(t2, r2, n2, "l");
|
|
@@ -2140,7 +1548,7 @@ var S = function(t2, r2, n2) {
|
|
|
2140
1548
|
var A = function(t2, r2, n2) {
|
|
2141
1549
|
return isNaN(n2) && (n2 = 0), n2 *= Math.PI / 180, [t2, Math.cos(n2) * r2, Math.sin(n2) * r2];
|
|
2142
1550
|
};
|
|
2143
|
-
var
|
|
1551
|
+
var L = function(t2, r2, n2) {
|
|
2144
1552
|
return P.apply(void 0, A(t2, r2, n2));
|
|
2145
1553
|
};
|
|
2146
1554
|
var H = function(t2, r2, n2) {
|
|
@@ -2151,7 +1559,7 @@ var Y = Object.freeze({ __proto__: null, linear2rgb: e, rgb2linear: n, rgb2hex:
|
|
|
2151
1559
|
return O.apply(void 0, z(t2, r2, n2));
|
|
2152
1560
|
}, lab2rgb: j, lch2lab: A, lab2lch: S, xyz2lch: function(t2, r2, n2) {
|
|
2153
1561
|
return S.apply(void 0, O(t2, r2, n2));
|
|
2154
|
-
}, lch2xyz:
|
|
1562
|
+
}, lch2xyz: L, xyY2xyz: function(t2, r2, n2) {
|
|
2155
1563
|
return 0 === r2 ? [0, 0, 0] : [t2 * (n2 / r2), n2, n2 / r2 * (1 - t2 - r2)];
|
|
2156
1564
|
}, xyz2xyY: H });
|
|
2157
1565
|
function R(t2, n2) {
|
|
@@ -2176,8 +1584,8 @@ function q(t2, n2, e2, o3) {
|
|
|
2176
1584
|
for (var a3 = [], u3 = 0; u3 < arguments.length; u3++) a3[u3] = arguments[u3];
|
|
2177
1585
|
var h3 = void 0 === a3[o3] ? e2 : a3[o3], l3 = c2.call.apply(c2, r([this], a3, false));
|
|
2178
1586
|
if (false === h3) return l3;
|
|
2179
|
-
var
|
|
2180
|
-
return 1 === n2 ? "number" == typeof h3 ?
|
|
1587
|
+
var p2 = "number" == typeof h3 ? Math.round(h3) : 0, f2 = "number" == typeof t2 ? new Array(l3.length).fill(t2) : t2, s2 = f2.map((function(t3) {
|
|
1588
|
+
return 1 === n2 ? "number" == typeof h3 ? p2 : t3 : t3 + p2;
|
|
2181
1589
|
}));
|
|
2182
1590
|
return l3.map((function(t3, r2) {
|
|
2183
1591
|
return i(t3, s2[r2]);
|
|
@@ -2186,8 +1594,8 @@ function q(t2, n2, e2, o3) {
|
|
|
2186
1594
|
};
|
|
2187
1595
|
}
|
|
2188
1596
|
var D = function(t2, r2, n2) {
|
|
2189
|
-
var e2 = t2 instanceof ft ? t2 : new ft(t2), i2 = r2 instanceof ft ? r2 : new ft(r2), a2 = o2(n2, 0, 100) / 100, u2 = 2 * a2 - 1, h2 = e2.alpha() - i2.alpha(), c2 = ((u2 * h2 == -1 ? u2 : (u2 + h2) / (1 + u2 * h2)) + 1) / 2, l3 = 1 - c2,
|
|
2190
|
-
return new ft(
|
|
1597
|
+
var e2 = t2 instanceof ft ? t2 : new ft(t2), i2 = r2 instanceof ft ? r2 : new ft(r2), a2 = o2(n2, 0, 100) / 100, u2 = 2 * a2 - 1, h2 = e2.alpha() - i2.alpha(), c2 = ((u2 * h2 == -1 ? u2 : (u2 + h2) / (1 + u2 * h2)) + 1) / 2, l3 = 1 - c2, p2 = [Math.round(o2(e2.red() * c2 + i2.red() * l3, 0, 255)), Math.round(o2(e2.green() * c2 + i2.green() * l3, 0, 255)), Math.round(o2(e2.blue() * c2 + i2.blue() * l3, 0, 255))], f2 = e2.alpha() * a2 + i2.alpha() * (1 - a2);
|
|
1598
|
+
return new ft(p2, f2);
|
|
2191
1599
|
};
|
|
2192
1600
|
var F = Math.sqrt;
|
|
2193
1601
|
var U = Math.pow;
|
|
@@ -2225,7 +1633,7 @@ var et = function(t2, r2, n2, e2) {
|
|
|
2225
1633
|
var i2 = Object.assign({}, { l: 1, c: 1 }, e2);
|
|
2226
1634
|
return (function(t3, r3, n3, e3) {
|
|
2227
1635
|
void 0 === n3 && (n3 = 1), void 0 === e3 && (e3 = 1);
|
|
2228
|
-
var o4 = V(t3, true), i3 = o4[0], a3 = o4[1], u3 = o4[2], h3 = o4[3], c3 = o4[4], l3 = V(r3),
|
|
1636
|
+
var o4 = V(t3, true), i3 = o4[0], a3 = o4[1], u3 = o4[2], h3 = o4[3], c3 = o4[4], l3 = V(r3), p2 = l3[0], f2 = l3[1], s2 = l3[3], v2 = a3 - f2, b2 = i3 - p2, y2 = c3 - l3[4], d2 = F(U(h3 - s2, 2) + U(y2, 2) - U(v2, 2)), g2 = i3 < 16 ? 0.511 : 0.040975 * i3 / (1 + 0.01765 * i3), w2 = 0.0638 * a3 / (1 + 0.0131 * a3) + 0.638, m2 = 164 <= u3 && u3 <= 345 ? 0.56 + J(0.2 * $(Q(u3 + 168))) : 0.36 + J(0.4 * $(Q(u3 + 35))), M2 = F(U(a3, 4) / (U(a3, 4) + 1900)), x2 = w2 * (M2 * m2 + 1 - M2);
|
|
2229
1637
|
return F(U(b2 / (n3 * g2), 2) + U(v2 / (e3 * w2), 2) + U(d2 / x2, 2));
|
|
2230
1638
|
})(t2, r2, i2.l, i2.c);
|
|
2231
1639
|
}
|
|
@@ -2235,7 +1643,7 @@ var et = function(t2, r2, n2, e2) {
|
|
|
2235
1643
|
void 0 === n3 && (n3 = 1), void 0 === e3 && (e3 = 1), void 0 === o4 && (o4 = 1), void 0 === i3 && (i3 = "graphic");
|
|
2236
1644
|
var a3 = "textiles" === i3 ? 0.048 : 0.045, u3 = "textiles" === i3 ? 0.014 : 0.015;
|
|
2237
1645
|
n3 = "textiles" === i3 ? 2 : n3;
|
|
2238
|
-
var h3 = V(t3), c3 = h3[0], l3 = h3[1],
|
|
1646
|
+
var h3 = V(t3), c3 = h3[0], l3 = h3[1], p2 = h3[3], f2 = h3[4], s2 = V(r3), v2 = s2[0], b2 = s2[1], y2 = s2[3], d2 = c3 - v2, g2 = l3 - b2, w2 = f2 - s2[4], m2 = 1 + a3 * l3, M2 = 1 + u3 * l3, x2 = F(U(p2 - y2, 2) + U(w2, 2) - U(g2, 2));
|
|
2239
1647
|
return F(U(d2 / (1 * n3), 2) + U(g2 / (e3 * m2), 2) + U(x2 / (o4 * M2), 2));
|
|
2240
1648
|
})(t2, r2, u2.kL, u2.kC, u2.kH, u2.cate);
|
|
2241
1649
|
}
|
|
@@ -2246,8 +1654,8 @@ var et = function(t2, r2, n2, e2) {
|
|
|
2246
1654
|
var h2 = { kL: 1, kC: 1, kH: 1 }, c2 = Object.assign({}, h2, e2);
|
|
2247
1655
|
return (function(t3, r3, n3, e3, o4) {
|
|
2248
1656
|
void 0 === n3 && (n3 = 1), void 0 === e3 && (e3 = 1), void 0 === o4 && (o4 = 1);
|
|
2249
|
-
var i3 = V(t3), a3 = i3[0], u3 = i3[1], h3 = i3[3], c3 = i3[4], l3 = V(r3),
|
|
2250
|
-
return F(U(z2 / (n3 * P2), 2) + U(N2 / (e3 * j2), 2) + U(O2 / (o4 * S2), 2) +
|
|
1657
|
+
var i3 = V(t3), a3 = i3[0], u3 = i3[1], h3 = i3[3], c3 = i3[4], l3 = V(r3), p2 = l3[0], f2 = l3[1], s2 = l3[3], v2 = l3[4], b2 = (a3 + p2) / 2, y2 = (u3 + f2) / 2, d2 = (1 - F(U(y2, 7) / (U(y2, 7) + U(25, 7)))) / 2, g2 = h3 * (1 + d2), w2 = s2 * (1 + d2), m2 = F(U(g2, 2) + U(c3, 2)), M2 = F(U(w2, 2) + U(v2, 2)), x2 = T(g2, c3, true), _2 = T(w2, v2, true), C2 = (m2 + M2) / 2, I2 = J(x2 - _2) > 180 ? (x2 + _2 + 360) / 2 : (x2 + _2) / 2, k2 = 1 - 0.17 * $(Q(I2 - 30)) + 0.24 * $(Q(2 * I2)) + 0.32 * $(Q(3 * I2 + 6)) - 0.2 * $(Q(4 * I2 - 63)), E2 = J(_2 - x2) <= 180 ? _2 - x2 : J(_2 - x2) > 180 && _2 <= x2 ? _2 - x2 + 360 : _2 - x2 - 360, z2 = p2 - a3, N2 = f2 - u3, O2 = 2 * F(m2 * M2) * Z(Q(E2) / 2), P2 = 1 + 0.015 * U(b2 - 50, 2) / F(20 + U(b2 - 50, 2)), j2 = 1 + 0.045 * C2, S2 = 1 + 0.015 * C2 * k2, A2 = 30 * B(-U((I2 - 275) / 25, 2)), L2 = -2 * F(U(C2, 7) / (U(C2, 7) + U(25, 7))) * Z(2 * Q(A2));
|
|
1658
|
+
return F(U(z2 / (n3 * P2), 2) + U(N2 / (e3 * j2), 2) + U(O2 / (o4 * S2), 2) + L2 * (N2 / (e3 * j2)) * (O2 / (o4 * S2)));
|
|
2251
1659
|
})(t2, r2, c2.kL, c2.kC, c2.kH);
|
|
2252
1660
|
};
|
|
2253
1661
|
var ot = function(t2, r2, n2) {
|
|
@@ -2296,7 +1704,7 @@ var lt = function(t2, r2) {
|
|
|
2296
1704
|
if (c2 || (u2 = true), c2) {
|
|
2297
1705
|
var l3 = c2[1].toLocaleLowerCase();
|
|
2298
1706
|
if (e2 = l3, ut.has(l3) || (u2 = true), c2[2] && !u2) {
|
|
2299
|
-
var
|
|
1707
|
+
var p2 = c2[2], f2 = -1 !== p2.indexOf(",") ? "," : " ", s2 = p2.split(f2);
|
|
2300
1708
|
for (a2 = 0; a2 < 3; a2++) void 0 !== s2[a2] && (["lch", "lab"].includes(e2) && 0 === a2 || ["hsl", "hsla", "hsv", "hsva", "hwb", "hwba", "hsi", "hsia"].includes(e2) && a2 > 0 ? o3[a2] = ct(s2[a2]) : o3[a2] = Number(s2[a2].trim()));
|
|
2301
1709
|
["rgba", "hsla", "hsva", "hwba", "hsia"].includes(e2) ? (e2 = e2.slice(0, -1), void 0 !== s2[3] && (i2 = ct(s2[3]))) : "cmyk" === e2 && o3.push(void 0 !== s2[3] ? ct(s2[3]) : 0);
|
|
2302
1710
|
}
|
|
@@ -2327,13 +1735,13 @@ var ft = (function() {
|
|
|
2327
1735
|
var a2 = (function(t3) {
|
|
2328
1736
|
var r3, n4 = { lab2rgb: j, hsl2rgb: s, hsv2rgb: b, xyz2rgb: N, hwb2rgb: w, hsi2rgb: d }, e3 = lt(t3), i3 = e3[0], a3 = e3[1], u3 = e3[2];
|
|
2329
1737
|
if ("rgb" === i3) return [a3, u3];
|
|
2330
|
-
"lch" === i3 && (i3 = (r3 = ["xyz",
|
|
2331
|
-
var h3 = a3[0], c2 = a3[1],
|
|
2332
|
-
if ("cmyk" === i3) return [l2(h3, c2,
|
|
1738
|
+
"lch" === i3 && (i3 = (r3 = ["xyz", L(a3[0], a3[1], a3[2])])[0], a3 = r3[1]);
|
|
1739
|
+
var h3 = a3[0], c2 = a3[1], p2 = a3[2], f2 = a3[3];
|
|
1740
|
+
if ("cmyk" === i3) return [l2(h3, c2, p2, f2).map((function(t4) {
|
|
2333
1741
|
return o2(t4, 0, 255);
|
|
2334
1742
|
})), u3];
|
|
2335
1743
|
var v2 = "".concat(i3, "2rgb");
|
|
2336
|
-
if ("function" == typeof n4[v2]) return [n4[v2](h3, c2,
|
|
1744
|
+
if ("function" == typeof n4[v2]) return [n4[v2](h3, c2, p2).map((function(t4) {
|
|
2337
1745
|
return o2(t4, 0, 255);
|
|
2338
1746
|
})), u3];
|
|
2339
1747
|
throw new Error("Invalid color");
|
|
@@ -2460,7 +1868,7 @@ var wt = function(t2, r2, n2, e2) {
|
|
|
2460
1868
|
return new ft(j(t2, r2, n2), e2);
|
|
2461
1869
|
};
|
|
2462
1870
|
var mt = function(t2, r2, n2, e2) {
|
|
2463
|
-
return new ft(N.apply(void 0,
|
|
1871
|
+
return new ft(N.apply(void 0, L(t2, r2, n2)), e2);
|
|
2464
1872
|
};
|
|
2465
1873
|
function Mt(t2, r2, n2) {
|
|
2466
1874
|
return new ft(t2, r2, n2);
|
|
@@ -2857,7 +2265,7 @@ function fnv1a(text) {
|
|
|
2857
2265
|
function fingerprintComponentDigest(components) {
|
|
2858
2266
|
if (!components || typeof components !== "object") return "";
|
|
2859
2267
|
const parts = [];
|
|
2860
|
-
for (const [
|
|
2268
|
+
for (const [name, value] of Object.entries(components)) {
|
|
2861
2269
|
const timedOut = !!value && typeof value === "object" && value.timeout === "true";
|
|
2862
2270
|
let text;
|
|
2863
2271
|
try {
|
|
@@ -2865,7 +2273,7 @@ function fingerprintComponentDigest(components) {
|
|
|
2865
2273
|
} catch {
|
|
2866
2274
|
text = String(value);
|
|
2867
2275
|
}
|
|
2868
|
-
parts.push(`${
|
|
2276
|
+
parts.push(`${name}:${timedOut ? "timeout" : (fnv1a(text) >>> 16).toString(16).padStart(4, "0")}`);
|
|
2869
2277
|
}
|
|
2870
2278
|
return parts.join(",");
|
|
2871
2279
|
}
|