playbook_ui 14.16.0.pre.alpha.PLAY1938completetooltipfloatinguitransition6830 → 14.16.0.pre.alpha.play1960buttonkitdisablenotworkingdanger6850

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 (32) 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.html.erb +2 -2
  4. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +10 -0
  5. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows.html.erb +39 -0
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows.html.erb +33 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows_rails.md +1 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_rails.md +6 -0
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +2 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/index.js +1 -1
  11. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +4 -2
  12. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +19 -9
  13. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +38 -1
  14. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +49 -37
  15. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +39 -0
  16. data/app/pb_kits/playbook/pb_button/_button.scss +5 -5
  17. data/app/pb_kits/playbook/pb_tooltip/floating_ui.js +282 -0
  18. data/app/pb_kits/playbook/pb_tooltip/index.js +57 -184
  19. data/dist/chunks/{_typeahead-BEyzuDQy.js → _typeahead-HN7DWIZV.js} +3 -3
  20. data/dist/chunks/{_weekday_stacked-BWYgED9z.js → _weekday_stacked-DpwdSQoj.js} +1 -1
  21. data/dist/chunks/lib-Co5y3V4K.js +29 -0
  22. data/dist/chunks/{pb_form_validation-CJD-PyIw.js → pb_form_validation-DMajaRt3.js} +1 -1
  23. data/dist/chunks/vendor.js +1 -1
  24. data/dist/playbook-doc.js +1 -1
  25. data/dist/playbook-rails-react-bindings.js +1 -1
  26. data/dist/playbook-rails.js +1 -1
  27. data/dist/playbook.css +1 -1
  28. data/lib/playbook/version.rb +1 -1
  29. metadata +12 -7
  30. data/dist/chunks/lib-BgzBJfYr.js +0 -29
  31. /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
  32. /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: 794a2d3bca7088071c4fbd83fff2a367725c1919abc36cc77cd4b46aebd7d752
4
- data.tar.gz: 78a0d55d2565ea0f8181c350c797dbd8cf68ab5be5de79fb8956b48183ce7fca
3
+ metadata.gz: ec0875c5557cec086ec99ae1cbaf9f47361e3a4584e4b677136fd3ce394db55d
4
+ data.tar.gz: 456a8945cc951c32c481c638e66ee8a685902e1a1b02b75bcd8fb6e5709a5c2e
5
5
  SHA512:
6
- metadata.gz: c8c882af3d81f788032d5b534917b5494d149610824acc75cca8337fb13826f526ceec4c851784985b5e0e2a9af5f895980a9c4d8b904435353afe2ff851683a
7
- data.tar.gz: 13ccd9cf6c192109eee944d6bd83fe8b8ba03d40d48e3481f04e96d63c49a7d455c9a812478920c575fdf5a89db751c29823ae99fa52bfe696be2a966a080f24
6
+ metadata.gz: 7d30f5a21e8502edb67813757f015e1c7b95a1f19cbc435e5e5e553fd0c3477c82fba61713834accd60a58286f500c03623d062183485b6f9a5c98b84b2ceb6a
7
+ data.tar.gz: 67b9bac93175b4881f236ea5f2ceef4023a6eeefea241dc5503ec8e7c27a5d3a128fdc90aa73bde6a8dabc02648ed7450e0fc62e3f75a9a666c65a3b17024215
@@ -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;
@@ -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
@@ -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)
@@ -1,48 +1,60 @@
1
1
  <%= pb_content_tag(:tr) do %>
