playbook_ui 14.13.0.pre.rc.10 → 14.14.0.pre.alpha.PBNTR888selectvaliditymessage6348

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 (168) 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 +66 -1
  4. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +9 -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.jsx +1 -0
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_rails.md +3 -1
  10. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_react.md +3 -1
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.html.erb +33 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.jsx +55 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_rails.md +3 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_react.md +3 -0
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +3 -0
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +3 -1
  17. data/app/pb_kits/playbook/pb_bar_graph/BarGraphStyles.scss +58 -0
  18. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_pb_styles.jsx +64 -0
  19. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_pb_styles.md +1 -0
  20. data/app/pb_kits/playbook/pb_bar_graph/docs/example.yml +1 -0
  21. data/app/pb_kits/playbook/pb_bar_graph/docs/index.js +1 -0
  22. data/app/pb_kits/playbook/pb_checkbox/_checkbox.tsx +17 -8
  23. data/app/pb_kits/playbook/pb_checkbox/checkbox.test.js +16 -0
  24. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_react_hook.jsx +69 -0
  25. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_react_hook.md +1 -0
  26. data/app/pb_kits/playbook/pb_checkbox/docs/example.yml +2 -1
  27. data/app/pb_kits/playbook/pb_checkbox/docs/index.js +1 -0
  28. data/app/pb_kits/playbook/pb_currency/_currency.tsx +46 -31
  29. data/app/pb_kits/playbook/pb_currency/currency.html.erb +15 -8
  30. data/app/pb_kits/playbook/pb_currency/currency.rb +17 -2
  31. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display.html.erb +22 -0
  32. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display.jsx +34 -0
  33. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display_rails.md +1 -0
  34. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display_react.md +1 -0
  35. data/app/pb_kits/playbook/pb_currency/docs/example.yml +2 -0
  36. data/app/pb_kits/playbook/pb_currency/docs/index.js +2 -1
  37. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +3 -1
  38. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_multiple_containers_rails.html.erb +99 -0
  39. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_multiple_containers_rails.md +1 -0
  40. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table.html.erb +61 -0
  41. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table.md +4 -0
  42. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table_react.jsx +90 -0
  43. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table_react.md +5 -0
  44. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +4 -5
  45. data/app/pb_kits/playbook/pb_draggable/docs/index.js +2 -1
  46. data/app/pb_kits/playbook/pb_draggable/draggable_container.html.erb +2 -2
  47. data/app/pb_kits/playbook/pb_draggable/draggable_container.rb +5 -0
  48. data/app/pb_kits/playbook/pb_draggable/draggable_item.html.erb +1 -1
  49. data/app/pb_kits/playbook/pb_draggable/draggable_item.rb +4 -0
  50. data/app/pb_kits/playbook/pb_draggable/index.js +151 -15
  51. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableContainer.tsx +7 -4
  52. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +6 -3
  53. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
  54. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +2 -1
  55. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +11 -7
  56. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_formatting.html.erb +11 -0
  57. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_formatting.jsx +22 -0
  58. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_formatting_rails.md +1 -0
  59. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_formatting_react.md +1 -0
  60. data/app/pb_kits/playbook/pb_home_address_street/docs/example.yml +2 -0
  61. data/app/pb_kits/playbook/pb_home_address_street/docs/index.js +1 -0
  62. data/app/pb_kits/playbook/pb_home_address_street/home_address_street.rb +13 -2
  63. data/app/pb_kits/playbook/pb_icon/icon.html.erb +2 -6
  64. data/app/pb_kits/playbook/pb_icon_button/_icon_button.tsx +71 -0
  65. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_default.html.erb +1 -2
  66. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_default.jsx +17 -0
  67. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_sizes.html.erb +27 -0
  68. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_sizes.jsx +61 -0
  69. data/app/pb_kits/playbook/pb_icon_button/docs/example.yml +5 -3
  70. data/app/pb_kits/playbook/pb_icon_button/docs/index.js +2 -0
  71. data/app/pb_kits/playbook/pb_icon_button/icon_button.html.erb +1 -1
  72. data/app/pb_kits/playbook/pb_icon_button/icon_button.rb +3 -0
  73. data/app/pb_kits/playbook/pb_icon_button/icon_button.test.jsx +39 -0
  74. data/app/pb_kits/playbook/pb_layout/body.html.erb +1 -5
  75. data/app/pb_kits/playbook/pb_layout/footer.html.erb +1 -5
  76. data/app/pb_kits/playbook/pb_layout/header.html.erb +1 -5
  77. data/app/pb_kits/playbook/pb_layout/item.html.erb +1 -5
  78. data/app/pb_kits/playbook/pb_layout/layout.html.erb +1 -5
  79. data/app/pb_kits/playbook/pb_layout/sidebar.html.erb +1 -5
  80. data/app/pb_kits/playbook/pb_legend/legend.html.erb +1 -6
  81. data/app/pb_kits/playbook/pb_message/message.html.erb +1 -6
  82. data/app/pb_kits/playbook/pb_message/message_mention.html.erb +1 -6
  83. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.html.erb +1 -6
  84. data/app/pb_kits/playbook/pb_nav/item.html.erb +7 -19
  85. data/app/pb_kits/playbook/pb_nav/nav.html.erb +3 -8
  86. data/app/pb_kits/playbook/pb_online_status/online_status.html.erb +1 -6
  87. data/app/pb_kits/playbook/pb_overlay/_overlay.tsx +4 -0
  88. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +37 -0
  89. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional_react.md +1 -0
  90. data/app/pb_kits/playbook/pb_overlay/docs/example.yml +1 -0
  91. data/app/pb_kits/playbook/pb_overlay/docs/index.js +1 -0
  92. data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +48 -10
  93. data/app/pb_kits/playbook/pb_popover/popover.html.erb +1 -6
  94. data/app/pb_kits/playbook/pb_progress_pills/_progress_pills.scss +6 -1
  95. data/app/pb_kits/playbook/pb_progress_pills/_progress_pills.tsx +7 -5
  96. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_default.html.erb +1 -0
  97. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_default.jsx +7 -0
  98. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_default.md +1 -0
  99. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width.html.erb +1 -0
  100. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width.jsx +18 -0
  101. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width_rails.md +1 -0
  102. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width_react.md +1 -0
  103. data/app/pb_kits/playbook/pb_progress_pills/docs/example.yml +2 -0
  104. data/app/pb_kits/playbook/pb_progress_pills/docs/index.js +1 -0
  105. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.html.erb +2 -7
  106. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.rb +6 -0
  107. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.test.js +26 -1
  108. data/app/pb_kits/playbook/pb_progress_simple/progress_simple.html.erb +1 -5
  109. data/app/pb_kits/playbook/pb_progress_step/progress_step.html.erb +1 -5
  110. data/app/pb_kits/playbook/pb_progress_step/progress_step_item.html.erb +3 -7
  111. data/app/pb_kits/playbook/pb_radio/radio.html.erb +6 -11
  112. data/app/pb_kits/playbook/pb_select/index.js +38 -0
  113. data/app/pb_kits/playbook/pb_select/select.rb +8 -0
  114. data/app/pb_kits/playbook/pb_table/docs/_table_with_clickable_rows.html.erb +47 -0
  115. data/app/pb_kits/playbook/pb_table/docs/_table_with_clickable_rows.jsx +88 -0
  116. data/app/pb_kits/playbook/pb_table/docs/_table_with_clickable_rows.md +1 -0
  117. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.jsx +1 -1
  118. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.html.erb +51 -0
  119. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click_rails.md +2 -0
  120. data/app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.html.erb +96 -0
  121. data/app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.jsx +101 -0
  122. data/app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.md +1 -0
  123. data/app/pb_kits/playbook/pb_table/docs/example.yml +5 -0
  124. data/app/pb_kits/playbook/pb_table/docs/index.js +3 -1
  125. data/app/pb_kits/playbook/pb_table/index.ts +41 -9
  126. data/app/pb_kits/playbook/pb_table/styles/_collapsible.scss +4 -0
  127. data/app/pb_kits/playbook/pb_table/subcomponents/_table_body.tsx +29 -2
  128. data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +31 -3
  129. data/app/pb_kits/playbook/pb_table/table_body.html.erb +13 -7
  130. data/app/pb_kits/playbook/pb_table/table_body.rb +2 -0
  131. data/app/pb_kits/playbook/pb_table/table_row.html.erb +14 -7
  132. data/app/pb_kits/playbook/pb_table/table_row.rb +14 -1
  133. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_mask.html.erb +15 -1
  134. data/app/pb_kits/playbook/pb_text_input/index.js +60 -82
  135. data/app/pb_kits/playbook/pb_text_input/text_input.rb +5 -2
  136. data/app/pb_kits/playbook/pb_tooltip/index.js +1 -1
  137. data/dist/chunks/{_typeahead-CkemExmL.js → _typeahead-PqkcDf1H.js} +4 -4
  138. data/dist/chunks/_weekday_stacked-BrSrpj7J.js +45 -0
  139. data/dist/chunks/{lib-DjpLC8uO.js → lib-D3us1bGD.js} +2 -2
  140. data/dist/chunks/{pb_form_validation-S56UaHZl.js → pb_form_validation-BpihMSOQ.js} +1 -1
  141. data/dist/chunks/vendor.js +1 -1
  142. data/dist/menu.yml +1 -8
  143. data/dist/playbook-doc.js +1 -1
  144. data/dist/playbook-rails-react-bindings.js +1 -1
  145. data/dist/playbook-rails.js +1 -1
  146. data/dist/playbook.css +1 -1
  147. data/lib/playbook/forms/builder/time_zone_select_field.rb +19 -0
  148. data/lib/playbook/forms/builder.rb +1 -0
  149. data/lib/playbook/version.rb +2 -2
  150. metadata +54 -23
  151. data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.scss +0 -66
  152. data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.tsx +0 -98
  153. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.html.erb +0 -28
  154. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.rb +0 -42
  155. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.html.erb +0 -19
  156. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.jsx +0 -26
  157. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.html.erb +0 -10
  158. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.jsx +0 -17
  159. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_on_click.jsx +0 -19
  160. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_onclick.html.erb +0 -16
  161. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.html.erb +0 -35
  162. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.jsx +0 -42
  163. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_tooltip.html.erb +0 -13
  164. data/app/pb_kits/playbook/pb_avatar_action_button/docs/example.yml +0 -15
  165. data/app/pb_kits/playbook/pb_avatar_action_button/docs/index.js +0 -4
  166. data/app/pb_kits/playbook/pb_avatar_action_button/pb_avatar_action_button.test.js +0 -31
  167. data/dist/chunks/_weekday_stacked-CtSzPEH0.js +0 -45
  168. /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
