@k2b/ui 0.22.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/content/Calendar.js +1122 -1065
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/CalendarDayView.js +1187 -0
- package/dist/browser/content/CalendarDayView.js.map +1 -0
- package/dist/browser/content/CalendarWeekView.js +1593 -0
- package/dist/browser/content/CalendarWeekView.js.map +1 -0
- package/dist/browser/content/ChartExplorer.js +174 -82
- package/dist/browser/content/ChartExplorer.js.map +1 -1
- package/dist/browser/content/ChartFilterControls.js +90 -33
- package/dist/browser/content/ChartFilterControls.js.map +1 -1
- package/dist/browser/content/DataTable.js +235 -197
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/calendar-day-scroll.js +111 -0
- package/dist/browser/content/calendar-day-scroll.js.map +1 -0
- package/dist/browser/content/calendar-days.js +408 -0
- package/dist/browser/content/calendar-days.js.map +1 -0
- package/dist/browser/content/calendar-dialogs.js +236 -0
- package/dist/browser/content/calendar-dialogs.js.map +1 -0
- package/dist/browser/content/calendar-messages.js +210 -2
- package/dist/browser/content/calendar-messages.js.map +1 -1
- package/dist/browser/content/calendar-pointer.js +15 -3
- package/dist/browser/content/calendar-pointer.js.map +1 -1
- package/dist/browser/content/calendar-shared.js +328 -0
- package/dist/browser/content/calendar-shared.js.map +1 -0
- package/dist/browser/content/calendar-time-view.js +1654 -0
- package/dist/browser/content/calendar-time-view.js.map +1 -0
- package/dist/browser/content/chart-messages.js +10 -0
- package/dist/browser/content/chart-messages.js.map +1 -1
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/inputs/Combobox.js +0 -1
- package/dist/browser/inputs/Combobox.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +125 -97
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/Navigation.js +18 -3
- package/dist/browser/layout/Navigation.js.map +1 -1
- package/dist/browser/layout/PageTitle.js +18 -1
- package/dist/browser/layout/PageTitle.js.map +1 -1
- package/dist/browser/layout/SidebarSwitcher.js +505 -0
- package/dist/browser/layout/SidebarSwitcher.js.map +1 -0
- package/dist/browser/layout/app-workspace-controller.js +174 -86
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/index.js +1 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/navigation-model.js +1 -0
- package/dist/browser/layout/navigation-model.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +18 -6
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/content/Calendar.js +553 -341
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/CalendarDayView.js +800 -0
- package/dist/ssr/content/CalendarDayView.js.map +1 -0
- package/dist/ssr/content/CalendarWeekView.js +1090 -0
- package/dist/ssr/content/CalendarWeekView.js.map +1 -0
- package/dist/ssr/content/ChartExplorer.js +93 -34
- package/dist/ssr/content/ChartExplorer.js.map +1 -1
- package/dist/ssr/content/ChartFilterControls.js +49 -7
- package/dist/ssr/content/ChartFilterControls.js.map +1 -1
- package/dist/ssr/content/DataTable.js +88 -66
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/calendar-day-scroll.js +111 -0
- package/dist/ssr/content/calendar-day-scroll.js.map +1 -0
- package/dist/ssr/content/calendar-days.js +408 -0
- package/dist/ssr/content/calendar-days.js.map +1 -0
- package/dist/ssr/content/calendar-dialogs.js +159 -0
- package/dist/ssr/content/calendar-dialogs.js.map +1 -0
- package/dist/ssr/content/calendar-messages.js +210 -2
- package/dist/ssr/content/calendar-messages.js.map +1 -1
- package/dist/ssr/content/calendar-pointer.js +15 -3
- package/dist/ssr/content/calendar-pointer.js.map +1 -1
- package/dist/ssr/content/calendar-shared.js +261 -0
- package/dist/ssr/content/calendar-shared.js.map +1 -0
- package/dist/ssr/content/calendar-time-view.js +1311 -0
- package/dist/ssr/content/calendar-time-view.js.map +1 -0
- package/dist/ssr/content/chart-messages.js +10 -0
- package/dist/ssr/content/chart-messages.js.map +1 -1
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/inputs/Combobox.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +40 -29
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/Navigation.js +12 -2
- package/dist/ssr/layout/Navigation.js.map +1 -1
- package/dist/ssr/layout/PageTitle.js +18 -1
- package/dist/ssr/layout/PageTitle.js.map +1 -1
- package/dist/ssr/layout/SidebarSwitcher.js +271 -0
- package/dist/ssr/layout/SidebarSwitcher.js.map +1 -0
- package/dist/ssr/layout/app-workspace-controller.js +174 -86
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/index.js +1 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/navigation-model.js +1 -0
- package/dist/ssr/layout/navigation-model.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +2 -2
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/content/Calendar.d.ts +95 -1
- package/dist/types/content/CalendarDayView.d.ts +7 -0
- package/dist/types/content/CalendarWeekView.d.ts +7 -0
- package/dist/types/content/ChartExplorer.d.ts +36 -1
- package/dist/types/content/ChartFilterControls.d.ts +6 -1
- package/dist/types/content/DataTable.d.ts +14 -0
- package/dist/types/content/calendar-day-scroll.d.ts +47 -0
- package/dist/types/content/calendar-days.d.ts +192 -0
- package/dist/types/content/calendar-dialogs.d.ts +22 -0
- package/dist/types/content/calendar-messages.d.ts +99 -0
- package/dist/types/content/calendar-pointer.d.ts +9 -0
- package/dist/types/content/calendar-shared.d.ts +69 -0
- package/dist/types/content/calendar-time-view.d.ts +252 -0
- package/dist/types/content/chart-messages.d.ts +5 -0
- package/dist/types/content/index.d.ts +2 -2
- package/dist/types/layout/AppWorkspace.d.ts +27 -3
- package/dist/types/layout/PageTitle.d.ts +2 -1
- package/dist/types/layout/SidebarSwitcher.d.ts +65 -0
- package/dist/types/layout/app-workspace-controller.d.ts +9 -1
- package/dist/types/layout/index.d.ts +1 -0
- package/dist/types/layout/navigation-model.d.ts +4 -0
- package/dist/types/surfaces/StatCell.d.ts +5 -0
- package/package.json +3 -3
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
import { template as _$template } from "solid-js/web";
|
|
2
|
-
import { memo as _$memo } from "solid-js/web";
|
|
3
2
|
import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
|
|
4
3
|
import { className as _$className } from "solid-js/web";
|
|
5
4
|
import { effect as _$effect } from "solid-js/web";
|
|
5
|
+
import { memo as _$memo } from "solid-js/web";
|
|
6
6
|
import { getNextMarker as _$getNextMarker } from "solid-js/web";
|
|
7
|
-
import { createComponent as _$createComponent } from "solid-js/web";
|
|
8
7
|
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
9
8
|
import { insert as _$insert } from "solid-js/web";
|
|
9
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
10
10
|
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
11
11
|
var _tmpl$ = /*#__PURE__*/_$template(`<div>`),
|
|
12
12
|
_tmpl$2 = /*#__PURE__*/_$template(`<span role=alert>`),
|
|
13
|
-
_tmpl$3 = /*#__PURE__*/_$template(`<
|
|
14
|
-
_tmpl$4 = /*#__PURE__*/_$template(`<
|
|
15
|
-
_tmpl$5 = /*#__PURE__*/_$template(`<div class=k2b-
|
|
16
|
-
_tmpl$6 = /*#__PURE__*/_$template(`<
|
|
17
|
-
_tmpl$7 = /*#__PURE__*/_$template(`<
|
|
18
|
-
_tmpl$8 = /*#__PURE__*/_$template(`<
|
|
19
|
-
|
|
13
|
+
_tmpl$3 = /*#__PURE__*/_$template(`<ul class=k2b-chart-legend>`),
|
|
14
|
+
_tmpl$4 = /*#__PURE__*/_$template(`<div class=k2b-chart-explorer__details aria-live=polite>`),
|
|
15
|
+
_tmpl$5 = /*#__PURE__*/_$template(`<section><header class=k2b-chart-explorer__header><div><!$><!/><!$><!/></div><div class=k2b-chart-explorer__actions><!$><!/><!$><!/></div></header><!$><!/><!$><!/><div class=k2b-chart-explorer__viewport></div><!$><!/>`),
|
|
16
|
+
_tmpl$6 = /*#__PURE__*/_$template(`<div class=k2b-chart__empty>`),
|
|
17
|
+
_tmpl$7 = /*#__PURE__*/_$template(`<p class=k2b-chart-explorer__note>`),
|
|
18
|
+
_tmpl$8 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
|
|
19
|
+
_tmpl$9 = /*#__PURE__*/_$template(`<li><span class=k2b-chart-legend__swatch aria-hidden=true></span><!$><!/>`),
|
|
20
|
+
_tmpl$0 = /*#__PURE__*/_$template(`<i class="ti ti-x"aria-hidden=true>`),
|
|
21
|
+
_tmpl$1 = /*#__PURE__*/_$template(`<div class=k2b-chart-explorer__detail-header><span></span><!$><!/>`);
|
|
22
|
+
import { createEffect, createMemo, createSignal, createUniqueId, For, Show } from "solid-js";
|
|
23
|
+
import { Dynamic } from "solid-js/web";
|
|
20
24
|
import { Button, IconButton } from "../actions/Button";
|
|
21
25
|
import { CopyButton } from "../actions/CopyButton";
|
|
22
26
|
import { SelectChip } from "../inputs/SelectChip";
|
|
@@ -28,7 +32,13 @@ import { ChartSnapshotView } from "./ChartSnapshotView";
|
|
|
28
32
|
import { validateChartExplorerData } from "./chart-explorer";
|
|
29
33
|
import { useChartMessages } from "./chart-messages";
|
|
30
34
|
import DataTable from "./DataTable";
|
|
31
|
-
|
|
35
|
+
|
|
36
|
+
/** One legend entry; `color` is the palette index the renderer gave the series (0 is `--stdlib-chart-c1`). */
|
|
37
|
+
|
|
38
|
+
const tsvCell = (value, numeric = false) => {
|
|
39
|
+
const safe = !numeric && /^[=+\-@\t\r]/.test(value) ? `'${value}` : value;
|
|
40
|
+
return /[\t\r\n"]/.test(safe) ? `"${safe.replaceAll('"', '""')}"` : safe;
|
|
41
|
+
};
|
|
32
42
|
export function ChartExplorer(props) {
|
|
33
43
|
const messages = useUiMessages();
|
|
34
44
|
const chartMessages = useChartMessages();
|
|
@@ -84,38 +94,70 @@ export function ChartExplorer(props) {
|
|
|
84
94
|
return order.direction === "asc" ? comparison : -comparison;
|
|
85
95
|
});
|
|
86
96
|
});
|
|
87
|
-
const
|
|
97
|
+
const shownRows = () => props.tableRows === undefined ? rows() : rows().slice(0, props.tableRows);
|
|
98
|
+
// Chart ids are data; a prefix keeps one named "table" apart from the table entry.
|
|
99
|
+
const switcherValue = () => view() === "table" || !props.charts?.length ? view() : `chart:${props.chart ?? props.charts[0]?.id}`;
|
|
100
|
+
const switcherOptions = () => props.charts?.length ? [...props.charts.map(chart => ({
|
|
101
|
+
value: `chart:${chart.id}`,
|
|
102
|
+
label: chart.label
|
|
103
|
+
})), {
|
|
104
|
+
value: "table",
|
|
105
|
+
label: chartMessages().chartData
|
|
106
|
+
}] : [{
|
|
107
|
+
value: "chart",
|
|
108
|
+
label: chartMessages().chartDiagram
|
|
109
|
+
}, {
|
|
110
|
+
value: "table",
|
|
111
|
+
label: chartMessages().chartData
|
|
112
|
+
}];
|
|
113
|
+
const pick = value => {
|
|
114
|
+
if (value === "table" || value === "chart") return setView(value);
|
|
115
|
+
setView("chart");
|
|
116
|
+
props.onChartChange?.(value.slice("chart:".length));
|
|
117
|
+
};
|
|
118
|
+
const copyText = () => [props.columns.map(c => tsvCell(c.label)).join("\t"), ...rows().map(row => props.columns.map(c => tsvCell(c.value(row), typeof c.sortValue?.(row) === "number")).join("\t"))].join("\n");
|
|
88
119
|
return (() => {
|
|
89
|
-
var _el$ = _$getNextElement(_tmpl$
|
|
120
|
+
var _el$ = _$getNextElement(_tmpl$5),
|
|
90
121
|
_el$2 = _el$.firstChild,
|
|
91
122
|
_el$3 = _el$2.firstChild,
|
|
92
|
-
_el$
|
|
93
|
-
_el$6 = _el$
|
|
94
|
-
|
|
95
|
-
_el$8 = _el$
|
|
96
|
-
_el$9 = _el$
|
|
97
|
-
|
|
98
|
-
_el$1 = _el$0.nextSibling,
|
|
99
|
-
|
|
100
|
-
_el$
|
|
101
|
-
|
|
102
|
-
_el$
|
|
103
|
-
_el$
|
|
104
|
-
[_el$
|
|
123
|
+
_el$5 = _el$3.firstChild,
|
|
124
|
+
[_el$6, _co$] = _$getNextMarker(_el$5.nextSibling),
|
|
125
|
+
_el$7 = _el$6.nextSibling,
|
|
126
|
+
[_el$8, _co$2] = _$getNextMarker(_el$7.nextSibling),
|
|
127
|
+
_el$9 = _el$3.nextSibling,
|
|
128
|
+
_el$0 = _el$9.firstChild,
|
|
129
|
+
[_el$1, _co$3] = _$getNextMarker(_el$0.nextSibling),
|
|
130
|
+
_el$10 = _el$1.nextSibling,
|
|
131
|
+
[_el$11, _co$4] = _$getNextMarker(_el$10.nextSibling),
|
|
132
|
+
_el$16 = _el$2.nextSibling,
|
|
133
|
+
[_el$17, _co$5] = _$getNextMarker(_el$16.nextSibling),
|
|
134
|
+
_el$18 = _el$17.nextSibling,
|
|
135
|
+
[_el$19, _co$6] = _$getNextMarker(_el$18.nextSibling),
|
|
136
|
+
_el$13 = _el$19.nextSibling,
|
|
137
|
+
_el$20 = _el$13.nextSibling,
|
|
138
|
+
[_el$21, _co$7] = _$getNextMarker(_el$20.nextSibling);
|
|
105
139
|
_$setAttribute(_el$, "aria-labelledby", id);
|
|
106
|
-
_$
|
|
107
|
-
|
|
140
|
+
_$insert(_el$3, _$createComponent(Dynamic, {
|
|
141
|
+
get component() {
|
|
142
|
+
return `h${props.headingLevel ?? 3}`;
|
|
143
|
+
},
|
|
144
|
+
id: id,
|
|
145
|
+
"class": "k2b-chart-explorer__title",
|
|
146
|
+
get children() {
|
|
147
|
+
return props.title;
|
|
148
|
+
}
|
|
149
|
+
}), _el$6, _co$);
|
|
108
150
|
_$insert(_el$3, _$createComponent(Show, {
|
|
109
151
|
get when() {
|
|
110
152
|
return props.description;
|
|
111
153
|
},
|
|
112
154
|
get children() {
|
|
113
|
-
var _el$
|
|
114
|
-
_$insert(_el$
|
|
115
|
-
return _el$
|
|
155
|
+
var _el$4 = _$getNextElement(_tmpl$);
|
|
156
|
+
_$insert(_el$4, () => props.description);
|
|
157
|
+
return _el$4;
|
|
116
158
|
}
|
|
117
|
-
}), _el$
|
|
118
|
-
_$insert(_el$
|
|
159
|
+
}), _el$8, _co$2);
|
|
160
|
+
_$insert(_el$9, _$createComponent(CopyButton, {
|
|
119
161
|
get text() {
|
|
120
162
|
return copyText();
|
|
121
163
|
},
|
|
@@ -130,44 +172,39 @@ export function ChartExplorer(props) {
|
|
|
130
172
|
},
|
|
131
173
|
onCopyError: () => setCopyFailed(true),
|
|
132
174
|
onCopied: () => setCopyFailed(false)
|
|
133
|
-
}), _el$
|
|
134
|
-
_$insert(_el$
|
|
175
|
+
}), _el$1, _co$3);
|
|
176
|
+
_$insert(_el$9, _$createComponent(SelectChip, {
|
|
135
177
|
get value() {
|
|
136
|
-
return
|
|
178
|
+
return switcherValue();
|
|
137
179
|
},
|
|
138
|
-
onValueChange:
|
|
180
|
+
onValueChange: pick,
|
|
139
181
|
get ["aria-label"]() {
|
|
140
182
|
return chartMessages().chartView;
|
|
141
183
|
},
|
|
142
184
|
get options() {
|
|
143
|
-
return
|
|
144
|
-
value: "chart",
|
|
145
|
-
label: chartMessages().chartDiagram
|
|
146
|
-
}, {
|
|
147
|
-
value: "table",
|
|
148
|
-
label: chartMessages().chartData
|
|
149
|
-
}];
|
|
185
|
+
return switcherOptions();
|
|
150
186
|
}
|
|
151
|
-
}), _el$
|
|
187
|
+
}), _el$11, _co$4);
|
|
152
188
|
_$insert(_el$, _$createComponent(Show, {
|
|
153
189
|
get when() {
|
|
154
190
|
return copyFailed();
|
|
155
191
|
},
|
|
156
192
|
get children() {
|
|
157
|
-
var _el$
|
|
158
|
-
_$insert(_el$
|
|
159
|
-
return _el$
|
|
193
|
+
var _el$12 = _$getNextElement(_tmpl$2);
|
|
194
|
+
_$insert(_el$12, () => chartMessages().chartCopyFailed);
|
|
195
|
+
return _el$12;
|
|
160
196
|
}
|
|
161
|
-
}), _el$
|
|
162
|
-
_$insert(_el
|
|
197
|
+
}), _el$17, _co$5);
|
|
198
|
+
_$insert(_el$, () => props.controls, _el$19, _co$6);
|
|
199
|
+
_$insert(_el$13, _$createComponent(Show, {
|
|
163
200
|
get when() {
|
|
164
201
|
return data().rows.length > 0;
|
|
165
202
|
},
|
|
166
203
|
get fallback() {
|
|
167
204
|
return (() => {
|
|
168
|
-
var _el$
|
|
169
|
-
_$insert(_el$
|
|
170
|
-
return _el$
|
|
205
|
+
var _el$22 = _$getNextElement(_tmpl$6);
|
|
206
|
+
_$insert(_el$22, () => props.empty ?? messages().noData);
|
|
207
|
+
return _el$22;
|
|
171
208
|
})();
|
|
172
209
|
},
|
|
173
210
|
get children() {
|
|
@@ -176,9 +213,9 @@ export function ChartExplorer(props) {
|
|
|
176
213
|
return view() === "chart";
|
|
177
214
|
},
|
|
178
215
|
get fallback() {
|
|
179
|
-
return _$createComponent(DataTable, {
|
|
216
|
+
return [_$createComponent(DataTable, {
|
|
180
217
|
get rows() {
|
|
181
|
-
return
|
|
218
|
+
return shownRows();
|
|
182
219
|
},
|
|
183
220
|
get columns() {
|
|
184
221
|
return props.columns.map(column => ({
|
|
@@ -208,7 +245,7 @@ export function ChartExplorer(props) {
|
|
|
208
245
|
}) => {
|
|
209
246
|
const custom = props.columns.find(column => column.id === col.id)?.render;
|
|
210
247
|
const cell = () => custom ? custom(row) : render(value);
|
|
211
|
-
return col.id === props.columns[0]?.id ? _$createComponent(Button, {
|
|
248
|
+
return !custom && col.id === props.columns[0]?.id ? _$createComponent(Button, {
|
|
212
249
|
variant: "text",
|
|
213
250
|
size: "sm",
|
|
214
251
|
onClick: () => select(row.key),
|
|
@@ -229,25 +266,37 @@ export function ChartExplorer(props) {
|
|
|
229
266
|
}),
|
|
230
267
|
get children() {
|
|
231
268
|
return [_$memo(() => props.columns.find(column => column.id === col.id)?.label), (() => {
|
|
232
|
-
var _el$
|
|
269
|
+
var _el$24 = _$getNextElement(_tmpl$8);
|
|
233
270
|
_$effect(_p$ => {
|
|
234
|
-
var _v$
|
|
235
|
-
_v$
|
|
236
|
-
_v$
|
|
237
|
-
_v$
|
|
271
|
+
var _v$5 = `k2b-data-table__sort-icon ti ${sort()?.key === col.id && sort()?.direction === "asc" ? "ti-arrow-up" : "ti-arrow-down"}`,
|
|
272
|
+
_v$6 = sort()?.key === col.id ? "true" : undefined;
|
|
273
|
+
_v$5 !== _p$.e && _$className(_el$24, _p$.e = _v$5);
|
|
274
|
+
_v$6 !== _p$.t && _$setAttribute(_el$24, "data-active", _p$.t = _v$6);
|
|
238
275
|
return _p$;
|
|
239
276
|
}, {
|
|
240
277
|
e: undefined,
|
|
241
278
|
t: undefined
|
|
242
279
|
});
|
|
243
|
-
return _el$
|
|
280
|
+
return _el$24;
|
|
244
281
|
})()];
|
|
245
282
|
}
|
|
246
283
|
}) : render()
|
|
247
|
-
})
|
|
284
|
+
}), _$createComponent(Show, {
|
|
285
|
+
get when() {
|
|
286
|
+
return shownRows().length < rows().length;
|
|
287
|
+
},
|
|
288
|
+
get children() {
|
|
289
|
+
var _el$23 = _$getNextElement(_tmpl$7);
|
|
290
|
+
_$insert(_el$23, () => chartMessages().chartRowsShown({
|
|
291
|
+
shown: new Intl.NumberFormat(locale()).format(shownRows().length),
|
|
292
|
+
total: new Intl.NumberFormat(locale()).format(rows().length)
|
|
293
|
+
}));
|
|
294
|
+
return _el$23;
|
|
295
|
+
}
|
|
296
|
+
})];
|
|
248
297
|
},
|
|
249
298
|
get children() {
|
|
250
|
-
return _$createComponent(ChartSnapshotView, {
|
|
299
|
+
return [_$createComponent(ChartSnapshotView, {
|
|
251
300
|
get cursor() {
|
|
252
301
|
return props.cursor;
|
|
253
302
|
},
|
|
@@ -258,10 +307,47 @@ export function ChartExplorer(props) {
|
|
|
258
307
|
return selected();
|
|
259
308
|
},
|
|
260
309
|
onSelect: select,
|
|
261
|
-
style
|
|
262
|
-
|
|
310
|
+
get style() {
|
|
311
|
+
return props.legend?.length ? undefined : {
|
|
312
|
+
height: "100%"
|
|
313
|
+
};
|
|
263
314
|
}
|
|
264
|
-
})
|
|
315
|
+
}), _$createComponent(Show, {
|
|
316
|
+
get when() {
|
|
317
|
+
return props.legend?.length;
|
|
318
|
+
},
|
|
319
|
+
get children() {
|
|
320
|
+
var _el$14 = _$getNextElement(_tmpl$3);
|
|
321
|
+
_$insert(_el$14, _$createComponent(For, {
|
|
322
|
+
get each() {
|
|
323
|
+
return props.legend;
|
|
324
|
+
},
|
|
325
|
+
children: entry => (() => {
|
|
326
|
+
var _el$25 = _$getNextElement(_tmpl$9),
|
|
327
|
+
_el$26 = _el$25.firstChild,
|
|
328
|
+
_el$27 = _el$26.nextSibling,
|
|
329
|
+
[_el$28, _co$8] = _$getNextMarker(_el$27.nextSibling);
|
|
330
|
+
_$insert(_el$25, () => entry.label, _el$28, _co$8);
|
|
331
|
+
_$effect(_p$ => {
|
|
332
|
+
var _v$7 = entry.style && entry.style !== "solid" ? entry.style : undefined,
|
|
333
|
+
_v$8 = entry.reference ? "true" : undefined,
|
|
334
|
+
_v$9 = `var(--stdlib-chart-c${Math.abs(Math.trunc(entry.color)) % 8 + 1})`;
|
|
335
|
+
_v$7 !== _p$.e && _$setAttribute(_el$26, "data-style", _p$.e = _v$7);
|
|
336
|
+
_v$8 !== _p$.t && _$setAttribute(_el$26, "data-reference", _p$.t = _v$8);
|
|
337
|
+
_v$9 !== _p$.a && _$setStyleProperty(_el$26, "--k2b-chart-legend-color", _p$.a = _v$9);
|
|
338
|
+
return _p$;
|
|
339
|
+
}, {
|
|
340
|
+
e: undefined,
|
|
341
|
+
t: undefined,
|
|
342
|
+
a: undefined
|
|
343
|
+
});
|
|
344
|
+
return _el$25;
|
|
345
|
+
})()
|
|
346
|
+
}));
|
|
347
|
+
_$effect(() => _$setAttribute(_el$14, "aria-label", chartMessages().chartLegend));
|
|
348
|
+
return _el$14;
|
|
349
|
+
}
|
|
350
|
+
})];
|
|
265
351
|
}
|
|
266
352
|
});
|
|
267
353
|
}
|
|
@@ -271,8 +357,8 @@ export function ChartExplorer(props) {
|
|
|
271
357
|
return props.renderDetails !== false;
|
|
272
358
|
},
|
|
273
359
|
get children() {
|
|
274
|
-
var _el$
|
|
275
|
-
_$insert(_el$
|
|
360
|
+
var _el$15 = _$getNextElement(_tmpl$4);
|
|
361
|
+
_$insert(_el$15, _$createComponent(Show, {
|
|
276
362
|
get when() {
|
|
277
363
|
return selectedRow();
|
|
278
364
|
},
|
|
@@ -280,12 +366,12 @@ export function ChartExplorer(props) {
|
|
|
280
366
|
"class": "k2b-chart-explorer__detail-paper",
|
|
281
367
|
get children() {
|
|
282
368
|
return [(() => {
|
|
283
|
-
var _el$
|
|
284
|
-
_el$
|
|
285
|
-
_el$
|
|
286
|
-
[_el$
|
|
287
|
-
_$insert(_el$
|
|
288
|
-
_$insert(_el$
|
|
369
|
+
var _el$29 = _$getNextElement(_tmpl$1),
|
|
370
|
+
_el$30 = _el$29.firstChild,
|
|
371
|
+
_el$32 = _el$30.nextSibling,
|
|
372
|
+
[_el$33, _co$9] = _$getNextMarker(_el$32.nextSibling);
|
|
373
|
+
_$insert(_el$30, () => chartMessages().chartSelectedDatum);
|
|
374
|
+
_$insert(_el$29, _$createComponent(IconButton, {
|
|
289
375
|
variant: "text",
|
|
290
376
|
size: "sm",
|
|
291
377
|
get label() {
|
|
@@ -293,10 +379,10 @@ export function ChartExplorer(props) {
|
|
|
293
379
|
},
|
|
294
380
|
onClick: () => select(null),
|
|
295
381
|
get children() {
|
|
296
|
-
return _$getNextElement(_tmpl$
|
|
382
|
+
return _$getNextElement(_tmpl$0);
|
|
297
383
|
}
|
|
298
|
-
}), _el$
|
|
299
|
-
return _el$
|
|
384
|
+
}), _el$33, _co$9);
|
|
385
|
+
return _el$29;
|
|
300
386
|
})(), _$memo(() => _$memo(() => !!props.renderDetails)() ? props.renderDetails(row()) : _$createComponent(DescriptionList, {
|
|
301
387
|
columns: 3,
|
|
302
388
|
size: "sm",
|
|
@@ -310,18 +396,24 @@ export function ChartExplorer(props) {
|
|
|
310
396
|
}
|
|
311
397
|
})
|
|
312
398
|
}));
|
|
313
|
-
return _el$
|
|
399
|
+
return _el$15;
|
|
314
400
|
}
|
|
315
|
-
}), _el$
|
|
401
|
+
}), _el$21, _co$7);
|
|
316
402
|
_$effect(_p$ => {
|
|
317
403
|
var _v$ = `k2b-chart-explorer ${props.class ?? ""}`,
|
|
318
|
-
_v$2 = props.
|
|
404
|
+
_v$2 = view() === "chart" && props.legend?.length && data().rows.length > 0 ? "true" : undefined,
|
|
405
|
+
_v$3 = view() === "table" && shownRows().length < rows().length ? "true" : undefined,
|
|
406
|
+
_v$4 = props.height ?? "18rem";
|
|
319
407
|
_v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
|
|
320
|
-
_v$2 !== _p$.t && _$
|
|
408
|
+
_v$2 !== _p$.t && _$setAttribute(_el$13, "data-legend", _p$.t = _v$2);
|
|
409
|
+
_v$3 !== _p$.a && _$setAttribute(_el$13, "data-capped", _p$.a = _v$3);
|
|
410
|
+
_v$4 !== _p$.o && _$setStyleProperty(_el$13, "height", _p$.o = _v$4);
|
|
321
411
|
return _p$;
|
|
322
412
|
}, {
|
|
323
413
|
e: undefined,
|
|
324
|
-
t: undefined
|
|
414
|
+
t: undefined,
|
|
415
|
+
a: undefined,
|
|
416
|
+
o: undefined
|
|
325
417
|
});
|
|
326
418
|
return _el$;
|
|
327
419
|
})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/ChartExplorer.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, createUniqueId, type JSX, Show } from \"solid-js\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { CopyButton } from \"../actions/CopyButton\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { DescriptionList } from \"../surfaces/DescriptionList\";\nimport { Paper } from \"../surfaces/Paper\";\nimport { ChartSnapshotView } from \"./ChartSnapshotView\";\nimport type { ChartCursor } from \"./chart-cursor\";\nimport { type ChartExplorerData, type ChartExplorerRow, validateChartExplorerData } from \"./chart-explorer\";\nimport { useChartMessages } from \"./chart-messages\";\nimport DataTable, { type DataTableSort } from \"./DataTable\";\n\nexport type ChartExplorerColumn<T> = {\n id: string;\n label: string;\n value: (row: T) => string;\n /** Optional table cell presentation; value remains the plain text used for copy/details. */\n render?: (row: T) => JSX.Element;\n /** Explicit comparable value. Omit to leave the column unsortable. */\n sortValue?: (row: T) => string | number | null;\n align?: \"left\" | \"center\" | \"right\";\n};\nexport type ChartExplorerProps<T extends ChartExplorerRow> = {\n cursor?: ChartCursor;\n title: string;\n description?: JSX.Element;\n data: ChartExplorerData<T>;\n columns: readonly ChartExplorerColumn<T>[];\n view?: \"chart\" | \"table\";\n defaultView?: \"chart\" | \"table\";\n onViewChange?: (view: \"chart\" | \"table\") => void;\n sort?: DataTableSort | null;\n defaultSort?: DataTableSort | null;\n onSortChange?: (sort: DataTableSort | null) => void;\n selectedKey?: string | null;\n onSelectedKeyChange?: (key: string | null) => void;\n /** false hides the complete local detail area for a shared selection panel. */\n renderDetails?: false | ((row: T) => JSX.Element);\n height?: string;\n class?: string;\n};\n\nconst tsvCell = (value: string) => (/[\\t\\r\\n\"]/.test(value) ? `\"${value.replaceAll('\"', '\"\"')}\"` : value);\n\nexport function ChartExplorer<T extends ChartExplorerRow>(props: ChartExplorerProps<T>) {\n const messages = useUiMessages();\n const chartMessages = useChartMessages();\n const locale = useLocale();\n const id = `k2b-chart-explorer-${createUniqueId()}`;\n const data = () => props.data;\n const [copyFailed, setCopyFailed] = createSignal(false);\n const [localSelection, setLocalSelection] = createSignal<string | null>(null);\n const [localView, setLocalView] = createSignal(props.defaultView ?? \"chart\");\n const [localSort, setLocalSort] = createSignal<DataTableSort | null>(props.defaultSort ?? null);\n const view = () => props.view ?? localView();\n const sort = () => (props.sort === undefined ? localSort() : props.sort);\n const setView = (value: \"chart\" | \"table\") => {\n if (props.view === undefined) setLocalView(value);\n props.onViewChange?.(value);\n };\n const setSort = (value: DataTableSort | null) => {\n if (props.sort === undefined) setLocalSort(value);\n props.onSortChange?.(value);\n };\n const rowsByKey = createMemo(() => new Map(data().rows.map((row) => [row.key, row])));\n const rawSelected = () => (props.selectedKey !== undefined ? props.selectedKey : localSelection());\n const selected = () => (rowsByKey().has(rawSelected() ?? \"\") ? rawSelected() : null);\n const selectedRow = () => rowsByKey().get(selected() ?? \"\");\n const select = (key: string | null) => {\n if (key !== null && !rowsByKey().has(key)) return;\n setLocalSelection(key);\n props.onSelectedKeyChange?.(key);\n };\n if (\n !props.columns.length ||\n props.columns.some((column) => !column.id) ||\n new Set(props.columns.map((column) => column.id)).size !== props.columns.length\n ) {\n throw new Error(\"Chart columns require unique nonempty IDs and at least one column\");\n }\n validateChartExplorerData(data());\n createEffect(() => validateChartExplorerData(data()));\n createEffect(() => {\n if (props.selectedKey === undefined && rawSelected() !== null && selected() === null) select(null);\n });\n const rows = createMemo(() => {\n const result = [...data().rows];\n const order = sort();\n const column = props.columns.find((c) => c.id === order?.key);\n const value = column?.sortValue;\n if (!order || !value) return result;\n const collator = new Intl.Collator(locale(), { numeric: true });\n return result.sort((a, b) => {\n const av = value(a),\n bv = value(b);\n if (av === null) return bv === null ? 0 : 1;\n if (bv === null) return -1;\n const comparison = typeof av === \"number\" && typeof bv === \"number\" ? av - bv : collator.compare(String(av), String(bv));\n return order.direction === \"asc\" ? comparison : -comparison;\n });\n });\n const copyText = () =>\n [\n props.columns.map((c) => tsvCell(c.label)).join(\"\\t\"),\n ...rows().map((row) => props.columns.map((c) => tsvCell(c.value(row))).join(\"\\t\")),\n ].join(\"\\n\");\n return (\n <section class={`k2b-chart-explorer ${props.class ?? \"\"}`} aria-labelledby={id}>\n <header class=\"k2b-chart-explorer__header\">\n <div>\n <h3 id={id}>{props.title}</h3>\n <Show when={props.description}>\n <div>{props.description}</div>\n </Show>\n </div>\n <div class=\"k2b-chart-explorer__actions\">\n <CopyButton\n text={copyText()}\n label={chartMessages().chartCopyData}\n iconOnly\n size=\"sm\"\n variant=\"ghost\"\n disabled={!rows().length}\n onCopyError={() => setCopyFailed(true)}\n onCopied={() => setCopyFailed(false)}\n />\n <SelectChip<\"chart\" | \"table\">\n value={view()}\n onValueChange={setView}\n aria-label={chartMessages().chartView}\n options={[\n { value: \"chart\", label: chartMessages().chartDiagram },\n { value: \"table\", label: chartMessages().chartData },\n ]}\n />\n </div>\n </header>\n <Show when={copyFailed()}>\n <span role=\"alert\">{chartMessages().chartCopyFailed}</span>\n </Show>\n <div class=\"k2b-chart-explorer__viewport\" style={{ height: props.height ?? \"18rem\" }}>\n <Show when={data().rows.length > 0} fallback={<div class=\"k2b-chart__empty\">{messages().noData}</div>}>\n <Show\n when={view() === \"chart\"}\n fallback={\n <DataTable\n rows={rows()}\n columns={props.columns.map((column) => ({\n id: column.id,\n header: column.label,\n value: column.value,\n align: column.align,\n sortable: Boolean(column.sortValue),\n }))}\n ariaLabelledBy={id}\n getRowId={(row) => row.key}\n selectedRowId={selected()}\n sort={sort()}\n fillHeight\n surface=\"paper\"\n onRowClick={(row) => select(row.key)}\n renderCell={({ row, col, value, render }) => {\n const custom = props.columns.find((column) => column.id === col.id)?.render;\n const cell = () => (custom ? custom(row) : render(value));\n return col.id === props.columns[0]?.id ? (\n <Button variant=\"text\" size=\"sm\" onClick={() => select(row.key)}>\n {cell()}\n </Button>\n ) : (\n cell()\n );\n }}\n renderHeader={({ col, render }) =>\n col.sortable ? (\n <Button\n variant=\"text\"\n size=\"sm\"\n onClick={() =>\n setSort({\n key: col.id,\n direction: sort()?.key === col.id && sort()?.direction === \"asc\" ? \"desc\" : \"asc\",\n })\n }\n >\n {props.columns.find((column) => column.id === col.id)?.label}\n {/* The data table's own marker: inactive columns keep a dimmed arrow so the header reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${sort()?.key === col.id && sort()?.direction === \"asc\" ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={sort()?.key === col.id ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </Button>\n ) : (\n render()\n )\n }\n />\n }\n >\n <ChartSnapshotView\n cursor={props.cursor}\n snapshot={data().chart}\n selectedKey={selected()}\n onSelect={select}\n style={{ height: \"100%\" }}\n />\n </Show>\n </Show>\n </div>\n <Show when={props.renderDetails !== false}>\n <div class=\"k2b-chart-explorer__details\" aria-live=\"polite\">\n <Show when={selectedRow()}>\n {(row) => (\n <Paper class=\"k2b-chart-explorer__detail-paper\">\n <div class=\"k2b-chart-explorer__detail-header\">\n <span>{chartMessages().chartSelectedDatum}</span>\n <IconButton variant=\"text\" size=\"sm\" label={messages().clearSelection} onClick={() => select(null)}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n {props.renderDetails ? (\n props.renderDetails(row())\n ) : (\n <DescriptionList\n columns={3}\n size=\"sm\"\n items={props.columns.map((column) => ({\n term: column.label,\n description: column.value(row()),\n }))}\n />\n )}\n </Paper>\n )}\n </Show>\n </div>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/ChartExplorer.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, Show } from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { CopyButton } from \"../actions/CopyButton\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { DescriptionList } from \"../surfaces/DescriptionList\";\nimport { Paper } from \"../surfaces/Paper\";\nimport { ChartSnapshotView } from \"./ChartSnapshotView\";\nimport type { ChartCursor } from \"./chart-cursor\";\nimport { type ChartExplorerData, type ChartExplorerRow, validateChartExplorerData } from \"./chart-explorer\";\nimport { useChartMessages } from \"./chart-messages\";\nimport DataTable, { type DataTableSort } from \"./DataTable\";\n\nexport type ChartExplorerColumn<T> = {\n id: string;\n label: string;\n value: (row: T) => string;\n /** Optional table cell presentation; value remains the plain text used for copy/details. */\n render?: (row: T) => JSX.Element;\n /**\n * Explicit comparable value. Omit to leave the column unsortable.\n * Returning a number also exempts the cell from spreadsheet formula guarding on copy.\n */\n sortValue?: (row: T) => string | number | null;\n align?: \"left\" | \"center\" | \"right\";\n};\n/** One legend entry; `color` is the palette index the renderer gave the series (0 is `--stdlib-chart-c1`). */\nexport type ChartLegendEntry = {\n label: string;\n color: number;\n /** Line pattern of a line series; a solid series shows a filled swatch. */\n style?: \"solid\" | \"dashed\" | \"dotted\";\n /** A comparison series, drawn hollow like its marks. */\n reference?: boolean;\n};\nexport type ChartExplorerProps<T extends ChartExplorerRow> = {\n cursor?: ChartCursor;\n title: string;\n /** Level of the title heading. Defaults to 3; a chart inside a titled group of charts sits one level below it. */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n description?: JSX.Element;\n data: ChartExplorerData<T>;\n columns: readonly ChartExplorerColumn<T>[];\n view?: \"chart\" | \"table\";\n defaultView?: \"chart\" | \"table\";\n onViewChange?: (view: \"chart\" | \"table\") => void;\n /**\n * Several charts of the same rows. The switcher then lists each chart and the table; `chart` names the one `data`\n * holds, and `onChartChange` reports a pick, so the owner passes the matching data.\n */\n charts?: readonly { id: string; label: string }[];\n chart?: string;\n onChartChange?: (id: string) => void;\n /** Filter controls between the header and the viewport, such as ChartFilterControls. */\n controls?: JSX.Element;\n /** The table renders at most this many rows of the sorted order; sorting and Copy data use every row. */\n tableRows?: number;\n sort?: DataTableSort | null;\n defaultSort?: DataTableSort | null;\n onSortChange?: (sort: DataTableSort | null) => void;\n selectedKey?: string | null;\n onSelectedKeyChange?: (key: string | null) => void;\n /** false hides the complete local detail area for a shared selection panel. */\n renderDetails?: false | ((row: T) => JSX.Element);\n height?: string;\n /**\n * Series names below the chart, wrapping inside the fixed viewport height. Use it instead of the renderer's legend,\n * which draws in one row and runs out of narrow columns.\n */\n legend?: readonly ChartLegendEntry[];\n /** What the viewport shows without rows, for example while they load; defaults to \"No data\". */\n empty?: JSX.Element;\n class?: string;\n};\n\nconst tsvCell = (value: string, numeric = false) => {\n const safe = !numeric && /^[=+\\-@\\t\\r]/.test(value) ? `'${value}` : value;\n return /[\\t\\r\\n\"]/.test(safe) ? `\"${safe.replaceAll('\"', '\"\"')}\"` : safe;\n};\n\nexport function ChartExplorer<T extends ChartExplorerRow>(props: ChartExplorerProps<T>) {\n const messages = useUiMessages();\n const chartMessages = useChartMessages();\n const locale = useLocale();\n const id = `k2b-chart-explorer-${createUniqueId()}`;\n const data = () => props.data;\n const [copyFailed, setCopyFailed] = createSignal(false);\n const [localSelection, setLocalSelection] = createSignal<string | null>(null);\n const [localView, setLocalView] = createSignal(props.defaultView ?? \"chart\");\n const [localSort, setLocalSort] = createSignal<DataTableSort | null>(props.defaultSort ?? null);\n const view = () => props.view ?? localView();\n const sort = () => (props.sort === undefined ? localSort() : props.sort);\n const setView = (value: \"chart\" | \"table\") => {\n if (props.view === undefined) setLocalView(value);\n props.onViewChange?.(value);\n };\n const setSort = (value: DataTableSort | null) => {\n if (props.sort === undefined) setLocalSort(value);\n props.onSortChange?.(value);\n };\n const rowsByKey = createMemo(() => new Map(data().rows.map((row) => [row.key, row])));\n const rawSelected = () => (props.selectedKey !== undefined ? props.selectedKey : localSelection());\n const selected = () => (rowsByKey().has(rawSelected() ?? \"\") ? rawSelected() : null);\n const selectedRow = () => rowsByKey().get(selected() ?? \"\");\n const select = (key: string | null) => {\n if (key !== null && !rowsByKey().has(key)) return;\n setLocalSelection(key);\n props.onSelectedKeyChange?.(key);\n };\n if (\n !props.columns.length ||\n props.columns.some((column) => !column.id) ||\n new Set(props.columns.map((column) => column.id)).size !== props.columns.length\n ) {\n throw new Error(\"Chart columns require unique nonempty IDs and at least one column\");\n }\n validateChartExplorerData(data());\n createEffect(() => validateChartExplorerData(data()));\n createEffect(() => {\n if (props.selectedKey === undefined && rawSelected() !== null && selected() === null) select(null);\n });\n const rows = createMemo(() => {\n const result = [...data().rows];\n const order = sort();\n const column = props.columns.find((c) => c.id === order?.key);\n const value = column?.sortValue;\n if (!order || !value) return result;\n const collator = new Intl.Collator(locale(), { numeric: true });\n return result.sort((a, b) => {\n const av = value(a),\n bv = value(b);\n if (av === null) return bv === null ? 0 : 1;\n if (bv === null) return -1;\n const comparison = typeof av === \"number\" && typeof bv === \"number\" ? av - bv : collator.compare(String(av), String(bv));\n return order.direction === \"asc\" ? comparison : -comparison;\n });\n });\n const shownRows = () => (props.tableRows === undefined ? rows() : rows().slice(0, props.tableRows));\n // Chart ids are data; a prefix keeps one named \"table\" apart from the table entry.\n const switcherValue = () => (view() === \"table\" || !props.charts?.length ? view() : `chart:${props.chart ?? props.charts[0]?.id}`);\n const switcherOptions = () =>\n props.charts?.length\n ? [\n ...props.charts.map((chart) => ({ value: `chart:${chart.id}`, label: chart.label })),\n { value: \"table\", label: chartMessages().chartData },\n ]\n : [\n { value: \"chart\", label: chartMessages().chartDiagram },\n { value: \"table\", label: chartMessages().chartData },\n ];\n const pick = (value: string) => {\n if (value === \"table\" || value === \"chart\") return setView(value);\n setView(\"chart\");\n props.onChartChange?.(value.slice(\"chart:\".length));\n };\n const copyText = () =>\n [\n props.columns.map((c) => tsvCell(c.label)).join(\"\\t\"),\n ...rows().map((row) => props.columns.map((c) => tsvCell(c.value(row), typeof c.sortValue?.(row) === \"number\")).join(\"\\t\")),\n ].join(\"\\n\");\n return (\n <section class={`k2b-chart-explorer ${props.class ?? \"\"}`} aria-labelledby={id}>\n <header class=\"k2b-chart-explorer__header\">\n <div>\n <Dynamic component={`h${props.headingLevel ?? 3}`} id={id} class=\"k2b-chart-explorer__title\">\n {props.title}\n </Dynamic>\n <Show when={props.description}>\n <div>{props.description}</div>\n </Show>\n </div>\n <div class=\"k2b-chart-explorer__actions\">\n <CopyButton\n text={copyText()}\n label={chartMessages().chartCopyData}\n iconOnly\n size=\"sm\"\n variant=\"ghost\"\n disabled={!rows().length}\n onCopyError={() => setCopyFailed(true)}\n onCopied={() => setCopyFailed(false)}\n />\n <SelectChip<string>\n value={switcherValue()}\n onValueChange={pick}\n aria-label={chartMessages().chartView}\n options={switcherOptions()}\n />\n </div>\n </header>\n <Show when={copyFailed()}>\n <span role=\"alert\">{chartMessages().chartCopyFailed}</span>\n </Show>\n {props.controls}\n <div\n class=\"k2b-chart-explorer__viewport\"\n data-legend={view() === \"chart\" && props.legend?.length && data().rows.length > 0 ? \"true\" : undefined}\n data-capped={view() === \"table\" && shownRows().length < rows().length ? \"true\" : undefined}\n style={{ height: props.height ?? \"18rem\" }}\n >\n <Show when={data().rows.length > 0} fallback={<div class=\"k2b-chart__empty\">{props.empty ?? messages().noData}</div>}>\n <Show\n when={view() === \"chart\"}\n fallback={\n <>\n <DataTable\n rows={shownRows()}\n columns={props.columns.map((column) => ({\n id: column.id,\n header: column.label,\n value: column.value,\n align: column.align,\n sortable: Boolean(column.sortValue),\n }))}\n ariaLabelledBy={id}\n getRowId={(row) => row.key}\n selectedRowId={selected()}\n sort={sort()}\n fillHeight\n surface=\"paper\"\n onRowClick={(row) => select(row.key)}\n renderCell={({ row, col, value, render }) => {\n const custom = props.columns.find((column) => column.id === col.id)?.render;\n const cell = () => (custom ? custom(row) : render(value));\n return !custom && col.id === props.columns[0]?.id ? (\n <Button variant=\"text\" size=\"sm\" onClick={() => select(row.key)}>\n {cell()}\n </Button>\n ) : (\n cell()\n );\n }}\n renderHeader={({ col, render }) =>\n col.sortable ? (\n <Button\n variant=\"text\"\n size=\"sm\"\n onClick={() =>\n setSort({\n key: col.id,\n direction: sort()?.key === col.id && sort()?.direction === \"asc\" ? \"desc\" : \"asc\",\n })\n }\n >\n {props.columns.find((column) => column.id === col.id)?.label}\n {/* The data table's own marker: inactive columns keep a dimmed arrow so the header reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${sort()?.key === col.id && sort()?.direction === \"asc\" ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={sort()?.key === col.id ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </Button>\n ) : (\n render()\n )\n }\n />\n <Show when={shownRows().length < rows().length}>\n <p class=\"k2b-chart-explorer__note\">\n {chartMessages().chartRowsShown({\n shown: new Intl.NumberFormat(locale()).format(shownRows().length),\n total: new Intl.NumberFormat(locale()).format(rows().length),\n })}\n </p>\n </Show>\n </>\n }\n >\n <ChartSnapshotView\n cursor={props.cursor}\n snapshot={data().chart}\n selectedKey={selected()}\n onSelect={select}\n style={props.legend?.length ? undefined : { height: \"100%\" }}\n />\n <Show when={props.legend?.length}>\n <ul class=\"k2b-chart-legend\" aria-label={chartMessages().chartLegend}>\n <For each={props.legend}>\n {(entry) => (\n <li>\n <span\n class=\"k2b-chart-legend__swatch\"\n data-style={entry.style && entry.style !== \"solid\" ? entry.style : undefined}\n data-reference={entry.reference ? \"true\" : undefined}\n style={{ \"--k2b-chart-legend-color\": `var(--stdlib-chart-c${(Math.abs(Math.trunc(entry.color)) % 8) + 1})` }}\n aria-hidden=\"true\"\n />\n {entry.label}\n </li>\n )}\n </For>\n </ul>\n </Show>\n </Show>\n </Show>\n </div>\n <Show when={props.renderDetails !== false}>\n <div class=\"k2b-chart-explorer__details\" aria-live=\"polite\">\n <Show when={selectedRow()}>\n {(row) => (\n <Paper class=\"k2b-chart-explorer__detail-paper\">\n <div class=\"k2b-chart-explorer__detail-header\">\n <span>{chartMessages().chartSelectedDatum}</span>\n <IconButton variant=\"text\" size=\"sm\" label={messages().clearSelection} onClick={() => select(null)}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n {props.renderDetails ? (\n props.renderDetails(row())\n ) : (\n <DescriptionList\n columns={3}\n size=\"sm\"\n items={props.columns.map((column) => ({\n term: column.label,\n description: column.value(row()),\n }))}\n />\n )}\n </Paper>\n )}\n </Show>\n </div>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|