playbook_ui 14.23.0.pre.alpha.PLAY2303optD9000 → 14.23.0.pre.alpha.PLAY2329atstickypinnedborderbug9195
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 +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 +255 -3
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +9 -6
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +14 -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_pinned_rows.jsx +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling.html.erb +46 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling_rails.md +7 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header.md +1 -1
- 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/_advanced_table_with_custom_header_rails.html.erb +51 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_rails.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +3 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +89 -24
- data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +3 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +5 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +36 -0
- data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +13 -4
- data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +2 -0
- data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_legend_position.md +1 -1
- 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_circle_chart/docs/_circle_chart_legend_position.md +1 -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_gauge/docs/_description.md +1 -0
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_colors.jsx +32 -15
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_colors_react.md +2 -0
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_complex.jsx +35 -9
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_complex_react.md +1 -0
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_default.jsx +26 -14
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_disable_animation.jsx +32 -15
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_full_circle.jsx +45 -17
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_height.jsx +59 -22
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_live_data.jsx +40 -9
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_min_max.jsx +50 -18
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_sizing.jsx +31 -18
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_title.jsx +34 -17
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_units.jsx +64 -23
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_units_react.md +1 -0
- data/app/pb_kits/playbook/pb_gauge/docs/example.yml +0 -1
- data/app/pb_kits/playbook/pb_gauge/docs/index.js +0 -1
- data/app/pb_kits/playbook/pb_gauge/gaugeTheme.ts +7 -1
- data/app/pb_kits/playbook/pb_line_graph/docs/_description.md +1 -3
- data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_colors.jsx +36 -17
- data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_colors_react.md +3 -0
- data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_default.jsx +31 -16
- data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_height.jsx +63 -31
- data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_height.md +3 -0
- data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend.jsx +35 -16
- data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend_nonclickable.jsx +41 -16
- data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend_position.jsx +107 -62
- data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend_position.md +4 -7
- data/app/pb_kits/playbook/pb_line_graph/docs/example.yml +0 -1
- data/app/pb_kits/playbook/pb_line_graph/docs/index.js +0 -1
- data/app/pb_kits/playbook/pb_line_graph/lineGraphTheme.ts +16 -1
- data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +3 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_strict_mode.html.erb +10 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_strict_mode.jsx +26 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_strict_mode.md +3 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +3 -0
- 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/_line_graph-BfCo79KE.js +1 -0
- data/dist/chunks/_typeahead-Db4YQA5c.js +6 -0
- data/dist/chunks/_weekday_stacked-DknbEzxo.js +61 -0
- data/dist/chunks/lib-DnQyMxO1.js +29 -0
- data/dist/chunks/{pb_form_validation-BUOKwfvW.js → pb_form_validation-kl-4Jv4t.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/menu.yml +1 -1
- data/dist/playbook-doc.js +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 +29 -15
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_pb_styles.jsx +0 -30
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_pb_styles.md +0 -1
- data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_pb_styles.jsx +0 -52
- data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_pb_styles.md +0 -1
- data/dist/chunks/_circle_chart-BZmlhBs2.js +0 -1
- data/dist/chunks/_typeahead-B1tu_vWi.js +0 -22
- data/dist/chunks/_weekday_stacked-CKk0dR5s.js +0 -45
- data/dist/chunks/lib-DYpq0k8j.js +0 -29
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_row_styling.md → _advanced_table_row_styling_react.md} +0 -0
- /data/app/pb_kits/playbook/pb_gauge/docs/{_gauge_colors.md → _gauge_colors_rails.md} +0 -0
- /data/app/pb_kits/playbook/pb_gauge/docs/{_gauge_complex.md → _gauge_complex_rails.md} +0 -0
- /data/app/pb_kits/playbook/pb_line_graph/docs/{_line_graph_colors.md → _line_graph_colors_rails.md} +0 -0
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.
|
data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_rails.html.erb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
<%
|
2
|
+
column_definitions = [
|
3
|
+
{
|
4
|
+
accessor: "year",
|
5
|
+
label: "Year",
|
6
|
+
cellAccessors: ["quarter", "month", "day"],
|
7
|
+
},
|
8
|
+
{
|
9
|
+
accessor: "newEnrollments",
|
10
|
+
label: "New Enrollments",
|
11
|
+
header: ->(cell, label) {
|
12
|
+
capture do
|
13
|
+
pb_rails("flex", props: { align_items: "center", justify_content: "center" }) do
|
14
|
+
pb_rails("caption", props: { margin_right: "xs", text: "New Enrollments" }) +
|
15
|
+
pb_rails("icon", props: { id: "tooltip-interact", icon: "info", size: "xs" }) +
|
16
|
+
pb_rails("tooltip", props: {
|
17
|
+
trigger_element_id: "tooltip-interact",
|
18
|
+
tooltip_id: "example-custom-tooltip",
|
19
|
+
position: "top",
|
20
|
+
z_index: "10"
|
21
|
+
}) do
|
22
|
+
"Whoa. I'm a Tooltip"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
}
|
27
|
+
},
|
28
|
+
{
|
29
|
+
accessor: "scheduledMeetings",
|
30
|
+
label: "Scheduled Meetings",
|
31
|
+
},
|
32
|
+
{
|
33
|
+
accessor: "attendanceRate",
|
34
|
+
label: "Attendance Rate",
|
35
|
+
},
|
36
|
+
{
|
37
|
+
accessor: "completedClasses",
|
38
|
+
label: "Completed Classes",
|
39
|
+
},
|
40
|
+
{
|
41
|
+
accessor: "classCompletionRate",
|
42
|
+
label: "Class Completion Rate",
|
43
|
+
},
|
44
|
+
{
|
45
|
+
accessor: "graduatedStudents",
|
46
|
+
label: "Graduated Students",
|
47
|
+
}
|
48
|
+
]
|
49
|
+
%>
|
50
|
+
|
51
|
+
<%= pb_rails("advanced_table", props: { id: "custom_header_table", table_data: @table_data, column_definitions: column_definitions }) %>
|
@@ -0,0 +1 @@
|
|
1
|
+
The optional `header` item can be used within `column_definitions` to render a custom header. This example shows an Icon and Tooltip being used but other kits can be used as well.
|
@@ -10,6 +10,7 @@ examples:
|
|
10
10
|
- advanced_table_beta_sort: Enable Sorting
|
11
11
|
- advanced_table_responsive: Responsive Tables
|
12
12
|
- advanced_table_custom_cell_rails: Custom Components for Cells
|
13
|
+
- advanced_table_with_custom_header_rails: Custom Header Cell
|
13
14
|
- advanced_table_column_headers: Multi-Header Columns
|
14
15
|
- advanced_table_column_headers_multiple: Multi-Header Columns (Multiple Levels)
|
15
16
|
- advanced_table_no_subrows: Table with No Subrows or Expansion
|
@@ -18,6 +19,7 @@ examples:
|
|
18
19
|
- advanced_table_selectable_rows_actions_rails: Selectable Rows (With Actions)
|
19
20
|
- advanced_table_selectable_rows_header_rails: Selectable Rows (No Actions Bar)
|
20
21
|
- advanced_table_scrollbar_none: Advanced Table Scrollbar None
|
22
|
+
- advanced_table_row_styling: Row Styling
|
21
23
|
- advanced_table_column_styling_rails: Column Styling
|
22
24
|
- advanced_table_column_styling_column_headers_rails: Column Styling with Multiple Headers
|
23
25
|
- advanced_table_column_border_color_rails: Column Group Border Color
|
@@ -41,6 +43,7 @@ examples:
|
|
41
43
|
- advanced_table_responsive: Responsive Tables
|
42
44
|
- advanced_table_custom_cell: Custom Components for Cells
|
43
45
|
- advanced_table_with_custom_header: Custom Header Cell
|
46
|
+
- advanced_table_with_custom_header_multi_header: Custom Header with Multiple Headers
|
44
47
|
- advanced_table_pagination: Pagination
|
45
48
|
- advanced_table_pagination_with_props: Pagination Props
|
46
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'
|
@@ -8,27 +8,31 @@
|
|
8
8
|
border-radius: 4px;
|
9
9
|
box-shadow: 1px 0 0 0px $border-color, -1px 0 0 0px $border-color;
|
10
10
|
display: block;
|
11
|
+
|
12
|
+
// Handle both table-card and non-table-card cases
|
11
13
|
[class^="pb_table"].table-sm.table-card thead tr th:first-child,
|
12
|
-
[class^="pb_table"].table-sm:not(.no-hover).table-card
|
13
|
-
|
14
|
-
|
15
|
-
td:first-child {
|
14
|
+
[class^="pb_table"].table-sm:not(.no-hover).table-card tbody tr td:first-child,
|
15
|
+
[class^="pb_table"].table-sm:not(.table-card) thead tr th:first-child,
|
16
|
+
[class^="pb_table"].table-sm:not(.no-hover):not(.table-card) tbody tr td:first-child {
|
16
17
|
border-left-width: 0px !important;
|
17
18
|
}
|
19
|
+
|
18
20
|
[class^="pb_table"].table-sm.table-card thead tr th:last-child,
|
19
|
-
[class^="pb_table"].table-sm:not(.no-hover).table-card
|
20
|
-
|
21
|
-
|
22
|
-
td:last-child {
|
21
|
+
[class^="pb_table"].table-sm:not(.no-hover).table-card tbody tr td:last-child,
|
22
|
+
[class^="pb_table"].table-sm:not(.table-card) thead tr th:last-child,
|
23
|
+
[class^="pb_table"].table-sm:not(.no-hover):not(.table-card) tbody tr td:last-child {
|
23
24
|
border-right-width: 0px;
|
24
25
|
}
|
26
|
+
|
25
27
|
[class^="pb_table"].table-sm.table-card tbody tr:last-child td:first-child,
|
26
|
-
[class^="pb_table"].table-sm.table-card tbody tr:last-child td:last-child
|
28
|
+
[class^="pb_table"].table-sm.table-card tbody tr:last-child td:last-child,
|
29
|
+
[class^="pb_table"].table-sm:not(.table-card) tbody tr:last-child td:first-child,
|
30
|
+
[class^="pb_table"].table-sm:not(.table-card) tbody tr:last-child td:last-child {
|
27
31
|
border-radius: 0 0 0 0;
|
28
32
|
}
|
33
|
+
|
34
|
+
// Only apply sticky positioning to specific elements
|
29
35
|
.table-header-cells:first-child,
|
30
|
-
td:first-child,
|
31
|
-
.pb_table_td:first-child,
|
32
36
|
.checkbox-cell.checkbox-cell-header:first-child,
|
33
37
|
.table-header-cells.sticky-left,
|
34
38
|
[class*="pinned-left"] {
|
@@ -39,35 +43,87 @@
|
|
39
43
|
z-index: 2;
|
40
44
|
}
|
41
45
|
|
42
|
-
|
46
|
+
// Only apply to pinned rows
|
47
|
+
.pinned-row {
|
43
48
|
td:first-child,
|
49
|
+
.pb_table_td:first-child {
|
50
|
+
background-color: $bg-main;
|
51
|
+
box-shadow: $shadow_deep !important;
|
52
|
+
position: sticky !important;
|
53
|
+
left: 0;
|
54
|
+
z-index: 3; // Higher z-index for pinned rows
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
// For tables with verticalBorder, ensure sticky elements maintain their borders
|
59
|
+
[class^="pb_table"].vertical-border {
|
60
|
+
.table-header-cells:first-child,
|
61
|
+
.checkbox-cell.checkbox-cell-header:first-child,
|
62
|
+
.table-header-cells.sticky-left {
|
63
|
+
// Maintain right border for vertical border styling when sticky
|
64
|
+
&:not(:last-child) {
|
65
|
+
border-right: 1px solid $border-color !important;
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
// Ensure pinned rows maintain vertical borders
|
70
|
+
.pinned-row {
|
71
|
+
td:not(:last-child),
|
72
|
+
.pb_table_td:not(:last-child) {
|
73
|
+
border-right: 1px solid $border-color !important;
|
74
|
+
}
|
75
|
+
}
|
76
|
+
|
77
|
+
// Handle sticky header with vertical borders
|
78
|
+
&.sticky-header thead th {
|
79
|
+
&:not(:last-child) {
|
80
|
+
border-right: 1px solid $border-color !important;
|
81
|
+
}
|
82
|
+
}
|
83
|
+
}
|
84
|
+
|
85
|
+
.bg-silver {
|
86
|
+
.table-header-cells:first-child,
|
87
|
+
.pinned-row td:first-child,
|
88
|
+
.pinned-row .pb_table_td:first-child,
|
44
89
|
.sticky-left {
|
45
90
|
background-color: $bg-secondary;
|
46
91
|
}
|
47
92
|
}
|
93
|
+
|
48
94
|
.bg-row-selection {
|
49
|
-
|
95
|
+
.table-header-cells:first-child,
|
96
|
+
.pinned-row td:first-child,
|
97
|
+
.pinned-row .pb_table_td:first-child,
|
50
98
|
.sticky-left {
|
51
99
|
background-color: $highlight;
|
52
100
|
}
|
53
101
|
}
|
54
102
|
|
55
103
|
.bg-white {
|
56
|
-
|
104
|
+
.table-header-cells:first-child,
|
105
|
+
.pinned-row td:first-child,
|
106
|
+
.pinned-row .pb_table_td:first-child,
|
57
107
|
.sticky-left {
|
58
108
|
background-color: $bg-main;
|
59
109
|
}
|
60
110
|
}
|
61
111
|
|
62
112
|
.virtualized-table-row {
|
63
|
-
&.bg-silver
|
64
|
-
|
113
|
+
&.bg-silver {
|
114
|
+
&.pinned-row td:first-child {
|
115
|
+
background-color: $bg-secondary;
|
116
|
+
}
|
65
117
|
}
|
66
|
-
&.bg-white
|
67
|
-
|
118
|
+
&.bg-white {
|
119
|
+
&.pinned-row td:first-child {
|
120
|
+
background-color: $bg-main;
|
121
|
+
}
|
68
122
|
}
|
69
|
-
&.bg-row-selection
|
70
|
-
|
123
|
+
&.bg-row-selection {
|
124
|
+
&.pinned-row td:first-child {
|
125
|
+
background-color: $highlight;
|
126
|
+
}
|
71
127
|
}
|
72
128
|
}
|
73
129
|
|
@@ -79,8 +135,14 @@
|
|
79
135
|
left: 0;
|
80
136
|
border-radius: unset;
|
81
137
|
z-index: 5;
|
82
|
-
}
|
83
138
|
|
139
|
+
// Add proper border radius when action bar is visible
|
140
|
+
&.is-visible,
|
141
|
+
&.show-action-card {
|
142
|
+
border-top-left-radius: 4px !important;
|
143
|
+
border-top-right-radius: 4px !important;
|
144
|
+
}
|
145
|
+
}
|
84
146
|
.checkbox-cell {
|
85
147
|
display: table-cell !important;
|
86
148
|
}
|
@@ -99,14 +161,17 @@
|
|
99
161
|
|
100
162
|
&.dark {
|
101
163
|
.bg-row-selection {
|
102
|
-
td:first-child,
|
164
|
+
.pinned-row td:first-child,
|
165
|
+
.pinned-row .pb_table_td:first-child,
|
103
166
|
.sticky-left {
|
104
167
|
background-color: $highlight-dark;
|
105
168
|
}
|
106
169
|
}
|
107
170
|
.virtualized-table-row {
|
108
|
-
&.bg-row-selection
|
109
|
-
|
171
|
+
&.bg-row-selection {
|
172
|
+
&.pinned-row td:first-child {
|
173
|
+
background-color: $highlight-dark;
|
174
|
+
}
|
110
175
|
}
|
111
176
|
}
|
112
177
|
}
|
@@ -23,6 +23,8 @@ module Playbook
|
|
23
23
|
default: "scroll"
|
24
24
|
prop :selectable_rows, type: Playbook::Props::Boolean,
|
25
25
|
default: false
|
26
|
+
prop :row_styling, type: Playbook::Props::Array,
|
27
|
+
default: []
|
26
28
|
|
27
29
|
def flatten_columns(columns)
|
28
30
|
columns.flat_map do |col|
|
@@ -66,7 +68,7 @@ module Playbook
|
|
66
68
|
end
|
67
69
|
|
68
70
|
# Additional class and data attributes needed for toggle logic
|
69
|
-
output << pb_rails("advanced_table/table_row", props: { id: id, row: row, column_definitions: leaf_columns, depth: current_depth, collapsible_trail: collapsible_trail, classname: additional_classes, table_data_attributes: current_data_attributes, responsive: responsive, loading: loading, selectable_rows: selectable_rows, row_id: row[:id], enable_toggle_expansion: enable_toggle_expansion })
|
71
|
+
output << pb_rails("advanced_table/table_row", props: { id: id, row: row, column_definitions: leaf_columns, depth: current_depth, collapsible_trail: collapsible_trail, classname: additional_classes, table_data_attributes: current_data_attributes, responsive: responsive, loading: loading, selectable_rows: selectable_rows, row_id: row[:id], enable_toggle_expansion: enable_toggle_expansion, row_styling: row_styling })
|
70
72
|
|
71
73
|
if row[:children].present?
|
72
74
|
row[:children].each do |child_row|
|
@@ -76,6 +76,30 @@ module Playbook
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
+
# Get original column definition for custom rendering
|
80
|
+
def find_original_column_def(accessor)
|
81
|
+
find_column_def_by_accessor(column_definitions, accessor)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Check if a header cell has a custom renderer
|
85
|
+
def has_header_renderer?(cell)
|
86
|
+
return false unless cell[:accessor].present?
|
87
|
+
|
88
|
+
original_def = find_original_column_def(cell[:accessor])
|
89
|
+
original_def && original_def[:header].present?
|
90
|
+
end
|
91
|
+
|
92
|
+
# Render custom header content
|
93
|
+
def render_header(cell)
|
94
|
+
return cell[:label] unless has_header_renderer?(cell)
|
95
|
+
|
96
|
+
original_def = find_original_column_def(cell[:accessor])
|
97
|
+
custom_renderer = original_def[:header]
|
98
|
+
|
99
|
+
# Call the custom renderer with the cell data and label
|
100
|
+
custom_renderer.call(cell, cell[:label])
|
101
|
+
end
|
102
|
+
|
79
103
|
private
|
80
104
|
|
81
105
|
def compute_max_depth(columns)
|
@@ -148,6 +172,18 @@ module Playbook
|
|
148
172
|
end
|
149
173
|
wrapped
|
150
174
|
end
|
175
|
+
|
176
|
+
def find_column_def_by_accessor(defs, target_accessor)
|
177
|
+
defs.each do |col|
|
178
|
+
return col if col[:accessor] == target_accessor
|
179
|
+
|
180
|
+
if col[:columns].is_a?(Array)
|
181
|
+
found = find_column_def_by_accessor(col[:columns], target_accessor)
|
182
|
+
return found if found
|
183
|
+
end
|
184
|
+
end
|
185
|
+
nil
|
186
|
+
end
|
151
187
|
end
|
152
188
|
end
|
153
189
|
end
|
@@ -1,3 +1,10 @@
|
|
1
|
+
<%
|
2
|
+
row_style = object.row_styling.find { |style| style[:row_id].to_s == object.row_id.to_s }
|
3
|
+
button_color = row_style&.[](:expand_button_color)
|
4
|
+
bg_color = row_style&.[](:background_color)
|
5
|
+
font_color = row_style&.[](:font_color)
|
6
|
+
%>
|
7
|
+
|
1
8
|
<%= pb_content_tag(:tr) do %>
|
2
9
|
<% has_separate_checkbox = object.selectable_rows && object.enable_toggle_expansion == "none" %>
|
3
10
|
<% if has_separate_checkbox %>
|
@@ -5,7 +12,7 @@
|
|
5
12
|
<% end %>
|
6
13
|
<% object.column_definitions.each_with_index do |column, index| %>
|
7
14
|
<% next unless column[:accessor].present? %>
|
8
|
-
<%= pb_rails("table/table_cell", props: { classname:object.td_classname(column, index)}) do %>
|
15
|
+
<%= pb_rails("table/table_cell", props: { html_options: { style: { "background-color": bg_color, color: font_color } }, classname:object.td_classname(column, index)}) do %>
|
9
16
|
<%= pb_rails("flex", props:{ align: "center", justify: object.justify_for(column, index), classname: object.loading ? "loading-cell" : "" }) do %>
|
10
17
|
<% if collapsible_trail && index.zero? %>
|
11
18
|
<% (1..depth).each do |i| %>
|
@@ -28,13 +35,15 @@
|
|
28
35
|
<button
|
29
36
|
id="<%= "#{object.id}_#{object.row.object_id}" %>"
|
30
37
|
class="gray-icon expand-toggle-icon"
|
31
|
-
data-advanced-table="true"
|
38
|
+
data-advanced-table="true"
|
39
|
+
style="color: <%= button_color %>"
|
40
|
+
>
|
32
41
|
<%= pb_rails("icon", props: { id: "advanced-table_open_icon", icon: "circle-play", cursor: "pointer" }) %>
|
33
|
-
<%= 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 }) %>
|
34
43
|
</button>
|
35
44
|
<% end %>
|
36
45
|
<% end %>
|
37
|
-
<%= pb_rails("flex/flex_item") do %>
|
46
|
+
<%= pb_rails("flex/flex_item") do %>
|
38
47
|
<% if column[:custom_renderer].present? %>
|
39
48
|
<%= raw(column[:custom_renderer].call(object.row, custom_renderer_value(column, index))) %>
|
40
49
|
<% elsif index.zero? %>
|
@@ -27,6 +27,8 @@ module Playbook
|
|
27
27
|
prop :enable_toggle_expansion, type: Playbook::Props::Enum,
|
28
28
|
values: %w[all header none],
|
29
29
|
default: "header"
|
30
|
+
prop :row_styling, type: Playbook::Props::Array,
|
31
|
+
default: []
|
30
32
|
|
31
33
|
def data
|
32
34
|
Hash(prop(:data)).merge(table_data_attributes)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
##### Prop
|
2
2
|
|
3
3
|
`align` **Type**: String | **Values**: left | center | right (defaults to center)
|
4
|
-
`verticalAlign` **Type**: String | **Values**: top | middle | bottom (defaults
|
4
|
+
`verticalAlign` **Type**: String | **Values**: top | middle | bottom (defaults to bottom)
|
5
5
|
`layout` **Type**: String | **Values**: horizontal | vertical | proximate (defaults to horizontal)
|
6
6
|
`x` **Type**: Number (defaults to 0)
|
7
7
|
`y` **Type**: Number (defaults to 0)
|
@@ -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';
|
@@ -1,7 +1,7 @@
|
|
1
1
|
##### Prop
|
2
2
|
|
3
3
|
`align` **Type**: String | **Values**: left | center | right (defaults to center)
|
4
|
-
`verticalAlign` **Type**: String | **Values**: top | middle | bottom (defaults
|
4
|
+
`verticalAlign` **Type**: String | **Values**: top | middle | bottom (defaults to bottom)
|
5
5
|
`layout` **Type**: String | **Values**: horizontal | vertical | proximate (defaults to horizontal)
|
6
6
|
`x` **Type**: Number (defaults to 0)
|
7
7
|
`y` **Type**: Number (defaults to 0)
|
@@ -8,6 +8,7 @@
|
|
8
8
|
@import "../pb_textarea/textarea_mixin";
|
9
9
|
|
10
10
|
@import "./scss_partials/dropdown_animation";
|
11
|
+
@import "dropdown_mixin";
|
11
12
|
|
12
13
|
[class*="pb_dropdown"] {
|
13
14
|
.dropdown_wrapper {
|
@@ -98,9 +99,23 @@
|
|
98
99
|
[class^="pb_title_kit"], a {
|
99
100
|
color: $white !important;
|
100
101
|
}
|
102
|
+
border-bottom: 1px solid $border_light;
|
101
103
|
&:hover {
|
102
|
-
background-color: $product_1_background
|
104
|
+
background-color: $product_1_background;
|
105
|
+
}
|
106
|
+
|
107
|
+
// activeStyle font color map
|
108
|
+
@each $name, $color in $font-colors {
|
109
|
+
&.font-#{$name} {
|
110
|
+
@include apply-font-color($color);
|
111
|
+
}
|
103
112
|
}
|
113
|
+
// activeStyle background color map (no difference between selected and selected+hover custom colors)
|
114
|
+
@each $name, $bg in $background-colors {
|
115
|
+
&.bg-#{$name} {
|
116
|
+
background-color: $bg;
|
117
|
+
}
|
118
|
+
}
|
104
119
|
}
|
105
120
|
}
|
106
121
|
|
@@ -267,6 +282,7 @@
|
|
267
282
|
}
|
268
283
|
&[class*="selected"] {
|
269
284
|
background-color: $primary;
|
285
|
+
border-bottom: rgba($white, 0.15);
|
270
286
|
}
|
271
287
|
}
|
272
288
|
}
|
@@ -39,6 +39,10 @@ type DropdownProps = {
|
|
39
39
|
options: GenericObject;
|
40
40
|
separators?: boolean;
|
41
41
|
variant?: "default" | "subtle";
|
42
|
+
activeStyle?: {
|
43
|
+
backgroundColor?: string;
|
44
|
+
fontColor?: string;
|
45
|
+
};
|
42
46
|
};
|
43
47
|
|
44
48
|
interface DropdownComponent
|
@@ -69,6 +73,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
69
73
|
options,
|
70
74
|
separators = true,
|
71
75
|
variant = "default",
|
76
|
+
activeStyle,
|
72
77
|
} = props;
|
73
78
|
|
74
79
|
const ariaProps = buildAriaProps(aria);
|
@@ -251,6 +256,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
251
256
|
>
|
252
257
|
<DropdownContext.Provider
|
253
258
|
value={{
|
259
|
+
activeStyle,
|
254
260
|
autocomplete,
|
255
261
|
dropdownContainerRef,
|
256
262
|
filteredOptions,
|