playbook_ui 14.21.1.pre.alpha.renovatenpmtrixvulnerability8148 → 14.21.2.pre.alpha.PLAY2005useClickpropreact8411
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 +5 -2
- data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +20 -4
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +25 -5
- data/app/pb_kits/playbook/pb_advanced_table/Components/VirtualizedTableView.tsx +36 -16
- data/app/pb_kits/playbook/pb_advanced_table/Context/AdvancedTableContext.tsx +18 -5
- data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableActions.ts +37 -17
- data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +30 -5
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +3 -0
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +91 -40
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/CellRendererUtils.tsx +4 -1
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/ColumnStylingHelper.ts +15 -0
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/TableContainerStyles.ts +3 -2
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +50 -7
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +36 -18
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +105 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_sort.html.erb +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_subrow_headers.html.erb +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.html.erb +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.jsx +51 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.md +7 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.jsx +77 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers_rails.html.erb +63 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers_rails.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.html.erb +38 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.md +7 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_infinite_scroll.md +3 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_loading.html.erb +1 -1
- 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 +5 -3
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling.jsx +64 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling.md +7 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.jsx +2 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions_rails.html.erb +3 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.html.erb +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +6 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +4 -0
- data/app/pb_kits/playbook/pb_advanced_table/index.js +21 -0
- data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +5 -0
- data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +2 -2
- data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +33 -0
- data/app/pb_kits/playbook/pb_checkbox/checkbox.rb +18 -1
- data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_custom.html.erb +1 -0
- data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_custom_rails.md +1 -0
- data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_form.html.erb +22 -0
- data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_form.md +5 -0
- data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_options.html.erb +1 -0
- data/app/pb_kits/playbook/pb_checkbox/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +3 -12
- 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 +7 -4
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_clear_selection.jsx +6 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.jsx +6 -3
- 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 +7 -4
- 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 +7 -4
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.jsx +19 -10
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.jsx +19 -10
- 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 +20 -11
- 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 +23 -14
- 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 +6 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subcomponent_structure.jsx +6 -3
- 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 +6 -3
- 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_icon_options.html.erb +52 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_icon_options.jsx +99 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_icon_options_rails.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_icon_options_react.md +1 -0
- 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_radio_options.html.erb +28 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options.jsx +47 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options_rails.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options_react.md +1 -0
- 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 +6 -3
- 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 +4 -2
- data/app/pb_kits/playbook/pb_dropdown/docs/index.js +2 -1
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +10 -14
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +15 -26
- data/app/pb_kits/playbook/pb_filter/Filter/FilterSection.tsx +49 -0
- data/app/pb_kits/playbook/pb_filter/Filter/FilterSidebar.tsx +69 -0
- data/app/pb_kits/playbook/pb_filter/Filter/index.tsx +13 -0
- data/app/pb_kits/playbook/pb_filter/_filter.scss +4 -0
- data/app/pb_kits/playbook/pb_filter/docs/_filter_sidebar.jsx +224 -0
- data/app/pb_kits/playbook/pb_filter/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_filter/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -1
- data/app/pb_kits/playbook/pb_section_separator/docs/_description.md +3 -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 +4 -0
- data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +34 -22
- data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_click_open.jsx +25 -0
- data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_click_open.md +1 -0
- data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_tooltip/docs/index.js +1 -0
- data/dist/chunks/_typeahead-BaWcHxpx.js +22 -0
- data/dist/chunks/_weekday_stacked-F11OuLDi.js +45 -0
- data/dist/chunks/lib-CTkMyvfQ.js +29 -0
- data/dist/chunks/{pb_form_validation-DSkdRDMf.js → pb_form_validation-BVF3TmcL.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 +2 -2
- metadata +34 -8
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_close_on_select.jsx +0 -42
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_close_on_select.md +0 -1
- data/dist/chunks/_typeahead-CoOpeYom.js +0 -22
- data/dist/chunks/_weekday_stacked-B_jpa2Rz.js +0 -45
- data/dist/chunks/lib-D7Va7yqa.js +0 -29
@@ -40,9 +40,13 @@ export const TableHeader = ({
|
|
40
40
|
showActionsBar,
|
41
41
|
selectableRows,
|
42
42
|
responsive,
|
43
|
-
headerRef
|
43
|
+
headerRef,
|
44
|
+
virtualizedRows,
|
45
|
+
enableVirtualization,
|
44
46
|
} = useContext(AdvancedTableContext)
|
45
47
|
|
48
|
+
const isVirtualized = virtualizedRows || enableVirtualization;
|
49
|
+
|
46
50
|
const classes = classnames(
|
47
51
|
buildCss("pb_advanced_table_header"),
|
48
52
|
globalProps(props),
|
@@ -57,46 +61,93 @@ export const TableHeader = ({
|
|
57
61
|
`${isChrome() ? "chrome-styles" : ""}`,
|
58
62
|
`${responsive === "scroll" && "pinned-left"}`,
|
59
63
|
);
|
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
|
+
);
|
60
148
|
return (
|
61
|
-
<>
|
62
|
-
|
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>
|
149
|
+
<>
|
150
|
+
{isVirtualized ? renderVirtualizedTableHeader() : renderRegularTableHeader()}
|
100
151
|
</>
|
101
152
|
)
|
102
153
|
}
|
@@ -17,7 +17,8 @@ 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
|
20
|
+
selectableRows?: boolean,
|
21
|
+
rowStyling?: GenericObject
|
21
22
|
) => {
|
22
23
|
// Add display name to the returned function
|
23
24
|
const cellRenderer = ({
|
@@ -28,6 +29,7 @@ export const createCellFunction = (
|
|
28
29
|
getValue: Getter<string>
|
29
30
|
}) => {
|
30
31
|
const rowData = row.original;
|
32
|
+
const customStyle = rowStyling?.length > 0 && rowStyling?.find((s:GenericObject) => s?.rowId === row.id);
|
31
33
|
|
32
34
|
if (isFirstColumn) {
|
33
35
|
switch (row.depth) {
|
@@ -35,6 +37,7 @@ export const createCellFunction = (
|
|
35
37
|
return (
|
36
38
|
<CustomCell
|
37
39
|
customRenderer={customRenderer}
|
40
|
+
customStyle={customStyle}
|
38
41
|
getValue={getValue}
|
39
42
|
onRowToggleClick={onRowToggleClick}
|
40
43
|
row={row}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
export const findColumnDefByAccessor = (
|
2
|
+
defs: any[],
|
3
|
+
targetAccessor: string
|
4
|
+
): any | undefined => {
|
5
|
+
for (const def of defs) {
|
6
|
+
if (def.accessor === targetAccessor) {
|
7
|
+
return def;
|
8
|
+
}
|
9
|
+
if (Array.isArray(def.columns) && def.columns.length) {
|
10
|
+
const found = findColumnDefByAccessor(def.columns, targetAccessor);
|
11
|
+
if (found) return found;
|
12
|
+
}
|
13
|
+
}
|
14
|
+
return undefined;
|
15
|
+
};
|
@@ -57,7 +57,6 @@ export const getVirtualizedContainerStyles = (maxHeight?: string): React.CSSProp
|
|
57
57
|
position: 'absolute',
|
58
58
|
top: 0,
|
59
59
|
left: 0,
|
60
|
-
width: '100%',
|
61
60
|
height: '40px', // Match standard table row height
|
62
61
|
transform: `translateY(${startPosition}px)`,
|
63
62
|
tableLayout: 'fixed',
|
@@ -67,12 +66,14 @@ export const getVirtualizedContainerStyles = (maxHeight?: string): React.CSSProp
|
|
67
66
|
/**
|
68
67
|
* Get height estimates for different row types
|
69
68
|
*/
|
70
|
-
export const getRowHeightEstimate = (rowType: 'header' | 'row' | 'loading') => {
|
69
|
+
export const getRowHeightEstimate = (rowType: 'header' | 'row' | 'loading' | 'footer') => {
|
71
70
|
switch (rowType) {
|
72
71
|
case 'header':
|
73
72
|
return 40; // Header height
|
74
73
|
case 'loading':
|
75
74
|
return 30; // Loading indicator height
|
75
|
+
case 'footer':
|
76
|
+
return 40
|
76
77
|
case 'row':
|
77
78
|
default:
|
78
79
|
return 40; // Standard row height - match this to your design system
|
@@ -39,7 +39,7 @@
|
|
39
39
|
}
|
40
40
|
|
41
41
|
-ms-overflow-style: none !important;
|
42
|
-
scrollbar-width: thin
|
42
|
+
scrollbar-width: thin;
|
43
43
|
scrollbar-color: #00000033 transparent !important;
|
44
44
|
}
|
45
45
|
|
@@ -63,11 +63,30 @@
|
|
63
63
|
width: 100%;
|
64
64
|
}
|
65
65
|
|
66
|
-
// Virtualized
|
66
|
+
// Virtualized Table and Rows for Infinite Scroll
|
67
|
+
scrollbar-gutter: stable right-edges;
|
68
|
+
.virtualized-header-row-header {
|
69
|
+
width: 100% !important;
|
70
|
+
.table-header-cells:first-child {
|
71
|
+
min-width: 180px;
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
.virtualized-footer {
|
76
|
+
width: 100% !important;
|
77
|
+
td {
|
78
|
+
border-bottom-left-radius: 4px !important;
|
79
|
+
border-bottom-right-radius: 4px !important;
|
80
|
+
display: flex;
|
81
|
+
justify-content: center;
|
82
|
+
align-items: center;
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
67
86
|
.virtualized-table-row {
|
68
87
|
display: table !important;
|
69
88
|
table-layout: fixed !important;
|
70
|
-
|
89
|
+
box-sizing: border-box !important;
|
71
90
|
|
72
91
|
td {
|
73
92
|
display: table-cell !important;
|
@@ -104,7 +123,7 @@
|
|
104
123
|
|
105
124
|
-ms-overflow-style: none !important;
|
106
125
|
scrollbar-width: none !important;
|
107
|
-
|
126
|
+
}
|
108
127
|
|
109
128
|
|
110
129
|
.row-selection-actions-card {
|
@@ -193,7 +212,6 @@
|
|
193
212
|
|
194
213
|
// Fix virtualized row borders
|
195
214
|
tr.virtualized-table-row {
|
196
|
-
border-bottom: 1px solid $border_light;
|
197
215
|
|
198
216
|
&.bg-silver {
|
199
217
|
td:first-child {
|
@@ -410,7 +428,6 @@
|
|
410
428
|
|
411
429
|
// Make sure all horizontal borders use the default border color
|
412
430
|
tr, th, td {
|
413
|
-
border-top-color: $border_light !important;
|
414
431
|
border-bottom-color: $border_light !important;
|
415
432
|
}
|
416
433
|
|
@@ -607,6 +624,16 @@
|
|
607
624
|
td.sticky-left {
|
608
625
|
border-right: 1px solid $border_light !important;
|
609
626
|
}
|
627
|
+
// Virtualized Table in Responsive Styles
|
628
|
+
.virtualized-header,
|
629
|
+
.virtualized-header-row-header,
|
630
|
+
.virtualized-table-row,
|
631
|
+
.virtualized-footer {
|
632
|
+
border-right: 1px solid $border_light !important;
|
633
|
+
.table-header-cells:first-child {
|
634
|
+
box-shadow: 0 0 10px 0 rgba($shadow, 0.16) !important;
|
635
|
+
}
|
636
|
+
}
|
610
637
|
}
|
611
638
|
}
|
612
639
|
}
|
@@ -622,6 +649,23 @@
|
|
622
649
|
box-shadow: 0 4px 10px 0 rgba($shadow, 0.16) !important;
|
623
650
|
}
|
624
651
|
|
652
|
+
// For Rails, we can't target the &:last-child since collapsed rows are display: none;
|
653
|
+
// With JS, we add a .last-visible-row class and add rounded corners to bottom row
|
654
|
+
.last-visible-row {
|
655
|
+
td, .pb_table_td {
|
656
|
+
border-width: 0 0 1px 0;
|
657
|
+
|
658
|
+
&:first-child {
|
659
|
+
border-radius: 0 0 0 4px;
|
660
|
+
border-width: 0 0 1px 1px;
|
661
|
+
}
|
662
|
+
&:last-child {
|
663
|
+
border-radius: 0 0 4px 0;
|
664
|
+
border-width: 0 1px 1px 0;
|
665
|
+
}
|
666
|
+
}
|
667
|
+
}
|
668
|
+
|
625
669
|
&.dark {
|
626
670
|
// Override default border color for dark mode
|
627
671
|
--column-border-color: #{$border_dark};
|
@@ -633,7 +677,6 @@
|
|
633
677
|
|
634
678
|
// Make sure all horizontal borders use the default border color in dark mode
|
635
679
|
tr, th, td {
|
636
|
-
border-top-color: $border_dark !important;
|
637
680
|
border-bottom-color: $border_dark !important;
|
638
681
|
}
|
639
682
|
|
@@ -57,6 +57,7 @@ type AdvancedTableProps = {
|
|
57
57
|
onChange?: (value: RowPinningState) => void;
|
58
58
|
};
|
59
59
|
responsive?: "scroll" | "none",
|
60
|
+
rowStyling?: GenericObject[],
|
60
61
|
scrollBarNone?: boolean,
|
61
62
|
selectableRows?: boolean,
|
62
63
|
showActionsBar?: boolean,
|
@@ -98,6 +99,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
98
99
|
paginationProps,
|
99
100
|
pinnedRows,
|
100
101
|
responsive = "scroll",
|
102
|
+
rowStyling,
|
101
103
|
scrollBarNone= false,
|
102
104
|
showActionsBar = true,
|
103
105
|
selectableRows,
|
@@ -144,6 +146,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
144
146
|
onRowSelectionChange,
|
145
147
|
columnVisibilityControl,
|
146
148
|
pinnedRows,
|
149
|
+
rowStyling
|
147
150
|
});
|
148
151
|
|
149
152
|
// Initialize table actions
|
@@ -266,6 +269,29 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
266
269
|
// Visibility flag for action bar
|
267
270
|
const isActionBarVisible = (selectableRows && showActionsBar && selectedRowsLength > 0) || columnVisibilityControl;
|
268
271
|
|
272
|
+
// The actual Main <Table /> element
|
273
|
+
const tableElement = (
|
274
|
+
<Table
|
275
|
+
className={`${loading ? "content-loading" : ""}`}
|
276
|
+
dark={dark}
|
277
|
+
dataTable
|
278
|
+
numberSpacing="tabular"
|
279
|
+
responsive="none"
|
280
|
+
{...tableProps}
|
281
|
+
>
|
282
|
+
{children ? (
|
283
|
+
children
|
284
|
+
) : (
|
285
|
+
<>
|
286
|
+
<TableHeader />
|
287
|
+
<TableBody
|
288
|
+
isFetching={isFetching}
|
289
|
+
/>
|
290
|
+
</>
|
291
|
+
)}
|
292
|
+
</Table>
|
293
|
+
)
|
294
|
+
|
269
295
|
return (
|
270
296
|
<>
|
271
297
|
{/* Top Pagination */}
|
@@ -313,6 +339,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
313
339
|
onExpandByDepthClick={onExpandByDepthClick}
|
314
340
|
pinnedRows={pinnedRows}
|
315
341
|
responsive={responsive}
|
342
|
+
rowStyling={rowStyling}
|
316
343
|
selectableRows={selectableRows}
|
317
344
|
setExpanded={setExpanded}
|
318
345
|
showActionsBar={showActionsBar}
|
@@ -322,6 +349,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
322
349
|
table={table}
|
323
350
|
tableContainerRef={tableWrapperRef}
|
324
351
|
toggleExpansionIcon={toggleExpansionIcon}
|
352
|
+
totalAvailableCount={fullData.length}
|
325
353
|
virtualizedRows={virtualizedRows}
|
326
354
|
>
|
327
355
|
<React.Fragment>
|
@@ -333,24 +361,14 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
333
361
|
type={columnVisibilityControl ? "column-visibility" : "row-selection"}
|
334
362
|
/>
|
335
363
|
|
336
|
-
{/*
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
>
|
345
|
-
{children ? (
|
346
|
-
children
|
347
|
-
) : (
|
348
|
-
<>
|
349
|
-
<TableHeader />
|
350
|
-
<TableBody />
|
351
|
-
</>
|
352
|
-
)}
|
353
|
-
</Table>
|
364
|
+
{/* Virtualized wrapper div only if virtualizedRows is true */}
|
365
|
+
{virtualizedRows ? (
|
366
|
+
<div style={{ overflow: 'auto', width: '100%' }}>
|
367
|
+
{tableElement}
|
368
|
+
</div>
|
369
|
+
) : (
|
370
|
+
tableElement
|
371
|
+
)}
|
354
372
|
</React.Fragment>
|
355
373
|
</AdvancedTableProvider>
|
356
374
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import React, {useState} from "react"
|
2
2
|
import { render, screen, waitFor } from "../utilities/test-utils"
|
3
3
|
|
4
|
-
import { AdvancedTable, Pill } from "playbook-ui"
|
4
|
+
import { AdvancedTable, Pill, colors } from "playbook-ui"
|
5
5
|
|
6
6
|
global.ResizeObserver = class {
|
7
7
|
observe() {}
|
@@ -572,4 +572,107 @@ test("pinnedRows prop renders pinned rows at top", () => {
|
|
572
572
|
const firstPinnedRow = pinnedRows[0]
|
573
573
|
expect(firstPinnedRow).toHaveStyle("position: sticky")
|
574
574
|
expect(firstPinnedRow).toHaveStyle("background-color: white")
|
575
|
-
})
|
575
|
+
})
|
576
|
+
|
577
|
+
test("columnStyling.headerAlignment aligns header as expected", () => {
|
578
|
+
const styledColumnDefs = [
|
579
|
+
{
|
580
|
+
accessor: "year",
|
581
|
+
label: "Year",
|
582
|
+
cellAccessors: ["quarter", "month", "day"],
|
583
|
+
},
|
584
|
+
{
|
585
|
+
accessor: "newEnrollments",
|
586
|
+
label: "New Enrollments",
|
587
|
+
columnStyling: { headerAlignment: "left" },
|
588
|
+
},
|
589
|
+
{
|
590
|
+
accessor: "scheduledMeetings",
|
591
|
+
label: "Scheduled Meetings",
|
592
|
+
},
|
593
|
+
];
|
594
|
+
|
595
|
+
render(
|
596
|
+
<AdvancedTable
|
597
|
+
columnDefinitions={styledColumnDefs}
|
598
|
+
data={{ testid: testId }}
|
599
|
+
tableData={MOCK_DATA}
|
600
|
+
/>
|
601
|
+
);
|
602
|
+
|
603
|
+
const headerCell = screen.getByText("New Enrollments").closest("th");
|
604
|
+
expect(headerCell).toHaveAttribute("align", "left");
|
605
|
+
});
|
606
|
+
|
607
|
+
test("columnStyling.cellAlignment sets each <td> align attribute as expected", () => {
|
608
|
+
const styledColumnDefs = [
|
609
|
+
{
|
610
|
+
accessor: "year",
|
611
|
+
label: "Year",
|
612
|
+
cellAccessors: ["quarter", "month", "day"],
|
613
|
+
},
|
614
|
+
{
|
615
|
+
accessor: "newEnrollments",
|
616
|
+
label: "New Enrollments",
|
617
|
+
columnStyling: { cellAlignment: "left" },
|
618
|
+
},
|
619
|
+
{
|
620
|
+
accessor: "scheduledMeetings",
|
621
|
+
label: "Scheduled Meetings",
|
622
|
+
},
|
623
|
+
];
|
624
|
+
|
625
|
+
render(
|
626
|
+
<AdvancedTable
|
627
|
+
columnDefinitions={styledColumnDefs}
|
628
|
+
data={{ testid: testId }}
|
629
|
+
tableData={MOCK_DATA}
|
630
|
+
/>
|
631
|
+
);
|
632
|
+
|
633
|
+
const firstEnrollmentCell = screen.getAllByText("20")[0].closest("td");
|
634
|
+
expect(firstEnrollmentCell).toHaveAttribute("align", "left");
|
635
|
+
});
|
636
|
+
|
637
|
+
test("renders virtualized table rows and header", () => {
|
638
|
+
render(
|
639
|
+
<AdvancedTable
|
640
|
+
columnDefinitions={columnDefinitions}
|
641
|
+
data={{ testid: testId }}
|
642
|
+
tableData={MOCK_DATA_WITH_ID}
|
643
|
+
virtualizedRows
|
644
|
+
/>
|
645
|
+
)
|
646
|
+
|
647
|
+
const kit = screen.getByTestId(testId)
|
648
|
+
|
649
|
+
const virtualizedHeader = kit.querySelector('.virtualized-header-row-header')
|
650
|
+
expect(virtualizedHeader).toBeInTheDocument()
|
651
|
+
|
652
|
+
const virtualizedRows = kit.querySelectorAll('.virtualized-table-row')
|
653
|
+
expect(virtualizedRows.length).toBeLessThan(MOCK_DATA_WITH_ID.length)
|
654
|
+
})
|
655
|
+
|
656
|
+
test("rowStyling prop works as expected", () => {
|
657
|
+
const rowStyling = [
|
658
|
+
{
|
659
|
+
rowId: "1",
|
660
|
+
backgroundColor: colors.white,
|
661
|
+
fontColor: colors.black
|
662
|
+
},
|
663
|
+
];
|
664
|
+
|
665
|
+
render(
|
666
|
+
<AdvancedTable
|
667
|
+
columnDefinitions={columnDefinitions}
|
668
|
+
data={{ testid: testId }}
|
669
|
+
rowStyling={rowStyling}
|
670
|
+
tableData={MOCK_DATA_WITH_ID}
|
671
|
+
/>
|
672
|
+
)
|
673
|
+
|
674
|
+
const kit = screen.getByTestId(testId)
|
675
|
+
const tableBody = kit.querySelector('tbody')
|
676
|
+
const row1 = tableBody.querySelector('tr:nth-child(1)')
|
677
|
+
expect(row1).toHaveStyle({backgroundColor: colors.white, color: colors.black})
|
678
|
+
})
|
@@ -51,7 +51,7 @@
|
|
51
51
|
]
|
52
52
|
%>
|
53
53
|
|
54
|
-
<%= pb_rails("advanced_table", props: { table_data: @table_data, column_definitions: column_definitions }) do %>
|
54
|
+
<%= pb_rails("advanced_table", props: { table_data: @table_data, column_definitions: column_definitions, id: "beta_sort" }) do %>
|
55
55
|
<%= pb_rails("advanced_table/table_header", props: { column_definitions: column_definitions }) %>
|
56
56
|
<%= pb_rails("advanced_table/table_body", props: { id: "beta_sort", table_data: @table_data, column_definitions: column_definitions, enable_toggle_expansion: "all" }) %>
|
57
57
|
<% end %>
|
data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_subrow_headers.html.erb
CHANGED
@@ -34,7 +34,7 @@
|
|
34
34
|
subrow_headers = ["Quarter", "Month", "Day"]
|
35
35
|
%>
|
36
36
|
|
37
|
-
<%= pb_rails("advanced_table", props: { table_data: @table_data, column_definitions: column_definitions }) do %>
|
37
|
+
<%= pb_rails("advanced_table", props: { table_data: @table_data, column_definitions: column_definitions, id: "test_table" }) do %>
|
38
38
|
<%= pb_rails("advanced_table/table_header", props: { column_definitions: column_definitions }) %>
|
39
39
|
<%= pb_rails("advanced_table/table_body", props: { id: "test_table", table_data: @table_data, column_definitions: column_definitions, subrow_headers: subrow_headers, enable_toggle_expansion: "all" }) %>
|
40
40
|
<% end %>
|
data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.html.erb
CHANGED
@@ -55,4 +55,4 @@
|
|
55
55
|
},
|
56
56
|
] %>
|
57
57
|
|
58
|
-
<%= pb_rails("advanced_table", props: { id: "
|
58
|
+
<%= pb_rails("advanced_table", props: { id: "beta_table_with_color_headers", table_data: @table_data, column_definitions: column_definitions, column_group_border_color: "text_lt_default", table_props: { vertical_border: true } }) %>
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import React from "react"
|
2
|
+
import AdvancedTable from '../../pb_advanced_table/_advanced_table'
|
3
|
+
import MOCK_DATA from "./advanced_table_mock_data.json"
|
4
|
+
|
5
|
+
const AdvancedTableColumnStyling = (props) => {
|
6
|
+
const columnDefinitions = [
|
7
|
+
{
|
8
|
+
accessor: "year",
|
9
|
+
label: "Year",
|
10
|
+
cellAccessors: ["quarter", "month", "day"],
|
11
|
+
},
|
12
|
+
{
|
13
|
+
accessor: "newEnrollments",
|
14
|
+
label: "New Enrollments",
|
15
|
+
columnStyling:{headerAlignment: "left", cellAlignment: "left"},
|
16
|
+
},
|
17
|
+
{
|
18
|
+
accessor: "scheduledMeetings",
|
19
|
+
label: "Scheduled Meetings",
|
20
|
+
columnStyling:{headerAlignment: "center", cellAlignment: "center"},
|
21
|
+
},
|
22
|
+
{
|
23
|
+
accessor: "attendanceRate",
|
24
|
+
label: "Attendance Rate",
|
25
|
+
},
|
26
|
+
{
|
27
|
+
accessor: "completedClasses",
|
28
|
+
label: "Completed Classes",
|
29
|
+
},
|
30
|
+
{
|
31
|
+
accessor: "classCompletionRate",
|
32
|
+
label: "Class Completion Rate",
|
33
|
+
},
|
34
|
+
{
|
35
|
+
accessor: "graduatedStudents",
|
36
|
+
label: "Graduated Students",
|
37
|
+
},
|
38
|
+
]
|
39
|
+
|
40
|
+
return (
|
41
|
+
<div>
|
42
|
+
<AdvancedTable
|
43
|
+
columnDefinitions={columnDefinitions}
|
44
|
+
tableData={MOCK_DATA}
|
45
|
+
{...props}
|
46
|
+
/>
|
47
|
+
</div>
|
48
|
+
)
|
49
|
+
}
|
50
|
+
|
51
|
+
export default AdvancedTableColumnStyling
|
@@ -0,0 +1,7 @@
|
|
1
|
+
The `columnStyling` prop is an optional item that can be used within `columnDefinitions` as shown in the code snippet below. It is an object that has 2 optional key/value pairs:
|
2
|
+
|
3
|
+
1) `headerAlignment`: This will allow you to control alignment of header content which is set to right aligned by default. you can set this to `left`, `right` or `center`.
|
4
|
+
|
5
|
+
2) `cellAlignment`: This will allow you to control alignment of content within all cells in the given column. This is set to right aligned by default. you can set this to `left`, `right` or `center`.
|
6
|
+
|
7
|
+
`columnStyling` can be used within the columnDefinition of all the columns or some of them, as shown. Each column has its own individual control in this way.
|