playbook_ui 13.21.0.pre.alpha.PBNTR225advancedtablefeedback2438 → 13.21.0.pre.alpha.PBNTR243globalpositioningpropinset2504

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/README.md +2 -2
  3. data/app/pb_kits/playbook/pb_advanced_table/Utilities/ExpansionControlHelpers.tsx +20 -35
  4. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +7 -2
  5. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +6 -7
  6. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +14 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +19 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +16 -10
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +2 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/table_body.html.erb +9 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +30 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +20 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +21 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +37 -0
  15. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +32 -0
  16. data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +2 -1
  17. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.html.erb +2 -1
  18. data/app/pb_kits/playbook/pb_background/background.html.erb +2 -1
  19. data/app/pb_kits/playbook/pb_badge/badge.html.erb +2 -1
  20. data/app/pb_kits/playbook/pb_body/body.html.erb +2 -1
  21. data/app/pb_kits/playbook/pb_bread_crumbs/_bread_crumbs.scss +0 -7
  22. data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumb_item.html.erb +2 -1
  23. data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.html.erb +2 -1
  24. data/app/pb_kits/playbook/pb_button/button.html.erb +2 -1
  25. data/app/pb_kits/playbook/pb_button/button.rb +2 -3
  26. data/app/pb_kits/playbook/pb_button_toolbar/button_toolbar.html.erb +2 -1
  27. data/app/pb_kits/playbook/pb_caption/caption.html.erb +2 -1
  28. data/app/pb_kits/playbook/pb_card/card.html.erb +2 -1
  29. data/app/pb_kits/playbook/pb_card/card_body.html.erb +2 -1
  30. data/app/pb_kits/playbook/pb_card/card_header.html.erb +2 -1
  31. data/app/pb_kits/playbook/pb_checkbox/checkbox.html.erb +3 -1
  32. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.html.erb +2 -1
  33. data/app/pb_kits/playbook/pb_collapsible/collapsible.html.erb +2 -1
  34. data/app/pb_kits/playbook/pb_collapsible/collapsible_content.html.erb +2 -1
  35. data/app/pb_kits/playbook/pb_collapsible/collapsible_main.html.erb +2 -1
  36. data/app/pb_kits/playbook/pb_contact/contact.html.erb +2 -1
  37. data/app/pb_kits/playbook/pb_currency/currency.html.erb +2 -1
  38. data/app/pb_kits/playbook/pb_dashboard_value/dashboard_value.html.erb +2 -1
  39. data/app/pb_kits/playbook/pb_date/date.html.erb +2 -1
  40. data/app/pb_kits/playbook/pb_date_picker/_date_picker.scss +1 -2
  41. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +3 -0
  42. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +4 -2
  43. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +2 -1
  44. data/app/pb_kits/playbook/pb_date_picker/date_picker.test.js +1 -1
  45. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +9 -7
  46. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_margin_bottom.html.erb +7 -0
  47. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_margin_bottom.jsx +41 -0
  48. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +2 -0
  49. data/app/pb_kits/playbook/pb_date_picker/docs/index.js +1 -0
  50. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_input_styles.scss +1 -2
  51. data/app/pb_kits/playbook/pb_date_range_inline/date_range_inline.html.erb +2 -1
  52. data/app/pb_kits/playbook/pb_date_range_stacked/date_range_stacked.html.erb +2 -1
  53. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.html.erb +2 -1
  54. data/app/pb_kits/playbook/pb_date_time/date_time.html.erb +2 -1
  55. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.html.erb +3 -2
  56. data/app/pb_kits/playbook/pb_date_year_stacked/date_year_stacked.html.erb +2 -1
  57. data/app/pb_kits/playbook/pb_detail/detail.html.erb +2 -1
  58. data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +2 -1
  59. data/app/pb_kits/playbook/pb_dialog/dialog_body.html.erb +3 -2
  60. data/app/pb_kits/playbook/pb_dialog/dialog_footer.html.erb +2 -1
  61. data/app/pb_kits/playbook/pb_dialog/dialog_header.html.erb +3 -2
  62. data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +2 -1
  63. data/app/pb_kits/playbook/pb_filter/filter.html.erb +2 -1
  64. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.scss +8 -3
  65. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.tsx +1 -0
  66. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_multi_line.html.erb +51 -1
  67. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_multi_line.jsx +62 -11
  68. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_positions.html.erb +7 -2
  69. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.html.erb +4 -3
  70. data/app/pb_kits/playbook/pb_flex/docs/_flex_spacing.html.erb +0 -4
  71. data/app/pb_kits/playbook/pb_flex/flex.html.erb +2 -1
  72. data/app/pb_kits/playbook/pb_flex/flex_item.html.erb +2 -1
  73. data/app/pb_kits/playbook/pb_form_group/form_group.html.erb +2 -1
  74. data/app/pb_kits/playbook/pb_form_pill/form_pill.html.erb +2 -2
  75. data/app/pb_kits/playbook/pb_hashtag/hashtag.html.erb +2 -1
  76. data/app/pb_kits/playbook/pb_highlight/highlight.html.erb +2 -1
  77. data/app/pb_kits/playbook/pb_home_address_street/home_address_street.html.erb +2 -1
  78. data/app/pb_kits/playbook/pb_icon/_icon.tsx +1 -0
  79. data/app/pb_kits/playbook/pb_icon/icon.html.erb +2 -1
  80. data/app/pb_kits/playbook/pb_icon/icon.rb +3 -3
  81. data/app/pb_kits/playbook/pb_icon_circle/icon_circle.html.erb +2 -1
  82. data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.html.erb +2 -1
  83. data/app/pb_kits/playbook/pb_icon_value/icon_value.html.erb +2 -1
  84. data/app/pb_kits/playbook/pb_image/image.html.erb +2 -1
  85. data/app/pb_kits/playbook/pb_label_pill/label_pill.html.erb +2 -1
  86. data/app/pb_kits/playbook/pb_label_value/label_value.html.erb +3 -2
  87. data/app/pb_kits/playbook/pb_layout/body.html.erb +2 -1
  88. data/app/pb_kits/playbook/pb_layout/footer.html.erb +2 -1
  89. data/app/pb_kits/playbook/pb_layout/header.html.erb +2 -1
  90. data/app/pb_kits/playbook/pb_layout/item.html.erb +2 -1
  91. data/app/pb_kits/playbook/pb_layout/layout.html.erb +2 -1
  92. data/app/pb_kits/playbook/pb_layout/sidebar.html.erb +2 -1
  93. data/app/pb_kits/playbook/pb_legend/legend.html.erb +2 -1
  94. data/app/pb_kits/playbook/pb_list/item.html.erb +2 -1
  95. data/app/pb_kits/playbook/pb_list/list.html.erb +2 -1
  96. data/app/pb_kits/playbook/pb_loading_inline/loading_inline.html.erb +2 -1
  97. data/app/pb_kits/playbook/pb_message/message.html.erb +2 -1
  98. data/app/pb_kits/playbook/pb_message/message_mention.html.erb +3 -2
  99. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.html.erb +2 -1
  100. data/app/pb_kits/playbook/pb_multiple_users/multiple_users.html.erb +2 -1
  101. data/app/pb_kits/playbook/pb_multiple_users_stacked/multiple_users_stacked.html.erb +2 -1
  102. data/app/pb_kits/playbook/pb_nav/item.html.erb +4 -2
  103. data/app/pb_kits/playbook/pb_nav/nav.html.erb +2 -1
  104. data/app/pb_kits/playbook/pb_online_status/online_status.html.erb +2 -1
  105. data/app/pb_kits/playbook/pb_pagination/pagination.html.erb +2 -1
  106. data/app/pb_kits/playbook/pb_passphrase/passphrase.html.erb +1 -1
  107. data/app/pb_kits/playbook/pb_person/person.html.erb +2 -1
  108. data/app/pb_kits/playbook/pb_person_contact/person_contact.html.erb +2 -1
  109. data/app/pb_kits/playbook/pb_pill/pill.html.erb +2 -1
  110. data/app/pb_kits/playbook/pb_popover/popover.html.erb +2 -1
  111. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.html.erb +2 -1
  112. data/app/pb_kits/playbook/pb_progress_simple/progress_simple.html.erb +2 -1
  113. data/app/pb_kits/playbook/pb_progress_step/progress_step.html.erb +2 -1
  114. data/app/pb_kits/playbook/pb_progress_step/progress_step_item.html.erb +2 -1
  115. data/app/pb_kits/playbook/pb_radio/radio.html.erb +2 -1
  116. data/app/pb_kits/playbook/pb_section_separator/section_separator.html.erb +2 -1
  117. data/app/pb_kits/playbook/pb_select/select.html.erb +2 -1
  118. data/app/pb_kits/playbook/pb_selectable_card/selectable_card.html.erb +2 -1
  119. data/app/pb_kits/playbook/pb_selectable_card_icon/selectable_card_icon.html.erb +2 -1
  120. data/app/pb_kits/playbook/pb_selectable_icon/selectable_icon.html.erb +2 -1
  121. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.html.erb +2 -1
  122. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.html.erb +2 -1
  123. data/app/pb_kits/playbook/pb_source/source.html.erb +2 -1
  124. data/app/pb_kits/playbook/pb_star_rating/star_rating.html.erb +2 -1
  125. data/app/pb_kits/playbook/pb_stat_change/stat_change.html.erb +2 -1
  126. data/app/pb_kits/playbook/pb_stat_value/stat_value.html.erb +2 -1
  127. data/app/pb_kits/playbook/pb_table/table.html.erb +4 -2
  128. data/app/pb_kits/playbook/pb_table/table_body.html.erb +5 -3
  129. data/app/pb_kits/playbook/pb_table/table_cell.html.erb +5 -3
  130. data/app/pb_kits/playbook/pb_table/table_head.html.erb +5 -3
  131. data/app/pb_kits/playbook/pb_table/table_header.html.erb +5 -3
  132. data/app/pb_kits/playbook/pb_table/table_row.html.erb +5 -3
  133. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +0 -1
  134. data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +5 -1
  135. data/app/pb_kits/playbook/pb_text_input/text_input.html.erb +2 -1
  136. data/app/pb_kits/playbook/pb_text_input/text_input.rb +2 -1
  137. data/app/pb_kits/playbook/pb_text_input/text_input.test.js +1 -1
  138. data/app/pb_kits/playbook/pb_textarea/textarea.html.erb +2 -1
  139. data/app/pb_kits/playbook/pb_time/time.html.erb +2 -1
  140. data/app/pb_kits/playbook/pb_time_range_inline/time_range_inline.html.erb +3 -2
  141. data/app/pb_kits/playbook/pb_time_stacked/time_stacked.html.erb +2 -1
  142. data/app/pb_kits/playbook/pb_timeline/item.html.erb +2 -1
  143. data/app/pb_kits/playbook/pb_timeline/timeline.html.erb +2 -1
  144. data/app/pb_kits/playbook/pb_timestamp/timestamp.html.erb +2 -1
  145. data/app/pb_kits/playbook/pb_title/title.html.erb +3 -2
  146. data/app/pb_kits/playbook/pb_title_count/title_count.html.erb +2 -1
  147. data/app/pb_kits/playbook/pb_title_detail/title_detail.html.erb +2 -1
  148. data/app/pb_kits/playbook/pb_toggle/toggle.html.erb +2 -1
  149. data/app/pb_kits/playbook/pb_tooltip/tooltip.html.erb +2 -1
  150. data/app/pb_kits/playbook/pb_typeahead/typeahead.html.erb +2 -1
  151. data/app/pb_kits/playbook/pb_user/user.html.erb +2 -1
  152. data/app/pb_kits/playbook/pb_user_badge/user_badge.html.erb +2 -1
  153. data/app/pb_kits/playbook/pb_weekday_stacked/weekday_stacked.html.erb +2 -1
  154. data/app/pb_kits/playbook/utilities/_positioning.scss +23 -10
  155. data/app/pb_kits/playbook/utilities/globalProps.ts +52 -9
  156. data/dist/playbook-rails.js +4 -4
  157. data/lib/playbook/bottom.rb +6 -3
  158. data/lib/playbook/kit_base.rb +18 -0
  159. data/lib/playbook/left.rb +6 -3
  160. data/lib/playbook/right.rb +6 -3
  161. data/lib/playbook/top.rb +6 -3
  162. data/lib/playbook/version.rb +1 -1
  163. metadata +15 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f7cfb7021f51c07eb77a7166393965f50d634939c88a3d7b2a72890fc8f76aea
