playbook_ui 14.21.2.pre.alpha.PLAY2005useClickpropreact8411 → 14.21.2.pre.alpha.PLAY2018verticalBordertableheaderborders8316
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.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/pb_advanced_table/Components/CustomCell.tsx +1 -4
- data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +0 -8
- data/app/pb_kits/playbook/pb_advanced_table/Components/VirtualizedTableView.tsx +16 -36
- data/app/pb_kits/playbook/pb_advanced_table/Context/AdvancedTableContext.tsx +5 -18
- data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableActions.ts +17 -37
- data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +5 -30
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +0 -3
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +40 -91
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/CellRendererUtils.tsx +1 -4
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/TableContainerStyles.ts +2 -3
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +4 -32
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +18 -36
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +2 -45
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pinned_rows.jsx +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pinned_rows_react.md +3 -5
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +0 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +1 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection.jsx +4 -7
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_clear_selection.jsx +3 -6
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.jsx +3 -6
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_value.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_value.jsx +4 -7
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.jsx +4 -7
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.jsx +10 -19
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.jsx +10 -19
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.html.erb +10 -10
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.html.erb +10 -10
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.html.erb +10 -10
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.jsx +11 -20
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.jsx +8 -8
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.html.erb +10 -10
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.jsx +14 -23
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_separators_hidden.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_separators_hidden.jsx +3 -6
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subcomponent_structure.jsx +3 -6
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subcomponent_structure_rails.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subtle_variant.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subtle_variant.jsx +3 -6
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb +4 -4
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.jsx +4 -4
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx +4 -4
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +4 -4
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_options.jsx +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_options_rails.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_padding.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_padding.jsx +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_trigger.jsx +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_trigger_rails.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.jsx +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_label.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_label.jsx +3 -6
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +0 -4
- data/app/pb_kits/playbook/pb_dropdown/docs/index.js +1 -3
- data/app/pb_kits/playbook/pb_filter/Filter/index.tsx +0 -13
- data/app/pb_kits/playbook/pb_filter/_filter.scss +0 -4
- data/app/pb_kits/playbook/pb_filter/docs/example.yml +0 -1
- data/app/pb_kits/playbook/pb_filter/docs/index.js +0 -1
- data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns.html.erb +8 -8
- data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns_rails.md +1 -1
- data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns.html.erb +12 -12
- data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns_rails.md +2 -2
- data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns.html.erb +12 -12
- data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns_rails.md +2 -2
- data/app/pb_kits/playbook/pb_table/index.ts +4 -4
- data/app/pb_kits/playbook/pb_table/styles/_vertical_border.scss +1 -1
- data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +22 -34
- data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +0 -1
- data/app/pb_kits/playbook/pb_tooltip/docs/index.js +0 -1
- data/dist/chunks/_typeahead-CoOpeYom.js +22 -0
- data/dist/chunks/_weekday_stacked-JnoR3mIy.js +45 -0
- data/dist/chunks/lib-D7Va7yqa.js +29 -0
- data/dist/chunks/{pb_form_validation-BVF3TmcL.js → pb_form_validation-DSkdRDMf.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +3 -3
- data/dist/playbook-rails-react-bindings.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/version.rb +1 -1
- metadata +6 -22
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_infinite_scroll.md +0 -3
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling.jsx +0 -64
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling.md +0 -7
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_icon_options.html.erb +0 -52
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_icon_options.jsx +0 -99
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_icon_options_rails.md +0 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_icon_options_react.md +0 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options.html.erb +0 -28
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options.jsx +0 -47
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options_rails.md +0 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options_react.md +0 -1
- data/app/pb_kits/playbook/pb_filter/Filter/FilterSection.tsx +0 -49
- data/app/pb_kits/playbook/pb_filter/Filter/FilterSidebar.tsx +0 -69
- data/app/pb_kits/playbook/pb_filter/docs/_filter_sidebar.jsx +0 -224
- data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_click_open.jsx +0 -25
- data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_click_open.md +0 -1
- data/dist/chunks/_typeahead-BaWcHxpx.js +0 -22
- data/dist/chunks/_weekday_stacked-F11OuLDi.js +0 -45
- data/dist/chunks/lib-CTkMyvfQ.js +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f270fbbbe2b5d39b2c4e597bce78bf42f296b29fb7bc46c9dc53d54da8b3f41f
|
4
|
+
data.tar.gz: 98c8a99f6307401f4258e8a82cb35dff0a6bba55ae0ebe87355aa5dbb4cf6478
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1c0eb914c5277515faa0dd378a98a69095572359928cb019140457962e0bbda150234897b34de00fafecf1731bf288e713b25343ae2fd7a64400b7e06e9500d
|
7
|
+
data.tar.gz: 0bb19d9408dc1d2be3f78ca3047c56c205eadf35f5d22a3ddece6383a6e1e621df0e060d85df4acc7e4ce4b594bac205968ee53dcde312ce95aec76009cf4f88
|
@@ -19,7 +19,6 @@ interface CustomCellProps {
|
|
19
19
|
value?: string
|
20
20
|
customRenderer?: (row: Row<GenericObject>, value: string | undefined) => React.ReactNode
|
21
21
|
selectableRows?: boolean
|
22
|
-
customStyle?: GenericObject
|
23
22
|
}
|
24
23
|
|
25
24
|
export const CustomCell = ({
|
@@ -29,7 +28,6 @@ export const CustomCell = ({
|
|
29
28
|
value,
|
30
29
|
customRenderer,
|
31
30
|
selectableRows,
|
32
|
-
customStyle = {},
|
33
31
|
}: CustomCellProps & GlobalProps) => {
|
34
32
|
const { setExpanded, expanded, expandedControl, inlineRowLoading, hasAnySubRows } = useContext(AdvancedTableContext);
|
35
33
|
|
@@ -45,7 +43,7 @@ export const CustomCell = ({
|
|
45
43
|
const renderButton = inlineRowLoading ? RowHasChildren : row.getCanExpand()
|
46
44
|
|
47
45
|
return (
|
48
|
-
<div style={{ paddingLeft: `${row.depth * 1.25}em`}}>
|
46
|
+
<div style={{ paddingLeft: `${row.depth * 1.25}em` }}>
|
49
47
|
<Flex
|
50
48
|
alignItems="center"
|
51
49
|
columnGap="xs"
|
@@ -67,7 +65,6 @@ export const CustomCell = ({
|
|
67
65
|
<button
|
68
66
|
className="gray-icon expand-toggle-icon"
|
69
67
|
onClick={() => handleOnExpand(row)}
|
70
|
-
style={{ color: customStyle?.expandButtonColor }}
|
71
68
|
>
|
72
69
|
{row.getIsExpanded() ? (
|
73
70
|
<Icon cursor="pointer"
|
@@ -27,7 +27,6 @@ const TableCellRenderer = ({
|
|
27
27
|
loading = false,
|
28
28
|
stickyLeftColumn,
|
29
29
|
columnPinning,
|
30
|
-
customRowStyle,
|
31
30
|
columnDefinitions,
|
32
31
|
}: {
|
33
32
|
row: Row<GenericObject>
|
@@ -35,7 +34,6 @@ const TableCellRenderer = ({
|
|
35
34
|
loading?: boolean | string
|
36
35
|
stickyLeftColumn?: string[]
|
37
36
|
columnPinning: { left: string[] }
|
38
|
-
customRowStyle?: GenericObject
|
39
37
|
columnDefinitions?: {[key:string]:any}[]
|
40
38
|
}) => {
|
41
39
|
return (
|
@@ -76,8 +74,6 @@ const TableCellRenderer = ({
|
|
76
74
|
? '180px'
|
77
75
|
: `${column.getStart("left")}px`
|
78
76
|
: undefined,
|
79
|
-
backgroundColor: i === 0 && customRowStyle?.backgroundColor,
|
80
|
-
color: customRowStyle?.fontColor,
|
81
77
|
}}
|
82
78
|
>
|
83
79
|
{collapsibleTrail && i === 0 && row.depth > 0 && renderCollapsibleTrail(row.depth)}
|
@@ -111,7 +107,6 @@ export const RegularTableView = ({
|
|
111
107
|
pinnedRows,
|
112
108
|
headerHeight,
|
113
109
|
rowHeight,
|
114
|
-
rowStyling = [],
|
115
110
|
sampleRowRef,
|
116
111
|
} = useContext(AdvancedTableContext)
|
117
112
|
|
@@ -176,7 +171,6 @@ export const RegularTableView = ({
|
|
176
171
|
const rowBackground = isExpandable && ((!inlineRowLoading && row.getCanExpand()) || (inlineRowLoading && rowHasNoChildren));
|
177
172
|
const rowColor = row.getIsSelected() ? "bg-row-selection" : rowBackground ? "bg-silver" : "bg-white";
|
178
173
|
const isFirstRegularRow = rowIndex === 0 && !row.getIsPinned();
|
179
|
-
const customRowStyle = rowStyling?.length > 0 && rowStyling?.find((s: GenericObject) => s?.rowId === row.id);
|
180
174
|
|
181
175
|
return (
|
182
176
|
<React.Fragment key={`${row.index}-${row.id}-${row.depth}-row`}>
|
@@ -195,7 +189,6 @@ export const RegularTableView = ({
|
|
195
189
|
className={`${rowColor} ${row.depth > 0 ? `depth-sub-row-${row.depth}` : ""}`}
|
196
190
|
id={`${row.index}-${row.id}-${row.depth}-row`}
|
197
191
|
ref={isFirstRegularRow ? sampleRowRef : null}
|
198
|
-
style={{backgroundColor: customRowStyle?.backgroundColor, color: customRowStyle?.fontColor}}
|
199
192
|
>
|
200
193
|
{/* Render custom checkbox column when we want selectableRows for non-expanding tables */}
|
201
194
|
{selectableRows && !hasAnySubRows && (
|
@@ -213,7 +206,6 @@ export const RegularTableView = ({
|
|
213
206
|
collapsibleTrail={collapsibleTrail}
|
214
207
|
columnDefinitions={columnDefinitions}
|
215
208
|
columnPinning={columnPinning}
|
216
|
-
customRowStyle={customRowStyle}
|
217
209
|
loading={loading}
|
218
210
|
row={row}
|
219
211
|
stickyLeftColumn={stickyLeftColumn}
|
@@ -1,6 +1,6 @@
|
|
1
|
-
import React, { useContext, useLayoutEffect, useState, useEffect
|
1
|
+
import React, { useContext, useLayoutEffect, useState, useEffect } from "react"
|
2
2
|
import classnames from "classnames"
|
3
|
-
import { flexRender, Cell
|
3
|
+
import { flexRender, Cell } from "@tanstack/react-table"
|
4
4
|
import { VirtualItem } from "@tanstack/react-virtual"
|
5
5
|
|
6
6
|
import { GenericObject } from "../../types"
|
@@ -10,8 +10,6 @@ import { getVirtualizedRowStyle } from "../Utilities/TableContainerStyles"
|
|
10
10
|
|
11
11
|
import LoadingInline from "../../pb_loading_inline/_loading_inline"
|
12
12
|
import Checkbox from "../../pb_checkbox/_checkbox"
|
13
|
-
import Detail from "../../pb_detail/_detail"
|
14
|
-
import Flex from "../../pb_flex/_flex"
|
15
13
|
|
16
14
|
import { SubRowHeaderRow } from "../Components/SubRowHeaderRow"
|
17
15
|
import { LoadingCell } from "../Components/LoadingCell"
|
@@ -22,13 +20,11 @@ import AdvancedTableContext from "../Context/AdvancedTableContext"
|
|
22
20
|
type VirtualizedTableViewProps = {
|
23
21
|
collapsibleTrail?: boolean
|
24
22
|
subRowHeaders?: string[]
|
25
|
-
isFetching: boolean
|
26
23
|
}
|
27
24
|
|
28
25
|
export const VirtualizedTableView = ({
|
29
26
|
collapsibleTrail = true,
|
30
27
|
subRowHeaders,
|
31
|
-
isFetching,
|
32
28
|
}: VirtualizedTableViewProps) => {
|
33
29
|
const {
|
34
30
|
enableToggleExpansion,
|
@@ -40,7 +36,6 @@ export const VirtualizedTableView = ({
|
|
40
36
|
hasAnySubRows,
|
41
37
|
virtualizer,
|
42
38
|
flattenedItems,
|
43
|
-
totalAvailableCount,
|
44
39
|
} = useContext(AdvancedTableContext)
|
45
40
|
|
46
41
|
const columnPinning = table.getState().columnPinning || { left: [] };
|
@@ -126,7 +121,19 @@ export const VirtualizedTableView = ({
|
|
126
121
|
}
|
127
122
|
|
128
123
|
// Get virtual items
|
129
|
-
|
124
|
+
let virtualItems: VirtualItem[] = [];
|
125
|
+
try {
|
126
|
+
virtualItems = virtualizer.getVirtualItems();
|
127
|
+
} catch (err) {
|
128
|
+
return (
|
129
|
+
<tr>
|
130
|
+
<td colSpan={table.getAllFlatColumns().length || 1}>
|
131
|
+
Error loading virtualized data.
|
132
|
+
</td>
|
133
|
+
</tr>
|
134
|
+
);
|
135
|
+
}
|
136
|
+
|
130
137
|
if (!virtualItems.length) {
|
131
138
|
return (
|
132
139
|
<tr>
|
@@ -136,9 +143,6 @@ export const VirtualizedTableView = ({
|
|
136
143
|
</tr>
|
137
144
|
);
|
138
145
|
}
|
139
|
-
|
140
|
-
// Establish # of Parent Rows (so that Footer count does not include every single row)
|
141
|
-
const topLevelRowCount = table.getRowModel().flatRows.filter((row: Row<GenericObject>) => row.depth === 0).length;
|
142
146
|
|
143
147
|
return (
|
144
148
|
<>
|
@@ -173,7 +177,7 @@ export const VirtualizedTableView = ({
|
|
173
177
|
if (item.type === 'row') {
|
174
178
|
const row = item.row;
|
175
179
|
const isExpandable = row.getIsExpanded();
|
176
|
-
const rowHasNoChildren = row.original?.children && !row.original.children.length;
|
180
|
+
const rowHasNoChildren = row.original?.children && !row.original.children.length ? true : false;
|
177
181
|
const rowBackground = isExpandable && ((!inlineRowLoading && row.getCanExpand()) || (inlineRowLoading && rowHasNoChildren));
|
178
182
|
const rowColor = row.getIsSelected() ? "bg-row-selection" : rowBackground ? "bg-silver" : "bg-white";
|
179
183
|
|
@@ -262,30 +266,6 @@ export const VirtualizedTableView = ({
|
|
262
266
|
);
|
263
267
|
}
|
264
268
|
|
265
|
-
if (item.type === 'footer') {
|
266
|
-
// Render footer
|
267
|
-
return (
|
268
|
-
<tr
|
269
|
-
className="virtualized-table-row virtualized-footer"
|
270
|
-
key={`footer-row`}
|
271
|
-
style={virtualItemStyle}
|
272
|
-
>
|
273
|
-
<td colSpan={table.getAllFlatColumns().length}>
|
274
|
-
<Flex align="center"
|
275
|
-
justify="center"
|
276
|
-
>
|
277
|
-
|
278
|
-
{isFetching ? (
|
279
|
-
<LoadingInline />
|
280
|
-
) : (
|
281
|
-
<Detail text={`Showing ${topLevelRowCount} of ${totalAvailableCount} rows`} />
|
282
|
-
)}
|
283
|
-
</Flex>
|
284
|
-
</td>
|
285
|
-
</tr>
|
286
|
-
)
|
287
|
-
}
|
288
|
-
|
289
269
|
return null;
|
290
270
|
})}
|
291
271
|
</>
|
@@ -8,7 +8,7 @@ import { getRowHeightEstimate } from '../Utilities/TableContainerStyles';
|
|
8
8
|
const AdvancedTableContext = createContext<any>({});
|
9
9
|
|
10
10
|
interface FlattenedItem {
|
11
|
-
type: 'header' | 'row' | 'loading'
|
11
|
+
type: 'header' | 'row' | 'loading';
|
12
12
|
row: Row<GenericObject>;
|
13
13
|
id: string;
|
14
14
|
}
|
@@ -116,17 +116,6 @@ export const AdvancedTableProvider = ({ children, ...props }: {
|
|
116
116
|
}
|
117
117
|
});
|
118
118
|
|
119
|
-
const isFetching = props.isFetching || false;
|
120
|
-
const shouldAddFooter = table && !isFetching && tableRows.length > 0
|
121
|
-
|
122
|
-
if (shouldAddFooter) {
|
123
|
-
items.push({
|
124
|
-
type: 'footer',
|
125
|
-
row: {} as Row<GenericObject>,
|
126
|
-
id: `footer-row`,
|
127
|
-
});
|
128
|
-
}
|
129
|
-
|
130
119
|
return items;
|
131
120
|
}, [
|
132
121
|
isVirtualized,
|
@@ -170,11 +159,10 @@ export const AdvancedTableProvider = ({ children, ...props }: {
|
|
170
159
|
useEffect(() => {
|
171
160
|
if (isVirtualized && virtualizer && table && containerRef.current) {
|
172
161
|
// Force recalculation of all virtual items
|
173
|
-
virtualizer.setOptions({
|
174
|
-
...virtualizer.options,
|
175
|
-
count: flattenedItems.length,
|
176
|
-
});
|
177
162
|
virtualizer.measure();
|
163
|
+
|
164
|
+
// Reset scroll position when sorting changes
|
165
|
+
containerRef.current.scrollTop = 0;
|
178
166
|
}
|
179
167
|
}, [
|
180
168
|
isVirtualized,
|
@@ -182,8 +170,7 @@ export const AdvancedTableProvider = ({ children, ...props }: {
|
|
182
170
|
table,
|
183
171
|
containerRef,
|
184
172
|
JSON.stringify(table?.getState().sorting || []),
|
185
|
-
JSON.stringify(table?.getState().expanded || {})
|
186
|
-
flattenedItems.length,
|
173
|
+
JSON.stringify(table?.getState().expanded || {})
|
187
174
|
]);
|
188
175
|
|
189
176
|
const contextValue = {
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { useCallback, useEffect
|
1
|
+
import { useCallback, useEffect } from 'react';
|
2
2
|
import { Row, RowPinningState } from "@tanstack/react-table";
|
3
3
|
import { GenericObject } from "../../types";
|
4
4
|
import { updateExpandAndCollapseState } from "../Utilities/ExpansionControlHelpers";
|
@@ -19,21 +19,13 @@ export function useTableActions({
|
|
19
19
|
onRowSelectionChange
|
20
20
|
}: UseTableActionsProps) {
|
21
21
|
|
22
|
-
// State to achieve 1 second delay before fetching more rows
|
23
|
-
const [bottomReached, setBottomReached] = useState(false)
|
24
|
-
const bottomTimeout = useRef<NodeJS.Timeout | null>(null)
|
25
|
-
|
26
22
|
// Handle expand/collapse
|
27
23
|
const handleExpandOrCollapse = useCallback(async (row: Row<GenericObject>) => {
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
undefined
|
34
|
-
)
|
35
|
-
|
36
|
-
setExpanded(updatedExpandedState)
|
24
|
+
onToggleExpansionClick && onToggleExpansionClick(row);
|
25
|
+
const expandedState = expanded;
|
26
|
+
const targetParent = row?.parentId;
|
27
|
+
const updatedRows = await updateExpandAndCollapseState(table.getRowModel(), expandedState, targetParent, undefined);
|
28
|
+
setExpanded(updatedRows);
|
37
29
|
}, [expanded, setExpanded, onToggleExpansionClick, table]);
|
38
30
|
|
39
31
|
// Handle pagination
|
@@ -43,32 +35,20 @@ export function useTableActions({
|
|
43
35
|
|
44
36
|
// Handle scroll detection for infinite scroll/virtualization
|
45
37
|
const fetchMoreOnBottomReached = useCallback((
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
38
|
+
containerRefElement: HTMLDivElement | null,
|
39
|
+
fetchNextPage: () => void,
|
40
|
+
isFetching: boolean,
|
41
|
+
totalFetched: number,
|
42
|
+
totalDBRowCount: number
|
51
43
|
) => {
|
52
|
-
if (
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
if (!bottomReached) {
|
58
|
-
setBottomReached(true)
|
59
|
-
bottomTimeout.current = setTimeout(() => {
|
60
|
-
fetchNextPage()
|
61
|
-
setBottomReached(false)
|
62
|
-
}, 1000)
|
63
|
-
}
|
64
|
-
} else {
|
65
|
-
setBottomReached(false)
|
66
|
-
if (bottomTimeout.current) {
|
67
|
-
clearTimeout(bottomTimeout.current)
|
68
|
-
bottomTimeout.current = null
|
44
|
+
if (containerRefElement) {
|
45
|
+
const { scrollHeight, scrollTop, clientHeight } = containerRefElement;
|
46
|
+
// If user scrolls near bottom, fetch more data
|
47
|
+
if (scrollHeight - scrollTop - clientHeight < 500 && !isFetching && totalFetched < totalDBRowCount) {
|
48
|
+
fetchNextPage();
|
69
49
|
}
|
70
50
|
}
|
71
|
-
},[
|
51
|
+
}, []);
|
72
52
|
|
73
53
|
// Update selection state
|
74
54
|
useEffect(() => {
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { useState, useCallback, useMemo
|
1
|
+
import { useState, useCallback, useMemo } from 'react';
|
2
2
|
import {
|
3
3
|
useReactTable,
|
4
4
|
getCoreRowModel,
|
@@ -32,7 +32,6 @@ interface UseTableStateProps {
|
|
32
32
|
tableOptions?: GenericObject;
|
33
33
|
onRowSelectionChange?: (arg: RowSelectionState) => void;
|
34
34
|
columnVisibilityControl?: GenericObject;
|
35
|
-
rowStyling?: GenericObject;
|
36
35
|
}
|
37
36
|
|
38
37
|
export function useTableState({
|
@@ -50,9 +49,7 @@ export function useTableState({
|
|
50
49
|
tableOptions,
|
51
50
|
columnVisibilityControl,
|
52
51
|
pinnedRows,
|
53
|
-
rowStyling
|
54
52
|
}: UseTableStateProps) {
|
55
|
-
|
56
53
|
// Create a local state for expanded and setExpanded if expandedControl not used
|
57
54
|
const [localExpanded, setLocalExpanded] = useState({});
|
58
55
|
const [loadingStateRowCount, setLoadingStateRowCount] = useState(initialLoadingRowsCount);
|
@@ -66,8 +63,8 @@ export function useTableState({
|
|
66
63
|
const setExpanded = expandedControl ? expandedControl.onChange : setLocalExpanded;
|
67
64
|
const columnVisibility = (columnVisibilityControl && columnVisibilityControl.value) ? columnVisibilityControl.value : localColumnVisibility;
|
68
65
|
const setColumnVisibility = (columnVisibilityControl && columnVisibilityControl.onChange) ? columnVisibilityControl.onChange : setLocalColumnVisibility;
|
69
|
-
const rowPinning = pinnedRows
|
70
|
-
const
|
66
|
+
const rowPinning = pinnedRows && pinnedRows.value || localRowPinning;
|
67
|
+
const setRowPinning = (pinnedRows && pinnedRows.onChange) ? pinnedRows.onChange : setLocalRowPinning;
|
71
68
|
|
72
69
|
// Virtualized data handling (chunked loading)
|
73
70
|
const fetchSize = 20; // Number of rows per "page"
|
@@ -105,8 +102,7 @@ export function useTableState({
|
|
105
102
|
column.customRenderer,
|
106
103
|
isFirstColumn,
|
107
104
|
onRowToggleClick,
|
108
|
-
selectableRows
|
109
|
-
rowStyling
|
105
|
+
selectableRows
|
110
106
|
);
|
111
107
|
}
|
112
108
|
|
@@ -169,8 +165,7 @@ export function useTableState({
|
|
169
165
|
enableSortingRemoval: false,
|
170
166
|
sortDescFirst: true,
|
171
167
|
onRowSelectionChange: setRowSelection,
|
172
|
-
|
173
|
-
getRowId: (selectableRows || pinnedRows || rowStyling) ? row => row.id : undefined,
|
168
|
+
getRowId: (selectableRows || pinnedRows) ? row => row.id : undefined,
|
174
169
|
onColumnVisibilityChange: setColumnVisibility,
|
175
170
|
meta: {
|
176
171
|
columnDefinitions
|
@@ -180,26 +175,6 @@ export function useTableState({
|
|
180
175
|
...tableOptions,
|
181
176
|
});
|
182
177
|
|
183
|
-
// Handle row pinning changes
|
184
|
-
useEffect(() => {
|
185
|
-
const topPins = pinnedRows?.value?.top ?? [];
|
186
|
-
if (topPins.length === 0) {
|
187
|
-
onRowPinningChange({ top: [] });
|
188
|
-
return;
|
189
|
-
}
|
190
|
-
const rows = table.getRowModel().rows;
|
191
|
-
const collectAllDescendantIds = (subs: Row<GenericObject>[]): string[] =>
|
192
|
-
subs.flatMap(r => [r.id, ...collectAllDescendantIds(r.subRows)]);
|
193
|
-
const allPinned: string[] = [];
|
194
|
-
topPins.forEach(id => {
|
195
|
-
const parent = rows.find(r => r.id === id && r.depth === 0);
|
196
|
-
if (parent) {
|
197
|
-
allPinned.push(parent.id, ...collectAllDescendantIds(parent.subRows));
|
198
|
-
}
|
199
|
-
});
|
200
|
-
onRowPinningChange({ top: allPinned });
|
201
|
-
}, [table, pinnedRows?.value?.top?.join(',')]);
|
202
|
-
|
203
178
|
// Check if table has any sub-rows
|
204
179
|
const hasAnySubRows = table.getRowModel().rows.some(row => row.subRows && row.subRows.length > 0);
|
205
180
|
const selectedRowsLength = Object.keys(table.getState().rowSelection).length;
|
@@ -16,7 +16,6 @@ type TableBodyProps = {
|
|
16
16
|
dark?: boolean
|
17
17
|
id?: string
|
18
18
|
subRowHeaders?: string[]
|
19
|
-
isFetching: boolean
|
20
19
|
}
|
21
20
|
|
22
21
|
export const TableBody = ({
|
@@ -25,7 +24,6 @@ export const TableBody = ({
|
|
25
24
|
dark = false,
|
26
25
|
id,
|
27
26
|
subRowHeaders,
|
28
|
-
isFetching,
|
29
27
|
...props
|
30
28
|
}: TableBodyProps) => {
|
31
29
|
|
@@ -65,7 +63,6 @@ export const TableBody = ({
|
|
65
63
|
// Virtualized table view
|
66
64
|
<VirtualizedTableView
|
67
65
|
collapsibleTrail={collapsibleTrail}
|
68
|
-
isFetching={isFetching}
|
69
66
|
subRowHeaders={subRowHeaders}
|
70
67
|
/>
|
71
68
|
) : (
|
@@ -40,13 +40,9 @@ export const TableHeader = ({
|
|
40
40
|
showActionsBar,
|
41
41
|
selectableRows,
|
42
42
|
responsive,
|
43
|
-
headerRef
|
44
|
-
virtualizedRows,
|
45
|
-
enableVirtualization,
|
43
|
+
headerRef
|
46
44
|
} = useContext(AdvancedTableContext)
|
47
45
|
|
48
|
-
const isVirtualized = virtualizedRows || enableVirtualization;
|
49
|
-
|
50
46
|
const classes = classnames(
|
51
47
|
buildCss("pb_advanced_table_header"),
|
52
48
|
globalProps(props),
|
@@ -61,93 +57,46 @@ export const TableHeader = ({
|
|
61
57
|
`${isChrome() ? "chrome-styles" : ""}`,
|
62
58
|
`${responsive === "scroll" && "pinned-left"}`,
|
63
59
|
);
|
64
|
-
|
65
|
-
const renderRegularTableHeader = () => (
|
66
|
-
<thead className={classes}
|
67
|
-
id={id}
|
68
|
-
>
|
69
|
-
{table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>, index: number) => (
|
70
|
-
<tr
|
71
|
-
key={`${headerGroup.id}-headerGroup`}
|
72
|
-
ref={index === 0 ? headerRef : null}
|
73
|
-
>
|
74
|
-
{!hasAnySubRows && selectableRows && (
|
75
|
-
<th className={customCellClassnames}>
|
76
|
-
<Checkbox
|
77
|
-
checked={table?.getIsAllRowsSelected()}
|
78
|
-
indeterminate={table?.getIsSomeRowsSelected()}
|
79
|
-
onChange={table?.getToggleAllRowsSelectedHandler()}
|
80
|
-
/>
|
81
|
-
</th>
|
82
|
-
)}
|
83
|
-
{headerGroup.headers.map(header => {
|
84
|
-
const isPinnedLeft = columnPinning.left.includes(header.id)
|
85
|
-
return (
|
86
|
-
<TableHeaderCell
|
87
|
-
enableSorting={enableSorting}
|
88
|
-
enableToggleExpansion={enableToggleExpansion}
|
89
|
-
handleExpandOrCollapse={handleExpandOrCollapse}
|
90
|
-
header={header}
|
91
|
-
headerChildren={children}
|
92
|
-
isPinnedLeft={isPinnedLeft}
|
93
|
-
key={`${header.id}-header`}
|
94
|
-
loading={loading}
|
95
|
-
sortIcon={sortIcon}
|
96
|
-
table={table}
|
97
|
-
/>
|
98
|
-
)
|
99
|
-
})}
|
100
|
-
</tr>
|
101
|
-
))}
|
102
|
-
</thead>
|
103
|
-
);
|
104
|
-
|
105
|
-
const renderVirtualizedTableHeader = () => (
|
106
|
-
<thead
|
107
|
-
className={classes}
|
108
|
-
data-virtualized="true"
|
109
|
-
id={id}
|
110
|
-
>
|
111
|
-
{table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>, index: number) => (
|
112
|
-
<tr
|
113
|
-
className="virtualized-header-row-header"
|
114
|
-
key={`${headerGroup.id}-headerGroup-virtualized`}
|
115
|
-
ref={index === 0 ? headerRef : null}
|
116
|
-
>
|
117
|
-
{!hasAnySubRows && selectableRows && (
|
118
|
-
<th className={classnames(customCellClassnames, "virtualized-header-cell")}>
|
119
|
-
<Checkbox
|
120
|
-
checked={table?.getIsAllRowsSelected()}
|
121
|
-
indeterminate={table?.getIsSomeRowsSelected()}
|
122
|
-
onChange={table?.getToggleAllRowsSelectedHandler()}
|
123
|
-
/>
|
124
|
-
</th>
|
125
|
-
)}
|
126
|
-
{headerGroup.headers.map(header => {
|
127
|
-
const isPinnedLeft = columnPinning.left.includes(header.id)
|
128
|
-
return (
|
129
|
-
<TableHeaderCell
|
130
|
-
enableSorting={enableSorting}
|
131
|
-
enableToggleExpansion={enableToggleExpansion}
|
132
|
-
handleExpandOrCollapse={handleExpandOrCollapse}
|
133
|
-
header={header}
|
134
|
-
headerChildren={children}
|
135
|
-
isPinnedLeft={isPinnedLeft}
|
136
|
-
isVirtualized
|
137
|
-
key={`${header.id}-header-virtualized`}
|
138
|
-
loading={loading}
|
139
|
-
sortIcon={sortIcon}
|
140
|
-
table={table}
|
141
|
-
/>
|
142
|
-
)
|
143
|
-
})}
|
144
|
-
</tr>
|
145
|
-
))}
|
146
|
-
</thead>
|
147
|
-
);
|
148
60
|
return (
|
149
|
-
<>
|
150
|
-
{
|
61
|
+
<>
|
62
|
+
<thead className={classes}
|
63
|
+
id={id}
|
64
|
+
>
|
65
|
+
{/* Get the header groups (only one in this example) */}
|
66
|
+
{table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>, index: number) => (
|
67
|
+
<tr
|
68
|
+
key={`${headerGroup.id}-headerGroup`}
|
69
|
+
ref={index === 0 ? headerRef : null}
|
70
|
+
>
|
71
|
+
{!hasAnySubRows && selectableRows && (
|
72
|
+
<th className={customCellClassnames}>
|
73
|
+
<Checkbox
|
74
|
+
checked={table?.getIsAllRowsSelected()}
|
75
|
+
indeterminate={table?.getIsSomeRowsSelected()}
|
76
|
+
onChange={table?.getToggleAllRowsSelectedHandler()}
|
77
|
+
/>
|
78
|
+
</th>
|
79
|
+
)}
|
80
|
+
{headerGroup.headers.map(header => {
|
81
|
+
const isPinnedLeft = columnPinning.left.includes(header.id)
|
82
|
+
return (
|
83
|
+
<TableHeaderCell
|
84
|
+
enableSorting={enableSorting}
|
85
|
+
enableToggleExpansion={enableToggleExpansion}
|
86
|
+
handleExpandOrCollapse={handleExpandOrCollapse}
|
87
|
+
header={header}
|
88
|
+
headerChildren={children}
|
89
|
+
isPinnedLeft={isPinnedLeft}
|
90
|
+
key={`${header.id}-header`}
|
91
|
+
loading={loading}
|
92
|
+
sortIcon={sortIcon}
|
93
|
+
table={table}
|
94
|
+
/>
|
95
|
+
)
|
96
|
+
})}
|
97
|
+
</tr>
|
98
|
+
))}
|
99
|
+
</thead>
|
151
100
|
</>
|
152
101
|
)
|
153
102
|
}
|
@@ -17,8 +17,7 @@ export const createCellFunction = (
|
|
17
17
|
customRenderer?: (row: Row<GenericObject>, value: any) => JSX.Element,
|
18
18
|
isFirstColumn?: boolean,
|
19
19
|
onRowToggleClick?: (row: Row<GenericObject>) => void,
|
20
|
-
selectableRows?: boolean
|
21
|
-
rowStyling?: GenericObject
|
20
|
+
selectableRows?: boolean
|
22
21
|
) => {
|
23
22
|
// Add display name to the returned function
|
24
23
|
const cellRenderer = ({
|
@@ -29,7 +28,6 @@ export const createCellFunction = (
|
|
29
28
|
getValue: Getter<string>
|
30
29
|
}) => {
|
31
30
|
const rowData = row.original;
|
32
|
-
const customStyle = rowStyling?.length > 0 && rowStyling?.find((s:GenericObject) => s?.rowId === row.id);
|
33
31
|
|
34
32
|
if (isFirstColumn) {
|
35
33
|
switch (row.depth) {
|
@@ -37,7 +35,6 @@ export const createCellFunction = (
|
|
37
35
|
return (
|
38
36
|
<CustomCell
|
39
37
|
customRenderer={customRenderer}
|
40
|
-
customStyle={customStyle}
|
41
38
|
getValue={getValue}
|
42
39
|
onRowToggleClick={onRowToggleClick}
|
43
40
|
row={row}
|
@@ -57,6 +57,7 @@ export const getVirtualizedContainerStyles = (maxHeight?: string): React.CSSProp
|
|
57
57
|
position: 'absolute',
|
58
58
|
top: 0,
|
59
59
|
left: 0,
|
60
|
+
width: '100%',
|
60
61
|
height: '40px', // Match standard table row height
|
61
62
|
transform: `translateY(${startPosition}px)`,
|
62
63
|
tableLayout: 'fixed',
|
@@ -66,14 +67,12 @@ export const getVirtualizedContainerStyles = (maxHeight?: string): React.CSSProp
|
|
66
67
|
/**
|
67
68
|
* Get height estimates for different row types
|
68
69
|
*/
|
69
|
-
export const getRowHeightEstimate = (rowType: 'header' | 'row' | 'loading'
|
70
|
+
export const getRowHeightEstimate = (rowType: 'header' | 'row' | 'loading') => {
|
70
71
|
switch (rowType) {
|
71
72
|
case 'header':
|
72
73
|
return 40; // Header height
|
73
74
|
case 'loading':
|
74
75
|
return 30; // Loading indicator height
|
75
|
-
case 'footer':
|
76
|
-
return 40
|
77
76
|
case 'row':
|
78
77
|
default:
|
79
78
|
return 40; // Standard row height - match this to your design system
|