playbook_ui 14.16.0.pre.rc.6 → 14.17.0.pre.rc.0

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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +34 -2
  3. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +86 -84
  4. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +2 -2
  5. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +10 -0
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pagination.jsx +0 -1
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows.html.erb +39 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows.html.erb +33 -0
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows_rails.md +1 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_rails.md +6 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +2 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/index.js +1 -1
  13. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +4 -2
  14. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +19 -9
  15. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +38 -1
  16. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +49 -37
  17. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +39 -0
  18. data/app/pb_kits/playbook/pb_bar_graph/_bar_graph.tsx +1 -1
  19. data/app/pb_kits/playbook/pb_button/_button.scss +5 -5
  20. data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.tsx +1 -1
  21. data/app/pb_kits/playbook/pb_draggable/_draggable.scss +115 -5
  22. data/app/pb_kits/playbook/pb_draggable/_draggable.tsx +6 -4
  23. data/app/pb_kits/playbook/pb_draggable/context/index.tsx +35 -9
  24. data/app/pb_kits/playbook/pb_draggable/context/types.ts +35 -28
  25. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.jsx +184 -0
  26. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.md +5 -0
  27. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_colors.jsx +97 -0
  28. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_colors.md +1 -0
  29. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableContainer.tsx +11 -2
  30. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +65 -6
  31. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.html.erb +3 -0
  32. data/app/pb_kits/playbook/pb_drawer/docs/example.yml +1 -0
  33. data/app/pb_kits/playbook/pb_filter/Filter/SortMenu.tsx +2 -1
  34. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.scss +2 -2
  35. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +67 -0
  36. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +67 -0
  37. data/app/pb_kits/playbook/pb_gauge/_gauge.tsx +1 -1
  38. data/app/pb_kits/playbook/pb_icon/_icon.scss +8 -1
  39. data/app/pb_kits/playbook/pb_icon/docs/_icon_color.html.erb +10 -4
  40. data/app/pb_kits/playbook/pb_icon/docs/_icon_color.jsx +49 -24
  41. data/app/pb_kits/playbook/pb_icon_button/_icon_button.tsx +4 -1
  42. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_click.jsx +13 -0
  43. data/app/pb_kits/playbook/pb_icon_button/docs/example.yml +1 -0
  44. data/app/pb_kits/playbook/pb_icon_button/docs/index.js +1 -0
  45. data/app/pb_kits/playbook/pb_lightbox/Carousel/Slide.tsx +1 -1
  46. data/app/pb_kits/playbook/pb_lightbox/Carousel/Slides.tsx +1 -1
  47. data/app/pb_kits/playbook/pb_lightbox/Carousel/Thumbnails.tsx +1 -1
  48. data/app/pb_kits/playbook/pb_line_graph/_line_graph.tsx +1 -1
  49. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.scss +23 -0
  50. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +26 -0
  51. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.html.erb +72 -0
  52. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.jsx +97 -0
  53. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.html.erb +71 -0
  54. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.jsx +91 -0
  55. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +4 -0
  56. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +3 -1
  57. data/app/pb_kits/playbook/pb_multi_level_select/index.js +105 -0
  58. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +10 -0
  59. data/app/pb_kits/playbook/pb_nav/_nav.scss +5 -0
  60. data/app/pb_kits/playbook/pb_rich_text_editor/_rich_text_editor.tsx +29 -11
  61. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_default.html.erb +1 -1
  62. data/app/pb_kits/playbook/pb_rich_text_editor/rich_text_editor.html.erb +4 -4
  63. data/app/pb_kits/playbook/pb_rich_text_editor/rich_text_editor.rb +2 -0
  64. data/app/pb_kits/playbook/pb_table/_table.tsx +4 -0
  65. data/app/pb_kits/playbook/pb_table/docs/_table_with_header_style_borderless.jsx +50 -0
  66. data/app/pb_kits/playbook/pb_table/docs/_table_with_header_style_borderless_react.md +1 -0
  67. data/app/pb_kits/playbook/pb_table/docs/_table_with_header_style_floating.jsx +59 -0
  68. data/app/pb_kits/playbook/pb_table/docs/_table_with_header_style_floating_react.md +1 -0
  69. data/app/pb_kits/playbook/pb_table/docs/example.yml +2 -0
  70. data/app/pb_kits/playbook/pb_table/docs/index.js +2 -0
  71. data/app/pb_kits/playbook/pb_table/styles/_headers.scss +76 -0
  72. data/app/pb_kits/playbook/pb_table/subcomponents/_table_head.tsx +11 -1
  73. data/app/pb_kits/playbook/pb_table/subcomponents/_table_header.tsx +11 -1
  74. data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +5 -0
  75. data/app/pb_kits/playbook/pb_table/table.test.js +17 -0
  76. data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.tsx +1 -1
  77. data/app/pb_kits/playbook/pb_typeahead/_typeahead.scss +4 -0
  78. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +3 -0
  79. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_disabled.html.erb +19 -0
  80. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_disabled.jsx +23 -0
  81. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -0
  82. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -0
  83. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +3 -0
  84. data/app/pb_kits/playbook/pb_user/_user.tsx +78 -13
  85. data/app/pb_kits/playbook/pb_user/docs/_user_font_options.html.erb +22 -0
  86. data/app/pb_kits/playbook/pb_user/docs/_user_font_options.jsx +40 -0
  87. data/app/pb_kits/playbook/pb_user/docs/_user_font_options_rails.md +5 -0
  88. data/app/pb_kits/playbook/pb_user/docs/_user_font_options_react.md +5 -0
  89. data/app/pb_kits/playbook/pb_user/docs/example.yml +2 -0
  90. data/app/pb_kits/playbook/pb_user/docs/index.js +1 -0
  91. data/app/pb_kits/playbook/pb_user/user.html.erb +27 -6
  92. data/app/pb_kits/playbook/pb_user/user.rb +17 -1
  93. data/app/pb_kits/playbook/pb_user/user.test.js +182 -1
  94. data/app/pb_kits/playbook/tokens/_colors.scss +1 -4
  95. data/app/pb_kits/playbook/utilities/object.test.js +139 -1
  96. data/app/pb_kits/playbook/utilities/object.ts +86 -0
  97. data/app/pb_kits/playbook/utilities/text.ts +1 -1
  98. data/dist/chunks/_typeahead-N-EFroAX.js +22 -0
  99. data/dist/chunks/_weekday_stacked-Db780bKR.js +45 -0
  100. data/dist/chunks/{lib-BeKPJYlk.js → lib-Co5y3V4K.js} +2 -2
  101. data/dist/chunks/{pb_form_validation-BvDxpfs-.js → pb_form_validation-DMajaRt3.js} +1 -1
  102. data/dist/chunks/vendor.js +1 -1
  103. data/dist/playbook-doc.js +1 -1
  104. data/dist/playbook-rails-react-bindings.js +1 -1
  105. data/dist/playbook-rails.js +1 -1
  106. data/dist/playbook.css +1 -1
  107. data/lib/playbook/forms/builder/multi_level_select_field.rb +2 -0
  108. data/lib/playbook/version.rb +2 -2
  109. metadata +32 -8
  110. data/dist/chunks/_typeahead-CRAPc8k-.js +0 -22
  111. data/dist/chunks/_weekday_stacked-T0kFfioG.js +0 -45
  112. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.md → _advanced_table_selectable_rows_no_subrows_react.md} +0 -0
  113. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows.md → _advanced_table_selectable_rows_react.md} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e376bd1a55dc2e6666d919754327203ae8c500673ee5228c08c1991e67a9666
