playbook_ui 14.22.0.pre.rc.7 → 14.23.0.pre.alpha.PLAY1985renderpaginationonlywithpages9148

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 (168) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/SubRowHeaderRow.tsx +32 -11
  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 +3 -3
  6. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +72 -3
  7. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +15 -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_custom_sort.jsx +65 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_custom_sort.md +5 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling.html.erb +46 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling_rails.md +7 -0
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header.jsx +69 -0
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header.md +1 -0
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_multi_header.jsx +107 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_multi_header.md +1 -0
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_rails.html.erb +51 -0
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_rails.md +1 -0
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +14 -8
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +3 -0
  23. data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +23 -2
  24. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +3 -1
  25. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +5 -1
  26. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +36 -0
  27. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +11 -2
  28. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +2 -0
  29. data/app/pb_kits/playbook/pb_badge/_badge.scss +5 -6
  30. data/app/pb_kits/playbook/pb_bar_graph/barGraphTheme.ts +106 -0
  31. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_colors.jsx +33 -15
  32. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_default.jsx +33 -15
  33. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_height.jsx +52 -22
  34. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_height.md +3 -0
  35. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_horizontal.jsx +12 -16
  36. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_legend.jsx +31 -15
  37. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_legend_non_clickable.jsx +39 -16
  38. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_legend_position.jsx +86 -38
  39. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_legend_position.md +1 -1
  40. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_negative_numbers.jsx +32 -15
  41. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_secondary_y_axis.jsx +72 -22
  42. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_secondary_y_axis.md +1 -1
  43. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_spline.jsx +31 -15
  44. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_stacked.jsx +37 -16
  45. data/app/pb_kits/playbook/pb_bar_graph/docs/_description.md +1 -3
  46. data/app/pb_kits/playbook/pb_bar_graph/docs/example.yml +1 -3
  47. data/app/pb_kits/playbook/pb_bar_graph/docs/index.js +0 -2
  48. data/app/pb_kits/playbook/pb_body/docs/_body_truncate.jsx +3 -3
  49. data/app/pb_kits/playbook/pb_body/docs/_body_truncate_react.md +4 -0
  50. data/app/pb_kits/playbook/pb_checkbox/checkbox.rb +12 -1
  51. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_indeterminate.html.erb +1 -1
  52. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_indeterminate_rails.md +2 -1
  53. data/app/pb_kits/playbook/pb_checkbox/index.js +3 -1
  54. data/app/pb_kits/playbook/pb_circle_chart/circleChartTheme.ts +36 -1
  55. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_block.jsx +71 -26
  56. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_colors.jsx +29 -16
  57. data/app/pb_kits/playbook/pb_circle_chart/docs/{_circle_chart_colors.md → _circle_chart_colors_rails.md} +1 -1
  58. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_colors_react.md +2 -0
  59. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_custom_tooltip.jsx +28 -16
  60. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_custom_tooltip.md +4 -2
  61. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_default.jsx +23 -15
  62. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_inner_sizes.jsx +81 -51
  63. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_legend_position.jsx +103 -75
  64. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_legend_position.md +4 -7
  65. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_live_data.jsx +19 -13
  66. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_rounded.jsx +30 -17
  67. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_with_labels.jsx +34 -20
  68. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_with_legend_kit.jsx +29 -20
  69. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_with_title.jsx +28 -20
  70. data/app/pb_kits/playbook/pb_circle_chart/docs/_description.md +1 -0
  71. data/app/pb_kits/playbook/pb_circle_chart/docs/example.yml +0 -1
  72. data/app/pb_kits/playbook/pb_circle_chart/docs/index.js +0 -1
  73. data/app/pb_kits/playbook/pb_draggable/context/index.tsx +12 -4
  74. data/app/pb_kits/playbook/pb_draggable/context/types.ts +5 -2
  75. data/app/pb_kits/playbook/pb_gauge/docs/_description.md +1 -0
  76. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_colors.jsx +32 -15
  77. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_colors_react.md +2 -0
  78. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_complex.jsx +35 -9
  79. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_complex_react.md +1 -0
  80. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_default.jsx +26 -14
  81. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_disable_animation.jsx +32 -15
  82. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_full_circle.jsx +45 -17
  83. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_height.jsx +59 -22
  84. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_live_data.jsx +40 -9
  85. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_min_max.jsx +50 -18
  86. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_sizing.jsx +31 -18
  87. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_title.jsx +34 -17
  88. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_units.jsx +64 -23
  89. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_units_react.md +1 -0
  90. data/app/pb_kits/playbook/pb_gauge/docs/example.yml +0 -1
  91. data/app/pb_kits/playbook/pb_gauge/docs/index.js +0 -1
  92. data/app/pb_kits/playbook/pb_gauge/gaugeTheme.ts +7 -1
  93. data/app/pb_kits/playbook/pb_line_graph/docs/_description.md +1 -3
  94. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_colors.jsx +36 -17
  95. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_colors_react.md +3 -0
  96. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_default.jsx +31 -16
  97. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_height.jsx +63 -31
  98. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_height.md +3 -0
  99. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend.jsx +35 -16
  100. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend_nonclickable.jsx +41 -16
  101. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend_position.jsx +107 -62
  102. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_legend_position.md +4 -7
  103. data/app/pb_kits/playbook/pb_line_graph/docs/example.yml +0 -1
  104. data/app/pb_kits/playbook/pb_line_graph/docs/index.js +0 -1
  105. data/app/pb_kits/playbook/pb_line_graph/lineGraphTheme.ts +16 -1
  106. data/app/pb_kits/playbook/pb_pagination/_pagination.tsx +4 -0
  107. data/app/pb_kits/playbook/pb_pagination/docs/_pagination_default_rails.md +3 -1
  108. data/app/pb_kits/playbook/pb_pagination/docs/_pagination_default_react.md +3 -1
  109. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +30 -17
  110. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_strict_mode.html.erb +10 -0
  111. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_strict_mode.jsx +26 -0
  112. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_strict_mode.md +3 -0
  113. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +2 -0
  114. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +1 -0
  115. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +3 -0
  116. data/app/pb_kits/playbook/pb_table/_table.tsx +4 -4
  117. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns.jsx +8 -8
  118. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns_react.md +1 -1
  119. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns.jsx +12 -12
  120. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns_react.md +3 -3
  121. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns.jsx +12 -12
  122. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns_react.md +3 -3
  123. data/app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.html.erb +1 -0
  124. data/app/pb_kits/playbook/pb_title/docs/_title_truncate.jsx +3 -3
  125. data/app/pb_kits/playbook/pb_title/docs/_title_truncate_react.md +4 -0
  126. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_click_open.html.erb +14 -0
  127. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_click_open_rails.md +1 -0
  128. data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +1 -0
  129. data/app/pb_kits/playbook/pb_tooltip/index.js +59 -36
  130. data/app/pb_kits/playbook/pb_tooltip/tooltip.rb +9 -2
  131. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.html.erb +18 -0
  132. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input_rails.md +1 -0
  133. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +1 -0
  134. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +3 -0
  135. data/dist/chunks/_line_graph-BfCo79KE.js +1 -0
  136. data/dist/chunks/_typeahead-Db4YQA5c.js +6 -0
  137. data/dist/chunks/_weekday_stacked-Byp3KKop.js +61 -0
  138. data/dist/chunks/lib-DnQyMxO1.js +29 -0
  139. data/dist/chunks/{pb_form_validation-DqRmTS8m.js → pb_form_validation-kl-4Jv4t.js} +1 -1
  140. data/dist/chunks/vendor.js +1 -1
  141. data/dist/menu.yml +68 -8
  142. data/dist/playbook-doc.js +2 -2
  143. data/dist/playbook-rails-react-bindings.js +1 -1
  144. data/dist/playbook-rails.js +1 -1
  145. data/dist/playbook.css +1 -1
  146. data/lib/playbook/version.rb +2 -2
  147. metadata +45 -25
  148. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_custom.jsx +0 -72
  149. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_custom.md +0 -6
  150. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_pb_styles.jsx +0 -64
  151. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_pb_styles.md +0 -1
  152. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_pb_styles.jsx +0 -38
  153. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_pb_styles.md +0 -1
  154. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_pb_styles.jsx +0 -30
  155. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_pb_styles.md +0 -1
  156. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_pb_styles.jsx +0 -52
  157. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_pb_styles.md +0 -1
  158. data/dist/chunks/_typeahead-B7FRYVtS.js +0 -22
  159. data/dist/chunks/_weekday_stacked-B0oaGhTW.js +0 -45
  160. data/dist/chunks/lib-Carqm8Ip.js +0 -29
  161. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_row_styling.md → _advanced_table_row_styling_react.md} +0 -0
  162. /data/app/pb_kits/playbook/pb_body/docs/{_body_truncate.md → _body_truncate_rails.md} +0 -0
  163. /data/app/pb_kits/playbook/pb_gauge/docs/{_gauge_colors.md → _gauge_colors_rails.md} +0 -0
  164. /data/app/pb_kits/playbook/pb_gauge/docs/{_gauge_complex.md → _gauge_complex_rails.md} +0 -0
  165. /data/app/pb_kits/playbook/pb_line_graph/docs/{_line_graph_colors.md → _line_graph_colors_rails.md} +0 -0
  166. /data/app/pb_kits/playbook/pb_title/docs/{_title_truncate.md → _title_truncate_rails.md} +0 -0
  167. /data/app/pb_kits/playbook/pb_tooltip/docs/{_tooltip_click_open.md → _tooltip_click_open_react.md} +0 -0
  168. /data/app/pb_kits/playbook/pb_typeahead/docs/{_typeahead_preserve_input.md → _typeahead_preserve_input_react.md} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 41c18c0c1f4ae27ccea671a7ca29e35edfdef4a22b4cfc806cc27f90e0d63814