2
- <% object.column_definitions.each_with_index do |column, index| %>
3
- <% next unless column[:accessor].present? %>
4
- <%= pb_rails("table/table_cell", props: { classname:object.td_classname(column, index)}) do %>
5
- <%= pb_rails("flex", props:{ align: "center", justify: index.zero? ? "start" : "end", classname: object.loading ? "loading-cell" : "" }) do %>
6
- <% if collapsible_trail && index.zero? %>
7
- <% (1..depth).each do |i| %>
8
- <% additional_offset = i > 1 ? (i - 1) * 0.25 : 0 %>
9
- <% left_offset = i * 1.0 + additional_offset %>
10
- <div class="collapsible-trail" style="left: <%= left_offset %>em"></div>
11
- <% end %>
2
+ <% has_separate_checkbox = object.selectable_rows && object.enable_toggle_expansion == "none" %>
3
+ <% if has_separate_checkbox %>
4
+ <%= object.render_checkbox_cell %>
5
+ <% end %>
6
+ <% object.column_definitions.each_with_index do |column, index| %>
7
+ <% next unless column[:accessor].present? %>
8
+ <%= pb_rails("table/table_cell", props: { classname:object.td_classname(column, index)}) do %>
9
+ <%= pb_rails("flex", props:{ align: "center", justify: index.zero? ? "start" : "end", classname: object.loading ? "loading-cell" : "" }) do %>
10
+ <% if collapsible_trail && index.zero? %>
11
+ <% (1..depth).each do |i| %>
12
+ <% additional_offset = i > 1 ? (i - 1) * 0.25 : 0 %>
13
+ <% left_offset = i * 1.0 + additional_offset %>
14
+ <div class="collapsible-trail" style="left: <%= left_offset %>em"></div>
12
15
  <% end %>
16
+ <% end %>
13
17
 
14
- <div style="padding-left: <%= depth * 1.25 %>em">
15
- <%= pb_rails("flex", props:{align: "center", column_gap: "xs"}) do %>
16
- <% if index.zero? && object.row[:children].present? %>
17
- <button
18
- id="<%= "#{object.id}_#{object.row.object_id}" %>"
19
- class="gray-icon expand-toggle-icon"
20
- data-advanced-table="true">
21
- <%= pb_rails("icon", props: { id: "advanced-table_open_icon", icon: "circle-play", cursor: "pointer" }) %>
22
- <%= pb_rails("icon", props: { id: "advanced-table_close_icon", display: "none", icon: "circle-play", cursor: "pointer", rotation: 90 }) %>
23
- </button>
18
+ <div style="padding-left: <%= depth * 1.25 %>em">
19
+ <%= pb_rails("flex", props:{align: "center", column_gap: "xs"}) do %>
20
+ <% if index.zero? %>
21
+ <% has_integrated_checkbox = object.selectable_rows && object.enable_toggle_expansion != "none" %>
22
+ <% if has_integrated_checkbox %>
23
+ <%= pb_rails("flex/flex_item", props: { padding_right: "xs" }) do %>
24
+ <%= object.render_row_checkbox %>
25
+ <% end %>
24
26
  <% end %>
25
- <%= pb_rails("flex/flex_item", props:{padding_left: index.zero? && object.row[:children].present? ? "none" : "xs"}) do %>
26
- <% if column[:custom_renderer].present? %>
27
- <%= raw(column[:custom_renderer].call(object.row, custom_renderer_value(column, index))) %>
28
- <% elsif index.zero? %>
29
- <% if object.depth.zero? %>
30
- <%= object.row[column[:accessor].to_sym] %>
31
- <% else %>
32
- <% object.depth_accessors.each_with_index do |item, accessor_index| %>
33
- <% if object.depth - 1 == accessor_index %>
34
- <% key = item.to_sym %>
35
- <%= object.row[key] %>
36
- <% end %>
27
+ <% if object.row[:children].present? %>
28
+ <button
29
+ id="<%= "#{object.id}_#{object.row.object_id}" %>"
30
+ class="gray-icon expand-toggle-icon"
31
+ data-advanced-table="true">
32
+ <%= pb_rails("icon", props: { id: "advanced-table_open_icon", icon: "circle-play", cursor: "pointer" }) %>
33
+ <%= pb_rails("icon", props: { id: "advanced-table_close_icon", display: "none", icon: "circle-play", cursor: "pointer", rotation: 90 }) %>
34
+ </button>
35
+ <% end %>
36
+ <% end %>
37
+ <%= pb_rails("flex/flex_item", props:{padding_left: index.zero? && (object.row[:children].present? || has_integrated_checkbox) ? "none" : "xs"}) do %>
38
+ <% if column[:custom_renderer].present? %>
39
+ <%= raw(column[:custom_renderer].call(object.row, custom_renderer_value(column, index))) %>
40
+ <% elsif index.zero? %>
41
+ <% if object.depth.zero? %>
42
+ <%= object.row[column[:accessor].to_sym] %>
43
+ <% else %>
44
+ <% object.depth_accessors.each_with_index do |item, accessor_index| %>
45
+ <% if object.depth - 1 == accessor_index %>
46
+ <% key = item.to_sym %>
47
+ <%= object.row[key] %>
37
48
  <% end %>