4
- data.tar.gz: 4f4fa0ef28b813c53d27ebc46637fa591fcf9b1ede2ad232b1ec5ca5954a159b
3
+ metadata.gz: e37db60608f1b104859bdd43009d249f35cf52ce9862fef12f5603bd593dfdf5
4
+ data.tar.gz: 0b170a0e146516a999b2c1f21a9bd660053d8008b4d67b0b5d7b82937872c5ec
5
5
  SHA512:
6
- metadata.gz: e88944c44a944ee0f786032ec7069c4ab32252a9fc6f10701a8eca2173bf50f0b038c549a90ab51778999443ab7ad4557dda03e6f665ea773b694fa2c9112a96
7
- data.tar.gz: 40d1baee316d24c49263c4d1ed3139c6bec3b4a8fa609b5ed845e3db01a2dd00fefc9370a72b8de4a871c179d93747b6b328877d26c3bc4c59ede14d169a8f01
6
+ metadata.gz: 4745ed4144e005405ad52a728be1460533e39d87af9f0041a99dd54262134c4352c68c7494809b2a45e09607ff44aaa4e6b0eab31426d72cba00a9c3c030ee70
7
+ data.tar.gz: 643386db98ae4be5d998889628ddc3d5f9a6db95efae72eece4d22a9174e4d42fbc5444ee18748e67dd787ee864cd66ca07b58d76d676c9e3802473d016cd130
@@ -101,6 +101,15 @@
101
101
  border-top-left-radius: 0px !important;
