@rio-cloud/rio-uikit 2.3.0-beta.3 → 2.4.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.
Files changed (119) hide show
  1. package/MapPreviousViewportButton.d.ts +2 -0
  2. package/MapPreviousViewportButton.js +5 -0
  3. package/MapPreviousViewportButton.js.map +1 -0
  4. package/Table.js +16 -14
  5. package/TableNext.js +16 -14
  6. package/TableRowActionsDropdown.d.ts +2 -0
  7. package/TableRowActionsDropdown.js +5 -0
  8. package/TableRowActionsDropdown.js.map +1 -0
  9. package/components/dropdown/ButtonDropdown.d.ts +4 -0
  10. package/components/dropdown/ButtonDropdown.js +82 -80
  11. package/components/dropdown/ButtonDropdown.js.map +1 -1
  12. package/components/map/components/Map.js +219 -182
  13. package/components/map/components/Map.js.map +1 -1
  14. package/components/map/components/MapContext.d.ts +4 -0
  15. package/components/map/components/MapContext.js +11 -7
  16. package/components/map/components/MapContext.js.map +1 -1
  17. package/components/map/components/MapPosition.d.ts +1 -1
  18. package/components/map/components/MapPosition.js +20 -13
  19. package/components/map/components/MapPosition.js.map +1 -1
  20. package/components/map/components/features/MapZoom.d.ts +0 -1
  21. package/components/map/components/features/MapZoom.js +12 -20
  22. package/components/map/components/features/MapZoom.js.map +1 -1
  23. package/components/map/components/features/settings/MapSettingsTile.d.ts +27 -0
  24. package/components/map/components/features/settings/MapSettingsTile.js +17 -17
  25. package/components/map/components/features/settings/MapSettingsTile.js.map +1 -1
  26. package/components/map/components/features/settings/buttons/MapPreviousViewportButton.d.ts +10 -0
  27. package/components/map/components/features/settings/buttons/MapPreviousViewportButton.js +23 -0
  28. package/components/map/components/features/settings/buttons/MapPreviousViewportButton.js.map +1 -0
  29. package/components/map/hooks/useMapViewportHistory.d.ts +19 -0
  30. package/components/map/hooks/useMapViewportHistory.js +116 -0
  31. package/components/map/hooks/useMapViewportHistory.js.map +1 -0
  32. package/components/map/icons/MapIcon.d.ts +1 -0
  33. package/components/map/icons/MapIcon.js +46 -37
  34. package/components/map/icons/MapIcon.js.map +1 -1
  35. package/components/map/utils/mapTypes.d.ts +12 -0
  36. package/components/map/utils/mapTypes.js.map +1 -1
  37. package/components/map/utils/mapUtils.d.ts +2 -0
  38. package/components/map/utils/mapUtils.js +4 -0
  39. package/components/map/utils/mapUtils.js.map +1 -1
  40. package/components/selects/Multiselect.d.ts +6 -0
  41. package/components/selects/Multiselect.js +85 -83
  42. package/components/selects/Multiselect.js.map +1 -1
  43. package/components/selects/Select.d.ts +6 -0
  44. package/components/selects/Select.js +79 -71
  45. package/components/selects/Select.js.map +1 -1
  46. package/components/table/Table.d.ts +5 -1
  47. package/components/table/Table.js +234 -210
  48. package/components/table/Table.js.map +1 -1
  49. package/components/table/Table.types.d.ts +55 -0
  50. package/components/table/TableExpandAllGroupsButton.d.ts +25 -0
  51. package/components/table/TableExpandAllGroupsButton.js +27 -0
  52. package/components/table/TableExpandAllGroupsButton.js.map +1 -0
  53. package/components/table/TableExpandedRow.d.ts +4 -0
  54. package/components/table/TableExpandedRow.js +101 -84
  55. package/components/table/TableExpandedRow.js.map +1 -1
  56. package/components/table/TableExpanderButton.js +11 -11
  57. package/components/table/TableExpanderButton.js.map +1 -1
  58. package/components/table/TableGroupRow.d.ts +16 -2
  59. package/components/table/TableGroupRow.js +57 -22
  60. package/components/table/TableGroupRow.js.map +1 -1
  61. package/components/table/TableHeader.d.ts +1 -9
  62. package/components/table/TableHeader.js +82 -65
  63. package/components/table/TableHeader.js.map +1 -1
  64. package/components/table/TableRow.d.ts +7 -1
  65. package/components/table/TableRow.js +89 -72
  66. package/components/table/TableRow.js.map +1 -1
  67. package/components/table/TableRowActionsDropdown.d.ts +11 -0
  68. package/components/table/TableRowActionsDropdown.js +22 -0
  69. package/components/table/TableRowActionsDropdown.js.map +1 -0
  70. package/components/table/TableStickyRowButton.d.ts +25 -0
  71. package/components/table/TableStickyRowButton.js +32 -0
  72. package/components/table/TableStickyRowButton.js.map +1 -0
  73. package/components/table/TableToolbar.d.ts +24 -3
  74. package/components/table/TableToolbar.js +78 -37
  75. package/components/table/TableToolbar.js.map +1 -1
  76. package/components/table/TableViewToggles.js +5 -5
  77. package/components/table/TableViewToggles.js.map +1 -1
  78. package/components/table/context/TableInteractionContext.d.ts +3 -0
  79. package/components/table/context/TableInteractionContext.js.map +1 -1
  80. package/components/table/context/TableRenderConfigContext.d.ts +2 -1
  81. package/components/table/context/TableRenderConfigContext.js.map +1 -1
  82. package/components/table/context/TableRenderContext.d.ts +1 -0
  83. package/components/table/context/TableRenderContext.js.map +1 -1
  84. package/components/table/layout/useMeasuredColumnMaxWidths.js +52 -54
  85. package/components/table/layout/useMeasuredColumnMaxWidths.js.map +1 -1
  86. package/components/table/layout/useTableLayout.d.ts +4 -1
  87. package/components/table/layout/useTableLayout.js +54 -48
  88. package/components/table/layout/useTableLayout.js.map +1 -1
  89. package/components/table/layout/useTableVirtualization.js +51 -56
  90. package/components/table/layout/useTableVirtualization.js.map +1 -1
  91. package/components/table/model/resolveResponsiveViewType.d.ts +2 -0
  92. package/components/table/model/resolveResponsiveViewType.js +27 -0
  93. package/components/table/model/resolveResponsiveViewType.js.map +1 -0
  94. package/components/table/render/header/TableHeaderCellContent.js +4 -4
  95. package/components/table/render/header/TableHeaderCellContent.js.map +1 -1
  96. package/components/table/render/header/TableHeaderSelectionCell.d.ts +3 -0
  97. package/components/table/render/header/TableHeaderSelectionCell.js +25 -14
  98. package/components/table/render/header/TableHeaderSelectionCell.js.map +1 -1
  99. package/components/table/runtime/useRenderDraftState.js +1 -0
  100. package/components/table/runtime/useRenderDraftState.js.map +1 -1
  101. package/components/table/runtime/useResponsiveResolvedViewType.d.ts +23 -0
  102. package/components/table/runtime/useResponsiveResolvedViewType.js +22 -0
  103. package/components/table/runtime/useResponsiveResolvedViewType.js.map +1 -0
  104. package/components/table/selection/useInternalTableSelectionState.d.ts +2 -0
  105. package/components/table/selection/useInternalTableSelectionState.js +29 -17
  106. package/components/table/selection/useInternalTableSelectionState.js.map +1 -1
  107. package/components/table/selection/useTableSelection.d.ts +5 -1
  108. package/components/table/selection/useTableSelection.js +37 -26
  109. package/components/table/selection/useTableSelection.js.map +1 -1
  110. package/components/table/shared/parsePixelSize.d.ts +2 -0
  111. package/components/table/shared/parsePixelSize.js +13 -0
  112. package/components/table/shared/parsePixelSize.js.map +1 -0
  113. package/hooks/useResizeObserver.d.ts +25 -6
  114. package/hooks/useResizeObserver.js +20 -18
  115. package/hooks/useResizeObserver.js.map +1 -1
  116. package/package.json +10 -10
  117. package/version.d.ts +1 -1
  118. package/version.js +2 -2
  119. package/version.js.map +1 -1
