playbook_ui 14.21.2 → 14.22.0.pre.alpha.PLAY2215githubactionsdepupdate8717

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 (182) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +0 -1
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/CustomCell.tsx +11 -9
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +20 -4
  5. data/app/pb_kits/playbook/pb_advanced_table/Components/SubRowHeaderRow.tsx +32 -11
  6. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +25 -5
  7. data/app/pb_kits/playbook/pb_advanced_table/Components/VirtualizedTableView.tsx +36 -16
  8. data/app/pb_kits/playbook/pb_advanced_table/Context/AdvancedTableContext.tsx +18 -5
  9. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableActions.ts +37 -17
  10. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +32 -7
  11. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +3 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +91 -40
  13. data/app/pb_kits/playbook/pb_advanced_table/Utilities/CellRendererUtils.tsx +4 -1
  14. data/app/pb_kits/playbook/pb_advanced_table/Utilities/ColumnStylingHelper.ts +15 -0
  15. data/app/pb_kits/playbook/pb_advanced_table/Utilities/TableContainerStyles.ts +3 -2
  16. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +68 -6
  17. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +42 -18
  18. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +105 -2
  19. data/app/pb_kits/playbook/pb_advanced_table/advanced_table_action_bar.js +36 -0
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_sort.html.erb +1 -1
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_subrow_headers.html.erb +1 -1
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.html.erb +1 -1
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.jsx +51 -0
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.md +7 -0
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.jsx +77 -0
  26. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.md +1 -0
  27. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers_rails.html.erb +63 -0
  28. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers_rails.md +1 -0
  29. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.html.erb +38 -0
  30. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.md +7 -0
  31. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_custom_sort.jsx +65 -0
  32. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_custom_sort.md +5 -0
  33. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_infinite_scroll.md +3 -0
  34. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_loading.html.erb +1 -1
  35. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pinned_rows.jsx +1 -1
  36. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pinned_rows_react.md +5 -3
  37. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling.jsx +64 -0
  38. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling.md +7 -0
  39. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.jsx +2 -2
  40. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions_rails.html.erb +3 -2
  41. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.html.erb +1 -1
  42. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header.jsx +69 -0
  43. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header.md +1 -0
  44. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +8 -0
  45. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +6 -0
  46. data/app/pb_kits/playbook/pb_advanced_table/flat_advanced_table.js +60 -84
  47. data/app/pb_kits/playbook/pb_advanced_table/index.js +125 -213
  48. data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +16 -1
  49. data/app/pb_kits/playbook/pb_advanced_table/table_action_bar.html.erb +1 -1
  50. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +1 -1
  51. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +5 -0
  52. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +3 -3
  53. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +33 -0
  54. data/app/pb_kits/playbook/pb_contact/contact.test.js +2 -2
  55. data/app/pb_kits/playbook/pb_dashboard/pbChartsDarkTheme.ts +1 -39
  56. data/app/pb_kits/playbook/pb_dashboard/pbChartsLightTheme.ts +1 -39
  57. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection.html.erb +3 -3
  58. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection.jsx +7 -4
  59. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_clear_selection.jsx +6 -3
  60. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.jsx +6 -3
  61. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +3 -3
  62. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_value.html.erb +3 -3
  63. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_value.jsx +7 -4
  64. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.html.erb +3 -3
  65. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.jsx +7 -4
  66. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.jsx +19 -10
  67. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.jsx +19 -10
  68. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.html.erb +10 -10
  69. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.html.erb +10 -10
  70. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.html.erb +10 -10
  71. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.jsx +20 -11
  72. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.html.erb +3 -3
  73. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.jsx +8 -8
  74. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.html.erb +10 -10
  75. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.jsx +23 -14
  76. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_separators_hidden.html.erb +3 -3
  77. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_separators_hidden.jsx +6 -3
  78. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subcomponent_structure.jsx +6 -3
  79. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subcomponent_structure_rails.html.erb +3 -3
  80. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subtle_variant.html.erb +3 -3
  81. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subtle_variant.jsx +6 -3
  82. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.html.erb +3 -3
  83. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +3 -3
  84. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb +4 -4
  85. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.jsx +4 -4
  86. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx +4 -4
  87. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +4 -4
  88. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_icon_options.html.erb +52 -0
  89. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_icon_options.jsx +99 -0
  90. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_icon_options_rails.md +1 -0
  91. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_icon_options_react.md +1 -0
  92. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_options.jsx +3 -3
  93. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_options_rails.html.erb +3 -3
  94. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_padding.html.erb +3 -3
  95. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_padding.jsx +3 -3
  96. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options.html.erb +28 -0
  97. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options.jsx +47 -0
  98. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options_rails.md +1 -0
  99. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_radio_options_react.md +1 -0
  100. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_trigger.jsx +3 -3
  101. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_trigger_rails.html.erb +3 -3
  102. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.jsx +3 -3
  103. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_label.html.erb +3 -3
  104. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_label.jsx +6 -3
  105. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx +3 -3
  106. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb +3 -3
  107. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +4 -0
  108. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +3 -1
  109. data/app/pb_kits/playbook/pb_filter/Filter/FilterSection.tsx +49 -0
  110. data/app/pb_kits/playbook/pb_filter/Filter/FilterSidebar.tsx +69 -0
  111. data/app/pb_kits/playbook/pb_filter/Filter/index.tsx +13 -0
  112. data/app/pb_kits/playbook/pb_filter/_filter.scss +4 -0
  113. data/app/pb_kits/playbook/pb_filter/docs/_filter_sidebar.jsx +224 -0
  114. data/app/pb_kits/playbook/pb_filter/docs/example.yml +1 -0
  115. data/app/pb_kits/playbook/pb_filter/docs/index.js +1 -0
  116. data/app/pb_kits/playbook/pb_filter/filter.test.js +2 -2
  117. data/app/pb_kits/playbook/pb_table/_table.tsx +4 -4
  118. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns.html.erb +8 -8
  119. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns.jsx +8 -8
  120. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns_rails.md +1 -1
  121. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns_react.md +1 -1
  122. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns.html.erb +12 -12
  123. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns.jsx +12 -12
  124. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns_rails.md +2 -2
  125. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns_react.md +3 -3
  126. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns.html.erb +12 -12
  127. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns.jsx +12 -12
  128. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns_rails.md +2 -2
  129. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns_react.md +3 -3
  130. data/app/pb_kits/playbook/pb_table/index.ts +4 -4
  131. data/app/pb_kits/playbook/pb_table/styles/_table-card.scss +11 -0
  132. data/app/pb_kits/playbook/pb_table/styles/_vertical_border.scss +4 -0
  133. data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +34 -22
  134. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_click_open.jsx +25 -0
  135. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_click_open.md +1 -0
  136. data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +1 -0
  137. data/app/pb_kits/playbook/pb_tooltip/docs/index.js +1 -0
  138. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.html.erb +18 -0
  139. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input_rails.md +1 -0
  140. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +1 -0
  141. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +3 -0
  142. data/dist/chunks/_typeahead-B7FRYVtS.js +22 -0
  143. data/dist/chunks/_weekday_stacked-ClwpVoVy.js +45 -0
  144. data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
  145. data/dist/chunks/lib-Carqm8Ip.js +29 -0
  146. data/dist/chunks/{pb_form_validation-DyvJ8iPe.js → pb_form_validation-DqRmTS8m.js} +1 -1
  147. data/dist/chunks/vendor.js +1 -1
  148. data/dist/menu.yml +0 -9
  149. data/dist/playbook-doc.js +3 -3
  150. data/dist/playbook-rails-react-bindings.js +1 -1
  151. data/dist/playbook-rails.js +1 -1
  152. data/dist/playbook.css +1 -1
  153. data/lib/playbook/version.rb +2 -2
  154. metadata +40 -31
  155. data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.scss +0 -14
  156. data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.tsx +0 -119
  157. data/app/pb_kits/playbook/pb_treemap_chart/docs/_description.md +0 -5
  158. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_colors.html.erb +0 -37
  159. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_colors.jsx +0 -48
  160. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_colors.md +0 -2
  161. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_default.html.erb +0 -37
  162. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_default.jsx +0 -47
  163. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_default.md +0 -3
  164. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_drillable.html.erb +0 -79
  165. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_drillable.jsx +0 -90
  166. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_drillable.md +0 -1
  167. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_grouped_data.html.erb +0 -54
  168. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_grouped_data.jsx +0 -65
  169. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_grouped_data.md +0 -3
  170. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_tooltip.html.erb +0 -37
  171. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_tooltip.jsx +0 -48
  172. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_tooltip.md +0 -3
  173. data/app/pb_kits/playbook/pb_treemap_chart/docs/example.yml +0 -15
  174. data/app/pb_kits/playbook/pb_treemap_chart/docs/index.js +0 -5
  175. data/app/pb_kits/playbook/pb_treemap_chart/treemapChart.test.js +0 -63
  176. data/app/pb_kits/playbook/pb_treemap_chart/treemap_chart.html.erb +0 -1
  177. data/app/pb_kits/playbook/pb_treemap_chart/treemap_chart.rb +0 -48
  178. data/dist/chunks/_typeahead-BlPRej0F.js +0 -22
  179. data/dist/chunks/_weekday_stacked-CzxoxxCR.js +0 -45
  180. data/dist/chunks/lazysizes-DHz07jlL.js +0 -1
  181. data/dist/chunks/lib-D4vXIZF5.js +0 -29
  182. /data/app/pb_kits/playbook/pb_typeahead/docs/{_typeahead_preserve_input.md → _typeahead_preserve_input_react.md} +0 -0
