playbook_ui 13.28.0.pre.alpha.PBNTR296dropdownwithform2941 → 13.28.0.pre.alpha.PBNTR297gradientoverlay3029

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +3 -3
  3. data/app/pb_kits/playbook/index.js +3 -0
  4. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +2 -2
  5. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_subrow_headers.html.erb +40 -0
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_subrow_headers.md +3 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_subrow_headers.md +1 -1
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +1 -1
  9. data/app/pb_kits/playbook/pb_advanced_table/table_body.html.erb +1 -1
  10. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +14 -4
  11. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +10 -2
  12. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +1 -1
  13. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +2 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.html.erb +34 -0
  15. data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.rb +31 -0
  16. data/app/pb_kits/playbook/pb_bar_graph/_bar_graph.tsx +4 -1
  17. data/app/pb_kits/playbook/pb_bar_graph/barGraph.test.js +31 -0
  18. data/app/pb_kits/playbook/pb_bar_graph/bar_graph.rb +16 -0
  19. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_custom.md +2 -1
  20. data/app/pb_kits/playbook/pb_bar_graph/docs/{_bar_graph_custom.html.erb → _bar_graph_custom_rails.html.erb} +3 -3
  21. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_custom_rails.md +2 -0
  22. data/app/pb_kits/playbook/pb_bar_graph/docs/example.yml +1 -1
  23. data/app/pb_kits/playbook/pb_card/_card_mixin.scss +2 -1
  24. data/app/pb_kits/playbook/pb_checkbox/_checkbox.scss +1 -2
  25. data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.tsx +9 -3
  26. data/app/pb_kits/playbook/pb_circle_chart/circleChart.test.js +45 -0
  27. data/app/pb_kits/playbook/pb_circle_chart/circle_chart.rb +22 -1
  28. data/app/pb_kits/playbook/pb_collapsible/__snapshots__/collapsible.test.js.snap +53 -0
  29. data/app/pb_kits/playbook/pb_collapsible/_collapsible.tsx +14 -8
  30. data/app/pb_kits/playbook/pb_collapsible/collapsible.test.js +24 -0
  31. data/app/pb_kits/playbook/pb_dashboard/pbChartsDarkTheme.ts +7 -1
  32. data/app/pb_kits/playbook/pb_dashboard/pbChartsLightTheme.ts +9 -1
  33. data/app/pb_kits/playbook/pb_draggable/_draggable.scss +10 -0
  34. data/app/pb_kits/playbook/pb_draggable/_draggable.tsx +53 -0
  35. data/app/pb_kits/playbook/pb_draggable/context/index.tsx +92 -0
  36. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_default.jsx +53 -0
  37. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_multiple_containers.jsx +159 -0
  38. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_cards.jsx +121 -0
  39. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +9 -0
  40. data/app/pb_kits/playbook/pb_draggable/docs/index.js +3 -0
  41. data/app/pb_kits/playbook/pb_draggable/draggable.test.jsx +65 -0
  42. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableContainer.tsx +54 -0
  43. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +57 -0
  44. data/app/pb_kits/playbook/pb_form_group/_form_group.scss +2 -2
  45. data/app/pb_kits/playbook/pb_gauge/_gauge.tsx +4 -1
  46. data/app/pb_kits/playbook/pb_gauge/gauge.rb +6 -1
  47. data/app/pb_kits/playbook/pb_gauge/gauge.test.js +35 -0
  48. data/app/pb_kits/playbook/pb_line_graph/_line_graph.tsx +8 -2
  49. data/app/pb_kits/playbook/pb_line_graph/lineGraph.test.js +52 -0
  50. data/app/pb_kits/playbook/pb_line_graph/line_graph.rb +22 -1
  51. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +12 -0
  52. data/app/pb_kits/playbook/pb_overlay/_overlay.tsx +93 -0
  53. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_default.jsx +40 -0
  54. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_default.md +7 -0
  55. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_multi_directional.jsx +36 -0
  56. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_multi_directional.md +5 -0
  57. data/app/pb_kits/playbook/pb_overlay/docs/example.yml +4 -0
  58. data/app/pb_kits/playbook/pb_overlay/docs/index.js +2 -0
  59. data/app/pb_kits/playbook/pb_overlay/overlay.test.jsx +66 -0
  60. data/app/pb_kits/playbook/pb_pill/docs/_description.md +1 -1
  61. data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +1 -0
  62. data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.tsx +30 -32
  63. data/app/pb_kits/playbook/pb_selectable_card/selectable_card.html.erb +0 -2
  64. data/app/pb_kits/playbook/pb_table/_table.tsx +5 -0
  65. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_column.jsx +33 -32
  66. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_column.md +1 -1
  67. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_column_rails.md +2 -0
  68. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row.jsx +33 -33
  69. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row.md +1 -1
  70. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row_rails.html.erb +34 -0
  71. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_row_rails.md +2 -0
  72. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data.jsx +51 -50
  73. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data.md +1 -1
  74. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data_rails.html.erb +54 -0
  75. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data_rails.md +2 -0
  76. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.jsx +37 -38
  77. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.md +1 -0
  78. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row_rails.html.erb +53 -0
  79. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row_rails.md +1 -0
  80. data/app/pb_kits/playbook/pb_table/docs/{_table_alignment_row.html.erb → _table_outer_padding.html.erb} +7 -7
  81. data/app/pb_kits/playbook/pb_table/docs/_table_outer_padding.jsx +76 -0
  82. data/app/pb_kits/playbook/pb_table/docs/_table_outer_padding.md +1 -0
  83. data/app/pb_kits/playbook/pb_table/docs/example.yml +9 -9
  84. data/app/pb_kits/playbook/pb_table/docs/index.js +1 -0
  85. data/app/pb_kits/playbook/pb_table/styles/_all.scss +1 -0
  86. data/app/pb_kits/playbook/pb_table/styles/_outer_padding.scss +21 -0
  87. data/app/pb_kits/playbook/pb_table/table.rb +14 -1
  88. data/app/pb_kits/playbook/pb_table/table.test.js +5 -1
  89. data/app/pb_kits/playbook/pb_tooltip/index.js +1 -0
  90. data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.tsx +12 -9
  91. data/app/pb_kits/playbook/pb_treemap_chart/treemapChart.test.js +61 -0
  92. data/app/pb_kits/playbook/pb_treemap_chart/treemap_chart.rb +6 -1
  93. data/app/pb_kits/playbook/playbook-doc.js +4 -0
  94. data/app/pb_kits/playbook/tokens/_vertical_align.scss +18 -0
  95. data/app/pb_kits/playbook/utilities/_vertical_align.scss +16 -0
  96. data/app/pb_kits/playbook/utilities/globalProps.ts +12 -1
  97. data/dist/menu.yml +7 -2
  98. data/dist/playbook-rails.js +6 -6
  99. data/lib/playbook/classnames.rb +1 -0
  100. data/lib/playbook/kit_base.rb +2 -0
  101. data/lib/playbook/version.rb +1 -1
  102. data/lib/playbook/vertical_align.rb +37 -0
  103. metadata +50 -7
  104. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_data.html.erb +0 -63
  105. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.html.erb +0 -52
  106. /data/app/pb_kits/playbook/pb_table/docs/{_table_alignment_column.html.erb → _table_alignment_column_rails.html.erb} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 23b40f1dc75c9aeee50d8645aef9128ef124c62f6dbb8a1149dea01b62c8ed98