102
102
  border-top-right-radius: 0px !important;
103
103
  }
104
+ // Right align header content of first data column in selectable row no subrow setup
105
+ &.selectable-rows-enabled {
106
+ tr {
107
+ th:nth-child(2),
108
+ .pb_flex_kit_orientation_row_justify_content_start_align_items_center_spacing_none.gap_none {
109
+ justify-content: flex-end;
110
+ }
111
+ }
112
+ }
104
113
 
105
114
  // Set fixed width for header cells to match table body
106
115
  th {
@@ -112,7 +121,8 @@
112
121
  }
113
122
 
114
123
  // Set fixed width for checkbox column
115
- &.table-header-cells-custom {
124
+ &.table-header-cells-custom,
125
+ &.checkbox-cell.checkbox-cell-header {
116
126
  width: 40px !important;
117
127
  min-width: 40px !important;
118
128
  box-sizing: border-box !important;
@@ -168,6 +178,15 @@
168
178
  text-align: right;
169
179
  }
170
180
  }
181
+ // Right align row content of first data column in selectable row no subrow setup
182
+ &.selectable-rows-enabled {
183
+ tr {
184
+ td:nth-child(2),
185
+ .pb_flex_kit_orientation_row_justify_content_start_align_items_center_spacing_none {
186
+ justify-content: end;
187
+ }
188
+ }
189
+ }
171
190
  }
172
191
 
173
192
  .table-header-cells-active:first-child {
@@ -262,7 +281,8 @@
262
281
  .table-header-cells:first-child,
263
282
  .table-header-cells-custom:first-child,
264
283
  td:first-child,
265
- .pb_table_td:first-child {
284
+ .pb_table_td:first-child,
285
+ .checkbox-cell.checkbox-cell-header:first-child {
266
286
  box-shadow: 1px 0px 0px 0px $border_light !important;
267
287
  }
268
288
 
@@ -318,6 +338,7 @@
318
338
  .table-header-cells:first-child,
319
339
  td:first-child,
320
340
  .pb_table_td:first-child,
341
+ .checkbox-cell.checkbox-cell-header:first-child,
321
342
  [class*="pinned-left"] {
322
343
  background-color: $white;
323
344
  box-shadow: $shadow_deep !important;
@@ -435,6 +456,16 @@
435
456
  ) !important;
436
457
  }
437
458
  }
459
+
460
+ // Vertical separator
461
+ .table-header-cells:first-child,
462
+ .table-header-cells-custom:first-child,
463
+ td:first-child,
464
+ .pb_table_td:first-child,
465
+ .checkbox-cell.checkbox-cell-header:first-child {
466
+ box-shadow: 1px 0px 0px 0px $border_dark !important;
467
+ }
468
+
438
469
  // Dark Mode Responsive Styles
