playbook_ui 14.13.0.pre.alpha.play1900progresspillwidth6122 → 14.13.0.pre.alpha.rails8compatible6228

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +0 -1
  3. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +3 -0
  4. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +6 -5
  5. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +8 -1
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_custom_cell.jsx +75 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props.html.erb +1 -1
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_rails.md +3 -1
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_react.md +1 -1
  10. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.html.erb +33 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_rails.md +3 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +2 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +2 -1
  14. data/app/pb_kits/playbook/pb_bar_graph/BarGraphStyles.scss +58 -0
  15. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_pb_styles.jsx +64 -0
  16. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_pb_styles.md +1 -0
  17. data/app/pb_kits/playbook/pb_bar_graph/docs/example.yml +1 -0
  18. data/app/pb_kits/playbook/pb_bar_graph/docs/index.js +1 -0
  19. data/app/pb_kits/playbook/pb_checkbox/_checkbox.tsx +17 -8
  20. data/app/pb_kits/playbook/pb_checkbox/checkbox.test.js +16 -0
  21. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_react_hook.jsx +69 -0
  22. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_react_hook.md +1 -0
  23. data/app/pb_kits/playbook/pb_checkbox/docs/example.yml +2 -1
  24. data/app/pb_kits/playbook/pb_checkbox/docs/index.js +1 -0
  25. data/app/pb_kits/playbook/pb_overlay/_overlay.tsx +4 -0
  26. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +37 -0
  27. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional_react.md +1 -0
  28. data/app/pb_kits/playbook/pb_overlay/docs/example.yml +1 -0
  29. data/app/pb_kits/playbook/pb_overlay/docs/index.js +1 -0
  30. data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +48 -10
  31. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.html.erb +1 -6
  32. data/app/pb_kits/playbook/pb_progress_simple/progress_simple.html.erb +1 -5
  33. data/app/pb_kits/playbook/pb_progress_step/progress_step.html.erb +1 -5
  34. data/app/pb_kits/playbook/pb_progress_step/progress_step_item.html.erb +1 -5
  35. data/app/pb_kits/playbook/pb_radio/radio.html.erb +6 -11
  36. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.jsx +1 -1
  37. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.html.erb +51 -0
  38. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click_rails.md +2 -0
  39. data/app/pb_kits/playbook/pb_table/docs/example.yml +1 -0
  40. data/app/pb_kits/playbook/pb_table/index.ts +41 -9
  41. data/app/pb_kits/playbook/pb_table/styles/_collapsible.scss +4 -0
  42. data/app/pb_kits/playbook/pb_table/table_row.html.erb +1 -0
  43. data/app/pb_kits/playbook/pb_table/table_row.rb +10 -1
  44. data/dist/chunks/{_typeahead-C_q1qAtC.js → _typeahead-PqkcDf1H.js} +3 -3
  45. data/dist/chunks/_weekday_stacked-C7J0S4f7.js +45 -0
  46. data/dist/chunks/{lib-WQEeEj3t.js → lib-D3us1bGD.js} +1 -1
  47. data/dist/chunks/{pb_form_validation-Cq64l4zn.js → pb_form_validation-BpihMSOQ.js} +1 -1
  48. data/dist/chunks/vendor.js +1 -1
  49. data/dist/menu.yml +0 -7
  50. data/dist/playbook-doc.js +1 -1
  51. data/dist/playbook-rails-react-bindings.js +1 -1
  52. data/dist/playbook-rails.js +1 -1
  53. data/dist/playbook.css +1 -1
  54. data/lib/playbook/version.rb +1 -1
  55. metadata +27 -25
  56. data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.scss +0 -66
  57. data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.tsx +0 -98
  58. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.html.erb +0 -28
  59. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.rb +0 -42
  60. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.html.erb +0 -19
  61. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.jsx +0 -26
  62. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.html.erb +0 -10
  63. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.jsx +0 -17
  64. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_on_click.jsx +0 -19
  65. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_onclick.html.erb +0 -16
  66. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.html.erb +0 -35
  67. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.jsx +0 -42
  68. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_tooltip.html.erb +0 -13
  69. data/app/pb_kits/playbook/pb_avatar_action_button/docs/example.yml +0 -15
  70. data/app/pb_kits/playbook/pb_avatar_action_button/docs/index.js +0 -4
  71. data/app/pb_kits/playbook/pb_avatar_action_button/pb_avatar_action_button.test.js +0 -31
  72. data/dist/chunks/_weekday_stacked-CB-T-41Z.js +0 -45
  73. /data/app/pb_kits/playbook/pb_table/docs/{_table_with_collapsible_with_custom_click.md → _table_with_collapsible_with_custom_click_react.md} +0 -0