4
- data.tar.gz: f3d5ca8c8af146f9e223a24c92ca01a7d4b7df7703a9ad231b5bdfc3d727f9ad
3
+ metadata.gz: 7ebcd8e418a573194d60fc898d411fad574f050ac38957d6d73674a503ed522d
4
+ data.tar.gz: 9948ad7024a45406a248a22e02c40226f0b080ad09f85ca7f4169226b8368297
5
5
  SHA512:
6
- metadata.gz: d79b3d42d1756b4c750160ba105a7bfd4657117bc989337d80eba29a791a4dda4517b5c39ebb6b3235ee4b103756ff1ce982d027d3a59a3829c744598c814e90
7
- data.tar.gz: d5c618a19250c08bb283a029d4ac3d125ee40ab012815ed0b110c48abea28e7dc9aaab4bbf8b015f02b84ad0de58b91691fde89e7a84d90c380fc658c2477491
6
+ metadata.gz: 42c48a5990278c4c6b384d379c8b26b102beba5de1a420eb6f3678672cf0ff3de85eff4429d52ad85b8cfefd291faa325f01f6f07786680c04331b361e935fa2
7
+ data.tar.gz: 71c1b18be5c1883201ab005f05babbcdd92c1215c0a9839bffd1c633bbcbdccee7c6d46a1d2f712858a5ca53098fdd93d099d79bf2cf76f78bbe19019db6d30a
@@ -1,6 +1,3 @@
1
-
2
-
3
-
4
1
  @import 'pb_advanced_table/advanced_table';
5
2
  @import 'pb_avatar/avatar';