4
- data.tar.gz: d3b75ef1e55dd2a03b84f59fd424a1cbcc2eb7814a3f26095fb9e691a2b87597
3
+ metadata.gz: 5916a3032b32d8b41936c775fb41e871ebf43ba155a6d234f0bb1058cae9613c
4
+ data.tar.gz: 7b8a5f1b60bb0f78172b99184496b42f1a5479899e426adcf8ec463849d15fc0
5
5
  SHA512:
6
- metadata.gz: '08bb1b746b94d9a8df7bb6a2d612b5546f5634fcfdf60b95e62035850bc302d1899628d01c86f7cd3f0e11a5d69e2905b6e952cbb0ba9c505a64320a3da9502f'
7
- data.tar.gz: 0adc5454fae876ffc7bd1defcc215eda7939244cd089621ad9a2a7aa9ec52de0640fd2f93a6ab76a8ccedf0c9767f0c12b13f7408de2baf838207117cf3d0e49
6
+ metadata.gz: 046f073e9767bd44c5314eeae88a20d75418932540ba2f6dec23abea41fbd71f1b90c2c37010440f18db52fceda43947eea004f545cf04f19364920c7707cb79
7
+ data.tar.gz: f985deed8f16d963197d009608817d827bfbcd7ba6602fc4b464c6acb954616ba92eb03934ecb507f3af0dca88bcf7d225a1fc41051a9294c85a9cd6254a9567
@@ -7,6 +7,7 @@ import { GlobalProps } from "../../utilities/globalProps"
7
7
 
