playbook_ui 13.32.0.pre.alpha.play1416movealiaslogic3266 → 13.33.0.pre.alpha.PLAY1454formpillicons3309

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 (94) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_custom.md +4 -0
  3. data/app/pb_kits/playbook/pb_collapsible/__snapshots__/collapsible.test.js.snap +1 -1
  4. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +12 -7
  5. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection.html.erb +10 -0
  6. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection.jsx +31 -0
  7. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_value.html.erb +10 -0
  8. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_value.jsx +31 -0
  9. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +4 -0
  10. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +3 -1
  11. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +4 -4
  12. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +11 -0
  13. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +1 -1
  14. data/app/pb_kits/playbook/pb_dropdown/index.js +54 -3
  15. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +112 -5
  16. data/app/pb_kits/playbook/pb_form_pill/_form_pill.test.jsx +64 -0
  17. data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +62 -18
  18. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_example.html.erb +5 -1
  19. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_example.jsx +1 -0
  20. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_icon.html.erb +5 -0
  21. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_icon.jsx +19 -0
  22. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_size.html.erb +2 -0
  23. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_size.jsx +2 -0
  24. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_tag.html.erb +4 -1
  25. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_tag.jsx +3 -2
  26. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_user.html.erb +2 -0
  27. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_user.jsx +2 -0
  28. data/app/pb_kits/playbook/pb_form_pill/docs/example.yml +2 -1
  29. data/app/pb_kits/playbook/pb_form_pill/docs/index.js +1 -1
  30. data/app/pb_kits/playbook/pb_form_pill/form_pill.html.erb +17 -10
  31. data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +10 -1
  32. data/app/pb_kits/playbook/pb_icon/_icon.scss +210 -1
  33. data/app/pb_kits/playbook/pb_icon/_icon.tsx +97 -7
  34. data/app/pb_kits/playbook/pb_icon/icon.rb +22 -16
  35. data/app/pb_kits/playbook/pb_nav/_nav_item.test.js +2 -2
  36. data/app/pb_kits/playbook/pb_nav/docs/_tab_nav.html.erb +48 -0
  37. data/app/pb_kits/playbook/pb_nav/docs/_tab_nav.md +3 -0
  38. data/app/pb_kits/playbook/pb_nav/docs/example.yml +1 -0
  39. data/app/pb_kits/playbook/pb_nav/index.js +43 -0
  40. data/app/pb_kits/playbook/pb_nav/nav.rb +9 -0
  41. data/app/pb_kits/playbook/pb_rich_text_editor/TipTap/MoreExtensionsDropdown.tsx +1 -1
  42. data/app/pb_kits/playbook/pb_rich_text_editor/TipTap/ToolbarDropdown.tsx +1 -1
  43. data/app/pb_kits/playbook/pb_star_rating/_star_rating.scss +11 -2
  44. data/app/pb_kits/playbook/pb_star_rating/docs/_star_rating_interactive.html.erb +1 -0
  45. data/app/pb_kits/playbook/pb_star_rating/docs/example.yml +1 -1
  46. data/app/pb_kits/playbook/pb_star_rating/index.js +50 -0
  47. data/app/pb_kits/playbook/pb_star_rating/star_rating.html.erb +25 -5
  48. data/app/pb_kits/playbook/pb_star_rating/star_rating.rb +6 -0
  49. data/app/pb_kits/playbook/pb_table/_table.tsx +1 -1
  50. data/app/pb_kits/playbook/pb_table/index.ts +4 -4
  51. data/app/pb_kits/playbook/pb_table/subcomponents/_table_body.tsx +1 -1
  52. data/app/pb_kits/playbook/pb_table/subcomponents/_table_cell.tsx +1 -1
  53. data/app/pb_kits/playbook/pb_table/subcomponents/_table_head.tsx +1 -1
  54. data/app/pb_kits/playbook/pb_table/subcomponents/_table_header.tsx +1 -1
  55. data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +1 -1
  56. data/app/pb_kits/playbook/pb_table/table.test.js +2 -0
  57. data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +1 -1
  58. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_default.jsx +1 -1
  59. data/app/pb_kits/playbook/pb_textarea/_textarea.tsx +45 -27
  60. data/app/pb_kits/playbook/pb_textarea/index.tsx +3 -3
  61. data/app/pb_kits/playbook/pb_time/_time.tsx +3 -3
  62. data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +1 -1
  63. data/app/pb_kits/playbook/pb_timeline/_item.tsx +1 -1
  64. data/app/pb_kits/playbook/pb_timeline/_timeline.tsx +1 -1
  65. data/app/pb_kits/playbook/pb_title_detail/_title_detail.tsx +10 -10
  66. data/app/pb_kits/playbook/pb_toggle/_toggle.tsx +1 -1
  67. data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +2 -2
  68. data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.tsx +1 -2
  69. data/app/pb_kits/playbook/pb_treemap_chart/treemapChart.test.js +2 -0
  70. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +3 -3
  71. data/app/pb_kits/playbook/pb_typeahead/components/ClearIndicator.tsx +4 -4
  72. data/app/pb_kits/playbook/pb_typeahead/components/Control.tsx +11 -7
  73. data/app/pb_kits/playbook/pb_typeahead/components/IndicatorsContainer.tsx +8 -3
  74. data/app/pb_kits/playbook/pb_typeahead/components/MenuList.tsx +6 -1
  75. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +18 -19
  76. data/app/pb_kits/playbook/pb_typeahead/components/Option.tsx +6 -6
  77. data/app/pb_kits/playbook/pb_typeahead/components/Placeholder.tsx +6 -6
  78. data/app/pb_kits/playbook/pb_typeahead/components/ValueContainer.tsx +3 -3
  79. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_custom_menu_list.jsx +2 -0
  80. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default.html.erb +22 -57
  81. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async.jsx +2 -2
  82. data/app/pb_kits/playbook/pb_typeahead/index.ts +31 -31
  83. data/app/pb_kits/playbook/pb_user/_user.tsx +1 -1
  84. data/app/pb_kits/playbook/pb_user_badge/_user_badge.tsx +6 -6
  85. data/app/pb_kits/playbook/pb_user_badge/badges/million-dollar.tsx +236 -235
  86. data/app/pb_kits/playbook/pb_user_badge/badges/veteran.tsx +1 -1
  87. data/app/pb_kits/playbook/pb_walkthrough/_walkthrough.tsx +68 -63
  88. data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +2 -2
  89. data/app/pb_kits/playbook/playbook-rails.js +6 -0
  90. data/dist/playbook-rails.js +5 -5
  91. data/lib/playbook/forms/builder/star_rating_field.rb +14 -0
  92. data/lib/playbook/forms/builder.rb +1 -0
  93. data/lib/playbook/version.rb +2 -2
  94. metadata +15 -2
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Style/HashLikeCase
4
-
5
3
  require "open-uri"
