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

Sign up to get free protection for your applications and to get access to all the features.
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
  }