playbook_ui 18.4.0.pre.rc.3 → 18.4.0.pre.rc.4
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/TableActionBar.tsx +62 -2
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +31 -0
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +11 -0
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +584 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.jsx +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.md +5 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.md +3 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi_select_all.jsx +82 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi_select_all.md +3 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.md +3 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +4 -1
- data/app/pb_kits/playbook/pb_textarea/_textarea.tsx +4 -1
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +4 -1
- data/dist/ai/forms.json +1 -1
- data/dist/ai/index.json +2 -2
- data/dist/chunks/{_typeahead-C3MN3apM.js → _typeahead-CkiAf8zx.js} +1 -1
- data/dist/chunks/vendor.js +2 -2
- data/dist/menu.yml +1 -1
- 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 +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1df28cd47b46eb68946cd5c67fcef11fe973280a276bdd99aba59edb92d0184c
|
|
4
|
+
data.tar.gz: c4ddd1d22951372fb5d19551130a59d7afcc4db65137c38b304759e0e163eb22
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 94368c60f1dc816e476d40b035cb568beac72aad355eba4c9442deaa15cec42555d4f128f81490e971b8b100747aebc07dc35e7c84651e04a0c533743cd1c5a7
|
|
7
|
+
data.tar.gz: 3dd28c6b45033189fd6923b9318fe8aa468cb3616009b6b96c346e7b3826cdba4298a094c25d844eaf336cfa7b54d89331fd1a0cba7d693327a988c2504889b1
|
|
@@ -105,7 +105,7 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
|
|
|
105
105
|
}
|
|
106
106
|
};
|
|
107
107
|
return (
|
|
108
|
-
|
|
108
|
+
<React.Fragment key={node.id}>
|
|
109
109
|
<Checkbox
|
|
110
110
|
checked={allOn}
|
|
111
111
|
indeterminate={!allOn && someOn}
|
|
@@ -120,7 +120,7 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
|
|
|
120
120
|
child.children ? renderGroup(child) : renderLeaf(child.id, child.label),
|
|
121
121
|
)}
|
|
122
122
|
</Flex>
|
|
123
|
-
|
|
123
|
+
</React.Fragment>
|
|
124
124
|
);
|
|
125
125
|
};
|
|
126
126
|
// ------------ End of column visibility logic --------
|
|
@@ -143,6 +143,47 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
|
|
|
143
143
|
const handleShouldClose = (shouldClose: boolean) =>
|
|
144
144
|
setShowPopover(!shouldClose)
|
|
145
145
|
|
|
146
|
+
// Select All only changes columns listed in the popover that can be hidden.
|
|
147
|
+
// The first column and ids omitted by includeIds stay as they are.
|
|
148
|
+
// Skip the leaf walk unless the checkbox is enabled.
|
|
149
|
+
const selectAllRequested = columnVisibilityControl?.showSelectAll === true
|
|
150
|
+
const availableColumns = selectAllRequested
|
|
151
|
+
? tree.flatMap(gatherLeafIds).flatMap((id) => {
|
|
152
|
+
const column = table.getColumn(id)
|
|
153
|
+
return column?.getCanHide() ? [column] : []
|
|
154
|
+
})
|
|
155
|
+
: []
|
|
156
|
+
const allAvailableVisible =
|
|
157
|
+
availableColumns.length > 0 &&
|
|
158
|
+
availableColumns.every((column) => column.getIsVisible())
|
|
159
|
+
const someAvailableVisible = availableColumns.some((column) => column.getIsVisible())
|
|
160
|
+
const showSelectAll = availableColumns.length > 0
|
|
161
|
+
const selectAllLabel = allAvailableVisible ? "Deselect All" : "Select All"
|
|
162
|
+
|
|
163
|
+
// Uses the same updater form as toggleVisibility, so onChange gets the same kind of value.
|
|
164
|
+
const handleSelectAllChange = () => {
|
|
165
|
+
const selectAllVisibility = Object.fromEntries(
|
|
166
|
+
availableColumns.map((column) => [column.id, !allAvailableVisible])
|
|
167
|
+
)
|
|
168
|
+
table.setColumnVisibility((previousVisibility: { [id: string]: boolean }) => ({
|
|
169
|
+
...previousVisibility,
|
|
170
|
+
...selectAllVisibility,
|
|
171
|
+
}))
|
|
172
|
+
|
|
173
|
+
if (columnVisibilityControl?.onColumnVisibilityChange) {
|
|
174
|
+
const nextVisibility = { ...table.getState().columnVisibility, ...selectAllVisibility }
|
|
175
|
+
// Same shape as the single toggles: root column ids, groups visible if any leaf is visible
|
|
176
|
+
const updatedVisibilityState = table.getAllColumns().reduce((
|
|
177
|
+
acc: { [id: string]: boolean },
|
|
178
|
+
column: { getLeafColumns: () => { id: string }[]; id: string }
|
|
179
|
+
) => {
|
|
180
|
+
acc[column.id] = column.getLeafColumns().some((leaf) => nextVisibility[leaf.id] ?? true)
|
|
181
|
+
return acc
|
|
182
|
+
}, {})
|
|
183
|
+
columnVisibilityControl.onColumnVisibilityChange(updatedVisibilityState)
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
146
187
|
const popoverReference = (
|
|
147
188
|
<Tooltip
|
|
148
189
|
placement="top"
|
|
@@ -197,6 +238,25 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
|
|
|
197
238
|
textAlign="center"
|
|
198
239
|
/>
|
|
199
240
|
<SectionSeparator paddingBottom="xs" />
|
|
241
|
+
{showSelectAll && (
|
|
242
|
+
<>
|
|
243
|
+
<Flex
|
|
244
|
+
cursor="pointer"
|
|
245
|
+
flexDirection="column"
|
|
246
|
+
paddingX="xs"
|
|
247
|
+
>
|
|
248
|
+
<Checkbox
|
|
249
|
+
aria={{ label: selectAllLabel }}
|
|
250
|
+
checked={allAvailableVisible}
|
|
251
|
+
indeterminate={!allAvailableVisible && someAvailableVisible}
|
|
252
|
+
onChange={handleSelectAllChange}
|
|
253
|
+
paddingBottom="xs"
|
|
254
|
+
text={selectAllLabel}
|
|
255
|
+
/>
|
|
256
|
+
</Flex>
|
|
257
|
+
<SectionSeparator paddingBottom="xs" />
|
|
258
|
+
</>
|
|
259
|
+
)}
|
|
200
260
|
{tree.map((node: VisibilityNode) => (
|
|
201
261
|
<Flex cursor="pointer"
|
|
202
262
|
flexDirection="column"
|
|
@@ -32,6 +32,7 @@ export const TableHeader = ({
|
|
|
32
32
|
...props
|
|
33
33
|
}: TableHeaderProps) => {
|
|
34
34
|
const {
|
|
35
|
+
columnVisibilityControl,
|
|
35
36
|
enableToggleExpansion,
|
|
36
37
|
handleExpandOrCollapse,
|
|
37
38
|
loading,
|
|
@@ -63,11 +64,40 @@ export const TableHeader = ({
|
|
|
63
64
|
`${responsive === "scroll" && "pinned-left"}`,
|
|
64
65
|
);
|
|
65
66
|
|
|
67
|
+
// TanStack drops header rows when every leaf in a group is hidden.
|
|
68
|
+
// Spacer rows keep that height only when Select All can hide a whole group.
|
|
69
|
+
const showSelectAll = columnVisibilityControl?.showSelectAll === true
|
|
70
|
+
let hiddenHeaderRowCount = 0
|
|
71
|
+
let spacerColSpan = 0
|
|
72
|
+
if (showSelectAll) {
|
|
73
|
+
const columnHeaderDepth = Math.max(
|
|
74
|
+
...table.getAllFlatColumns().map((column: GenericObject) => column.depth + 1)
|
|
75
|
+
)
|
|
76
|
+
hiddenHeaderRowCount = columnHeaderDepth - table.getHeaderGroups().length
|
|
77
|
+
spacerColSpan = table.getVisibleLeafColumns().length + (!hasAnySubRows && selectableRows ? 1 : 0)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const renderSpacerRows = (rowClassName?: string) =>
|
|
81
|
+
Array.from({ length: Math.max(0, hiddenHeaderRowCount) }, (_, index) => (
|
|
82
|
+
<tr
|
|
83
|
+
aria-hidden="true"
|
|
84
|
+
className={classnames("header-spacer-row", rowClassName)}
|
|
85
|
+
key={`header-spacer-${index}`}
|
|
86
|
+
>
|
|
87
|
+
{/* header-spacer-cell stays off .table-header-cells so width measurement and sticky-left styles skip it. */}
|
|
88
|
+
<th
|
|
89
|
+
className="header-spacer-cell"
|
|
90
|
+
colSpan={spacerColSpan}
|
|
91
|
+
/>
|
|
92
|
+
</tr>
|
|
93
|
+
))
|
|
94
|
+
|
|
66
95
|
const renderRegularTableHeader = () => (
|
|
67
96
|
<thead className={classes}
|
|
68
97
|
id={id}
|
|
69
98
|
ref={headerRef}
|
|
70
99
|
>
|
|
100
|
+
{renderSpacerRows()}
|
|
71
101
|
{table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>) => (
|
|
72
102
|
<tr key={`${headerGroup.id}-headerGroup`}>
|
|
73
103
|
{!hasAnySubRows && selectableRows && (
|
|
@@ -109,6 +139,7 @@ export const TableHeader = ({
|
|
|
109
139
|
id={id}
|
|
110
140
|
ref={headerRef}
|
|
111
141
|
>
|
|
142
|
+
{renderSpacerRows("virtualized-header-row-header")}
|
|
112
143
|
{table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>) => (
|
|
113
144
|
<tr
|
|
114
145
|
className="virtualized-header-row-header"
|
|
@@ -251,6 +251,10 @@
|
|
|
251
251
|
th[colspan]:not([colspan="1"]) {
|
|
252
252
|
border-right: 1px solid $border_light !important;
|
|
253
253
|
}
|
|
254
|
+
// Spacer rows have no text, so give them one line of header height.
|
|
255
|
+
.header-spacer-cell::before {
|
|
256
|
+
content: "\00a0";
|
|
257
|
+
}
|
|
254
258
|
.table-header-cells-custom {
|
|
255
259
|
text-align: center;
|
|
256
260
|
[class^="pb_checkbox_kit"] .pb_checkbox_label {
|
|
@@ -292,6 +296,13 @@
|
|
|
292
296
|
.pb_tooltip_kit {
|
|
293
297
|
font-weight: unset;
|
|
294
298
|
text-transform: unset;
|
|
299
|
+
|
|
300
|
+
.tooltip_tooltip {
|
|
301
|
+
font-size: initial;
|
|
302
|
+
font-weight: normal;
|
|
303
|
+
letter-spacing: normal;
|
|
304
|
+
text-transform: none;
|
|
305
|
+
}
|
|
295
306
|
}
|
|
296
307
|
}
|
|
297
308
|
|