6
3
  @import 'pb_avatar_action_button/avatar_action_button';
@@ -31,6 +28,7 @@
31
28
  @import 'pb_detail/detail';
32
29
  @import 'pb_dialog/dialog';
33
30
  @import 'pb_distribution_bar/distribution_bar';
31
+ @import 'pb_draggable/draggable';
34
32
  @import 'pb_dropdown/dropdown';
35
33
  @import 'pb_file_upload/file_upload';
36
34
  @import 'pb_filter/filter';
@@ -64,6 +62,7 @@
64
62
  @import 'pb_multiple_users_stacked/multiple_users_stacked';
65
63
  @import 'pb_nav/nav';
66
64
  @import 'pb_online_status/online_status';
65
+ @import 'pb_overlay/overlay';
67
66
  @import 'pb_pagination/pagination';
68
67
  @import 'pb_passphrase/passphrase';
69
68
  @import 'pb_person/person';
@@ -121,3 +120,4 @@
121
120
  @import './utilities/text_align';
122
121
  @import './utilities/overflow';
123
122
  @import './utilities/truncate';
123
+ @import './utilities/vertical_align';
@@ -35,6 +35,8 @@ export { default as DateYearStacked } from './pb_date_year_stacked/_date_year_st
35
35
  export { default as Detail} from './pb_detail/_detail'
36
36
  export { default as Dialog } from './pb_dialog/_dialog'
37
37
  export { default as DistributionBar } from './pb_distribution_bar/_distribution_bar'
38
+ export { default as Draggable} from './pb_draggable/_draggable'
39
+ export { DraggableProvider} from './pb_draggable/context'
38
40
  export { default as Dropdown} from './pb_dropdown/_dropdown'
39
41
  export { default as FileUpload } from './pb_file_upload/_file_upload'
40
42
  export { default as Filter } from './pb_filter/_filter'
@@ -70,6 +72,7 @@ export { default as MultipleUsersStacked } from './pb_multiple_users_stacked/_mu
70
72
  export { default as Nav } from './pb_nav/_nav'
71
73
  export { default as NavItem } from './pb_nav/_item'
72
74
  export { default as OnlineStatus } from './pb_online_status/_online_status'
75
+ export { default as Overlay} from './pb_overlay/_overlay'
73
76
  export { default as Passphrase } from './pb_passphrase/_passphrase'
74
77
  export { default as PbReactPopover } from './pb_popover/_popover'
75
78
  export { default as Person } from './pb_person/_person'
@@ -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 }) %>
7
- <%= pb_rails("advanced_table/table_body", props: {table_data: object.table_data, column_definitions: object.column_definitions}) %>
6
+ <%= pb_rails("advanced_table/table_header", props: { column_definitions: object.column_definitions, enable_toggle_expansion: object.enable_toggle_expansion }) %>
7
+ <%= pb_rails("advanced_table/table_body", props: { id: object.id, table_data: object.table_data, column_definitions: object.column_definitions }) %>
8
8
  <% end %>
9
9
  <% end %>
10
10
  <% end %>
@@ -0,0 +1,40 @@
1
+ <%
2
+ column_definitions = [
3
+ {
4
+ accessor: "year",
5
+ label: "Year",
6
+ cellAccessors: ["quarter", "month", "day"],
7
+ },
8
+ {
9
+ accessor: "newEnrollments",
10
+ label: "New Enrollments",
11
+ },
12
+ {
13
+ accessor: "scheduledMeetings",
14
+ label: "Scheduled Meetings",
15
+ },
16
+ {
17
+ accessor: "attendanceRate",
18
+ label: "Attendance Rate",
19
+ },
20
+ {
21
+ accessor: "completedClasses",
22
+ label: "Completed Classes",
23
+ },
24
+ {
25
+ accessor: "classCompletionRate",
26
+ label: "Class Completion Rate",
27
+ },
28
+ {
29
+ accessor: "graduatedStudents",
30
+ label: "Graduated Students",
31
+ }
32
+ ]
33
+
34
+ subrow_headers = ["Quarter", "Month", "Day"]
35
+ %>
36
+
37
+ <%= pb_rails("advanced_table", props: { table_data: @table_data, column_definitions: column_definitions }) do %>
38
+ <%= pb_rails("advanced_table/table_header", props: { column_definitions: column_definitions }) %>
39
+ <%= pb_rails("advanced_table/table_body", props: { id: "subrow_headers", table_data: @table_data, column_definitions: column_definitions, subrow_headers: subrow_headers, enable_toggle_expansion: "all" }) %>
40
+ <% end %>
@@ -0,0 +1,3 @@
1
+ `subrow_headers` is an optional prop that if present will add header rows at each level of the nested data. The prop takes an array of strings, each string being the text for each header row. The array of strings must be in the order in which they need to be rendered in the UI according to depth.
2
+
3
+ `enable_toggle_expansion` is an additional optional prop that can be used in conjunction with the subRowHeaders prop. `enable_toggle_expansion` is a string that can be "all", "header" or "none". If set to "all", the toggle exapansion button will appear in the table header as well as in the subRow headers. If set to "header" button will only appear in header and NOT in subRow headers. This is set to "header" by default.
@@ -1,3 +1,3 @@
1
1
  `subRowHeaders` is an optional prop that if present will add header rows at each level of the nested data. The prop takes an array of strings, each string being the text for each header row. The array of strings must be in the order in which they need to be rendered in the UI according to depth.