8
8
  import Flex from "../../pb_flex/_flex"
9
9
  import Caption from "../../pb_caption/_caption"
10
+ import Icon from "../../pb_icon/_icon"
10
11
 
11
12
  import { ToggleIconButton } from "./ToggleIconButton"
12
13
  import { renderCollapsibleTrail } from "./CollapsibleTrail"
@@ -32,17 +33,19 @@ export const SubRowHeaderRow = ({
32
33
  subRowHeaders,
33
34
  table,
34
35
  }: SubRowHeaderRowProps & GlobalProps) => {
35
- const { inlineRowLoading } = useContext(AdvancedTableContext)
36
+ const { inlineRowLoading, customSort, onCustomSortClick } = useContext(AdvancedTableContext)
36
37
 
37
38
  const numberOfColumns = table.getAllFlatColumns().length
38
39
  const rowHasChildren = row.original.children ? true : false
39
40
  const canExpand = inlineRowLoading ? rowHasChildren : row.getCanExpand()
41
+ const hasSubrowsToSort = row.getParentRow()?.subRows
42
+
40
43
 
41
44
  return (
42
45
  <tr className="custom-row bg-silver">
43
46
  <td
44
47
  className={`custom-row-first-column ${
45
- isChrome() ? "chrome-styles" : ""
48
+ isChrome() ? "chrome-styles" : ""
46
49
  }`}
47
50
  colSpan={1}
48
51
  >
@@ -50,21 +53,39 @@ export const SubRowHeaderRow = ({
50
53
  <div style={{ paddingLeft: `${row.depth * 1.25}em` }}>
51
54
  <Flex align="center"
52
55
  columnGap="xs"
56
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
57
+ //@ts-ignore
58
+ justifyContent={customSort && hasSubrowsToSort && hasSubrowsToSort.length > 1 ? "between" : undefined}
53
59
  >
54
- {enableToggleExpansion === "all" && canExpand ? (
55
- <ToggleIconButton onClick={onClick}
56
- row={row}
60
+ <Flex columnGap="xs">
61
+ {enableToggleExpansion === "all" && canExpand ? (
62
+ <ToggleIconButton onClick={onClick}
63
+ row={row}
64
+ />
65
+ ) : null}
66
+ <Caption
67
+ marginLeft={canExpand ? "none" : "xs"}
68
+ text={subRowHeaders[row.depth - 1]}
57
69
  />
58
- ) : null}
59
- <Caption
60
- marginLeft={canExpand ? "none" : "xs"}
61
- text={subRowHeaders[row.depth - 1]}
62
- />
70
+ </Flex>
71
+ {customSort && hasSubrowsToSort && hasSubrowsToSort.length > 1 && (
72
+ <button
73
+ aria-label="Sort this group"
74
+ className="sort-button-icon gray-icon"
75
+ onClick={() => { onCustomSortClick && onCustomSortClick(row.getParentRow()?.subRows)}}
76
+ >
77
+ <Icon
78
+ cursor="pointer"
79
+ fixedWidth
80
+ icon="sort"
81
+ />
82
+ </button>
83
+ )}
63
84
  </Flex>
64
85
  </div>
65
86
  </td>
66
87
 
67
88
  <td colSpan={numberOfColumns - 1} />
68
89
  </tr>
69
- )
90
+ );
70
91
  }
@@ -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
  >
@@ -101,7 +101,6 @@ export const TableHeaderCell = ({
101
101
  if (!header) return false;
102
102
 
103
103
  if (header.colSpan > 1 && header.column.parent !== undefined) return true;
104
-
105
104
  const parent = header.column.parent;
106
105
 
107
106
  if (!parent) {
@@ -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.label || "",
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
  }
@@ -95,7 +95,7 @@ export function useTableState({
95
95
  // Define the base column structure
96
96
  const columnStructure = {
97
97
  ...columnHelper.accessor(column.accessor, {
98
- header: column.label || "",
98
+ header: column.header ?? column.label ?? "",
99
99
  }),
100
100
  };
101
101
 
@@ -56,7 +56,7 @@
56
56
  }
57
57
 
58
58
  .bg-row-selection {
59
- background-color: $info_subtle;
59
+ background-color: #E5EEFA;
60
60
  }
61
61
 
62
62
  .full-width {
@@ -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;
@@ -189,6 +241,11 @@
189
241
  box-sizing: border-box !important;
190
242
  }
191
243
  }
244
+ // Fixes for tooltip picking up th styling from Table kit
245
+ .pb_tooltip_kit {
246
+ font-weight: unset;
247
+ text-transform: unset;
248
+ }
192
249
  }
193
250
 
194
251
  .pb_advanced_table_body {
@@ -227,7 +284,7 @@
227
284
 
228
285
  &.bg-row-selection {
229
286
  td:first-child {
230
- background-color: $info_subtle;
287
+ background-color: #E5EEFA;
231
288
  }
232
289
  }
233
290
  }
@@ -892,6 +949,18 @@
892
949
  }
893
950
  }
894
951
  }
952
+ .bg-row-selection {
953
+ background-color: #202850;
954
+ }
955
+ .pb_advanced_table_body {
956
+ tr.virtualized-table-row {
957
+ &.bg-row-selection {
958
+ td:first-child {
959
+ background-color: #202850;
960
+ }
961
+ }
962
+ }
963
+ }
895
964
  }
896
965
  }
897
966
 
@@ -36,6 +36,7 @@ type AdvancedTableProps = {
36
36
  columnDefinitions: GenericObject[]
37
37
  columnGroupBorderColor?: "text_lt_default" | "text_lt_light" | "text_lt_lighter" | "text_dk_default" | "text_dk_light" | "text_dk_lighter"
38
38
  columnVisibilityControl?: GenericObject
39
+ customSort?:boolean;
39
40
  dark?: boolean
40
41
  data?: { [key: string]: string }
41
42
  enableToggleExpansion?: "all" | "header" | "none"
@@ -67,6 +68,7 @@ type AdvancedTableProps = {
67
68
  tableProps?: GenericObject
68
69
  toggleExpansionIcon?: string | string[]
69
70
  onRowSelectionChange?: (arg: RowSelectionState) => void
71
+ onCustomSortClick?: (arg: GenericObject[]) => void
70
72
  virtualizedRows?: boolean
71
73
  allowFullScreen?: boolean
72
74
  fullScreenControl?: (controls: FullscreenControls) => void
@@ -81,6 +83,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
81
83
  columnDefinitions,
82
84
  columnGroupBorderColor,
83
85
  columnVisibilityControl,
86
+ customSort,
84
87
  dark = false,
85
88
  data = {},
86
89
  enableToggleExpansion = "header",
@@ -95,6 +98,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
95
98
  maxHeight,
96
99
  onRowToggleClick,
97
100
  onToggleExpansionClick,
101
+ onCustomSortClick,
98
102
  pagination = false,
99
103
  paginationProps,
100
104
  pinnedRows,
@@ -214,10 +218,10 @@ const AdvancedTable = (props: AdvancedTableProps) => {
214
218
  )
215
219
 
216
220
  return (
217
- <Card
221
+ <Card
218
222
  borderNone
219
223
  borderRadius="none"
220
- className="advanced-table-fullscreen-header"
224
+ className="advanced-table-fullscreen-header"
221
225
  {...props}
222
226
  >
223
227
  <Flex justify="end">
@@ -246,6 +250,10 @@ const AdvancedTable = (props: AdvancedTableProps) => {
246
250
  const ariaProps = buildAriaProps(aria);
247
251
  const dataProps = buildDataProps(data);
248
252
  const htmlProps = buildHtmlProps(htmlOptions);
253
+
254
+ // Visibility flag for action bar
255
+ const isActionBarVisible = (selectableRows && showActionsBar && selectedRowsLength > 0) || columnVisibilityControl;
256
+
249
257
  const classes = classnames(
250
258
  buildCss("pb_advanced_table"),
251
259
  `advanced-table-responsive-${responsive}`,
@@ -253,6 +261,8 @@ const AdvancedTable = (props: AdvancedTableProps) => {
253
261
  {
254
262
  'advanced-table-fullscreen': isFullscreen,
255
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,
256
266
  },
257
267
  {'advanced-table-sticky-left-columns': stickyLeftColumn && stickyLeftColumn.length > 0},
258
268
  columnGroupBorderColor ? `column-group-border-${columnGroupBorderColor}` : '',
@@ -266,9 +276,6 @@ const AdvancedTable = (props: AdvancedTableProps) => {
266
276
  ? getVirtualizedContainerStyles(maxHeight)
267
277
  : {};
268
278
 
269
- // Visibility flag for action bar
270
- const isActionBarVisible = (selectableRows && showActionsBar && selectedRowsLength > 0) || columnVisibilityControl;
271
-
272
279
  // The actual Main <Table /> element
273
280
  const tableElement = (
274
281
  <Table
@@ -284,7 +291,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
284
291
  ) : (
285
292
  <>
286
293
  <TableHeader />
287
- <TableBody
294
+ <TableBody
288
295
  isFetching={isFetching}
289
296
  />
290
297
  </>
@@ -325,6 +332,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
325
332
  columnDefinitions={columnDefinitions}
326
333
  columnGroupBorderColor={columnGroupBorderColor}
327
334
  columnVisibilityControl={columnVisibilityControl}
335
+ customSort={customSort}
328
336
  enableToggleExpansion={enableToggleExpansion}
329
337
  enableVirtualization={virtualizedRows}
330
338
  expandByDepth={expandByDepth}
@@ -336,6 +344,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
336
344
  isActionBarVisible={isActionBarVisible}
337
345
  isFullscreen={isFullscreen}
338
346
  loading={loading}
347
+ onCustomSortClick={onCustomSortClick}
339
348
  onExpandByDepthClick={onExpandByDepthClick}
340
349
  pinnedRows={pinnedRows}
341
350
  responsive={responsive}
@@ -12,7 +12,7 @@
12
12
  <% content.presence %>
13
13
  <% else %>
14
14
  <%= pb_rails("advanced_table/table_header", props: { column_definitions: object.column_definitions, enable_toggle_expansion: object.enable_toggle_expansion, responsive: object.responsive, loading: object.loading, selectable_rows: object.selectable_rows, show_actions_bar: object.show_actions_bar }) %>
15
- <%= pb_rails("advanced_table/table_body", props: { id: object.id, table_data: object.table_data, column_definitions: object.column_definitions, responsive: object.responsive, loading: object.loading, selectable_rows: object.selectable_rows, enable_toggle_expansion: object.enable_toggle_expansion }) %>
15
+ <%= pb_rails("advanced_table/table_body", props: { id: object.id, table_data: object.table_data, column_definitions: object.column_definitions, responsive: object.responsive, loading: object.loading, selectable_rows: object.selectable_rows, enable_toggle_expansion: object.enable_toggle_expansion, row_styling: object.row_styling }) %>
16
16
  <% end %>
17
17
  <% end %>
18
18
  <% end %>
@@ -31,9 +31,16 @@ module Playbook
31
31
  default: []
32
32
  prop :scroll_bar_none, type: Playbook::Props::Boolean,
33
33
  default: false
34
+ prop :row_styling, type: Playbook::Props::Array,
35
+ default: []
34
36
 
35
37
  def classname
36
- additional_classes = [responsive_classname, max_height_classname, hide_scroll_bar_class]
38
+ additional_classes = [
39
+ responsive_classname,
40
+ max_height_classname,
41
+ hide_scroll_bar_class,
42
+ hidden_action_bar_class,
43
+ ]
37
44
  additional_classes << "column-group-border-#{column_group_border_color}" if column_group_border_color != "none"
38
45
  generate_classname("pb_advanced_table", *additional_classes, separator: " ")
39
46
  end
@@ -47,7 +54,12 @@ module Playbook
47
54
  end
48
55
 
49
56
  def hide_scroll_bar_class
50
- 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" : ""
51
63
  end
52
64
 
53
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) {
@@ -0,0 +1,65 @@
1
+ import React from "react"
2
+ import AdvancedTable from '../../pb_advanced_table/_advanced_table'
3
+ import MOCK_DATA from "./advanced_table_mock_data.json"
4
+
5
+ const AdvancedTableCustomSort = (props) => {
6
+ const columnDefinitions = [
7
+ {
8
+ accessor: "year",
9
+ label: "Year",
10
+ id: "year",
11
+ cellAccessors: ["quarter", "month", "day"],
12
+ },
13
+ {
14
+ accessor: "newEnrollments",
15
+ id: "newEnrollments",
16
+ label: "New Enrollments",
17
+ },
18
+ {
19
+ accessor: "scheduledMeetings",
20
+ id: "scheduledMeetings",
21
+ label: "Scheduled Meetings",
22
+ },
23
+ {
24
+ accessor: "attendanceRate",
25
+ id: "attendanceRate",
26
+ label: "Attendance Rate",
27
+ },
28
+ {
29
+ accessor: "completedClasses",
30
+ id: "completedClasses",
31
+ label: "Completed Classes",
32
+ },
33
+ {
34
+ accessor: "classCompletionRate",
35
+ id: "classCompletionRate",
36
+ label: "Class Completion Rate",
37
+ },
38
+ {
39
+ accessor: "graduatedStudents",
40
+ id: "graduatedStudents",
41
+ label: "Graduated Students",
42
+ },
43
+ ]
44
+
45
+ //Render the subRow header rows
46
+ const subRowHeaders = ["Quarter", "Month", "Day"]
47
+
48
+ return (
49
+ <div>
50
+ <AdvancedTable
51
+ columnDefinitions={columnDefinitions}
52
+ customSort
53
+ enableToggleExpansion="all"
54
+ onCustomSortClick={(subrows)=>{console.log("Custom sort clicked", subrows)}}
55
+ tableData={MOCK_DATA}
56
+ {...props}
57
+ >
58
+ <AdvancedTable.Header enableSorting />
59
+ <AdvancedTable.Body subRowHeaders={subRowHeaders} />
60
+ </AdvancedTable>
61
+ </div>
62
+ )
63
+ }
64
+
65
+ export default AdvancedTableCustomSort
@@ -0,0 +1,5 @@
1
+ The optional `customSort` prop can be used to add a sort button within a subrow header. The button will only appear if that subrowheader has more than one subrow nested within it. This button comes with a callback function called `onCustomSortClick`.
2
+
3
+ The `onCustomSortClick` provides as an argument an array of all the subrows nested within that level of the table.
4
+
5
+ __NOTE__: `customSort` must be used in conjunction with the `subRowHeaders` prop. The `customSort` DOES NOT handle the sort logic, this must be handled on the frontend using the callback provided.
@@ -0,0 +1,46 @@
1
+ <% column_definitions = [
2
+ {
3
+ accessor: "year",
4
+ label: "Year",
5
+ cellAccessors: ["quarter", "month", "day"],
6
+ },
7
+ {
8
+ accessor: "newEnrollments",
9
+ label: "New Enrollments",
10
+ },
11
+ {
12
+ accessor: "scheduledMeetings",
13
+ label: "Scheduled Meetings",
14
+ },
15
+ {
16
+ accessor: "attendanceRate",
17
+ label: "Attendance Rate",
18
+ },
19
+ {
20
+ accessor: "completedClasses",
21
+ label: "Completed Classes",
22
+ },
23
+ {
24
+ accessor: "classCompletionRate",
25
+ label: "Class Completion Rate",
26
+ },
27
+ {
28
+ accessor: "graduatedStudents",
29
+ label: "Graduated Students",
30
+ }
31
+ ] %>
32
+
33
+ <% row_styling = [
34
+ {
35
+ row_id: "1",
36
+ background_color: "#F9BB00",
37
+ },
38
+ {
39
+ row_id: "8",
40
+ background_color: "#0056CF",
41
+ font_color: "white",
42
+ expand_button_color: "white",
43
+ },
44
+ ] %>
45
+
46
+ <%= pb_rails("advanced_table", props: { id: "row-styling", table_data: @table_data_with_id, column_definitions: column_definitions, row_styling: row_styling }) %>
@@ -0,0 +1,7 @@
1
+ The `row_styling` prop can be used in conjunction with row ids to control certain styling options on individual rows. Currently, `row_styling` gives you 3 optional controls:
2
+
3
+ - `background_color` : use this to control the background color of the row
4
+ - `font_color`: use this to control font color for each row if needed, for example if using a darker background color.
5
+ - `expand_button_color`: use this to control the color of the expand icon if needed, for example if using a darker background color.
6
+
7
+ **NOTE:** Each object within the `table_data` Array must contain a unique id in order to attach an id to all Rows for this to function.
@@ -0,0 +1,69 @@
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 AdvancedTableWithCustomHeader = (props) => {
10
+ const columnDefinitions = [
11
+ {
12
+ accessor: "year",
13
+ label: "Year",
14
+ cellAccessors: ["quarter", "month", "day"],
15
+ },
16
+ {
17
+ accessor: "newEnrollments",
18
+ label: "New Enrollments",
19
+ header: () => (
20
+ <Flex alignItems="center"
21
+ justifyContent="center"
22
+ >
23
+ <Caption marginRight="xs">New Enrollments</Caption>
24
+ <Tooltip placement="top"
25
+ text="Whoa. I'm a Tooltip"
26
+ zIndex={10}
27
+ >
28
+ <Icon cursor="pointer"
29
+ icon="info"
30
+ size="xs"
31
+ />
32
+ </Tooltip>
33
+ </Flex>
34
+ ),
35
+ },
36
+ {
37
+ accessor: "scheduledMeetings",
38
+ label: "Scheduled Meetings",
39
+ },
40
+ {
41
+ accessor: "attendanceRate",
42
+ label: "Attendance Rate",
43
+ },
44
+ {
45
+ accessor: "completedClasses",
46
+ label: "Completed Classes",
47
+ },
48
+ {
49
+ accessor: "classCompletionRate",
50
+ label: "Class Completion Rate",
51
+ },
52
+ {
53
+ accessor: "graduatedStudents",
54
+ label: "Graduated Students",
55
+ },
56
+ ];
57
+
58
+ return (
59
+ <div>
60
+ <AdvancedTable
61
+ columnDefinitions={columnDefinitions}
62
+ tableData={MOCK_DATA}
63
+ {...props}
64
+ />
65
+ </div>
66
+ )
67
+ }
68
+
69
+ export default AdvancedTableWithCustomHeader
@@ -0,0 +1 @@
1
+ The optional `header` key/value pair can be used within `columnDefinitions` to render a custom header. This example shows an Icon and Tooltip being used but other kits can be used as well.