@@ -1,92 +1,87 @@
1
- import { useState as M, useCallback as c, useEffect as T, useMemo as O } from "react";
2
- const V = 50, E = (m, i) => m.start === i.start && m.end === i.end, I = (m) => {
3
- const { enabled: i, overscan: d, rows: r, scrollContainer: v, viewportHeightFallback: w } = m, [l, H] = M({
1
+ import { useState as B, useCallback as a, useEffect as E, useMemo as I } from "react";
2
+ import L from "../../../hooks/useResizeObserver.js";
3
+ const O = 50, x = (d, i) => d.start === i.start && d.end === i.end, P = (d) => {
4
+ const { enabled: i, overscan: u, rows: r, scrollContainer: k, viewportHeightFallback: w } = d, c = k?.view ?? null, [, , { blockSize: f }] = L(c), [l, H] = B({
4
5
  itemHeights: {},
5
6
  scrollTop: 0,
6
7
  viewportHeight: 0,
7
8
  visibleRange: { start: 0, end: 10 }
8
- }), b = c(() => v?.view ?? null, [v]), f = c(() => {
9
+ }), v = a(() => c, [c]), p = a(() => {
9
10
  const e = Object.values(l.itemHeights);
10
- return e.length === 0 ? V : e.reduce((t, n) => t + n, 0) / e.length;
11
- }, [l.itemHeights]), g = c(
12
- (e) => l.itemHeights[e] ?? f(),
13
- [f, l.itemHeights]
14
- ), p = c(
11
+ return e.length === 0 ? O : e.reduce((t, n) => t + n, 0) / e.length;
12
+ }, [l.itemHeights]), h = a(
13
+ (e) => l.itemHeights[e] ?? p(),
14
+ [p, l.itemHeights]
15
+ ), T = a(
15
16
  (e) => {
16
17
  let t = 0;
17
18
  for (let n = 0; n < e; n++)
18
- t += g(n);
19
+ t += h(n);
19
20
  return t;
20
21
  },
21
- [g]
22
- ), x = c(() => {
22
+ [h]
23
+ ), V = a(() => {
23
24
  let e = 0;
24
25
  for (let t = 0; t < r.length; t++)
25
- e += g(t);
26
+ e += h(t);
26
27
  return e;
27
- }, [g, r.length]), h = c(
28
+ }, [h, r.length]), m = a(
28
29
  (e, t) => {
29
30
  if (!i || r.length === 0)
30
31
  return { start: 0, end: r.length };
31
- let n = 0, a = 0;
32
+ let n = 0, g = 0;
32
33
  for (; n < r.length; ) {
33
- const o = g(n);
34
- if (a + o > e - d * o)
34
+ const o = h(n);
35
+ if (g + o > e - u * o)
35
36
  break;
36
- a += o, n++;
37
+ g += o, n++;
37
38
  }
38
39
  let s = n;
39
40
  for (; s < r.length; ) {
40
- const o = g(s);
41
- if (a > e + t + d * o)
41
+ const o = h(s);
42
+ if (g > e + t + u * o)
42
43
  break;
43
- a += o, s++;
44
+ g += o, s++;
44
45
  }
45
46
  return {
46
- start: Math.max(0, n - d),
47
- end: Math.min(r.length, s + d)
47
+ start: Math.max(0, n - u),
48
+ end: Math.min(r.length, s + u)
48
49
  };
49
50
  },
50
- [i, g, d, r.length]
51
- ), u = c(() => {
52
- const e = b();
51
+ [i, h, u, r.length]
52
+ ), b = a(() => {
53
+ const e = v();
53
54
  if (!e)
54
55
  return;
55
- const t = e.clientHeight || w || 0, n = e.scrollTop, a = h(n, t);
56
+ const t = e.clientHeight || f || w || 0, n = e.scrollTop, g = m(n, t);
56
57
  H(
57
- (s) => s.scrollTop === n && s.viewportHeight === t && E(s.visibleRange, a) ? s : {
58
+ (s) => s.scrollTop === n && s.viewportHeight === t && x(s.visibleRange, g) ? s : {
58
59
  ...s,
59
60
  scrollTop: n,
60
61
  viewportHeight: t,
61
- visibleRange: a
62
+ visibleRange: g
62
63
  }
63
64
  );
64
- }, [h, b, w]);
65
- T(() => {
66
- if (!i)
67
- return;
68
- const e = b();
69
- if (!e)
70
- return;
71
- u(), e.addEventListener("scroll", u, { passive: !0 });
72
- const t = new ResizeObserver(u);
73
- return t.observe(e), () => {
74
- e.removeEventListener("scroll", u), t.disconnect();
75
- };
76
- }, [i, b, u]), T(() => {
65
+ }, [m, v, f, w]);
66
+ E(() => {
67
+ if (i && c)
68
+ return b(), c.addEventListener("scroll", b, { passive: !0 }), () => {
69
+ c.removeEventListener("scroll", b);
70
+ };
71
+ }, [i, b, c]), E(() => {
77
72
  i && H((e) => {
78
- const t = h(e.scrollTop, e.viewportHeight);
79
- return E(e.visibleRange, t) ? e : {
73
+ const t = m(e.scrollTop, e.viewportHeight);
74
+ return x(e.visibleRange, t) ? e : {
80
75
  ...e,
81
76
  visibleRange: t
82
77
  };
83
78
  });
84
- }, [h, i, r]);
85
- const k = c(
79
+ }, [m, i, r]);
80
+ const z = a(
86
81
  (e, t) => {
87
82
  if (!t)
88
83
  return;
89
- const n = t.getBoundingClientRect(), a = window.getComputedStyle(t), s = n.height + Number.parseFloat(a.marginTop || "0") + Number.parseFloat(a.marginBottom || "0");
84
+ const n = t.getBoundingClientRect(), g = window.getComputedStyle(t), s = n.height + Number.parseFloat(g.marginTop || "0") + Number.parseFloat(g.marginBottom || "0");
90
85
  s <= 0 || H((o) => {
91
86
  if (o.itemHeights[e] === s)
92
87
  return o;
@@ -99,27 +94,27 @@ const V = 50, E = (m, i) => m.start === i.start && m.end === i.end, I = (m) => {
99
94
  };
100
95
  return {
101
96
  ...R,
102
- visibleRange: h(R.scrollTop, R.viewportHeight)
97
+ visibleRange: m(R.scrollTop, R.viewportHeight)
103
98
  };
104
99
  });
105
100
  },
106
- [h]
107
- ), z = O(
101
+ [m]
102
+ ), C = I(
108
103
  () => i ? r.slice(l.visibleRange.start, l.visibleRange.end).map((e, t) => ({
109
104
  index: l.visibleRange.start + t,
110
105
  row: e
111
106
  })) : [],
112
107
  [i, r, l.visibleRange.end, l.visibleRange.start]
113
- ), C = i ? p(l.visibleRange.start) : 0, F = i ? Math.max(0, x() - p(l.visibleRange.end)) : 0;
108
+ ), F = i ? T(l.visibleRange.start) : 0, M = i ? Math.max(0, V() - T(l.visibleRange.end)) : 0;
114
109
  return {
115
110
  isVirtualized: i,
116
- measureRow: k,
117
- paddingBottom: F,
118
- paddingTop: C,
119
- virtualRows: z
111
+ measureRow: z,
112
+ paddingBottom: M,
113
+ paddingTop: F,
114
+ virtualRows: C
120
115
  };
121
116
  };
122
117
  export {
123
- I as default
118
+ P as default
124
119
  };
125
120
  //# sourceMappingURL=useTableVirtualization.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTableVirtualization.js","sources":["../../../../src/components/table/layout/useTableVirtualization.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\ntype TableVirtualScrollContainer = {\n view?: HTMLDivElement | null;\n};\n\ntype TableVirtualRow<RowType> = {\n index: number;\n row: RowType;\n};\n\ntype UseTableVirtualizationOptions<RowType> = {\n enabled: boolean;\n overscan: number;\n rows: RowType[];\n scrollContainer: TableVirtualScrollContainer | null;\n viewportHeightFallback?: number;\n};\n\ntype TableVirtualizationState = {\n itemHeights: Record<number, number>;\n scrollTop: number;\n viewportHeight: number;\n visibleRange: {\n start: number;\n end: number;\n };\n};\n\nconst DEFAULT_ROW_HEIGHT = 50;\n\nconst areVisibleRangesEqual = (\n currentRange: TableVirtualizationState['visibleRange'],\n nextRange: TableVirtualizationState['visibleRange']\n) => currentRange.start === nextRange.start && currentRange.end === nextRange.end;\n\nconst useTableVirtualization = <RowType>(options: UseTableVirtualizationOptions<RowType>) => {\n const { enabled, overscan, rows, scrollContainer, viewportHeightFallback } = options;\n const [state, setState] = useState<TableVirtualizationState>({\n itemHeights: {},\n scrollTop: 0,\n viewportHeight: 0,\n visibleRange: { start: 0, end: 10 },\n });\n\n const getScrollElement = useCallback(() => scrollContainer?.view ?? null, [scrollContainer]);\n\n const getEstimatedRowHeight = useCallback(() => {\n const measuredHeights = Object.values(state.itemHeights);\n\n if (measuredHeights.length === 0) {\n return DEFAULT_ROW_HEIGHT;\n }\n\n return measuredHeights.reduce((sum, height) => sum + height, 0) / measuredHeights.length;\n }, [state.itemHeights]);\n\n const getRowHeight = useCallback(\n (index: number) => state.itemHeights[index] ?? getEstimatedRowHeight(),\n [getEstimatedRowHeight, state.itemHeights]\n );\n\n const getItemPosition = useCallback(\n (index: number) => {\n let position = 0;\n\n for (let currentIndex = 0; currentIndex < index; currentIndex++) {\n position += getRowHeight(currentIndex);\n }\n\n return position;\n },\n [getRowHeight]\n );\n\n const getTotalHeight = useCallback(() => {\n let totalHeight = 0;\n\n for (let index = 0; index < rows.length; index++) {\n totalHeight += getRowHeight(index);\n }\n\n return totalHeight;\n }, [getRowHeight, rows.length]);\n\n const calculateVisibleRange = useCallback(\n (scrollTop: number, viewportHeight: number) => {\n if (!enabled || rows.length === 0) {\n return { start: 0, end: rows.length };\n }\n\n let start = 0;\n let currentPosition = 0;\n\n while (start < rows.length) {\n const rowHeight = getRowHeight(start);\n\n if (currentPosition + rowHeight > scrollTop - overscan * rowHeight) {\n break;\n }\n\n currentPosition += rowHeight;\n start++;\n }\n\n let end = start;\n\n while (end < rows.length) {\n const rowHeight = getRowHeight(end);\n\n if (currentPosition > scrollTop + viewportHeight + overscan * rowHeight) {\n break;\n }\n\n currentPosition += rowHeight;\n end++;\n }\n\n return {\n start: Math.max(0, start - overscan),\n end: Math.min(rows.length, end + overscan),\n };\n },\n [enabled, getRowHeight, overscan, rows.length]\n );\n\n const handleScroll = useCallback(() => {\n const scrollElement = getScrollElement();\n\n if (!scrollElement) {\n return;\n }\n\n const viewportHeight = scrollElement.clientHeight || viewportHeightFallback || 0;\n const scrollTop = scrollElement.scrollTop;\n const visibleRange = calculateVisibleRange(scrollTop, viewportHeight);\n\n setState(previousState =>\n previousState.scrollTop === scrollTop &&\n previousState.viewportHeight === viewportHeight &&\n areVisibleRangesEqual(previousState.visibleRange, visibleRange)\n ? previousState\n : {\n ...previousState,\n scrollTop,\n viewportHeight,\n visibleRange,\n }\n );\n }, [calculateVisibleRange, getScrollElement, viewportHeightFallback]);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n const scrollElement = getScrollElement();\n\n if (!scrollElement) {\n return;\n }\n\n handleScroll();\n scrollElement.addEventListener('scroll', handleScroll, { passive: true });\n\n const resizeObserver = new ResizeObserver(handleScroll);\n resizeObserver.observe(scrollElement);\n\n return () => {\n scrollElement.removeEventListener('scroll', handleScroll);\n resizeObserver.disconnect();\n };\n }, [enabled, getScrollElement, handleScroll]);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n setState(previousState => {\n const visibleRange = calculateVisibleRange(previousState.scrollTop, previousState.viewportHeight);\n\n return areVisibleRangesEqual(previousState.visibleRange, visibleRange)\n ? previousState\n : {\n ...previousState,\n visibleRange,\n };\n });\n }, [calculateVisibleRange, enabled, rows]);\n\n const measureRow = useCallback(\n (index: number, element: HTMLElement | null) => {\n if (!element) {\n return;\n }\n\n const rect = element.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(element);\n const height =\n rect.height +\n Number.parseFloat(computedStyle.marginTop || '0') +\n Number.parseFloat(computedStyle.marginBottom || '0');\n\n if (height <= 0) {\n return;\n }\n\n setState(previousState => {\n if (previousState.itemHeights[index] === height) {\n return previousState;\n }\n\n const nextState = {\n ...previousState,\n itemHeights: {\n ...previousState.itemHeights,\n [index]: height,\n },\n };\n\n return {\n ...nextState,\n visibleRange: calculateVisibleRange(nextState.scrollTop, nextState.viewportHeight),\n };\n });\n },\n [calculateVisibleRange]\n );\n\n const virtualRows = useMemo<TableVirtualRow<RowType>[]>(\n () =>\n enabled\n ? rows.slice(state.visibleRange.start, state.visibleRange.end).map((row, offset) => {\n const index = state.visibleRange.start + offset;\n\n return {\n index,\n row,\n };\n })\n : [],\n [enabled, rows, state.visibleRange.end, state.visibleRange.start]\n );\n\n const paddingTop = enabled ? getItemPosition(state.visibleRange.start) : 0;\n const paddingBottom = enabled ? Math.max(0, getTotalHeight() - getItemPosition(state.visibleRange.end)) : 0;\n\n return {\n isVirtualized: enabled,\n measureRow,\n paddingBottom,\n paddingTop,\n virtualRows,\n };\n};\n\nexport default useTableVirtualization;\n"],"names":["DEFAULT_ROW_HEIGHT","areVisibleRangesEqual","currentRange","nextRange","useTableVirtualization","options","enabled","overscan","rows","scrollContainer","viewportHeightFallback","state","setState","useState","getScrollElement","useCallback","getEstimatedRowHeight","measuredHeights","sum","height","getRowHeight","index","getItemPosition","position","currentIndex","getTotalHeight","totalHeight","calculateVisibleRange","scrollTop","viewportHeight","start","currentPosition","rowHeight","end","handleScroll","scrollElement","visibleRange","previousState","useEffect","resizeObserver","measureRow","element","rect","computedStyle","nextState","virtualRows","useMemo","row","offset","paddingTop","paddingBottom"],"mappings":"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"}
1
+ {"version":3,"file":"useTableVirtualization.js","sources":["../../../../src/components/table/layout/useTableVirtualization.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport useResizeObserver from '../../../useResizeObserver';\n\ntype TableVirtualScrollContainer = {\n view?: HTMLDivElement | null;\n};\n\ntype TableVirtualRow<RowType> = {\n index: number;\n row: RowType;\n};\n\ntype UseTableVirtualizationOptions<RowType> = {\n enabled: boolean;\n overscan: number;\n rows: RowType[];\n scrollContainer: TableVirtualScrollContainer | null;\n viewportHeightFallback?: number;\n};\n\ntype TableVirtualizationState = {\n itemHeights: Record<number, number>;\n scrollTop: number;\n viewportHeight: number;\n visibleRange: {\n start: number;\n end: number;\n };\n};\n\nconst DEFAULT_ROW_HEIGHT = 50;\n\nconst areVisibleRangesEqual = (\n currentRange: TableVirtualizationState['visibleRange'],\n nextRange: TableVirtualizationState['visibleRange']\n) => currentRange.start === nextRange.start && currentRange.end === nextRange.end;\n\nconst useTableVirtualization = <RowType>(options: UseTableVirtualizationOptions<RowType>) => {\n const { enabled, overscan, rows, scrollContainer, viewportHeightFallback } = options;\n const scrollElement = scrollContainer?.view ?? null;\n const [, , { blockSize: observedViewportHeight }] = useResizeObserver(scrollElement);\n const [state, setState] = useState<TableVirtualizationState>({\n itemHeights: {},\n scrollTop: 0,\n viewportHeight: 0,\n visibleRange: { start: 0, end: 10 },\n });\n\n const getScrollElement = useCallback(() => scrollElement, [scrollElement]);\n\n const getEstimatedRowHeight = useCallback(() => {\n const measuredHeights = Object.values(state.itemHeights);\n\n if (measuredHeights.length === 0) {\n return DEFAULT_ROW_HEIGHT;\n }\n\n return measuredHeights.reduce((sum, height) => sum + height, 0) / measuredHeights.length;\n }, [state.itemHeights]);\n\n const getRowHeight = useCallback(\n (index: number) => state.itemHeights[index] ?? getEstimatedRowHeight(),\n [getEstimatedRowHeight, state.itemHeights]\n );\n\n const getItemPosition = useCallback(\n (index: number) => {\n let position = 0;\n\n for (let currentIndex = 0; currentIndex < index; currentIndex++) {\n position += getRowHeight(currentIndex);\n }\n\n return position;\n },\n [getRowHeight]\n );\n\n const getTotalHeight = useCallback(() => {\n let totalHeight = 0;\n\n for (let index = 0; index < rows.length; index++) {\n totalHeight += getRowHeight(index);\n }\n\n return totalHeight;\n }, [getRowHeight, rows.length]);\n\n const calculateVisibleRange = useCallback(\n (scrollTop: number, viewportHeight: number) => {\n if (!enabled || rows.length === 0) {\n return { start: 0, end: rows.length };\n }\n\n let start = 0;\n let currentPosition = 0;\n\n while (start < rows.length) {\n const rowHeight = getRowHeight(start);\n\n if (currentPosition + rowHeight > scrollTop - overscan * rowHeight) {\n break;\n }\n\n currentPosition += rowHeight;\n start++;\n }\n\n let end = start;\n\n while (end < rows.length) {\n const rowHeight = getRowHeight(end);\n\n if (currentPosition > scrollTop + viewportHeight + overscan * rowHeight) {\n break;\n }\n\n currentPosition += rowHeight;\n end++;\n }\n\n return {\n start: Math.max(0, start - overscan),\n end: Math.min(rows.length, end + overscan),\n };\n },\n [enabled, getRowHeight, overscan, rows.length]\n );\n\n const handleScroll = useCallback(() => {\n const scrollElement = getScrollElement();\n\n if (!scrollElement) {\n return;\n }\n\n const viewportHeight = scrollElement.clientHeight || observedViewportHeight || viewportHeightFallback || 0;\n const scrollTop = scrollElement.scrollTop;\n const visibleRange = calculateVisibleRange(scrollTop, viewportHeight);\n\n setState(previousState =>\n previousState.scrollTop === scrollTop &&\n previousState.viewportHeight === viewportHeight &&\n areVisibleRangesEqual(previousState.visibleRange, visibleRange)\n ? previousState\n : {\n ...previousState,\n scrollTop,\n viewportHeight,\n visibleRange,\n }\n );\n }, [calculateVisibleRange, getScrollElement, observedViewportHeight, viewportHeightFallback]);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n if (!scrollElement) {\n return;\n }\n\n handleScroll();\n scrollElement.addEventListener('scroll', handleScroll, { passive: true });\n\n return () => {\n scrollElement.removeEventListener('scroll', handleScroll);\n };\n }, [enabled, handleScroll, scrollElement]);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n setState(previousState => {\n const visibleRange = calculateVisibleRange(previousState.scrollTop, previousState.viewportHeight);\n\n return areVisibleRangesEqual(previousState.visibleRange, visibleRange)\n ? previousState\n : {\n ...previousState,\n visibleRange,\n };\n });\n }, [calculateVisibleRange, enabled, rows]);\n\n const measureRow = useCallback(\n (index: number, element: HTMLElement | null) => {\n if (!element) {\n return;\n }\n\n const rect = element.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(element);\n const height =\n rect.height +\n Number.parseFloat(computedStyle.marginTop || '0') +\n Number.parseFloat(computedStyle.marginBottom || '0');\n\n if (height <= 0) {\n return;\n }\n\n setState(previousState => {\n if (previousState.itemHeights[index] === height) {\n return previousState;\n }\n\n const nextState = {\n ...previousState,\n itemHeights: {\n ...previousState.itemHeights,\n [index]: height,\n },\n };\n\n return {\n ...nextState,\n visibleRange: calculateVisibleRange(nextState.scrollTop, nextState.viewportHeight),\n };\n });\n },\n [calculateVisibleRange]\n );\n\n const virtualRows = useMemo<TableVirtualRow<RowType>[]>(\n () =>\n enabled\n ? rows.slice(state.visibleRange.start, state.visibleRange.end).map((row, offset) => {\n const index = state.visibleRange.start + offset;\n\n return {\n index,\n row,\n };\n })\n : [],\n [enabled, rows, state.visibleRange.end, state.visibleRange.start]\n );\n\n const paddingTop = enabled ? getItemPosition(state.visibleRange.start) : 0;\n const paddingBottom = enabled ? Math.max(0, getTotalHeight() - getItemPosition(state.visibleRange.end)) : 0;\n\n return {\n isVirtualized: enabled,\n measureRow,\n paddingBottom,\n paddingTop,\n virtualRows,\n };\n};\n\nexport default useTableVirtualization;\n"],"names":["DEFAULT_ROW_HEIGHT","areVisibleRangesEqual","currentRange","nextRange","useTableVirtualization","options","enabled","overscan","rows","scrollContainer","viewportHeightFallback","scrollElement","observedViewportHeight","useResizeObserver","state","setState","useState","getScrollElement","useCallback","getEstimatedRowHeight","measuredHeights","sum","height","getRowHeight","index","getItemPosition","position","currentIndex","getTotalHeight","totalHeight","calculateVisibleRange","scrollTop","viewportHeight","start","currentPosition","rowHeight","end","handleScroll","visibleRange","previousState","useEffect","measureRow","element","rect","computedStyle","nextState","virtualRows","useMemo","row","offset","paddingTop","paddingBottom"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { TableResponsiveBreakpoint, TableViewType } from '../Table.types';
2
+ export declare const resolveResponsiveViewType: (viewType: TableViewType, wrapperWidth: number | undefined, responsiveBreakpoint: TableResponsiveBreakpoint | undefined) => TableViewType;
@@ -0,0 +1,27 @@
1
+ import s from "../shared/parsePixelSize.js";
2
+ const r = (i) => {
3
+ if (typeof i == "number")
4
+ return Number.isFinite(i) ? i : void 0;
5
+ const t = i.trim();
6
+ if (!t || typeof window > "u" || typeof document > "u")
7
+ return;
8
+ const o = s(t);
9
+ if (o !== void 0)
10
+ return o;
11
+ const e = document.createElement("div");
12
+ e.style.position = "absolute", e.style.visibility = "hidden", e.style.pointerEvents = "none", e.style.boxSizing = "border-box", e.style.width = t, e.style.height = "0", e.style.padding = "0", e.style.border = "0", document.body.appendChild(e);
13
+ const n = e.getBoundingClientRect().width;
14
+ return e.remove(), Number.isFinite(n) ? n : void 0;
15
+ }, d = (i) => i ? {
16
+ multiCardsMaxWidth: i.cards !== void 0 ? r(i.cards) : void 0,
17
+ singleCardMaxWidth: i.list !== void 0 ? r(i.list) : void 0
18
+ } : {}, m = (i, t, o) => {
19
+ if (t === void 0)
20
+ return i;
21
+ const { multiCardsMaxWidth: e, singleCardMaxWidth: n } = d(o);
22
+ return n !== void 0 && t < n ? "SINGLE_CARD" : e !== void 0 && t < e ? "MULTI_CARDS" : i;
23
+ };
24
+ export {
25
+ m as resolveResponsiveViewType
26
+ };
27
+ //# sourceMappingURL=resolveResponsiveViewType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveResponsiveViewType.js","sources":["../../../../src/components/table/model/resolveResponsiveViewType.ts"],"sourcesContent":["import type { TableResponsiveBreakpoint, TableViewType } from '../Table.types';\nimport parsePixelSize from '../shared/parsePixelSize';\n\nconst resolveResponsiveBreakpointPx = (value: number | string): number | undefined => {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : undefined;\n }\n\n const trimmedValue = value.trim();\n\n if (!trimmedValue) {\n return;\n }\n\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n const pixelSize = parsePixelSize(trimmedValue);\n\n if (pixelSize !== undefined) {\n return pixelSize;\n }\n\n const measurementElement = document.createElement('div');\n measurementElement.style.position = 'absolute';\n measurementElement.style.visibility = 'hidden';\n measurementElement.style.pointerEvents = 'none';\n measurementElement.style.boxSizing = 'border-box';\n measurementElement.style.width = trimmedValue;\n measurementElement.style.height = '0';\n measurementElement.style.padding = '0';\n measurementElement.style.border = '0';\n document.body.appendChild(measurementElement);\n\n const resolvedWidth = measurementElement.getBoundingClientRect().width;\n\n measurementElement.remove();\n\n return Number.isFinite(resolvedWidth) ? resolvedWidth : undefined;\n};\n\nconst resolveResponsiveBreakpointsPx = (value: TableResponsiveBreakpoint | undefined) => {\n if (!value) {\n return {};\n }\n\n return {\n multiCardsMaxWidth: value.cards !== undefined ? resolveResponsiveBreakpointPx(value.cards) : undefined,\n singleCardMaxWidth: value.list !== undefined ? resolveResponsiveBreakpointPx(value.list) : undefined,\n };\n};\n\nexport const resolveResponsiveViewType = (\n viewType: TableViewType,\n wrapperWidth: number | undefined,\n responsiveBreakpoint: TableResponsiveBreakpoint | undefined\n): TableViewType => {\n if (viewType !== 'TABLE' || wrapperWidth === undefined) {\n return viewType;\n }\n\n const { multiCardsMaxWidth, singleCardMaxWidth } = resolveResponsiveBreakpointsPx(responsiveBreakpoint);\n\n if (singleCardMaxWidth !== undefined && wrapperWidth < singleCardMaxWidth) {\n return 'SINGLE_CARD';\n }\n\n if (multiCardsMaxWidth !== undefined && wrapperWidth < multiCardsMaxWidth) {\n return 'MULTI_CARDS';\n }\n\n return viewType;\n};\n"],"names":["resolveResponsiveBreakpointPx","value","trimmedValue","pixelSize","parsePixelSize","measurementElement","resolvedWidth","resolveResponsiveBreakpointsPx","resolveResponsiveViewType","viewType","wrapperWidth","responsiveBreakpoint","multiCardsMaxWidth","singleCardMaxWidth"],"mappings":";AAGA,MAAMA,IAAgC,CAACC,MAA+C;AAClF,MAAI,OAAOA,KAAU;AACjB,WAAO,OAAO,SAASA,CAAK,IAAIA,IAAQ;AAG5C,QAAMC,IAAeD,EAAM,KAAA;AAM3B,MAJI,CAACC,KAID,OAAO,SAAW,OAAe,OAAO,WAAa;AACrD;AAEJ,QAAMC,IAAYC,EAAeF,CAAY;AAE7C,MAAIC,MAAc;AACd,WAAOA;AAGX,QAAME,IAAqB,SAAS,cAAc,KAAK;AACvD,EAAAA,EAAmB,MAAM,WAAW,YACpCA,EAAmB,MAAM,aAAa,UACtCA,EAAmB,MAAM,gBAAgB,QACzCA,EAAmB,MAAM,YAAY,cACrCA,EAAmB,MAAM,QAAQH,GACjCG,EAAmB,MAAM,SAAS,KAClCA,EAAmB,MAAM,UAAU,KACnCA,EAAmB,MAAM,SAAS,KAClC,SAAS,KAAK,YAAYA,CAAkB;AAE5C,QAAMC,IAAgBD,EAAmB,sBAAA,EAAwB;AAEjE,SAAAA,EAAmB,OAAA,GAEZ,OAAO,SAASC,CAAa,IAAIA,IAAgB;AAC5D,GAEMC,IAAiC,CAACN,MAC/BA,IAIE;AAAA,EACH,oBAAoBA,EAAM,UAAU,SAAYD,EAA8BC,EAAM,KAAK,IAAI;AAAA,EAC7F,oBAAoBA,EAAM,SAAS,SAAYD,EAA8BC,EAAM,IAAI,IAAI;AAAA,IALpF,CAAA,GASFO,IAA4B,CACrCC,GACAC,GACAC,MACgB;AAChB,MAA4BD,MAAiB;AACzC,WAAOD;AAGX,QAAM,EAAE,oBAAAG,GAAoB,oBAAAC,MAAuBN,EAA+BI,CAAoB;AAEtG,SAAIE,MAAuB,UAAaH,IAAeG,IAC5C,gBAGPD,MAAuB,UAAaF,IAAeE,IAC5C,gBAGJH;AACX;"}
@@ -2,17 +2,17 @@ import { jsxs as r, jsx as a } from "react/jsx-runtime";
2
2
  import l from "../../../../utils/classNames.js";
3
3
  import p from "../../SortArrows.js";
4
4
  const u = (c) => {
5
- const { column: e, dragActivatorProps: t, dragActivatorRef: n, hideWhileDragging: d, onSortChange: b } = c, i = e.hideLabel && typeof e.label == "string" ? e.label : void 0, s = e.hideLabel ? null : e.icon ? /* @__PURE__ */ r("span", { className: "display-inline-flex align-items-center gap-5", children: [
5
+ const { column: e, dragActivatorProps: t, dragActivatorRef: n, hideWhileDragging: d, onSortChange: b } = c, s = e.hideLabel && typeof e.label == "string" ? e.label : void 0, i = e.hideLabel ? null : e.icon ? /* @__PURE__ */ r("span", { className: "display-flex align-items-center gap-5", children: [
6
6
  /* @__PURE__ */ a("span", { className: l("text-color-dark rioglyph", e.icon) }),
7
7
  /* @__PURE__ */ a("span", { children: e.label })
8
- ] }) : e.label, o = s === null ? null : /* @__PURE__ */ a("span", { className: "table-head-label", children: s });
8
+ ] }) : e.label, o = i === null ? null : /* @__PURE__ */ a("span", { className: "table-head-label", children: i });
9
9
  return /* @__PURE__ */ a("div", { className: l("table-head-cell-content", d && "table-head-cell-content-hidden"), children: /* @__PURE__ */ r("div", { className: "table-head-cell-content-row", children: [
10
10
  e.sortable ? /* @__PURE__ */ a(
11
11
  "button",
12
12
  {
13
13
  type: "button",
14
14
  className: l("table-head-button", e.filter && "table-head-button-has-filter"),
15
- "aria-label": i,
15
+ "aria-label": s,
16
16
  onClick: (h) => b?.(
17
17
  e.columnKey ?? String(e.key),
18
18
  e.sortDirection === "asc" ? "desc" : "asc",
@@ -43,7 +43,7 @@ const u = (c) => {
43
43
  e.filter && "table-head-label-wrapper-has-filter",
44
44
  t && "table-head-drag-label"
45
45
  ),
46
- "aria-label": i,
46
+ "aria-label": s,
47
47
  ...t,
48
48
  children: o
49
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TableHeaderCellContent.js","sources":["../../../../../src/components/table/render/header/TableHeaderCellContent.tsx"],"sourcesContent":["import classNames from '../../../../utils/classNames';\nimport SortArrows from '../../SortArrows';\nimport type { TableRowData } from '../../Table.types';\nimport type { SharedHeaderCellProps } from './TableHeader.types';\n\nconst TableHeaderCellContent = (props: SharedHeaderCellProps<TableRowData>) => {\n const { column, dragActivatorProps, dragActivatorRef, hideWhileDragging, onSortChange } = props;\n\n const ariaLabel = column.hideLabel && typeof column.label === 'string' ? column.label : undefined;\n\n const labelContent = column.hideLabel ? null : column.icon ? (\n <span className='display-inline-flex align-items-center gap-5'>\n <span className={classNames('text-color-dark rioglyph', column.icon)} />\n <span>{column.label}</span>\n </span>\n ) : (\n column.label\n );\n\n const wrappedLabelContent = labelContent === null ? null : <span className='table-head-label'>{labelContent}</span>;\n\n return (\n <div className={classNames('table-head-cell-content', hideWhileDragging && 'table-head-cell-content-hidden')}>\n <div className='table-head-cell-content-row'>\n {column.sortable ? (\n <button\n type='button'\n className={classNames('table-head-button', column.filter && 'table-head-button-has-filter')}\n aria-label={ariaLabel}\n onClick={event =>\n onSortChange?.(\n column.columnKey ?? String(column.key),\n column.sortDirection === 'asc' ? 'desc' : 'asc',\n event\n )\n }\n >\n <span\n ref={dragActivatorRef}\n className={classNames(\n 'table-head-button-label',\n dragActivatorProps && 'table-head-drag-label'\n )}\n {...dragActivatorProps}\n >\n <SortArrows direction={column.sortDirection} />\n {wrappedLabelContent}\n </span>\n </button>\n ) : (\n <span\n ref={dragActivatorRef}\n className={classNames(\n 'table-head-label-wrapper',\n column.filter && 'table-head-label-wrapper-has-filter',\n dragActivatorProps && 'table-head-drag-label'\n )}\n aria-label={ariaLabel}\n {...dragActivatorProps}\n >\n {wrappedLabelContent}\n </span>\n )}\n {column.filter && <span className='table-head-filter'>{column.filter}</span>}\n </div>\n </div>\n );\n};\n\nexport default TableHeaderCellContent;\n"],"names":["TableHeaderCellContent","props","column","dragActivatorProps","dragActivatorRef","hideWhileDragging","onSortChange","ariaLabel","labelContent","jsxs","jsx","classNames","wrappedLabelContent","event","SortArrows"],"mappings":";;;AAKA,MAAMA,IAAyB,CAACC,MAA+C;AAC3E,QAAM,EAAE,QAAAC,GAAQ,oBAAAC,GAAoB,kBAAAC,GAAkB,mBAAAC,GAAmB,cAAAC,MAAiBL,GAEpFM,IAAYL,EAAO,aAAa,OAAOA,EAAO,SAAU,WAAWA,EAAO,QAAQ,QAElFM,IAAeN,EAAO,YAAY,OAAOA,EAAO,OAClD,gBAAAO,EAAC,QAAA,EAAK,WAAU,gDACZ,UAAA;AAAA,IAAA,gBAAAC,EAAC,UAAK,WAAWC,EAAW,4BAA4BT,EAAO,IAAI,GAAG;AAAA,IACtE,gBAAAQ,EAAC,QAAA,EAAM,UAAAR,EAAO,MAAA,CAAM;AAAA,EAAA,EAAA,CACxB,IAEAA,EAAO,OAGLU,IAAsBJ,MAAiB,OAAO,yBAAQ,QAAA,EAAK,WAAU,oBAAoB,UAAAA,EAAA,CAAa;AAE5G,SACI,gBAAAE,EAAC,OAAA,EAAI,WAAWC,EAAW,2BAA2BN,KAAqB,gCAAgC,GACvG,UAAA,gBAAAI,EAAC,OAAA,EAAI,WAAU,+BACV,UAAA;AAAA,IAAAP,EAAO,WACJ,gBAAAQ;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAWC,EAAW,qBAAqBT,EAAO,UAAU,8BAA8B;AAAA,QAC1F,cAAYK;AAAA,QACZ,SAAS,CAAAM,MACLP;AAAA,UACIJ,EAAO,aAAa,OAAOA,EAAO,GAAG;AAAA,UACrCA,EAAO,kBAAkB,QAAQ,SAAS;AAAA,UAC1CW;AAAA,QAAA;AAAA,QAIR,UAAA,gBAAAJ;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,KAAKL;AAAA,YACL,WAAWO;AAAA,cACP;AAAA,cACAR,KAAsB;AAAA,YAAA;AAAA,YAEzB,GAAGA;AAAA,YAEJ,UAAA;AAAA,cAAA,gBAAAO,EAACI,GAAA,EAAW,WAAWZ,EAAO,cAAA,CAAe;AAAA,cAC5CU;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACL;AAAA,IAAA,IAGJ,gBAAAF;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAKN;AAAA,QACL,WAAWO;AAAA,UACP;AAAA,UACAT,EAAO,UAAU;AAAA,UACjBC,KAAsB;AAAA,QAAA;AAAA,QAE1B,cAAYI;AAAA,QACX,GAAGJ;AAAA,QAEH,UAAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAGRV,EAAO,UAAU,gBAAAQ,EAAC,UAAK,WAAU,qBAAqB,YAAO,OAAA,CAAO;AAAA,EAAA,EAAA,CACzE,EAAA,CACJ;AAER;"}
1
+ {"version":3,"file":"TableHeaderCellContent.js","sources":["../../../../../src/components/table/render/header/TableHeaderCellContent.tsx"],"sourcesContent":["import classNames from '../../../../utils/classNames';\nimport SortArrows from '../../SortArrows';\nimport type { TableRowData } from '../../Table.types';\nimport type { SharedHeaderCellProps } from './TableHeader.types';\n\nconst TableHeaderCellContent = (props: SharedHeaderCellProps<TableRowData>) => {\n const { column, dragActivatorProps, dragActivatorRef, hideWhileDragging, onSortChange } = props;\n\n const ariaLabel = column.hideLabel && typeof column.label === 'string' ? column.label : undefined;\n\n const labelContent = column.hideLabel ? null : column.icon ? (\n <span className='display-flex align-items-center gap-5'>\n <span className={classNames('text-color-dark rioglyph', column.icon)} />\n <span>{column.label}</span>\n </span>\n ) : (\n column.label\n );\n\n const wrappedLabelContent = labelContent === null ? null : <span className='table-head-label'>{labelContent}</span>;\n\n return (\n <div className={classNames('table-head-cell-content', hideWhileDragging && 'table-head-cell-content-hidden')}>\n <div className='table-head-cell-content-row'>\n {column.sortable ? (\n <button\n type='button'\n className={classNames('table-head-button', column.filter && 'table-head-button-has-filter')}\n aria-label={ariaLabel}\n onClick={event =>\n onSortChange?.(\n column.columnKey ?? String(column.key),\n column.sortDirection === 'asc' ? 'desc' : 'asc',\n event\n )\n }\n >\n <span\n ref={dragActivatorRef}\n className={classNames(\n 'table-head-button-label',\n dragActivatorProps && 'table-head-drag-label'\n )}\n {...dragActivatorProps}\n >\n <SortArrows direction={column.sortDirection} />\n {wrappedLabelContent}\n </span>\n </button>\n ) : (\n <span\n ref={dragActivatorRef}\n className={classNames(\n 'table-head-label-wrapper',\n column.filter && 'table-head-label-wrapper-has-filter',\n dragActivatorProps && 'table-head-drag-label'\n )}\n aria-label={ariaLabel}\n {...dragActivatorProps}\n >\n {wrappedLabelContent}\n </span>\n )}\n {column.filter && <span className='table-head-filter'>{column.filter}</span>}\n </div>\n </div>\n );\n};\n\nexport default TableHeaderCellContent;\n"],"names":["TableHeaderCellContent","props","column","dragActivatorProps","dragActivatorRef","hideWhileDragging","onSortChange","ariaLabel","labelContent","jsxs","jsx","classNames","wrappedLabelContent","event","SortArrows"],"mappings":";;;AAKA,MAAMA,IAAyB,CAACC,MAA+C;AAC3E,QAAM,EAAE,QAAAC,GAAQ,oBAAAC,GAAoB,kBAAAC,GAAkB,mBAAAC,GAAmB,cAAAC,MAAiBL,GAEpFM,IAAYL,EAAO,aAAa,OAAOA,EAAO,SAAU,WAAWA,EAAO,QAAQ,QAElFM,IAAeN,EAAO,YAAY,OAAOA,EAAO,OAClD,gBAAAO,EAAC,QAAA,EAAK,WAAU,yCACZ,UAAA;AAAA,IAAA,gBAAAC,EAAC,UAAK,WAAWC,EAAW,4BAA4BT,EAAO,IAAI,GAAG;AAAA,IACtE,gBAAAQ,EAAC,QAAA,EAAM,UAAAR,EAAO,MAAA,CAAM;AAAA,EAAA,EAAA,CACxB,IAEAA,EAAO,OAGLU,IAAsBJ,MAAiB,OAAO,yBAAQ,QAAA,EAAK,WAAU,oBAAoB,UAAAA,EAAA,CAAa;AAE5G,SACI,gBAAAE,EAAC,OAAA,EAAI,WAAWC,EAAW,2BAA2BN,KAAqB,gCAAgC,GACvG,UAAA,gBAAAI,EAAC,OAAA,EAAI,WAAU,+BACV,UAAA;AAAA,IAAAP,EAAO,WACJ,gBAAAQ;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAWC,EAAW,qBAAqBT,EAAO,UAAU,8BAA8B;AAAA,QAC1F,cAAYK;AAAA,QACZ,SAAS,CAAAM,MACLP;AAAA,UACIJ,EAAO,aAAa,OAAOA,EAAO,GAAG;AAAA,UACrCA,EAAO,kBAAkB,QAAQ,SAAS;AAAA,UAC1CW;AAAA,QAAA;AAAA,QAIR,UAAA,gBAAAJ;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,KAAKL;AAAA,YACL,WAAWO;AAAA,cACP;AAAA,cACAR,KAAsB;AAAA,YAAA;AAAA,YAEzB,GAAGA;AAAA,YAEJ,UAAA;AAAA,cAAA,gBAAAO,EAACI,GAAA,EAAW,WAAWZ,EAAO,cAAA,CAAe;AAAA,cAC5CU;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACL;AAAA,IAAA,IAGJ,gBAAAF;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAKN;AAAA,QACL,WAAWO;AAAA,UACP;AAAA,UACAT,EAAO,UAAU;AAAA,UACjBC,KAAsB;AAAA,QAAA;AAAA,QAE1B,cAAYI;AAAA,QACX,GAAGJ;AAAA,QAEH,UAAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAGRV,EAAO,UAAU,gBAAAQ,EAAC,UAAK,WAAU,qBAAqB,YAAO,OAAA,CAAO;AAAA,EAAA,EAAA,CACzE,EAAA,CACJ;AAER;"}
@@ -1,9 +1,12 @@
1
+ import { TableVerticalAlign } from '../../Table.types';
1
2
  type TableHeaderSelectionCellProps = {
2
3
  isAllSelected?: boolean;
3
4
  isSomeRowsSelected?: boolean;
4
5
  onToggleAllSelection?: () => void;
6
+ disabled?: boolean;
5
7
  rowCount: number;
6
8
  selectionHeaderContent?: React.ReactNode;
9
+ selectionCheckboxVerticalAlignment?: TableVerticalAlign;
7
10
  };
8
11
  declare const TableHeaderSelectionCell: (props: TableHeaderSelectionCellProps) => import("react/jsx-runtime").JSX.Element;
9
12
  export default TableHeaderSelectionCell;
@@ -1,33 +1,44 @@
1
1
  import { jsx as o } from "react/jsx-runtime";
2
- import c from "../../../checkbox/Checkbox.js";
3
- import s from "../../../../utils/classNames.js";
4
- import { resolveAriaSpan as d } from "../../shared/resolveTableAria.js";
5
- const h = (a) => {
6
- const { isAllSelected: l, isSomeRowsSelected: r, onToggleAllSelection: i, rowCount: n, selectionHeaderContent: t } = a;
2
+ import m from "../../../checkbox/Checkbox.js";
3
+ import d from "../../../../utils/classNames.js";
4
+ import { getVerticalAlignClassName as p } from "../../shared/getAlignClassName.js";
5
+ import { resolveAriaSpan as g } from "../../shared/resolveTableAria.js";
6
+ const w = (n) => {
7
+ const {
8
+ isAllSelected: l,
9
+ isSomeRowsSelected: i,
10
+ onToggleAllSelection: r,
11
+ disabled: c,
12
+ rowCount: t,
13
+ selectionHeaderContent: a,
14
+ selectionCheckboxVerticalAlignment: s
15
+ } = n;
7
16
  return /* @__PURE__ */ o(
8
17
  "div",
9
18
  {
10
- className: s(
19
+ className: d(
11
20
  "table-head-cell table-selection-cell table-align-center",
12
- t && "table-selection-cell-custom-content"
21
+ p(s),
22
+ a && "table-selection-cell-custom-content"
13
23
  ),
14
24
  role: "columnheader",
15
25
  "aria-colindex": 1,
16
26
  "aria-rowindex": 1,
17
- "aria-rowspan": d(n),
18
- style: { gridColumn: "1 / span 1", gridRow: `1 / span ${n}` },
27
+ "aria-rowspan": g(t),
28
+ style: { gridColumn: "1 / span 1", gridRow: `1 / span ${t}` },
19
29
  children: /* @__PURE__ */ o(
20
30
  "div",
21
31
  {
22
32
  className: "table-selection-control",
23
33
  onClick: (e) => e.stopPropagation(),
24
34
  onKeyDown: (e) => e.stopPropagation(),
25
- children: t ?? /* @__PURE__ */ o(
26
- c,
35
+ children: a ?? /* @__PURE__ */ o(
36
+ m,
27
37
  {
28
38
  checked: l,
29
- indeterminate: !l && !!r,
30
- onChange: () => i?.()
39
+ disabled: c,
40
+ indeterminate: !l && !!i,
41
+ onChange: () => r?.()
31
42
  }
32
43
  )
33
44
  }
@@ -36,6 +47,6 @@ const h = (a) => {
36
47
  );
37
48
  };
38
49
  export {
39
- h as default
50
+ w as default
40
51
  };
41
52
  //# sourceMappingURL=TableHeaderSelectionCell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableHeaderSelectionCell.js","sources":["../../../../../src/components/table/render/header/TableHeaderSelectionCell.tsx"],"sourcesContent":["import Checkbox from '../../../checkbox/Checkbox';\nimport classNames from '../../../../utils/classNames';\nimport { resolveAriaSpan } from '../../shared/resolveTableAria';\n\ntype TableHeaderSelectionCellProps = {\n isAllSelected?: boolean;\n isSomeRowsSelected?: boolean;\n onToggleAllSelection?: () => void;\n rowCount: number;\n selectionHeaderContent?: React.ReactNode;\n};\n\nconst TableHeaderSelectionCell = (props: TableHeaderSelectionCellProps) => {\n const { isAllSelected, isSomeRowsSelected, onToggleAllSelection, rowCount, selectionHeaderContent } = props;\n\n return (\n <div\n className={classNames(\n 'table-head-cell table-selection-cell table-align-center',\n selectionHeaderContent && 'table-selection-cell-custom-content'\n )}\n role='columnheader'\n aria-colindex={1}\n aria-rowindex={1}\n aria-rowspan={resolveAriaSpan(rowCount)}\n style={{ gridColumn: '1 / span 1', gridRow: `1 / span ${rowCount}` }}\n >\n <div\n className='table-selection-control'\n onClick={event => event.stopPropagation()}\n onKeyDown={event => event.stopPropagation()}\n >\n {selectionHeaderContent ?? (\n <Checkbox\n checked={isAllSelected}\n indeterminate={!isAllSelected && !!isSomeRowsSelected}\n onChange={() => onToggleAllSelection?.()}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport default TableHeaderSelectionCell;\n"],"names":["TableHeaderSelectionCell","props","isAllSelected","isSomeRowsSelected","onToggleAllSelection","rowCount","selectionHeaderContent","jsx","classNames","resolveAriaSpan","event","Checkbox"],"mappings":";;;;AAYA,MAAMA,IAA2B,CAACC,MAAyC;AACvE,QAAM,EAAE,eAAAC,GAAe,oBAAAC,GAAoB,sBAAAC,GAAsB,UAAAC,GAAU,wBAAAC,MAA2BL;AAEtG,SACI,gBAAAM;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWC;AAAA,QACP;AAAA,QACAF,KAA0B;AAAA,MAAA;AAAA,MAE9B,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,gBAAcG,EAAgBJ,CAAQ;AAAA,MACtC,OAAO,EAAE,YAAY,cAAc,SAAS,YAAYA,CAAQ,GAAA;AAAA,MAEhE,UAAA,gBAAAE;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAU;AAAA,UACV,SAAS,CAAAG,MAASA,EAAM,gBAAA;AAAA,UACxB,WAAW,CAAAA,MAASA,EAAM,gBAAA;AAAA,UAEzB,UAAAJ,KACG,gBAAAC;AAAA,YAACI;AAAA,YAAA;AAAA,cACG,SAAST;AAAA,cACT,eAAe,CAACA,KAAiB,CAAC,CAACC;AAAA,cACnC,UAAU,MAAMC,IAAA;AAAA,YAAuB;AAAA,UAAA;AAAA,QAC3C;AAAA,MAAA;AAAA,IAER;AAAA,EAAA;AAGZ;"}
1
+ {"version":3,"file":"TableHeaderSelectionCell.js","sources":["../../../../../src/components/table/render/header/TableHeaderSelectionCell.tsx"],"sourcesContent":["import Checkbox from '../../../checkbox/Checkbox';\nimport classNames from '../../../../utils/classNames';\nimport { getVerticalAlignClassName } from '../../shared/getAlignClassName';\nimport { resolveAriaSpan } from '../../shared/resolveTableAria';\nimport type { TableVerticalAlign } from '../../Table.types';\n\ntype TableHeaderSelectionCellProps = {\n isAllSelected?: boolean;\n isSomeRowsSelected?: boolean;\n onToggleAllSelection?: () => void;\n disabled?: boolean;\n rowCount: number;\n selectionHeaderContent?: React.ReactNode;\n selectionCheckboxVerticalAlignment?: TableVerticalAlign;\n};\n\nconst TableHeaderSelectionCell = (props: TableHeaderSelectionCellProps) => {\n const {\n isAllSelected,\n isSomeRowsSelected,\n onToggleAllSelection,\n disabled,\n rowCount,\n selectionHeaderContent,\n selectionCheckboxVerticalAlignment,\n } = props;\n\n return (\n <div\n className={classNames(\n 'table-head-cell table-selection-cell table-align-center',\n getVerticalAlignClassName(selectionCheckboxVerticalAlignment),\n selectionHeaderContent && 'table-selection-cell-custom-content'\n )}\n role='columnheader'\n aria-colindex={1}\n aria-rowindex={1}\n aria-rowspan={resolveAriaSpan(rowCount)}\n style={{ gridColumn: '1 / span 1', gridRow: `1 / span ${rowCount}` }}\n >\n <div\n className='table-selection-control'\n onClick={event => event.stopPropagation()}\n onKeyDown={event => event.stopPropagation()}\n >\n {selectionHeaderContent ?? (\n <Checkbox\n checked={isAllSelected}\n disabled={disabled}\n indeterminate={!isAllSelected && !!isSomeRowsSelected}\n onChange={() => onToggleAllSelection?.()}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport default TableHeaderSelectionCell;\n"],"names":["TableHeaderSelectionCell","props","isAllSelected","isSomeRowsSelected","onToggleAllSelection","disabled","rowCount","selectionHeaderContent","selectionCheckboxVerticalAlignment","jsx","classNames","getVerticalAlignClassName","resolveAriaSpan","event","Checkbox"],"mappings":";;;;;AAgBA,MAAMA,IAA2B,CAACC,MAAyC;AACvE,QAAM;AAAA,IACF,eAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,oCAAAC;AAAA,EAAA,IACAP;AAEJ,SACI,gBAAAQ;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWC;AAAA,QACP;AAAA,QACAC,EAA0BH,CAAkC;AAAA,QAC5DD,KAA0B;AAAA,MAAA;AAAA,MAE9B,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,gBAAcK,EAAgBN,CAAQ;AAAA,MACtC,OAAO,EAAE,YAAY,cAAc,SAAS,YAAYA,CAAQ,GAAA;AAAA,MAEhE,UAAA,gBAAAG;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAU;AAAA,UACV,SAAS,CAAAI,MAASA,EAAM,gBAAA;AAAA,UACxB,WAAW,CAAAA,MAASA,EAAM,gBAAA;AAAA,UAEzB,UAAAN,KACG,gBAAAE;AAAA,YAACK;AAAA,YAAA;AAAA,cACG,SAASZ;AAAA,cACT,UAAAG;AAAA,cACA,eAAe,CAACH,KAAiB,CAAC,CAACC;AAAA,cACnC,UAAU,MAAMC,IAAA;AAAA,YAAuB;AAAA,UAAA;AAAA,QAC3C;AAAA,MAAA;AAAA,IAER;AAAA,EAAA;AAGZ;"}
@@ -2,6 +2,7 @@ import { useRef as v, useState as f, useLayoutEffect as B, useCallback as M } fr
2
2
  const h = (o) => `${o.kind}-${String(o.rowId)}`, S = [
3
3
  "id",
4
4
  "columnKey",
5
+ "label",
5
6
  "width",
6
7
  "mobileLabel",
7
8
  "horizontalAlign",
@@ -1 +1 @@
1
- {"version":3,"file":"useRenderDraftState.js","sources":["../../../../src/components/table/runtime/useRenderDraftState.ts"],"sourcesContent":["import { useCallback, useLayoutEffect, useRef, useState, type ReactNode, type RefObject } from 'react';\n\nimport type { RenderBodyRow, RenderHeaderColumn, TableRenderDraft } from '../context/TableRenderContext';\nimport type { TableRowData } from '../Table.types';\n\ntype RenderDraftState<RowType extends TableRowData> = {\n headerColumns: RenderHeaderColumn<RowType>[];\n bodyRows: RenderBodyRow<RowType>[];\n bodyMaxHeight?: string;\n hasFooter: boolean;\n hasFooterCells?: boolean;\n hasExpandableRows?: boolean;\n};\n\nconst getRenderBodyRowRendererKey = <RowType extends TableRowData>(\n row: Pick<TableRenderDraft<RowType>['bodyRows'][number], 'kind' | 'rowId'>\n) => `${row.kind}-${String(row.rowId)}`;\n\nconst renderHeaderColumnComparisonKeys = [\n 'id',\n 'columnKey',\n 'width',\n 'mobileLabel',\n 'horizontalAlign',\n 'verticalAlign',\n 'headerClassName',\n 'hideOnMobile',\n 'sortable',\n 'draggable',\n 'resizeable',\n 'minResizeWidth',\n 'maxResizeWidth',\n 'row',\n 'colSpan',\n 'rowSpan',\n] as const satisfies ReadonlyArray<keyof RenderHeaderColumn<TableRowData>>;\n\nconst renderBodyRowComparisonKeys = ['rowId', 'rowIndex', 'kind', 'disabled'] as const satisfies ReadonlyArray<\n keyof RenderBodyRow<TableRowData>\n>;\n\nconst haveSameRenderHeaderColumns = <RowType extends TableRowData>(\n currentColumns: RenderHeaderColumn<RowType>[],\n nextColumns: RenderHeaderColumn<RowType>[]\n) =>\n currentColumns.length === nextColumns.length &&\n currentColumns.every((currentColumn, index) => {\n const nextColumn = nextColumns[index];\n\n return (\n nextColumn !== undefined &&\n renderHeaderColumnComparisonKeys.every(key => currentColumn[key] === nextColumn[key])\n );\n });\n\nconst haveSameRenderBodyRows = <RowType extends TableRowData>(\n currentRows: RenderBodyRow<RowType>[],\n nextRows: RenderBodyRow<RowType>[]\n) =>\n currentRows.length === nextRows.length &&\n currentRows.every((currentRow, index) => {\n const nextRow = nextRows[index];\n\n return nextRow !== undefined && renderBodyRowComparisonKeys.every(key => currentRow[key] === nextRow[key]);\n });\n\nconst dedupeRenderHeaderColumns = <RowType extends TableRowData>(headerColumns: RenderHeaderColumn<RowType>[]) => {\n const seenColumnIds = new Set<string>();\n\n return headerColumns.filter(column => {\n if (seenColumnIds.has(column.id)) {\n return false;\n }\n\n seenColumnIds.add(column.id);\n return true;\n });\n};\n\nconst dedupeRenderBodyRows = <RowType extends TableRowData>(bodyRows: TableRenderDraft<RowType>['bodyRows']) => {\n const seenRowKeys = new Set<string>();\n\n return bodyRows.filter(row => {\n const rowKey = `${row.kind}-${String(row.rowId)}`;\n\n if (seenRowKeys.has(rowKey)) {\n return false;\n }\n\n seenRowKeys.add(rowKey);\n return true;\n });\n};\n\nconst createRenderBodyRowRendererMap = <RowType extends TableRowData>(\n bodyRows: TableRenderDraft<RowType>['bodyRows']\n) => new Map(bodyRows.map(row => [getRenderBodyRowRendererKey(row), row.render] as const));\n\nexport type UseRenderDraftStateReturn<RowType extends TableRowData> = {\n renderHeaderColumns: RenderHeaderColumn<RowType>[];\n renderBodyRows: RenderBodyRow<RowType>[];\n renderBodyMaxHeight?: string;\n renderHasFooter: boolean;\n renderHasFooterCells?: boolean;\n renderHasExpandableRows?: boolean;\n renderBodyRow: (row: RenderBodyRow<RowType>) => ReactNode;\n};\n\nexport const useRenderDraftState = <RowType extends TableRowData>(\n renderDraftRef: RefObject<TableRenderDraft<RowType>>\n): UseRenderDraftStateReturn<RowType> => {\n const bodyRowRenderersRef = useRef(new Map<string, () => ReactNode>());\n const [renderDraftState, setRenderDraftState] = useState<RenderDraftState<RowType>>({\n headerColumns: [],\n bodyRows: [],\n bodyMaxHeight: undefined,\n hasFooter: false,\n hasFooterCells: undefined,\n hasExpandableRows: undefined,\n });\n\n useLayoutEffect(() => {\n const draft = renderDraftRef.current;\n\n if (!draft) {\n return;\n }\n\n const nextHeaderColumns = dedupeRenderHeaderColumns(draft.headerColumns);\n const nextBodyRowsWithRenderers = dedupeRenderBodyRows(draft.bodyRows);\n const nextBodyRows = nextBodyRowsWithRenderers.map(({ render: _render, ...bodyRow }) => bodyRow);\n const nextBodyRowRenderers = createRenderBodyRowRendererMap(nextBodyRowsWithRenderers);\n const nextBodyMaxHeight = draft.bodyMaxHeight;\n const nextHasFooter = draft.hasFooter === true;\n const nextHasFooterCells = draft.hasFooterCells;\n const nextHasExpandableRows = draft.hasExpandableRows;\n\n // Keep render functions out of React state. The draft state only tracks structural row\n // metadata, while the latest row render callbacks stay available via this ref.\n bodyRowRenderersRef.current = nextBodyRowRenderers;\n\n const resolvedHeaderColumns = haveSameRenderHeaderColumns(renderDraftState.headerColumns, nextHeaderColumns)\n ? renderDraftState.headerColumns\n : nextHeaderColumns;\n const resolvedBodyRows = haveSameRenderBodyRows(renderDraftState.bodyRows, nextBodyRows)\n ? renderDraftState.bodyRows\n : nextBodyRows;\n const resolvedBodyMaxHeight =\n renderDraftState.bodyMaxHeight === nextBodyMaxHeight ? renderDraftState.bodyMaxHeight : nextBodyMaxHeight;\n const resolvedHasFooter =\n renderDraftState.hasFooter === nextHasFooter ? renderDraftState.hasFooter : nextHasFooter;\n const resolvedHasFooterCells =\n renderDraftState.hasFooterCells === nextHasFooterCells\n ? renderDraftState.hasFooterCells\n : nextHasFooterCells;\n const resolvedHasExpandableRows =\n renderDraftState.hasExpandableRows === nextHasExpandableRows\n ? renderDraftState.hasExpandableRows\n : nextHasExpandableRows;\n\n // Avoid scheduling a layout-state update when the normalized draft did not\n // actually change. This keeps the render/register cycle stable in StrictMode\n // and prevents resize-reset flows from bouncing through nested updates.\n if (\n renderDraftState.headerColumns === resolvedHeaderColumns &&\n renderDraftState.bodyRows === resolvedBodyRows &&\n renderDraftState.bodyMaxHeight === resolvedBodyMaxHeight &&\n renderDraftState.hasFooter === resolvedHasFooter &&\n renderDraftState.hasFooterCells === resolvedHasFooterCells &&\n renderDraftState.hasExpandableRows === resolvedHasExpandableRows\n ) {\n return;\n }\n\n setRenderDraftState({\n headerColumns: resolvedHeaderColumns,\n bodyRows: resolvedBodyRows,\n bodyMaxHeight: resolvedBodyMaxHeight,\n hasFooter: resolvedHasFooter,\n hasFooterCells: resolvedHasFooterCells,\n hasExpandableRows: resolvedHasExpandableRows,\n });\n });\n\n const renderBodyRow = useCallback(\n (row: RenderBodyRow<RowType>) => {\n const draft = renderDraftRef.current;\n const draftRowRenderers = draft\n ? createRenderBodyRowRendererMap(dedupeRenderBodyRows(draft.bodyRows))\n : undefined;\n const rowRenderer =\n draftRowRenderers?.get(getRenderBodyRowRendererKey(row)) ??\n bodyRowRenderersRef.current.get(getRenderBodyRowRendererKey(row));\n\n return rowRenderer?.() ?? null;\n },\n [renderDraftRef]\n );\n\n return {\n renderHeaderColumns: renderDraftState.headerColumns,\n renderBodyRows: renderDraftState.bodyRows,\n renderBodyMaxHeight: renderDraftState.bodyMaxHeight,\n renderHasFooter: renderDraftState.hasFooter,\n renderHasFooterCells: renderDraftState.hasFooterCells,\n renderHasExpandableRows: renderDraftState.hasExpandableRows,\n renderBodyRow,\n };\n};\n\nexport default useRenderDraftState;\n"],"names":["getRenderBodyRowRendererKey","row","renderHeaderColumnComparisonKeys","renderBodyRowComparisonKeys","haveSameRenderHeaderColumns","currentColumns","nextColumns","currentColumn","index","nextColumn","key","haveSameRenderBodyRows","currentRows","nextRows","currentRow","nextRow","dedupeRenderHeaderColumns","headerColumns","seenColumnIds","column","dedupeRenderBodyRows","bodyRows","seenRowKeys","rowKey","createRenderBodyRowRendererMap","useRenderDraftState","renderDraftRef","bodyRowRenderersRef","useRef","renderDraftState","setRenderDraftState","useState","useLayoutEffect","draft","nextHeaderColumns","nextBodyRowsWithRenderers","nextBodyRows","_render","bodyRow","nextBodyRowRenderers","nextBodyMaxHeight","nextHasFooter","nextHasFooterCells","nextHasExpandableRows","resolvedHeaderColumns","resolvedBodyRows","resolvedBodyMaxHeight","resolvedHasFooter","resolvedHasFooterCells","resolvedHasExpandableRows","renderBodyRow","useCallback"],"mappings":"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"}
1
+ {"version":3,"file":"useRenderDraftState.js","sources":["../../../../src/components/table/runtime/useRenderDraftState.ts"],"sourcesContent":["import { useCallback, useLayoutEffect, useRef, useState, type ReactNode, type RefObject } from 'react';\n\nimport type { RenderBodyRow, RenderHeaderColumn, TableRenderDraft } from '../context/TableRenderContext';\nimport type { TableRowData } from '../Table.types';\n\ntype RenderDraftState<RowType extends TableRowData> = {\n headerColumns: RenderHeaderColumn<RowType>[];\n bodyRows: RenderBodyRow<RowType>[];\n bodyMaxHeight?: string;\n hasFooter: boolean;\n hasFooterCells?: boolean;\n hasExpandableRows?: boolean;\n};\n\nconst getRenderBodyRowRendererKey = <RowType extends TableRowData>(\n row: Pick<TableRenderDraft<RowType>['bodyRows'][number], 'kind' | 'rowId'>\n) => `${row.kind}-${String(row.rowId)}`;\n\nconst renderHeaderColumnComparisonKeys = [\n 'id',\n 'columnKey',\n 'label',\n 'width',\n 'mobileLabel',\n 'horizontalAlign',\n 'verticalAlign',\n 'headerClassName',\n 'hideOnMobile',\n 'sortable',\n 'draggable',\n 'resizeable',\n 'minResizeWidth',\n 'maxResizeWidth',\n 'row',\n 'colSpan',\n 'rowSpan',\n] as const satisfies ReadonlyArray<keyof RenderHeaderColumn<TableRowData>>;\n\nconst renderBodyRowComparisonKeys = ['rowId', 'rowIndex', 'kind', 'disabled'] as const satisfies ReadonlyArray<\n keyof RenderBodyRow<TableRowData>\n>;\n\nconst haveSameRenderHeaderColumns = <RowType extends TableRowData>(\n currentColumns: RenderHeaderColumn<RowType>[],\n nextColumns: RenderHeaderColumn<RowType>[]\n) =>\n currentColumns.length === nextColumns.length &&\n currentColumns.every((currentColumn, index) => {\n const nextColumn = nextColumns[index];\n\n return (\n nextColumn !== undefined &&\n renderHeaderColumnComparisonKeys.every(key => currentColumn[key] === nextColumn[key])\n );\n });\n\nconst haveSameRenderBodyRows = <RowType extends TableRowData>(\n currentRows: RenderBodyRow<RowType>[],\n nextRows: RenderBodyRow<RowType>[]\n) =>\n currentRows.length === nextRows.length &&\n currentRows.every((currentRow, index) => {\n const nextRow = nextRows[index];\n\n return nextRow !== undefined && renderBodyRowComparisonKeys.every(key => currentRow[key] === nextRow[key]);\n });\n\nconst dedupeRenderHeaderColumns = <RowType extends TableRowData>(headerColumns: RenderHeaderColumn<RowType>[]) => {\n const seenColumnIds = new Set<string>();\n\n return headerColumns.filter(column => {\n if (seenColumnIds.has(column.id)) {\n return false;\n }\n\n seenColumnIds.add(column.id);\n return true;\n });\n};\n\nconst dedupeRenderBodyRows = <RowType extends TableRowData>(bodyRows: TableRenderDraft<RowType>['bodyRows']) => {\n const seenRowKeys = new Set<string>();\n\n return bodyRows.filter(row => {\n const rowKey = `${row.kind}-${String(row.rowId)}`;\n\n if (seenRowKeys.has(rowKey)) {\n return false;\n }\n\n seenRowKeys.add(rowKey);\n return true;\n });\n};\n\nconst createRenderBodyRowRendererMap = <RowType extends TableRowData>(\n bodyRows: TableRenderDraft<RowType>['bodyRows']\n) => new Map(bodyRows.map(row => [getRenderBodyRowRendererKey(row), row.render] as const));\n\nexport type UseRenderDraftStateReturn<RowType extends TableRowData> = {\n renderHeaderColumns: RenderHeaderColumn<RowType>[];\n renderBodyRows: RenderBodyRow<RowType>[];\n renderBodyMaxHeight?: string;\n renderHasFooter: boolean;\n renderHasFooterCells?: boolean;\n renderHasExpandableRows?: boolean;\n renderBodyRow: (row: RenderBodyRow<RowType>) => ReactNode;\n};\n\nexport const useRenderDraftState = <RowType extends TableRowData>(\n renderDraftRef: RefObject<TableRenderDraft<RowType>>\n): UseRenderDraftStateReturn<RowType> => {\n const bodyRowRenderersRef = useRef(new Map<string, () => ReactNode>());\n const [renderDraftState, setRenderDraftState] = useState<RenderDraftState<RowType>>({\n headerColumns: [],\n bodyRows: [],\n bodyMaxHeight: undefined,\n hasFooter: false,\n hasFooterCells: undefined,\n hasExpandableRows: undefined,\n });\n\n useLayoutEffect(() => {\n const draft = renderDraftRef.current;\n\n if (!draft) {\n return;\n }\n\n const nextHeaderColumns = dedupeRenderHeaderColumns(draft.headerColumns);\n const nextBodyRowsWithRenderers = dedupeRenderBodyRows(draft.bodyRows);\n const nextBodyRows = nextBodyRowsWithRenderers.map(({ render: _render, ...bodyRow }) => bodyRow);\n const nextBodyRowRenderers = createRenderBodyRowRendererMap(nextBodyRowsWithRenderers);\n const nextBodyMaxHeight = draft.bodyMaxHeight;\n const nextHasFooter = draft.hasFooter === true;\n const nextHasFooterCells = draft.hasFooterCells;\n const nextHasExpandableRows = draft.hasExpandableRows;\n\n // Keep render functions out of React state. The draft state only tracks structural row\n // metadata, while the latest row render callbacks stay available via this ref.\n bodyRowRenderersRef.current = nextBodyRowRenderers;\n\n const resolvedHeaderColumns = haveSameRenderHeaderColumns(renderDraftState.headerColumns, nextHeaderColumns)\n ? renderDraftState.headerColumns\n : nextHeaderColumns;\n const resolvedBodyRows = haveSameRenderBodyRows(renderDraftState.bodyRows, nextBodyRows)\n ? renderDraftState.bodyRows\n : nextBodyRows;\n const resolvedBodyMaxHeight =\n renderDraftState.bodyMaxHeight === nextBodyMaxHeight ? renderDraftState.bodyMaxHeight : nextBodyMaxHeight;\n const resolvedHasFooter =\n renderDraftState.hasFooter === nextHasFooter ? renderDraftState.hasFooter : nextHasFooter;\n const resolvedHasFooterCells =\n renderDraftState.hasFooterCells === nextHasFooterCells\n ? renderDraftState.hasFooterCells\n : nextHasFooterCells;\n const resolvedHasExpandableRows =\n renderDraftState.hasExpandableRows === nextHasExpandableRows\n ? renderDraftState.hasExpandableRows\n : nextHasExpandableRows;\n\n // Avoid scheduling a layout-state update when the normalized draft did not\n // actually change. This keeps the render/register cycle stable in StrictMode\n // and prevents resize-reset flows from bouncing through nested updates.\n if (\n renderDraftState.headerColumns === resolvedHeaderColumns &&\n renderDraftState.bodyRows === resolvedBodyRows &&\n renderDraftState.bodyMaxHeight === resolvedBodyMaxHeight &&\n renderDraftState.hasFooter === resolvedHasFooter &&\n renderDraftState.hasFooterCells === resolvedHasFooterCells &&\n renderDraftState.hasExpandableRows === resolvedHasExpandableRows\n ) {\n return;\n }\n\n setRenderDraftState({\n headerColumns: resolvedHeaderColumns,\n bodyRows: resolvedBodyRows,\n bodyMaxHeight: resolvedBodyMaxHeight,\n hasFooter: resolvedHasFooter,\n hasFooterCells: resolvedHasFooterCells,\n hasExpandableRows: resolvedHasExpandableRows,\n });\n });\n\n const renderBodyRow = useCallback(\n (row: RenderBodyRow<RowType>) => {\n const draft = renderDraftRef.current;\n const draftRowRenderers = draft\n ? createRenderBodyRowRendererMap(dedupeRenderBodyRows(draft.bodyRows))\n : undefined;\n const rowRenderer =\n draftRowRenderers?.get(getRenderBodyRowRendererKey(row)) ??\n bodyRowRenderersRef.current.get(getRenderBodyRowRendererKey(row));\n\n return rowRenderer?.() ?? null;\n },\n [renderDraftRef]\n );\n\n return {\n renderHeaderColumns: renderDraftState.headerColumns,\n renderBodyRows: renderDraftState.bodyRows,\n renderBodyMaxHeight: renderDraftState.bodyMaxHeight,\n renderHasFooter: renderDraftState.hasFooter,\n renderHasFooterCells: renderDraftState.hasFooterCells,\n renderHasExpandableRows: renderDraftState.hasExpandableRows,\n renderBodyRow,\n };\n};\n\nexport default useRenderDraftState;\n"],"names":["getRenderBodyRowRendererKey","row","renderHeaderColumnComparisonKeys","renderBodyRowComparisonKeys","haveSameRenderHeaderColumns","currentColumns","nextColumns","currentColumn","index","nextColumn","key","haveSameRenderBodyRows","currentRows","nextRows","currentRow","nextRow","dedupeRenderHeaderColumns","headerColumns","seenColumnIds","column","dedupeRenderBodyRows","bodyRows","seenRowKeys","rowKey","createRenderBodyRowRendererMap","useRenderDraftState","renderDraftRef","bodyRowRenderersRef","useRef","renderDraftState","setRenderDraftState","useState","useLayoutEffect","draft","nextHeaderColumns","nextBodyRowsWithRenderers","nextBodyRows","_render","bodyRow","nextBodyRowRenderers","nextBodyMaxHeight","nextHasFooter","nextHasFooterCells","nextHasExpandableRows","resolvedHeaderColumns","resolvedBodyRows","resolvedBodyMaxHeight","resolvedHasFooter","resolvedHasFooterCells","resolvedHasExpandableRows","renderBodyRow","useCallback"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { TableResponsiveBreakpoint, TableViewType } from '../Table.types';
2
+ type UseResponsiveResolvedViewTypeProps = {
3
+ onViewTypeChange?: (viewType: TableViewType) => void;
4
+ responsiveBreakpoint?: TableResponsiveBreakpoint;
5
+ viewType: TableViewType;
6
+ wrapperTableWidth?: string | number;
7
+ wrapperWidth?: number;
8
+ };
9
+ /**
10
+ * Resolves the effective table view when responsive breakpoints and manual view changes are both active.
11
+ *
12
+ * With `responsiveBreakpoint`, the table derives a responsive view bucket from the current rendered width:
13
+ * `TABLE`, `MULTI_CARDS`, or `SINGLE_CARD`.
14
+ *
15
+ * Manual view changes are intentionally sticky within the current responsive bucket. Example:
16
+ * when the width currently resolves to `MULTI_CARDS`, the user can still switch to `TABLE` manually.
17
+ * That manual choice stays active until resizing crosses into a different responsive bucket, at which point
18
+ * the hook clears the override and resolves the view from the current breakpoints again.
19
+ *
20
+ * Without `responsiveBreakpoint`, the hook simply returns the requested `viewType`.
21
+ */
22
+ declare const useResponsiveResolvedViewType: (props: UseResponsiveResolvedViewTypeProps) => TableViewType;
23
+ export default useResponsiveResolvedViewType;
@@ -0,0 +1,22 @@
1
+ import { useRef as v, useEffect as c } from "react";
2
+ import { resolveResponsiveViewType as w } from "../model/resolveResponsiveViewType.js";
3
+ import y from "../shared/parsePixelSize.js";
4
+ const h = (u) => {
5
+ const { onViewTypeChange: n, responsiveBreakpoint: p, viewType: r, wrapperTableWidth: a, wrapperWidth: d } = u, t = v(r), i = v(
6
+ void 0
7
+ ), e = p !== void 0, f = e ? y(a) ?? d : void 0, T = e && r !== t.current, o = e ? w("TABLE", f, p) : r;
8
+ e ? T && (i.current = {
9
+ responsiveViewType: o,
10
+ viewType: r
11
+ }) : i.current = void 0, e && i.current?.responsiveViewType !== o && (i.current = void 0);
12
+ const s = e ? i.current?.viewType ?? o : r;
13
+ return c(() => {
14
+ e && n?.(s);
15
+ }, [e, n, s]), c(() => {
16
+ t.current = r;
17
+ }, [r]), s;
18
+ };
19
+ export {
20
+ h as default
21
+ };
22
+ //# sourceMappingURL=useResponsiveResolvedViewType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResponsiveResolvedViewType.js","sources":["../../../../src/components/table/runtime/useResponsiveResolvedViewType.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport { resolveResponsiveViewType } from '../model/resolveResponsiveViewType';\nimport parsePixelSize from '../shared/parsePixelSize';\nimport type { TableResponsiveBreakpoint, TableViewType } from '../Table.types';\n\ntype UseResponsiveResolvedViewTypeProps = {\n onViewTypeChange?: (viewType: TableViewType) => void;\n responsiveBreakpoint?: TableResponsiveBreakpoint;\n viewType: TableViewType;\n wrapperTableWidth?: string | number;\n wrapperWidth?: number;\n};\n\n/**\n * Resolves the effective table view when responsive breakpoints and manual view changes are both active.\n *\n * With `responsiveBreakpoint`, the table derives a responsive view bucket from the current rendered width:\n * `TABLE`, `MULTI_CARDS`, or `SINGLE_CARD`.\n *\n * Manual view changes are intentionally sticky within the current responsive bucket. Example:\n * when the width currently resolves to `MULTI_CARDS`, the user can still switch to `TABLE` manually.\n * That manual choice stays active until resizing crosses into a different responsive bucket, at which point\n * the hook clears the override and resolves the view from the current breakpoints again.\n *\n * Without `responsiveBreakpoint`, the hook simply returns the requested `viewType`.\n */\nconst useResponsiveResolvedViewType = (props: UseResponsiveResolvedViewTypeProps): TableViewType => {\n const { onViewTypeChange, responsiveBreakpoint, viewType, wrapperTableWidth, wrapperWidth } = props;\n\n const previousPropViewTypeRef = useRef<TableViewType>(viewType);\n const manualOverrideRef = useRef<{ responsiveViewType: TableViewType; viewType: TableViewType } | undefined>(\n undefined\n );\n\n const hasResponsiveBreakpoint = responsiveBreakpoint !== undefined;\n const responsiveTableWidth = hasResponsiveBreakpoint\n ? (parsePixelSize(wrapperTableWidth) ?? wrapperWidth)\n : undefined;\n const hasRequestedViewTypeChange = hasResponsiveBreakpoint && viewType !== previousPropViewTypeRef.current;\n\n const responsiveViewType = hasResponsiveBreakpoint\n ? resolveResponsiveViewType('TABLE', responsiveTableWidth, responsiveBreakpoint)\n : viewType;\n\n if (!hasResponsiveBreakpoint) {\n manualOverrideRef.current = undefined;\n } else if (hasRequestedViewTypeChange) {\n manualOverrideRef.current = {\n responsiveViewType,\n viewType,\n };\n }\n\n if (hasResponsiveBreakpoint && manualOverrideRef.current?.responsiveViewType !== responsiveViewType) {\n manualOverrideRef.current = undefined;\n }\n\n const resolvedViewType = hasResponsiveBreakpoint\n ? (manualOverrideRef.current?.viewType ?? responsiveViewType)\n : viewType;\n\n useEffect(() => {\n if (!hasResponsiveBreakpoint) {\n return;\n }\n\n onViewTypeChange?.(resolvedViewType);\n }, [hasResponsiveBreakpoint, onViewTypeChange, resolvedViewType]);\n\n useEffect(() => {\n previousPropViewTypeRef.current = viewType;\n }, [viewType]);\n\n return resolvedViewType;\n};\n\nexport default useResponsiveResolvedViewType;\n"],"names":["useResponsiveResolvedViewType","props","onViewTypeChange","responsiveBreakpoint","viewType","wrapperTableWidth","wrapperWidth","previousPropViewTypeRef","useRef","manualOverrideRef","hasResponsiveBreakpoint","responsiveTableWidth","parsePixelSize","hasRequestedViewTypeChange","responsiveViewType","resolveResponsiveViewType","resolvedViewType","useEffect"],"mappings":";;;AA2BA,MAAMA,IAAgC,CAACC,MAA6D;AAChG,QAAM,EAAE,kBAAAC,GAAkB,sBAAAC,GAAsB,UAAAC,GAAU,mBAAAC,GAAmB,cAAAC,MAAiBL,GAExFM,IAA0BC,EAAsBJ,CAAQ,GACxDK,IAAoBD;AAAA,IACtB;AAAA,EAAA,GAGEE,IAA0BP,MAAyB,QACnDQ,IAAuBD,IACtBE,EAAeP,CAAiB,KAAKC,IACtC,QACAO,IAA6BH,KAA2BN,MAAaG,EAAwB,SAE7FO,IAAqBJ,IACrBK,EAA0B,SAASJ,GAAsBR,CAAoB,IAC7EC;AAEN,EAAKM,IAEMG,MACPJ,EAAkB,UAAU;AAAA,IACxB,oBAAAK;AAAA,IACA,UAAAV;AAAA,EAAA,KAJJK,EAAkB,UAAU,QAQ5BC,KAA2BD,EAAkB,SAAS,uBAAuBK,MAC7EL,EAAkB,UAAU;AAGhC,QAAMO,IAAmBN,IAClBD,EAAkB,SAAS,YAAYK,IACxCV;AAEN,SAAAa,EAAU,MAAM;AACZ,IAAKP,KAILR,IAAmBc,CAAgB;AAAA,EACvC,GAAG,CAACN,GAAyBR,GAAkBc,CAAgB,CAAC,GAEhEC,EAAU,MAAM;AACZ,IAAAV,EAAwB,UAAUH;AAAA,EACtC,GAAG,CAACA,CAAQ,CAAC,GAENY;AACX;"}
@@ -8,8 +8,10 @@ type UseInternalTableSelectionStateOptions<RowType extends TableRowData> = {
8
8
  type UseInternalTableSelectionStateReturn = {
9
9
  currentSelectedRowIds: TableRowId[];
10
10
  selectedRowIdSet: Set<TableRowId>;
11
+ selectableRowIdSet: Set<TableRowId>;
11
12
  isAllRowsSelected: boolean;
12
13
  isSomeRowsSelected: boolean;
14
+ hasSelectableRows: boolean;
13
15
  handleToggleAllSelection: () => void;
14
16
  handleToggleRowSelection: (rowId: TableRowId) => void;
15
17
  };