38
49
  <% end %>
39
- <% else %>
40
- <%= object.row[column[:accessor].to_sym] %>
41
50
  <% end %>
51
+ <% else %>
52
+ <%= object.row[column[:accessor].to_sym] %>
42
53
  <% end %>
43
54
  <% end %>
44
- </div>
45
- <% end %>
55
+ <% end %>
56
+ </div>
46
57
  <% end %>
47
58
  <% end %>
48
- <% end %>
59
+ <% end %>
60
+ <% end %>
@@ -20,6 +20,13 @@ module Playbook
20
20
  default: "scroll"
21
21
  prop :is_pinned_left, type: Playbook::Props::Boolean,
22
22
  default: false
23
+ prop :selectable_rows, type: Playbook::Props::Boolean,
24
+ default: false
25
+ prop :row_id, type: Playbook::Props::String,
26
+ default: ""
27
+ prop :enable_toggle_expansion, type: Playbook::Props::Enum,
28
+ values: %w[all header none],
29
+ default: "header"
23
30
 
24
31
  def data
25
32
  Hash(prop(:data)).merge(table_data_attributes)
@@ -42,6 +49,38 @@ module Playbook
42
49
  end.compact
43
50
  end
44
51
 
52
+ # Selectable Rows No Subrows - checkboxes in their own first cell
53
+ def render_checkbox_cell
54
+ if selectable_rows
55
+ pb_rails("table/table_cell", props: {
56
+ classname: "checkbox-cell",
57
+ }) do
58
+ pb_rails("checkbox", props: {
59
+ id: "select-row-#{row_id || row.object_id}",
60
+ name: "select-row-#{row_id || row.object_id}",
61
+ data: {
62
+ row_id: row_id || row.object_id.to_s,
63
+ action: "click->pb-advanced-table#toggleRowSelection",
64
+ },
65
+ })
66
+ end
67
+ end
68
+ end
69
+
70
+ # Selectable Rows w/ Subrows - checkboxes part of toggleable first cell
71
+ def render_row_checkbox
72
+ if selectable_rows
73
+ pb_rails("checkbox", props: {
74
+ id: "select-row-#{row_id || row.object_id}",
75
+ name: "select-row-#{row_id || row.object_id}",
76
+ data: {
77
+ row_id: row_id || row.object_id.to_s,
78
+ action: "click->pb-advanced-table#toggleRowSelection",
79
+ },
80
+ })
81
+ end
82
+ end
83
+
45
84
  private
46
85
 
47
86
  def custom_renderer_value(column, index)
@@ -63,11 +63,6 @@ $pb_button_sizes: (
63
63
  color: $text_lt_lighter;
64
64
  }
65
65
 
66
- // Disabled =================
67
- &[class*=_disabled] {
68
- @include pb_button_disabled;
69
- }
70
-
71
66
  // Block ====================
72
67
  &[class*=_block] {
73
68
  @include pb_button_block;
@@ -83,6 +78,11 @@ $pb_button_sizes: (
83
78
  @include pb_button_danger;
84
79
  }
85
80
 
81
+ // Disabled =================
82
+ &[class*=_disabled] {
83
+ @include pb_button_disabled;
84
+ }
85
+
86
86
  // Dark Variants =============
87
87
  &.dark {
88
88
  &[class*=_primary] {