6
4
  require "json"
7
5
 
@@ -139,11 +137,13 @@ module Playbook
139
137
  end
140
138
 
141
139
  def border_class
142
- border ? "fa-border" : nil
140
+ prefix = is_svg? ? "svg_border" : "fa-border"
141
+ border ? prefix : nil
143
142
  end
144
143
 
145
144
  def fixed_width_class
146
- fixed_width ? "fa-fw" : nil
145
+ prefix = is_svg? ? "svg_fw" : "fa-fw"
146
+ fixed_width ? prefix : nil
147
147
  end
148
148
 
149
149
  def icon_class
@@ -151,38 +151,45 @@ module Playbook
151
151
  end
152
152
 
153
153
  def inverse_class
154
- inverse ? "fa-inverse" : nil
154
+ class_name = is_svg? ? "svg_inverse" : "fa-inverse"
155
+ inverse ? class_name : nil
155
156
  end
156
157
 
157
158
  def list_item_class
158
- list_item ? "fa-li" : nil
159
+ class_name = is_svg? ? "svg_li" : "fa-li"
160
+ list_item ? class_name : nil
159
161
  end
160
162
 
161
163
  def flip_class
164
+ prefix = is_svg? ? "flip_" : "fa-flip-"
162
165
  case flip
163
166
  when "horizontal"
164
- "fa-flip-horizontal"
167
+ "#{prefix}horizontal"
165
168
  when "vertical"
166
- "fa-flip-vertical"
169
+ "#{prefix}vertical"
167
170
  when "both"
168
- "fa-flip-horizontal fa-flip-vertical"
171
+ "#{prefix}horizontal #{prefix}vertical"
169
172
  end
170
173
  end
171
174
 
172
175
  def pull_class
173
- pull ? "fa-pull-#{pull}" : nil
176
+ class_name = is_svg? ? "pull_#{pull}" : "fa-pull-#{pull}"
177
+ pull ? class_name : nil
174
178
  end
175
179
 
176
180
  def pulse_class
177
- pulse ? "fa-pulse" : nil
181
+ class_name = is_svg? ? "pulse" : "fa-pulse"
182
+ pulse ? class_name : nil
178
183
  end
179
184
 
180
185
  def rotation_class
181
- rotation ? "fa-rotate-#{rotation}" : nil
186
+ class_name = is_svg? ? "rotate_#{rotation}" : "fa-rotate-#{rotation}"
187
+ rotation ? class_name : nil
182
188
  end
183
189
 
184
190
  def size_class
185
- size ? "fa-#{size}" : nil
191
+ class_name = is_svg? ? "svg_#{size}" : "fa-#{size}"
192
+ size ? class_name : nil
186
193
  end
187
194
 
188
195
  def font_style_class
@@ -190,10 +197,9 @@ module Playbook
190
197
  end
191
198
 
192
199
  def spin_class
193
- spin ? "fa-spin" : nil
200
+ class_name = is_svg? ? "spin" : "fa-spin"
201
+ spin ? class_name : nil
194
202
  end
195
203
  end
196
204
  end
197
205
  end
