playbook_ui 14.23.0.pre.alpha.highchartstest9121 → 14.23.0.pre.alpha.play1983advancedtabledoubleborder9286
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/CustomCell.tsx +7 -6
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +10 -10
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +0 -1
- data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +2 -2
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +69 -2
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +9 -6
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +12 -2
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table_action_bar.js +16 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props.html.erb +6 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props.jsx +21 -6
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_multi_header.jsx +107 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_multi_header.md +1 -0
- 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_advanced_table/index.js +5 -1
- data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +7 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +2 -2
- data/app/pb_kits/playbook/pb_checkbox/checkbox.rb +12 -1
- data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_indeterminate.html.erb +1 -1
- data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_indeterminate_rails.md +2 -1
- data/app/pb_kits/playbook/pb_checkbox/index.js +3 -1
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +17 -1
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +6 -0
- data/app/pb_kits/playbook/pb_dropdown/_dropdown_mixin.scss +36 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_active_style_options.jsx +90 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_active_style_options_react.md +4 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options.jsx +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options_react.md +1 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +3 -2
- data/app/pb_kits/playbook/pb_dropdown/docs/index.js +2 -1
- data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +24 -0
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +11 -1
- data/app/pb_kits/playbook/pb_pagination/_pagination.tsx +4 -0
- data/app/pb_kits/playbook/pb_pagination/docs/_pagination_default_rails.md +3 -1
- data/app/pb_kits/playbook/pb_pagination/docs/_pagination_default_react.md +3 -1
- data/app/pb_kits/playbook/pb_select/select.rb +4 -2
- data/app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.html.erb +1 -0
- data/dist/chunks/_weekday_stacked-9aguRqOv.js +37 -0
- data/dist/chunks/vendor.js +1 -1
- data/dist/menu.yml +1 -8
- 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 +1 -1
- metadata +8 -14
- data/app/pb_kits/playbook/pb_walkthrough/_walkthrough.scss +0 -0
- data/app/pb_kits/playbook/pb_walkthrough/_walkthrough.tsx +0 -202
- data/app/pb_kits/playbook/pb_walkthrough/docs/_walkthrough_continuous.jsx +0 -69
- data/app/pb_kits/playbook/pb_walkthrough/docs/_walkthrough_default.jsx +0 -71
- data/app/pb_kits/playbook/pb_walkthrough/docs/_walkthrough_multi_beacon.jsx +0 -110
- data/app/pb_kits/playbook/pb_walkthrough/docs/_walkthrough_no_beacon.jsx +0 -76
- data/app/pb_kits/playbook/pb_walkthrough/docs/_walkthrough_no_overlay.jsx +0 -76
- data/app/pb_kits/playbook/pb_walkthrough/docs/_walkthrough_styled.jsx +0 -76
- data/app/pb_kits/playbook/pb_walkthrough/docs/example.yml +0 -10
- data/app/pb_kits/playbook/pb_walkthrough/docs/index.js +0 -6
- data/app/pb_kits/playbook/pb_walkthrough/walkthrough.test.jsx +0 -34
- data/dist/chunks/_weekday_stacked-DhFTG-Jt.js +0 -61
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 96d0660f857b59986929260adca4f46190602fa97cf19854d6d5caa8a7a997fc
|
4
|
+
data.tar.gz: b0e422e432dd215f0c1738f5b2eb3d26be164103b277c274318570bdf4857b97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 39eb60cbc85b72e9b293b5a0af34eb7c18dc464de9622dcb76f3e2cce7b99f01b6a1be4fb3d5c0506af9f0433f0500de902fde48576355103c16732d73d70a86
|
7
|
+
data.tar.gz: a94d811f6303801719cbe279e2dea8ed11ce67c438ef612d4698733d33dec2482e46b0bce0fdb3c4622432d4c670ef3ec83ef633d4cd691122f3d71d7e7757dc
|
@@ -107,7 +107,6 @@
|
|
107
107
|
@import 'pb_typeahead/typeahead';
|
108
108
|
@import 'pb_user/user';
|
109
109
|
@import 'pb_user_badge/user_badge';
|
110
|
-
@import 'pb_walkthrough/walkthrough';
|
111
110
|
@import 'pb_weekday_stacked/weekday_stacked';
|
112
111
|
@import 'pb_empty_state/empty_state';
|
113
112
|
@import 'utilities/mixins';
|
@@ -20,7 +20,7 @@ interface CustomCellProps {
|
|
20
20
|
customRenderer?: (row: Row<GenericObject>, value: string | undefined) => React.ReactNode
|
21
21
|
selectableRows?: boolean
|
22
22
|
customStyle?: GenericObject
|
23
|
-
}
|
23
|
+
}
|
24
24
|
|
25
25
|
export const CustomCell = ({
|
26
26
|
getValue,
|
@@ -35,7 +35,7 @@ export const CustomCell = ({
|
|
35
35
|
|
36
36
|
const handleOnExpand = (row: Row<GenericObject>) => {
|
37
37
|
onRowToggleClick && onRowToggleClick(row);
|
38
|
-
|
38
|
+
|
39
39
|
if (!expandedControl) {
|
40
40
|
setExpanded({ ...expanded, [row.id]: !row.getIsExpanded() });
|
41
41
|
}
|
@@ -46,8 +46,8 @@ export const CustomCell = ({
|
|
46
46
|
|
47
47
|
return (
|
48
48
|
<div style={{ paddingLeft: `${row.depth * 1.25}em`}}>
|
49
|
-
<Flex
|
50
|
-
alignItems="center"
|
49
|
+
<Flex
|
50
|
+
alignItems="center"
|
51
51
|
columnGap="xs"
|
52
52
|
justify="start"
|
53
53
|
orientation="row"
|
@@ -71,11 +71,12 @@ export const CustomCell = ({
|
|
71
71
|
>
|
72
72
|
{row.getIsExpanded() ? (
|
73
73
|
<Icon cursor="pointer"
|
74
|
-
icon="circle-play
|
74
|
+
icon="circle-play"
|
75
|
+
rotation={90}
|
75
76
|
/>
|
76
77
|
) : (
|
77
78
|
<Icon cursor="pointer"
|
78
|
-
icon="circle-play"
|
79
|
+
icon="circle-play"
|
79
80
|
/>
|
80
81
|
)}
|
81
82
|
</button>
|
@@ -112,7 +112,7 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
|
|
112
112
|
paddingBottom="xs"
|
113
113
|
text={node.label}
|
114
114
|
/>
|
115
|
-
<Flex flexDirection="column"
|
115
|
+
<Flex flexDirection="column"
|
116
116
|
paddingLeft="lg"
|
117
117
|
>
|
118
118
|
{node?.children?.map((child) =>
|
@@ -141,8 +141,8 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
|
|
141
141
|
setShowPopover(!shouldClose)
|
142
142
|
|
143
143
|
const popoverReference = (
|
144
|
-
<Tooltip
|
145
|
-
placement="top"
|
144
|
+
<Tooltip
|
145
|
+
placement="top"
|
146
146
|
text="Column Configuration"
|
147
147
|
>
|
148
148
|
<div onClick={togglePopover}>
|
@@ -170,8 +170,8 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
|
|
170
170
|
>
|
171
171
|
{type === "row-selection" ? (
|
172
172
|
<>
|
173
|
-
<Caption color="light"
|
174
|
-
paddingLeft="xs"
|
173
|
+
<Caption color="light"
|
174
|
+
paddingLeft="xs"
|
175
175
|
size="xs"
|
176
176
|
>
|
177
177
|
{selectedCount} Selected
|
@@ -188,15 +188,15 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
|
|
188
188
|
zIndex={3}
|
189
189
|
>
|
190
190
|
<>
|
191
|
-
<Caption
|
192
|
-
paddingY="sm"
|
191
|
+
<Caption
|
192
|
+
paddingY="sm"
|
193
193
|
text="Columns Config"
|
194
|
-
textAlign="center"
|
194
|
+
textAlign="center"
|
195
195
|
/>
|
196
196
|
<SectionSeparator paddingBottom="xs" />
|
197
197
|
{tree.map((node: VisibilityNode) => (
|
198
|
-
<Flex cursor="pointer"
|
199
|
-
flexDirection="column"
|
198
|
+
<Flex cursor="pointer"
|
199
|
+
flexDirection="column"
|
200
200
|
key={node.id}
|
201
201
|
paddingX="xs"
|
202
202
|
>
|
@@ -83,11 +83,11 @@ export function useTableState({
|
|
83
83
|
const buildColumns = useCallback((columnDefinitions: GenericObject[], isRoot = true): any[] => {
|
84
84
|
return columnDefinitions?.map((column, index) => {
|
85
85
|
const isFirstColumn = isRoot && index === 0;
|
86
|
-
|
87
86
|
// Handle grouped columns
|
88
87
|
if (column.columns && column.columns.length > 0) {
|
89
88
|
return {
|
90
|
-
header: column.header
|
89
|
+
header: column.header ?? column.label ?? "",
|
90
|
+
id: column.id ?? column.label ?? `group-${index}`,
|
91
91
|
columns: buildColumns(column.columns, false),
|
92
92
|
};
|
93
93
|
}
|
@@ -124,13 +124,65 @@
|
|
124
124
|
-ms-overflow-style: none !important;
|
125
125
|
scrollbar-width: none !important;
|
126
126
|
}
|
127
|
-
|
127
|
+
|
128
|
+
// When action bar is hidden, ensure proper border radius for header corners
|
129
|
+
&.hidden-action-bar {
|
130
|
+
.pb_advanced_table_header {
|
131
|
+
> tr:first-child {
|
132
|
+
th:first-child {
|
133
|
+
border-top-left-radius: 4px !important;
|
134
|
+
}
|
135
|
+
th:last-child {
|
136
|
+
border-top-right-radius: 4px !important;
|
137
|
+
}
|
138
|
+
}
|
139
|
+
}
|
140
|
+
|
141
|
+
// Also handle the case when there are multiple header rows
|
142
|
+
.pb_advanced_table_header {
|
143
|
+
> tr:first-child {
|
144
|
+
th:first-child,
|
145
|
+
.table-header-cells:first-child,
|
146
|
+
.table-header-cells-custom:first-child {
|
147
|
+
border-top-left-radius: 4px !important;
|
148
|
+
}
|
149
|
+
th:last-child,
|
150
|
+
.table-header-cells:last-child,
|
151
|
+
.table-header-cells-custom:last-child {
|
152
|
+
border-top-right-radius: 4px !important;
|
153
|
+
}
|
154
|
+
}
|
155
|
+
}
|
156
|
+
}
|
157
|
+
|
158
|
+
// When action bar is shown, remove border radius from header
|
159
|
+
.row-selection-actions-card.is-visible ~ * .pb_advanced_table_header,
|
160
|
+
.row-selection-actions-card.show-action-card ~ * .pb_advanced_table_header {
|
161
|
+
> tr:first-child {
|
162
|
+
th:first-child,
|
163
|
+
th:last-child,
|
164
|
+
.table-header-cells:first-child,
|
165
|
+
.table-header-cells:last-child,
|
166
|
+
.table-header-cells-custom:first-child,
|
167
|
+
.table-header-cells-custom:last-child {
|
168
|
+
border-top-left-radius: 0 !important;
|
169
|
+
border-top-right-radius: 0 !important;
|
170
|
+
}
|
171
|
+
}
|
172
|
+
}
|
173
|
+
|
128
174
|
|
129
175
|
.row-selection-actions-card {
|
130
176
|
border-bottom-right-radius: 0px !important;
|
131
177
|
border-bottom-left-radius: 0px !important;
|
132
178
|
border-bottom-color: transparent;
|
133
179
|
transition: height 300ms ease;
|
180
|
+
|
181
|
+
&.is-visible,
|
182
|
+
&.show-action-card {
|
183
|
+
border-top-left-radius: 4px !important;
|
184
|
+
border-top-right-radius: 4px !important;
|
185
|
+
}
|
134
186
|
}
|
135
187
|
.table-header-cells:first-child {
|
136
188
|
min-width: 180px;
|
@@ -915,4 +967,19 @@
|
|
915
967
|
// Outside of the pb_advanced_table class for popover
|
916
968
|
.pb-advanced-table-popover-option:hover {
|
917
969
|
background-color: $bg_light;
|
918
|
-
}
|
970
|
+
}
|
971
|
+
// Removes borders when Wrapped inside the Card Kit
|
972
|
+
[class^=pb_card_kit] > .pb_advanced_table .pb_advanced_table_body .last-cell,
|
973
|
+
[class^=pb_card_kit] > .pb_advanced_table .pb_advanced_table_header .last-header-cell,
|
974
|
+
[class^=pb_card_kit] > .pb_advanced_table .pb_advanced_table_body tr td:last-child,
|
975
|
+
[class^=pb_card_kit] > .pb_advanced_table .pb_advanced_table_header tr th:last-child {
|
976
|
+
border-right: none !important;
|
977
|
+
}
|
978
|
+
|
979
|
+
// Removes borders when Wrapped inside the Card Kit
|
980
|
+
[class^=pb_card_kit] > .pb_advanced_table tr:last-child,
|
981
|
+
[class^=pb_card_kit] > .pb_advanced_table .last-row-cell {
|
982
|
+
td {
|
983
|
+
border-bottom: none !important;
|
984
|
+
}
|
985
|
+
}
|
@@ -218,10 +218,10 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
218
218
|
)
|
219
219
|
|
220
220
|
return (
|
221
|
-
<Card
|
221
|
+
<Card
|
222
222
|
borderNone
|
223
223
|
borderRadius="none"
|
224
|
-
className="advanced-table-fullscreen-header"
|
224
|
+
className="advanced-table-fullscreen-header"
|
225
225
|
{...props}
|
226
226
|
>
|
227
227
|
<Flex justify="end">
|
@@ -250,6 +250,10 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
250
250
|
const ariaProps = buildAriaProps(aria);
|
251
251
|
const dataProps = buildDataProps(data);
|
252
252
|
const htmlProps = buildHtmlProps(htmlOptions);
|
253
|
+
|
254
|
+
// Visibility flag for action bar
|
255
|
+
const isActionBarVisible = (selectableRows && showActionsBar && selectedRowsLength > 0) || columnVisibilityControl;
|
256
|
+
|
253
257
|
const classes = classnames(
|
254
258
|
buildCss("pb_advanced_table"),
|
255
259
|
`advanced-table-responsive-${responsive}`,
|
@@ -257,6 +261,8 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
257
261
|
{
|
258
262
|
'advanced-table-fullscreen': isFullscreen,
|
259
263
|
'advanced-table-allow-fullscreen': allowFullScreen,
|
264
|
+
// Add the hidden-action-bar class when action bar functionality exists but is not visible
|
265
|
+
'hidden-action-bar': (selectableRows || columnVisibilityControl) && !isActionBarVisible,
|
260
266
|
},
|
261
267
|
{'advanced-table-sticky-left-columns': stickyLeftColumn && stickyLeftColumn.length > 0},
|
262
268
|
columnGroupBorderColor ? `column-group-border-${columnGroupBorderColor}` : '',
|
@@ -270,9 +276,6 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
270
276
|
? getVirtualizedContainerStyles(maxHeight)
|
271
277
|
: {};
|
272
278
|
|
273
|
-
// Visibility flag for action bar
|
274
|
-
const isActionBarVisible = (selectableRows && showActionsBar && selectedRowsLength > 0) || columnVisibilityControl;
|
275
|
-
|
276
279
|
// The actual Main <Table /> element
|
277
280
|
const tableElement = (
|
278
281
|
<Table
|
@@ -288,7 +291,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
288
291
|
) : (
|
289
292
|
<>
|
290
293
|
<TableHeader />
|
291
|
-
<TableBody
|
294
|
+
<TableBody
|
292
295
|
isFetching={isFetching}
|
293
296
|
/>
|
294
297
|
</>
|
@@ -35,7 +35,12 @@ module Playbook
|
|
35
35
|
default: []
|
36
36
|
|
37
37
|
def classname
|
38
|
-
additional_classes = [
|
38
|
+
additional_classes = [
|
39
|
+
responsive_classname,
|
40
|
+
max_height_classname,
|
41
|
+
hide_scroll_bar_class,
|
42
|
+
hidden_action_bar_class,
|
43
|
+
]
|
39
44
|
additional_classes << "column-group-border-#{column_group_border_color}" if column_group_border_color != "none"
|
40
45
|
generate_classname("pb_advanced_table", *additional_classes, separator: " ")
|
41
46
|
end
|
@@ -49,7 +54,12 @@ module Playbook
|
|
49
54
|
end
|
50
55
|
|
51
56
|
def hide_scroll_bar_class
|
52
|
-
scroll_bar_none ? "advanced-table-hide-scrollbar
|
57
|
+
scroll_bar_none ? "advanced-table-hide-scrollbar" : ""
|
58
|
+
end
|
59
|
+
|
60
|
+
def hidden_action_bar_class
|
61
|
+
# Add hidden-action-bar class when action bar functionality is enabled but not currently visible
|
62
|
+
selectable_rows && !is_action_bar_visible ? "hidden-action-bar" : ""
|
53
63
|
end
|
54
64
|
|
55
65
|
def selected_rows
|
@@ -1,4 +1,7 @@
|
|
1
1
|
function showActionBar(actionBar, selectedCount) {
|
2
|
+
// Get container
|
3
|
+
const tableContainer = actionBar.closest('.pb_advanced_table');
|
4
|
+
|
2
5
|
// Show action bar directly
|
3
6
|
actionBar.style.height = "auto";
|
4
7
|
actionBar.style.overflow = "visible";
|
@@ -8,6 +11,11 @@ function showActionBar(actionBar, selectedCount) {
|
|
8
11
|
actionBar.classList.remove("p_none");
|
9
12
|
actionBar.classList.add("p_xs", "is-visible", "show-action-card");
|
10
13
|
|
14
|
+
// Remove hidden-action-bar class when action bar is shown
|
15
|
+
if (tableContainer) {
|
16
|
+
tableContainer.classList.remove("hidden-action-bar");
|
17
|
+
}
|
18
|
+
|
11
19
|
// Update the count
|
12
20
|
const countElement = actionBar.querySelector(".selected-count");
|
13
21
|
if (countElement) {
|
@@ -16,12 +24,20 @@ function showActionBar(actionBar, selectedCount) {
|
|
16
24
|
}
|
17
25
|
|
18
26
|
function hideActionBar(actionBar) {
|
27
|
+
// Get container
|
28
|
+
const tableContainer = actionBar.closest('.pb_advanced_table');
|
29
|
+
|
19
30
|
// Hide action bar directly
|
20
31
|
actionBar.style.height = "0px";
|
21
32
|
actionBar.style.overflow = "hidden";
|
22
33
|
actionBar.style.opacity = "0";
|
23
34
|
actionBar.classList.add("p_none");
|
24
35
|
actionBar.classList.remove("p_xs", "is-visible", "show-action-card");
|
36
|
+
|
37
|
+
// Add hidden-action-bar class when action bar is hidden
|
38
|
+
if (tableContainer) {
|
39
|
+
tableContainer.classList.add("hidden-action-bar");
|
40
|
+
}
|
25
41
|
}
|
26
42
|
|
27
43
|
export function updateSelectionActionBar(table, selectedCount) {
|
@@ -29,5 +29,10 @@
|
|
29
29
|
label: "Graduated Students",
|
30
30
|
}
|
31
31
|
] %>
|
32
|
+
<%= pb_rails("card", props: { margin_bottom: "md" }) do %>
|
33
|
+
<%= pb_rails("advanced_table", props: { id: "table_props_table", table_data: @table_data, column_definitions: column_definitions, table_props: { container: false, vertical_border: true }}) %>
|
34
|
+
<% end %>
|
32
35
|
|
33
|
-
<%= pb_rails("
|
36
|
+
<%= pb_rails("card", props: { padding: "none" }) do %>
|
37
|
+
<%= pb_rails("advanced_table", props: { id: "table_props_table_2", padding: "none", table_data: @table_data, column_definitions: column_definitions, table_props: { container: false, vertical_border: true }}) %>
|
38
|
+
<% end %>
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import React from "react"
|
2
2
|
import AdvancedTable from '../../pb_advanced_table/_advanced_table'
|
3
|
+
import { Card } from "playbook-ui"
|
3
4
|
import MOCK_DATA from "./advanced_table_mock_data.json"
|
4
5
|
|
5
6
|
const AdvancedTableTableProps = (props) => {
|
@@ -42,12 +43,26 @@ const AdvancedTableTableProps = (props) => {
|
|
42
43
|
|
43
44
|
return (
|
44
45
|
<div>
|
45
|
-
<
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
46
|
+
<Card padding="md">
|
47
|
+
<AdvancedTable
|
48
|
+
columnDefinitions={columnDefinitions}
|
49
|
+
tableData={MOCK_DATA}
|
50
|
+
tableProps={tableProps}
|
51
|
+
{...props}
|
52
|
+
/>
|
53
|
+
</Card>
|
54
|
+
|
55
|
+
<Card
|
56
|
+
marginTop="md"
|
57
|
+
padding="none"
|
58
|
+
>
|
59
|
+
<AdvancedTable
|
60
|
+
columnDefinitions={columnDefinitions}
|
61
|
+
tableData={MOCK_DATA}
|
62
|
+
tableProps={tableProps}
|
63
|
+
{...props}
|
64
|
+
/>
|
65
|
+
</Card>
|
51
66
|
</div>
|
52
67
|
)
|
53
68
|
}
|
data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_multi_header.jsx
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
import React from "react"
|
2
|
+
import AdvancedTable from '../../pb_advanced_table/_advanced_table'
|
3
|
+
import Icon from "../../pb_icon/_icon"
|
4
|
+
import Flex from "../../pb_flex/_flex"
|
5
|
+
import Caption from "../../pb_caption/_caption"
|
6
|
+
import Tooltip from "../../pb_tooltip/_tooltip"
|
7
|
+
import MOCK_DATA from "./advanced_table_mock_data.json"
|
8
|
+
|
9
|
+
const AdvancedTableWithCustomHeaderMultiHeader = (props) => {
|
10
|
+
|
11
|
+
const columnDefinitions = [
|
12
|
+
{
|
13
|
+
accessor: "year",
|
14
|
+
label: "Year",
|
15
|
+
id: "year",
|
16
|
+
cellAccessors: ["quarter", "month", "day"],
|
17
|
+
},
|
18
|
+
{
|
19
|
+
label: "Enrollment Data",
|
20
|
+
id: "enrollmentData",
|
21
|
+
header: () => (
|
22
|
+
<Flex alignItems="center"
|
23
|
+
justifyContent="center"
|
24
|
+
>
|
25
|
+
<Caption marginRight="xs">Enrollments Data</Caption>
|
26
|
+
<Tooltip placement="top"
|
27
|
+
text="Whoa. I'm a Tooltip"
|
28
|
+
zIndex={10}
|
29
|
+
>
|
30
|
+
<Icon cursor="pointer"
|
31
|
+
icon="info"
|
32
|
+
size="xs"
|
33
|
+
/>
|
34
|
+
</Tooltip>
|
35
|
+
</Flex>
|
36
|
+
),
|
37
|
+
columns: [
|
38
|
+
{
|
39
|
+
label: "Enrollment Stats",
|
40
|
+
id: "enrollmentStats",
|
41
|
+
columns: [
|
42
|
+
{
|
43
|
+
accessor: "newEnrollments",
|
44
|
+
id: "newEnrollments",
|
45
|
+
label: "New Enrollments",
|
46
|
+
},
|
47
|
+
{
|
48
|
+
accessor: "scheduledMeetings",
|
49
|
+
id: "scheduledMeetings",
|
50
|
+
label: "Scheduled Meetings",
|
51
|
+
},
|
52
|
+
],
|
53
|
+
},
|
54
|
+
],
|
55
|
+
},
|
56
|
+
{
|
57
|
+
label: "Performance Data",
|
58
|
+
id: "performanceData",
|
59
|
+
columns: [
|
60
|
+
{
|
61
|
+
label: "Completion Metrics",
|
62
|
+
id: "completionMetrics",
|
63
|
+
columns: [
|
64
|
+
{
|
65
|
+
accessor: "completedClasses",
|
66
|
+
label: "Completed Classes",
|
67
|
+
id: "completedClasses",
|
68
|
+
},
|
69
|
+
{
|
70
|
+
accessor: "classCompletionRate",
|
71
|
+
label: "Class Completion Rate",
|
72
|
+
id: "classCompletionRate",
|
73
|
+
},
|
74
|
+
],
|
75
|
+
},
|
76
|
+
{
|
77
|
+
label: "Attendance",
|
78
|
+
id: "attendance",
|
79
|
+
columns: [
|
80
|
+
{
|
81
|
+
accessor: "attendanceRate",
|
82
|
+
label: "Attendance Rate",
|
83
|
+
id: "attendanceRate",
|
84
|
+
},
|
85
|
+
{
|
86
|
+
accessor: "scheduledMeetings",
|
87
|
+
label: "Scheduled Meetings",
|
88
|
+
id: "scheduledMeetings",
|
89
|
+
},
|
90
|
+
],
|
91
|
+
},
|
92
|
+
],
|
93
|
+
},
|
94
|
+
];
|
95
|
+
|
96
|
+
return (
|
97
|
+
<div>
|
98
|
+
<AdvancedTable
|
99
|
+
columnDefinitions={columnDefinitions}
|
100
|
+
tableData={MOCK_DATA}
|
101
|
+
{...props}
|
102
|
+
/>
|
103
|
+
</div>
|
104
|
+
)
|
105
|
+
}
|
106
|
+
|
107
|
+
export default AdvancedTableWithCustomHeaderMultiHeader;
|
data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_multi_header.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
The optional `header` key/value pair within `columnDefinitions` can also be used with multi headers as seen here.
|
@@ -43,6 +43,7 @@ examples:
|
|
43
43
|
- advanced_table_responsive: Responsive Tables
|
44
44
|
- advanced_table_custom_cell: Custom Components for Cells
|
45
45
|
- advanced_table_with_custom_header: Custom Header Cell
|
46
|
+
- advanced_table_with_custom_header_multi_header: Custom Header with Multiple Headers
|
46
47
|
- advanced_table_pagination: Pagination
|
47
48
|
- advanced_table_pagination_with_props: Pagination Props
|
48
49
|
- advanced_table_loading: Loading State
|
@@ -40,3 +40,4 @@ export { default as AdvancedTableColumnStylingColumnHeaders } from './_advanced_
|
|
40
40
|
export { default as AdvancedTableInfiniteScroll} from './_advanced_table_infinite_scroll.jsx'
|
41
41
|
export {default as AdvancedTableWithCustomHeader} from './_advanced_table_with_custom_header.jsx'
|
42
42
|
export { default as AdvancedTableCustomSort } from './_advanced_table_custom_sort.jsx'
|
43
|
+
export { default as AdvancedTableWithCustomHeaderMultiHeader } from './_advanced_table_with_custom_header_multi_header.jsx'
|
@@ -314,12 +314,16 @@ export default class PbAdvancedTable extends PbEnhancedElement {
|
|
314
314
|
"tr.is-visible, tr:not(.toggle-content)"
|
315
315
|
);
|
316
316
|
|
317
|
-
visibleRows.forEach((row) =>
|
317
|
+
visibleRows.forEach((row) => {
|
318
|
+
row.classList.remove("last-visible-row");
|
319
|
+
row.classList.remove("last-row-cell");
|
320
|
+
});
|
318
321
|
|
319
322
|
const lastVisibleRow = visibleRows[visibleRows.length - 1];
|
320
323
|
|
321
324
|
if (lastVisibleRow) {
|
322
325
|
lastVisibleRow.classList.add("last-visible-row");
|
326
|
+
lastVisibleRow.classList.add("last-row-cell");
|
323
327
|
}
|
324
328
|
}
|
325
329
|
}
|
@@ -79,8 +79,14 @@
|
|
79
79
|
left: 0;
|
80
80
|
border-radius: unset;
|
81
81
|
z-index: 5;
|
82
|
-
}
|
83
82
|
|
83
|
+
// Add proper border radius when action bar is visible
|
84
|
+
&.is-visible,
|
85
|
+
&.show-action-card {
|
86
|
+
border-top-left-radius: 4px !important;
|
87
|
+
border-top-right-radius: 4px !important;
|
88
|
+
}
|
89
|
+
}
|
84
90
|
.checkbox-cell {
|
85
91
|
display: table-cell !important;
|
86
92
|
}
|
@@ -39,11 +39,11 @@
|
|
39
39
|
style="color: <%= button_color %>"
|
40
40
|
>
|
41
41
|
<%= pb_rails("icon", props: { id: "advanced-table_open_icon", icon: "circle-play", cursor: "pointer" }) %>
|
42
|
-
<%= pb_rails("icon", props: { id: "advanced-table_close_icon", icon: "circle-play
|
42
|
+
<%= pb_rails("icon", props: { id: "advanced-table_close_icon", icon: "circle-play", cursor: "pointer", rotation: 90 }) %>
|
43
43
|
</button>
|
44
44
|
<% end %>
|
45
45
|
<% end %>
|
46
|
-
<%= pb_rails("flex/flex_item") do %>
|
46
|
+
<%= pb_rails("flex/flex_item") do %>
|
47
47
|
<% if column[:custom_renderer].present? %>
|
48
48
|
<%= raw(column[:custom_renderer].call(object.row, custom_renderer_value(column, index))) %>
|
49
49
|
<% elsif index.zero? %>
|
@@ -6,6 +6,8 @@ module Playbook
|
|
6
6
|
prop :error, type: Playbook::Props::Boolean, default: false
|
7
7
|
prop :checked, type: Playbook::Props::Boolean, default: false
|
8
8
|
prop :indeterminate_main, type: Playbook::Props::Boolean, default: false
|
9
|
+
prop :indeterminate_main_labels, type: Playbook::Props::Array,
|
10
|
+
default: []
|
9
11
|
prop :indeterminate_parent
|
10
12
|
prop :text
|
11
13
|
prop :value
|
@@ -49,10 +51,19 @@ module Playbook
|
|
49
51
|
end
|
50
52
|
|
51
53
|
def data
|
52
|
-
Hash(prop(:data)).merge(
|
54
|
+
base_data = Hash(prop(:data)).merge(
|
53
55
|
pb_checkbox_indeterminate_main: indeterminate_main,
|
54
56
|
pb_checkbox_indeterminate_parent: indeterminate_parent
|
55
57
|
)
|
58
|
+
|
59
|
+
if indeterminate_main && indeterminate_main_labels.size == 2
|
60
|
+
base_data.merge!(
|
61
|
+
pb_checkbox_indeterminate_main_label_check: indeterminate_main_labels[0],
|
62
|
+
pb_checkbox_indeterminate_main_label_uncheck: indeterminate_main_labels[1]
|
63
|
+
)
|
64
|
+
end
|
65
|
+
|
66
|
+
base_data
|
56
67
|
end
|
57
68
|
|
58
69
|
private
|
@@ -9,10 +9,10 @@
|
|
9
9
|
<tr>
|
10
10
|
<th>
|
11
11
|
<%= pb_rails("checkbox", props: {
|
12
|
-
text: "Uncheck All",
|
13
12
|
value: "checkbox-value",
|
14
13
|
name: "main-checkbox",
|
15
14
|
indeterminate_main: true,
|
15
|
+
indeterminate_main_labels: ["Check All Ice Cream", "Uncheck All Ice Cream"],
|
16
16
|
id: "indeterminate-checkbox"
|
17
17
|
}) %>
|
18
18
|
</th>
|
@@ -1 +1,2 @@
|
|
1
|
-
If you want to use indeterminate, "check/uncheck all" checkboxes, add `indeterminate_main: true` and an `id` to the main checkbox. Then, add an `indeterminate_parent` prop with the main checkbox's `id` to the children checkboxes.
|
1
|
+
If you want to use indeterminate, "check/uncheck all" checkboxes, add `indeterminate_main: true` and an `id` to the main checkbox. Then, add an `indeterminate_parent` prop with the main checkbox's `id` to the children checkboxes.
|
2
|
+
If you want to customize the main checkbox labels, set an array `indeterminate_main_labels` with "Check All" and "Uncheck All" labels.
|
@@ -23,7 +23,9 @@ export default class PbCheckbox extends PbEnhancedElement {
|
|
23
23
|
mainCheckbox.checked = checkedCount > 0;
|
24
24
|
|
25
25
|
// Determine the main checkbox label based on the number of checked checkboxes
|
26
|
-
const
|
26
|
+
const checkAllLabel = mainCheckboxWrapper.dataset.pbCheckboxIndeterminateMainLabelCheck ?? 'Check All'
|
27
|
+
const uncheckAllLabel = mainCheckboxWrapper.dataset.pbCheckboxIndeterminateMainLabelUncheck ?? 'Uncheck All'
|
28
|
+
const text = checkedCount === 0 ? checkAllLabel : uncheckAllLabel;
|
27
29
|
|
28
30
|
// Determine the icon class to add and remove based on the number of checked checkboxes
|
29
31
|
const iconClassToAdd = checkedCount === 0 ? 'pb_checkbox_checkmark' : 'pb_checkbox_indeterminate';
|