2
2
 
3
- `enableToggleExpansion` is an additional optional prop that can be used in conjunction with the subRowHeaders prop. `enableToggleExpansion` is a string that can be 'all', 'header" or "none". If set to 'all', the toggle exapansion button will appear in the table header as well as in the subRow headers. If set to 'header' button will only appear in header and NOT in subRow headers. This is set to 'header' by default.
3
+ `enableToggleExpansion` is an additional optional prop that can be used in conjunction with the subRowHeaders prop. `enableToggleExpansion` is a string that can be "all", "header" or "none". If set to "all", the toggle exapansion button will appear in the table header as well as in the subRow headers. If set to "header" button will only appear in header and NOT in subRow headers. This is set to "header" by default.
@@ -1,6 +1,7 @@
1
1
  examples:
2
2
  rails:
3
3
  - advanced_table_beta: Default (Required Props)
4
+ - advanced_table_beta_subrow_headers: SubRow Headers
4
5
  react:
5
6
  - advanced_table_default: Default (Required Props)
6
7
  - advanced_table_loading: Loading State
@@ -12,4 +13,3 @@ examples:
12
13
  - advanced_table_table_options: Table Options
13
14
  - advanced_table_table_props: Table Props
14
15
  - advanced_table_inline_row_loading: inline Row Loading
15
-
@@ -1,5 +1,5 @@
1
1
  <%= pb_content_tag do %>
2
2
  <% object.table_data.each do |row| %>
3
- <%= render_row_and_children(row, object.column_definitions) %>
3
+ <%= render_row_and_children(row, object.column_definitions, 0, false) %>
4
4
  <% end %>
5
5
  <% end %>
@@ -3,20 +3,30 @@
3
3
  module Playbook
4
4
  module PbAdvancedTable
5
5
  class TableBody < Playbook::KitBase
6
+ prop :id, type: Playbook::Props::String,
7
+ default: ""
6
8
  prop :table_data, type: Playbook::Props::Array,
7
9
  default: []
8
10
  prop :column_definitions, type: Playbook::Props::Array,
9
11
  default: []
12
+ prop :enable_toggle_expansion, type: Playbook::Props::Enum,
13
+ values: %w[all header none],
14
+ default: "header"
15
+ prop :subrow_headers, type: Playbook::Props::Array,
16
+ default: []
10
17
 
11
- def render_row_and_children(row, column_definitions, current_depth = 0)
18
+ def render_row_and_children(row, column_definitions, current_depth, first_parent_child)
12
19
  output = ActiveSupport::SafeBuffer.new
20
+ is_first_child_of_subrow = current_depth.positive? && first_parent_child && subrow_headers[current_depth - 1].present?
13
21
 
14
- output << pb_rails("advanced_table/table_row", props: { row: row, column_definitions: column_definitions, depth: current_depth })
22
+ output << pb_rails("advanced_table/table_subrow_header", props: { row: row, column_definitions: column_definitions, depth: current_depth, subrow_header: subrow_headers[current_depth - 1] }) if is_first_child_of_subrow && enable_toggle_expansion == "all"
23
+
24
+ output << pb_rails("advanced_table/table_row", props: { id: id, row: row, column_definitions: column_definitions, depth: current_depth })
15
25
 
16
26
  if row[:children].present?
17
- output << content_tag(:div, class: "toggle-content", data: { advanced_table_content: row.object_id }) do
27
+ output << content_tag(:div, class: "toggle-content", data: { advanced_table_content: row.object_id.to_s + id }) do
18
28
  row[:children].map do |child_row|