@@ -13,6 +13,7 @@ type ProgressPillsProps = {
13
13
  className?: string,
14
14
  data?: { [key: string]: string },
15
15
  dark?: boolean,
16
+ fullWidthPill?: boolean,
16
17
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
17
18
  id?: string,
18
19
  steps?: number,
@@ -20,19 +21,19 @@ type ProgressPillsProps = {
20
21
  value?: string,
21
22
  }
22
23
 
23
- const ProgressPill = ({ active, dark, steps: step }: ProgressPillsProps) => (
24
+ const ProgressPill = ({ active, dark, steps: step, fullWidthPill }: ProgressPillsProps) => (
24
25
  <div
25
26
  className={`pb_progress_pill${step <= active ? '_active' : '_inactive'}${dark ? ' dark' : ''
26
- }`}
27
+ }${fullWidthPill ? ' full_width_pill' : ''}`}
27
28
  key={step}
28
29
  />
29
30
  )
30
31
 
31
- const showSteps = (steps: number, active: number, dark: boolean) => {
32
+ const showSteps = (steps: number, active: number, dark: boolean, fullWidthPill: boolean) => {
32
33
  const items = []
33
34
 
34
35
  for (let step = 1; step <= steps; step++) {
35
- items.push(ProgressPill({ steps: step, active, dark }))
36
+ items.push(ProgressPill({ steps: step, active, dark, fullWidthPill }))
36
37
  }
37
38
 
38
39
  return items
@@ -44,6 +45,7 @@ const ProgressPills = (props: ProgressPillsProps) => {
44
45
  aria = { hidden: 'true' },
45
46
  className,
46
47
  data = {},
48
+ fullWidthPill = false,
47
49
  htmlOptions = {},
48
50
  id,
49
51
  steps = 3,
@@ -79,7 +81,7 @@ const ProgressPills = (props: ProgressPillsProps) => {
79
81
  text={value}
80
82
  />
81
83
  </div>}
82
- <div className="progress_pills">{showSteps(steps, active, dark)}</div>
84
+ <div className="progress_pills">{showSteps(steps, active, dark, fullWidthPill)}</div>
83
85
  </div>
84
86
  )
85
87
  }
@@ -1 +1,2 @@
1
1
  <%= pb_rails("progress_pills", props: { aria: { label: "2 out of 3 steps complete" }, steps: 3, active: 2 }) %>
2
+ <%= pb_rails("progress_pills", props: { aria: { label: "9 out of 18 steps complete" }, steps: 18, active: 9, margin_top: "md" }) %>
@@ -10,6 +10,13 @@ const ProgressPillsDefault = (props) => {
10
10
  steps={3}
11
11
  {...props}
12
12
  />
13
+ <ProgressPills
14
+ active={9}
15
+ aria={{ label: '9 out of 18 steps complete' }}
16
+ marginTop="md"
17
+ steps={18}
18
+ {...props}
19
+ />
13
20
  </>
14
21
  )
15
22
  }
@@ -0,0 +1 @@
1
+ Progress pills start at `45px` wide if the container allows, but will shrink down to `1px` as the container gets smaller. Resize this window to see each pill shrink.
@@ -0,0 +1 @@
1
+ <%= pb_rails("progress_pills", props: { aria: { label: "2 out of 5 steps complete" }, steps: 5, active: 2, full_width_pill: true }) %>
@@ -0,0 +1,18 @@
1
+ import React from 'react'
2
+ import ProgressPills from '../_progress_pills'
3
+
4
+ const ProgressPillsFullWidth = (props) => {
5
+ return (
6
+ <>
7
+ <ProgressPills
8
+ active={2}
9
+ aria={{ label: '2 out of 5 steps complete' }}
10
+ fullWidthPill
11
+ steps={5}
12
+ {...props}
13
+ />
14
+ </>
15
+ )
16
+ }
17
+
18
+ export default ProgressPillsFullWidth
@@ -0,0 +1 @@
1
+ Pass `full_width_pill: true` to the Progress Pill kit to get true 100% full width pills. The kit will take up the full width of the container that it is in.
@@ -0,0 +1 @@
1
+ Pass `fullWidthPill` to the Progress Pill kit to get true 100% full width pills. The kit will take up the full width of the container that it is in.
@@ -3,9 +3,11 @@ examples:
3
3
  rails:
4
4
  - progress_pills_default: Default
5
5
  - progress_pills_status: Status
6
+ - progress_pills_full_width: Full Container Width
6
7
 
7
8
 
8
9
 
9
10
  react:
10
11
  - progress_pills_default: Default
11
12
  - progress_pills_status: Status
13
+ - progress_pills_full_width: Full Container Width
@@ -1,2 +1,3 @@
1
1
  export { default as ProgressPillsDefault } from './_progress_pills_default.jsx'
2
2
  export { default as ProgressPillsStatus } from './_progress_pills_status.jsx'
3
+ export { default as ProgressPillsFullWidth } from './_progress_pills_full_width.jsx'
@@ -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| %>
@@ -14,7 +9,7 @@
14
9
 
15
10
  <div class="progress_pills">
16
11
  <% object.each_step do |step| %>
17
- <span class="pb_progress_pill<%= object.active_step(step) %><%= object.dark_pill %>"></span>
12
+ <span class="pb_progress_pill<%= object.active_step(step) %><%= object.make_full_width %><%= object.dark_pill %>"></span>
18
13
  <% end %>
19
14
  </div>
20
15
 
@@ -9,6 +9,8 @@ module Playbook
9
9
  prop :steps, type: Playbook::Props::Number,
10
10
  default: 3
11
11
  prop :title
12
+ prop :full_width_pill, type: Playbook::Props::Boolean,
13
+ default: false
12
14
 
13
15
  def classname
14
16
  generate_classname("pb_progress_pills_kit")
@@ -26,6 +28,10 @@ module Playbook
26
28
  step <= active ? "_active" : "_inactive"
27
29
  end
28
30
 
31
+ def make_full_width
32
+ full_width_pill ? " full_width_pill" : nil
33
+ end
34
+
29
35
  def aria_attributes
30
36
  return aria if aria.present?
31
37
 
@@ -23,6 +23,20 @@ const ProgressPillsDefault = () => {
23
23
  )
24
24
  }
25
25
 
26
+ const ProgressPillsFullWidth = () => {
27
+ return (
28
+ <ProgressPills
29
+ active={2}
30
+ aria={{ label: ariaLabel }}
31
+ data={{ testid: testId }}
32
+ fullWidthPill
33
+ steps={3}
34
+ title={title}
35
+ value={value}
36
+ />
37
+ )
38
+ }
39
+
26
40
  test('should pass data prop', () => {
27
41
  render(<ProgressPillsDefault />)
28
42
  const kit = screen.getByTestId(testId)
@@ -51,4 +65,15 @@ test('should render value', () => {
51
65
  render(<ProgressPillsDefault />)
52
66
  const kit = screen.getByText(value)
53
67
  expect(kit).toBeInTheDocument()
54
- })
68
+ })
69
+
70
+ test('should apply fullWidthPill styling when fullWidthPill prop is true', () => {
71
+ render(<ProgressPillsFullWidth />)
72
+ const container = screen.getByTestId(testId)
73
+ const pillElements = container.querySelectorAll('.full_width_pill')
74
+
75
+ expect(pillElements.length).toBeGreaterThan(0)
76
+ pillElements.forEach((pill) => {
77
+ expect(pill).toHaveClass('full_width_pill')
78
+ })
79
+ })
@@ -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,10 +1,6 @@
1
- <%= content_tag(:li,
2
- id: object.id,
3
- data: object.data,
4
- class: object.classname,
5
- **combined_html_options) do %>
6
- <div class="box" style="max-width: min-content;" id="<%= object.tooltip_trigger_class %>">
7
- <div class="circle">
1
+ <%= pb_content_tag(:li) do %>
2
+ <div class="box" style="max-width: min-content;">
3
+ <div class="circle" id="<%= object.tooltip_trigger_class %>" >
8
4
  <%= pb_rails("icon", props: { icon: object.icon, size: "xs" }) if object.icon.present? %>
9
5
  </div>
10
6
  <% if object.tooltip.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 %>
@@ -0,0 +1,38 @@
1
+ import PbEnhancedElement from "../pb_enhanced_element";
2
+
3
+ const SELECT_WRAPPER_SELECTOR = "[data-pb-select]";
4
+ const SELECT_VALIDATION_MESSAGE_CLASS = ".pb_body_kit_negative";
5
+
6
+ export default class PbSelect extends PbEnhancedElement {
7
+ static get selector() {
8
+ return SELECT_WRAPPER_SELECTOR;
9
+ }
10
+
11
+ connect() {
12
+ this.setValidationMessage();
13
+ }
14
+
15
+ setValidationMessage() {
16
+ const validationMessage = this.element.dataset?.validationMessage;
17
+
18
+ if (validationMessage) {
19
+ const selectElement = this.element.querySelector("select");
20
+ const setErrorTextContent = (text, timeout) => {
21
+ setTimeout(() => {
22
+ const errorMessageElement = this.element.querySelector(SELECT_VALIDATION_MESSAGE_CLASS);
23
+ if (errorMessageElement) {
24
+ errorMessageElement.textContent = text;
25
+ } else {
26
+ setErrorTextContent(text, 100);
27
+ }
28
+ }, timeout);
29
+ };
30
+
31
+ selectElement.addEventListener("change", (e) => {
32
+ if (!e.target.checkValidity()) {
33
+ setErrorTextContent(validationMessage, 300);
34
+ }
35
+ });
36
+ }
37
+ }
38
+ }
@@ -21,6 +21,7 @@ module Playbook
21
21
  prop :options, type: Playbook::Props::HashArray, required: false, default: []
22
22
  prop :show_arrow, type: Playbook::Props::Boolean, default: false
23
23
  prop :required, type: Playbook::Props::Boolean, default: false
24
+ prop :validation_message, type: Playbook::Props::String, default: ""
24
25
 
25
26
  def classnames
26
27
  classname + inline_class + compact_class + show_arrow_class
@@ -88,6 +89,13 @@ module Playbook
88
89
  "app/pb_kits/playbook/utilities/icons/angle-down.svg"
89
90
  end
90
91
 
92
+ def data_attributes
93
+ data = attributes[:data] || {}
94
+ data.merge!("data-pb-select" => true)
95
+ data.merge!("data-validation-message" => validation_message) if validation_message.present?
96
+ data
97
+ end
98
+
91
99
  private
92
100
 
93
101
  def error_class
@@ -0,0 +1,47 @@
1
+ <%= pb_rails("table", props: { size: "sm" }) do %>
2
+ <%= pb_rails("table/table_head") do %>
3
+ <%= pb_rails("table/table_row") do %>
4
+ <%= pb_rails("table/table_header", props: { text: "Column 1" }) %>
5
+ <%= pb_rails("table/table_header", props: { text: "Column 2" }) %>
6
+ <%= pb_rails("table/table_header", props: { text: "Column 3" }) %>
7
+ <%= pb_rails("table/table_header", props: { text: "Column 4" }) %>
8
+ <%= pb_rails("table/table_header", props: { text: "Column 5" }) %>
9
+ <%= pb_rails("table/table_header", props: { text: "" }) %>
10
+ <% end %>
11
+ <% end %>
12
+ <%= pb_rails("table/table_body") do %>
13
+ <%= pb_rails("table/table_row", props: { cursor: "pointer", html_options: { onclick: "alert('Row 1 clicked')" } }) do %>
14
+ <%= pb_rails("table/table_cell", props: { text: "Value 1" }) %>
15
+ <%= pb_rails("table/table_cell", props: { text: "Value 2" }) %>
16
+ <%= pb_rails("table/table_cell", props: { text: "Value 3" }) %>
17
+ <%= pb_rails("table/table_cell", props: { text: "Value 4" }) %>
18
+ <%= pb_rails("table/table_cell", props: { text: "Value 5" }) %>
19
+ <%= pb_rails("table/table_cell", props: { text_align: "right" }) do %>
20
+ <%= pb_rails("icon", props: { color: "primary_action", fixed_width: true, icon: "chevron-right", size: "xs" }) %>
21
+ <% end %>
22
+ <% end %>
23
+
24
+ <%= pb_rails("table/table_row", props: { cursor: "pointer", html_options: { onclick: "alert('Row 2 clicked')" } }) do %>
25
+ <%= pb_rails("table/table_cell", props: { text: "Value 1" }) %>
26
+ <%= pb_rails("table/table_cell", props: { text: "Value 2" }) %>
27
+ <%= pb_rails("table/table_cell", props: { text: "Value 3" }) %>
28
+ <%= pb_rails("table/table_cell", props: { text: "Value 4" }) %>
29
+ <%= pb_rails("table/table_cell", props: { text: "Value 5" }) %>
30
+ <%= pb_rails("table/table_cell", props: { text_align: "right" }) do %>
31
+ <%= pb_rails("icon", props: { color: "primary_action", fixed_width: true, icon: "chevron-right", size: "xs" }) %>
32
+ <% end %>
33
+ <% end %>
34
+
35
+ <%= pb_rails("table/table_row", props: { cursor: "pointer", html_options: { onclick: "alert('Row 3 clicked')" } }) do %>
36
+ <%= pb_rails("table/table_cell", props: { text: "Value 1" }) %>
37
+ <%= pb_rails("table/table_cell", props: { text: "Value 2" }) %>
38
+ <%= pb_rails("table/table_cell", props: { text: "Value 3" }) %>
39
+ <%= pb_rails("table/table_cell", props: { text: "Value 4" }) %>
40
+ <%= pb_rails("table/table_cell", props: { text: "Value 5" }) %>
41
+ <%= pb_rails("table/table_cell", props: { text_align: "right" }) do %>
42
+ <%= pb_rails("icon", props: { color: "primary_action", fixed_width: true, icon: "chevron-right", size: "xs" }) %>
43
+ <% end %>
44
+ <% end %>
45
+ <% end %>
46
+ <% end %>
47
+
@@ -0,0 +1,88 @@
1
+ import React from 'react'
2
+ import { Table, Icon } from 'playbook-ui'
3
+
4
+ const TableWithClickableRows = (props) => {
5
+
6
+
7
+ return (
8
+ <Table
9
+ size="sm"
10
+ {...props}
11
+ >
12
+ <Table.Head>
13
+ <Table.Row>
14
+ <Table.Header>{"Column 1"}</Table.Header>
15
+ <Table.Header>{"Column 2"}</Table.Header>
16
+ <Table.Header>{"Column 3"}</Table.Header>
17
+ <Table.Header>{"Column 4"}</Table.Header>
18
+ <Table.Header>{"Column 5"}</Table.Header>
19
+ <Table.Header>{""}</Table.Header>
20
+ </Table.Row>
21
+ </Table.Head>
22
+ <Table.Body>
23
+ <Table.Row
24
+ cursor="pointer"
25
+ htmlOptions={{ onClick: () => alert("Row 1 clicked") }}
26
+ {...props}
27
+ >
28
+ <Table.Cell>{"Value 1"}</Table.Cell>
29
+ <Table.Cell>{"Value 2"}</Table.Cell>
30
+ <Table.Cell>{"Value 3"}</Table.Cell>
31
+ <Table.Cell>{"Value 4"}</Table.Cell>
32
+ <Table.Cell>{"Value 5"}</Table.Cell>
33
+ <Table.Cell textAlign="right">
34
+ <Icon
35
+ color="primary_action"
36
+ fixedWidth
37
+ icon="chevron-right"
38
+ size="xs"
39
+ {...props}
40
+ />
41
+ </Table.Cell>
42
+ </Table.Row>
43
+ <Table.Row
44
+ cursor="pointer"
45
+ htmlOptions={{ onClick: () => alert("Row 2 clicked") }}
46
+ {...props}
47
+ >
48
+ <Table.Cell>{"Value 1"}</Table.Cell>
49
+ <Table.Cell>{"Value 2"}</Table.Cell>
50
+ <Table.Cell>{"Value 3"}</Table.Cell>
51
+ <Table.Cell>{"Value 4"}</Table.Cell>
52
+ <Table.Cell>{"Value 5"}</Table.Cell>
53
+ <Table.Cell textAlign="right">
54
+ <Icon
55
+ color="primary_action"
56
+ fixedWidth
57
+ icon="chevron-right"
58
+ size="xs"
59
+ {...props}
60
+ />
61
+ </Table.Cell>
62
+ </Table.Row>
63
+ <Table.Row
64
+ cursor="pointer"
65
+ htmlOptions={{ onClick: () => alert("Row 3 clicked") }}
66
+ {...props}
67
+ >
68
+ <Table.Cell>{"Value 1"}</Table.Cell>
69
+ <Table.Cell>{"Value 2"}</Table.Cell>
70
+ <Table.Cell>{"Value 3"}</Table.Cell>
71
+ <Table.Cell>{"Value 4"}</Table.Cell>
72
+ <Table.Cell>{"Value 5"}</Table.Cell>
73
+ <Table.Cell textAlign="right">
74
+ <Icon
75
+ color="primary_action"
76
+ fixedWidth
77
+ icon="chevron-right"
78
+ size="xs"
79
+ {...props}
80
+ />
81
+ </Table.Cell>
82
+ </Table.Row>
83
+ </Table.Body>
84
+ </Table>
85
+ )
86
+ }
87
+
88
+ export default TableWithClickableRows
@@ -0,0 +1 @@
1
+ Clickable table rows do not require any additional props. This doc example showcases how to set them up using `html_options`/`htmlOptions` and click events. Using the global prop for cursor to set it to "pointer" is also recommended for better UX.
@@ -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.
@@ -0,0 +1,96 @@
1
+ <% checkboxes = [
2
+ { name: 'Coffee', id: 'coffee', checked: false },
3
+ { name: 'Ice Cream', id: 'ice-cream', checked: false },
4
+ { name: 'Chocolate', id: 'chocolate', checked: true }
5
+ ] %>
6
+
7
+ <%= pb_rails("flex", props: { justify: "end", margin_bottom: "sm" }) do %>
8
+ <%= pb_rails("flex", props: { justify: "end", margin_bottom: "sm" }) do %>
9
+ <%= pb_rails("button", props: { text: "Delete", id: "delete-button" }) %>
10
+ <% end %>
11
+ <% end %>
12
+
13
+ <%= pb_rails("table", props: { size: "sm" }) do %>
14
+ <%= pb_rails("table/table_head") do %>
15
+ <%= pb_rails("table/table_row") do %>
16
+ <%= pb_rails("table/table_header") do %>
17
+ <%= pb_rails("checkbox", props: {
18
+ checked: true,
19
+ value: "checkbox-value",
20
+ name: "main-checkbox-selectable",
21
+ indeterminate: true,
22
+ id: "checkbox-selectable"
23
+ }) %>
24
+ <% end %>
25
+ <%= pb_rails("table/table_header", props: { text: "Column 1" }) %>
26
+ <%= pb_rails("table/table_header", props: { text: "Column 2" }) %>
27
+ <%= pb_rails("table/table_header", props: { text: "Column 3" }) %>
28
+ <%= pb_rails("table/table_header", props: { text: "Column 4" }) %>
29
+ <%= pb_rails("table/table_header", props: { text: "Column 5" }) %>
30
+ <% end %>
31
+ <% end %>
32
+ <%= pb_rails("table/table_body") do %>
33
+ <% checkboxes.each_with_index do |checkbox, index| %>
34
+ <%= pb_rails("table/table_row") do %>
35
+ <%= pb_rails("table/table_cell") do %>
36
+ <%= pb_rails("checkbox", props: { checked: checkbox[:checked], id: "#{checkbox[:id]}-selectable-checkbox", name: "#{checkbox[:id]}-selectable-checkbox", on_change: "updateCheckboxes(#{index})", value: "check-box value" }) %>
37
+ <% end %>
38
+ <%= pb_rails("table/table_cell") do %>
39
+ <%= pb_rails("image", props: { alt: "picture of a misty forest", size: "xs", url: "https://unsplash.it/500/400/?image=634" }) %>
40
+ <% end %>
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
+ <% end %>
46
+ <% end %>
47
+ <% end %>
48
+ <% end %>
49
+
50
+ <script>
51
+ document.addEventListener('DOMContentLoaded', function() {
52
+ const mainCheckboxWrapper = document.getElementById('checkbox-selectable');
53
+ const mainCheckbox = document.getElementsByName("main-checkbox-selectable")[0];
54
+ const childCheckboxes = document.querySelectorAll('input[type="checkbox"][id$="selectable-checkbox"]');
55
+ const deleteButton = document.getElementById('delete-button');
56
+
57
+ const updateDeleteButton = () => {
58
+ const anyChecked = Array.from(childCheckboxes).some(checkbox => checkbox.checked);
59
+ deleteButton.style.display = anyChecked ? 'block' : 'none';
60
+ };
61
+
62
+ const updateMainCheckbox = () => {
63
+ // Count the number of checked child checkboxes
64
+ const checkedCount = Array.from(childCheckboxes).filter(cb => cb.checked).length;
65
+ // Determine if the main checkbox should be in an indeterminate state
66
+ const indeterminate = checkedCount > 0 && checkedCount < childCheckboxes.length;
67
+
68
+ // Set the main checkbox states
69
+ mainCheckbox.indeterminate = indeterminate;
70
+ mainCheckbox.checked = checkedCount > 0;
71
+
72
+ // Determine the icon class to add and remove based on the number of checked checkboxes
73
+ const iconClassToAdd = checkedCount === 0 ? 'pb_checkbox_checkmark' : 'pb_checkbox_indeterminate';
74
+ const iconClassToRemove = checkedCount === 0 ? 'pb_checkbox_indeterminate' : 'pb_checkbox_checkmark';
75
+
76
+ // Add and remove the icon class to the main checkbox wrapper
77
+ mainCheckboxWrapper.querySelector('[data-pb-checkbox-icon-span]').classList.add(iconClassToAdd);
78
+ mainCheckboxWrapper.querySelector('[data-pb-checkbox-icon-span]').classList.remove(iconClassToRemove);
79
+
80
+ // Toggle the visibility of the checkbox icon based on the indeterminate state
81
+ mainCheckboxWrapper.getElementsByClassName("indeterminate_icon")[0].classList.toggle('hidden', !indeterminate);
82
+ mainCheckboxWrapper.getElementsByClassName("check_icon")[0].classList.toggle('hidden', indeterminate);
83
+
84
+ updateDeleteButton();
85
+ };
86
+
87
+ mainCheckbox.addEventListener('change', function() {
88
+ childCheckboxes.forEach(cb => cb.checked = this.checked);
89
+ updateMainCheckbox();
90
+ });
91
+
92
+ childCheckboxes.forEach(cb => {
93
+ cb.addEventListener('change', updateMainCheckbox);
94
+ });
95
+ });
96
+ </script>