@@ -16,6 +16,7 @@ type TableBodyProps = {
16
16
  dark?: boolean
17
17
  id?: string
18
18
  subRowHeaders?: string[]
19
+ isFetching: boolean
19
20
  }
20
21
 
21
22
  export const TableBody = ({
@@ -24,6 +25,7 @@ export const TableBody = ({
24
25
  dark = false,
25
26
  id,
26
27
  subRowHeaders,
28
+ isFetching,
27
29
  ...props
28
30
  }: TableBodyProps) => {
29
31
 
@@ -63,6 +65,7 @@ export const TableBody = ({
63
65
  // Virtualized table view
64
66
  <VirtualizedTableView
65
67
  collapsibleTrail={collapsibleTrail}
68
+ isFetching={isFetching}
66
69
  subRowHeaders={subRowHeaders}
67
70
  />
68
71
  ) : (
@@ -40,9 +40,13 @@ export const TableHeader = ({
40
40
  showActionsBar,
41
41
  selectableRows,
42
42
  responsive,
43
- headerRef
43
+ headerRef,
44
+ virtualizedRows,
45
+ enableVirtualization,
44
46
  } = useContext(AdvancedTableContext)
45
47
 
48
+ const isVirtualized = virtualizedRows || enableVirtualization;
49
+
46
50
  const classes = classnames(
47
51
  buildCss("pb_advanced_table_header"),
48
52
  globalProps(props),
@@ -57,46 +61,93 @@ export const TableHeader = ({
57
61
  `${isChrome() ? "chrome-styles" : ""}`,
58
62
  `${responsive === "scroll" && "pinned-left"}`,
59
63
  );
64
+
65
+ const renderRegularTableHeader = () => (
66
+ <thead className={classes}
67
+ id={id}
68
+ >
69
+ {table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>, index: number) => (
70
+ <tr
71
+ key={`${headerGroup.id}-headerGroup`}
72
+ ref={index === 0 ? headerRef : null}
73
+ >
74
+ {!hasAnySubRows && selectableRows && (
75
+ <th className={customCellClassnames}>
76
+ <Checkbox
77
+ checked={table?.getIsAllRowsSelected()}
78
+ indeterminate={table?.getIsSomeRowsSelected()}
79
+ onChange={table?.getToggleAllRowsSelectedHandler()}
80
+ />
81
+ </th>
82
+ )}
83
+ {headerGroup.headers.map(header => {
84
+ const isPinnedLeft = columnPinning.left.includes(header.id)
85
+ return (
86
+ <TableHeaderCell
87
+ enableSorting={enableSorting}
88
+ enableToggleExpansion={enableToggleExpansion}
89
+ handleExpandOrCollapse={handleExpandOrCollapse}
90
+ header={header}
91
+ headerChildren={children}
92
+ isPinnedLeft={isPinnedLeft}
93
+ key={`${header.id}-header`}
94
+ loading={loading}
95
+ sortIcon={sortIcon}
96
+ table={table}
97
+ />
98
+ )
99
+ })}
100
+ </tr>
101
+ ))}
102
+ </thead>
103
+ );
104
+
105
+ const renderVirtualizedTableHeader = () => (
106
+ <thead
107
+ className={classes}
108
+ data-virtualized="true"
109
+ id={id}
110
+ >
111
+ {table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>, index: number) => (
112
+ <tr
113
+ className="virtualized-header-row-header"
114
+ key={`${headerGroup.id}-headerGroup-virtualized`}
115
+ ref={index === 0 ? headerRef : null}
116
+ >
117
+ {!hasAnySubRows && selectableRows && (
118
+ <th className={classnames(customCellClassnames, "virtualized-header-cell")}>
119
+ <Checkbox
120
+ checked={table?.getIsAllRowsSelected()}
121
+ indeterminate={table?.getIsSomeRowsSelected()}
122
+ onChange={table?.getToggleAllRowsSelectedHandler()}
123
+ />
124
+ </th>
125
+ )}
126
+ {headerGroup.headers.map(header => {
127
+ const isPinnedLeft = columnPinning.left.includes(header.id)
128
+ return (
129
+ <TableHeaderCell
130
+ enableSorting={enableSorting}
131
+ enableToggleExpansion={enableToggleExpansion}
132
+ handleExpandOrCollapse={handleExpandOrCollapse}
133
+ header={header}
134
+ headerChildren={children}
135
+ isPinnedLeft={isPinnedLeft}
136
+ isVirtualized
137
+ key={`${header.id}-header-virtualized`}
138
+ loading={loading}
139
+ sortIcon={sortIcon}
140
+ table={table}
141
+ />
142
+ )
143
+ })}
144
+ </tr>
145
+ ))}
146
+ </thead>
147
+ );
60
148
  return (
61
- <>
62
- <thead className={classes}
63
- id={id}
64
- >
65
- {/* Get the header groups (only one in this example) */}
66
- {table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>, index: number) => (
67
- <tr
68
- key={`${headerGroup.id}-headerGroup`}
69
- ref={index === 0 ? headerRef : null}
70
- >
71
- {!hasAnySubRows && selectableRows && (
72
- <th className={customCellClassnames}>
73
- <Checkbox
74
- checked={table?.getIsAllRowsSelected()}
75
- indeterminate={table?.getIsSomeRowsSelected()}
76
- onChange={table?.getToggleAllRowsSelectedHandler()}
77
- />
78
- </th>
79
- )}
80
- {headerGroup.headers.map(header => {
81
- const isPinnedLeft = columnPinning.left.includes(header.id)
82
- return (
83
- <TableHeaderCell
84
- enableSorting={enableSorting}
85
- enableToggleExpansion={enableToggleExpansion}
86
- handleExpandOrCollapse={handleExpandOrCollapse}
87
- header={header}
88
- headerChildren={children}
89
- isPinnedLeft={isPinnedLeft}
90
- key={`${header.id}-header`}
91
- loading={loading}
92
- sortIcon={sortIcon}
93
- table={table}
94
- />
95
- )
96
- })}
97
- </tr>
98
- ))}
99
- </thead>
149
+ <>
150
+ {isVirtualized ? renderVirtualizedTableHeader() : renderRegularTableHeader()}
100
151
  </>
101
152
  )
102
153
  }
@@ -17,7 +17,8 @@ export const createCellFunction = (
17
17
  customRenderer?: (row: Row<GenericObject>, value: any) => JSX.Element,
18
18
  isFirstColumn?: boolean,
19
19
  onRowToggleClick?: (row: Row<GenericObject>) => void,
20
- selectableRows?: boolean
20
+ selectableRows?: boolean,
21
+ rowStyling?: GenericObject
21
22
  ) => {
22
23
  // Add display name to the returned function
23
24
  const cellRenderer = ({
@@ -28,6 +29,7 @@ export const createCellFunction = (
28
29
  getValue: Getter<string>
29
30
  }) => {
30
31
  const rowData = row.original;
32
+ const customStyle = rowStyling?.length > 0 && rowStyling?.find((s:GenericObject) => s?.rowId === row.id);
31
33
 
32
34
  if (isFirstColumn) {
33
35
  switch (row.depth) {
@@ -35,6 +37,7 @@ export const createCellFunction = (
35
37
  return (
36
38
  <CustomCell
37
39
  customRenderer={customRenderer}
40
+ customStyle={customStyle}
38
41
  getValue={getValue}
39
42
  onRowToggleClick={onRowToggleClick}
40
43
  row={row}
@@ -0,0 +1,15 @@
1
+ export const findColumnDefByAccessor = (
2
+ defs: any[],
3
+ targetAccessor: string
4
+ ): any | undefined => {
5
+ for (const def of defs) {
6
+ if (def.accessor === targetAccessor) {
7
+ return def;
8
+ }
9
+ if (Array.isArray(def.columns) && def.columns.length) {
10
+ const found = findColumnDefByAccessor(def.columns, targetAccessor);
11
+ if (found) return found;
12
+ }
13
+ }
14
+ return undefined;
15
+ };
@@ -57,7 +57,6 @@ export const getVirtualizedContainerStyles = (maxHeight?: string): React.CSSProp
57
57
  position: 'absolute',
58
58
  top: 0,
59
59
  left: 0,
60
- width: '100%',
61
60
  height: '40px', // Match standard table row height
62
61
  transform: `translateY(${startPosition}px)`,
63
62
  tableLayout: 'fixed',
@@ -67,12 +66,14 @@ export const getVirtualizedContainerStyles = (maxHeight?: string): React.CSSProp
67
66
  /**
68
67
  * Get height estimates for different row types
69
68
  */
70
- export const getRowHeightEstimate = (rowType: 'header' | 'row' | 'loading') => {
69
+ export const getRowHeightEstimate = (rowType: 'header' | 'row' | 'loading' | 'footer') => {
71
70
  switch (rowType) {
72
71
  case 'header':
73
72
  return 40; // Header height
74
73
  case 'loading':
75
74
  return 30; // Loading indicator height
75
+ case 'footer':
76
+ return 40
76
77
  case 'row':
77
78
  default:
78
79
  return 40; // Standard row height - match this to your design system
@@ -56,18 +56,37 @@
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 {
63
63
  width: 100%;
64
64
  }
65
65
 
66
- // Virtualized table styles
66
+ // Virtualized Table and Rows for Infinite Scroll
67
+ scrollbar-gutter: stable right-edges;
68
+ .virtualized-header-row-header {
69
+ width: 100% !important;
70
+ .table-header-cells:first-child {
71
+ min-width: 180px;
72
+ }
73
+ }
74
+
75
+ .virtualized-footer {
76
+ width: 100% !important;
77
+ td {
78
+ border-bottom-left-radius: 4px !important;
79
+ border-bottom-right-radius: 4px !important;
80
+ display: flex;
81
+ justify-content: center;
82
+ align-items: center;
83
+ }
84
+ }
85
+
67
86
  .virtualized-table-row {
68
87
  display: table !important;
69
88
  table-layout: fixed !important;
70
- width: 100% !important;
89
+ box-sizing: border-box !important;
71
90
 
72
91
  td {
73
92
  display: table-cell !important;
@@ -104,7 +123,7 @@
104
123
 
105
124
  -ms-overflow-style: none !important;
106
125
  scrollbar-width: none !important;
107
- }
126
+ }
108
127
 
109
128
 
110
129
  .row-selection-actions-card {
@@ -170,6 +189,11 @@
170
189
  box-sizing: border-box !important;
171
190
  }
172
191
  }
192
+ // Fixes for tooltip picking up th styling from Table kit
193
+ .pb_tooltip_kit {
194
+ font-weight: unset;
195
+ text-transform: unset;
196
+ }
173
197
  }
174
198
 
175
199
  .pb_advanced_table_body {
@@ -193,7 +217,6 @@
193
217
 
194
218
  // Fix virtualized row borders
195
219
  tr.virtualized-table-row {
196
- border-bottom: 1px solid $border_light;
197
220
 
198
221
  &.bg-silver {
199
222
  td:first-child {
@@ -209,7 +232,7 @@
209
232
 
210
233
  &.bg-row-selection {
211
234
  td:first-child {
212
- background-color: $info_subtle;
235
+ background-color: #E5EEFA;
213
236
  }
214
237
  }
215
238
  }
@@ -606,6 +629,16 @@
606
629
  td.sticky-left {
607
630
  border-right: 1px solid $border_light !important;
608
631
  }
632
+ // Virtualized Table in Responsive Styles
633
+ .virtualized-header,
634
+ .virtualized-header-row-header,
635
+ .virtualized-table-row,
636
+ .virtualized-footer {
637
+ border-right: 1px solid $border_light !important;
638
+ .table-header-cells:first-child {
639
+ box-shadow: 0 0 10px 0 rgba($shadow, 0.16) !important;
640
+ }
641
+ }
609
642
  }
610
643
  }
611
644
  }
@@ -621,6 +654,23 @@
621
654
  box-shadow: 0 4px 10px 0 rgba($shadow, 0.16) !important;
622
655
  }
623
656
 
657
+ // For Rails, we can't target the &:last-child since collapsed rows are display: none;
658
+ // With JS, we add a .last-visible-row class and add rounded corners to bottom row
659
+ .last-visible-row {
660
+ td, .pb_table_td {
661
+ border-width: 0 0 1px 0;
662
+
663
+ &:first-child {
664
+ border-radius: 0 0 0 4px;
665
+ border-width: 0 0 1px 1px;
666
+ }
667
+ &:last-child {
668
+ border-radius: 0 0 4px 0;
669
+ border-width: 0 1px 1px 0;
670
+ }
671
+ }
672
+ }
673
+
624
674
  &.dark {
625
675
  // Override default border color for dark mode
626
676
  --column-border-color: #{$border_dark};
@@ -847,6 +897,18 @@
847
897
  }
848
898
  }
849
899
  }
900
+ .bg-row-selection {
901
+ background-color: #202850;
902
+ }
903
+ .pb_advanced_table_body {
904
+ tr.virtualized-table-row {
905
+ &.bg-row-selection {
906
+ td:first-child {
907
+ background-color: #202850;
908
+ }
909
+ }
910
+ }
911
+ }
850
912
  }
851
913
  }
852
914
 
@@ -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"
@@ -57,6 +58,7 @@ type AdvancedTableProps = {
57
58
  onChange?: (value: RowPinningState) => void;
58
59
  };
59
60
  responsive?: "scroll" | "none",
61
+ rowStyling?: GenericObject[],
60
62
  scrollBarNone?: boolean,
61
63
  selectableRows?: boolean,
62
64
  showActionsBar?: boolean,
@@ -66,6 +68,7 @@ type AdvancedTableProps = {
66
68
  tableProps?: GenericObject
67
69
  toggleExpansionIcon?: string | string[]
68
70
  onRowSelectionChange?: (arg: RowSelectionState) => void
71
+ onCustomSortClick?: (arg: GenericObject[]) => void
69
72
  virtualizedRows?: boolean
70
73
  allowFullScreen?: boolean
71
74
  fullScreenControl?: (controls: FullscreenControls) => void
@@ -80,6 +83,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
80
83
  columnDefinitions,
81
84
  columnGroupBorderColor,
82
85
  columnVisibilityControl,
86
+ customSort,
83
87
  dark = false,
84
88
  data = {},
85
89
  enableToggleExpansion = "header",
@@ -94,10 +98,12 @@ const AdvancedTable = (props: AdvancedTableProps) => {
94
98
  maxHeight,
95
99
  onRowToggleClick,
96
100
  onToggleExpansionClick,
101
+ onCustomSortClick,
97
102
  pagination = false,
98
103
  paginationProps,
99
104
  pinnedRows,
100
105
  responsive = "scroll",
106
+ rowStyling,
101
107
  scrollBarNone= false,
102
108
  showActionsBar = true,
103
109
  selectableRows,
@@ -144,6 +150,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
144
150
  onRowSelectionChange,
145
151
  columnVisibilityControl,
146
152
  pinnedRows,
153
+ rowStyling
147
154
  });
148
155
 
149
156
  // Initialize table actions
@@ -266,6 +273,29 @@ const AdvancedTable = (props: AdvancedTableProps) => {
266
273
  // Visibility flag for action bar
267
274
  const isActionBarVisible = (selectableRows && showActionsBar && selectedRowsLength > 0) || columnVisibilityControl;
268
275
 
276
+ // The actual Main <Table /> element
277
+ const tableElement = (
278
+ <Table
279
+ className={`${loading ? "content-loading" : ""}`}
280
+ dark={dark}
281
+ dataTable
282
+ numberSpacing="tabular"
283
+ responsive="none"
284
+ {...tableProps}
285
+ >
286
+ {children ? (
287
+ children
288
+ ) : (
289
+ <>
290
+ <TableHeader />
291
+ <TableBody
292
+ isFetching={isFetching}
293
+ />
294
+ </>
295
+ )}
296
+ </Table>
297
+ )
298
+
269
299
  return (
270
300
  <>
271
301
  {/* Top Pagination */}
@@ -299,6 +329,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
299
329
  columnDefinitions={columnDefinitions}
300
330
  columnGroupBorderColor={columnGroupBorderColor}
301
331
  columnVisibilityControl={columnVisibilityControl}
332
+ customSort={customSort}
302
333
  enableToggleExpansion={enableToggleExpansion}
303
334
  enableVirtualization={virtualizedRows}
304
335
  expandByDepth={expandByDepth}
@@ -310,9 +341,11 @@ const AdvancedTable = (props: AdvancedTableProps) => {
310
341
  isActionBarVisible={isActionBarVisible}
311
342
  isFullscreen={isFullscreen}
312
343
  loading={loading}
344
+ onCustomSortClick={onCustomSortClick}
313
345
  onExpandByDepthClick={onExpandByDepthClick}
314
346
  pinnedRows={pinnedRows}
315
347
  responsive={responsive}
348
+ rowStyling={rowStyling}
316
349
  selectableRows={selectableRows}
317
350
  setExpanded={setExpanded}
318
351
  showActionsBar={showActionsBar}
@@ -322,6 +355,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
322
355
  table={table}
323
356
  tableContainerRef={tableWrapperRef}
324
357
  toggleExpansionIcon={toggleExpansionIcon}
358
+ totalAvailableCount={fullData.length}
325
359
  virtualizedRows={virtualizedRows}
326
360
  >
327
361
  <React.Fragment>
@@ -333,24 +367,14 @@ const AdvancedTable = (props: AdvancedTableProps) => {
333
367
  type={columnVisibilityControl ? "column-visibility" : "row-selection"}
334
368
  />
335
369
 
336
- {/* Main Table */}
337
- <Table
338
- className={`${loading ? "content-loading" : ""}`}
339
- dark={dark}
340
- dataTable
341
- numberSpacing="tabular"
342
- responsive="none"
343
- {...tableProps}
344
- >
345
- {children ? (
346
- children
347
- ) : (
348
- <>
349
- <TableHeader />
350
- <TableBody />
351
- </>
352
- )}
353
- </Table>
370
+ {/* Virtualized wrapper div only if virtualizedRows is true */}
371
+ {virtualizedRows ? (
372
+ <div style={{ overflow: 'auto', width: '100%' }}>
373
+ {tableElement}
374
+ </div>
375
+ ) : (
376
+ tableElement
377
+ )}
354
378
  </React.Fragment>
355
379
  </AdvancedTableProvider>
356
380
 
@@ -1,7 +1,7 @@
1
1
  import React, {useState} from "react"
2
2
  import { render, screen, waitFor } from "../utilities/test-utils"
3
3
 
4
- import { AdvancedTable, Pill } from "playbook-ui"
4
+ import { AdvancedTable, Pill, colors } from "playbook-ui"
5
5
 
6
6
  global.ResizeObserver = class {
7
7
  observe() {}
@@ -572,4 +572,107 @@ test("pinnedRows prop renders pinned rows at top", () => {
572
572
  const firstPinnedRow = pinnedRows[0]
573
573
  expect(firstPinnedRow).toHaveStyle("position: sticky")
574
574
  expect(firstPinnedRow).toHaveStyle("background-color: white")
575
- })
575
+ })
576
+
577
+ test("columnStyling.headerAlignment aligns header as expected", () => {
578
+ const styledColumnDefs = [
579
+ {
580
+ accessor: "year",
581
+ label: "Year",
582
+ cellAccessors: ["quarter", "month", "day"],
583
+ },
584
+ {
585
+ accessor: "newEnrollments",
586
+ label: "New Enrollments",
587
+ columnStyling: { headerAlignment: "left" },
588
+ },
589
+ {
590
+ accessor: "scheduledMeetings",
591
+ label: "Scheduled Meetings",
592
+ },
593
+ ];
594
+
595
+ render(
596
+ <AdvancedTable
597
+ columnDefinitions={styledColumnDefs}
598
+ data={{ testid: testId }}
599
+ tableData={MOCK_DATA}
600
+ />
601
+ );
602
+
603
+ const headerCell = screen.getByText("New Enrollments").closest("th");
604
+ expect(headerCell).toHaveAttribute("align", "left");
605
+ });
606
+
607
+ test("columnStyling.cellAlignment sets each <td> align attribute as expected", () => {
608
+ const styledColumnDefs = [
609
+ {
610
+ accessor: "year",
611
+ label: "Year",
612
+ cellAccessors: ["quarter", "month", "day"],
613
+ },
614
+ {
615
+ accessor: "newEnrollments",
616
+ label: "New Enrollments",
617
+ columnStyling: { cellAlignment: "left" },
618
+ },
619
+ {
620
+ accessor: "scheduledMeetings",
621
+ label: "Scheduled Meetings",
622
+ },
623
+ ];
624
+
625
+ render(
626
+ <AdvancedTable
627
+ columnDefinitions={styledColumnDefs}
628
+ data={{ testid: testId }}
629
+ tableData={MOCK_DATA}
630
+ />
631
+ );
632
+
633
+ const firstEnrollmentCell = screen.getAllByText("20")[0].closest("td");
634
+ expect(firstEnrollmentCell).toHaveAttribute("align", "left");
635
+ });
636
+
637
+ test("renders virtualized table rows and header", () => {
638
+ render(
639
+ <AdvancedTable
640
+ columnDefinitions={columnDefinitions}
641
+ data={{ testid: testId }}
642
+ tableData={MOCK_DATA_WITH_ID}
643
+ virtualizedRows
644
+ />
645
+ )
646
+
647
+ const kit = screen.getByTestId(testId)
648
+
649
+ const virtualizedHeader = kit.querySelector('.virtualized-header-row-header')
650
+ expect(virtualizedHeader).toBeInTheDocument()
651
+
652
+ const virtualizedRows = kit.querySelectorAll('.virtualized-table-row')
653
+ expect(virtualizedRows.length).toBeLessThan(MOCK_DATA_WITH_ID.length)
654
+ })
655
+
656
+ test("rowStyling prop works as expected", () => {
657
+ const rowStyling = [
658
+ {
659
+ rowId: "1",
660
+ backgroundColor: colors.white,
661
+ fontColor: colors.black
662
+ },
663
+ ];
664
+
665
+ render(
666
+ <AdvancedTable
667
+ columnDefinitions={columnDefinitions}
668
+ data={{ testid: testId }}
669
+ rowStyling={rowStyling}
670
+ tableData={MOCK_DATA_WITH_ID}
671
+ />
672
+ )
673
+
674
+ const kit = screen.getByTestId(testId)
675
+ const tableBody = kit.querySelector('tbody')
676
+ const row1 = tableBody.querySelector('tr:nth-child(1)')
677
+ expect(row1).toHaveStyle({backgroundColor: colors.white, color: colors.black})
678
+ })
@@ -0,0 +1,36 @@
1
+ function showActionBar(actionBar, selectedCount) {
2
+ // Show action bar directly
3
+ actionBar.style.height = "auto";
4
+ actionBar.style.overflow = "visible";
5
+ actionBar.style.opacity = "1";
6
+ actionBar.style.transitionProperty = "all";
7
+ actionBar.style.transitionTimingFunction = "ease-in-out";
8
+ actionBar.classList.remove("p_none");
9
+ actionBar.classList.add("p_xs", "is-visible", "show-action-card");
10
+
11
+ // Update the count
12
+ const countElement = actionBar.querySelector(".selected-count");
13
+ if (countElement) {
14
+ countElement.textContent = `${selectedCount} Selected`;
15
+ }
16
+ }
17
+
18
+ function hideActionBar(actionBar) {
19
+ // Hide action bar directly
20
+ actionBar.style.height = "0px";
21
+ actionBar.style.overflow = "hidden";
22
+ actionBar.style.opacity = "0";
23
+ actionBar.classList.add("p_none");
24
+ actionBar.classList.remove("p_xs", "is-visible", "show-action-card");
25
+ }
26
+
27
+ export function updateSelectionActionBar(table, selectedCount) {
28
+ const actionBar = table.querySelector(".row-selection-actions-card");
29
+ if (!actionBar) return;
30
+
31
+ if (selectedCount > 0) {
32
+ showActionBar(actionBar, selectedCount);
33
+ } else {
34
+ hideActionBar(actionBar);
35
+ }
36
+ }
@@ -51,7 +51,7 @@
51
51
  ]
52
52
  %>
53
53
 
54
- <%= pb_rails("advanced_table", props: { table_data: @table_data, column_definitions: column_definitions }) do %>
54
+ <%= pb_rails("advanced_table", props: { table_data: @table_data, column_definitions: column_definitions, id: "beta_sort" }) do %>
55
55
  <%= pb_rails("advanced_table/table_header", props: { column_definitions: column_definitions }) %>
56
56
  <%= pb_rails("advanced_table/table_body", props: { id: "beta_sort", table_data: @table_data, column_definitions: column_definitions, enable_toggle_expansion: "all" }) %>
57
57
  <% end %>
@@ -34,7 +34,7 @@
34
34
  subrow_headers = ["Quarter", "Month", "Day"]
35
35
  %>
36
36
 
37
- <%= pb_rails("advanced_table", props: { table_data: @table_data, column_definitions: column_definitions }) do %>
37
+ <%= pb_rails("advanced_table", props: { table_data: @table_data, column_definitions: column_definitions, id: "test_table" }) do %>
38
38
  <%= pb_rails("advanced_table/table_header", props: { column_definitions: column_definitions }) %>
39
39
  <%= pb_rails("advanced_table/table_body", props: { id: "test_table", table_data: @table_data, column_definitions: column_definitions, subrow_headers: subrow_headers, enable_toggle_expansion: "all" }) %>
40
40
  <% end %>