19
- render_row_and_children(child_row, column_definitions, current_depth + 1)
29
+ render_row_and_children(child_row, column_definitions, current_depth + 1, row.children.first == child_row)
20
30
  end.join.html_safe
21
31
  end
22
32
  end
@@ -4,7 +4,7 @@
4
4
  <%= pb_rails("table/table_header", props: { tag:"div", id:item[:accessor], classname:object.th_classname}) do %>
5
5
  <%= pb_rails("flex", props:{ align: "center", justify: index.zero? ? "start" : "end", text_align:"end" }) do %>
6
6
  <% if index.zero? && (object.enable_toggle_expansion == "header" || object.enable_toggle_expansion == "all") %>
7
- <button class="gray-icon toggle-all-icon">
7
+ <button class="gray-icon toggle-all-icon" onclick="expandAllRows(this)">
8
8
  <%= pb_rails("icon", props: { icon: "arrows-from-line", cursor: "pointer", fixed_width: true, padding_right:"xs" }) %>
9
9
  </button>
10
10
  <% end %>
@@ -13,4 +13,12 @@
13
13
  <% end %>
14
14
  <% end %>
15
15
  <% end %>
16
- <% end %>
16
+ <% end %>
17
+
18
+ <script type="text/javascript">
19
+ var expandAllRows = (element) => {
20
+ element.closest('.pb_table').querySelectorAll('.pb_advanced_table_body > .pb_table_tr [data-advanced-table]').forEach((button) => {
21
+ button.dispatchEvent(new Event('click'));
22
+ });
23
+ };
24
+ </script>
@@ -5,7 +5,7 @@
5
5
  <div style="padding-left: <%= depth * 1.25 %>em">
6
6
  <%= pb_rails("flex", props:{align: "center", column_gap: "xs"}) do %>
7
7
  <% if index.zero? && object.row[:children].present? %>
8
- <button id="<%= object.row.object_id %>" class="gray-icon expand-toggle-icon" data-advanced-table="true" >
8
+ <button id="<%= object.row.object_id.to_s + object.id %>" class="gray-icon expand-toggle-icon" data-advanced-table="true" >
9
9
  <%= pb_rails("icon", props: { id: "advanced-table_open_icon", icon: "circle-play", cursor: "pointer" }) %>
10
10
  <%= pb_rails("icon", props: { id: "advanced-table_close_icon", display: "none", icon: "circle-play", cursor: "pointer", rotation: 90 }) %>
11
11
  </button>
@@ -3,6 +3,8 @@
3
3
  module Playbook
4
4
  module PbAdvancedTable
5
5
  class TableRow < Playbook::KitBase
6
+ prop :id, type: Playbook::Props::String,
7
+ default: ""
6
8
  prop :column_definitions, type: Playbook::Props::Array,
7
9
  default: []
8
10
  prop :row
@@ -0,0 +1,34 @@
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: "start" }) 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 toggle-all-icon" onclick="expandAllSubRows(this, <%= depth %>)">
13
+ <%= pb_rails("icon", props: { icon: "arrows-from-line", cursor: "pointer", fixed_width: true, padding_right:"xs" }) %>
14
+ </button>
15
+ <% end %>
16
+ <%= pb_rails("flex/flex_item") do %>
17
+ <% if index.zero? %>
18
+ <%= pb_rails("caption", props: { margin_left: object.row[:children].present? ? "none" : "xs", text: object.subrow_header }) %>
19
+ <% end %>
20
+ <% end %>
21
+ <% end %>
22
+ </div>
23
+ <% end %>
24
+ <% end %>
25
+ <% end %>
26
+ <% end %>
27
+
28
+ <script type="text/javascript">
29
+ var expandAllSubRows = (element, rowDepth) => {
30
+ element.closest(".toggle-content").querySelectorAll('.depth-sub-row-' + rowDepth + ' [data-advanced-table]').forEach((button) => {
31
+ button.dispatchEvent(new Event('click'));
32
+ });
33
+ };
34
+ </script>
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbAdvancedTable
5
+ class TableSubrowHeader < Playbook::KitBase
6
+ prop :column_definitions, type: Playbook::Props::Array,
7
+ default: []
8
+ prop :depth
9
+ prop :row
10
+ prop :enable_toggle_expansion, type: Playbook::Props::Enum,
11
+ values: %w[all header none],
12
+ default: "header"
13
+ prop :subrow_header, type: Playbook::Props::String,
14
+ default: ""
15
+
16
+ def classname
17
+ generate_classname("pb_table_tr", "bg-white", subrow_depth_classname, separator: " ")
18
+ end
19
+
20
+ def td_classname
21
+ generate_classname("id-cell", "chrome-styles", separator: " ")
22
+ end
23
+
24
+ private
25
+
26
+ def subrow_depth_classname
27
+ depth.positive? ? "depth-sub-row-#{depth}" : ""
28
+ end
29
+ end
30
+ end
31
+ end
@@ -163,6 +163,9 @@ if (Array.isArray(axisTitle) && axisTitle.length > 1 && axisTitle[1].name) {
163
163
  staticOptions.plotOptions.series.events = { legendItemClick: () => false };
164
164
  }
