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.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/CustomCell.tsx +7 -6
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +10 -10
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +0 -1
  5. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +2 -2
  6. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +255 -3
  7. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +9 -6
  8. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +1 -1
  9. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +14 -2
  10. data/app/pb_kits/playbook/pb_advanced_table/advanced_table_action_bar.js +16 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pinned_rows.jsx +1 -1
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling.html.erb +46 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling_rails.md +7 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header.md +1 -1
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_multi_header.jsx +107 -0
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_multi_header.md +1 -0
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_rails.html.erb +51 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_rails.md +1 -0
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +3 -0
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +1 -0
  21. data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +89 -24
  22. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +3 -1
  23. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +5 -1
  24. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +36 -0
  25. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +13 -4
  26. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +2 -0
  27. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_legend_position.md +1 -1
  28. data/app/pb_kits/playbook/pb_checkbox/checkbox.rb +12 -1
  29. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_indeterminate.html.erb +1 -1
  30. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_indeterminate_rails.md +2 -1
  31. data/app/pb_kits/playbook/pb_checkbox/index.js +3 -1
  32. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_legend_position.md +1 -1
  33. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +17 -1
  34. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +6 -0
  35. data/app/pb_kits/playbook/pb_dropdown/_dropdown_mixin.scss +36 -0
  36. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_active_style_options.jsx +90 -0
  37. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_active_style_options_react.md +4 -0
  38. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options.jsx +1 -0
  39. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options_react.md +1 -1
  40. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +3 -2
  41. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +2 -1
  42. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +24 -0
  43. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +11 -1
  44. data/app/pb_kits/playbook/pb_gauge/docs/_description.md +1 -0
  45. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_colors.jsx +32 -15
  46. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_colors_react.md +2 -0
  47. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_complex.jsx +35 -9
  48. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_complex_react.md +1 -0
  49. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_default.jsx +26 -14
  50. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_disable_animation.jsx +32 -15
  51. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_full_circle.jsx +45 -17
  52. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_height.jsx +59 -22
  53. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_live_data.jsx +40 -9
  54. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_min_max.jsx +50 -18
  55. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_sizing.jsx +31 -18
  56. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_title.jsx +34 -17
  57. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_units.jsx +64 -23
  58. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_units_react.md +1 -0
  59. data/app/pb_kits/playbook/pb_gauge/docs/example.yml +0 -1
  60. data/app/pb_kits/playbook/pb_gauge/docs/index.js +0 -1
  61. data/app/pb_kits/playbook/pb_gauge/gaugeTheme.ts +7 -1
  62. data/app/pb_kits/playbook/pb_line_graph/docs/_description.md +1 -3
  63. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_colors.jsx +36 -17
  64. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_colors_react.md +3 -0
  65. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_default.jsx +31 -16
  66. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_height.jsx +63 -31
  67. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_height.md +3 -0
  68. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend.jsx +35 -16
  69. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend_nonclickable.jsx +41 -16
  70. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend_position.jsx +107 -62
  71. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend_position.md +4 -7
  72. data/app/pb_kits/playbook/pb_line_graph/docs/example.yml +0 -1
  73. data/app/pb_kits/playbook/pb_line_graph/docs/index.js +0 -1
  74. data/app/pb_kits/playbook/pb_line_graph/lineGraphTheme.ts +16 -1
  75. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +3 -0
  76. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_strict_mode.html.erb +10 -0
  77. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_strict_mode.jsx +26 -0
  78. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_strict_mode.md +3 -0
  79. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +2 -0
  80. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +1 -0
  81. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +3 -0
  82. data/app/pb_kits/playbook/pb_select/select.rb +4 -2
  83. data/app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.html.erb +1 -0
  84. data/dist/chunks/_line_graph-BfCo79KE.js +1 -0
  85. data/dist/chunks/_typeahead-Db4YQA5c.js +6 -0
  86. data/dist/chunks/_weekday_stacked-DknbEzxo.js +61 -0
  87. data/dist/chunks/lib-DnQyMxO1.js +29 -0
  88. data/dist/chunks/{pb_form_validation-BUOKwfvW.js → pb_form_validation-kl-4Jv4t.js} +1 -1
  89. data/dist/chunks/vendor.js +1 -1
  90. data/dist/menu.yml +1 -1
  91. data/dist/playbook-doc.js +1 -1
  92. data/dist/playbook-rails-react-bindings.js +1 -1
  93. data/dist/playbook-rails.js +1 -1
  94. data/dist/playbook.css +1 -1
  95. data/lib/playbook/version.rb +1 -1
  96. metadata +29 -15
  97. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_pb_styles.jsx +0 -30
  98. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_pb_styles.md +0 -1
  99. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_pb_styles.jsx +0 -52
  100. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_pb_styles.md +0 -1
  101. data/dist/chunks/_circle_chart-BZmlhBs2.js +0 -1
  102. data/dist/chunks/_typeahead-B1tu_vWi.js +0 -22
  103. data/dist/chunks/_weekday_stacked-CKk0dR5s.js +0 -45
  104. data/dist/chunks/lib-DYpq0k8j.js +0 -29
  105. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_row_styling.md → _advanced_table_row_styling_react.md} +0 -0
  106. /data/app/pb_kits/playbook/pb_gauge/docs/{_gauge_colors.md → _gauge_colors_rails.md} +0 -0
  107. /data/app/pb_kits/playbook/pb_gauge/docs/{_gauge_complex.md → _gauge_complex_rails.md} +0 -0
  108. /data/app/pb_kits/playbook/pb_line_graph/docs/{_line_graph_colors.md → _line_graph_colors_rails.md} +0 -0
@@ -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;
@@ -0,0 +1 @@
1
+ The optional `header` key/value pair within `columnDefinitions` can also be used with multi headers as seen here.
@@ -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
- tbody
14
- tr
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
- tbody
21
- tr
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
- .bg-silver {
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
- td:first-child,
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
- td:first-child,
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 td:first-child {
64
- background-color: $bg-secondary;
113
+ &.bg-silver {
114
+ &.pinned-row td:first-child {
115
+ background-color: $bg-secondary;
116
+ }
65
117
  }
66
- &.bg-white td:first-child {
67
- background-color: $bg-main;
118
+ &.bg-white {
119
+ &.pinned-row td:first-child {
120
+ background-color: $bg-main;
121
+ }
68
122
  }
69
- &.bg-row-selection td:first-child {
70
- background-color: $highlight;
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 td:first-child {
109
- background-color: $highlight-dark;
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|
@@ -26,7 +26,11 @@
26
26
  <% end %>
27
27
  <% end %>
28
28
  <% end %>
29
- <%= cell[:label] %>
29
+ <% if object.has_header_renderer?(cell) %>
30
+ <%= raw(object.render_header(cell)) %>
31
+ <% else %>
32
+ <%= cell[:label] %>
33
+ <% end %>
30
34
  <% end %>
31
35
  <% end %>
32
36
  <% end %>
@@ -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-down", cursor: "pointer" }) %>
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 middle)
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 text = checkedCount === 0 ? 'Check All' : 'Uncheck All';
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 middle)
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 !important;
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,