playbook_ui 14.18.1.pre.rc.0 → 14.19.0.pre.alpha.PLAY21297675
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/_playbook.scss +0 -1
- data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +11 -1
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +148 -15
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +20 -3
- data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +23 -13
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/VisibilityTree.ts +47 -0
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +313 -21
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +12 -3
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +6 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta.md +0 -6
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color.jsx +80 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color.md +3 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.html.erb +58 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.md +3 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.jsx +57 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.md +4 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.jsx +62 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi.jsx +82 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.jsx +65 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows_rails.md +5 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.jsx → _advanced_table_selectable_rows_no_subrows_react.jsx} +2 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_rails.md +3 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +10 -5
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +7 -2
- data/app/pb_kits/playbook/pb_advanced_table/flat_advanced_table.js +106 -0
- data/app/pb_kits/playbook/pb_advanced_table/index.js +228 -11
- data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +9 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +0 -3
- data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +1 -2
- data/app/pb_kits/playbook/pb_avatar/_avatar.scss +4 -0
- data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +3 -0
- data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +3 -3
- data/app/pb_kits/playbook/pb_avatar/avatar.rb +2 -0
- data/app/pb_kits/playbook/pb_avatar/avatar.test.js +18 -0
- data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.html.erb +5 -0
- data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.jsx +16 -0
- data/app/pb_kits/playbook/pb_avatar/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_avatar/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_card/card.html.erb +1 -1
- data/app/pb_kits/playbook/pb_card/card.rb +12 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.html.erb +2 -2
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.html.erb +22 -1
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line.html.erb +55 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line_rails.md +5 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_rails.md +5 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners.jsx +59 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners_react.md +1 -0
- data/app/pb_kits/playbook/pb_draggable/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_draggable/docs/index.js +2 -1
- data/app/pb_kits/playbook/pb_draggable/draggable_container.rb +11 -1
- data/app/pb_kits/playbook/pb_draggable/draggable_item.rb +11 -1
- data/app/pb_kits/playbook/pb_draggable/index.js +4 -2
- data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +33 -5
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +5 -0
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +5 -16
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.html.erb +5 -2
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.html.erb +28 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +17 -64
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb +58 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/{_dropdown_with_autocomplete_and_custom_display.jsx → _dropdown_with_autocomplete_with_subcomponents.jsx} +11 -25
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx +61 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.md +2 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb +52 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.md +2 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +7 -4
- data/app/pb_kits/playbook/pb_dropdown/docs/index.js +2 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +2 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +4 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +45 -1
- data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +10 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +3 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +12 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +3 -1
- data/app/pb_kits/playbook/pb_dropdown/index.js +57 -0
- data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +26 -0
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +3 -4
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +4 -4
- data/app/pb_kits/playbook/pb_empty_state/_empty_state.scss +8 -1
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_alignment.html.erb +27 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_default.html.erb +7 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_orientation.html.erb +12 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_size.html.erb +23 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/example.yml +5 -1
- data/app/pb_kits/playbook/pb_empty_state/empty_state.html.erb +19 -0
- data/app/pb_kits/playbook/pb_empty_state/empty_state.rb +123 -0
- data/app/pb_kits/playbook/pb_message/_message.tsx +3 -0
- data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.html.erb +9 -0
- data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.jsx +21 -0
- data/app/pb_kits/playbook/pb_message/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_message/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_message/message.html.erb +2 -1
- data/app/pb_kits/playbook/pb_message/message.rb +1 -0
- data/app/pb_kits/playbook/pb_overlay/_overlay.scss +2 -1
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +1 -1
- data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +5 -4
- data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +2 -2
- data/app/pb_kits/playbook/pb_select/_select.scss +10 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_error.html.erb +1 -1
- data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.jsx +7 -7
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +5 -5
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.html.erb +1 -1
- data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.html.erb +5 -1
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.html.erb +8 -1
- data/app/pb_kits/playbook/pb_user/_user.tsx +3 -0
- data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.html.erb +6 -0
- data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.jsx +16 -0
- data/app/pb_kits/playbook/pb_user/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_user/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_user/user.html.erb +2 -1
- data/app/pb_kits/playbook/pb_user/user.rb +1 -0
- data/dist/chunks/{_typeahead-D8CsVBZO.js → _typeahead-BPSIWtFT.js} +3 -3
- data/dist/chunks/_weekday_stacked-BeuPAmxG.js +45 -0
- data/dist/chunks/{lib-BmTAc7Nc.js → lib-B20MXZcW.js} +2 -2
- data/dist/chunks/{pb_form_validation-BWjy4bFn.js → pb_form_validation-WWvUXPKD.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/menu.yml +6 -14
- data/dist/playbook-doc.js +2 -2
- 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 +52 -21
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.md +0 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_hook.jsx +0 -79
- data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.scss +0 -3
- data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.tsx +0 -72
- data/app/pb_kits/playbook/pb_gantt_chart/docs/_gantt_chart_default.jsx +0 -53
- data/app/pb_kits/playbook/pb_gantt_chart/docs/example.yml +0 -7
- data/app/pb_kits/playbook/pb_gantt_chart/docs/index.js +0 -1
- data/app/pb_kits/playbook/pb_gantt_chart/gantt_chart.test.jsx +0 -19
- data/dist/chunks/_weekday_stacked-CHQsoCdP.js +0 -45
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_react.md → _advanced_table_selectable_rows.md} +0 -0
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.html.erb → _advanced_table_selectable_rows_no_subrows_rails.html.erb} +0 -0
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows.html.erb → _advanced_table_selectable_rows_rails.html.erb} +0 -0
- /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones_line.md → _draggable_drop_zones_line_react.md} +0 -0
- /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_event_listeners.md → _draggable_event_listeners_rails.md} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93df013c8d48a5c077ccdb15133ab4682b05d667db94eba9bdd6e8accba7d472
|
4
|
+
data.tar.gz: '085bc5dffd842ea4fc4fe35f8579b517523ad0e02f6b9692fe33faecbf6b9284'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 463d71189c32e8500ca647672d4202ffbfb23e0d73c068eaf50a0779752a0f91d9151bcfce121cc3050066a1a0897eb13b86b05328630aa6f5e3ee80baa50586
|
7
|
+
data.tar.gz: 00d153cdde95a0761c7515b5fb5de2dff87d10cb7f7e1e16e2f092bee31f1110ed713c6c3599fb57fb11bc347800f6bb1510798990904ad84629580d42a427e4
|
@@ -93,7 +93,17 @@ export const RegularTableView = ({
|
|
93
93
|
|
94
94
|
{row.getVisibleCells().map((cell: Cell<GenericObject, unknown>, i: number) => {
|
95
95
|
const isPinnedLeft = columnPinning.left.includes(cell.column.id);
|
96
|
-
const isLastCell =
|
96
|
+
const isLastCell = (() => {
|
97
|
+
const parent = cell.column.parent;
|
98
|
+
if (!parent) {
|
99
|
+
const last = row.getVisibleCells().at(-1);
|
100
|
+
return last?.column.id === cell.column.id;
|
101
|
+
}
|
102
|
+
|
103
|
+
const visibleSiblings = parent.columns.filter(col => col.getIsVisible());
|
104
|
+
return visibleSiblings.at(-1)?.id === cell.column.id;
|
105
|
+
})();
|
106
|
+
|
97
107
|
const { column } = cell;
|
98
108
|
return (
|
99
109
|
<td
|
@@ -1,25 +1,112 @@
|
|
1
|
-
import React, { useEffect, useRef } from "react";
|
1
|
+
import React, { useEffect, useRef, useContext } from "react";
|
2
|
+
|
3
|
+
import AdvancedTableContext from "../Context/AdvancedTableContext";
|
4
|
+
import { buildVisibilityTree } from "../Utilities/VisibilityTree";
|
5
|
+
|
2
6
|
import Card from "../../pb_card/_card";
|
3
7
|
import Caption from "../../pb_caption/_caption";
|
4
8
|
import Flex from "../../pb_flex/_flex";
|
5
9
|
import FlexItem from "../../pb_flex/_flex_item";
|
6
|
-
import
|
10
|
+
import Dropdown from "../../pb_dropdown/_dropdown";
|
11
|
+
import DropdownContainer from "../../pb_dropdown/subcomponents/DropdownContainer";
|
12
|
+
import DropdownTrigger from "../../pb_dropdown/subcomponents/DropdownTrigger";
|
13
|
+
import Icon from "../../pb_icon/_icon";
|
14
|
+
import Checkbox from "../../pb_checkbox/_checkbox";
|
15
|
+
import SectionSeparator from "../../pb_section_separator/_section_separator";
|
16
|
+
import Tooltip from "../../pb_tooltip/_tooltip";
|
17
|
+
|
18
|
+
import {
|
19
|
+
showActionBar,
|
20
|
+
hideActionBar,
|
21
|
+
} from "../Utilities/ActionBarAnimationHelper";
|
22
|
+
import { GenericObject } from "../../types";
|
7
23
|
|
8
24
|
interface TableActionBarProps {
|
9
|
-
isVisible: boolean;
|
25
|
+
isVisible: boolean | GenericObject | undefined;
|
10
26
|
selectedCount: number;
|
11
27
|
actions?: React.ReactNode[] | React.ReactNode;
|
28
|
+
type?: string;
|
29
|
+
}
|
30
|
+
|
31
|
+
interface VisibilityNode {
|
32
|
+
id?: string | undefined;
|
33
|
+
label?: string | undefined;
|
34
|
+
children?: VisibilityNode[];
|
12
35
|
}
|
13
36
|
|
14
37
|
const TableActionBar: React.FC<TableActionBarProps> = ({
|
15
38
|
isVisible,
|
16
39
|
selectedCount,
|
17
|
-
actions
|
40
|
+
actions,
|
41
|
+
type = "row-selection",
|
18
42
|
}) => {
|
19
43
|
const cardRef = useRef(null);
|
44
|
+
const { table, columnVisibilityControl, columnDefinitions } =
|
45
|
+
useContext(AdvancedTableContext);
|
46
|
+
|
47
|
+
// ----------- Column visibility logic -----------
|
48
|
+
const includeIds = columnVisibilityControl?.includeIds;
|
49
|
+
const firstLeafId = table.getAllLeafColumns()[0]?.id;
|
50
|
+
// Get the first leaf column ID to exclude it from the visibility tree
|
51
|
+
// This is to avoid showing the first column in the dropdown
|
52
|
+
// as toggling it's visibility breaks the expanded row functionality
|
53
|
+
const tree = buildVisibilityTree(columnDefinitions, includeIds).filter(node => node.id !== firstLeafId);
|
54
|
+
|
55
|
+
const renderLeaf = (id: string, label: string) => {
|
56
|
+
const col = table.getColumn(id);
|
57
|
+
const show = col.getIsVisible();
|
58
|
+
|
59
|
+
return (
|
60
|
+
<Checkbox
|
61
|
+
checked={show}
|
62
|
+
key={id}
|
63
|
+
onChange={() => col.toggleVisibility()}
|
64
|
+
paddingBottom="xs"
|
65
|
+
text={label}
|
66
|
+
/>
|
67
|
+
);
|
68
|
+
};
|
69
|
+
|
70
|
+
const gatherLeafIds = (node: VisibilityNode): string[] =>
|
71
|
+
node.children && node.children.length
|
72
|
+
? node.children.flatMap(gatherLeafIds)
|
73
|
+
: node.id
|
74
|
+
? [node.id]
|
75
|
+
: [];
|
76
|
+
|
77
|
+
const renderGroup = (node: VisibilityNode ) => {
|
78
|
+
const leaves = gatherLeafIds(node);
|
79
|
+
const visibleArray = leaves.map((id) => table.getColumn(id).getIsVisible());
|
80
|
+
const allOn = visibleArray.every(Boolean);
|
81
|
+
const someOn = visibleArray.some(Boolean);
|
82
|
+
|
83
|
+
return (
|
84
|
+
<>
|
85
|
+
<Checkbox
|
86
|
+
checked={allOn}
|
87
|
+
indeterminate={!allOn && someOn}
|
88
|
+
onChange={() =>
|
89
|
+
leaves.forEach((id) =>
|
90
|
+
table.getColumn(id).toggleVisibility(!allOn),
|
91
|
+
)
|
92
|
+
}
|
93
|
+
paddingBottom="xs"
|
94
|
+
text={node.label}
|
95
|
+
/>
|
96
|
+
<Flex flexDirection="column"
|
97
|
+
paddingLeft="lg"
|
98
|
+
>
|
99
|
+
{node?.children?.map((child) =>
|
100
|
+
child.children ? renderGroup(child) : renderLeaf(child.id, child.label),
|
101
|
+
)}
|
102
|
+
</Flex>
|
103
|
+
</>
|
104
|
+
);
|
105
|
+
};
|
106
|
+
// ------------ End of column visibility logic --------
|
20
107
|
|
21
108
|
useEffect(() => {
|
22
|
-
if (cardRef.current) {
|
109
|
+
if (cardRef.current && type === "row-selection") {
|
23
110
|
if (isVisible) {
|
24
111
|
showActionBar(cardRef.current);
|
25
112
|
} else {
|
@@ -31,22 +118,68 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
|
|
31
118
|
return (
|
32
119
|
<Card
|
33
120
|
borderNone={!isVisible}
|
34
|
-
className={`${
|
121
|
+
className={`${
|
122
|
+
isVisible && "show-action-card row-selection-actions-card"
|
123
|
+
}`}
|
35
124
|
htmlOptions={{ ref: cardRef as any }}
|
36
125
|
padding={`${isVisible ? "xs" : "none"}`}
|
37
126
|
>
|
38
127
|
<Flex
|
39
128
|
alignItems="center"
|
40
|
-
justify="between"
|
129
|
+
justify={type === "row-selection" ? "between" : "end"}
|
41
130
|
>
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
131
|
+
{type === "row-selection" ? (
|
132
|
+
<>
|
133
|
+
<Caption color="light"
|
134
|
+
paddingLeft="xs"
|
135
|
+
size="xs"
|
136
|
+
>
|
137
|
+
{selectedCount} Selected
|
138
|
+
</Caption>
|
139
|
+
<FlexItem>{actions}</FlexItem>
|
140
|
+
</>
|
141
|
+
) : (
|
142
|
+
<Dropdown
|
143
|
+
className="column-visibility-dropdown-wrapper"
|
144
|
+
options={columnDefinitions}
|
145
|
+
>
|
146
|
+
<DropdownTrigger>
|
147
|
+
<Tooltip
|
148
|
+
placement='top'
|
149
|
+
text="Column Configuration"
|
150
|
+
zIndex={10}
|
151
|
+
>
|
152
|
+
<Icon
|
153
|
+
color="primary"
|
154
|
+
cursor="pointer"
|
155
|
+
icon="sliders-h"
|
156
|
+
/>
|
157
|
+
</Tooltip>
|
158
|
+
</DropdownTrigger>
|
159
|
+
<DropdownContainer
|
160
|
+
className="column-visibility-dropdown"
|
161
|
+
paddingTop="sm"
|
162
|
+
>
|
163
|
+
<>
|
164
|
+
<Caption
|
165
|
+
paddingBottom="sm"
|
166
|
+
text="Columns Config"
|
167
|
+
textAlign="center"
|
168
|
+
/>
|
169
|
+
<SectionSeparator paddingBottom="xs" />
|
170
|
+
{tree.map((node: VisibilityNode) => (
|
171
|
+
<Flex cursor="pointer"
|
172
|
+
flexDirection="column"
|
173
|
+
key={node.id}
|
174
|
+
paddingX="xs"
|
175
|
+
>
|
176
|
+
{node.children ? renderGroup(node) : renderLeaf(node.id, node.label)}
|
177
|
+
</Flex>
|
178
|
+
))}
|
179
|
+
</>
|
180
|
+
</DropdownContainer>
|
181
|
+
</Dropdown>
|
182
|
+
)}
|
50
183
|
</Flex>
|
51
184
|
</Card>
|
52
185
|
);
|
@@ -79,9 +79,26 @@ export const TableHeaderCell = ({
|
|
79
79
|
header?.column.getLeafColumns().length === 1 &&
|
80
80
|
header?.column.getLeafColumns()[0].id === header.column.id
|
81
81
|
|
82
|
-
const
|
83
|
-
|
84
|
-
(
|
82
|
+
const columnHasVisibleLeaf = (col: any): boolean =>
|
83
|
+
col.getIsVisible?.() ||
|
84
|
+
(Array.isArray(col.columns) &&
|
85
|
+
col.columns.some((child: any) => columnHasVisibleLeaf(child)));
|
86
|
+
|
87
|
+
// Check on column position in stack + visibility to add the vertical border
|
88
|
+
const isLastHeaderCell = (() => {
|
89
|
+
if (!header) return false;
|
90
|
+
|
91
|
+
if (header.colSpan > 1 && header.column.parent !== undefined) return true;
|
92
|
+
|
93
|
+
const parent = header.column.parent;
|
94
|
+
|
95
|
+
if (!parent) {
|
96
|
+
const topHeaders = table?.getHeaderGroups()[0].headers.filter((h: any) => columnHasVisibleLeaf(h.column));
|
97
|
+
return topHeaders?.at(-1)?.id === header.id;
|
98
|
+
}
|
99
|
+
const visibleSiblings = parent.columns.filter(columnHasVisibleLeaf);
|
100
|
+
return visibleSiblings.at(-1) === header.column;
|
101
|
+
})();
|
85
102
|
|
86
103
|
const cellClassName = classnames(
|
87
104
|
"table-header-cells",
|
@@ -26,6 +26,8 @@ interface UseTableStateProps {
|
|
26
26
|
virtualizedRows?: boolean;
|
27
27
|
tableOptions?: GenericObject;
|
28
28
|
onRowSelectionChange?: (arg: RowSelectionState) => void;
|
29
|
+
columnVisibilityControl?: GenericObject;
|
30
|
+
|
29
31
|
}
|
30
32
|
|
31
33
|
export function useTableState({
|
@@ -40,16 +42,19 @@ export function useTableState({
|
|
40
42
|
pagination = false,
|
41
43
|
paginationProps,
|
42
44
|
virtualizedRows = false,
|
43
|
-
tableOptions
|
45
|
+
tableOptions,
|
46
|
+
columnVisibilityControl
|
44
47
|
}: UseTableStateProps) {
|
45
48
|
// Create a local state for expanded and setExpanded if expandedControl not used
|
46
49
|
const [localExpanded, setLocalExpanded] = useState({});
|
47
50
|
const [loadingStateRowCount, setLoadingStateRowCount] = useState(initialLoadingRowsCount);
|
48
51
|
const [rowSelection, setRowSelection] = useState<RowSelectionState>({});
|
49
|
-
|
52
|
+
const [localColumnVisibility, setLocalColumnVisibility] = useState({});
|
50
53
|
// Determine whether to use the prop or the local state
|
51
54
|
const expanded = expandedControl ? expandedControl.value : localExpanded;
|
52
55
|
const setExpanded = expandedControl ? expandedControl.onChange : setLocalExpanded;
|
56
|
+
const columnVisibility = (columnVisibilityControl && columnVisibilityControl.value) ? columnVisibilityControl.value : localColumnVisibility;
|
57
|
+
const setColumnVisibility = (columnVisibilityControl && columnVisibilityControl.onChange) ? columnVisibilityControl.onChange : setLocalColumnVisibility;
|
53
58
|
|
54
59
|
// Virtualized data handling (chunked loading)
|
55
60
|
const fetchSize = 20; // Number of rows per "page"
|
@@ -104,17 +109,21 @@ export function useTableState({
|
|
104
109
|
}]), [columnDefinitions, sortControl]);
|
105
110
|
|
106
111
|
// Custom state based on features enabled
|
107
|
-
const customState = useCallback(() => {
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
112
|
+
const customState = useCallback(() => ({
|
113
|
+
state: {
|
114
|
+
expanded,
|
115
|
+
...(sortControl && { sorting }),
|
116
|
+
...(selectableRows && { rowSelection }),
|
117
|
+
...(columnVisibility && { columnVisibility }),
|
118
|
+
},
|
119
|
+
}), [
|
120
|
+
expanded,
|
121
|
+
sortControl,
|
122
|
+
sorting,
|
123
|
+
selectableRows,
|
124
|
+
rowSelection,
|
125
|
+
columnVisibility,
|
126
|
+
]);
|
118
127
|
|
119
128
|
// Pagination configuration
|
120
129
|
const paginationInitializer = useMemo(() => {
|
@@ -145,6 +154,7 @@ export function useTableState({
|
|
145
154
|
sortDescFirst: true,
|
146
155
|
onRowSelectionChange: setRowSelection,
|
147
156
|
getRowId: selectableRows ? row => row.id : undefined,
|
157
|
+
onColumnVisibilityChange: setColumnVisibility,
|
148
158
|
meta: {
|
149
159
|
columnDefinitions
|
150
160
|
},
|
@@ -0,0 +1,47 @@
|
|
1
|
+
export interface VisibilityNode {
|
2
|
+
id: string;
|
3
|
+
label: string;
|
4
|
+
children?: VisibilityNode[];
|
5
|
+
}
|
6
|
+
export const buildVisibilityTree = (
|
7
|
+
defs: any[],
|
8
|
+
allowed?: string[] | null
|
9
|
+
): VisibilityNode[] =>
|
10
|
+
defs
|
11
|
+
.map((def) => {
|
12
|
+
const isGroup = Array.isArray(def.columns) && def.columns.length > 0;
|
13
|
+
|
14
|
+
// No filter at all → keep it
|
15
|
+
if (!allowed?.length) {
|
16
|
+
return isGroup
|
17
|
+
? {
|
18
|
+
id: def.id,
|
19
|
+
label: def.label,
|
20
|
+
children: buildVisibilityTree(def.columns, allowed),
|
21
|
+
}
|
22
|
+
: { id: def.id, label: def.label };
|
23
|
+
}
|
24
|
+
|
25
|
+
// 1️⃣ If *this* ID is explicitly allowed → keep it & all its children
|
26
|
+
if (allowed.includes(def.id)) {
|
27
|
+
return isGroup
|
28
|
+
? {
|
29
|
+
id: def.id,
|
30
|
+
label: def.label,
|
31
|
+
children: buildVisibilityTree(def.columns, null),
|
32
|
+
}
|
33
|
+
: { id: def.id, label: def.label };
|
34
|
+
}
|
35
|
+
|
36
|
+
// Otherwise, if it’s a group, recurse & keep only if kids survive
|
37
|
+
if (isGroup) {
|
38
|
+
const kids = buildVisibilityTree(def.columns, allowed).filter(Boolean);
|
39
|
+
return kids.length
|
40
|
+
? { id: def.id, label: def.label, children: kids }
|
41
|
+
: null;
|
42
|
+
}
|
43
|
+
|
44
|
+
// Leaf not allowed → drop it
|
45
|
+
return null;
|
46
|
+
})
|
47
|
+
.filter(Boolean);
|