165
165
 
166
+ const filteredProps: any = {...props};
167
+ delete filteredProps.verticalAlign;
168
+
166
169
  const [options, setOptions] = useState({});
167
170
 
168
171
  useEffect(() => {
@@ -172,7 +175,7 @@ if (Array.isArray(axisTitle) && axisTitle.length > 1 && axisTitle[1].name) {
172
175
  return (
173
176
  <HighchartsReact
174
177
  containerProps={{
175
- className: classnames(globalProps(props), className),
178
+ className: classnames(globalProps(filteredProps), className),
176
179
  id: id,
177
180
  ...ariaProps,
178
181
  ...dataProps,
@@ -0,0 +1,31 @@
1
+ import React from 'react';
2
+ import { render, screen } from '../utilities/test-utils';
3
+ import BarGraph from './_bar_graph';
4
+
5
+ beforeEach(() => {
6
+ // Silences error logs within the test suite.
7
+ jest.spyOn(console, 'error');
8
+ jest.spyOn(console, 'warn');
9
+ console.error.mockImplementation(() => {});
10
+ console.warn.mockImplementation(() => {});
11
+ });
12
+
13
+ afterEach(() => {
14
+ console.error.mockRestore();
15
+ console.warn.mockRestore();
16
+ });
17
+
18
+ const testId = 'bargraph1';
19
+
20
+ test('bargraph uses exact classname', () => {
21
+ render(
22
+ <BarGraph
23
+ className='super_important_class'
24
+ data={{ testid: testId }}
25
+ id='bar-default'
26
+ />
27
+ );
28
+
29
+ const kit = screen.getByTestId(testId);
30
+ expect(kit).toHaveClass('super_important_class');
31
+ });
@@ -74,6 +74,22 @@ module Playbook
74
74
  standard_options.deep_merge(custom_options)
75
75
  end
76
76
 
77
+ def vertical_align_props
78
+ if vertical_align
79
+ if object.vertical_align
80
+ original_result = super
81
+ class_to_remove = "vertical_align_#{object.vertical_align}"
82
+
83
+ modified_result = original_result.gsub(class_to_remove, "").strip
84
+ modified_result.empty? ? nil : modified_result
85
+ else
86
+ super
87
+ end
88
+ else
89
+ super
90
+ end
91
+ end
92
+
77
93
  def classname
78
94
  generate_classname("pb_bar_graph")
79
95
  end
@@ -1 +1,2 @@
1
- See https://api.highcharts.com/highcharts/ for a comprehensive list of available options.
1
+ The `customOptions` prop provides comprehensive access to additional [Highcharts options](https://api.highcharts.com/highcharts/) that are not explicitly defined as props.
2
+ It's important to note that certain options may require specific script imports to function properly.
@@ -15,7 +15,7 @@
15
15
  data: [1111,677,3245,500,200]
16
16
  }] %>
17
17
 
18
- <% custom_options = {
18
+ <% bar_graph_options = {
19
19
  customOptions: {
20
20
  subtitle: {
21
21
  text: "Overwritten subtitle",
@@ -45,5 +45,5 @@
45
45
  y_axis_min: 0,
46
46
  subtitle: 'Subtitle to replace',
47
47
  title: 'Bar Graph with Custom Overrides',
48
- custom_options: custom_options
49
- }) %>
48
+ custom_options: bar_graph_options
49
+ }) %>
@@ -0,0 +1,2 @@
1
+ The `custom_options` prop provides comprehensive access to additional [Highcharts options](https://api.highcharts.com/highcharts/) that are not explicitly defined as props.
2
+ It's important to note that certain options may require specific script imports to function properly.
@@ -8,7 +8,7 @@ examples:
8
8
  - bar_graph_height: Height
9
9
  - bar_graph_spline: Spline
10
10
  - bar_graph_colors: Color Overrides
11
- - bar_graph_custom: Custom Overrides
11
+ - bar_graph_custom_rails: Custom Overrides
12
12
  - bar_graph_stacked: Stacked
13
13
  - bar_graph_negative_numbers: Negative Numbers
14
14
  - bar_graph_secondary_y_axis: Secondary Y-Axis
@@ -28,7 +28,8 @@ $pb_card_header_colors: map-merge(map-merge($product_colors, $additional_colors)
28
28
 
29
29
  @mixin pb_card_selected($border_color: $primary) {
30
30
  border-color: $border_color;
31
- border-width: $pb_card_border_width * 2;
31
+ border-width: $pb_card_border_width;
32
+ outline: 1px solid $border_color;
32
33
  }
33
34
 
34
35
  @mixin pb_card_selected_dark {
@@ -20,7 +20,6 @@ $transition: $transition_cubic;
20
20
  border: solid $border_light 2px;
21
21
  border-radius: $border_rad_light;
22
22
  height: 22px;
23
- position: relative;
24
23
  transition: background $transition_default ease, box-shadow $transition_default ease;
25
24
  width: 22px;
26
25
  .check_icon,
@@ -28,8 +27,8 @@ $transition: $transition_cubic;
28
27
  color: $white;
29
28
  height: 16px;
30
29
  left: 1px;
31
- position: relative;
32
30
  display: flex;
31
+ margin: auto;
33
32
  opacity: 0;
34
33
  width: 16px;
35
34
  &.hidden {
@@ -10,6 +10,7 @@ import { highchartsDarkTheme } from "../pb_dashboard/pbChartsDarkTheme";
10
10
  import mapColors from "../pb_dashboard/pbChartsColorsHelper";
11
11
  import { globalProps } from "../utilities/globalProps";
12
12
  import { buildAriaProps, buildDataProps, buildHtmlProps } from "../utilities/props";
13
+ import { merge } from 'lodash'
13
14
 
14
15
  type CircleChartProps = {
15
16
  align?: "left" | "right" | "center";
@@ -18,6 +19,7 @@ type CircleChartProps = {
18
19
  children?: Node;
19
20
  className?: string;
20
21
  colors?: string[];
22
+ customOptions?: Partial<Highcharts.Options>;
21
23
  dark?: boolean;
22
24
  data?: {[key: string]: string},
23
25
  dataLabelHtml?: string;
@@ -67,6 +69,7 @@ const CircleChart = ({
67
69
  children,
68
70
  className,
69
71
  colors = [],
72
+ customOptions = {},
70
73
  dark = false,
71
74
  data = {},
72
75
  dataLabelHtml = "<div>{point.name}</div>",
@@ -115,6 +118,9 @@ const CircleChart = ({
115
118
  innerSizes[size];
116
119
 
117
120
 
121
+ const filteredProps: any = {...props};
122
+ delete filteredProps.verticalAlign;
123
+
118
124
  const [options, setOptions] = useState({});
119
125
 
120
126
  useEffect(() => {
@@ -171,7 +177,7 @@ const CircleChart = ({
171
177
  ],
172
178
  credits: false,
173
179
  };
174
- setOptions({ ...staticOptions });
180
+ setOptions(merge(staticOptions, customOptions));
175
181
  }, [chartData]);
176
182
 
177
183
 
@@ -181,7 +187,7 @@ const CircleChart = ({
181
187
  <div id={`wrapper-circle-chart-${id}`}>
182
188
  <HighchartsReact
183
189
  containerProps={{
184
- className: classnames("pb_circle_chart", globalProps(props)),
190
+ className: classnames("pb_circle_chart", globalProps(filteredProps)),
185
191
  id: id,
186
192
  ...ariaProps,
187
193
  ...dataProps,
@@ -195,7 +201,7 @@ const CircleChart = ({
195
201
  ) : (
196
202
  <HighchartsReact
197
203
  containerProps={{
198
- className: classnames("pb_circle_chart", globalProps(props)),
204
+ className: classnames("pb_circle_chart", globalProps(filteredProps)),
199
205
  id: id,
200
206
  ...ariaProps,
201
207
  ...dataProps,
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import { render, screen } from '../utilities/test-utils';
3
+ import CircleChart from './_circle_chart';
4
+
5
+ beforeEach(() => {
6
+ // Silences error logs within the test suite.
7
+ jest.spyOn(console, 'error');
8
+ jest.spyOn(console, 'warn');
9
+ console.error.mockImplementation(() => {});
10
+ console.warn.mockImplementation(() => {});
11
+ });
12
+
13
+ afterEach(() => {
14
+ console.error.mockRestore();
15
+ console.warn.mockRestore();
16
+ });
17
+
18
+ const testId = 'circlechart1';
19
+
20
+ test('uses exact classname', () => {
21
+ const data = [
22
+ {
23
+ name: 'Waiting for Calls',
24
+ value: 41,
25
+ },
26
+ {
27
+ name: 'On Call',
28
+ value: 49,
29
+ },
30
+ {
31
+ name: 'After call',
32
+ value: 10,
33
+ },
34
+ ]
35
+ render(
36
+ <CircleChart
37
+ chartData={data}
38
+ data={{ testid: testId }}
39
+ id='circlechartid'
40
+ />
41
+ );
42
+
43
+ const kit = screen.getByTestId(testId);
44
+ expect(kit).toHaveClass('pb_circle_chart');
45
+ });
@@ -8,6 +8,7 @@ module Playbook
8
8
  default: "center"
9
9
  prop :chart_data, type: Playbook::Props::Array,
10
10
  default: []
11
+ prop :custom_options, default: {}
11
12
  prop :style, type: Playbook::Props::Enum,
12
13
  values: %w[pie],
13
14
  default: "pie"
@@ -40,7 +41,7 @@ module Playbook
40
41
  prop :x, type: Playbook::Props::Numeric
41
42
  prop :y, type: Playbook::Props::Numeric
42
43
 
43
- def chart_options
44
+ def standard_options
44
45
  {
45
46
  align: align,
46
47
  id: id,
@@ -68,6 +69,26 @@ module Playbook
68
69
  }
69
70
  end
70
71
 
72
+ def chart_options
73
+ standard_options.deep_merge(custom_options)
74
+ end
75
+
76
+ def vertical_align_props
77
+ if vertical_align
78
+ if object.vertical_align
79
+ original_result = super
80
+ class_to_remove = "vertical_align_#{object.vertical_align}"
81
+
82
+ modified_result = original_result.gsub(class_to_remove, "").strip
83
+ modified_result.empty? ? nil : modified_result
84
+ else
85
+ super
86
+ end
87
+ else
88
+ super
89
+ end
90
+ end
91
+
71
92
  def classname
72
93
  generate_classname("pb_circle_chart")
73
94
  end
@@ -0,0 +1,53 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`html structure is correct 1`] = `
4
+ <div>
5
+ <div
6
+ class="pb_collapsible_kit additional_class"
7
+ data-testid="collapsible1"
8
+ >
9
+ <div
10
+ class="pb_collapsible_main_kit cursor_pointer"
11
+ >
12
+ <div>
13
+ <div
14
+ class="pb_flex_kit_orientation_row_justify_content_left_align_items_center_spacing_between"
15
+ >
16
+ <div
17
+ class="pb_flex_item_kit"
18
+ >
19
+ <div>
20
+ Main Section
21
+ </div>
22
+ </div>
23
+ <div
24
+ class="pb_flex_item_kit"
25
+ >
26
+ <div
27
+ class="icon_wrapper"
28
+ style="vertical-align: middle; color: rgb(193, 205, 214);"
29
+ >
30
+ <i
31
+ class="pb_icon_kit far fa-fw fa-lg fa-chevron-down"
32
+ />
33
+ <span
34
+ aria-label="chevron-down icon"
35
+ hidden=""
36
+ />
37
+ </div>
38
+ </div>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ <div
43
+ class="pb_collapsible_content_kit toggle-content"
44
+ data-collapsible-content="true"
45
+ style="height: 0px;"
46
+ >
47
+ <div>
48
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel erat sed purus hendrerit viverra. Duis et vestibulum metus. Sed consequat ut ante non vehicula. Etiam nunc massa, pharetra vel quam id, posuere rhoncus quam. Quisque imperdiet arcu enim, nec aliquet justo auctor eget. Curabitur in metus nec nunc rhoncus faucibus vitae ac elit. Nulla facilisi. Vestibulum quis pretium nulla. Nulla ut accumsan velit. Duis varius urna sed sem tempor, sit amet fermentum nibh auctor. Praesent lorem arcu, egestas non ante quis, placerat pellentesque lectus.Vestibulum lacinia ipsum quis venenatis tristique. Vivamus suscipit, libero eu fringilla egestas, orci urna commodo arcu, vel gravida turpis ipsum molestie nibh. Donec cursus eu ante sagittis ultrices. Phasellus id sagittis risus. Mauris dapibus neque faucibus, tempor ligula vel, cursus ante. Donec faucibus gravida porta. Nullam egestas est quis aliquam feugiat. Sed eget metus diam. Cras eget placerat libero.
49
+ </div>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ `;