@k2b/ui 0.29.0 → 0.31.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/README.md +2 -2
- package/dist/base.css +2 -2
- package/dist/browser/actions/Dropdown.js +6 -3
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/FilterChip.js +137 -7
- package/dist/browser/actions/FilterChip.js.map +1 -1
- package/dist/browser/actions/SegmentedControl.js +5 -9
- package/dist/browser/actions/SegmentedControl.js.map +1 -1
- package/dist/browser/actions/SpotlightSearch.js +6 -3
- package/dist/browser/actions/SpotlightSearch.js.map +1 -1
- package/dist/browser/actions/Tabs.js +5 -2
- package/dist/browser/actions/Tabs.js.map +1 -1
- package/dist/browser/actions/Toolbar.js +2 -0
- package/dist/browser/actions/Toolbar.js.map +1 -1
- package/dist/browser/actions/ViewTabs.js +294 -0
- package/dist/browser/actions/ViewTabs.js.map +1 -0
- package/dist/browser/actions/filter-messages.js +6 -2
- package/dist/browser/actions/filter-messages.js.map +1 -1
- package/dist/browser/actions/index.js +2 -1
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/chat/ChatComposer.js +1108 -604
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatDecision.js +146 -84
- package/dist/browser/chat/ChatDecision.js.map +1 -1
- package/dist/browser/chat/ChatPrimitives.js +292 -159
- package/dist/browser/chat/ChatPrimitives.js.map +1 -1
- package/dist/browser/chat/chat-messages.js +8 -0
- package/dist/browser/chat/chat-messages.js.map +1 -1
- package/dist/browser/chat/command-search.js +26 -15
- package/dist/browser/chat/command-search.js.map +1 -1
- package/dist/browser/chat/index.js +4 -2
- package/dist/browser/chat/index.js.map +1 -1
- package/dist/browser/content/Calendar.js +143 -116
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/CalendarWeekView.js +291 -266
- package/dist/browser/content/CalendarWeekView.js.map +1 -1
- package/dist/browser/content/DataTable.js +224 -155
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/MapAttribution.js +27 -0
- package/dist/browser/content/MapAttribution.js.map +1 -0
- package/dist/browser/content/MapView.js +553 -0
- package/dist/browser/content/MapView.js.map +1 -0
- package/dist/browser/content/MapViewFrame.js +395 -0
- package/dist/browser/content/MapViewFrame.js.map +1 -0
- package/dist/browser/content/data-table-messages.js +4 -2
- package/dist/browser/content/data-table-messages.js.map +1 -1
- package/dist/browser/content/index.js +5 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/content/map-palette.js +39 -0
- package/dist/browser/content/map-palette.js.map +1 -0
- package/dist/browser/content/map-style.js +276 -0
- package/dist/browser/content/map-style.js.map +1 -0
- package/dist/browser/content/map-view-geometry.js +269 -0
- package/dist/browser/content/map-view-geometry.js.map +1 -0
- package/dist/browser/content/map-view-live.js +28 -0
- package/dist/browser/content/map-view-live.js.map +1 -0
- package/dist/browser/content/map-view-messages.js +53 -0
- package/dist/browser/content/map-view-messages.js.map +1 -0
- package/dist/browser/content/map-view-types.js +2 -0
- package/dist/browser/content/map-view-types.js.map +1 -0
- package/dist/browser/content/map-view-worker.js +10 -0
- package/dist/browser/feedback/MovedHint.js +197 -0
- package/dist/browser/feedback/MovedHint.js.map +1 -0
- package/dist/browser/feedback/dialog-core.js +85 -9
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/feedback/index.js +1 -0
- package/dist/browser/feedback/index.js.map +1 -1
- package/dist/browser/feedback/prompts.js +6 -1
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +337 -212
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/date-picker.js +59 -5
- package/dist/browser/inputs/date-picker.js.map +1 -1
- package/dist/browser/intl/messages.js +12 -0
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/intl/weekend.js +39 -0
- package/dist/browser/intl/weekend.js.map +1 -0
- package/dist/browser/layout/AppOverview.js +0 -1
- package/dist/browser/layout/AppOverview.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +701 -476
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/PageTitle.js +3 -2
- package/dist/browser/layout/PageTitle.js.map +1 -1
- package/dist/browser/layout/SettingsModal.js +2 -2
- package/dist/browser/layout/SettingsModal.js.map +1 -1
- package/dist/browser/layout/SidebarSwitcher.js +13 -12
- package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
- package/dist/browser/layout/TabBar.js +1 -1
- package/dist/browser/layout/TabBar.js.map +1 -1
- package/dist/browser/layout/app-host-width.js +44 -0
- package/dist/browser/layout/app-host-width.js.map +1 -0
- package/dist/browser/layout/app-workspace-controller.js +331 -45
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/app-workspace-width.js +26 -0
- package/dist/browser/layout/app-workspace-width.js.map +1 -0
- package/dist/browser/layout/index.js +2 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/surfaces/Placeholder.js +36 -13
- package/dist/browser/surfaces/Placeholder.js.map +1 -1
- package/dist/licenses/maplibre-gl.txt +116 -0
- package/dist/ssr/actions/Dropdown.js +5 -2
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/FilterChip.js +59 -7
- package/dist/ssr/actions/FilterChip.js.map +1 -1
- package/dist/ssr/actions/SegmentedControl.js +1 -2
- package/dist/ssr/actions/SegmentedControl.js.map +1 -1
- package/dist/ssr/actions/SpotlightSearch.js +2 -2
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
- package/dist/ssr/actions/Tabs.js +2 -2
- package/dist/ssr/actions/Tabs.js.map +1 -1
- package/dist/ssr/actions/Toolbar.js +2 -0
- package/dist/ssr/actions/Toolbar.js.map +1 -1
- package/dist/ssr/actions/ViewTabs.js +211 -0
- package/dist/ssr/actions/ViewTabs.js.map +1 -0
- package/dist/ssr/actions/filter-messages.js +6 -2
- package/dist/ssr/actions/filter-messages.js.map +1 -1
- package/dist/ssr/actions/index.js +2 -1
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/chat/ChatComposer.js +546 -131
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatDecision.js +44 -19
- package/dist/ssr/chat/ChatDecision.js.map +1 -1
- package/dist/ssr/chat/ChatPrimitives.js +95 -24
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
- package/dist/ssr/chat/chat-messages.js +8 -0
- package/dist/ssr/chat/chat-messages.js.map +1 -1
- package/dist/ssr/chat/command-search.js +26 -15
- package/dist/ssr/chat/command-search.js.map +1 -1
- package/dist/ssr/chat/index.js +4 -2
- package/dist/ssr/chat/index.js.map +1 -1
- package/dist/ssr/content/Calendar.js +109 -100
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/CalendarWeekView.js +42 -28
- package/dist/ssr/content/CalendarWeekView.js.map +1 -1
- package/dist/ssr/content/DataTable.js +78 -31
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/MapAttribution.js +19 -0
- package/dist/ssr/content/MapAttribution.js.map +1 -0
- package/dist/ssr/content/MapView.js +474 -0
- package/dist/ssr/content/MapView.js.map +1 -0
- package/dist/ssr/content/MapViewFrame.js +193 -0
- package/dist/ssr/content/MapViewFrame.js.map +1 -0
- package/dist/ssr/content/data-table-messages.js +4 -2
- package/dist/ssr/content/data-table-messages.js.map +1 -1
- package/dist/ssr/content/index.js +5 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/content/map-palette.js +39 -0
- package/dist/ssr/content/map-palette.js.map +1 -0
- package/dist/ssr/content/map-style.js +276 -0
- package/dist/ssr/content/map-style.js.map +1 -0
- package/dist/ssr/content/map-view-geometry.js +269 -0
- package/dist/ssr/content/map-view-geometry.js.map +1 -0
- package/dist/ssr/content/map-view-live.js +1 -0
- package/dist/ssr/content/map-view-messages.js +53 -0
- package/dist/ssr/content/map-view-messages.js.map +1 -0
- package/dist/ssr/content/map-view-types.js +2 -0
- package/dist/ssr/content/map-view-types.js.map +1 -0
- package/dist/ssr/feedback/MovedHint.js +166 -0
- package/dist/ssr/feedback/MovedHint.js.map +1 -0
- package/dist/ssr/feedback/dialog-core.js +85 -9
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/feedback/index.js +1 -0
- package/dist/ssr/feedback/index.js.map +1 -1
- package/dist/ssr/feedback/prompts.js +6 -1
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +138 -69
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/date-picker.js +59 -5
- package/dist/ssr/inputs/date-picker.js.map +1 -1
- package/dist/ssr/intl/messages.js +12 -0
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/intl/weekend.js +39 -0
- package/dist/ssr/intl/weekend.js.map +1 -0
- package/dist/ssr/layout/AppOverview.js +0 -1
- package/dist/ssr/layout/AppOverview.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +216 -44
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/PageTitle.js +3 -2
- package/dist/ssr/layout/PageTitle.js.map +1 -1
- package/dist/ssr/layout/SettingsModal.js +2 -2
- package/dist/ssr/layout/SettingsModal.js.map +1 -1
- package/dist/ssr/layout/SidebarSwitcher.js +13 -12
- package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
- package/dist/ssr/layout/TabBar.js +1 -1
- package/dist/ssr/layout/TabBar.js.map +1 -1
- package/dist/ssr/layout/app-host-width.js +44 -0
- package/dist/ssr/layout/app-host-width.js.map +1 -0
- package/dist/ssr/layout/app-workspace-controller.js +331 -45
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/app-workspace-width.js +26 -0
- package/dist/ssr/layout/app-workspace-width.js.map +1 -0
- package/dist/ssr/layout/index.js +2 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/surfaces/Placeholder.js +24 -7
- package/dist/ssr/surfaces/Placeholder.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/Dropdown.d.ts +4 -0
- package/dist/types/actions/FilterChip.d.ts +22 -0
- package/dist/types/actions/ViewTabs.d.ts +30 -0
- package/dist/types/actions/filter-messages.d.ts +2 -0
- package/dist/types/actions/index.d.ts +4 -2
- package/dist/types/chat/ChatComposer.d.ts +52 -0
- package/dist/types/chat/ChatDecision.d.ts +18 -2
- package/dist/types/chat/ChatPrimitives.d.ts +10 -0
- package/dist/types/chat/chat-messages.d.ts +4 -0
- package/dist/types/chat/command-search.d.ts +2 -0
- package/dist/types/chat/index.d.ts +9 -8
- package/dist/types/content/DataTable.d.ts +3 -0
- package/dist/types/content/MapAttribution.d.ts +6 -0
- package/dist/types/content/MapView.d.ts +5 -0
- package/dist/types/content/MapViewFrame.d.ts +31 -0
- package/dist/types/content/data-table-messages.d.ts +1 -0
- package/dist/types/content/index.d.ts +6 -0
- package/dist/types/content/map-palette.d.ts +58 -0
- package/dist/types/content/map-style.d.ts +29 -0
- package/dist/types/content/map-view-geometry.d.ts +55 -0
- package/dist/types/content/map-view-live.d.ts +2 -0
- package/dist/types/content/map-view-messages.d.ts +21 -0
- package/dist/types/content/map-view-types.d.ts +61 -0
- package/dist/types/feedback/MovedHint.d.ts +25 -0
- package/dist/types/feedback/dialog-core.d.ts +6 -2
- package/dist/types/feedback/index.d.ts +2 -0
- package/dist/types/feedback/prompts.d.ts +2 -0
- package/dist/types/inputs/DatePicker.d.ts +7 -0
- package/dist/types/inputs/date-picker.d.ts +25 -1
- package/dist/types/intl/messages.d.ts +6 -0
- package/dist/types/intl/weekend.d.ts +12 -0
- package/dist/types/layout/AppWorkspace.d.ts +48 -8
- package/dist/types/layout/app-host-width.d.ts +6 -0
- package/dist/types/layout/app-workspace-width.d.ts +13 -0
- package/dist/types/layout/index.d.ts +3 -2
- package/dist/types/surfaces/Placeholder.d.ts +2 -1
- package/map-glyphs/IBM Plex Sans Medium/0-255.pbf +0 -0
- package/map-glyphs/IBM Plex Sans Medium/1024-1279.pbf +0 -0
- package/map-glyphs/IBM Plex Sans Medium/256-511.pbf +0 -0
- package/map-glyphs/IBM Plex Sans Medium/512-767.pbf +0 -0
- package/map-glyphs/IBM Plex Sans Medium/768-1023.pbf +0 -0
- package/map-glyphs/IBM Plex Sans Medium/7680-7935.pbf +0 -0
- package/map-glyphs/IBM Plex Sans Medium/8192-8447.pbf +0 -0
- package/map-glyphs/IBM Plex Sans Medium/8448-8703.pbf +0 -0
- package/map-glyphs/IBM Plex Sans Medium/8704-8959.pbf +0 -0
- package/map-glyphs/OFL.txt +93 -0
- package/package.json +11 -6
|
@@ -10,21 +10,25 @@ var _tmpl$ = ["<span class=\"k2b-data-table__header-title\">", "</span>"],
|
|
|
10
10
|
_tmpl$4 = ["<a", " class=\"k2b-data-table__header-content k2b-data-table__sort\"", ">", "</a>"],
|
|
11
11
|
_tmpl$5 = ["<button type=\"button\" class=\"k2b-data-table__header-content k2b-data-table__sort\"", ">", "</button>"],
|
|
12
12
|
_tmpl$6 = ["<div class=\"k2b-data-table__header-content\"", ">", "</div>"],
|
|
13
|
-
_tmpl$7 = ["<
|
|
14
|
-
_tmpl$8 = "<
|
|
15
|
-
_tmpl$9 =
|
|
16
|
-
_tmpl$0 = ["<
|
|
17
|
-
_tmpl$1 = ["<
|
|
18
|
-
_tmpl$10 = ["<tr class=\"
|
|
19
|
-
_tmpl$11 = ["<
|
|
20
|
-
_tmpl$12 = ["<
|
|
21
|
-
_tmpl$13 = ["<
|
|
22
|
-
_tmpl$14 = ["<
|
|
23
|
-
_tmpl$15 = ["<
|
|
24
|
-
_tmpl$16 = ["<
|
|
25
|
-
_tmpl$17 = ["<
|
|
26
|
-
|
|
13
|
+
_tmpl$7 = ["<caption class=\"k2b-sr-only\">", "</caption>"],
|
|
14
|
+
_tmpl$8 = ["<tr aria-hidden=\"true\"><td class=\"k2b-data-table__fill\"", "></td></tr>"],
|
|
15
|
+
_tmpl$9 = "<div class=\"k2b-data-table__sentinel\" aria-hidden=\"true\"></div>",
|
|
16
|
+
_tmpl$0 = ["<div role=\"region\"", " tabindex=\"0\" class=\"", "\"", "><table", ">", "<thead class=\"k2b-data-table__head\"", "><tr class=\"k2b-data-table__head-row\">", "</tr></thead><tbody>", "</tbody>", "</table>", "</div>"],
|
|
17
|
+
_tmpl$1 = ["<th scope=\"col\" class=\"", "\"", ">", "</th>"],
|
|
18
|
+
_tmpl$10 = ["<tr><td class=\"k2b-data-table__empty\"", ">", "</td></tr>"],
|
|
19
|
+
_tmpl$11 = ["<tr class=\"k2b-data-table__row\" data-loading=\"true\" aria-hidden=\"true\">", "</tr>"],
|
|
20
|
+
_tmpl$12 = ["<td", "><span class=\"k2b-data-table__skeleton\"></span></td>"],
|
|
21
|
+
_tmpl$13 = ["<tr class=\"", "\"", ">", "</tr>"],
|
|
22
|
+
_tmpl$14 = ["<td class=\"", "\"", "><div", ">", "</div></td>"],
|
|
23
|
+
_tmpl$15 = ["<tfoot class=\"k2b-data-table__foot\" data-sticky=\"true\"><tr class=\"k2b-data-table__foot-row\">", "</tr></tfoot>"],
|
|
24
|
+
_tmpl$16 = ["<td class=\"k2b-data-table__footer-cell\"", ">", "</td>"],
|
|
25
|
+
_tmpl$17 = ["<div class=\"k2b-data-table__scrollbar\"", " aria-hidden=\"true\"><span style=\"", "\"></span></div>"],
|
|
26
|
+
_tmpl$18 = ["<div class=\"", "\">", "</div>"],
|
|
27
|
+
_tmpl$19 = ["<span", ">", "</span>"],
|
|
28
|
+
_tmpl$20 = ["<footer class=\"", "\">", "</footer>"];
|
|
29
|
+
import { createContext, createEffect, createMemo, createSignal, createUniqueId, For, Match, on, onCleanup, onMount, Show, Switch, useContext } from "solid-js";
|
|
27
30
|
import { Dynamic } from "solid-js/web";
|
|
31
|
+
import { announce } from "../feedback/announce";
|
|
28
32
|
import { suppressTextSelection } from "../internal/text-selection";
|
|
29
33
|
import { useLocale } from "../intl/locale";
|
|
30
34
|
import { useUiMessages } from "../intl/messages";
|
|
@@ -32,6 +36,7 @@ import { PanelHeader } from "../layout/PanelHeader";
|
|
|
32
36
|
import { Paper } from "../surfaces/Paper";
|
|
33
37
|
import Placeholder from "../surfaces/Placeholder";
|
|
34
38
|
import { useDataTableMessages } from "./data-table-messages";
|
|
39
|
+
const WIDE_TABLE_COLUMNS = 8;
|
|
35
40
|
const DataTablePanelContext = createContext();
|
|
36
41
|
const defaultRender = (value, locale, messages) => {
|
|
37
42
|
if (value === null || value === undefined || value === "") return "—";
|
|
@@ -98,6 +103,7 @@ function DataTableRoot(props) {
|
|
|
98
103
|
let previousRowsLength = props.rows.length;
|
|
99
104
|
let previousLoadingMore = !!props.loadingMore;
|
|
100
105
|
let previousHasMore = !!props.hasMore;
|
|
106
|
+
const loadingRows = () => Math.min(50, Math.max(1, Math.trunc(Number.isNaN(props.loadingRows) ? 5 : props.loadingRows ?? 5)));
|
|
101
107
|
const rowId = row => props.getRowId?.(row);
|
|
102
108
|
const isInteractive = () => !!props.selection || !!props.onRowClick || !!props.onRowDoubleClick;
|
|
103
109
|
const shouldHoverRows = () => props.hoverRows ?? isInteractive();
|
|
@@ -320,6 +326,11 @@ function DataTableRoot(props) {
|
|
|
320
326
|
if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);
|
|
321
327
|
});
|
|
322
328
|
});
|
|
329
|
+
|
|
330
|
+
// Announced once per wait, outside the region that `aria-busy` keeps quiet.
|
|
331
|
+
createEffect(on(() => !!props.loading && props.rows.length === 0, waiting => {
|
|
332
|
+
if (waiting) announce(dataTableMessages().loadingRows);
|
|
333
|
+
}));
|
|
323
334
|
createEffect(() => {
|
|
324
335
|
const rowsLength = props.rows.length;
|
|
325
336
|
const nextHasMore = !!props.hasMore;
|
|
@@ -376,11 +387,18 @@ function DataTableRoot(props) {
|
|
|
376
387
|
},
|
|
377
388
|
onMouseLeave: () => setHoveredColumn(null),
|
|
378
389
|
get children() {
|
|
379
|
-
return [_$ssr(_tmpl$
|
|
390
|
+
return [_$ssr(_tmpl$0, _$ssrAttribute("aria-label", labelledBy() ? _$escape(undefined, true) : _$escape(props.ariaLabel ?? dataTableMessages().dataTable, true), false) + _$ssrAttribute("aria-labelledby", _$escape(labelledBy(), true), false) + _$ssrAttribute("aria-busy", props.loading ? "true" : _$escape(undefined, true), false), `k2b-table-wrap${props.scrollClass ? ` ${_$escape(props.scrollClass, true)}` : ""}`, _$ssrAttribute("data-density", props.density === "compact" ? "compact" : _$escape(undefined, true), false) + _$ssrAttribute("data-has-footer", props.footer ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-surface", _$escape(surface(), true), false) + _$ssrAttribute("data-scroll-preserve", _$escape(props.scrollPreserveKey || undefined, true), false), _$ssrAttribute("class", _$escape(tableClass(), true), false) + _$ssrAttribute("data-fill", props.fillHeight ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-wide", props.columns.length > WIDE_TABLE_COLUMNS ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
|
|
391
|
+
get when() {
|
|
392
|
+
return props.loading;
|
|
393
|
+
},
|
|
394
|
+
get children() {
|
|
395
|
+
return _$ssr(_tmpl$7, _$escape(dataTableMessages().loadingRows));
|
|
396
|
+
}
|
|
397
|
+
})), _$ssrAttribute("data-sticky", props.stickyHeader === false ? _$escape(undefined, true) : "true", false), _$escape(_$createComponent(For, {
|
|
380
398
|
get each() {
|
|
381
399
|
return props.columns;
|
|
382
400
|
},
|
|
383
|
-
children: (col, index) => _$ssr(_tmpl$
|
|
401
|
+
children: (col, index) => _$ssr(_tmpl$1, `${_$escape(col.headerClass ?? "", true)} ${_$escape(col.class ?? "", true)}`, _$ssrAttribute("data-align", _$escape(alignAttr(col), true), false) + _$ssrAttribute("data-highlighted", _$escape(columnHighlighted(index()), true), false) + _$ssrAttribute("aria-sort", _$escape(ariaSortFor(col), true), false), props.renderHeader ? _$escape(props.renderHeader({
|
|
384
402
|
col,
|
|
385
403
|
render: () => renderHeaderDefault(col)
|
|
386
404
|
})) : _$escape(renderHeaderDefault(col)))
|
|
@@ -389,11 +407,40 @@ function DataTableRoot(props) {
|
|
|
389
407
|
return props.rows.length > 0;
|
|
390
408
|
},
|
|
391
409
|
get fallback() {
|
|
392
|
-
return _$
|
|
393
|
-
get
|
|
394
|
-
return props.
|
|
410
|
+
return _$createComponent(Show, {
|
|
411
|
+
get when() {
|
|
412
|
+
return props.loading;
|
|
413
|
+
},
|
|
414
|
+
get fallback() {
|
|
415
|
+
return _$ssr(_tmpl$10, _$ssrAttribute("colspan", _$escape(props.columns.length, true), false), _$escape(_$createComponent(Placeholder, {
|
|
416
|
+
get description() {
|
|
417
|
+
return props.empty ?? dataTableMessages().noRecords;
|
|
418
|
+
}
|
|
419
|
+
})));
|
|
420
|
+
},
|
|
421
|
+
get children() {
|
|
422
|
+
return [_$createComponent(For, {
|
|
423
|
+
get each() {
|
|
424
|
+
return Array.from({
|
|
425
|
+
length: loadingRows()
|
|
426
|
+
});
|
|
427
|
+
},
|
|
428
|
+
children: () => _$ssr(_tmpl$11, _$escape(_$createComponent(For, {
|
|
429
|
+
get each() {
|
|
430
|
+
return props.columns;
|
|
431
|
+
},
|
|
432
|
+
children: col => _$ssr(_tmpl$12, _$ssrAttribute("data-align", _$escape(alignAttr(col), true), false))
|
|
433
|
+
})))
|
|
434
|
+
}), _$createComponent(Show, {
|
|
435
|
+
get when() {
|
|
436
|
+
return props.fillHeight;
|
|
437
|
+
},
|
|
438
|
+
get children() {
|
|
439
|
+
return _$ssr(_tmpl$8, _$ssrAttribute("colspan", _$escape(props.columns.length, true), false));
|
|
440
|
+
}
|
|
441
|
+
})];
|
|
395
442
|
}
|
|
396
|
-
})
|
|
443
|
+
});
|
|
397
444
|
},
|
|
398
445
|
get children() {
|
|
399
446
|
return [_$createComponent(For, {
|
|
@@ -403,13 +450,13 @@ function DataTableRoot(props) {
|
|
|
403
450
|
children: row => {
|
|
404
451
|
const id = () => rowId(row);
|
|
405
452
|
const isSelected = () => props.selection ? props.selection.selected().has(id() ?? "") : props.selectedRowId && id() === props.selectedRowId;
|
|
406
|
-
return _$ssr(_tmpl$
|
|
453
|
+
return _$ssr(_tmpl$13, `k2b-data-table__row ${_$escape(rowClass(row), true)}`, _$ssrAttribute("data-hover", shouldHoverRows() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-clickable", shouldHoverRows() && isInteractive() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-selected", isSelected() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("aria-selected", props.selection ? !!isSelected() : _$escape(undefined, true), false) + _$ssrAttribute("tabindex", props.selection ? props.selection.focused() === id() ? 0 : -1 : isInteractive() ? 0 : _$escape(undefined, true), false), _$escape(_$createComponent(For, {
|
|
407
454
|
get each() {
|
|
408
455
|
return props.columns;
|
|
409
456
|
},
|
|
410
457
|
children: (col, index) => {
|
|
411
458
|
const value = () => valueOf(row, col);
|
|
412
|
-
return _$ssr(_tmpl$
|
|
459
|
+
return _$ssr(_tmpl$14, `${_$escape(col.cellClass ?? "", true)} ${_$escape(col.class ?? "", true)}`, _$ssrAttribute("data-nowrap", _$escape(nowrapAttr(col), true), false) + _$ssrAttribute("data-align", _$escape(alignAttr(col), true), false) + _$ssrAttribute("data-valign", props.verticalAlign && props.verticalAlign !== "middle" ? _$escape(props.verticalAlign, true) : _$escape(undefined, true), false) + _$ssrAttribute("data-highlighted", _$escape(columnHighlighted(index()), true), false), _$ssrAttribute("class", _$escape(cellContentClass(), true), false), props.renderCell ? _$escape(props.renderCell({
|
|
413
460
|
row,
|
|
414
461
|
col,
|
|
415
462
|
value: value(),
|
|
@@ -426,7 +473,7 @@ function DataTableRoot(props) {
|
|
|
426
473
|
return props.fillHeight;
|
|
427
474
|
},
|
|
428
475
|
get children() {
|
|
429
|
-
return _$ssr(_tmpl$
|
|
476
|
+
return _$ssr(_tmpl$8, _$ssrAttribute("colspan", _$escape(props.columns.length, true), false));
|
|
430
477
|
}
|
|
431
478
|
})];
|
|
432
479
|
}
|
|
@@ -434,13 +481,13 @@ function DataTableRoot(props) {
|
|
|
434
481
|
get when() {
|
|
435
482
|
return props.footer;
|
|
436
483
|
},
|
|
437
|
-
children: footer => _$ssr(_tmpl$
|
|
484
|
+
children: footer => _$ssr(_tmpl$15, _$escape(_$createComponent(For, {
|
|
438
485
|
get each() {
|
|
439
486
|
return props.columns;
|
|
440
487
|
},
|
|
441
488
|
children: (col, index) => {
|
|
442
489
|
const value = () => footer().values?.[col.id];
|
|
443
|
-
return _$ssr(_tmpl$
|
|
490
|
+
return _$ssr(_tmpl$16, _$ssrAttribute("data-nowrap", _$escape(nowrapAttr(col), true), false) + _$ssrAttribute("data-align", _$escape(alignAttr(col), true), false) + _$ssrAttribute("data-highlighted", _$escape(columnHighlighted(index()), true), false), footer().renderCell ? _$escape(footer().renderCell({
|
|
444
491
|
col,
|
|
445
492
|
value: value(),
|
|
446
493
|
render: renderValueDefault
|
|
@@ -452,11 +499,11 @@ function DataTableRoot(props) {
|
|
|
452
499
|
return shouldRenderLoadMoreSentinel();
|
|
453
500
|
},
|
|
454
501
|
get children() {
|
|
455
|
-
return _$ssr(_tmpl$
|
|
502
|
+
return _$ssr(_tmpl$9);
|
|
456
503
|
}
|
|
457
504
|
}))), _$createComponent(For, {
|
|
458
505
|
each: ["y", "x"],
|
|
459
|
-
children: axis => _$ssr(_tmpl$
|
|
506
|
+
children: axis => _$ssr(_tmpl$17, _$ssrAttribute("data-axis", _$escape(axis, true), false) + _$ssrAttribute("data-overflow", scrollbars()[axis].overflow ? "true" : _$escape(undefined, true), false), _$ssrStyleProperty("--k2b-data-table-scroll-offset:", `${_$escape(scrollbars()[axis].offset, true)}px`) + _$ssrStyleProperty(";--k2b-data-table-scroll-size:", `${_$escape(scrollbars()[axis].size, true)}px`))
|
|
460
507
|
})];
|
|
461
508
|
}
|
|
462
509
|
});
|
|
@@ -489,9 +536,9 @@ const DataTablePanel = props => {
|
|
|
489
536
|
const DataTableHeader = props => {
|
|
490
537
|
const panel = useContext(DataTablePanelContext);
|
|
491
538
|
panel?.registerHeading();
|
|
492
|
-
return _$ssr(_tmpl$
|
|
539
|
+
return _$ssr(_tmpl$18, `k2b-data-panel__header ${_$escape(props.class ?? "", true)}`, _$escape(_$createComponent(PanelHeader, {
|
|
493
540
|
get title() {
|
|
494
|
-
return _$ssr(_tmpl$
|
|
541
|
+
return _$ssr(_tmpl$19, _$ssrAttribute("id", _$escape(panel?.headingId, true), false), _$escape(props.title));
|
|
495
542
|
},
|
|
496
543
|
get subtitle() {
|
|
497
544
|
return props.subtitle;
|
|
@@ -507,8 +554,8 @@ const DataTableHeader = props => {
|
|
|
507
554
|
}
|
|
508
555
|
})));
|
|
509
556
|
};
|
|
510
|
-
const DataTableControls = props => _$ssr(_tmpl$
|
|
511
|
-
const DataTablePanelFooter = props => _$ssr(_tmpl$
|
|
557
|
+
const DataTableControls = props => _$ssr(_tmpl$18, `k2b-data-panel__controls ${_$escape(props.class ?? "", true)}`, _$escape(props.children));
|
|
558
|
+
const DataTablePanelFooter = props => _$ssr(_tmpl$20, `k2b-data-panel__footer ${_$escape(props.class ?? "", true)}`, _$escape(props.children));
|
|
512
559
|
const DataTable = DataTableRoot;
|
|
513
560
|
DataTable.Panel = DataTablePanel;
|
|
514
561
|
DataTable.Header = DataTableHeader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/DataTable.tsx"],"sourcesContent":["import {\n type Accessor,\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n Match,\n onCleanup,\n onMount,\n Show,\n Switch,\n useContext,\n} from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { PanelHeader } from \"../layout/PanelHeader\";\nimport { Paper } from \"../surfaces/Paper\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport type { CollectionSelection } from \"./collection-selection\";\nimport { useDataTableMessages } from \"./data-table-messages\";\n\nexport type DataTableColumn<T> = {\n id: string;\n header: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n subtitle?: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n value?: keyof T | ((row: T) => unknown);\n class?: string;\n headerClass?: string;\n cellClass?: string;\n /** Defaults to right for numeric values and left for everything else. */\n align?: \"left\" | \"center\" | \"right\";\n /**\n * Keeps each value on one line, so the column is at least as wide as its\n * longest value. For dates, times, numbers, amounts, and short codes.\n * Defaults to true when the column's first value is a number or date. The\n * default cell wrapper already keeps every value on one line; this option\n * decides wrapping for content under a custom `cellContentClass`, and a\n * `white-space` that class sets itself wins.\n */\n nowrap?: boolean;\n /**\n * Marks the column sortable. Pass a string when the server's sort key\n * differs from the column id — they often do, because one column can show a\n * rate while another sorts by the absolute count behind it.\n */\n sortable?: boolean | string;\n};\n\nexport type DataTableSort = { key: string; direction: \"asc\" | \"desc\" };\n\nexport type DataTableRenderCell<T> = (ctx: {\n row: T;\n col: DataTableColumn<T>;\n value: unknown;\n render: (value: unknown) => JSX.Element;\n}) => JSX.Element;\n\nexport type DataTableRenderHeader<T> = (ctx: { col: DataTableColumn<T>; render: () => JSX.Element }) => JSX.Element;\n\nexport type DataTableFooter<T> = {\n values?: Record<string, unknown>;\n renderCell?: (ctx: { col: DataTableColumn<T>; value: unknown; render: (value: unknown) => JSX.Element }) => JSX.Element;\n};\n\nexport type DataTableProps<T> = {\n rows: readonly T[];\n columns: readonly DataTableColumn<T>[];\n /** Accessible name for a standalone table region. Defaults to \"Data table\". */\n ariaLabel?: string;\n /** ID of a visible heading that labels the table region. Takes precedence over ariaLabel. */\n ariaLabelledBy?: string;\n getRowId?: (row: T) => string;\n /** Current server-side ordering, or null when the default applies. */\n sort?: DataTableSort | null;\n /**\n * Link target for a sortable header. Link-based because every admin table is\n * server-rendered: sorting is a query change, not client state.\n */\n sortHref?: (next: DataTableSort) => string;\n /**\n * Sorts on the client instead: sortable headers become buttons that report the\n * next order, with the same look and order of directions as `sortHref`.\n */\n onSortChange?: (next: DataTableSort) => void;\n selectedRowId?: string | null;\n /** Optional multi-selection shared with another collection view. Requires getRowId. */\n selection?: CollectionSelection;\n rowClass?: string | ((row: T) => string | undefined);\n hoverRows?: boolean;\n onRowClick?: (row: T) => void;\n onRowDoubleClick?: (row: T) => void;\n onRowContextMenu?: (row: T) => void;\n renderCell?: DataTableRenderCell<T>;\n renderHeader?: DataTableRenderHeader<T>;\n footer?: DataTableFooter<T>;\n hasMore?: boolean;\n loadingMore?: boolean;\n onLoadMore?: () => void;\n empty?: JSX.Element;\n density?: \"compact\" | \"normal\";\n stickyHeader?: boolean;\n highlightColumns?: boolean;\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\n cellContentClass?: string;\n fillHeight?: boolean;\n /** Visual frame for a standalone table. Defaults preserve the legacy class-based behavior. */\n surface?: \"paper\" | \"plain\";\n class?: string;\n /** Additional classes for the table element. Core table geometry is always retained. */\n tableClass?: string;\n /** Additional classes for the scrolling region, such as `k2b-detail-trail`. */\n scrollClass?: string;\n scrollPreserveKey?: string | false;\n};\n\nexport type DataTablePanelProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTableHeaderProps = {\n title: string;\n subtitle?: string;\n children?: JSX.Element;\n as?: \"h1\" | \"h2\" | \"h3\";\n size?: \"sm\" | \"md\";\n class?: string;\n};\n\nexport type DataTableControlsProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTablePanelFooterProps = {\n children: JSX.Element;\n class?: string;\n};\n\ntype DataTablePanelContextValue = {\n headingId: string;\n hasHeading: Accessor<boolean>;\n registerHeading: () => void;\n};\n\nconst DataTablePanelContext = createContext<DataTablePanelContextValue>();\n\nconst defaultRender = (value: unknown, locale: string, messages: ReturnType<ReturnType<typeof useUiMessages>>): JSX.Element => {\n if (value === null || value === undefined || value === \"\") return \"—\";\n if (value instanceof Date) return value.toLocaleString(locale);\n if (typeof value === \"boolean\") return value ? messages.yes : messages.no;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n if (typeof value === \"string\") return value;\n return JSON.stringify(value);\n};\n\nconst renderColumnPart = <T,>(\n part: DataTableColumn<T>[\"header\"] | DataTableColumn<T>[\"subtitle\"],\n col: DataTableColumn<T>,\n): JSX.Element => {\n if (typeof part === \"function\") return part({ col });\n return part;\n};\n\nconst rowInteractiveSelector = [\n \"a[href]\",\n \"button\",\n \"input\",\n \"label\",\n \"select\",\n \"textarea\",\n \"summary\",\n \"[contenteditable]\",\n \"[role='button']\",\n \"[role='checkbox']\",\n \"[role='link']\",\n \"[role='menuitem']\",\n \"[role='option']\",\n \"[role='radio']\",\n \"[role='switch']\",\n \"[role='tab']\",\n \"[tabindex]\",\n].join(\",\");\n\nconst isNestedRowControl = (event: Event): boolean =>\n event.target instanceof Element && event.target.closest(rowInteractiveSelector) !== event.currentTarget;\n\n/** Distance in pixels before the table's end at which the next page is requested. */\nconst loadMoreMargin = 240;\n\ntype DataTableScrollbarAxis = \"x\" | \"y\";\ntype DataTableScrollbarMetrics = { overflow: boolean; offset: number; size: number };\n\nconst scrollbarMetrics = (viewportSize: number, contentSize: number, scrollOffset: number): DataTableScrollbarMetrics => {\n if (viewportSize <= 0 || contentSize <= viewportSize + 1) return { overflow: false, offset: 0, size: 0 };\n const size = Math.min(viewportSize, Math.max(24, (viewportSize * viewportSize) / contentSize));\n const offset = (scrollOffset / (contentSize - viewportSize)) * (viewportSize - size);\n return { overflow: true, offset, size };\n};\n\nfunction DataTableRoot<T>(props: DataTableProps<T>) {\n const messages = useUiMessages();\n const dataTableMessages = useDataTableMessages();\n const locale = useLocale();\n const [hoveredColumn, setHoveredColumn] = createSignal<number | null>(null);\n const [scrollbars, setScrollbars] = createSignal<Record<DataTableScrollbarAxis, DataTableScrollbarMetrics>>({\n x: { overflow: false, offset: 0, size: 0 },\n y: { overflow: false, offset: 0, size: 0 },\n });\n const [scrollbarEnhanced, setScrollbarEnhanced] = createSignal(false);\n const [scrolling, setScrolling] = createSignal(false);\n const panel = useContext(DataTablePanelContext);\n let tableRef: HTMLTableElement | undefined;\n let scrollRef: HTMLDivElement | undefined;\n let loadMoreRef: HTMLDivElement | undefined;\n let scrollingTimeout: ReturnType<typeof setTimeout> | undefined;\n let scrollbarDragOffset = 0;\n let hasMore = false;\n let loadingMore = false;\n let onLoadMore: (() => void) | undefined;\n let loadMoreRequested = false;\n let previousRowsLength = props.rows.length;\n let previousLoadingMore = !!props.loadingMore;\n let previousHasMore = !!props.hasMore;\n const rowId = (row: T) => props.getRowId?.(row);\n const isInteractive = () => !!props.selection || !!props.onRowClick || !!props.onRowDoubleClick;\n const shouldHoverRows = () => props.hoverRows ?? isInteractive();\n const shouldRenderLoadMoreSentinel = () => !!props.onLoadMore;\n const labelledBy = () => props.ariaLabelledBy ?? (panel?.hasHeading() ? panel.headingId : undefined);\n const surface = () => props.surface ?? (props.class ? \"plain\" : \"paper\");\n const cellContentClass = () => props.cellContentClass ?? \"k2b-data-table__cell-text\";\n const tableClass = () => `k2b-data-table ${props.tableClass ?? \"\"}`.trim();\n const columnHighlighted = (index: number) =>\n props.highlightColumns !== false && shouldHoverRows() && hoveredColumn() === index ? \"true\" : undefined;\n const setHoveredColumnIfEnabled = (index: number) => {\n if (shouldHoverRows()) setHoveredColumn(index);\n };\n\n /**\n * A bounded table scrolls its own viewport. A table that grows with its rows\n * leaves scrolling to the page or an ancestor, so its end is measured against\n * the browser viewport instead.\n */\n const isNearBottom = () => {\n if (!scrollRef || !loadMoreRef) return false;\n if (scrollRef.scrollHeight > scrollRef.clientHeight + 1) {\n return scrollRef.scrollTop + scrollRef.clientHeight >= scrollRef.scrollHeight - loadMoreMargin;\n }\n return loadMoreRef.getBoundingClientRect().top <= window.innerHeight + loadMoreMargin;\n };\n\n const maybeLoadMore = () => {\n if (!hasMore || loadingMore || !onLoadMore) return;\n if (!isNearBottom()) {\n // Leaving the end re-arms a request the owner declined, for example while its first page was still loading.\n loadMoreRequested = false;\n return;\n }\n if (loadMoreRequested) return;\n loadMoreRequested = true;\n try {\n onLoadMore();\n } catch (error) {\n loadMoreRequested = false;\n throw error;\n }\n };\n\n const syncScrollbars = () => {\n if (!scrollRef) return;\n setScrollbars({\n x: scrollbarMetrics(scrollRef.clientWidth, scrollRef.scrollWidth, scrollRef.scrollLeft),\n y: scrollbarMetrics(scrollRef.clientHeight, scrollRef.scrollHeight, scrollRef.scrollTop),\n });\n };\n\n const revealScrollbars = () => {\n setScrolling(true);\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n scrollingTimeout = setTimeout(() => {\n setScrolling(false);\n scrollingTimeout = undefined;\n }, 700);\n };\n\n const onScroll = () => {\n syncScrollbars();\n revealScrollbars();\n maybeLoadMore();\n };\n\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n if (!scrollRef) return;\n const track = event.currentTarget;\n const metrics = scrollbars()[axis];\n const rect = track.getBoundingClientRect();\n const trackSize = axis === \"y\" ? rect.height : rect.width;\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n const available = Math.max(1, trackSize - metrics.size);\n const thumbOffset = Math.min(available, Math.max(0, pointerOffset - scrollbarDragOffset));\n const maxScroll = axis === \"y\" ? scrollRef.scrollHeight - scrollRef.clientHeight : scrollRef.scrollWidth - scrollRef.clientWidth;\n if (axis === \"y\") scrollRef.scrollTop = (thumbOffset / available) * maxScroll;\n else scrollRef.scrollLeft = (thumbOffset / available) * maxScroll;\n syncScrollbars();\n revealScrollbars();\n };\n\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n if (event.button !== 0) return;\n event.preventDefault();\n const metrics = scrollbars()[axis];\n const rect = event.currentTarget.getBoundingClientRect();\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n scrollbarDragOffset =\n event.target === event.currentTarget ? metrics.size / 2 : Math.min(metrics.size, Math.max(0, pointerOffset - metrics.offset));\n event.currentTarget.setPointerCapture(event.pointerId);\n // The track's own pointerup or pointercancel ends the hold.\n suppressTextSelection(event.pointerId);\n scrollFromPointer(event, axis);\n };\n\n const valueOf = (row: T, col: DataTableColumn<T>) => {\n if (typeof col.value === \"function\") return col.value(row);\n if (col.value) return row[col.value];\n return undefined;\n };\n\n const columnPresentation = createMemo(() => {\n const presentation = new Map<string, { align: NonNullable<DataTableColumn<T>[\"align\"]>; nowrap: boolean }>();\n for (const col of props.columns) {\n let numeric = false;\n let date = false;\n if (col.align === undefined || col.nowrap === undefined) {\n for (const row of props.rows) {\n const value = valueOf(row, col);\n if (value === null || value === undefined || value === \"\") continue;\n numeric = typeof value === \"number\" || typeof value === \"bigint\";\n date = value instanceof Date;\n break;\n }\n }\n presentation.set(col.id, { align: col.align ?? (numeric ? \"right\" : \"left\"), nowrap: col.nowrap ?? (numeric || date) });\n }\n return presentation;\n });\n\n /** `data-align` mirrors Cloud's `text-left/center/right` on the same cell. */\n const alignAttr = (col: DataTableColumn<T>) => {\n const align = columnPresentation().get(col.id)?.align ?? \"left\";\n return align === \"left\" ? undefined : align;\n };\n\n const nowrapAttr = (col: DataTableColumn<T>) => (columnPresentation().get(col.id)?.nowrap ? \"true\" : undefined);\n\n const sortKeyOf = (col: DataTableColumn<T>): string | null =>\n col.sortable === true ? col.id : typeof col.sortable === \"string\" ? col.sortable : null;\n\n /**\n * Sorting is a link by default: server-rendered tables keep the order in the\n * URL. Client tables pass onSortChange instead. Clicking the active column\n * flips its direction.\n */\n const nextSortFor = (key: string): DataTableSort => ({\n key,\n direction: props.sort?.key === key && props.sort?.direction === \"desc\" ? \"asc\" : \"desc\",\n });\n\n /** Only a sortable column carries a sort state; the rest carry none at all. */\n const ariaSortFor = (col: DataTableColumn<T>): \"ascending\" | \"descending\" | \"none\" | undefined => {\n const key = sortKeyOf(col);\n if (!key || (!props.sortHref && !props.onSortChange && !props.renderHeader)) return undefined;\n if (props.sort?.key !== key) return \"none\";\n return props.sort?.direction === \"asc\" ? \"ascending\" : \"descending\";\n };\n\n const renderHeaderDefault = (col: DataTableColumn<T>): JSX.Element => {\n const key = sortKeyOf(col);\n // Only how a column sorts decides the element. The order lives in its attributes, so a header button keeps\n // keyboard focus when a click sorts the table and the reader can press it again to reverse the order.\n const mode = createMemo(() => (!key ? null : props.sortHref ? \"link\" : props.onSortChange ? \"button\" : null));\n const active = () => key !== null && props.sort?.key === key;\n const title = () => (\n <>\n <span class=\"k2b-data-table__header-title\">{renderColumnPart(col.header, col)}</span>\n <Show when={col.subtitle !== undefined}>\n <span class=\"k2b-data-table__header-subtitle\">{renderColumnPart(col.subtitle, col)}</span>\n </Show>\n </>\n );\n const line = () => (\n <span class=\"k2b-data-table__header-line\">\n {title()}\n {/* Inactive columns keep a dimmed marker so the row reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${active() && props.sort?.direction === \"asc\" ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={active() ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </span>\n );\n\n return (\n <Switch\n fallback={\n <div class=\"k2b-data-table__header-content\" data-align={alignAttr(col)}>\n {title()}\n </div>\n }\n >\n <Match when={mode() === \"link\"}>\n <a\n href={key ? props.sortHref?.(nextSortFor(key)) : undefined}\n class=\"k2b-data-table__header-content k2b-data-table__sort\"\n data-align={alignAttr(col)}\n >\n {line()}\n </a>\n </Match>\n <Match when={mode() === \"button\"}>\n <button\n type=\"button\"\n class=\"k2b-data-table__header-content k2b-data-table__sort\"\n data-align={alignAttr(col)}\n onClick={() => key && props.onSortChange?.(nextSortFor(key))}\n >\n {line()}\n </button>\n </Match>\n </Switch>\n );\n };\n\n const renderValueDefault = (value: unknown) => defaultRender(value, locale(), messages());\n const renderCellDefault = (row: T, col: DataTableColumn<T>) => renderValueDefault(valueOf(row, col));\n\n const onRowKeyDown = (event: KeyboardEvent, row: T) => {\n if (!isInteractive()) return;\n if (isNestedRowControl(event)) return;\n const id = rowId(row);\n if (id !== undefined && props.selection?.keyDown(event, id)) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n (props.selection ? props.onRowDoubleClick : (props.onRowClick ?? props.onRowDoubleClick))?.(row);\n };\n\n const onRowClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n const id = rowId(row);\n if (id !== undefined) props.selection?.select(id, event);\n props.onRowClick?.(row);\n };\n\n const onRowDoubleClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n props.onRowDoubleClick?.(row);\n };\n\n const rowClass = (row: T) => {\n if (typeof props.rowClass === \"function\") return props.rowClass(row) ?? \"\";\n return props.rowClass ?? \"\";\n };\n\n onMount(() => {\n if (typeof IntersectionObserver === \"undefined\" || !loadMoreRef) return;\n // The viewport root notices the end whichever element scrolls; `isNearBottom` decides.\n const observer = new IntersectionObserver(maybeLoadMore, { rootMargin: `${loadMoreMargin}px` });\n observer.observe(loadMoreRef);\n onCleanup(() => observer.disconnect());\n });\n\n onMount(() => {\n setScrollbarEnhanced(true);\n syncScrollbars();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbars);\n if (scrollRef) observer?.observe(scrollRef);\n if (tableRef) observer?.observe(tableRef);\n onCleanup(() => {\n observer?.disconnect();\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n });\n });\n\n createEffect(() => {\n const rowsLength = props.rows.length;\n const nextHasMore = !!props.hasMore;\n const nextLoadingMore = !!props.loadingMore;\n if (rowsLength !== previousRowsLength || (previousLoadingMore && !nextLoadingMore) || (!previousHasMore && nextHasMore)) {\n loadMoreRequested = false;\n }\n previousRowsLength = rowsLength;\n previousLoadingMore = nextLoadingMore;\n previousHasMore = nextHasMore;\n hasMore = nextHasMore;\n loadingMore = nextLoadingMore;\n onLoadMore = props.onLoadMore;\n maybeLoadMore();\n queueMicrotask(syncScrollbars);\n });\n\n return (\n <Show when={props.columns.length > 0} fallback={<Placeholder surface=\"paper\" description={<>{dataTableMessages().noColumns}</>} />}>\n <Dynamic\n component={surface() === \"paper\" ? Paper : \"div\"}\n class={`k2b-table-shell ${props.class ?? \"\"}`}\n data-surface={surface()}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-overflow-x={scrollbars().x.overflow ? \"true\" : undefined}\n data-overflow-y={scrollbars().y.overflow ? \"true\" : undefined}\n data-scrollbar-enhanced={scrollbarEnhanced() ? \"true\" : undefined}\n data-scrolling={scrolling() ? \"true\" : undefined}\n onMouseLeave={() => setHoveredColumn(null)}\n >\n <div\n ref={scrollRef}\n role=\"region\"\n aria-label={labelledBy() ? undefined : (props.ariaLabel ?? dataTableMessages().dataTable)}\n aria-labelledby={labelledBy()}\n tabIndex={0}\n class={`k2b-table-wrap${props.scrollClass ? ` ${props.scrollClass}` : \"\"}`}\n data-density={props.density === \"compact\" ? \"compact\" : undefined}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-surface={surface()}\n data-scroll-preserve={props.scrollPreserveKey || undefined}\n onScroll={onScroll}\n >\n <table ref={tableRef} class={tableClass()} data-fill={props.fillHeight ? \"true\" : undefined}>\n <thead class=\"k2b-data-table__head\" data-sticky={props.stickyHeader === false ? undefined : \"true\"}>\n <tr class=\"k2b-data-table__head-row\">\n <For each={props.columns}>\n {(col, index) => (\n <th\n scope=\"col\"\n class={`${col.headerClass ?? \"\"} ${col.class ?? \"\"}`}\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n aria-sort={ariaSortFor(col)}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {props.renderHeader ? props.renderHeader({ col, render: () => renderHeaderDefault(col) }) : renderHeaderDefault(col)}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <Show\n when={props.rows.length > 0}\n fallback={\n <tr>\n <td class=\"k2b-data-table__empty\" colspan={props.columns.length}>\n <Placeholder description={<>{props.empty ?? dataTableMessages().noRecords}</>} />\n </td>\n </tr>\n }\n >\n <For each={props.rows}>\n {(row) => {\n const id = () => rowId(row);\n const isSelected = () =>\n props.selection ? props.selection.selected().has(id() ?? \"\") : props.selectedRowId && id() === props.selectedRowId;\n return (\n <tr\n ref={(element) => {\n const key = id();\n if (key !== undefined) props.selection?.register(key, element);\n }}\n class={`k2b-data-table__row ${rowClass(row)}`}\n data-hover={shouldHoverRows() ? \"true\" : undefined}\n data-clickable={shouldHoverRows() && isInteractive() ? \"true\" : undefined}\n data-selected={isSelected() ? \"true\" : undefined}\n aria-selected={props.selection ? !!isSelected() : undefined}\n tabIndex={props.selection ? (props.selection.focused() === id() ? 0 : -1) : isInteractive() ? 0 : undefined}\n onFocus={() => {\n const key = id();\n if (key !== undefined) props.selection?.markFocused(key);\n }}\n onClick={(event) => onRowClick(event, row)}\n onDblClick={(event) => onRowDoubleClick(event, row)}\n onContextMenu={() => props.onRowContextMenu?.(row)}\n onKeyDown={(e) => onRowKeyDown(e, row)}\n >\n <For each={props.columns}>\n {(col, index) => {\n const value = () => valueOf(row, col);\n return (\n <td\n class={`${col.cellClass ?? \"\"} ${col.class ?? \"\"}`}\n data-nowrap={nowrapAttr(col)}\n data-align={alignAttr(col)}\n data-valign={props.verticalAlign && props.verticalAlign !== \"middle\" ? props.verticalAlign : undefined}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n <div class={cellContentClass()}>\n {props.renderCell\n ? props.renderCell({\n row,\n col,\n value: value(),\n render: (v) => renderCellDefault(row, { ...col, value: () => v }),\n })\n : renderValueDefault(value())}\n </div>\n </td>\n );\n }}\n </For>\n </tr>\n );\n }}\n </For>\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={props.columns.length} />\n </tr>\n </Show>\n </Show>\n </tbody>\n <Show when={props.footer}>\n {(footer) => (\n <tfoot class=\"k2b-data-table__foot\" data-sticky=\"true\">\n <tr class=\"k2b-data-table__foot-row\">\n <For each={props.columns}>\n {(col, index) => {\n const value = () => footer().values?.[col.id];\n return (\n <td\n class=\"k2b-data-table__footer-cell\"\n data-nowrap={nowrapAttr(col)}\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {footer().renderCell\n ? footer().renderCell!({ col, value: value(), render: renderValueDefault })\n : renderValueDefault(value())}\n </td>\n );\n }}\n </For>\n </tr>\n </tfoot>\n )}\n </Show>\n </table>\n <Show when={shouldRenderLoadMoreSentinel()}>\n <div ref={loadMoreRef} class=\"k2b-data-table__sentinel\" aria-hidden=\"true\" />\n </Show>\n </div>\n <For each={[\"y\", \"x\"] as const}>\n {(axis) => (\n <div\n class=\"k2b-data-table__scrollbar\"\n data-axis={axis}\n data-overflow={scrollbars()[axis].overflow ? \"true\" : undefined}\n aria-hidden=\"true\"\n onPointerDown={(event) => startScrollbarDrag(event, axis)}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event, axis);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-data-table-scroll-offset\": `${scrollbars()[axis].offset}px`,\n \"--k2b-data-table-scroll-size\": `${scrollbars()[axis].size}px`,\n }}\n />\n </div>\n )}\n </For>\n </Dynamic>\n </Show>\n );\n}\n\nconst DataTablePanel = (props: DataTablePanelProps): JSX.Element => {\n const headingId = `k2b-data-table-${createUniqueId()}-heading`;\n const [hasHeading, setHasHeading] = createSignal(false);\n const context: DataTablePanelContextValue = {\n headingId,\n hasHeading,\n registerHeading: () => setHasHeading(true),\n };\n\n return (\n <DataTablePanelContext.Provider value={context}>\n <Paper as=\"section\" class={`k2b-data-panel ${props.class ?? \"\"}`}>\n {props.children}\n </Paper>\n </DataTablePanelContext.Provider>\n );\n};\n\nconst DataTableHeader = (props: DataTableHeaderProps): JSX.Element => {\n const panel = useContext(DataTablePanelContext);\n panel?.registerHeading();\n\n return (\n <div class={`k2b-data-panel__header ${props.class ?? \"\"}`}>\n <PanelHeader\n title={<span id={panel?.headingId}>{props.title}</span>}\n subtitle={props.subtitle}\n actions={props.children}\n as={props.as}\n size={props.size}\n />\n </div>\n );\n};\n\nconst DataTableControls = (props: DataTableControlsProps): JSX.Element => (\n <div class={`k2b-data-panel__controls ${props.class ?? \"\"}`}>{props.children}</div>\n);\n\nconst DataTablePanelFooter = (props: DataTablePanelFooterProps): JSX.Element => (\n <footer class={`k2b-data-panel__footer ${props.class ?? \"\"}`}>{props.children}</footer>\n);\n\ntype DataTableComponent = {\n <T>(props: DataTableProps<T>): JSX.Element;\n Panel: (props: DataTablePanelProps) => JSX.Element;\n Header: (props: DataTableHeaderProps) => JSX.Element;\n Controls: (props: DataTableControlsProps) => JSX.Element;\n Footer: (props: DataTablePanelFooterProps) => JSX.Element;\n};\n\nconst DataTable = DataTableRoot as DataTableComponent;\nDataTable.Panel = DataTablePanel;\nDataTable.Header = DataTableHeader;\nDataTable.Controls = DataTableControls;\nDataTable.Footer = DataTablePanelFooter;\n\nexport default DataTable;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/DataTable.tsx"],"sourcesContent":["import {\n type Accessor,\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n Match,\n on,\n onCleanup,\n onMount,\n Show,\n Switch,\n useContext,\n} from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { announce } from \"../feedback/announce\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { PanelHeader } from \"../layout/PanelHeader\";\nimport { Paper } from \"../surfaces/Paper\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport type { CollectionSelection } from \"./collection-selection\";\nimport { useDataTableMessages } from \"./data-table-messages\";\n\nconst WIDE_TABLE_COLUMNS = 8;\n\nexport type DataTableColumn<T> = {\n id: string;\n header: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n subtitle?: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n value?: keyof T | ((row: T) => unknown);\n class?: string;\n headerClass?: string;\n cellClass?: string;\n /** Defaults to right for numeric values and left for everything else. */\n align?: \"left\" | \"center\" | \"right\";\n /**\n * Keeps each value on one line, so the column is at least as wide as its\n * longest value. For dates, times, numbers, amounts, and short codes.\n * Defaults to true when the column's first value is a number or date. The\n * default cell wrapper already keeps every value on one line; this option\n * decides wrapping for content under a custom `cellContentClass`, and a\n * `white-space` that class sets itself wins.\n */\n nowrap?: boolean;\n /**\n * Marks the column sortable. Pass a string when the server's sort key\n * differs from the column id — they often do, because one column can show a\n * rate while another sorts by the absolute count behind it.\n */\n sortable?: boolean | string;\n};\n\nexport type DataTableSort = { key: string; direction: \"asc\" | \"desc\" };\n\nexport type DataTableRenderCell<T> = (ctx: {\n row: T;\n col: DataTableColumn<T>;\n value: unknown;\n render: (value: unknown) => JSX.Element;\n}) => JSX.Element;\n\nexport type DataTableRenderHeader<T> = (ctx: { col: DataTableColumn<T>; render: () => JSX.Element }) => JSX.Element;\n\nexport type DataTableFooter<T> = {\n values?: Record<string, unknown>;\n renderCell?: (ctx: { col: DataTableColumn<T>; value: unknown; render: (value: unknown) => JSX.Element }) => JSX.Element;\n};\n\nexport type DataTableProps<T> = {\n rows: readonly T[];\n columns: readonly DataTableColumn<T>[];\n /** Accessible name for a standalone table region. Defaults to \"Data table\". */\n ariaLabel?: string;\n /** ID of a visible heading that labels the table region. Takes precedence over ariaLabel. */\n ariaLabelledBy?: string;\n getRowId?: (row: T) => string;\n /** Current server-side ordering, or null when the default applies. */\n sort?: DataTableSort | null;\n /**\n * Link target for a sortable header. Link-based because every admin table is\n * server-rendered: sorting is a query change, not client state.\n */\n sortHref?: (next: DataTableSort) => string;\n /**\n * Sorts on the client instead: sortable headers become buttons that report the\n * next order, with the same look and order of directions as `sortHref`.\n */\n onSortChange?: (next: DataTableSort) => void;\n selectedRowId?: string | null;\n /** Optional multi-selection shared with another collection view. Requires getRowId. */\n selection?: CollectionSelection;\n rowClass?: string | ((row: T) => string | undefined);\n hoverRows?: boolean;\n onRowClick?: (row: T) => void;\n onRowDoubleClick?: (row: T) => void;\n onRowContextMenu?: (row: T) => void;\n renderCell?: DataTableRenderCell<T>;\n renderHeader?: DataTableRenderHeader<T>;\n footer?: DataTableFooter<T>;\n hasMore?: boolean;\n loadingMore?: boolean;\n loading?: boolean;\n /** Initial placeholder count, clamped to an integer from 1 to 50. Defaults to 5. */\n loadingRows?: number;\n onLoadMore?: () => void;\n empty?: JSX.Element;\n density?: \"compact\" | \"normal\";\n stickyHeader?: boolean;\n highlightColumns?: boolean;\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\n cellContentClass?: string;\n fillHeight?: boolean;\n /** Visual frame for a standalone table. Defaults preserve the legacy class-based behavior. */\n surface?: \"paper\" | \"plain\";\n class?: string;\n /** Additional classes for the table element. Core table geometry is always retained. */\n tableClass?: string;\n /** Additional classes for the scrolling region, such as `k2b-detail-trail`. */\n scrollClass?: string;\n scrollPreserveKey?: string | false;\n};\n\nexport type DataTablePanelProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTableHeaderProps = {\n title: string;\n subtitle?: string;\n children?: JSX.Element;\n as?: \"h1\" | \"h2\" | \"h3\";\n size?: \"sm\" | \"md\";\n class?: string;\n};\n\nexport type DataTableControlsProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTablePanelFooterProps = {\n children: JSX.Element;\n class?: string;\n};\n\ntype DataTablePanelContextValue = {\n headingId: string;\n hasHeading: Accessor<boolean>;\n registerHeading: () => void;\n};\n\nconst DataTablePanelContext = createContext<DataTablePanelContextValue>();\n\nconst defaultRender = (value: unknown, locale: string, messages: ReturnType<ReturnType<typeof useUiMessages>>): JSX.Element => {\n if (value === null || value === undefined || value === \"\") return \"—\";\n if (value instanceof Date) return value.toLocaleString(locale);\n if (typeof value === \"boolean\") return value ? messages.yes : messages.no;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n if (typeof value === \"string\") return value;\n return JSON.stringify(value);\n};\n\nconst renderColumnPart = <T,>(\n part: DataTableColumn<T>[\"header\"] | DataTableColumn<T>[\"subtitle\"],\n col: DataTableColumn<T>,\n): JSX.Element => {\n if (typeof part === \"function\") return part({ col });\n return part;\n};\n\nconst rowInteractiveSelector = [\n \"a[href]\",\n \"button\",\n \"input\",\n \"label\",\n \"select\",\n \"textarea\",\n \"summary\",\n \"[contenteditable]\",\n \"[role='button']\",\n \"[role='checkbox']\",\n \"[role='link']\",\n \"[role='menuitem']\",\n \"[role='option']\",\n \"[role='radio']\",\n \"[role='switch']\",\n \"[role='tab']\",\n \"[tabindex]\",\n].join(\",\");\n\nconst isNestedRowControl = (event: Event): boolean =>\n event.target instanceof Element && event.target.closest(rowInteractiveSelector) !== event.currentTarget;\n\n/** Distance in pixels before the table's end at which the next page is requested. */\nconst loadMoreMargin = 240;\n\ntype DataTableScrollbarAxis = \"x\" | \"y\";\ntype DataTableScrollbarMetrics = { overflow: boolean; offset: number; size: number };\n\nconst scrollbarMetrics = (viewportSize: number, contentSize: number, scrollOffset: number): DataTableScrollbarMetrics => {\n if (viewportSize <= 0 || contentSize <= viewportSize + 1) return { overflow: false, offset: 0, size: 0 };\n const size = Math.min(viewportSize, Math.max(24, (viewportSize * viewportSize) / contentSize));\n const offset = (scrollOffset / (contentSize - viewportSize)) * (viewportSize - size);\n return { overflow: true, offset, size };\n};\n\nfunction DataTableRoot<T>(props: DataTableProps<T>) {\n const messages = useUiMessages();\n const dataTableMessages = useDataTableMessages();\n const locale = useLocale();\n const [hoveredColumn, setHoveredColumn] = createSignal<number | null>(null);\n const [scrollbars, setScrollbars] = createSignal<Record<DataTableScrollbarAxis, DataTableScrollbarMetrics>>({\n x: { overflow: false, offset: 0, size: 0 },\n y: { overflow: false, offset: 0, size: 0 },\n });\n const [scrollbarEnhanced, setScrollbarEnhanced] = createSignal(false);\n const [scrolling, setScrolling] = createSignal(false);\n const panel = useContext(DataTablePanelContext);\n let tableRef: HTMLTableElement | undefined;\n let scrollRef: HTMLDivElement | undefined;\n let loadMoreRef: HTMLDivElement | undefined;\n let scrollingTimeout: ReturnType<typeof setTimeout> | undefined;\n let scrollbarDragOffset = 0;\n let hasMore = false;\n let loadingMore = false;\n let onLoadMore: (() => void) | undefined;\n let loadMoreRequested = false;\n let previousRowsLength = props.rows.length;\n let previousLoadingMore = !!props.loadingMore;\n let previousHasMore = !!props.hasMore;\n const loadingRows = () => Math.min(50, Math.max(1, Math.trunc(Number.isNaN(props.loadingRows) ? 5 : (props.loadingRows ?? 5))));\n const rowId = (row: T) => props.getRowId?.(row);\n const isInteractive = () => !!props.selection || !!props.onRowClick || !!props.onRowDoubleClick;\n const shouldHoverRows = () => props.hoverRows ?? isInteractive();\n const shouldRenderLoadMoreSentinel = () => !!props.onLoadMore;\n const labelledBy = () => props.ariaLabelledBy ?? (panel?.hasHeading() ? panel.headingId : undefined);\n const surface = () => props.surface ?? (props.class ? \"plain\" : \"paper\");\n const cellContentClass = () => props.cellContentClass ?? \"k2b-data-table__cell-text\";\n const tableClass = () => `k2b-data-table ${props.tableClass ?? \"\"}`.trim();\n const columnHighlighted = (index: number) =>\n props.highlightColumns !== false && shouldHoverRows() && hoveredColumn() === index ? \"true\" : undefined;\n const setHoveredColumnIfEnabled = (index: number) => {\n if (shouldHoverRows()) setHoveredColumn(index);\n };\n\n /**\n * A bounded table scrolls its own viewport. A table that grows with its rows\n * leaves scrolling to the page or an ancestor, so its end is measured against\n * the browser viewport instead.\n */\n const isNearBottom = () => {\n if (!scrollRef || !loadMoreRef) return false;\n if (scrollRef.scrollHeight > scrollRef.clientHeight + 1) {\n return scrollRef.scrollTop + scrollRef.clientHeight >= scrollRef.scrollHeight - loadMoreMargin;\n }\n return loadMoreRef.getBoundingClientRect().top <= window.innerHeight + loadMoreMargin;\n };\n\n const maybeLoadMore = () => {\n if (!hasMore || loadingMore || !onLoadMore) return;\n if (!isNearBottom()) {\n // Leaving the end re-arms a request the owner declined, for example while its first page was still loading.\n loadMoreRequested = false;\n return;\n }\n if (loadMoreRequested) return;\n loadMoreRequested = true;\n try {\n onLoadMore();\n } catch (error) {\n loadMoreRequested = false;\n throw error;\n }\n };\n\n const syncScrollbars = () => {\n if (!scrollRef) return;\n setScrollbars({\n x: scrollbarMetrics(scrollRef.clientWidth, scrollRef.scrollWidth, scrollRef.scrollLeft),\n y: scrollbarMetrics(scrollRef.clientHeight, scrollRef.scrollHeight, scrollRef.scrollTop),\n });\n };\n\n const revealScrollbars = () => {\n setScrolling(true);\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n scrollingTimeout = setTimeout(() => {\n setScrolling(false);\n scrollingTimeout = undefined;\n }, 700);\n };\n\n const onScroll = () => {\n syncScrollbars();\n revealScrollbars();\n maybeLoadMore();\n };\n\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n if (!scrollRef) return;\n const track = event.currentTarget;\n const metrics = scrollbars()[axis];\n const rect = track.getBoundingClientRect();\n const trackSize = axis === \"y\" ? rect.height : rect.width;\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n const available = Math.max(1, trackSize - metrics.size);\n const thumbOffset = Math.min(available, Math.max(0, pointerOffset - scrollbarDragOffset));\n const maxScroll = axis === \"y\" ? scrollRef.scrollHeight - scrollRef.clientHeight : scrollRef.scrollWidth - scrollRef.clientWidth;\n if (axis === \"y\") scrollRef.scrollTop = (thumbOffset / available) * maxScroll;\n else scrollRef.scrollLeft = (thumbOffset / available) * maxScroll;\n syncScrollbars();\n revealScrollbars();\n };\n\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n if (event.button !== 0) return;\n event.preventDefault();\n const metrics = scrollbars()[axis];\n const rect = event.currentTarget.getBoundingClientRect();\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n scrollbarDragOffset =\n event.target === event.currentTarget ? metrics.size / 2 : Math.min(metrics.size, Math.max(0, pointerOffset - metrics.offset));\n event.currentTarget.setPointerCapture(event.pointerId);\n // The track's own pointerup or pointercancel ends the hold.\n suppressTextSelection(event.pointerId);\n scrollFromPointer(event, axis);\n };\n\n const valueOf = (row: T, col: DataTableColumn<T>) => {\n if (typeof col.value === \"function\") return col.value(row);\n if (col.value) return row[col.value];\n return undefined;\n };\n\n const columnPresentation = createMemo(() => {\n const presentation = new Map<string, { align: NonNullable<DataTableColumn<T>[\"align\"]>; nowrap: boolean }>();\n for (const col of props.columns) {\n let numeric = false;\n let date = false;\n if (col.align === undefined || col.nowrap === undefined) {\n for (const row of props.rows) {\n const value = valueOf(row, col);\n if (value === null || value === undefined || value === \"\") continue;\n numeric = typeof value === \"number\" || typeof value === \"bigint\";\n date = value instanceof Date;\n break;\n }\n }\n presentation.set(col.id, { align: col.align ?? (numeric ? \"right\" : \"left\"), nowrap: col.nowrap ?? (numeric || date) });\n }\n return presentation;\n });\n\n /** `data-align` mirrors Cloud's `text-left/center/right` on the same cell. */\n const alignAttr = (col: DataTableColumn<T>) => {\n const align = columnPresentation().get(col.id)?.align ?? \"left\";\n return align === \"left\" ? undefined : align;\n };\n\n const nowrapAttr = (col: DataTableColumn<T>) => (columnPresentation().get(col.id)?.nowrap ? \"true\" : undefined);\n\n const sortKeyOf = (col: DataTableColumn<T>): string | null =>\n col.sortable === true ? col.id : typeof col.sortable === \"string\" ? col.sortable : null;\n\n /**\n * Sorting is a link by default: server-rendered tables keep the order in the\n * URL. Client tables pass onSortChange instead. Clicking the active column\n * flips its direction.\n */\n const nextSortFor = (key: string): DataTableSort => ({\n key,\n direction: props.sort?.key === key && props.sort?.direction === \"desc\" ? \"asc\" : \"desc\",\n });\n\n /** Only a sortable column carries a sort state; the rest carry none at all. */\n const ariaSortFor = (col: DataTableColumn<T>): \"ascending\" | \"descending\" | \"none\" | undefined => {\n const key = sortKeyOf(col);\n if (!key || (!props.sortHref && !props.onSortChange && !props.renderHeader)) return undefined;\n if (props.sort?.key !== key) return \"none\";\n return props.sort?.direction === \"asc\" ? \"ascending\" : \"descending\";\n };\n\n const renderHeaderDefault = (col: DataTableColumn<T>): JSX.Element => {\n const key = sortKeyOf(col);\n // Only how a column sorts decides the element. The order lives in its attributes, so a header button keeps\n // keyboard focus when a click sorts the table and the reader can press it again to reverse the order.\n const mode = createMemo(() => (!key ? null : props.sortHref ? \"link\" : props.onSortChange ? \"button\" : null));\n const active = () => key !== null && props.sort?.key === key;\n const title = () => (\n <>\n <span class=\"k2b-data-table__header-title\">{renderColumnPart(col.header, col)}</span>\n <Show when={col.subtitle !== undefined}>\n <span class=\"k2b-data-table__header-subtitle\">{renderColumnPart(col.subtitle, col)}</span>\n </Show>\n </>\n );\n const line = () => (\n <span class=\"k2b-data-table__header-line\">\n {title()}\n {/* Inactive columns keep a dimmed marker so the row reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${active() && props.sort?.direction === \"asc\" ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={active() ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </span>\n );\n\n return (\n <Switch\n fallback={\n <div class=\"k2b-data-table__header-content\" data-align={alignAttr(col)}>\n {title()}\n </div>\n }\n >\n <Match when={mode() === \"link\"}>\n <a\n href={key ? props.sortHref?.(nextSortFor(key)) : undefined}\n class=\"k2b-data-table__header-content k2b-data-table__sort\"\n data-align={alignAttr(col)}\n >\n {line()}\n </a>\n </Match>\n <Match when={mode() === \"button\"}>\n <button\n type=\"button\"\n class=\"k2b-data-table__header-content k2b-data-table__sort\"\n data-align={alignAttr(col)}\n onClick={() => key && props.onSortChange?.(nextSortFor(key))}\n >\n {line()}\n </button>\n </Match>\n </Switch>\n );\n };\n\n const renderValueDefault = (value: unknown) => defaultRender(value, locale(), messages());\n const renderCellDefault = (row: T, col: DataTableColumn<T>) => renderValueDefault(valueOf(row, col));\n\n const onRowKeyDown = (event: KeyboardEvent, row: T) => {\n if (!isInteractive()) return;\n if (isNestedRowControl(event)) return;\n const id = rowId(row);\n if (id !== undefined && props.selection?.keyDown(event, id)) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n (props.selection ? props.onRowDoubleClick : (props.onRowClick ?? props.onRowDoubleClick))?.(row);\n };\n\n const onRowClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n const id = rowId(row);\n if (id !== undefined) props.selection?.select(id, event);\n props.onRowClick?.(row);\n };\n\n const onRowDoubleClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n props.onRowDoubleClick?.(row);\n };\n\n const rowClass = (row: T) => {\n if (typeof props.rowClass === \"function\") return props.rowClass(row) ?? \"\";\n return props.rowClass ?? \"\";\n };\n\n onMount(() => {\n if (typeof IntersectionObserver === \"undefined\" || !loadMoreRef) return;\n // The viewport root notices the end whichever element scrolls; `isNearBottom` decides.\n const observer = new IntersectionObserver(maybeLoadMore, { rootMargin: `${loadMoreMargin}px` });\n observer.observe(loadMoreRef);\n onCleanup(() => observer.disconnect());\n });\n\n onMount(() => {\n setScrollbarEnhanced(true);\n syncScrollbars();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbars);\n if (scrollRef) observer?.observe(scrollRef);\n if (tableRef) observer?.observe(tableRef);\n onCleanup(() => {\n observer?.disconnect();\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n });\n });\n\n // Announced once per wait, outside the region that `aria-busy` keeps quiet.\n createEffect(\n on(\n () => !!props.loading && props.rows.length === 0,\n (waiting) => {\n if (waiting) announce(dataTableMessages().loadingRows);\n },\n ),\n );\n\n createEffect(() => {\n const rowsLength = props.rows.length;\n const nextHasMore = !!props.hasMore;\n const nextLoadingMore = !!props.loadingMore;\n if (rowsLength !== previousRowsLength || (previousLoadingMore && !nextLoadingMore) || (!previousHasMore && nextHasMore)) {\n loadMoreRequested = false;\n }\n previousRowsLength = rowsLength;\n previousLoadingMore = nextLoadingMore;\n previousHasMore = nextHasMore;\n hasMore = nextHasMore;\n loadingMore = nextLoadingMore;\n onLoadMore = props.onLoadMore;\n maybeLoadMore();\n queueMicrotask(syncScrollbars);\n });\n\n return (\n <Show when={props.columns.length > 0} fallback={<Placeholder surface=\"paper\" description={<>{dataTableMessages().noColumns}</>} />}>\n <Dynamic\n component={surface() === \"paper\" ? Paper : \"div\"}\n class={`k2b-table-shell ${props.class ?? \"\"}`}\n data-surface={surface()}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-overflow-x={scrollbars().x.overflow ? \"true\" : undefined}\n data-overflow-y={scrollbars().y.overflow ? \"true\" : undefined}\n data-scrollbar-enhanced={scrollbarEnhanced() ? \"true\" : undefined}\n data-scrolling={scrolling() ? \"true\" : undefined}\n onMouseLeave={() => setHoveredColumn(null)}\n >\n <div\n ref={scrollRef}\n role=\"region\"\n aria-label={labelledBy() ? undefined : (props.ariaLabel ?? dataTableMessages().dataTable)}\n aria-labelledby={labelledBy()}\n aria-busy={props.loading ? \"true\" : undefined}\n tabIndex={0}\n class={`k2b-table-wrap${props.scrollClass ? ` ${props.scrollClass}` : \"\"}`}\n data-density={props.density === \"compact\" ? \"compact\" : undefined}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-surface={surface()}\n data-scroll-preserve={props.scrollPreserveKey || undefined}\n onScroll={onScroll}\n >\n <table\n ref={tableRef}\n class={tableClass()}\n data-fill={props.fillHeight ? \"true\" : undefined}\n data-wide={props.columns.length > WIDE_TABLE_COLUMNS ? \"true\" : undefined}\n >\n <Show when={props.loading}>\n {/* Names the table while it waits; the announcement goes through the shared live region outside the busy region. */}\n <caption class=\"k2b-sr-only\">{dataTableMessages().loadingRows}</caption>\n </Show>\n <thead class=\"k2b-data-table__head\" data-sticky={props.stickyHeader === false ? undefined : \"true\"}>\n <tr class=\"k2b-data-table__head-row\">\n <For each={props.columns}>\n {(col, index) => (\n <th\n scope=\"col\"\n class={`${col.headerClass ?? \"\"} ${col.class ?? \"\"}`}\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n aria-sort={ariaSortFor(col)}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {props.renderHeader ? props.renderHeader({ col, render: () => renderHeaderDefault(col) }) : renderHeaderDefault(col)}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <Show\n when={props.rows.length > 0}\n fallback={\n <Show\n when={props.loading}\n fallback={\n <tr>\n <td class=\"k2b-data-table__empty\" colspan={props.columns.length}>\n <Placeholder description={<>{props.empty ?? dataTableMessages().noRecords}</>} />\n </td>\n </tr>\n }\n >\n <For each={Array.from({ length: loadingRows() })}>\n {() => (\n <tr class=\"k2b-data-table__row\" data-loading=\"true\" aria-hidden=\"true\">\n <For each={props.columns}>\n {(col) => (\n <td data-align={alignAttr(col)}>\n <span class=\"k2b-data-table__skeleton\" />\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n {/* The spacer takes the spare height while loading too, so rows keep their height when data arrives. */}\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={props.columns.length} />\n </tr>\n </Show>\n </Show>\n }\n >\n <For each={props.rows}>\n {(row) => {\n const id = () => rowId(row);\n const isSelected = () =>\n props.selection ? props.selection.selected().has(id() ?? \"\") : props.selectedRowId && id() === props.selectedRowId;\n return (\n <tr\n ref={(element) => {\n const key = id();\n if (key !== undefined) props.selection?.register(key, element);\n }}\n class={`k2b-data-table__row ${rowClass(row)}`}\n data-hover={shouldHoverRows() ? \"true\" : undefined}\n data-clickable={shouldHoverRows() && isInteractive() ? \"true\" : undefined}\n data-selected={isSelected() ? \"true\" : undefined}\n aria-selected={props.selection ? !!isSelected() : undefined}\n tabIndex={props.selection ? (props.selection.focused() === id() ? 0 : -1) : isInteractive() ? 0 : undefined}\n onFocus={() => {\n const key = id();\n if (key !== undefined) props.selection?.markFocused(key);\n }}\n onClick={(event) => onRowClick(event, row)}\n onDblClick={(event) => onRowDoubleClick(event, row)}\n onContextMenu={() => props.onRowContextMenu?.(row)}\n onKeyDown={(e) => onRowKeyDown(e, row)}\n >\n <For each={props.columns}>\n {(col, index) => {\n const value = () => valueOf(row, col);\n return (\n <td\n class={`${col.cellClass ?? \"\"} ${col.class ?? \"\"}`}\n data-nowrap={nowrapAttr(col)}\n data-align={alignAttr(col)}\n data-valign={props.verticalAlign && props.verticalAlign !== \"middle\" ? props.verticalAlign : undefined}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n <div class={cellContentClass()}>\n {props.renderCell\n ? props.renderCell({\n row,\n col,\n value: value(),\n render: (v) => renderCellDefault(row, { ...col, value: () => v }),\n })\n : renderValueDefault(value())}\n </div>\n </td>\n );\n }}\n </For>\n </tr>\n );\n }}\n </For>\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={props.columns.length} />\n </tr>\n </Show>\n </Show>\n </tbody>\n <Show when={props.footer}>\n {(footer) => (\n <tfoot class=\"k2b-data-table__foot\" data-sticky=\"true\">\n <tr class=\"k2b-data-table__foot-row\">\n <For each={props.columns}>\n {(col, index) => {\n const value = () => footer().values?.[col.id];\n return (\n <td\n class=\"k2b-data-table__footer-cell\"\n data-nowrap={nowrapAttr(col)}\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {footer().renderCell\n ? footer().renderCell!({ col, value: value(), render: renderValueDefault })\n : renderValueDefault(value())}\n </td>\n );\n }}\n </For>\n </tr>\n </tfoot>\n )}\n </Show>\n </table>\n <Show when={shouldRenderLoadMoreSentinel()}>\n <div ref={loadMoreRef} class=\"k2b-data-table__sentinel\" aria-hidden=\"true\" />\n </Show>\n </div>\n <For each={[\"y\", \"x\"] as const}>\n {(axis) => (\n <div\n class=\"k2b-data-table__scrollbar\"\n data-axis={axis}\n data-overflow={scrollbars()[axis].overflow ? \"true\" : undefined}\n aria-hidden=\"true\"\n onPointerDown={(event) => startScrollbarDrag(event, axis)}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event, axis);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-data-table-scroll-offset\": `${scrollbars()[axis].offset}px`,\n \"--k2b-data-table-scroll-size\": `${scrollbars()[axis].size}px`,\n }}\n />\n </div>\n )}\n </For>\n </Dynamic>\n </Show>\n );\n}\n\nconst DataTablePanel = (props: DataTablePanelProps): JSX.Element => {\n const headingId = `k2b-data-table-${createUniqueId()}-heading`;\n const [hasHeading, setHasHeading] = createSignal(false);\n const context: DataTablePanelContextValue = {\n headingId,\n hasHeading,\n registerHeading: () => setHasHeading(true),\n };\n\n return (\n <DataTablePanelContext.Provider value={context}>\n <Paper as=\"section\" class={`k2b-data-panel ${props.class ?? \"\"}`}>\n {props.children}\n </Paper>\n </DataTablePanelContext.Provider>\n );\n};\n\nconst DataTableHeader = (props: DataTableHeaderProps): JSX.Element => {\n const panel = useContext(DataTablePanelContext);\n panel?.registerHeading();\n\n return (\n <div class={`k2b-data-panel__header ${props.class ?? \"\"}`}>\n <PanelHeader\n title={<span id={panel?.headingId}>{props.title}</span>}\n subtitle={props.subtitle}\n actions={props.children}\n as={props.as}\n size={props.size}\n />\n </div>\n );\n};\n\nconst DataTableControls = (props: DataTableControlsProps): JSX.Element => (\n <div class={`k2b-data-panel__controls ${props.class ?? \"\"}`}>{props.children}</div>\n);\n\nconst DataTablePanelFooter = (props: DataTablePanelFooterProps): JSX.Element => (\n <footer class={`k2b-data-panel__footer ${props.class ?? \"\"}`}>{props.children}</footer>\n);\n\ntype DataTableComponent = {\n <T>(props: DataTableProps<T>): JSX.Element;\n Panel: (props: DataTablePanelProps) => JSX.Element;\n Header: (props: DataTableHeaderProps) => JSX.Element;\n Controls: (props: DataTableControlsProps) => JSX.Element;\n Footer: (props: DataTablePanelFooterProps) => JSX.Element;\n};\n\nconst DataTable = DataTableRoot as DataTableComponent;\nDataTable.Panel = DataTablePanel;\nDataTable.Header = DataTableHeader;\nDataTable.Controls = DataTableControls;\nDataTable.Footer = DataTablePanelFooter;\n\nexport default DataTable;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ssr as _$ssr } from "solid-js/web";
|
|
2
|
+
import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
3
|
+
import { escape as _$escape } from "solid-js/web";
|
|
4
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
5
|
+
var _tmpl$ = ["<a", " target=\"_blank\" rel=\"noopener noreferrer\">", "</a>"];
|
|
6
|
+
import { For } from "solid-js";
|
|
7
|
+
import { mapAttribution } from "./map-style";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The required credits for maps built with `mapStyle()`, each one a link, for MapView's `attribution` slot.
|
|
11
|
+
* @example <MapView style={style} attribution={<MapAttribution />} height={320} />
|
|
12
|
+
*/
|
|
13
|
+
export function MapAttribution() {
|
|
14
|
+
return _$createComponent(For, {
|
|
15
|
+
each: mapAttribution,
|
|
16
|
+
children: (part, index) => [index() > 0 ? " · " : "", _$ssr(_tmpl$, _$ssrAttribute("href", _$escape(part.href, true), false), _$escape(part.label))]
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=MapAttribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/MapAttribution.tsx"],"sourcesContent":["import { For, type JSX } from \"solid-js\";\nimport { mapAttribution } from \"./map-style\";\n\n/**\n * The required credits for maps built with `mapStyle()`, each one a link, for MapView's `attribution` slot.\n * @example <MapView style={style} attribution={<MapAttribution />} height={320} />\n */\nexport function MapAttribution(): JSX.Element {\n return (\n <For each={mapAttribution}>\n {(part, index) => (\n <>\n {index() > 0 ? \" · \" : \"\"}\n <a href={part.href} target=\"_blank\" rel=\"noopener noreferrer\">\n {part.label}\n </a>\n </>\n )}\n </For>\n );\n}\n"],"mappings":";;;;;AAAA,SAAS,GAAG,QAAkB,UAAU;AACxC,SAAS,cAAc,QAAQ,aAAa;;AAE5C;AACA;AACA;AACA;AACA,OAAO,SAAS,cAAc,GAAgB;EAC5C,yBACG,GAAG;IAAC,IAAI,EAAE,cAAc;IAAA,UACtB,CAAC,IAAI,EAAE,KAAK,MAER,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE,gDAChB,IAAI,CAAC,IAAI,0BACf,IAAI,CAAC,KAAK;EAGhB;AAGP","ignoreList":[]}
|