@rio-cloud/rio-uikit 2.3.0-beta.2 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Marker.js +9 -5
- package/Table.js +10 -9
- package/TableNext.js +10 -9
- package/TableRowActionsDropdown.d.ts +2 -0
- package/TableRowActionsDropdown.js +5 -0
- package/TableRowActionsDropdown.js.map +1 -0
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.d.ts +38 -3
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.js +104 -109
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.js.map +1 -1
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.d.ts +24 -5
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.js +60 -56
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.js.map +1 -1
- package/components/datepicker/DayPicker.js +72 -70
- package/components/datepicker/DayPicker.js.map +1 -1
- package/components/datepicker/DayPickerDropdown.d.ts +1 -0
- package/components/datepicker/DayPickerDropdown.js +61 -48
- package/components/datepicker/DayPickerDropdown.js.map +1 -1
- package/components/datepicker/useStackedDayPickerCalendars.js +26 -26
- package/components/datepicker/useStackedDayPickerCalendars.js.map +1 -1
- package/components/dropdown/ButtonDropdown.d.ts +4 -0
- package/components/dropdown/ButtonDropdown.js +82 -80
- package/components/dropdown/ButtonDropdown.js.map +1 -1
- package/components/listMenu/ListMenu.d.ts +8 -0
- package/components/listMenu/ListMenu.js +74 -66
- package/components/listMenu/ListMenu.js.map +1 -1
- package/components/map/components/Map.js +207 -156
- package/components/map/components/Map.js.map +1 -1
- package/components/map/components/MapContext.d.ts +3 -0
- package/components/map/components/MapContext.js +9 -6
- package/components/map/components/MapContext.js.map +1 -1
- package/components/map/components/features/MapZoom.js +19 -19
- package/components/map/components/features/MapZoom.js.map +1 -1
- package/components/map/components/features/Route.d.ts +65 -1
- package/components/map/components/features/Route.js +184 -98
- package/components/map/components/features/Route.js.map +1 -1
- package/components/map/components/features/basics/Marker.d.ts +21 -1
- package/components/map/components/features/basics/Marker.js +99 -40
- package/components/map/components/features/basics/Marker.js.map +1 -1
- package/components/map/components/features/basics/Polygon.d.ts +24 -1
- package/components/map/components/features/basics/Polygon.js +72 -19
- package/components/map/components/features/basics/Polygon.js.map +1 -1
- package/components/map/components/features/basics/Polyline.d.ts +29 -0
- package/components/map/components/features/basics/Polyline.js +69 -39
- package/components/map/components/features/basics/Polyline.js.map +1 -1
- package/components/map/components/features/layers/MarkerLayer.js +8 -8
- package/components/map/components/features/layers/MarkerLayer.js.map +1 -1
- package/components/map/components/features/layers/clustering/SimpleClusterLayer.js +13 -6
- package/components/map/components/features/layers/clustering/SimpleClusterLayer.js.map +1 -1
- package/components/map/utils/clustering.d.ts +1 -1
- package/components/map/utils/clustering.js +30 -30
- package/components/map/utils/clustering.js.map +1 -1
- package/components/map/utils/mapTypes.d.ts +141 -0
- package/components/map/utils/mapTypes.js.map +1 -1
- package/components/map/utils/mapUtils.d.ts +2 -0
- package/components/map/utils/mapUtils.js +4 -0
- package/components/map/utils/mapUtils.js.map +1 -1
- package/components/mapMarker/ClusterMapMarker.d.ts +2 -0
- package/components/mapMarker/ClusterMapMarker.js.map +1 -1
- package/components/mapMarker/SingleMapMarker.d.ts +2 -0
- package/components/mapMarker/SingleMapMarker.js.map +1 -1
- package/components/selects/ClearButton.js +9 -7
- package/components/selects/ClearButton.js.map +1 -1
- package/components/table/Table.d.ts +3 -1
- package/components/table/Table.js +239 -216
- package/components/table/Table.js.map +1 -1
- package/components/table/Table.types.d.ts +62 -4
- package/components/table/TableColumn.d.ts +8 -1
- package/components/table/TableColumn.js +66 -64
- package/components/table/TableColumn.js.map +1 -1
- package/components/table/TableExpandedRow.d.ts +4 -0
- package/components/table/TableExpandedRow.js +70 -67
- package/components/table/TableExpandedRow.js.map +1 -1
- package/components/table/TableGroupRow.d.ts +3 -1
- package/components/table/TableGroupRow.js +15 -14
- package/components/table/TableGroupRow.js.map +1 -1
- package/components/table/TableHeader.d.ts +9 -0
- package/components/table/TableHeader.js +110 -81
- package/components/table/TableHeader.js.map +1 -1
- package/components/table/TableHeaderColumn.d.ts +11 -1
- package/components/table/TableHeaderColumn.js +63 -58
- package/components/table/TableHeaderColumn.js.map +1 -1
- package/components/table/TableRow.d.ts +12 -0
- package/components/table/TableRow.js +78 -74
- package/components/table/TableRow.js.map +1 -1
- package/components/table/TableRowActionsDropdown.d.ts +11 -0
- package/components/table/TableRowActionsDropdown.js +22 -0
- package/components/table/TableRowActionsDropdown.js.map +1 -0
- package/components/table/TableStickyRowButton.d.ts +25 -0
- package/components/table/TableStickyRowButton.js +32 -0
- package/components/table/TableStickyRowButton.js.map +1 -0
- package/components/table/TableToolbar.d.ts +24 -3
- package/components/table/TableToolbar.js +78 -37
- package/components/table/TableToolbar.js.map +1 -1
- package/components/table/TableViewToggles.js +5 -5
- package/components/table/TableViewToggles.js.map +1 -1
- package/components/table/context/TableInteractionContext.d.ts +3 -0
- package/components/table/context/TableInteractionContext.js.map +1 -1
- package/components/table/context/TableLayoutContext.d.ts +1 -0
- package/components/table/context/TableLayoutContext.js.map +1 -1
- package/components/table/context/TableRenderContext.d.ts +1 -0
- package/components/table/context/TableRenderContext.js.map +1 -1
- package/components/table/layout/useHorizontalSectionSync.d.ts +2 -1
- package/components/table/layout/useHorizontalSectionSync.js +32 -31
- package/components/table/layout/useHorizontalSectionSync.js.map +1 -1
- package/components/table/layout/useMeasuredColumnMaxWidths.js +52 -54
- package/components/table/layout/useMeasuredColumnMaxWidths.js.map +1 -1
- package/components/table/layout/useTableLayout.d.ts +6 -2
- package/components/table/layout/useTableLayout.js +61 -48
- package/components/table/layout/useTableLayout.js.map +1 -1
- package/components/table/layout/useTableVirtualization.js +51 -56
- package/components/table/layout/useTableVirtualization.js.map +1 -1
- package/components/table/model/resolveResponsiveViewType.d.ts +2 -0
- package/components/table/model/resolveResponsiveViewType.js +27 -0
- package/components/table/model/resolveResponsiveViewType.js.map +1 -0
- package/components/table/render/header/TableDraggableHeaderCell.js +38 -36
- package/components/table/render/header/TableDraggableHeaderCell.js.map +1 -1
- package/components/table/render/header/TableHeader.types.d.ts +2 -0
- package/components/table/render/header/TableHeaderCellContent.js +16 -16
- package/components/table/render/header/TableHeaderCellContent.js.map +1 -1
- package/components/table/render/header/TableHeaderSelectionCell.d.ts +1 -0
- package/components/table/render/header/TableHeaderSelectionCell.js +13 -12
- package/components/table/render/header/TableHeaderSelectionCell.js.map +1 -1
- package/components/table/render/header/TableStaticHeaderCell.js +31 -29
- package/components/table/render/header/TableStaticHeaderCell.js.map +1 -1
- package/components/table/render/header/resolveHeaderCellClassName.d.ts +1 -0
- package/components/table/render/header/resolveHeaderCellClassName.js +10 -9
- package/components/table/render/header/resolveHeaderCellClassName.js.map +1 -1
- package/components/table/runtime/useResolvedRenderColumns.d.ts +4 -4
- package/components/table/runtime/useResolvedRenderColumns.js +13 -13
- package/components/table/runtime/useResolvedRenderColumns.js.map +1 -1
- package/components/table/runtime/useResolvedRenderHeader.d.ts +1 -1
- package/components/table/runtime/useResolvedRenderHeader.js.map +1 -1
- package/components/table/runtime/useResponsiveResolvedViewType.d.ts +23 -0
- package/components/table/runtime/useResponsiveResolvedViewType.js +22 -0
- package/components/table/runtime/useResponsiveResolvedViewType.js.map +1 -0
- package/components/table/selection/useInternalTableSelectionState.d.ts +2 -0
- package/components/table/selection/useInternalTableSelectionState.js +27 -17
- package/components/table/selection/useInternalTableSelectionState.js.map +1 -1
- package/components/table/selection/useTableSelection.d.ts +5 -1
- package/components/table/selection/useTableSelection.js +37 -26
- package/components/table/selection/useTableSelection.js.map +1 -1
- package/components/table/shared/parsePixelSize.d.ts +2 -0
- package/components/table/shared/parsePixelSize.js +13 -0
- package/components/table/shared/parsePixelSize.js.map +1 -0
- package/hooks/useDraggableElement.d.ts +27 -5
- package/hooks/useDraggableElement.js +100 -23
- package/hooks/useDraggableElement.js.map +1 -1
- package/hooks/usePopperDropdown.d.ts +1 -0
- package/hooks/usePopperDropdown.js +15 -12
- package/hooks/usePopperDropdown.js.map +1 -1
- package/hooks/useResizeObserver.d.ts +25 -6
- package/hooks/useResizeObserver.js +20 -18
- package/hooks/useResizeObserver.js.map +1 -1
- package/package.json +10 -10
- package/utils/analytics/createAnalyticsOverlayTooltip.js.map +1 -1
- package/utils/init/initConfig.js +5 -5
- package/utils/init/initConfig.js.map +1 -1
- package/version.d.ts +1 -1
- package/version.js +2 -2
- package/version.js.map +1 -1
|
@@ -1,12 +1,33 @@
|
|
|
1
1
|
import { PropsWithChildren } from 'react';
|
|
2
2
|
import { default as TableToolbarColumn } from './TableToolbarColumn';
|
|
3
|
+
export { TableToolbarColumn };
|
|
4
|
+
export type { TableToolbarColumnHorizontalAlign, TableToolbarColumnProps, TableToolbarColumnVerticalAlign, } from './TableToolbarColumn';
|
|
3
5
|
export type TableToolbarProps = {
|
|
4
6
|
/**
|
|
5
7
|
* Optional class names for the wrapper element.
|
|
6
8
|
*/
|
|
7
9
|
className?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Optional class names for the card that wraps collapsed toolbar controls
|
|
12
|
+
* in the compact mobile layout.
|
|
13
|
+
*/
|
|
14
|
+
collapseCardClassName?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Optional toolbar width in pixels at which the toolbar switches into its compact
|
|
17
|
+
* mobile/collapsible layout.
|
|
18
|
+
*
|
|
19
|
+
* @default 544
|
|
20
|
+
*/
|
|
21
|
+
responsiveCollapseBreakpoint?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Disables the compact mobile/collapsible toolbar layout.
|
|
24
|
+
*
|
|
25
|
+
* Use this as an escape hatch when a consuming service needs to keep the
|
|
26
|
+
* default wrapping toolbar behavior regardless of the available toolbar width.
|
|
27
|
+
*
|
|
28
|
+
* @default false
|
|
29
|
+
*/
|
|
30
|
+
disableResponsiveCollapse?: boolean;
|
|
8
31
|
};
|
|
9
|
-
declare const TableToolbar: (
|
|
32
|
+
declare const TableToolbar: (props: PropsWithChildren<TableToolbarProps>) => import("react/jsx-runtime").JSX.Element;
|
|
10
33
|
export default TableToolbar;
|
|
11
|
-
export { TableToolbarColumn };
|
|
12
|
-
export type { TableToolbarColumnHorizontalAlign, TableToolbarColumnProps, TableToolbarColumnVerticalAlign, } from './TableToolbarColumn';
|
|
@@ -1,52 +1,93 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useRef as
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { jsx as o, jsxs as c, Fragment as k } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as C, useState as x, useLayoutEffect as D, useEffect as G, Children as w, isValidElement as N, Fragment as P } from "react";
|
|
3
|
+
import I from "../../hooks/useResizeObserver.js";
|
|
4
|
+
import K from "../../hooks/useMergeRefs.js";
|
|
5
|
+
import m from "../../utils/classNames.js";
|
|
6
|
+
import U from "../button/ToggleButton.js";
|
|
7
|
+
import V from "../collapse/Collapse.js";
|
|
8
|
+
import $ from "../card/Card.js";
|
|
9
|
+
import q from "./TableSearch.js";
|
|
10
|
+
import J from "./TableToolbarColumn.js";
|
|
11
|
+
const Q = 544, X = (r) => N(r) && r.type === J, B = (r) => {
|
|
12
|
+
const e = [];
|
|
13
|
+
for (const l of w.toArray(r)) {
|
|
14
|
+
if (N(l) && l.type === P) {
|
|
15
|
+
const t = B(l.props.children);
|
|
16
|
+
if (!t)
|
|
12
17
|
return null;
|
|
13
|
-
|
|
18
|
+
e.push(...t);
|
|
14
19
|
continue;
|
|
15
20
|
}
|
|
16
|
-
if (!
|
|
21
|
+
if (!X(l))
|
|
17
22
|
return null;
|
|
18
|
-
|
|
23
|
+
e.push(l);
|
|
19
24
|
}
|
|
20
|
-
return
|
|
21
|
-
},
|
|
22
|
-
if (!
|
|
25
|
+
return e;
|
|
26
|
+
}, F = (r, e) => w.toArray(r).some((l) => N(l) ? l.type === e ? !0 : F(l.props.children, e) : !1), v = (r) => {
|
|
27
|
+
if (!r)
|
|
23
28
|
return !1;
|
|
24
|
-
const
|
|
25
|
-
if (
|
|
29
|
+
const e = Array.from(r.children);
|
|
30
|
+
if (e.length < 2)
|
|
26
31
|
return !1;
|
|
27
|
-
const
|
|
28
|
-
return
|
|
29
|
-
},
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}, [
|
|
32
|
+
const l = (e[0]?.offsetTop ?? 0) + (e[0]?.offsetHeight ?? 0);
|
|
33
|
+
return e.some((t) => t.offsetTop + t.offsetHeight !== l);
|
|
34
|
+
}, ie = (r) => {
|
|
35
|
+
const {
|
|
36
|
+
className: e,
|
|
37
|
+
collapseCardClassName: l,
|
|
38
|
+
children: t,
|
|
39
|
+
responsiveCollapseBreakpoint: H = Q,
|
|
40
|
+
disableResponsiveCollapse: _ = !1
|
|
41
|
+
} = r, R = C(null), T = C(null), y = C(null), [M, S] = x(!1), [f, A] = x(!1), [W, , { inlineSize: z }] = I(), [p, , { inlineSize: j }] = I(), L = K(R, W), i = !_ && z !== void 0 && z <= H, u = B(t), s = (u ?? []).filter((a) => a.props.horizontalAlign !== "right"), n = (u ?? []).filter((a) => a.props.horizontalAlign === "right"), d = n.findIndex(
|
|
42
|
+
(a) => F(a.props.children, q)
|
|
43
|
+
), h = d >= 0 ? n[d] : void 0, E = h ? n.filter((a, g) => g !== d) : n, b = i && E.length > 0, O = b && /* @__PURE__ */ o("div", { className: "table-toolbar-mobile-toggle", children: /* @__PURE__ */ o(
|
|
44
|
+
U,
|
|
45
|
+
{
|
|
46
|
+
active: f,
|
|
47
|
+
"aria-label": f ? "Hide toolbar filters" : "Show toolbar filters",
|
|
48
|
+
bsStyle: "default",
|
|
49
|
+
iconName: "rioglyph-option-horizontal",
|
|
50
|
+
iconOnly: !0,
|
|
51
|
+
onClick: A
|
|
52
|
+
}
|
|
53
|
+
) });
|
|
54
|
+
return D(() => {
|
|
55
|
+
if (i) {
|
|
56
|
+
S(!1);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const a = R.current;
|
|
60
|
+
a?.classList.add("table-toolbar-measuring");
|
|
61
|
+
const g = v(p.current) || v(T.current) || v(y.current);
|
|
62
|
+
a?.classList.remove("table-toolbar-measuring"), S(g);
|
|
63
|
+
}, [t, i, s.length, n.length, j]), G(() => {
|
|
64
|
+
(!i || !b) && A(!1);
|
|
65
|
+
}, [b, i]), u?.length ? i ? /* @__PURE__ */ o("div", { className: m("table-toolbar", "table-toolbar-mobile", e), ref: L, children: /* @__PURE__ */ c("div", { className: "table-toolbar-container table-toolbar-container-mobile", ref: p, children: [
|
|
66
|
+
h ? /* @__PURE__ */ c(k, { children: [
|
|
67
|
+
s.length > 0 && /* @__PURE__ */ o("div", { className: "table-toolbar-mobile-primary", children: /* @__PURE__ */ o("div", { className: "table-toolbar-group-left table-toolbar-group-left-mobile", children: s }) }),
|
|
68
|
+
/* @__PURE__ */ c("div", { className: "table-toolbar-mobile-search-row", children: [
|
|
69
|
+
/* @__PURE__ */ o("div", { className: "table-toolbar-mobile-search", children: h }),
|
|
70
|
+
O
|
|
71
|
+
] })
|
|
72
|
+
] }) : /* @__PURE__ */ c("div", { className: "table-toolbar-mobile-primary", children: [
|
|
73
|
+
s.length > 0 && /* @__PURE__ */ o("div", { className: "table-toolbar-group-left table-toolbar-group-left-mobile", children: s }),
|
|
74
|
+
O
|
|
75
|
+
] }),
|
|
76
|
+
b && /* @__PURE__ */ o(V, { open: f, timeout: 220, children: /* @__PURE__ */ o($, { className: m("table-toolbar-mobile-collapse-card", l), children: /* @__PURE__ */ o("div", { className: "table-toolbar-mobile-collapse", children: E }) }) })
|
|
77
|
+
] }) }) : /* @__PURE__ */ o(
|
|
37
78
|
"div",
|
|
38
79
|
{
|
|
39
|
-
className:
|
|
40
|
-
ref:
|
|
41
|
-
children: /* @__PURE__ */
|
|
42
|
-
|
|
43
|
-
|
|
80
|
+
className: m("table-toolbar", M && "table-toolbar-has-wrap", e),
|
|
81
|
+
ref: L,
|
|
82
|
+
children: /* @__PURE__ */ c("div", { className: "table-toolbar-container", ref: p, children: [
|
|
83
|
+
s.length > 0 && /* @__PURE__ */ o("div", { className: "table-toolbar-group-left", ref: T, children: s }),
|
|
84
|
+
n.length > 0 && /* @__PURE__ */ o("div", { className: "table-toolbar-group-right", ref: y, children: n })
|
|
44
85
|
] })
|
|
45
86
|
}
|
|
46
|
-
) : /* @__PURE__ */
|
|
87
|
+
) : /* @__PURE__ */ o("div", { className: m("table-toolbar", e), children: t });
|
|
47
88
|
};
|
|
48
89
|
export {
|
|
49
|
-
|
|
50
|
-
|
|
90
|
+
J as TableToolbarColumn,
|
|
91
|
+
ie as default
|
|
51
92
|
};
|
|
52
93
|
//# sourceMappingURL=TableToolbar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableToolbar.js","sources":["../../../src/components/table/TableToolbar.tsx"],"sourcesContent":["import {\n Children,\n Fragment,\n isValidElement,\n useLayoutEffect,\n useRef,\n useState,\n type PropsWithChildren,\n type ReactElement,\n type ReactNode,\n} from 'react';\n\nimport useResizeObserver from '../../hooks/useResizeObserver';\nimport classNames from '../../utils/classNames';\nimport TableToolbarColumn, { type TableToolbarColumnProps } from './TableToolbarColumn';\n\nexport type TableToolbarProps = {\n /**\n * Optional class names for the wrapper element.\n */\n className?: string;\n};\n\ntype TableToolbarColumnElement = ReactElement<PropsWithChildren<TableToolbarColumnProps>, typeof TableToolbarColumn>;\n\nconst isTableToolbarColumnElement = (child: ReactNode): child is TableToolbarColumnElement =>\n isValidElement(child) && child.type === TableToolbarColumn;\n\nconst collectToolbarColumns = (children: ReactNode): TableToolbarColumnElement[] | null => {\n const columns: TableToolbarColumnElement[] = [];\n\n for (const child of Children.toArray(children)) {\n if (isValidElement(child) && child.type === Fragment) {\n const fragmentColumns = collectToolbarColumns(child.props.children);\n\n if (!fragmentColumns) {\n return null;\n }\n\n columns.push(...fragmentColumns);\n continue;\n }\n\n if (!isTableToolbarColumnElement(child)) {\n return null;\n }\n\n columns.push(child);\n }\n\n return columns;\n};\n\nconst hasWrappedFlexItems = (containerElement: HTMLDivElement | null) => {\n if (!containerElement) {\n return false;\n }\n\n const itemElements = Array.from(containerElement.children) as HTMLElement[];\n\n if (itemElements.length < 2) {\n return false;\n }\n\n const firstLineBottom = (itemElements[0]?.offsetTop ?? 0) + (itemElements[0]?.offsetHeight ?? 0);\n\n return itemElements.some(itemElement => itemElement.offsetTop + itemElement.offsetHeight !== firstLineBottom);\n};\n\nconst TableToolbar = ({ className, children }: PropsWithChildren<TableToolbarProps>) => {\n const toolbarRef = useRef<HTMLDivElement | null>(null);\n const leftGroupRef = useRef<HTMLDivElement | null>(null);\n const rightGroupRef = useRef<HTMLDivElement | null>(null);\n\n const [hasWrappedRows, setHasWrappedRows] = useState(false);\n\n const [toolbarContainerRef, , { inlineSize: toolbarInlineSize }] = useResizeObserver<HTMLDivElement>();\n\n const toolbarColumns = collectToolbarColumns(children);\n\n const leftColumns = (toolbarColumns ?? []).filter(column => column.props.horizontalAlign !== 'right');\n const rightColumns = (toolbarColumns ?? []).filter(column => column.props.horizontalAlign === 'right');\n\n useLayoutEffect(() => {\n const toolbarElement = toolbarRef.current;\n\n toolbarElement?.classList.add('table-toolbar-measuring');\n\n const nextHasWrappedRows =\n hasWrappedFlexItems(toolbarContainerRef.current) ||\n hasWrappedFlexItems(leftGroupRef.current) ||\n hasWrappedFlexItems(rightGroupRef.current);\n\n toolbarElement?.classList.remove('table-toolbar-measuring');\n\n setHasWrappedRows(nextHasWrappedRows);\n }, [children, leftColumns.length, rightColumns.length, toolbarInlineSize]);\n\n if (!toolbarColumns?.length) {\n return <div className={classNames('table-toolbar', className)}>{children}</div>;\n }\n\n return (\n <div\n className={classNames('table-toolbar', hasWrappedRows && 'table-toolbar-has-wrap', className)}\n ref={toolbarRef}\n >\n <div className='table-toolbar-container' ref={toolbarContainerRef}>\n {leftColumns.length > 0 && (\n <div className='table-toolbar-group-left' ref={leftGroupRef}>\n {leftColumns}\n </div>\n )}\n {rightColumns.length > 0 && (\n <div className='table-toolbar-group-right' ref={rightGroupRef}>\n {rightColumns}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default TableToolbar;\nexport { TableToolbarColumn };\nexport type {\n TableToolbarColumnHorizontalAlign,\n TableToolbarColumnProps,\n TableToolbarColumnVerticalAlign,\n} from './TableToolbarColumn';\n"],"names":["isTableToolbarColumnElement","child","isValidElement","TableToolbarColumn","collectToolbarColumns","children","columns","Children","Fragment","fragmentColumns","hasWrappedFlexItems","containerElement","itemElements","firstLineBottom","itemElement","TableToolbar","className","toolbarRef","useRef","leftGroupRef","rightGroupRef","hasWrappedRows","setHasWrappedRows","useState","toolbarContainerRef","toolbarInlineSize","useResizeObserver","toolbarColumns","leftColumns","column","rightColumns","useLayoutEffect","toolbarElement","nextHasWrappedRows","jsx","classNames","jsxs"],"mappings":";;;;;AAyBA,MAAMA,IAA8B,CAACC,MACjCC,EAAeD,CAAK,KAAKA,EAAM,SAASE,GAEtCC,IAAwB,CAACC,MAA4D;AACvF,QAAMC,IAAuC,CAAA;AAE7C,aAAWL,KAASM,EAAS,QAAQF,CAAQ,GAAG;AAC5C,QAAIH,EAAeD,CAAK,KAAKA,EAAM,SAASO,GAAU;AAClD,YAAMC,IAAkBL,EAAsBH,EAAM,MAAM,QAAQ;AAElE,UAAI,CAACQ;AACD,eAAO;AAGX,MAAAH,EAAQ,KAAK,GAAGG,CAAe;AAC/B;AAAA,IACJ;AAEA,QAAI,CAACT,EAA4BC,CAAK;AAClC,aAAO;AAGX,IAAAK,EAAQ,KAAKL,CAAK;AAAA,EACtB;AAEA,SAAOK;AACX,GAEMI,IAAsB,CAACC,MAA4C;AACrE,MAAI,CAACA;AACD,WAAO;AAGX,QAAMC,IAAe,MAAM,KAAKD,EAAiB,QAAQ;AAEzD,MAAIC,EAAa,SAAS;AACtB,WAAO;AAGX,QAAMC,KAAmBD,EAAa,CAAC,GAAG,aAAa,MAAMA,EAAa,CAAC,GAAG,gBAAgB;AAE9F,SAAOA,EAAa,KAAK,CAAAE,MAAeA,EAAY,YAAYA,EAAY,iBAAiBD,CAAe;AAChH,GAEME,IAAe,CAAC,EAAE,WAAAC,GAAW,UAAAX,QAAqD;AACpF,QAAMY,IAAaC,EAA8B,IAAI,GAC/CC,IAAeD,EAA8B,IAAI,GACjDE,IAAgBF,EAA8B,IAAI,GAElD,CAACG,GAAgBC,CAAiB,IAAIC,EAAS,EAAK,GAEpD,CAACC,KAAuB,EAAE,YAAYC,EAAA,CAAmB,IAAIC,EAAA,GAE7DC,IAAiBvB,EAAsBC,CAAQ,GAE/CuB,KAAeD,KAAkB,CAAA,GAAI,OAAO,CAAAE,MAAUA,EAAO,MAAM,oBAAoB,OAAO,GAC9FC,KAAgBH,KAAkB,CAAA,GAAI,OAAO,CAAAE,MAAUA,EAAO,MAAM,oBAAoB,OAAO;AAiBrG,SAfAE,EAAgB,MAAM;AAClB,UAAMC,IAAiBf,EAAW;AAElC,IAAAe,GAAgB,UAAU,IAAI,yBAAyB;AAEvD,UAAMC,IACFvB,EAAoBc,EAAoB,OAAO,KAC/Cd,EAAoBS,EAAa,OAAO,KACxCT,EAAoBU,EAAc,OAAO;AAE7C,IAAAY,GAAgB,UAAU,OAAO,yBAAyB,GAE1DV,EAAkBW,CAAkB;AAAA,EACxC,GAAG,CAAC5B,GAAUuB,EAAY,QAAQE,EAAa,QAAQL,CAAiB,CAAC,GAEpEE,GAAgB,SAKjB,gBAAAO;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWC,EAAW,iBAAiBd,KAAkB,0BAA0BL,CAAS;AAAA,MAC5F,KAAKC;AAAA,MAEL,UAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,2BAA0B,KAAKZ,GACzC,UAAA;AAAA,QAAAI,EAAY,SAAS,KAClB,gBAAAM,EAAC,OAAA,EAAI,WAAU,4BAA2B,KAAKf,GAC1C,UAAAS,EAAA,CACL;AAAA,QAEHE,EAAa,SAAS,KACnB,gBAAAI,EAAC,SAAI,WAAU,6BAA4B,KAAKd,GAC3C,UAAAU,EAAA,CACL;AAAA,MAAA,EAAA,CAER;AAAA,IAAA;AAAA,EAAA,sBAnBI,OAAA,EAAI,WAAWK,EAAW,iBAAiBnB,CAAS,GAAI,UAAAX,GAAS;AAsBjF;"}
|
|
1
|
+
{"version":3,"file":"TableToolbar.js","sources":["../../../src/components/table/TableToolbar.tsx"],"sourcesContent":["import {\n Children,\n Fragment,\n useEffect,\n isValidElement,\n useLayoutEffect,\n useRef,\n useState,\n type PropsWithChildren,\n type ReactElement,\n type ReactNode,\n} from 'react';\n\nimport useResizeObserver from '../../useResizeObserver';\nimport useMergeRefs from '../../hooks/useMergeRefs';\nimport classNames from '../../utils/classNames';\nimport ToggleButton from '../button/ToggleButton';\nimport Collapse from '../collapse/Collapse';\nimport Card from '../card/Card';\nimport TableSearch from './TableSearch';\nimport TableToolbarColumn, { type TableToolbarColumnProps } from './TableToolbarColumn';\n\nexport { TableToolbarColumn };\nexport type {\n TableToolbarColumnHorizontalAlign,\n TableToolbarColumnProps,\n TableToolbarColumnVerticalAlign,\n} from './TableToolbarColumn';\n\n// Switch the toolbar into the compact mobile layout,\n// based on the available toolbar width instead of the overall viewport width.\nconst DEFAULT_TABLE_TOOLBAR_COLLAPSE_BREAKPOINT = 544;\n\nexport type TableToolbarProps = {\n /**\n * Optional class names for the wrapper element.\n */\n className?: string;\n\n /**\n * Optional class names for the card that wraps collapsed toolbar controls\n * in the compact mobile layout.\n */\n collapseCardClassName?: string;\n\n /**\n * Optional toolbar width in pixels at which the toolbar switches into its compact\n * mobile/collapsible layout.\n *\n * @default 544\n */\n responsiveCollapseBreakpoint?: number;\n\n /**\n * Disables the compact mobile/collapsible toolbar layout.\n *\n * Use this as an escape hatch when a consuming service needs to keep the\n * default wrapping toolbar behavior regardless of the available toolbar width.\n *\n * @default false\n */\n disableResponsiveCollapse?: boolean;\n};\n\ntype TableToolbarColumnElement = ReactElement<PropsWithChildren<TableToolbarColumnProps>, typeof TableToolbarColumn>;\n\nconst isTableToolbarColumnElement = (child: ReactNode): child is TableToolbarColumnElement =>\n isValidElement(child) && child.type === TableToolbarColumn;\n\nconst collectToolbarColumns = (children: ReactNode): TableToolbarColumnElement[] | null => {\n const columns: TableToolbarColumnElement[] = [];\n\n for (const child of Children.toArray(children)) {\n if (isValidElement(child) && child.type === Fragment) {\n const fragmentColumns = collectToolbarColumns(child.props.children);\n\n if (!fragmentColumns) {\n return null;\n }\n\n columns.push(...fragmentColumns);\n continue;\n }\n\n if (!isTableToolbarColumnElement(child)) {\n return null;\n }\n\n columns.push(child);\n }\n\n return columns;\n};\n\nconst hasDescendantType = (node: ReactNode, componentType: unknown): boolean =>\n Children.toArray(node).some(child => {\n if (!isValidElement(child)) {\n return false;\n }\n\n if (child.type === componentType) {\n return true;\n }\n\n return hasDescendantType(child.props.children, componentType);\n });\n\nconst hasWrappedFlexItems = (containerElement: HTMLDivElement | null) => {\n if (!containerElement) {\n return false;\n }\n\n const itemElements = Array.from(containerElement.children) as HTMLElement[];\n\n if (itemElements.length < 2) {\n return false;\n }\n\n const firstLineBottom = (itemElements[0]?.offsetTop ?? 0) + (itemElements[0]?.offsetHeight ?? 0);\n\n return itemElements.some(itemElement => itemElement.offsetTop + itemElement.offsetHeight !== firstLineBottom);\n};\n\nconst TableToolbar = (props: PropsWithChildren<TableToolbarProps>) => {\n const {\n className,\n collapseCardClassName,\n children,\n responsiveCollapseBreakpoint = DEFAULT_TABLE_TOOLBAR_COLLAPSE_BREAKPOINT,\n disableResponsiveCollapse = false,\n } = props;\n\n const toolbarRef = useRef<HTMLDivElement | null>(null);\n const leftGroupRef = useRef<HTMLDivElement | null>(null);\n const rightGroupRef = useRef<HTMLDivElement | null>(null);\n\n const [hasWrappedRows, setHasWrappedRows] = useState(false);\n const [isMobileCollapseOpen, setIsMobileCollapseOpen] = useState(false);\n\n const [toolbarSizeRef, , { inlineSize: toolbarInlineSize }] = useResizeObserver<HTMLDivElement>();\n const [toolbarContainerRef, , { inlineSize: toolbarContainerInlineSize }] = useResizeObserver<HTMLDivElement>();\n const mergedToolbarRefs = useMergeRefs(toolbarRef, toolbarSizeRef);\n\n const isSmallScreen =\n !disableResponsiveCollapse &&\n toolbarInlineSize !== undefined &&\n toolbarInlineSize <= responsiveCollapseBreakpoint;\n\n const toolbarColumns = collectToolbarColumns(children);\n\n const leftColumns = (toolbarColumns ?? []).filter(column => column.props.horizontalAlign !== 'right');\n const rightColumns = (toolbarColumns ?? []).filter(column => column.props.horizontalAlign === 'right');\n\n const searchRightColumnIndex = rightColumns.findIndex(column =>\n hasDescendantType(column.props.children, TableSearch)\n );\n\n const searchRightColumn = searchRightColumnIndex >= 0 ? rightColumns[searchRightColumnIndex] : undefined;\n\n const mobileCollapsedRightColumns = searchRightColumn\n ? rightColumns.filter((_, index) => index !== searchRightColumnIndex)\n : rightColumns;\n\n const hasMobileCollapseToggle = isSmallScreen && mobileCollapsedRightColumns.length > 0;\n\n const mobileCollapseToggle = hasMobileCollapseToggle && (\n <div className='table-toolbar-mobile-toggle'>\n <ToggleButton\n active={isMobileCollapseOpen}\n aria-label={isMobileCollapseOpen ? 'Hide toolbar filters' : 'Show toolbar filters'}\n bsStyle='default'\n iconName={'rioglyph-option-horizontal'}\n iconOnly\n onClick={setIsMobileCollapseOpen}\n />\n </div>\n );\n\n useLayoutEffect(() => {\n if (isSmallScreen) {\n setHasWrappedRows(false);\n return;\n }\n\n const toolbarElement = toolbarRef.current;\n\n toolbarElement?.classList.add('table-toolbar-measuring');\n\n const nextHasWrappedRows =\n hasWrappedFlexItems(toolbarContainerRef.current) ||\n hasWrappedFlexItems(leftGroupRef.current) ||\n hasWrappedFlexItems(rightGroupRef.current);\n\n toolbarElement?.classList.remove('table-toolbar-measuring');\n\n setHasWrappedRows(nextHasWrappedRows);\n }, [children, isSmallScreen, leftColumns.length, rightColumns.length, toolbarContainerInlineSize]);\n\n useEffect(() => {\n if (!isSmallScreen || !hasMobileCollapseToggle) {\n setIsMobileCollapseOpen(false);\n }\n }, [hasMobileCollapseToggle, isSmallScreen]);\n\n if (!toolbarColumns?.length) {\n return <div className={classNames('table-toolbar', className)}>{children}</div>;\n }\n\n if (isSmallScreen) {\n return (\n <div className={classNames('table-toolbar', 'table-toolbar-mobile', className)} ref={mergedToolbarRefs}>\n <div className='table-toolbar-container table-toolbar-container-mobile' ref={toolbarContainerRef}>\n {searchRightColumn ? (\n <>\n {leftColumns.length > 0 && (\n <div className='table-toolbar-mobile-primary'>\n <div className='table-toolbar-group-left table-toolbar-group-left-mobile'>\n {leftColumns}\n </div>\n </div>\n )}\n <div className='table-toolbar-mobile-search-row'>\n <div className='table-toolbar-mobile-search'>{searchRightColumn}</div>\n {mobileCollapseToggle}\n </div>\n </>\n ) : (\n <div className='table-toolbar-mobile-primary'>\n {leftColumns.length > 0 && (\n <div className='table-toolbar-group-left table-toolbar-group-left-mobile'>\n {leftColumns}\n </div>\n )}\n {mobileCollapseToggle}\n </div>\n )}\n\n {hasMobileCollapseToggle && (\n <Collapse open={isMobileCollapseOpen} timeout={220}>\n <Card className={classNames('table-toolbar-mobile-collapse-card', collapseCardClassName)}>\n <div className='table-toolbar-mobile-collapse'>{mobileCollapsedRightColumns}</div>\n </Card>\n </Collapse>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={classNames('table-toolbar', hasWrappedRows && 'table-toolbar-has-wrap', className)}\n ref={mergedToolbarRefs}\n >\n <div className='table-toolbar-container' ref={toolbarContainerRef}>\n {leftColumns.length > 0 && (\n <div className='table-toolbar-group-left' ref={leftGroupRef}>\n {leftColumns}\n </div>\n )}\n {rightColumns.length > 0 && (\n <div className='table-toolbar-group-right' ref={rightGroupRef}>\n {rightColumns}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default TableToolbar;\n"],"names":["DEFAULT_TABLE_TOOLBAR_COLLAPSE_BREAKPOINT","isTableToolbarColumnElement","child","isValidElement","TableToolbarColumn","collectToolbarColumns","children","columns","Children","Fragment","fragmentColumns","hasDescendantType","node","componentType","hasWrappedFlexItems","containerElement","itemElements","firstLineBottom","itemElement","TableToolbar","props","className","collapseCardClassName","responsiveCollapseBreakpoint","disableResponsiveCollapse","toolbarRef","useRef","leftGroupRef","rightGroupRef","hasWrappedRows","setHasWrappedRows","useState","isMobileCollapseOpen","setIsMobileCollapseOpen","toolbarSizeRef","toolbarInlineSize","useResizeObserver","toolbarContainerRef","toolbarContainerInlineSize","mergedToolbarRefs","useMergeRefs","isSmallScreen","toolbarColumns","leftColumns","column","rightColumns","searchRightColumnIndex","TableSearch","searchRightColumn","mobileCollapsedRightColumns","_","index","hasMobileCollapseToggle","mobileCollapseToggle","jsx","ToggleButton","useLayoutEffect","toolbarElement","nextHasWrappedRows","useEffect","classNames","jsxs","Collapse","Card"],"mappings":"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"}
|
|
@@ -34,15 +34,15 @@ const o = {
|
|
|
34
34
|
label: d ?? m ?? "",
|
|
35
35
|
icon: /* @__PURE__ */ i("span", { className: `rioglyph ${o.TABLE}` })
|
|
36
36
|
},
|
|
37
|
-
{
|
|
38
|
-
id: "SINGLE_CARD",
|
|
39
|
-
label: C ?? w ?? "",
|
|
40
|
-
icon: /* @__PURE__ */ i("span", { className: `rioglyph ${o.SINGLE_CARD}` })
|
|
41
|
-
},
|
|
42
37
|
{
|
|
43
38
|
id: "MULTI_CARDS",
|
|
44
39
|
label: g ?? L ?? "",
|
|
45
40
|
icon: /* @__PURE__ */ i("span", { className: `rioglyph ${o.MULTI_CARDS}` })
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: "SINGLE_CARD",
|
|
44
|
+
label: C ?? w ?? "",
|
|
45
|
+
icon: /* @__PURE__ */ i("span", { className: `rioglyph ${o.SINGLE_CARD}` })
|
|
46
46
|
}
|
|
47
47
|
], A = n.filter((e) => !T.includes(e.id)), _ = n.some((e) => e.label), h = S("TableViewToggles", a && a);
|
|
48
48
|
return /* @__PURE__ */ i("div", { ...I, className: h, children: /* @__PURE__ */ i("div", { className: "form-group margin-bottom-0", children: /* @__PURE__ */ i(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableViewToggles.js","sources":["../../../src/components/table/TableViewToggles.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useState } from 'react';\nimport { noop } from 'es-toolkit/compat';\n\nimport classNames from '../../utils/classNames';\nimport Select, { type SelectOption } from '../selects/Select';\n\nconst typeIcons: Record<TableViewTogglesViewType, string> = {\n TABLE: 'rioglyph-table-view',\n SINGLE_CARD: 'rioglyph-th-list',\n MULTI_CARDS: 'rioglyph-split-view',\n};\n\ntype TableViewToggleOption = SelectOption & {\n id: TableViewTogglesViewType;\n};\n\nexport type TableViewTogglesViewType = 'SINGLE_CARD' | 'MULTI_CARDS' | 'TABLE';\n\nexport type TableViewTogglesProps = {\n /**\n * The current viewType for controlling the TablesViewToggles component.\n *\n * Possible values are:\n *\n * - `'SINGLE_CARD'`\n * - `'MULTI_CARDS'`\n * - `'TABLE'`\n * - `TableViewToggles.VIEW_TYPE_TABLE`\n * - `TableViewToggles.VIEW_TYPE_SINGLE_CARD`\n * - `TableViewToggles.VIEW_TYPE_MULTI_CARDS`\n */\n viewType?: TableViewTogglesViewType;\n\n /**\n * Defines the initial viewType (when viewType is not controlled from the outside).\n *\n * Possible values are:\n *\n * - `'SINGLE_CARD'`\n * - `'MULTI_CARDS'`\n * - `'TABLE'`\n * - `TableViewToggles.VIEW_TYPE_TABLE`\n * - `TableViewToggles.VIEW_TYPE_SINGLE_CARD`\n * - `TableViewToggles.VIEW_TYPE_MULTI_CARDS`\n *\n * @default TableViewToggles.VIEW_TYPE_TABLE\n */\n initialViewType?: TableViewTogglesViewType;\n\n /**\n * Defines the view types which shall not be supported and are omitted.\n *\n * @default []\n */\n disabledViewTypes?: TableViewTogglesViewType[];\n\n /**\n * Callback function for when the user wants to change the viewType.\n *\n * Receives the new type as an argument.\n *\n * @param viewType The new viewType selected by the user.\n */\n onViewTypeChange: (viewType: TableViewTogglesViewType) => void;\n\n /**\n * Optional tooltip content for table view button.\n *\n * @deprecated Use `tableViewLabel` instead.\n */\n tableViewTooltipContent?: string | ReactNode;\n\n /**\n * Optional label content for the table view select item.\n */\n tableViewLabel?: string | ReactNode;\n\n /**\n * Optional tooltip content for single card view button.\n *\n * @deprecated Use `singleCardViewLabel` instead.\n */\n singleCardViewTooltipContent?: string | ReactNode;\n\n /**\n * Optional label content for the single card view select item.\n */\n singleCardViewLabel?: string | ReactNode;\n\n /**\n * Optional tooltip content for multi card view button.\n *\n * @deprecated Use `multiCardsViewLabel` instead.\n */\n multiCardsViewTooltipContent?: string | ReactNode;\n\n /**\n * Optional label content for the multi cards view select item.\n */\n multiCardsViewLabel?: string | ReactNode;\n\n /**\n * Disables all buttons.\n *\n * This means the buttons cannot be clicked. Used when disabling toolbar buttons during loading state or when the\n * corresponding table is empty.\n *\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Optional class names for the wrapper element.\n */\n className?: string;\n};\n\nconst TableViewToggles = (props: TableViewTogglesProps) => {\n const {\n viewType,\n initialViewType = 'TABLE',\n disabledViewTypes = [],\n onViewTypeChange = noop,\n tableViewTooltipContent,\n tableViewLabel,\n singleCardViewTooltipContent,\n singleCardViewLabel,\n multiCardsViewTooltipContent,\n multiCardsViewLabel,\n disabled = false,\n className,\n ...remainingProps\n } = props;\n\n const [internalViewType, setInternalViewType] = useState(initialViewType);\n\n // update internal state when external state changes - controlled component case\n useEffect(() => {\n if (viewType) {\n setInternalViewType(viewType);\n }\n }, [viewType]);\n\n const setViewType = (vt: TableViewTogglesViewType) => {\n setInternalViewType(vt);\n onViewTypeChange(vt);\n };\n\n const allOptions: TableViewToggleOption[] = [\n {\n id: 'TABLE',\n label: tableViewLabel ?? tableViewTooltipContent ?? '',\n icon: <span className={`rioglyph ${typeIcons.TABLE}`} />,\n },\n {\n id: '
|
|
1
|
+
{"version":3,"file":"TableViewToggles.js","sources":["../../../src/components/table/TableViewToggles.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useState } from 'react';\nimport { noop } from 'es-toolkit/compat';\n\nimport classNames from '../../utils/classNames';\nimport Select, { type SelectOption } from '../selects/Select';\n\nconst typeIcons: Record<TableViewTogglesViewType, string> = {\n TABLE: 'rioglyph-table-view',\n SINGLE_CARD: 'rioglyph-th-list',\n MULTI_CARDS: 'rioglyph-split-view',\n};\n\ntype TableViewToggleOption = SelectOption & {\n id: TableViewTogglesViewType;\n};\n\nexport type TableViewTogglesViewType = 'SINGLE_CARD' | 'MULTI_CARDS' | 'TABLE';\n\nexport type TableViewTogglesProps = {\n /**\n * The current viewType for controlling the TablesViewToggles component.\n *\n * Possible values are:\n *\n * - `'SINGLE_CARD'`\n * - `'MULTI_CARDS'`\n * - `'TABLE'`\n * - `TableViewToggles.VIEW_TYPE_TABLE`\n * - `TableViewToggles.VIEW_TYPE_SINGLE_CARD`\n * - `TableViewToggles.VIEW_TYPE_MULTI_CARDS`\n */\n viewType?: TableViewTogglesViewType;\n\n /**\n * Defines the initial viewType (when viewType is not controlled from the outside).\n *\n * Possible values are:\n *\n * - `'SINGLE_CARD'`\n * - `'MULTI_CARDS'`\n * - `'TABLE'`\n * - `TableViewToggles.VIEW_TYPE_TABLE`\n * - `TableViewToggles.VIEW_TYPE_SINGLE_CARD`\n * - `TableViewToggles.VIEW_TYPE_MULTI_CARDS`\n *\n * @default TableViewToggles.VIEW_TYPE_TABLE\n */\n initialViewType?: TableViewTogglesViewType;\n\n /**\n * Defines the view types which shall not be supported and are omitted.\n *\n * @default []\n */\n disabledViewTypes?: TableViewTogglesViewType[];\n\n /**\n * Callback function for when the user wants to change the viewType.\n *\n * Receives the new type as an argument.\n *\n * @param viewType The new viewType selected by the user.\n */\n onViewTypeChange: (viewType: TableViewTogglesViewType) => void;\n\n /**\n * Optional tooltip content for table view button.\n *\n * @deprecated Use `tableViewLabel` instead.\n */\n tableViewTooltipContent?: string | ReactNode;\n\n /**\n * Optional label content for the table view select item.\n */\n tableViewLabel?: string | ReactNode;\n\n /**\n * Optional tooltip content for single card view button.\n *\n * @deprecated Use `singleCardViewLabel` instead.\n */\n singleCardViewTooltipContent?: string | ReactNode;\n\n /**\n * Optional label content for the single card view select item.\n */\n singleCardViewLabel?: string | ReactNode;\n\n /**\n * Optional tooltip content for multi card view button.\n *\n * @deprecated Use `multiCardsViewLabel` instead.\n */\n multiCardsViewTooltipContent?: string | ReactNode;\n\n /**\n * Optional label content for the multi cards view select item.\n */\n multiCardsViewLabel?: string | ReactNode;\n\n /**\n * Disables all buttons.\n *\n * This means the buttons cannot be clicked. Used when disabling toolbar buttons during loading state or when the\n * corresponding table is empty.\n *\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Optional class names for the wrapper element.\n */\n className?: string;\n};\n\nconst TableViewToggles = (props: TableViewTogglesProps) => {\n const {\n viewType,\n initialViewType = 'TABLE',\n disabledViewTypes = [],\n onViewTypeChange = noop,\n tableViewTooltipContent,\n tableViewLabel,\n singleCardViewTooltipContent,\n singleCardViewLabel,\n multiCardsViewTooltipContent,\n multiCardsViewLabel,\n disabled = false,\n className,\n ...remainingProps\n } = props;\n\n const [internalViewType, setInternalViewType] = useState(initialViewType);\n\n // update internal state when external state changes - controlled component case\n useEffect(() => {\n if (viewType) {\n setInternalViewType(viewType);\n }\n }, [viewType]);\n\n const setViewType = (vt: TableViewTogglesViewType) => {\n setInternalViewType(vt);\n onViewTypeChange(vt);\n };\n\n const allOptions: TableViewToggleOption[] = [\n {\n id: 'TABLE',\n label: tableViewLabel ?? tableViewTooltipContent ?? '',\n icon: <span className={`rioglyph ${typeIcons.TABLE}`} />,\n },\n {\n id: 'MULTI_CARDS',\n label: multiCardsViewLabel ?? multiCardsViewTooltipContent ?? '',\n icon: <span className={`rioglyph ${typeIcons.MULTI_CARDS}`} />,\n },\n {\n id: 'SINGLE_CARD',\n label: singleCardViewLabel ?? singleCardViewTooltipContent ?? '',\n icon: <span className={`rioglyph ${typeIcons.SINGLE_CARD}`} />,\n },\n ];\n\n const options = allOptions.filter(option => !disabledViewTypes.includes(option.id));\n const hasOptionLabels = allOptions.some(option => option.label);\n\n const wrapperClassNames = classNames('TableViewToggles', className && className);\n\n return (\n <div {...remainingProps} className={wrapperClassNames}>\n <div className='form-group margin-bottom-0'>\n <Select\n options={options}\n value={[internalViewType]}\n onChange={item => item && setViewType(item.id as TableViewTogglesViewType)}\n disabled={disabled}\n showSelectedItemIcon\n pullRight\n dropdownClassName={!hasOptionLabels ? 'width-auto' : undefined}\n />\n </div>\n </div>\n );\n};\n\n// Don't export values as string but as a distinct union type\nTableViewToggles.VIEW_TYPE_TABLE = 'TABLE' as TableViewTogglesViewType;\nTableViewToggles.VIEW_TYPE_SINGLE_CARD = 'SINGLE_CARD' as TableViewTogglesViewType;\nTableViewToggles.VIEW_TYPE_MULTI_CARDS = 'MULTI_CARDS' as TableViewTogglesViewType;\n\nexport default TableViewToggles;\n"],"names":["typeIcons","TableViewToggles","props","viewType","initialViewType","disabledViewTypes","onViewTypeChange","noop","tableViewTooltipContent","tableViewLabel","singleCardViewTooltipContent","singleCardViewLabel","multiCardsViewTooltipContent","multiCardsViewLabel","disabled","className","remainingProps","internalViewType","setInternalViewType","useState","useEffect","setViewType","vt","allOptions","jsx","options","option","hasOptionLabels","wrapperClassNames","classNames","Select","item"],"mappings":";;;;;AAMA,MAAMA,IAAsD;AAAA,EACxD,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa;AACjB,GA2GMC,IAAmB,CAACC,MAAiC;AACvD,QAAM;AAAA,IACF,UAAAC;AAAA,IACA,iBAAAC,IAAkB;AAAA,IAClB,mBAAAC,IAAoB,CAAA;AAAA,IACpB,kBAAAC,IAAmBC;AAAA,IACnB,yBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,8BAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,8BAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,UAAAC,IAAW;AAAA,IACX,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,IACHd,GAEE,CAACe,GAAkBC,CAAmB,IAAIC,EAASf,CAAe;AAGxE,EAAAgB,EAAU,MAAM;AACZ,IAAIjB,KACAe,EAAoBf,CAAQ;AAAA,EAEpC,GAAG,CAACA,CAAQ,CAAC;AAEb,QAAMkB,IAAc,CAACC,MAAiC;AAClD,IAAAJ,EAAoBI,CAAE,GACtBhB,EAAiBgB,CAAE;AAAA,EACvB,GAEMC,IAAsC;AAAA,IACxC;AAAA,MACI,IAAI;AAAA,MACJ,OAAOd,KAAkBD,KAA2B;AAAA,MACpD,MAAM,gBAAAgB,EAAC,QAAA,EAAK,WAAW,YAAYxB,EAAU,KAAK,GAAA,CAAI;AAAA,IAAA;AAAA,IAE1D;AAAA,MACI,IAAI;AAAA,MACJ,OAAOa,KAAuBD,KAAgC;AAAA,MAC9D,MAAM,gBAAAY,EAAC,QAAA,EAAK,WAAW,YAAYxB,EAAU,WAAW,GAAA,CAAI;AAAA,IAAA;AAAA,IAEhE;AAAA,MACI,IAAI;AAAA,MACJ,OAAOW,KAAuBD,KAAgC;AAAA,MAC9D,MAAM,gBAAAc,EAAC,QAAA,EAAK,WAAW,YAAYxB,EAAU,WAAW,GAAA,CAAI;AAAA,IAAA;AAAA,EAChE,GAGEyB,IAAUF,EAAW,OAAO,CAAAG,MAAU,CAACrB,EAAkB,SAASqB,EAAO,EAAE,CAAC,GAC5EC,IAAkBJ,EAAW,KAAK,CAAAG,MAAUA,EAAO,KAAK,GAExDE,IAAoBC,EAAW,oBAAoBd,KAAaA,CAAS;AAE/E,SACI,gBAAAS,EAAC,SAAK,GAAGR,GAAgB,WAAWY,GAChC,UAAA,gBAAAJ,EAAC,OAAA,EAAI,WAAU,8BACX,UAAA,gBAAAA;AAAA,IAACM;AAAA,IAAA;AAAA,MACG,SAAAL;AAAA,MACA,OAAO,CAACR,CAAgB;AAAA,MACxB,UAAU,CAAAc,MAAQA,KAAQV,EAAYU,EAAK,EAA8B;AAAA,MACzE,UAAAjB;AAAA,MACA,sBAAoB;AAAA,MACpB,WAAS;AAAA,MACT,mBAAoBa,IAAiC,SAAf;AAAA,IAAe;AAAA,EAAA,GAE7D,EAAA,CACJ;AAER;AAGA1B,EAAiB,kBAAkB;AACnCA,EAAiB,wBAAwB;AACzCA,EAAiB,wBAAwB;"}
|
|
@@ -10,9 +10,12 @@ import { TableRowData, TableRowId, TableSortDirection } from '../Table.types';
|
|
|
10
10
|
export type TableInteractionContextValue<RowType extends TableRowData> = {
|
|
11
11
|
showSelectionColumn?: boolean;
|
|
12
12
|
selectedRowIdSet: Set<TableRowId>;
|
|
13
|
+
selectableRowIdSet: Set<TableRowId>;
|
|
13
14
|
selectionHeaderContent?: ReactNode;
|
|
14
15
|
isAllRowsSelected?: boolean;
|
|
15
16
|
isSomeRowsSelected?: boolean;
|
|
17
|
+
hasSelectableRows?: boolean;
|
|
18
|
+
hideSelectionCheckboxesForExcludedRows?: boolean;
|
|
16
19
|
onToggleAllSelection?: () => void;
|
|
17
20
|
onToggleRowSelection?: (rowId: TableRowId) => void;
|
|
18
21
|
activeRowId?: TableRowId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableInteractionContext.js","sources":["../../../../src/components/table/context/TableInteractionContext.tsx"],"sourcesContent":["import { createContext, useContext, type MouseEvent as ReactMouseEvent, type ReactNode } from 'react';\n\nimport type { TableRowData, TableRowId, TableSortDirection } from '../Table.types';\n\n/**\n * User-facing table interaction state and callbacks consumed by header/body cells.\n *\n * These values are conceptually different from the normalized render model:\n * they describe selection, sorting, and row activation/click behavior rather than\n * the structural table draft.\n */\nexport type TableInteractionContextValue<RowType extends TableRowData> = {\n showSelectionColumn?: boolean;\n selectedRowIdSet: Set<TableRowId>;\n selectionHeaderContent?: ReactNode;\n isAllRowsSelected?: boolean;\n isSomeRowsSelected?: boolean;\n onToggleAllSelection?: () => void;\n onToggleRowSelection?: (rowId: TableRowId) => void;\n activeRowId?: TableRowId;\n onActiveRowChange?: (rowId: TableRowId | undefined, row: RowType, rowIndex: number) => void;\n onRowClick?: (row: RowType, rowIndex: number) => void;\n isClickable: boolean;\n onSortChange?: (\n columnKey: string,\n direction: TableSortDirection,\n event: ReactMouseEvent<HTMLButtonElement>\n ) => void;\n};\n\nexport const TableInteractionContext = createContext<TableInteractionContextValue<TableRowData> | null>(null);\n\nexport const useOptionalTableInteractionContext = <RowType extends TableRowData>() =>\n useContext(TableInteractionContext) as TableInteractionContextValue<RowType> | null;\n\nexport const useTableInteractionContext = <RowType extends TableRowData>() => {\n const context = useOptionalTableInteractionContext<RowType>();\n\n if (!context) {\n throw new Error('Table interaction context is missing.');\n }\n\n return context;\n};\n"],"names":["TableInteractionContext","createContext","useOptionalTableInteractionContext","useContext"],"mappings":";
|
|
1
|
+
{"version":3,"file":"TableInteractionContext.js","sources":["../../../../src/components/table/context/TableInteractionContext.tsx"],"sourcesContent":["import { createContext, useContext, type MouseEvent as ReactMouseEvent, type ReactNode } from 'react';\n\nimport type { TableRowData, TableRowId, TableSortDirection } from '../Table.types';\n\n/**\n * User-facing table interaction state and callbacks consumed by header/body cells.\n *\n * These values are conceptually different from the normalized render model:\n * they describe selection, sorting, and row activation/click behavior rather than\n * the structural table draft.\n */\nexport type TableInteractionContextValue<RowType extends TableRowData> = {\n showSelectionColumn?: boolean;\n selectedRowIdSet: Set<TableRowId>;\n selectableRowIdSet: Set<TableRowId>;\n selectionHeaderContent?: ReactNode;\n isAllRowsSelected?: boolean;\n isSomeRowsSelected?: boolean;\n hasSelectableRows?: boolean;\n hideSelectionCheckboxesForExcludedRows?: boolean;\n onToggleAllSelection?: () => void;\n onToggleRowSelection?: (rowId: TableRowId) => void;\n activeRowId?: TableRowId;\n onActiveRowChange?: (rowId: TableRowId | undefined, row: RowType, rowIndex: number) => void;\n onRowClick?: (row: RowType, rowIndex: number) => void;\n isClickable: boolean;\n onSortChange?: (\n columnKey: string,\n direction: TableSortDirection,\n event: ReactMouseEvent<HTMLButtonElement>\n ) => void;\n};\n\nexport const TableInteractionContext = createContext<TableInteractionContextValue<TableRowData> | null>(null);\n\nexport const useOptionalTableInteractionContext = <RowType extends TableRowData>() =>\n useContext(TableInteractionContext) as TableInteractionContextValue<RowType> | null;\n\nexport const useTableInteractionContext = <RowType extends TableRowData>() => {\n const context = useOptionalTableInteractionContext<RowType>();\n\n if (!context) {\n throw new Error('Table interaction context is missing.');\n }\n\n return context;\n};\n"],"names":["TableInteractionContext","createContext","useOptionalTableInteractionContext","useContext"],"mappings":";AAiCO,MAAMA,IAA0BC,EAAiE,IAAI,GAE/FC,IAAqC,MAC9CC,EAAWH,CAAuB;"}
|
|
@@ -15,6 +15,7 @@ export type TableLayoutContextValue = {
|
|
|
15
15
|
lastResizableColumnKey?: string;
|
|
16
16
|
resettableColumnKeys?: Set<string>;
|
|
17
17
|
stickyLeftColumnCount?: number;
|
|
18
|
+
stickyRightColumnCount?: number;
|
|
18
19
|
stickyFooter?: boolean;
|
|
19
20
|
onColumnDragEnd?: (event: DragEndEvent) => void;
|
|
20
21
|
onColumnResizeReset?: (columnKey: string) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableLayoutContext.js","sources":["../../../../src/components/table/context/TableLayoutContext.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n type UIEvent as ReactUIEvent,\n} from 'react';\nimport type { DragEndEvent } from '@dnd-kit/core';\n\n/**\n * Layout and column-behavior context.\n *\n * This groups scroll synchronization, sticky-column metadata, and drag/resize\n * callbacks so header/footer/cell components do not need the full render model\n * just to participate in layout behavior.\n */\nexport type TableLayoutContextValue = {\n handleBodyScroll?: (event: ReactUIEvent<HTMLElement> | undefined) => void;\n tableHeadRowRef: RefObject<HTMLDivElement>;\n tableFooterRowRef: RefObject<HTMLDivElement>;\n draggableColumnKeys?: string[];\n lastResizableColumnKey?: string;\n resettableColumnKeys?: Set<string>;\n stickyLeftColumnCount?: number;\n stickyFooter?: boolean;\n onColumnDragEnd?: (event: DragEndEvent) => void;\n onColumnResizeReset?: (columnKey: string) => void;\n onColumnResizeStart?: (columnKey: string, event: ReactPointerEvent<HTMLDivElement>) => void;\n};\n\nexport const TableLayoutContext = createContext<TableLayoutContextValue | null>(null);\n\nexport const useOptionalTableLayoutContext = () => useContext(TableLayoutContext);\n\nexport const useTableLayoutContext = () => {\n const context = useOptionalTableLayoutContext();\n\n if (!context) {\n throw new Error('Table layout context is missing.');\n }\n\n return context;\n};\n"],"names":["TableLayoutContext","createContext","useOptionalTableLayoutContext","useContext"],"mappings":";
|
|
1
|
+
{"version":3,"file":"TableLayoutContext.js","sources":["../../../../src/components/table/context/TableLayoutContext.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n type UIEvent as ReactUIEvent,\n} from 'react';\nimport type { DragEndEvent } from '@dnd-kit/core';\n\n/**\n * Layout and column-behavior context.\n *\n * This groups scroll synchronization, sticky-column metadata, and drag/resize\n * callbacks so header/footer/cell components do not need the full render model\n * just to participate in layout behavior.\n */\nexport type TableLayoutContextValue = {\n handleBodyScroll?: (event: ReactUIEvent<HTMLElement> | undefined) => void;\n tableHeadRowRef: RefObject<HTMLDivElement>;\n tableFooterRowRef: RefObject<HTMLDivElement>;\n draggableColumnKeys?: string[];\n lastResizableColumnKey?: string;\n resettableColumnKeys?: Set<string>;\n stickyLeftColumnCount?: number;\n stickyRightColumnCount?: number;\n stickyFooter?: boolean;\n onColumnDragEnd?: (event: DragEndEvent) => void;\n onColumnResizeReset?: (columnKey: string) => void;\n onColumnResizeStart?: (columnKey: string, event: ReactPointerEvent<HTMLDivElement>) => void;\n};\n\nexport const TableLayoutContext = createContext<TableLayoutContextValue | null>(null);\n\nexport const useOptionalTableLayoutContext = () => useContext(TableLayoutContext);\n\nexport const useTableLayoutContext = () => {\n const context = useOptionalTableLayoutContext();\n\n if (!context) {\n throw new Error('Table layout context is missing.');\n }\n\n return context;\n};\n"],"names":["TableLayoutContext","createContext","useOptionalTableLayoutContext","useContext"],"mappings":";AA+BO,MAAMA,IAAqBC,EAA8C,IAAI,GAEvEC,IAAgC,MAAMC,EAAWH,CAAkB;"}
|
|
@@ -45,6 +45,7 @@ export type TableRenderDraft<RowType extends TableRowData> = {
|
|
|
45
45
|
rowIndex: number;
|
|
46
46
|
kind: 'data' | 'expanded' | 'expanded-full-width' | 'group' | 'group-footer' | 'spacer';
|
|
47
47
|
disabled?: boolean;
|
|
48
|
+
selectable?: boolean;
|
|
48
49
|
render: () => ReactNode;
|
|
49
50
|
}[];
|
|
50
51
|
bodyMaxHeight?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableRenderContext.js","sources":["../../../../src/components/table/context/TableRenderContext.tsx"],"sourcesContent":["import { createContext, useContext, type ReactNode } from 'react';\n\nimport type {\n TableColumnDefinition,\n TableHorizontalAlign,\n TableRowData,\n TableRowId,\n TableVerticalAlign,\n} from '../Table.types';\nimport type { TableViewHeader } from '../model/tableView.types';\n\nexport type RenderHeaderColumn<RowType extends TableRowData> = {\n id: string;\n columnKey?: string;\n label: ReactNode;\n icon?: string;\n filter?: ReactNode;\n hideLabel?: boolean;\n width?: number | string;\n mobileLabel?: string;\n horizontalAlign?: TableHorizontalAlign;\n verticalAlign?: TableVerticalAlign;\n headerClassName?: string;\n hideOnMobile?: boolean;\n sortable?: boolean;\n draggable?: boolean;\n resizeable?: boolean;\n minResizeWidth?: number;\n maxResizeWidth?: number;\n row: number;\n colSpan: number;\n rowSpan: number;\n source?: RowType;\n};\n\n/**\n * Mutable draft of the current render pass.\n *\n * The table keeps React composability, but still needs a normalized table model\n * for features such as header placement, footer detection, virtualization, and\n * stable body-row rendering.\n *\n * The table therefore works in two internal stages:\n * 1. Header/body/footer sub-components register the structure they produce into this draft.\n * 2. `Table` promotes that draft into stable draft state and renders from that.\n *\n * The draft is intentionally recreated on every render pass and must not be treated\n * as persistent state.\n */\nexport type TableRenderDraft<RowType extends TableRowData> = {\n headerColumns: RenderHeaderColumn<RowType>[];\n bodyRows: {\n rowId: TableRowId;\n rowIndex: number;\n kind: 'data' | 'expanded' | 'expanded-full-width' | 'group' | 'group-footer' | 'spacer';\n disabled?: boolean;\n render: () => ReactNode;\n }[];\n bodyMaxHeight?: string;\n hasFooter?: boolean;\n hasFooterCells?: boolean;\n hasExpandableRows?: boolean;\n};\n\nexport type RenderBodyRow<RowType extends TableRowData> = Omit<TableRenderDraft<RowType>['bodyRows'][number], 'render'>;\n\n/**\n * Structural render context.\n *\n * This context only carries the normalized render model built from the current\n * render pass. Public render configuration such as `rowClassName` or card/table\n * view mode lives in `TableRenderConfigContext`.\n */\nexport type TableRenderContextValue<RowType extends TableRowData> = {\n header?: TableViewHeader<RowType>;\n columns: RenderHeaderColumn<RowType>[];\n columnDefinitionsByKey: Map<string, TableColumnDefinition<RowType>>;\n columnIndexByKey: Map<string, number>;\n bodyRows: RenderBodyRow<RowType>[];\n renderBodyRow?: (row: RenderBodyRow<RowType>) => ReactNode;\n renderDraft: TableRenderDraft<RowType>;\n hasFooterCells?: boolean;\n hasExpandableRows?: boolean;\n /**\n * Switches body rows into the registration pass.\n *\n * While this flag is true, row components register their normalized metadata in\n * `renderDraft.bodyRows` and return `null` instead of rendering DOM directly.\n * `TableBody` then performs the second pass by rendering the collected rows\n * through `renderBodyRow(...)`.\n */\n isRegisteringBodyRows?: boolean;\n};\n\nexport const TableRenderContext = createContext<TableRenderContextValue<TableRowData> | null>(null);\n\nexport const useOptionalTableRenderContext = <RowType extends TableRowData>() =>\n useContext(TableRenderContext) as TableRenderContextValue<RowType> | null;\n\nexport const useTableRenderContext = <RowType extends TableRowData>() => {\n const context = useOptionalTableRenderContext<RowType>();\n\n if (!context) {\n throw new Error('Table render context is missing.');\n }\n\n return context;\n};\n"],"names":["TableRenderContext","createContext","useOptionalTableRenderContext","useContext"],"mappings":";
|
|
1
|
+
{"version":3,"file":"TableRenderContext.js","sources":["../../../../src/components/table/context/TableRenderContext.tsx"],"sourcesContent":["import { createContext, useContext, type ReactNode } from 'react';\n\nimport type {\n TableColumnDefinition,\n TableHorizontalAlign,\n TableRowData,\n TableRowId,\n TableVerticalAlign,\n} from '../Table.types';\nimport type { TableViewHeader } from '../model/tableView.types';\n\nexport type RenderHeaderColumn<RowType extends TableRowData> = {\n id: string;\n columnKey?: string;\n label: ReactNode;\n icon?: string;\n filter?: ReactNode;\n hideLabel?: boolean;\n width?: number | string;\n mobileLabel?: string;\n horizontalAlign?: TableHorizontalAlign;\n verticalAlign?: TableVerticalAlign;\n headerClassName?: string;\n hideOnMobile?: boolean;\n sortable?: boolean;\n draggable?: boolean;\n resizeable?: boolean;\n minResizeWidth?: number;\n maxResizeWidth?: number;\n row: number;\n colSpan: number;\n rowSpan: number;\n source?: RowType;\n};\n\n/**\n * Mutable draft of the current render pass.\n *\n * The table keeps React composability, but still needs a normalized table model\n * for features such as header placement, footer detection, virtualization, and\n * stable body-row rendering.\n *\n * The table therefore works in two internal stages:\n * 1. Header/body/footer sub-components register the structure they produce into this draft.\n * 2. `Table` promotes that draft into stable draft state and renders from that.\n *\n * The draft is intentionally recreated on every render pass and must not be treated\n * as persistent state.\n */\nexport type TableRenderDraft<RowType extends TableRowData> = {\n headerColumns: RenderHeaderColumn<RowType>[];\n bodyRows: {\n rowId: TableRowId;\n rowIndex: number;\n kind: 'data' | 'expanded' | 'expanded-full-width' | 'group' | 'group-footer' | 'spacer';\n disabled?: boolean;\n selectable?: boolean;\n render: () => ReactNode;\n }[];\n bodyMaxHeight?: string;\n hasFooter?: boolean;\n hasFooterCells?: boolean;\n hasExpandableRows?: boolean;\n};\n\nexport type RenderBodyRow<RowType extends TableRowData> = Omit<TableRenderDraft<RowType>['bodyRows'][number], 'render'>;\n\n/**\n * Structural render context.\n *\n * This context only carries the normalized render model built from the current\n * render pass. Public render configuration such as `rowClassName` or card/table\n * view mode lives in `TableRenderConfigContext`.\n */\nexport type TableRenderContextValue<RowType extends TableRowData> = {\n header?: TableViewHeader<RowType>;\n columns: RenderHeaderColumn<RowType>[];\n columnDefinitionsByKey: Map<string, TableColumnDefinition<RowType>>;\n columnIndexByKey: Map<string, number>;\n bodyRows: RenderBodyRow<RowType>[];\n renderBodyRow?: (row: RenderBodyRow<RowType>) => ReactNode;\n renderDraft: TableRenderDraft<RowType>;\n hasFooterCells?: boolean;\n hasExpandableRows?: boolean;\n /**\n * Switches body rows into the registration pass.\n *\n * While this flag is true, row components register their normalized metadata in\n * `renderDraft.bodyRows` and return `null` instead of rendering DOM directly.\n * `TableBody` then performs the second pass by rendering the collected rows\n * through `renderBodyRow(...)`.\n */\n isRegisteringBodyRows?: boolean;\n};\n\nexport const TableRenderContext = createContext<TableRenderContextValue<TableRowData> | null>(null);\n\nexport const useOptionalTableRenderContext = <RowType extends TableRowData>() =>\n useContext(TableRenderContext) as TableRenderContextValue<RowType> | null;\n\nexport const useTableRenderContext = <RowType extends TableRowData>() => {\n const context = useOptionalTableRenderContext<RowType>();\n\n if (!context) {\n throw new Error('Table render context is missing.');\n }\n\n return context;\n};\n"],"names":["TableRenderContext","createContext","useOptionalTableRenderContext","useContext"],"mappings":";AA+FO,MAAMA,IAAqBC,EAA4D,IAAI,GAErFC,IAAgC,MACzCC,EAAWH,CAAkB;"}
|
|
@@ -6,7 +6,8 @@ type UseHorizontalSectionSyncProps = {
|
|
|
6
6
|
};
|
|
7
7
|
export declare const useHorizontalSectionSync: ({ enabled, hasFooterCells }: UseHorizontalSectionSyncProps) => {
|
|
8
8
|
handleBodyScroll: (event: UIEvent<HTMLElement> | undefined) => void;
|
|
9
|
-
|
|
9
|
+
hasHorizontalScrollEndOffset: boolean;
|
|
10
|
+
hasHorizontalScrollStartOffset: boolean;
|
|
10
11
|
tableFooterRowRef: import('react').RefObject<HTMLDivElement>;
|
|
11
12
|
tableHeadRowRef: import('react').RefObject<HTMLDivElement>;
|
|
12
13
|
};
|
|
@@ -1,43 +1,44 @@
|
|
|
1
|
-
import { useRef as
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
if (
|
|
5
|
-
return
|
|
6
|
-
const
|
|
7
|
-
return
|
|
8
|
-
},
|
|
9
|
-
const
|
|
10
|
-
(
|
|
11
|
-
const
|
|
12
|
-
if (
|
|
13
|
-
if (
|
|
14
|
-
|
|
1
|
+
import { useRef as f, useState as S, useCallback as m, useEffect as g } from "react";
|
|
2
|
+
const h = "table-horizontal-scroll", R = (r) => {
|
|
3
|
+
const o = r?.currentTarget;
|
|
4
|
+
if (o && "scrollLeft" in o)
|
|
5
|
+
return o.scrollLeft;
|
|
6
|
+
const e = r?.target;
|
|
7
|
+
return e && "scrollLeft" in e ? e.scrollLeft : 0;
|
|
8
|
+
}, z = ({ enabled: r, hasFooterCells: o = !0 }) => {
|
|
9
|
+
const e = f(null), c = f(null), a = f(0), [L, i] = S(!1), [H, u] = S(!1), l = m(
|
|
10
|
+
(s) => {
|
|
11
|
+
const n = (t) => {
|
|
12
|
+
if (t) {
|
|
13
|
+
if (s === 0) {
|
|
14
|
+
t.style.removeProperty("transform");
|
|
15
15
|
return;
|
|
16
16
|
}
|
|
17
|
-
|
|
17
|
+
t.style.transform = `translateX(-${s}px)`;
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
|
-
|
|
20
|
+
n(e.current), o ? n(c.current) : c.current && c.current.style.removeProperty("transform");
|
|
21
21
|
},
|
|
22
|
-
[
|
|
23
|
-
),
|
|
24
|
-
(
|
|
25
|
-
const
|
|
26
|
-
|
|
22
|
+
[o]
|
|
23
|
+
), p = m(
|
|
24
|
+
(s) => {
|
|
25
|
+
const n = s?.currentTarget, t = R(s), y = n ? Math.max(n.scrollWidth - n.clientWidth, 0) : 0, E = Math.max(y - t, 0);
|
|
26
|
+
i(t > 0), u(E > 1), r && l(t), t !== a.current && (a.current = t, window.dispatchEvent(new CustomEvent(h)));
|
|
27
27
|
},
|
|
28
|
-
[
|
|
28
|
+
[r, l]
|
|
29
29
|
);
|
|
30
|
-
return
|
|
31
|
-
|
|
32
|
-
}, [
|
|
33
|
-
handleBodyScroll:
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
return g(() => {
|
|
31
|
+
r || (a.current = 0, i(!1), u(!1), l(0));
|
|
32
|
+
}, [r, l]), {
|
|
33
|
+
handleBodyScroll: p,
|
|
34
|
+
hasHorizontalScrollEndOffset: H,
|
|
35
|
+
hasHorizontalScrollStartOffset: L,
|
|
36
|
+
tableFooterRowRef: c,
|
|
37
|
+
tableHeadRowRef: e
|
|
37
38
|
};
|
|
38
39
|
};
|
|
39
40
|
export {
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
h as TABLE_HORIZONTAL_SCROLL_EVENT,
|
|
42
|
+
z as useHorizontalSectionSync
|
|
42
43
|
};
|
|
43
44
|
//# sourceMappingURL=useHorizontalSectionSync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHorizontalSectionSync.js","sources":["../../../../src/components/table/layout/useHorizontalSectionSync.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState, type UIEvent } from 'react';\n\nexport const TABLE_HORIZONTAL_SCROLL_EVENT = 'table-horizontal-scroll';\n\nconst getScrollLeftFromEvent = (event: UIEvent<HTMLElement> | undefined) => {\n const currentTarget = event?.currentTarget;\n\n if (currentTarget && 'scrollLeft' in currentTarget) {\n return (currentTarget as HTMLElement).scrollLeft;\n }\n\n const target = event?.target;\n\n if (target && 'scrollLeft' in target) {\n return (target as HTMLElement).scrollLeft;\n }\n\n return 0;\n};\n\ntype UseHorizontalSectionSyncProps = {\n enabled: boolean;\n hasFooterCells?: boolean;\n};\n\nexport const useHorizontalSectionSync = ({ enabled, hasFooterCells = true }: UseHorizontalSectionSyncProps) => {\n const tableHeadRowRef = useRef<HTMLDivElement>(null);\n const tableFooterRowRef = useRef<HTMLDivElement>(null);\n const previousScrollLeftRef = useRef(0);\n const [
|
|
1
|
+
{"version":3,"file":"useHorizontalSectionSync.js","sources":["../../../../src/components/table/layout/useHorizontalSectionSync.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState, type UIEvent } from 'react';\n\nexport const TABLE_HORIZONTAL_SCROLL_EVENT = 'table-horizontal-scroll';\n\nconst getScrollLeftFromEvent = (event: UIEvent<HTMLElement> | undefined) => {\n const currentTarget = event?.currentTarget;\n\n if (currentTarget && 'scrollLeft' in currentTarget) {\n return (currentTarget as HTMLElement).scrollLeft;\n }\n\n const target = event?.target;\n\n if (target && 'scrollLeft' in target) {\n return (target as HTMLElement).scrollLeft;\n }\n\n return 0;\n};\n\ntype UseHorizontalSectionSyncProps = {\n enabled: boolean;\n hasFooterCells?: boolean;\n};\n\nexport const useHorizontalSectionSync = ({ enabled, hasFooterCells = true }: UseHorizontalSectionSyncProps) => {\n const tableHeadRowRef = useRef<HTMLDivElement>(null);\n const tableFooterRowRef = useRef<HTMLDivElement>(null);\n const previousScrollLeftRef = useRef(0);\n\n const [hasHorizontalScrollStartOffset, setHasHorizontalScrollStartOffset] = useState(false);\n const [hasHorizontalScrollEndOffset, setHasHorizontalScrollEndOffset] = useState(false);\n\n const syncHorizontalSections = useCallback(\n (scrollLeft: number) => {\n const applyTransform = (element: HTMLDivElement | null) => {\n if (!element) {\n return;\n }\n\n if (scrollLeft === 0) {\n element.style.removeProperty('transform');\n return;\n }\n\n element.style.transform = `translateX(-${scrollLeft}px)`;\n };\n\n applyTransform(tableHeadRowRef.current);\n\n if (hasFooterCells) {\n applyTransform(tableFooterRowRef.current);\n } else if (tableFooterRowRef.current) {\n tableFooterRowRef.current.style.removeProperty('transform');\n }\n },\n [hasFooterCells]\n );\n\n const handleBodyScroll = useCallback(\n (event: UIEvent<HTMLElement> | undefined) => {\n const currentTarget = event?.currentTarget as HTMLElement | undefined;\n const scrollLeft = getScrollLeftFromEvent(event);\n const maxScrollLeft = currentTarget\n ? Math.max(currentTarget.scrollWidth - currentTarget.clientWidth, 0)\n : 0;\n const remainingScrollLeft = Math.max(maxScrollLeft - scrollLeft, 0);\n\n setHasHorizontalScrollStartOffset(scrollLeft > 0);\n setHasHorizontalScrollEndOffset(remainingScrollLeft > 1);\n\n if (enabled) {\n syncHorizontalSections(scrollLeft);\n }\n\n if (scrollLeft !== previousScrollLeftRef.current) {\n previousScrollLeftRef.current = scrollLeft;\n window.dispatchEvent(new CustomEvent(TABLE_HORIZONTAL_SCROLL_EVENT));\n }\n },\n [enabled, syncHorizontalSections]\n );\n\n useEffect(() => {\n if (!enabled) {\n previousScrollLeftRef.current = 0;\n setHasHorizontalScrollStartOffset(false);\n setHasHorizontalScrollEndOffset(false);\n syncHorizontalSections(0);\n }\n }, [enabled, syncHorizontalSections]);\n\n return {\n handleBodyScroll,\n hasHorizontalScrollEndOffset,\n hasHorizontalScrollStartOffset,\n tableFooterRowRef,\n tableHeadRowRef,\n };\n};\n"],"names":["TABLE_HORIZONTAL_SCROLL_EVENT","getScrollLeftFromEvent","event","currentTarget","target","useHorizontalSectionSync","enabled","hasFooterCells","tableHeadRowRef","useRef","tableFooterRowRef","previousScrollLeftRef","hasHorizontalScrollStartOffset","setHasHorizontalScrollStartOffset","useState","hasHorizontalScrollEndOffset","setHasHorizontalScrollEndOffset","syncHorizontalSections","useCallback","scrollLeft","applyTransform","element","handleBodyScroll","maxScrollLeft","remainingScrollLeft","useEffect"],"mappings":";AAEO,MAAMA,IAAgC,2BAEvCC,IAAyB,CAACC,MAA4C;AACxE,QAAMC,IAAgBD,GAAO;AAE7B,MAAIC,KAAiB,gBAAgBA;AACjC,WAAQA,EAA8B;AAG1C,QAAMC,IAASF,GAAO;AAEtB,SAAIE,KAAU,gBAAgBA,IAClBA,EAAuB,aAG5B;AACX,GAOaC,IAA2B,CAAC,EAAE,SAAAC,GAAS,gBAAAC,IAAiB,SAA0C;AAC3G,QAAMC,IAAkBC,EAAuB,IAAI,GAC7CC,IAAoBD,EAAuB,IAAI,GAC/CE,IAAwBF,EAAO,CAAC,GAEhC,CAACG,GAAgCC,CAAiC,IAAIC,EAAS,EAAK,GACpF,CAACC,GAA8BC,CAA+B,IAAIF,EAAS,EAAK,GAEhFG,IAAyBC;AAAA,IAC3B,CAACC,MAAuB;AACpB,YAAMC,IAAiB,CAACC,MAAmC;AACvD,YAAKA,GAIL;AAAA,cAAIF,MAAe,GAAG;AAClB,YAAAE,EAAQ,MAAM,eAAe,WAAW;AACxC;AAAA,UACJ;AAEA,UAAAA,EAAQ,MAAM,YAAY,eAAeF,CAAU;AAAA;AAAA,MACvD;AAEA,MAAAC,EAAeZ,EAAgB,OAAO,GAElCD,IACAa,EAAeV,EAAkB,OAAO,IACjCA,EAAkB,WACzBA,EAAkB,QAAQ,MAAM,eAAe,WAAW;AAAA,IAElE;AAAA,IACA,CAACH,CAAc;AAAA,EAAA,GAGbe,IAAmBJ;AAAA,IACrB,CAAChB,MAA4C;AACzC,YAAMC,IAAgBD,GAAO,eACvBiB,IAAalB,EAAuBC,CAAK,GACzCqB,IAAgBpB,IAChB,KAAK,IAAIA,EAAc,cAAcA,EAAc,aAAa,CAAC,IACjE,GACAqB,IAAsB,KAAK,IAAID,IAAgBJ,GAAY,CAAC;AAElE,MAAAN,EAAkCM,IAAa,CAAC,GAChDH,EAAgCQ,IAAsB,CAAC,GAEnDlB,KACAW,EAAuBE,CAAU,GAGjCA,MAAeR,EAAsB,YACrCA,EAAsB,UAAUQ,GAChC,OAAO,cAAc,IAAI,YAAYnB,CAA6B,CAAC;AAAA,IAE3E;AAAA,IACA,CAACM,GAASW,CAAsB;AAAA,EAAA;AAGpC,SAAAQ,EAAU,MAAM;AACZ,IAAKnB,MACDK,EAAsB,UAAU,GAChCE,EAAkC,EAAK,GACvCG,EAAgC,EAAK,GACrCC,EAAuB,CAAC;AAAA,EAEhC,GAAG,CAACX,GAASW,CAAsB,CAAC,GAE7B;AAAA,IACH,kBAAAK;AAAA,IACA,8BAAAP;AAAA,IACA,gCAAAH;AAAA,IACA,mBAAAF;AAAA,IACA,iBAAAF;AAAA,EAAA;AAER;"}
|