198
-
199
- # rubocop:enable Style/HashLikeCase
@@ -95,11 +95,11 @@ test('should not have a left border', () => {
95
95
  test('should have a right icon', () => {
96
96
  render(<NavDefault iconRight="angle-down" />)
97
97
  const kit = screen.getByTestId(itemTestId)
98
- expect(kit).toContainHTML('<i class="pb_icon_kit far fa-fw fa-angle-down pb_nav_list_item_icon_right" />')
98
+ expect(kit).toContainHTML('<i class="pb_icon_kit far pb_nav_list_item_icon_right fa-fw fa-angle-down" />')
99
99
  })
100
100
 
101
101
  test('should have a left icon', () => {
102
102
  render(<NavDefault iconLeft="users-class" />)
103
103
  const kit = screen.getByTestId(itemTestId)
104
- expect(kit).toContainHTML('<i class="pb_icon_kit far fa-fw fa-users-class pb_nav_list_item_icon_left" />')
104
+ expect(kit).toContainHTML('<i class="pb_icon_kit far pb_nav_list_item_icon_left fa-fw fa-users-class" />')
105
105
  })
@@ -0,0 +1,48 @@
1
+ <%= pb_rails("nav", props: { orientation: "horizontal", tabbing: true, padding_bottom: "sm" }) do %>
2
+ <%= pb_rails("nav/item", props: { text: "About", active: true, data: { pb_tab_target: "about" }, cursor: "pointer" }) %>
3
+ <%= pb_rails("nav/item", props: { text: "Case Studies", data: { pb_tab_target: "case_studies" }, cursor: "pointer" }) %>
4
+ <%= pb_rails("nav/item", props: { text: "Service", data: { pb_tab_target: "service" }, cursor: "pointer" }) %>
5
+ <%= pb_rails("nav/item", props: { text: "Contacts", data: { pb_tab_target: "contacts" }, cursor: "pointer" }) %>
6
+ <% end %>
7
+
8
+ <div id="about">
9
+ <%= pb_rails("body", props: { text: "This is about!" }) %>
10
+ </div>
11
+
12
+ <div id="case_studies">
13
+ <%= pb_rails("body", props: { text: "This is case studies!" }) %>
14
+ </div>
15
+
16
+ <div id="service">
17
+ <%= pb_rails("body", props: { text: "This is service!" }) %>
18
+ </div>
19
+
20
+ <div id="contacts">
21
+ <%= pb_rails("body", props: { text: "This is contacts!" }) %>
22
+ </div>
23
+
24
+ <script>
25
+ // The script in the code snippet below is for demonstrating the active state and NOT needed for the kit to function.
26
+ // The active prop can be used to highlight this active state.
27
+ const navItemClass = "pb_nav_list_kit_item"
28
+ const navItemActiveClass = "pb_nav_list_kit_item_active"
29
+ const dataNavItems = "[data-pb-tab-target]"
30
+
31
+ const navItemTabs = document.querySelectorAll(dataNavItems)
32
+ navItemTabs.forEach(navItemTab => {
33
+ navItemTab.addEventListener("click", event => {
34
+ const navItemTabs = document.querySelectorAll(dataNavItems)
35
+ navItemTabs.forEach(navItemTab => {
36
+ if (navItemTab === event.target.closest(dataNavItems)) {
37
+ navItemTab.classList.add(navItemActiveClass)
38
+ navItemTab.classList.remove(navItemClass)
39
+ } else {
40
+ if (navItemTab.classList.contains(navItemActiveClass)) {
41
+ navItemTab.classList.remove(navItemActiveClass)
42
+ navItemTab.classList.add(navItemClass)
43
+ }
44
+ }
45
+ })
46
+ })
47
+ })
48
+ </script>
@@ -0,0 +1,3 @@
1
+ The Nav kit can also be used to create dynamic tabbing. To do so, use the boolean `tabbing` prop as shown here.
2
+
3
+ All divs you want to use as tabs MUST have an id attached to them. To link the tab to the nav, use the required data attribute `pb_tab_target` on each nav/item and pass it the id of the tab you want linked to that specific nav/item. See code example below to see this in action.
@@ -19,6 +19,7 @@ examples:
19
19
  - block_nav: Block
20
20
  - block_no_title_nav: Without Title
21
21
  - new_tab: Open in a New Tab
22
+ - tab_nav: Tab Nav
22
23
 
23
24
  react:
24
25
  - default_nav: Default
@@ -0,0 +1,43 @@
1
+ import PbEnhancedElement from '../pb_enhanced_element'
2
+
3
+ const NAV_SELECTOR = '[data-pb-nav-tab]'
4
+ const NAV_ITEM_SELECTOR = '[data-pb-tab-target]'
5
+
6
+ export default class PbNav extends PbEnhancedElement {
7
+ static get selector() {
8
+ return NAV_SELECTOR
9
+ }
10
+
11
+ connect() {
12
+ this.hideAndAddEventListeners()
13
+ }
14
+
15
+ hideAndAddEventListeners() {
16
+ const navItems = this.element.querySelectorAll(NAV_ITEM_SELECTOR)
17
+ navItems.forEach((navItem) => {
18
+ if (!navItem.className.includes('active')) {
19
+ this.changeContentDisplay(navItem.dataset.pbTabTarget, 'none')
20
+ }
21
+
22
+ navItem.addEventListener('click', event => this.handleNavItemClick(event))
23
+ })
24
+ }
25
+
26
+ handleNavItemClick(event) {
27
+ event.preventDefault()
28
+ const navItem = event.target.closest(NAV_ITEM_SELECTOR)
29
+ this.changeContentDisplay(navItem.dataset.pbTabTarget, 'block')
30
+
31
+ const navItems = this.element.querySelectorAll(NAV_ITEM_SELECTOR)
32
+ navItems.forEach((navItemSelected) => {
33
+ if (navItem !== navItemSelected) {
34
+ this.changeContentDisplay(navItemSelected.dataset.pbTabTarget, 'none')
35
+ }
36
+ })
37
+ }
38
+
39
+ changeContentDisplay(contentId, display) {
40
+ const content = document.getElementById(contentId)
41
+ content.style.display = display
42
+ }
43
+ }
@@ -13,11 +13,20 @@ module Playbook
13
13
  default: "normal"
14
14
  prop :highlight, type: Playbook::Props::Boolean, default: true
15
15
  prop :borderless, type: Playbook::Props::Boolean, default: false
16
+ prop :tabbing, type: Playbook::Props::Boolean, default: false
16
17
 
17
18
  def classname
18
19
  generate_classname("pb_nav_list", variant, orientation, highlight_class, borderless_class)
19
20
  end
20
21
 
22
+ def data
23
+ if tabbing
24
+ Hash(prop(:data)).merge(pb_nav_tab: true)
25
+ else
26
+ prop(:data)
27
+ end
28
+ end
29
+
21
30
  def highlight_class
22
31
  highlight ? "highlight" : nil
23
32
  end
@@ -10,7 +10,7 @@ const MoreExtensionsDropdown = ({extensions}: any) => {
10
10
  const [showPopover, setShowPopover] = useState(false)
11
11
 
12
12
  const handleTogglePopover = () => {
13
- setShowPopover(true)
13
+ setShowPopover(!showPopover)
14
14
  }
15
15
 
16
16
  const handlePopoverClose = (shouldClosePopover: boolean) => {
@@ -67,7 +67,7 @@ const toolbarDropdownItems = [
67
67
 
68
68
 
69
69
  const handleTogglePopover = () => {
70
- setShowPopover(true)
70
+ setShowPopover(!showPopover)
71
71
  }
72
72
 
73
73
  const handlePopoverClose = (shouldClosePopover: boolean) => {
@@ -48,8 +48,8 @@
48
48
 
49
49
 
50
50
  $star-styles: (
51
- yellow_star: (color: #F9BB00),
52
- primary_star: (color: #0056CF),
51
+ yellow_star: (color: $yellow),
52
+ primary_star: (color: $royal),
53
53
  suble_star_light: (color: $text_lt_default),
54
54
  suble_star_dark: (color: $text_dk_default),
55
55
  empty_star_dark: (color: $border_dark),
@@ -111,4 +111,13 @@
111
111
  }
112
112
  }
113
113
  }
114
+ .yellow-star-selected {
115
+ color: $yellow;
116
+ }
117
+ .primary-star-selected {
118
+ color: $royal
119
+ }
120
+ .suble-star-selected {
121
+ color: $text_lt_default;
122
+ }
114
123
  }
@@ -0,0 +1 @@
1
+ <%= pb_rails("star_rating", props: { padding_bottom: "xs", variant: "interactive" }) %>
@@ -13,4 +13,4 @@ examples:
13
13
  - star_rating_background_options: Background Options
14
14
  - star_rating_hide: Layout Options
15
15
  - star_rating_number_config: Number Config
16
- - star_rating_size_options: Size Options
16
+ - star_rating_size_options: Size Options
@@ -0,0 +1,50 @@
1
+ import PbEnhancedElement from "../pb_enhanced_element";
2
+
3
+ const STAR_RATING_SELECTOR = "[data-pb-star-rating]";
4
+ const STAR_RATING_INPUT_ID = "star-rating-input";
5
+
6
+ export default class PbStarRating extends PbEnhancedElement {
7
+ static get selector() {
8
+ return STAR_RATING_SELECTOR;
9
+ }
10
+
11
+ connect() {
12
+ this.element.addEventListener("click", (event) => {
13
+ const clickedStarId = event.currentTarget.id;
14
+ this.updateStarColors(clickedStarId);
15
+ this.updateHiddenInputValue(clickedStarId);
16
+ });
17
+ }
18
+
19
+ updateStarColors(clickedStarId) {
20
+ const allStars = document.querySelectorAll(STAR_RATING_SELECTOR);
21
+
22
+ allStars.forEach(star => {
23
+ const starId = star.id;
24
+ const icon = star.querySelector(".interactive-star-icon");
25
+
26
+ if (icon) {
27
+ if (starId <= clickedStarId) {
28
+ if (star.classList.contains("yellow_star")) {
29
+ icon.classList.add("yellow-star-selected");
30
+ } else if (star.classList.contains("primary_star")) {
31
+ icon.classList.add("primary-star-selected");
32
+ } else if (star.classList.contains("suble_star_light")) {
33
+ icon.classList.add("suble-star-selected");
34
+ } else {
35
+ icon.classList.add("yellow-star-selected");
36
+ }
37
+ } else {
38
+ icon.classList.remove("yellow-star-selected", "primary-star-selected", "suble-star-selected");
39
+ }
40
+ }
41
+ });
42
+ }
43
+
44
+ updateHiddenInputValue(value) {
45
+ const hiddenInput = document.getElementById(STAR_RATING_INPUT_ID);
46
+ if (hiddenInput) {
47
+ hiddenInput.value = value;
48
+ }
49
+ }
50
+ }
@@ -28,13 +28,33 @@
28
28
  <% end %>
29
29
  <% end %>
30
30
  <%= pb_rails("flex", props: { }) do %>
31
- <% object.star_count.times do %>
32
- <%= pb_rails("icon", props: { classname: "#{star_color} pb_star_#{size}" , custom_icon: Playbook::Engine.root.join(star_svg_path) } ) %>
33
- <% end %>
34
- <% object.empty_stars.times do %>
35
- <%= pb_rails("icon", props: { classname: "#{background_star_color} pb_star_#{size}", custom_icon: Playbook::Engine.root.join(background_star_path) } ) %>
31
+
32
+ <% if object.variant == "display" %>
33
+
34
+ <% object.star_count.times do %>
35
+ <%= pb_rails("icon", props: { classname: "#{star_color} pb_star_#{size}" , custom_icon: Playbook::Engine.root.join(star_svg_path) } ) %>
36
+ <% end %>
37
+ <% object.empty_stars.times do %>
38
+ <%= pb_rails("icon", props: { classname: "#{background_star_color} pb_star_#{size}", custom_icon: Playbook::Engine.root.join(background_star_path) } ) %>
39
+ <% end %>
40
+
41
+ <% else %>
42
+ <%= pb_rails("flex", props: { orientation: "column" }) do %>
43
+ <% if object.label.present? %>
44
+ <%= pb_rails("caption", props: {text: object.label, margin_bottom:"xs"}) %>
45
+ <% end %>
46
+ <input type="hidden" id="star-rating-input" value="" name="<%= object.name %>"/>
47
+ <%= pb_rails("flex", props: { orientation: "row" }) do %>
48
+ <% object.denominator.times do |index| %>
49
+ <div data-pb-star-rating id="<%= index + 1 %>" class="<%= star_color %>">
50
+ <%= pb_rails("icon", props: { classname: "#{background_star_color} pb_star_#{size} interactive-star-icon", custom_icon: Playbook::Engine.root.join(background_star_path)} ) %>
51
+ </div>
52
+ <% end %>
53
+ <% end %>
54
+ <% end %>
36
55
  <% end %>
37
56
  <% end %>
57
+
38
58
  <% if layout_option == "onestar" %>
39
59
  <%= content_tag(:div, class: "pb_star_rating_number_#{size}") do %>
40
60
  <% case object.size %>
@@ -25,6 +25,12 @@ module Playbook
25
25
  values: %w[fill outline],
26
26
  default: "fill"
27
27
 
28
+ prop :variant, type: Playbook::Props::Enum,
29
+ values: %w[display interactive],
30
+ default: "display"
31
+ prop :label, type: Playbook::Props::String
32
+ prop :name, type: Playbook::Props::String
33
+
28
34
  def one_decimal_rating
29
35
  rating.to_f.round(1)
30
36
  end
@@ -33,7 +33,7 @@ type TableProps = {
33
33
  verticalBorder?: boolean,
34
34
  } & GlobalProps
35
35
 
36
- const Table = (props: TableProps) => {
36
+ const Table = (props: TableProps): React.ReactElement => {
37
37
  const {
38
38
  aria = {},
39
39
  children,
@@ -1,19 +1,19 @@
1
1
  import PbEnhancedElement from '../pb_enhanced_element'
2
2
 
3
3
  export default class PbTable extends PbEnhancedElement {
4
- static get selector() {
4
+ static get selector(): string {
5
5
  return '.table-responsive-collapse'
6
6
  }
7
7
 
8
- connect() {
8
+ connect(): void {
9
9
  const tables = document.querySelectorAll('.table-responsive-collapse');
10
10
 
11
11
  // Each Table
12
12
  [].forEach.call(tables, (table: HTMLTableElement) => {
13
13
  // Header Titles
14
- let headers: string[] = [];
14
+ const headers: string[] = [];
15
15
  [].forEach.call(table.querySelectorAll('th'), (header: HTMLTableCellElement) => {
16
- let colSpan = header.colSpan
16
+ const colSpan = header.colSpan
17
17
  for (let i = 0; i < colSpan; i++) {
18
18
  headers.push(header.textContent.replace(/\r?\n|\r/, ''));
19
19
  }
@@ -17,7 +17,7 @@ type TableBodyPropTypes = {
17
17
  tag?: "table" | "div";
18
18
  };
19
19
 
20
- const TableBody = (props: TableBodyPropTypes) => {
20
+ const TableBody = (props: TableBodyPropTypes): React.ReactElement => {
21
21
  const {
22
22
  aria = {},
23
23
  children,
@@ -18,7 +18,7 @@ type TableCellPropTypes = {
18
18
  text?: string
19
19
  };
20
20
 
21
- const TableCell = (props: TableCellPropTypes) => {
21
+ const TableCell = (props: TableCellPropTypes): React.ReactElement => {
22
22
  const {
23
23
  aria = {},
24
24
  children,
@@ -17,7 +17,7 @@ type TableHeadPropTypes = {
17
17
  tag?: "table" | "div";
18
18
  };
19
19
 
20
- const TableHead = (props: TableHeadPropTypes) => {
20
+ const TableHead = (props: TableHeadPropTypes): React.ReactElement => {
21
21
  const {
22
22
  aria = {},
23
23
  children,
@@ -18,7 +18,7 @@ type TableHeaderPropTypes = {
18
18
  text?: string;
19
19
  };
20
20
 
21
- const TableHeader = (props: TableHeaderPropTypes) => {
21
+ const TableHeader = (props: TableHeaderPropTypes): React.ReactElement => {
22
22
  const {
23
23
  aria = {},
24
24
  children,
@@ -19,7 +19,7 @@ type TableRowPropTypes = {
19
19
  tag?: "table" | "div";
20
20
  };
21
21
 
22
- const TableRow = (props: TableRowPropTypes) => {
22
+ const TableRow = (props: TableRowPropTypes): React.ReactElement => {
23
23
  const {
24
24
  aria = {},
25
25
  children,
@@ -1,3 +1,5 @@
1
+ /* eslint-disable react/no-multi-comp */
2
+
1
3
  import React from "react";
2
4
  import { ensureAccessible, renderKit, render, screen } from "../utilities/test-utils"
3
5
 
@@ -107,7 +107,7 @@ const TextInput = (props: TextInputProps, ref: React.LegacyRef<HTMLInputElement>
107
107
  required={required}
108
108
  type={type}
109
109
  value={value}
110
- />)
110
+ />)
111
111
  )
112
112
 
113
113
  const addOnInput = (
@@ -5,12 +5,12 @@ import TextInput from '../../pb_text_input/_text_input'
5
5
  import Title from '../../pb_title/_title'
6
6
 
7
7
  const TextInputDefault = (props) => {
8
+ const [firstName, setFirstName] = useState('')
8
9
  const handleOnChangeFirstName = ({ target }) => {
9
10
  setFirstName(target.value)
10
11
  }
11
12
  const ref = React.createRef()
12
13
 
13
- const [firstName, setFirstName] = useState('')
14
14
  const [formFields, setFormFields] = useState({
15
15
  firstName: 'Jane',
16
16
  lastName: 'Doe',
@@ -52,14 +52,15 @@ const Textarea = ({
52
52
  label,
53
53
  maxCharacters,
54
54
  name,
55
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
55
56
  onChange = () => {},
56
57
  placeholder,
57
58
  required,
58
59
  rows = 4,
59
60
  value,
60
61
  ...props
61
- }: TextareaProps, ref: any) => {
62
- ref = useRef<HTMLTextAreaElement>(null)
62
+ }: TextareaProps) => {
63
+ const ref = useRef<HTMLTextAreaElement>(null)
63
64
  useEffect(() => {
64
65
  if (ref.current && resize === 'auto') {
65
66
  PbTextarea.addMatch(ref.current)
@@ -71,58 +72,75 @@ const Textarea = ({
71
72
  const resizeClass = `resize_${resize}`
72
73
  const classes = classnames('pb_textarea_kit', errorClass, inlineClass, resizeClass, globalProps(props), className)
73
74
  const noCount = typeof characterCount !== 'undefined'
74
- const ariaProps: {[key: string]: any} = buildAriaProps(aria)
75
- const dataProps: {[key: string]: any} = buildDataProps(data)
75
+ const ariaProps: {[key: string]: string} = buildAriaProps(aria)
76
+ const dataProps: {[key: string]: string} = buildDataProps(data)
76
77
  const htmlProps = buildHtmlProps(htmlOptions)
77
- const characterCounter = () => {
78
- return maxCharacters && characterCount ? `${checkIfZero(characterCount)} / ${maxCharacters}` : `${checkIfZero(characterCount)}`
79
- }
80
-
81
78
  const checkIfZero = (characterCount: string | number) => {
82
79
  return characterCount == 0 ? characterCount.toString() : characterCount
83
80
  }
81
+ const characterCounter = () => {
82
+ return maxCharacters && characterCount ? `${checkIfZero(characterCount)} / ${maxCharacters}` : `${checkIfZero(characterCount)}`
83
+ }
84
84
 
85
85
  return (
86
86
  <div
87
- {...ariaProps}
88
- {...dataProps}
89
- {...htmlProps}
90
- className={classes}
87
+ {...ariaProps}
88
+ {...dataProps}
89
+ {...htmlProps}
90
+ className={classes}
91
91
  >
92
92
  <Caption text={label} />
93
93
  {children || (
94
94
  <textarea
95
- className="pb_textarea_kit"
96
- disabled={disabled}
97
- name={name}
98
- onChange={onChange}
99
- placeholder={placeholder}
100
- ref={ref}
101
- required={required}
102
- rows={rows}
103
- value={value}
104
- {...props}
95
+ className="pb_textarea_kit"
96
+ disabled={disabled}
97
+ name={name}
98
+ onChange={onChange}
99
+ placeholder={placeholder}
100
+ ref={ref}
101
+ required={required}
102
+ rows={rows}
103
+ value={value}
104
+ {...props}
105
105
  />
106
106
  )}
107
107
 
108
108
  {error ? (
109
109
  <>
110
110
  {characterCount ? (
111
- <Flex spacing="between" vertical="center">
111
+ <Flex
112
+ spacing="between"
113
+ vertical="center"
114
+ >
112
115
  <FlexItem>
113
- <Body margin="none" status="negative" text={error} />
116
+ <Body
117
+ margin="none"
118
+ status="negative"
119
+ text={error}
120
+ />
114
121
  </FlexItem>
115
122
  <FlexItem>
116
- <Caption margin="none" size="xs" text={characterCounter()} />
123
+ <Caption
124
+ margin="none"
125
+ size="xs"
126
+ text={characterCounter()}
127
+ />
117
128
  </FlexItem>
118
129
  </Flex>
119
130
  ) : (
120
- <Body status="negative" text={error} />
131
+ <Body
132
+ status="negative"
133
+ text={error}
134
+ />
121
135
  )}
122
136
  </>
123
137
  ) : (
124
138
  noCount && (
125
- <Caption margin="none" size="xs" text={characterCounter()} />
139
+ <Caption
140
+ margin="none"
141
+ size="xs"
142
+ text={characterCounter()}
143
+ />
126
144
  )
127
145
  )}
128
146
  </div>
@@ -3,16 +3,16 @@ import PbEnhancedElement from '../pb_enhanced_element'
3
3
  export default class PbTextarea extends PbEnhancedElement {
4
4
  style: {[key: string]: string}
5
5
  scrollHeight: string
6
- static get selector() {
6
+ static get selector(): string {
7
7
  return '.resize_auto textarea'
8
8
  }
9
9
 
10
- onInput() {
10
+ onInput(): void {
11
11
  this.style.height = 'auto'
12
12
  this.style.height = (this.scrollHeight) + 'px'
13
13
  }
14
14
 
15
- connect() {
15
+ connect(): void {
16
16
  this.element.setAttribute('style', 'height:' + (this.element.scrollHeight) + 'px;overflow-y:hidden;')
17
17
  this.element.addEventListener('input', this.onInput, false)
18
18
  }