4
- data.tar.gz: 4e0fd0437700056b9fcd95076dd5f700e89b616cf83f97ef9f96ae50c205352f
3
+ metadata.gz: 862f27be95870b310dd89d38cd466bca0175ffa286df0b80b62c581e604e9db4
4
+ data.tar.gz: 31c27ba009fba844f070688d282d59631f86091635854517ea3714c7fae6ad8c
5
5
  SHA512:
6
- metadata.gz: '09e5b5458d55ae87b2f8ccd44d3f8dc9a95391b8e8ae5493fa5f05408acfe0bd5f2db7c84343fa450bbc05299a597fc8bf6ca48d9976eeac0b1720d353b0cba7'
7
- data.tar.gz: e360ce6a4f2074667af1b2e8a9067fd28e8e7a6f30136d04a69c7f7e3f1dcda3835d4cf4663be4e816dd89909698b4c9b0ac8991ff779b3666e845239dd5afa8
6
+ metadata.gz: 67145d68c85367df0bf1c7bf5d409955e27a5e9c0a170dfa0139a215471cbd4b93ccf53b94a7f2d4448f0da4adcee9a3fa02a7ea6636df8b540bef34a19a027d
7
+ data.tar.gz: 819ba714430f9efd7109f822dbb20e01d7e00d004557522fe51a6290d024af97d23ba401365398192bce5f4f2f132db4526433093664e58091d9e27f749f7bf1
@@ -81,7 +81,7 @@ const MOCK_DATA = [
81
81
  graduatedStudents: "43",
82
82
  children: [
83
83
  {
84
- year: "2011",
84
+ year: "2021",
85
85
  quarter: "Q1",
86
86
  month: "February",
87
87
  day: "15",
@@ -173,7 +173,7 @@ const MOCK_DATA = [
173
173
  graduatedStudents: "43",
174
174
  children: [
175
175
  {
176
- year: "2011",
176
+ year: "2022",
177
177
  quarter: "Q1",
178
178
  month: "May",
179
179
  day: "2",
@@ -16,42 +16,27 @@ export const updateExpandAndCollapseState = (
16
16
  expanded: Record<string, boolean>,
17
17
  targetParent: string
18
18
  ) => {
19
- const updateExpandedRows: Record<string, boolean> = {}
20
- const rows = tableRows.flatRows
21
- // Variable checks if all rows in a section have same expansion state or not
22
- let isExpansionConsistent = true
23
- const areRowsExpanded = new Set<boolean>()
19
+ const updateExpandedRows: Record<string, boolean> = {};
20
+ const rows = tableRows.rows;
21
+
22
+ let isExpansionConsistent = true;
23
+ const areRowsExpanded = new Set<boolean>();
24
24
 
25
- // Update isExpansionConsistent variable
26
25
  for (const row of rows) {
27
- if (
28
- targetParent === undefined
29
- ? row.depth === 0
30
- : targetParent === row.parentId
31
- ) {
32
- areRowsExpanded.add(row.getIsExpanded())
33
- if (areRowsExpanded.size > 1) {
34
- isExpansionConsistent = false
35
- break
36
- }
37
- }
38
- }
26
+ const shouldBeUpdated = targetParent === undefined ? row.depth === 0 : targetParent === row.parentId;
27
+
28
+ if (shouldBeUpdated) {
29
+ const isExpanded = row.getIsExpanded();
30
+ areRowsExpanded.add(isExpanded);
39
31
 
40
- // The if statement runs only for row depth 0, the else statement for the rest
41
- if (targetParent === undefined) {
42
- rows.forEach(row => {
43
- if (row.depth === 0) {
44
- updateExpandedRows[row.id] = !isExpansionConsistent
45
- ? true
46
- : !row.getIsExpanded()
47
- }
48
- })
49
- } else {
50
- for (const row of rows) {
51
- if (targetParent === row.parentId) {
52
- updateExpandedRows[row.id] = !isExpansionConsistent
53
- ? true
54
- : !row.getIsExpanded()
32
+ updateExpandedRows[row.id] = !isExpansionConsistent ? true : !isExpanded;
33
+
34
+ if (areRowsExpanded.size > 1) {
35
+ isExpansionConsistent = false;
36
+ // If expansion inconsistent, ensure all target rows are set to expand
37
+ for (const key in updateExpandedRows) {
38
+ updateExpandedRows[key] = true;
39
+ }
55
40
  }
56
41
  }
57
42
  }
@@ -59,5 +44,5 @@ export const updateExpandAndCollapseState = (
59
44
  return filterExpandableRows({
60
45
  ...(expanded as ExpandedStateObject),
61
46
  ...updateExpandedRows,
62
- })
63
- }
47
+ });
48
+ };
@@ -83,12 +83,17 @@
83
83
 
84
84
  // Vertical separator
85
85
  .table-header-cells:first-child,
86
- td:first-child {
87
- box-shadow: 1px 0px 0px 0px #e4e8f0 !important;
86
+ td:first-child,
87
+ .pb_table_td:first-child {
88
+ box-shadow: 1px 0px 0px 0px $border_light !important;
88
89
  }
89
90
 
90
91
  @include chrome_styles($border-color);
91
92
 
93
+ tr:hover {
94
+ position: relative;
95
+ }
96
+
92
97
  &.dark {
93
98
  .bg-white {
94
99
  background: $bg_dark_card;
@@ -195,14 +195,13 @@ const AdvancedTable = (props: AdvancedTableProps) => {
195
195
  }
196
196
  }, [loading, updateLoadingStateRowCount])
197
197
 
198
- const handleExpandOrCollapse = (row: Row<GenericObject>) => {
198
+ const handleExpandOrCollapse = async (row: Row<GenericObject>) => {
199
199
  onToggleExpansionClick && onToggleExpansionClick(row)
200
-
201
- const expandedState = expanded
202
- const targetParent = row?.parentId
203
- return setExpanded(
204
- updateExpandAndCollapseState(tableRows, expandedState, targetParent)
205
- )
200
+
201
+ const expandedState = expanded;
202
+ const targetParent = row?.parentId;
203
+ const updatedRows = await updateExpandAndCollapseState(tableRows, expandedState, targetParent)
204
+ setExpanded(updatedRows)
206
205
  }
207
206
 
208
207
  const ariaProps = buildAriaProps(aria)
@@ -0,0 +1,14 @@
1
+ <%= content_tag(:div,
2
+ aria: object.aria,
3
+ class: object.classname,
4
+ data: object.data,
5
+ id: object.id) do %>
6
+ <%= pb_rails("table", props: { size: "sm", tag:"div", data_table: true, number_spacing:"tabular", responsive:"none" }) do %>
7
+ <% if content.present? %>
8
+ <% content.presence %>
9
+ <% else %>
10
+ <%= pb_rails("advanced_table/table_header", props: {column_definitions: object.column_definitions, enable_toggle_expansion: object.enable_toggle_expansion }) %>
11
+ <%= pb_rails("advanced_table/table_body", props: {table_data: object.table_data, column_definitions: object.column_definitions}) %>
12
+ <% end %>
13
+ <% end %>
14
+ <% end %>
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbAdvancedTable
5
+ class AdvancedTable < Playbook::KitBase
6
+ prop :table_data, type: Playbook::Props::Array,
7
+ default: []
8
+ prop :column_definitions, type: Playbook::Props::Array,
9
+ default: []
10
+ prop :enable_toggle_expansion, type: Playbook::Props::Enum,
11
+ values: %w[all header none],
12
+ default: "header"
13
+
14
+ def classname
15
+ generate_classname("pb_advanced_table")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,5 @@
1
1
  import React, {useState} from "react"
2
- import { render, screen } from "../utilities/test-utils"
2
+ import { render, screen, waitFor } from "../utilities/test-utils"
3
3
 
4
4
  import { AdvancedTable } from "../"
5
5
 
@@ -198,7 +198,7 @@ test("Row toggle button exists and toggles subrows open and closed", () => {
198
198
  expect(subRow).toBeInTheDocument()
199
199
  })
200
200
 
201
- test("toggleExpansionAll button exists and toggles subrows open and closed", () => {
201
+ test("toggleExpansionAll button exists and toggles subrows open and closed", async () => {
202
202
  render(
203
203
  <AdvancedTable
204
204
  columnDefinitions={columnDefinitions}
@@ -207,16 +207,22 @@ test("toggleExpansionAll button exists and toggles subrows open and closed", ()
207
207
  />
208
208
  )
209
209
 
210
- const kit = screen.getByTestId(testId)
211
- const toggleButton = kit.querySelector(".gray-icon.toggle-all-icon")
212
- expect(toggleButton).toBeInTheDocument()
213
- const subRow1 = kit.querySelector(".bg-white.depth-sub-row-1")
214
- expect(subRow1).not.toBeInTheDocument()
215
- toggleButton.click()
216
- const subRow = kit.querySelector(".bg-white.depth-sub-row-1")
217
- expect(subRow).toBeInTheDocument()
210
+ const kit = screen.getByTestId(testId);
211
+ const toggleButton = kit.querySelector(".gray-icon.toggle-all-icon");
212
+ expect(toggleButton).toBeInTheDocument();
213
+
214
+ const subRow1 = kit.querySelector(".bg-white.depth-sub-row-1");
215
+ expect(subRow1).not.toBeInTheDocument();
216
+
217
+ toggleButton.click();
218
+
219
+ await waitFor(() => {
220
+ const subRow = kit.querySelector(".bg-white.depth-sub-row-1");
221
+ expect(subRow).toBeInTheDocument();
222
+ })
218
223
  })
219
224
 
225
+
220
226
  test("loading state + initialLoadingRowCount prop", () => {
221
227
  render(
222
228
  <AdvancedTable
@@ -1,4 +1,6 @@
1
1
  examples:
2
+ # rails:
3
+ # - advanced_table_default: Default (Required Props)
2
4
  react:
3
5
  - advanced_table_default: Default (Required Props)
4
6
  - advanced_table_loading: Loading State
@@ -0,0 +1,9 @@
1
+ <%= content_tag(:div,
2
+ aria: object.aria,
3
+ class: object.classname,
4
+ data: object.data,
5
+ id: object.id) do %>
6
+ <% object.table_data.each do |row| %>
7
+ <%= render_row_and_children(row, object.column_definitions) %>
8
+ <% end %>
9
+ <% end %>
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbAdvancedTable
5
+ class TableBody < Playbook::KitBase
6
+ prop :table_data, type: Playbook::Props::Array,
7
+ default: []
8
+ prop :column_definitions, type: Playbook::Props::Array,
9
+ default: []
10
+
11
+ def render_row_and_children(row, column_definitions, current_depth = 0)
12
+ output = ActiveSupport::SafeBuffer.new
13
+
14
+ output << pb_rails("advanced_table/table_row", props: { row: row, column_definitions: column_definitions, depth: current_depth })
15
+
16
+ if row[:children].present?
17
+ row[:children].each do |child_row|
18
+ output << render_row_and_children(child_row, column_definitions, current_depth + 1)
19
+ end
20
+ end
21
+
22
+ output
23
+ end
24
+
25
+ def classname
26
+ generate_classname("pb_advanced_table_body", "pb_table_tbody", separator: " ")
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ <%= content_tag(:div,
2
+ aria: object.aria,
3
+ class: object.classname,
4
+ data: object.data,
5
+ id: object.id) do %>
6
+ <%= pb_rails("table/table_row", props: {tag:"div"}) do %>
7
+ <% object.column_definitions.each_with_index do |item, index| %>
8
+ <%= pb_rails("table/table_header", props: { tag:"div", id:item[:accessor], classname:object.th_classname}) do %>
9
+ <%= pb_rails("flex", props:{ align: "center", justify: index.zero? ? "start" : "end", text_align:"end" }) do %>
10
+ <% if index.zero? && (object.enable_toggle_expansion == "header" || object.enable_toggle_expansion == "all") %>
11
+ <button class="gray-icon toggle-all-icon">
12
+ <%= pb_rails("icon", props: { icon: "arrows-from-line", cursor: "pointer", fixed_width: true, padding_right:"xs" }) %>
13
+ </button>
14
+ <% end %>
15
+ <%= item[:label] %>
16
+ <% end %>
17
+ <% end %>
18
+ <% end %>
19
+ <% end %>
20
+ <% end %>
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbAdvancedTable
5
+ class TableHeader < Playbook::KitBase
6
+ prop :column_definitions, type: Playbook::Props::Array,
7
+ default: []
8
+ prop :enable_toggle_expansion, type: Playbook::Props::Enum,
9
+ values: %w[all header none],
10
+ default: "header"
11
+
12
+ def classname
13
+ generate_classname("pb_advanced_table_header", "pb_table_thead", separator: " ")
14
+ end
15
+
16
+ def th_classname
17
+ generate_classname("table-header-cells", separator: " ")
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,37 @@
1
+ <%= content_tag(:div,
2
+ aria: object.aria,
3
+ class: object.classname,
4
+ data: object.data,
5
+ id: object.id) do %>
6
+ <% object.column_definitions.each_with_index do |column, index| %>
7
+ <%= pb_rails("table/table_cell", props: { tag:"div", classname:object.td_classname}) do %>
8
+ <%= pb_rails("flex", props:{ align: "center", justify: index.zero? ? "start" : "end" }) do %>
9
+ <div style="padding-left: <%= depth * 1.25 %>em">
10
+ <%= pb_rails("flex", props:{align: "center", column_gap: "xs"}) do %>
11
+ <% if index.zero? && object.row[:children].present? %>
12
+ <button class="gray-icon expand-toggle-icon">
13
+ <%= pb_rails("icon", props: { icon: "circle-play", cursor: "pointer" }) %>
14
+ </button>
15
+ <% end %>
16
+ <%= pb_rails("flex/flex_item", props:{padding_left: index.zero? && object.row[:children].present? ? "none" : "xs"}) do %>
17
+ <% if index.zero? %>
18
+ <% if object.depth.zero? %>
19
+ <%= object.row[column[:accessor].to_sym] %>
20
+ <% else %>
21
+ <% object.depth_accessors.each_with_index do |item, accessor_index| %>
22
+ <% if object.depth - 1 == accessor_index %>
23
+ <% key = item.to_sym %>
24
+ <%= object.row[key] %>
25
+ <% end %>
26
+ <% end %>
27
+ <% end %>
28
+ <% else %>
29
+ <%= object.row[column[:accessor].to_sym] %>
30
+ <% end %>
31
+ <% end %>
32
+ <% end %>
33
+ </div>
34
+ <% end %>
35
+ <% end %>
36
+ <% end %>
37
+ <% end %>
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbAdvancedTable
5
+ class TableRow < Playbook::KitBase
6
+ prop :column_definitions, type: Playbook::Props::Array,
7
+ default: []
8
+ prop :row
9
+ prop :depth
10
+
11
+ def classname
12
+ generate_classname("pb_table_tr", "bg-white", subrow_depth_classname, separator: " ")
13
+ end
14
+
15
+ def td_classname
16
+ generate_classname("id-cell", "chrome-styles", separator: " ")
17
+ end
18
+
19
+ def depth_accessors
20
+ column_definitions.flat_map do |column|
21
+ column[:cellAccessors] if column.key?(:cellAccessors)
22
+ end.compact
23
+ end
24
+
25
+ private
26
+
27
+ def subrow_depth_classname
28
+ depth.positive? ? "depth-sub-row-#{depth}" : ""
29
+ end
30
+ end
31
+ end
32
+ end
@@ -2,7 +2,8 @@
2
2
  id: object.id,
3
3
  data: object.data.merge(initials: object.initials),
4
4
  class: object.classname,
5
- aria: object.aria) do %>
5
+ aria: object.aria,
6
+ **combined_html_options) do %>
6
7
  <%= content_tag(:div, data: { initials: object.initials }, class: "avatar_wrapper") do %>
7
8
  <%= pb_rails("image", props: { alt: object.alt_text, url: object.image_url, on_error: object.handle_img_error }) if object.image_url.present? %>
8
9
  <% end %>
@@ -2,7 +2,8 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <% if object.tooltip_text.present? %>
7
8
  <%= pb_rails("tooltip", props: {
8
9
  trigger_element_id: object.tooltip_id,
@@ -7,7 +7,8 @@
7
7
  style: "background-image: url('#{object.image_url}');
8
8
  background-repeat: #{object.background_repeat};
9
9
  background-size: #{object.background_size};
10
- background-position: #{object.background_position};"
10
+ background-position: #{object.background_position};",
11
+ **combined_html_options
11
12
  ) do %>
12
13
  <%= content.presence %>
13
14
  <% end %>
@@ -2,6 +2,7 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <span><%= object.text %></span>
7
8
  <% end %>
@@ -2,6 +2,7 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <%= object.content %>
7
8
  <% end %>
@@ -1,4 +1,3 @@
1
- @import "../tokens/border_radius";
2
1
  @import "../tokens/colors";
3
2
  @import "../tokens/opacity";
4
3
  @import "../tokens/spacing";
@@ -10,11 +9,7 @@
10
9
  display: inline-flex;
11
10
  align-items: center;
12
11
  justify-content: center;
13
- border-radius: $border_rad_light;
14
12
  padding: 0 $space_xs/2;
15
- border-width: 1px;
16
- border-style: solid;
17
- border-color: $card_light;
18
13
 
19
14
  svg {
20
15
  margin-right: 8px;
@@ -44,8 +39,6 @@
44
39
  }
45
40
 
46
41
  &.dark {
47
- border-width: 0;
48
-
49
42
  @each $color_name, $color_value in $status_colors {
50
43
  &[class*=_#{$color_name}] {
51
44
  background: rgba(mix($bg_dark, $color_value, 10%), $opacity_2);
@@ -2,7 +2,8 @@
2
2
  id: object.id,
3
3
  data: object.data,
4
4
  class: object.classname,
5
- aria: object.aria) do%>
5
+ aria: object.aria,
6
+ **combined_html_options) do%>
6
7
  <%= content_tag(object.link ? 'a' : 'span', class: 'bread_crumb_item', href: object.link) do %>
7
8
  <%= content.presence %>
8
9
  <% end %>
@@ -2,6 +2,7 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <%= content.presence %>
7
8
  <% end %>
@@ -1,5 +1,6 @@
1
1
  <%= content_tag(object.tag,
2
- object.tag == "button" ? object.options : object.link_options) do %>
2
+ object.tag == "button" ? object.options : object.link_options,
3
+ **combined_html_options) do %>
3
4
  <% if object.variant === "reaction" %>
4
5
  <% if icon && object.valid_emoji(object.icon) %>
5
6
  <%= pb_rails("flex", props:{ align: "center" }) do %>
@@ -34,10 +34,8 @@ module Playbook
34
34
  default: "far"
35
35
 
36
36
  def options
37
- {
38
- aria: aria,
37
+ options = {
39
38
  class: classname,
40
- data: data,
41
39
  disabled: disabled,
42
40
  id: id,
43
41
  role: "button",
@@ -46,6 +44,7 @@ module Playbook
46
44
  value: value,
47
45
  form: form,
48
46
  }.compact
47
+ combined_html_options.merge!(options) if combined_html_options.present?
49
48
  end
50
49
 
51
50
  def target_attribute
@@ -2,6 +2,7 @@
2
2
  aria: object.aria,
3
3
  class: object.classname,
4
4
  data: object.data,
5
- id: object.id) do %>
5
+ id: object.id,
6
+ **combined_html_options) do %>
6
7
  <%= content.presence || object.text %>
7
8
  <% end %>
@@ -2,6 +2,7 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <%= content.presence || object.text %>
7
8
  <% end %>
@@ -3,7 +3,8 @@
3
3
  data: object.data,
4
4
  class: object.classname,
5
5
  aria: object.aria,
6
- dark: object.dark) do %>
6
+ dark: object.dark,
7
+ **combined_html_options) do %>
7
8
  <%= content.presence %>
8
9
  <% end %>
9
10
 
@@ -2,6 +2,7 @@
2
2
  id: object.id,
3
3
  data: object.data,
4
4
  class: object.classname,
5
- aria: object.aria) do %>
5
+ aria: object.aria,
6
+ **combined_html_options) do %>
6
7
  <%= content.presence %>
7
8
  <% end %>
@@ -2,6 +2,7 @@
2
2
  id: object.id,
3
3
  data: object.data,
4
4
  class: object.classname,
5
- aria: object.aria) do %>
5
+ aria: object.aria,
6
+ **combined_html_options) do %>
6
7
  <%= content.presence %>
7
8
  <% end %>
@@ -1,7 +1,9 @@
1
1
  <%= content_tag(:label, aria: object.aria,
2
2
  id: object.id,
3
3
  data: object.data,
4
- class: object.classname) do %>
4
+ class: object.classname,
5
+ **combined_html_options
6
+ ) do %>
5
7
  <%= content.presence || object.input %>
6
8
  <% if object.indeterminate %>
7
9
  <span class="pb_checkbox_indeterminate">
@@ -2,7 +2,8 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <%= pb_rails("button", props: {type: object.type, link: object.link, new_window:object.new_window, variant: object.variant, disabled: object.disabled, dark: object.dark}) do %>
7
8
  <%= pb_rails("icon", props: {icon: object.icon, fixed_width: true, dark: object.dark}) %>
8
9
  <% end %>
@@ -2,6 +2,7 @@
2
2
  aria: object.aria,
3
3
  class: object.classname,
4
4
  data: object.data,
5
- id: object.id) do %>
5
+ id: object.id,
6
+ **combined_html_options) do %>
6
7
  <%= content.presence %>
7
8
  <% end %>
@@ -2,6 +2,7 @@
2
2
  id: object.id,
3
3
  data: object.data,
4
4
  class: object.classname,
5
- aria: object.aria) do %>
5
+ aria: object.aria,
6
+ **combined_html_options) do %>
6
7
  <%= content.presence %>
7
8
  <% end %>
@@ -2,7 +2,8 @@
2
2
  id: object.id,
3
3
  data: object.data,
4
4
  class: object.classname,
5
- aria: object.aria) do %>
5
+ aria: object.aria,
6
+ **combined_html_options) do %>
6
7
 
7
8
  <%= pb_rails("flex", props: {vertical: "center", spacing: "between", cursor: "pointer"}) do %>
8
9
  <%= pb_rails("flex/flex_item") do %>
@@ -2,7 +2,8 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <%= pb_rails("body", props: {
7
8
  tag: "span",
8
9
  classname: "pb_contact_kit",
@@ -2,7 +2,8 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <%= pb_rails("caption", props: object.caption_props) %>
7
8
 
8
9
  <div class=<%= "pb_currency_wrapper#{object.variant_class || object.emphasized_class}" %>>