@@ -1,3 +1,4 @@
1
1
  export { default as OverlayDefault } from './_overlay_default.jsx'
2
2
  export { default as OverlayMultiDirectional } from './_overlay_multi_directional.jsx'
3
3
  export { default as OverlayToggle } from './_overlay_toggle.jsx'
4
+ export { default as OverlayVerticalDynamicMultiDirectional } from './_overlay_vertical_dynamic_multi_directional.jsx'
@@ -1,5 +1,5 @@
1
- import React from 'react'
2
- import { OverlayChildrenProps } from '../_overlay'
1
+ import React, { useRef, useEffect, useState } from 'react';
2
+ import { OverlayChildrenProps } from '../_overlay';
3
3
 
4
4
  const previousOverlayDirectionMap: { [key: string]: string } = {
5
5
  "x": "left",
@@ -15,11 +15,40 @@ const OverlayToken = (props: OverlayChildrenProps) => {
15
15
  const {
16
16
  children,
17
17
  color,
18
+ dynamic,
18
19
  position,
19
20
  size,
20
21
  } = props
21
22
 
22
- const hasSubsequentOverlay = position === "x" || position === "y"
23
+ const scrollContainerRef = useRef<HTMLDivElement>(null);
24
+ const [isAtStart, setIsAtStart] = useState(true);
25
+ const [isAtEnd, setIsAtEnd] = useState(false);
26
+
27
+
28
+ const handleScroll = () => {
29
+ const container = scrollContainerRef.current;
30
+ if (container) {
31
+ const { scrollLeft, scrollWidth, clientWidth } = container;
32
+ const atStart = scrollLeft === 0;
33
+ const atEnd = scrollLeft + clientWidth >= scrollWidth - 1;
34
+
35
+ setIsAtStart(atStart);
36
+ setIsAtEnd(atEnd);
37
+ }
38
+ };
39
+
40
+ useEffect(() => {
41
+ const container = scrollContainerRef.current;
42
+ if (container) {
43
+ container.addEventListener('scroll', handleScroll);
44
+ handleScroll();
45
+ return () => {
46
+ container.removeEventListener('scroll', handleScroll);
47
+ };
48
+ }
49
+ }, []);
50
+
51
+ const hasSubsequentOverlay = position === "x" || position === "y";
23
52
 
24
53
  const getPreviousOverlayDirection = () => {
25
54
  return hasSubsequentOverlay ? previousOverlayDirectionMap[position] : position
@@ -34,15 +63,24 @@ const OverlayToken = (props: OverlayChildrenProps) => {
34
63
 
35
64
  return (
36
65
  <>
37
- <div className={previousOverlayClassName} />
38
-
39
- {children}
40
-
41
- { hasSubsequentOverlay &&
42
- <div className={subsequentOverlayClassName} />
66
+ <div className={dynamic ? isAtStart ? '' : previousOverlayClassName : previousOverlayClassName} />
67
+ {dynamic ?
68
+ <div
69
+ ref={scrollContainerRef}
70
+ style={{
71
+ overflowX: 'auto',
72
+ }}
73
+ >
74
+ {children}
75
+ </div>
76
+ :
77
+ children
78
+ }
79
+ {hasSubsequentOverlay &&
80
+ <div className={dynamic ? isAtEnd ? '' : subsequentOverlayClassName : subsequentOverlayClassName} />
43
81
  }
44
82
  </>
45
83
  )
46
84
  }
47
85
 
48
- export default OverlayToken
86
+ export default OverlayToken;
@@ -1,9 +1,4 @@
1
- <%= content_tag(:div,
2
- aria: object.aria_attributes,
3
- id: object.id,
4
- data: object.data,
5
- class: object.classname,
6
- **combined_html_options) do %>
1
+ <%= pb_content_tag do %>
7
2
 
8
3
  <div class="progress_pills_status">
9
4
  <% object.with_status do |status| %>
@@ -1,11 +1,7 @@
1
1
  <%= content_tag(:div,
2
2
  class: object.wrapper_classname,
3
3
  style: object.style) do %>
4
- <%= content_tag(:div,
5
- id: object.id,
6
- data: object.data_values,
7
- class: object.classname,
8
- **combined_html_options) do %>
4
+ <%= pb_content_tag do %>
9
5
  <%= content_tag(:div, "",
10
6
  class: "progress_simple_value",
11
7
  style: object.value_style) %>
@@ -1,7 +1,3 @@
1
- <%= content_tag(:ul,
2
- id: object.id,
3
- data: object.data,
4
- class: object.classname,
5
- **combined_html_options) do %>
1
+ <%= pb_content_tag(:ul) do %>
6
2
  <%= content.presence %>
7
3
  <% end %>
@@ -1,8 +1,4 @@
1
- <%= content_tag(:li,
2
- id: object.id,
3
- data: object.data,
4
- class: object.classname,
5
- **combined_html_options) do %>
1
+ <%= pb_content_tag(:li) do %>
6
2
  <div class="box" style="max-width: min-content;" id="<%= object.tooltip_trigger_class %>">
7
3
  <div class="circle">
8
4
  <%= pb_rails("icon", props: { icon: object.icon, size: "xs" }) if object.icon.present? %>
@@ -7,26 +7,21 @@
7
7
  data: object.data,
8
8
  **combined_html_options
9
9
  }) do %>
10
- <%= content_tag(:label,
10
+ <%= pb_content_tag(:label,
11
11
  'data-pb-radio-children': 'true',
12
12
  checked: object.checked,
13
- class: object.classname,
14
- id: object.id,
15
- value: object.value) do %>
13
+ value: object.value
14
+ ) do %>
16
15
  <%= input %>
17
16
  <span class="pb_radio_button"></span>
18
17
  <% end %>
19
18
  <div data-pb-radio-children-wrapper="true"> <%= content %> </div>
20
19
  <% end %>
21
20
  <% else %>
22
- <%= content_tag(:label,
23
- aria: object.aria,
21
+ <%= pb_content_tag(:label,
24
22
  checked: object.checked,
25
- class: object.classname,
26
- data: object.data,
27
- id: object.id,
28
23
  value: object.value,
29
- **combined_html_options) do %>
24
+ ) do %>
30
25
 
31
26
  <% if content.present? %>
32
27
  <%= content %>
@@ -37,4 +32,4 @@
37
32
  <span class="pb_radio_button"></span>
38
33
  <%= pb_rails("body", props: { status: object.body_status, text: object.text, dark: object.dark }) %>
39
34
  <% end %>
40
- <% end %>
35
+ <% end %>
@@ -16,7 +16,7 @@ const TableWithCollapsible = (props) => {
16
16
  );
17
17
  };
18
18
 
19
- return (
19
+ return (
20
20
  <Table
21
21
  size="sm"
22
22
  {...props}
@@ -0,0 +1,51 @@
1
+ <% content = capture do %>
2
+ <%= pb_rails("card", props: { border_none: true, border_radius: "none", padding: "md" }) do %>
3
+ <%= pb_rails("body", props: { text: "Nested content inside a Table Row" }) %>
4
+ <% end %>
5
+ <% end %>
6
+
7
+ <%= pb_rails("table", props: { size: "sm" }) do %>
8
+ <%= pb_rails("table/table_head") do %>
9
+ <%= pb_rails("table/table_row") do %>
10
+ <%= pb_rails("table/table_header", props: { text: "Column 1"}) %>
11
+ <%= pb_rails("table/table_header", props: { text: "Column 2"}) %>
12
+ <%= pb_rails("table/table_header", props: { text: "Column 3"}) %>
13
+ <%= pb_rails("table/table_header", props: { text: "Column 4"}) %>
14
+ <%= pb_rails("table/table_header", props: { text: "Column 5"}) %>
15
+ <%= pb_rails("table/table_header", props: { text: ""}) %>
16
+ <% end %>
17
+ <% end %>
18
+ <%= pb_rails("table/table_body") do %>
19
+ <%= pb_rails("table/table_row", props: { collapsible: true, collapsible_content: content, collapsible_side_highlight: true, toggle_cell_id: "cell-1", id: "5" }) do %>
20
+ <%= pb_rails("table/table_cell", props: { text: "Value 1"}) %>
21
+ <%= pb_rails("table/table_cell", props: { text: "Value 2"}) %>
22
+ <%= pb_rails("table/table_cell", props: { text: "Value 3"}) %>
23
+ <%= pb_rails("table/table_cell", props: { text: "Value 4"}) %>
24
+ <%= pb_rails("table/table_cell", props: { text: "Value 5"}) %>
25
+ <%= pb_rails("table/table_cell", props: { text_align: "right", id: "cell-1", cursor: "pointer" }) do %>
26
+ <%= pb_rails("icon", props: { icon: "chevron-down", fixed_width: true, color: "primary" }) %>
27
+ <% end %>
28
+ <% end %>
29
+ <%= pb_rails("table/table_row", props: { collapsible: true, collapsible_content: content, collapsible_side_highlight: true, toggle_cell_id: "cell-2", id: "6" }) do %>
30
+ <%= pb_rails("table/table_cell", props: { text: "Value 1"}) %>
31
+ <%= pb_rails("table/table_cell", props: { text: "Value 2"}) %>
32
+ <%= pb_rails("table/table_cell", props: { text: "Value 3"}) %>
33
+ <%= pb_rails("table/table_cell", props: { text: "Value 4"}) %>
34
+ <%= pb_rails("table/table_cell", props: { text: "Value 5"}) %>
35
+ <%= pb_rails("table/table_cell", props: { text_align: "right", id: "cell-2", cursor: "pointer" }) do %>
36
+ <%= pb_rails("icon", props: { icon: "chevron-down", fixed_width: true, color: "primary" }) %>
37
+ <% end %>
38
+ <% end %>
39
+ <%= pb_rails("table/table_row", props: { collapsible: true, collapsible_content: content, collapsible_side_highlight: true, toggle_cell_id: "cell-3", id: "7" }) do %>
40
+ <%= pb_rails("table/table_cell", props: { text: "Value 1"}) %>
41
+ <%= pb_rails("table/table_cell", props: { text: "Value 2"}) %>
42
+ <%= pb_rails("table/table_cell", props: { text: "Value 3"}) %>
43
+ <%= pb_rails("table/table_cell", props: { text: "Value 4"}) %>
44
+ <%= pb_rails("table/table_cell", props: { text: "Value 5"}) %>
45
+ <%= pb_rails("table/table_cell", props: { text_align: "right", id: "cell-3", cursor: "pointer" }) do %>
46
+ <%= pb_rails("icon", props: { icon: "chevron-down", fixed_width: true, color: "primary" }) %>
47
+ <% end %>
48
+ <% end %>
49
+ <% end %>
50
+ <% end %>
51
+
@@ -0,0 +1,2 @@
1
+ When using the `collapsible` prop, the default functionality is that the entire Row will be clickable to toggle the Row. To limit the click event to a specific Table Cell, you can use the `toggle_cell_id` prop to pass in the id of the Cell you want to use as the trigger.
2
+ __NOTE__: `toggle_cell_id` and the `id` on the Cell you want to use as the trigger MUST be the same. Please also be aware that you will need to pass in an `id` to any Table Rows you want to be collapsible. Make sure every `id` is unique if you are using multipe collapsibles.
@@ -31,6 +31,7 @@ examples:
31
31
  - table_with_subcomponents_as_divs: Table with Sub Components (Divs)
32
32
  - table_outer_padding: Outer Padding
33
33
  - table_with_collapsible: Table with Collapsible
34
+ - table_with_collapsible_with_custom_click: Table with Collapsible with Custom Click
34
35
  - table_with_collapsible_with_custom_content_rails: Table with Collapsible with Custom Content
35
36
  - table_with_collapsible_with_nested_rows_rails: Table with Collapsible with Nested Rows
36
37
  - table_with_collapsible_with_nested_table_rails: Table with Collapsible with Nested Table
@@ -2,6 +2,7 @@ import PbEnhancedElement from '../pb_enhanced_element'
2
2
 
3
3
  const TABLE_WRAPPER_SELECTOR = "[data-pb-table-wrapper]";
4
4
  const TABLE_COLLAPSIBLE_WRAPPER_SELECTOR = "[data-pb-table-collapsible-wrapper]";
5
+ const TABLE_COLLAPSIBLE_CELL_SELECTOR = "[data-pb-table-collapsible-cell-id]";
5
6
 
6
7
  export default class PbTable extends PbEnhancedElement {
7
8
  stickyLeftColumns: string[] = [];
@@ -158,18 +159,49 @@ export default class PbTable extends PbEnhancedElement {
158
159
  }
159
160
 
160
161
  handleCollapsibleClick() {
162
+ const cells = this.element.querySelectorAll(TABLE_COLLAPSIBLE_CELL_SELECTOR);
161
163
  const collapsibleElements = this.element.querySelectorAll(TABLE_COLLAPSIBLE_WRAPPER_SELECTOR);
162
- collapsibleElements.forEach((collapsibleElement) => {
163
- collapsibleElement.addEventListener('click', (event) => {
164
- document.dispatchEvent(new CustomEvent(`collapsed-toggle${(event.currentTarget as HTMLElement).id}`))
165
-
166
- const toggleElements = this.element.querySelectorAll(`.collapsible_border_toggle${(event.currentTarget as HTMLElement).id}`);
167
- toggleElements.forEach(element => {
168
- element.classList.toggle('no-border');
169
- element.classList.toggle('border-active');
164
+
165
+ if (cells.length > 0) {
166
+ cells.forEach((cell) => {
167
+ const cellId = (cell as HTMLElement).dataset.pbTableCollapsibleCellId;
168
+
169
+ Array.from(cell.children).forEach((child) => {
170
+ if (child.id === cellId) {
171
+ Array.from(child.children).forEach((svgChild) => {
172
+ svgChild.id = cellId; // Assign cellId to SVG child
173
+ Array.from(svgChild.children).forEach((pathChild) => {
174
+ pathChild.id = cellId; // Assign cellId to path child
175
+ });
176
+ });
177
+ }
178
+ });
179
+ cell.addEventListener('click', (event) => {
180
+ if ((event.target as HTMLElement).id) {
181
+ document.dispatchEvent(new CustomEvent(`collapsed-toggle${(event.currentTarget as HTMLElement).id}`));
182
+
183
+ const toggleElements = this.element.querySelectorAll(`.collapsible_border_toggle${(event.currentTarget as HTMLElement).id}`);
184
+ toggleElements.forEach((element) => {
185
+ element.classList.toggle('no-border');
186
+ element.classList.toggle('border-active');
187
+ });
188
+ }
170
189
  });
190
+ });
191
+
192
+ } else {
193
+ collapsibleElements.forEach((collapsibleElement) => {
194
+ collapsibleElement.addEventListener('click', (event) => {
195
+ document.dispatchEvent(new CustomEvent(`collapsed-toggle${(event.currentTarget as HTMLElement).id}`))
196
+
197
+ const toggleElements = this.element.querySelectorAll(`.collapsible_border_toggle${(event.currentTarget as HTMLElement).id}`);
198
+ toggleElements.forEach(element => {
199
+ element.classList.toggle('no-border');
200
+ element.classList.toggle('border-active');
201
+ });
202
+ })
171
203
  })
172
- })
204
+ }
173
205
  }
174
206
 
175
207
  handleCollapsibleRow() {
@@ -37,6 +37,10 @@
37
37
  cursor: pointer;
38
38
  }
39
39
 
40
+ .collapsible_cell {
41
+ cursor: default;
42
+ }
43
+
40
44
  .no-border {
41
45
  border-bottom: none !important;
42
46
  }
@@ -5,6 +5,7 @@
5
5
  data: object.data.merge(id: object.id),
6
6
  id: object.id,
7
7
  'data-pb-table-collapsible-wrapper' => true,
8
+ 'data-pb-table-collapsible-cell-id' => object.toggle_cell_id,
8
9
  **combined_html_options) do %>
9
10
  <%= content.presence %>
10
11
  <% end %>
@@ -13,13 +13,14 @@ module Playbook
13
13
  prop :collapsible_content
14
14
  prop :collapsible_side_highlight, type: Playbook::Props::Boolean,
15
15
  default: true
16
+ prop :toggle_cell_id, type: Playbook::Props::String
16
17
  prop :draggable_item, type: Playbook::Props::Boolean,
17
18
  default: false
18
19
  prop :drag_id, type: Playbook::Props::String,
19
20
  default: nil
20
21
 
21
22
  def classname
22
- generate_classname("pb_table_row_kit", side_highlight_class) + tag_class
23
+ generate_classname("pb_table_row_kit", side_highlight_class) + tag_class + collapsible_cell_class
23
24
  end
24
25
 
25
26
  def side_highlight_class
@@ -29,6 +30,14 @@ module Playbook
29
30
  def tag_class
30
31
  " pb_table_tr"
31
32
  end
33
+
34
+ def collapsible_cell_class
35
+ if toggle_cell_id
36
+ " collapsible_cell"
37
+ else
38
+ ""
39
+ end
40
+ end
32
41
  end
33
42
  end
34
43
  end