439
470
  @media only screen and (max-width: $screen-xl-min) {
440
471
  &[class*="advanced-table-responsive-scroll"] {
@@ -459,6 +490,7 @@
459
490
  .table-header-cells:first-child,
460
491
  td:first-child,
461
492
  .pb_table_td:first-child,
493
+ .checkbox-cell.checkbox-cell-header:first-child,
462
494
  [class*="pinned-left"] {
463
495
  background: $bg_dark_card;
464
496
  border-right: $border_dark;
@@ -167,93 +167,95 @@ const AdvancedTable = (props: AdvancedTableProps) => {
167
167
  const isActionBarVisible = selectableRows && showActionsBar && selectedRowsLength > 0;
168
168
 
169
169
  return (
170
- <div
171
- {...ariaProps}
172
- {...dataProps}
173
- {...htmlProps}
174
- className={classes}
175
- id={id}
176
- onScroll={virtualizedRows ? e => fetchMoreOnBottomReached(
177
- e.currentTarget,
178
- fetchNextPage,
179
- isFetching,
180
- totalFetched,
181
- fullData.length
182
- ) : undefined}
183
- ref={tableWrapperRef}
184
- style={tableWrapperStyle as React.CSSProperties}
185
- >
186
- <AdvancedTableProvider
187
- columnDefinitions={columnDefinitions}
188
- enableToggleExpansion={enableToggleExpansion}
189
- enableVirtualization={virtualizedRows}
190
- expanded={expanded}
191
- expandedControl={expandedControl}
192
- handleExpandOrCollapse={handleExpandOrCollapse}
193
- hasAnySubRows={hasAnySubRows}
194
- inlineRowLoading={inlineRowLoading}
195
- isActionBarVisible={isActionBarVisible}
196
- loading={loading}
197
- responsive={responsive}
198
- selectableRows={selectableRows}
199
- setExpanded={setExpanded}
200
- showActionsBar={showActionsBar}
201
- sortControl={sortControl}
202
- subRowHeaders={tableOptions?.subRowHeaders}
203
- table={table}
204
- tableContainerRef={tableWrapperRef}
205
- toggleExpansionIcon={toggleExpansionIcon}
206
- virtualizedRows={virtualizedRows}
170
+ <>
171
+ {/* Top Pagination */}
172
+ {pagination && (
173
+ <TablePagination
174
+ onChange={onPageChange}
175
+ position="top"
176
+ range={paginationProps?.range}
177
+ table={table}
178
+ />
179
+ )}
180
+
181
+ <div
182
+ {...ariaProps}
183
+ {...dataProps}
184
+ {...htmlProps}
185
+ className={classes}
186
+ id={id}
187
+ onScroll={virtualizedRows ? e => fetchMoreOnBottomReached(
188
+ e.currentTarget,
189
+ fetchNextPage,
190
+ isFetching,
191
+ totalFetched,
192
+ fullData.length
193
+ ) : undefined}
194
+ ref={tableWrapperRef}
195
+ style={tableWrapperStyle as React.CSSProperties}
207
196
  >
208
- <React.Fragment>
209
- {/* Top Pagination */}
210
- {pagination && (
211
- <TablePagination
212
- onChange={onPageChange}
213
- position="top"
214
- range={paginationProps?.range}
215
- table={table}
197
+ <AdvancedTableProvider
198
+ columnDefinitions={columnDefinitions}
199
+ enableToggleExpansion={enableToggleExpansion}
200
+ enableVirtualization={virtualizedRows}
201
+ expanded={expanded}
202
+ expandedControl={expandedControl}
203
+ handleExpandOrCollapse={handleExpandOrCollapse}
204
+ hasAnySubRows={hasAnySubRows}
205
+ inlineRowLoading={inlineRowLoading}
206
+ isActionBarVisible={isActionBarVisible}
207
+ loading={loading}
208
+ responsive={responsive}
209
+ selectableRows={selectableRows}
210
+ setExpanded={setExpanded}
211
+ showActionsBar={showActionsBar}
212
+ sortControl={sortControl}
213
+ subRowHeaders={tableOptions?.subRowHeaders}
214
+ table={table}
215
+ tableContainerRef={tableWrapperRef}
216
+ toggleExpansionIcon={toggleExpansionIcon}
217
+ virtualizedRows={virtualizedRows}
218
+ >
219
+ <React.Fragment>
220
+ {/* Selection Action Bar */}
221
+ <TableActionBar
222
+ actions={actions}
223
+ isVisible={isActionBarVisible}
224
+ selectedCount={selectedRowsLength}
216
225
  />
217
- )}
218
-
219
- {/* Selection Action Bar */}
220
- <TableActionBar
221
- actions={actions}
222
- isVisible={isActionBarVisible}
223
- selectedCount={selectedRowsLength}
224
- />
225
226
 
226
- {/* Main Table */}
227
- <Table
228
- className={`${loading ? "content-loading" : ""}`}
229
- dark={dark}
230
- dataTable
231
- numberSpacing="tabular"
232
- responsive="none"
233
- {...tableProps}
234
- >
235
- {children ? (
236
- children
237
- ) : (
238
- <>
239
- <TableHeader />
240
- <TableBody />
241
- </>
242
- )}
243
- </Table>
244
-
245
- {/* Bottom Pagination */}
246
- {pagination && (
247
- <TablePagination
248
- onChange={onPageChange}
249
- position="bottom"
250
- range={paginationProps?.range}
251
- table={table}
252
- />
253
- )}
254
- </React.Fragment>
255
- </AdvancedTableProvider>
256
- </div>
227
+ {/* Main Table */}
228
+ <Table
229
+ className={`${loading ? "content-loading" : ""}`}
230
+ dark={dark}
231
+ dataTable
232
+ numberSpacing="tabular"
233
+ responsive="none"
234
+ {...tableProps}
235
+ >
236
+ {children ? (
237
+ children
238
+ ) : (
239
+ <>
240
+ <TableHeader />
241
+ <TableBody />
242
+ </>
243
+ )}
244
+ </Table>
245
+ </React.Fragment>
246
+ </AdvancedTableProvider>
247
+
248
+ </div>
249
+ {/* Bottom Pagination */}
250
+ {pagination && (
251
+ <TablePagination
252
+ onChange={onPageChange}
253
+ position="bottom"
254
+ range={paginationProps?.range}
255
+ table={table}
256
+ />
257
+ )}
258
+ </>
257
259
  );
258
260
  };
259
261
 
@@ -3,8 +3,8 @@
3
3
  <% if content.present? %>
4
4
  <% content.presence %>
5
5
  <% else %>
6
- <%= 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 }) %>
7
- <%= 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 }) %>
6
+ <%= 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 }) %>
7
+ <%= 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 }) %>
8
8
  <% end %>
9
9
  <% end %>
10
10
  <% end %>
@@ -20,6 +20,8 @@ module Playbook
20
20
  prop :max_height, type: Playbook::Props::Enum,
21
21
  values: %w[auto xs sm md lg xl xxl xxxl],
22
22
  default: "auto"
23
+ prop :selectable_rows, type: Playbook::Props::Boolean,
24
+ default: false
23
25
 
24
26
  def classname
25
27
  generate_classname("pb_advanced_table", responsive_classname, max_height_classname, separator: " ")
@@ -32,6 +34,14 @@ module Playbook
32
34
  def max_height_classname
33
35
  max_height.present? ? "advanced-table-max-height-#{max_height}" : ""
34
36
  end
37
+
38
+ def selected_rows
39
+ @selected_rows ||= []
40
+ end
41
+
42
+ def selected_rows_length
43
+ selected_rows.length
44
+ end
35
45
  end
36
46
  end
37
47
  end
@@ -40,7 +40,6 @@ const AdvancedTablePagination = (props) => {
40
40
  <AdvancedTable
41
41
  columnDefinitions={columnDefinitions}
42
42
  pagination
43
- responsive="none"
44
43
  tableData={PAGINATION_MOCK_DATA}
45
44
  {...props}
46
45
  />
@@ -0,0 +1,39 @@
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
+ subrow_headers = ["Quarter", "Month", "Day"]
34
+ %>
35
+
36
+ <%= pb_rails("advanced_table", props: { id: "selectable_rows", table_data: @table_data_with_id, column_definitions: column_definitions, selectable_rows: true }) do %>
37
+ <%= pb_rails("advanced_table/table_header", props: { column_definitions: column_definitions, selectable_rows: true }) %>
38
+ <%= pb_rails("advanced_table/table_body", props: { id: "selectable_rows", table_data: @table_data_with_id, column_definitions: column_definitions, subrow_headers: subrow_headers, enable_toggle_expansion: "all", selectable_rows: true }) %>
39
+ <% end %>
@@ -0,0 +1,33 @@
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
+ <%= pb_rails("advanced_table", props: { id: "selectable_rows_no_subrows", table_data: @table_data_no_subrows, column_definitions: column_definitions, selectable_rows: true, enable_toggle_expansion: "none", }) %>
@@ -0,0 +1 @@
1
+ `selectable_rows` can also be used with tables without nested row data. Set `enable_toggle_expansion: none` to adjust the Advanced Table styling to fit a table without subrows.
@@ -0,0 +1,6 @@
1
+ `selectable_rows` is a boolean prop that if present will add checkboxes to all rows that will allow for selecting rows.
2
+
3
+ When a parent row is clicked, it will check all nested children rows, Children rows can be manually checked or unchecked as well.
4
+
5
+ __ALERT TO DEVS__: UPDATE THIS PARAGRAPH IN THE FOLLOW UP STORY WHEN CHECKBOX FUNCTIONALITY IS SET PLEASE
6
+ The `onRowSelectionChange` prop returns an array of ids of all Rows that have been selected. Open the console on this example and check and uncheck checkboxes to see this is action! __NOTE__: Each object within the `tableData`Array must contain a unique id in order to attach an id to all Rows for this to function.
@@ -11,6 +11,8 @@ examples:
11
11
  - advanced_table_custom_cell_rails: Custom Components for Cells
12
12
  - advanced_table_column_headers: Multi-Header Columns
13
13
  - advanced_table_column_headers_multiple: Multi-Header Columns (Multiple Levels)
14
+ # - advanced_table_selectable_rows: Selectable Rows
15
+ # - advanced_table_selectable_rows_no_subrows: Selectable Rows (No Subrows)
14
16
 
15
17
 
16
18
  react:
@@ -231,4 +231,4 @@ window.expandAllRows = (element) => {
231
231
 
232
232
  window.expandAllSubRows = (element, rowDepth) => {
233
233
  PbAdvancedTable.handleToggleAllSubRows(element, rowDepth);
234
- };
234
+ };
@@ -21,6 +21,8 @@ module Playbook
21
21
  prop :responsive, type: Playbook::Props::Enum,
22
22
  values: %w[none scroll],
23
23
  default: "scroll"
24
+ prop :selectable_rows, type: Playbook::Props::Boolean,
25
+ default: false
24
26
 
25
27
  def flatten_columns(columns)
26
28
  columns.flat_map do |col|
@@ -56,7 +58,7 @@ module Playbook
56
58
  current_data_attributes = current_depth.zero? ? { row_depth: 0 } : table_data_attributes
57
59
 
58
60
  # Additional class and data attributes needed for toggle logic
59
- 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 })
61
+ 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 })
60
62
 
61
63
  if row[:children].present?
62
64
  row[:children].each do |child_row|
@@ -81,7 +83,7 @@ module Playbook
81
83
  def classname
82
84
  additional_classes = []
83
85
  additional_classes << "advanced-table-responsive-#{responsive} pinned-left" if responsive == "scroll"
84
-
86
+ additional_classes << "selectable-rows-enabled" if selectable_rows && enable_toggle_expansion == "none"
85
87
  generate_classname("pb_advanced_table_body", *additional_classes, separator: " ")
86
88
  end
87
89
 
@@ -1,19 +1,29 @@
1
1
  <%= pb_content_tag(:thead) do %>
2
2
  <% object.header_rows.each_with_index do |header_row, row_index| %>
3
3
  <%= pb_rails("table/table_row") do %>
4
+ <% if row_index == 0 && object.selectable_rows && object.enable_toggle_expansion == "none" %>
5
+ <%= object.render_select_all_header %>
6
+ <% end %>
4
7
  <% header_row.each_with_index do |cell, cell_index| %>
5
8
  <% header_id = cell[:accessor].present? ? cell[:accessor] : "header_#{row_index}_#{cell_index}" %>
6
9
  <%= pb_rails("table/table_header", props: { id: header_id, colspan: cell[:colspan], classname: [object.th_classname(is_first_column: cell_index.zero?), ('last-header-cell' if cell[:is_last_in_group] && cell_index != 0)].compact.join(' '), sort_menu: cell[:accessor] ? cell[:sort_menu] : nil }) do %>
7
10
  <%= pb_rails("flex", props: { align: "center", justify: cell_index.zero? ? "start" : row_index === header_rows.size - 1 ? "end" : "center", text_align: "end" }) do %>
8
- <% if cell_index.zero? && (object.enable_toggle_expansion == "header" || object.enable_toggle_expansion == "all") && row_index === header_rows.size - 1 %>
9
- <% if loading %>
10
- <div class="<%= object.loading ? 'loading-toggle-icon' : '' %>"></div>
11
- <% else %>
12
- <button
13
- class="gray-icon toggle-all-icon"
14
- onclick="expandAllRows(this); event.preventDefault();">
15
- <%= pb_rails("icon", props: { icon: "arrows-from-line", cursor: "pointer", fixed_width: true, padding_right: "xs" }) %>
16
- </button>
11
+ <% if cell_index.zero? && row_index === header_rows.size - 1 %>
12
+ <% if object.selectable_rows && object.enable_toggle_expansion != "none" %>
13
+ <%= pb_rails("flex/flex_item", props: { padding_right: "xs" }) do %>
14
+ <%= object.render_select_all_checkbox %>
15
+ <% end %>
16
+ <% end %>
17
+ <% if object.enable_toggle_expansion == "header" || object.enable_toggle_expansion == "all" %>
18
+ <% if loading %>
19
+ <div class="<%= object.loading ? 'loading-toggle-icon' : '' %>"></div>
20
+ <% else %>
21
+ <button
22
+ class="gray-icon toggle-all-icon"
23
+ onclick="expandAllRows(this); event.preventDefault();">
24
+ <%= pb_rails("icon", props: { icon: "arrows-from-line", cursor: "pointer", fixed_width: true, padding_right: "xs" }) %>
25
+ </button>
26
+ <% end %>
17
27
  <% end %>
18
28
  <% end %>
19
29
  <%= cell[:label] %>
@@ -13,17 +13,20 @@ module Playbook
13
13
  prop :responsive, type: Playbook::Props::Enum,
14
14
  values: %w[none scroll],
15
15
  default: "scroll"
16
+ prop :selectable_rows, type: Playbook::Props::Boolean,
17
+ default: false
16
18
 
17
19
  def classname
18
20
  additional_classes = []
19
21
  additional_classes << "advanced-table-responsive-#{responsive} pinned-left" if responsive == "scroll"
22
+ additional_classes << "selectable-rows-enabled" if selectable_rows && enable_toggle_expansion == "none"
20
23
 
21
24
  generate_classname("pb_advanced_table_header", "pb_table_thead", *additional_classes, separator: " ")
22
25
  end
23
26
 
24
27
  def th_classname(is_first_column: false)
25
28
  additional_classes = []
26
- additional_classes << "pinned-left" if is_first_column && responsive == "scroll"
29
+ additional_classes << "pinned-left" if is_first_column && responsive == "scroll" && !selectable_rows
27
30
 
28
31
  generate_classname("table-header-cells", *additional_classes, separator: " ")
29
32
  end
@@ -38,6 +41,40 @@ module Playbook
38
41
  rows
39
42
  end
40
43
 
44
+ # Selectable Rows No Subrows - checkboxes in their own first cell
45
+ def render_select_all_header
46
+ if selectable_rows
47
+ additional_classes = []
48
+ additional_classes << "table-header-cells-custom"
49
+ additional_classes << "checkbox-cell-header"
50
+ additional_classes << "pinned-left" if responsive == "scroll"
51
+ pb_rails("table/table_header", props: {
52
+ classname: additional_classes.join(" "),
53
+ }) do
54
+ pb_rails("checkbox", props: {
55
+ id: "select-all-rows",
56
+ name: "select-all-rows",
57
+ data: {
58
+ action: "click->pb-advanced-table#toggleAllRowSelection",
59
+ },
60
+ })
61
+ end
62
+ end
63
+ end
64
+
65
+ # Selectable Rows w/ Subrows - checkboxes part of toggleable first cell
66
+ def render_select_all_checkbox
67
+ if selectable_rows
68
+ pb_rails("checkbox", props: {
69
+ id: "select-all-rows",
70
+ name: "select-all-rows",
71
+ data: {
72
+ action: "click->pb-advanced-table#toggleAllRowSelection",
73
+ },
74
+ })
75
+ end
76
+ end
77
+
41
78
  private
42
79
 
43
80
  def compute_max_depth(columns)