playbook_ui 7.8.4 → 7.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/playbook/application_controller.rb +5 -3
  3. data/app/helpers/playbook/application_helper.rb +13 -19
  4. data/app/helpers/playbook/pb_doc_helper.rb +41 -20
  5. data/app/helpers/playbook/pb_kit_helper.rb +1 -25
  6. data/app/helpers/playbook/pb_sample_helper.rb +24 -23
  7. data/app/pb_kits/playbook/_playbook.scss +1 -1
  8. data/app/pb_kits/playbook/config/_kit_example.html.erb +18 -4
  9. data/app/pb_kits/playbook/config/_kit_ui.html.erb +21 -21
  10. data/app/pb_kits/playbook/pb_currency/_currency.html.erb +1 -1
  11. data/app/pb_kits/playbook/pb_currency/_currency.jsx +16 -1
  12. data/app/pb_kits/playbook/pb_currency/_currency.scss +23 -1
  13. data/app/pb_kits/playbook/pb_currency/currency.rb +22 -0
  14. data/app/pb_kits/playbook/pb_currency/docs/{_currency_small.html.erb → _currency_alignment.html.erb} +3 -3
  15. data/app/pb_kits/playbook/pb_currency/docs/{_currency_small.jsx → _currency_alignment.jsx} +5 -5
  16. data/app/pb_kits/playbook/pb_currency/docs/_currency_no_symbol.html.erb +7 -0
  17. data/app/pb_kits/playbook/pb_currency/docs/_currency_no_symbol.jsx +17 -0
  18. data/app/pb_kits/playbook/pb_currency/docs/{_currency_large.html.erb → _currency_size.html.erb} +8 -7
  19. data/app/pb_kits/playbook/pb_currency/docs/{_currency_large.jsx → _currency_size.jsx} +9 -8
  20. data/app/pb_kits/playbook/pb_currency/docs/_currency_variants.html.erb +24 -0
  21. data/app/pb_kits/playbook/pb_currency/docs/{_currency_medium.jsx → _currency_variants.jsx} +13 -10
  22. data/app/pb_kits/playbook/pb_currency/docs/example.yml +8 -6
  23. data/app/pb_kits/playbook/pb_currency/docs/index.js +4 -3
  24. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_anti_patterns.html.erb +23 -0
  25. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.html.erb +4 -4
  26. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.jsx +2 -2
  27. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.md +3 -1
  28. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_disabled.html.erb +8 -8
  29. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_flatpickr_methods.html.erb +27 -0
  30. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_flatpickr_methods.jsx +44 -0
  31. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_format.html.erb +4 -4
  32. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_min_max.html.erb +2 -2
  33. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range.html.erb +1 -1
  34. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range.jsx +1 -1
  35. data/app/pb_kits/playbook/pb_date_picker/docs/_description.md +4 -2
  36. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +3 -1
  37. data/app/pb_kits/playbook/pb_date_picker/docs/index.js +1 -0
  38. data/app/pb_kits/playbook/pb_filter/Filter/FilterDouble.jsx +20 -3
  39. data/app/pb_kits/playbook/pb_filter/Filter/FilterSingle.jsx +51 -31
  40. data/app/pb_kits/playbook/pb_filter/Filter/FiltersPopover.jsx +3 -4
  41. data/app/pb_kits/playbook/pb_filter/Filter/SortMenu.jsx +2 -2
  42. data/app/pb_kits/playbook/pb_filter/Filter/index.jsx +17 -16
  43. data/app/pb_kits/playbook/pb_filter/_filter.html.erb +1 -1
  44. data/app/pb_kits/playbook/pb_filter/_filter.scss +0 -2
  45. data/app/pb_kits/playbook/pb_filter/docs/_filter_min_width.html.erb +41 -0
  46. data/app/pb_kits/playbook/pb_filter/docs/_filter_min_width.jsx +57 -0
  47. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_background.jsx +0 -41
  48. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_background.md +1 -0
  49. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_sort.html.erb +35 -0
  50. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_sort.jsx +47 -0
  51. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_sort.md +1 -0
  52. data/app/pb_kits/playbook/pb_filter/docs/_filter_only.html.erb +1 -1
  53. data/app/pb_kits/playbook/pb_filter/docs/_filter_single.html.erb +1 -1
  54. data/app/pb_kits/playbook/pb_filter/docs/example.yml +4 -0
  55. data/app/pb_kits/playbook/pb_filter/docs/index.js +2 -0
  56. data/app/pb_kits/playbook/pb_filter/filter.rb +1 -0
  57. data/app/pb_kits/playbook/pb_filter/templates/_core.html.erb +9 -9
  58. data/app/pb_kits/playbook/pb_filter/templates/_default.html.erb +1 -1
  59. data/app/pb_kits/playbook/pb_nav/_horizontal_nav.scss +22 -0
  60. data/app/pb_kits/playbook/pb_nav/_item.jsx +3 -0
  61. data/app/pb_kits/playbook/pb_nav/_subtle_mixin.scss +47 -0
  62. data/app/pb_kits/playbook/pb_nav/_vertical_nav.scss +2 -46
  63. data/app/pb_kits/playbook/pb_nav/docs/_new_tab.html.erb +6 -0
  64. data/app/pb_kits/playbook/pb_nav/docs/_new_tab.jsx +34 -0
  65. data/app/pb_kits/playbook/pb_nav/docs/_subtle_horizontal_nav.html.erb +6 -0
  66. data/app/pb_kits/playbook/pb_nav/docs/_subtle_horizontal_nav.jsx +33 -0
  67. data/app/pb_kits/playbook/pb_nav/docs/example.yml +4 -1
  68. data/app/pb_kits/playbook/pb_nav/docs/index.js +2 -0
  69. data/app/pb_kits/playbook/pb_nav/item.rb +5 -2
  70. data/app/pb_kits/playbook/pb_radio/_radio.jsx +4 -3
  71. data/app/pb_kits/playbook/pb_radio/docs/_radio_default.jsx +3 -0
  72. data/app/pb_kits/playbook/pb_radio/docs/index.js +1 -0
  73. data/app/pb_kits/playbook/pb_radio/radio.test.js +71 -0
  74. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_preview.html.erb +25 -0
  75. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_preview.jsx +45 -0
  76. data/app/pb_kits/playbook/pb_rich_text_editor/docs/example.yml +3 -1
  77. data/app/pb_kits/playbook/pb_rich_text_editor/docs/index.js +1 -0
  78. data/app/pb_kits/playbook/pb_select/_select.jsx +4 -3
  79. data/app/pb_kits/playbook/pb_select/select.test.js +51 -0
  80. data/app/pb_kits/playbook/pb_stat_change/_stat_change.html.erb +1 -1
  81. data/app/pb_kits/playbook/pb_stat_change/_stat_change.jsx +8 -4
  82. data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_default.html.erb +1 -1
  83. data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit.html.erb +17 -0
  84. data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit.jsx +28 -0
  85. data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit_two.html.erb +20 -0
  86. data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit_two.jsx +31 -0
  87. data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit_two.md +1 -0
  88. data/app/pb_kits/playbook/pb_stat_change/docs/example.yml +6 -4
  89. data/app/pb_kits/playbook/pb_stat_change/docs/index.js +2 -0
  90. data/app/pb_kits/playbook/pb_stat_change/stat_change.rb +12 -7
  91. data/app/pb_kits/playbook/pb_table/_table.scss +1 -57
  92. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.html.erb +1 -1
  93. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.jsx +1 -1
  94. data/app/pb_kits/playbook/pb_table/styles/_alignment.scss +32 -0
  95. data/app/pb_kits/playbook/pb_table/styles/_all.scss +4 -3
  96. data/app/pb_kits/playbook/pb_table/styles/_side_highlight.scss +24 -0
  97. data/app/pb_kits/playbook/pb_text_input/_text_input.jsx +8 -4
  98. data/app/pb_kits/playbook/pb_text_input/docs/_description.md +2 -1
  99. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_custom.jsx +7 -1
  100. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_default.jsx +78 -56
  101. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.jsx +19 -11
  102. data/app/pb_kits/playbook/pb_text_input/text_input.test.js +77 -0
  103. data/app/pb_kits/playbook/pb_textarea/_textarea.jsx +5 -5
  104. data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +10 -7
  105. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_default.html.erb +4 -4
  106. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_selectors.html.erb +17 -0
  107. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_selectors.md +3 -0
  108. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_white.html.erb +1 -1
  109. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_with_icon_circle.html.erb +10 -0
  110. data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +2 -0
  111. data/app/pb_kits/playbook/pb_tooltip/index.js +87 -37
  112. data/app/pb_kits/playbook/pb_tooltip/tooltip.rb +3 -1
  113. data/app/pb_kits/playbook/pb_typeahead/_typeahead.jsx +5 -1
  114. data/app/pb_kits/playbook/pb_typeahead/components/Option.jsx +2 -3
  115. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async.html.erb +19 -3
  116. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async.jsx +4 -2
  117. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async.md +10 -2
  118. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +5 -0
  119. data/app/pb_kits/playbook/react_rails_kits.js +1 -0
  120. data/lib/playbook.rb +6 -17
  121. data/lib/playbook/engine.rb +0 -3
  122. data/{app/pb_kits → lib}/playbook/props.rb +0 -0
  123. data/{app/pb_kits → lib}/playbook/props/array.rb +0 -0
  124. data/{app/pb_kits → lib}/playbook/props/base.rb +19 -3
  125. data/{app/pb_kits → lib}/playbook/props/boolean.rb +0 -0
  126. data/{app/pb_kits → lib}/playbook/props/date.rb +0 -0
  127. data/{app/pb_kits → lib}/playbook/props/enum.rb +0 -0
  128. data/{app/pb_kits → lib}/playbook/props/hash.rb +0 -0
  129. data/{app/pb_kits → lib}/playbook/props/hash_array.rb +0 -0
  130. data/{app/pb_kits → lib}/playbook/props/number.rb +0 -0
  131. data/{app/pb_kits → lib}/playbook/props/number_array.rb +0 -0
  132. data/{app/pb_kits → lib}/playbook/props/numeric.rb +0 -0
  133. data/{app/pb_kits → lib}/playbook/props/percentage.rb +0 -0
  134. data/{app/pb_kits → lib}/playbook/props/proc.rb +0 -0
  135. data/{app/pb_kits → lib}/playbook/props/string.rb +0 -0
  136. data/lib/playbook/version.rb +1 -1
  137. metadata +58 -28
  138. data/app/helpers/playbook/layout_helper.rb +0 -9
  139. data/app/pb_kits/playbook/pb_currency/docs/_currency_medium.html.erb +0 -21
  140. data/app/pb_kits/playbook/pb_table/styles/_mixins.scss +0 -0
@@ -0,0 +1,6 @@
1
+ <%= pb_rails("nav", props: { orientation: "horizontal", variant: "subtle" }) do %>
2
+ <%= pb_rails("nav/item", props: { text: "About", link: "#" }) %>
3
+ <%= pb_rails("nav/item", props: { text: "Case Studies", link: "#", active: true }) %>
4
+ <%= pb_rails("nav/item", props: { text: "Service ", link: "#" }) %>
5
+ <%= pb_rails("nav/item", props: { text: "Contacts", link: "#" }) %>
6
+ <% end %>
@@ -0,0 +1,33 @@
1
+ import React from 'react'
2
+ import { Nav } from '../../'
3
+ import NavItem from '../_item.jsx'
4
+
5
+ const SubtleHorizontalNav = () => {
6
+ return (
7
+ <Nav
8
+ link="#"
9
+ orientation="horizontal"
10
+ variant="subtle"
11
+ >
12
+ <NavItem
13
+ link="#"
14
+ text="About"
15
+ />
16
+ <NavItem
17
+ active
18
+ link="#"
19
+ text="Case Studies"
20
+ />
21
+ <NavItem
22
+ link="#"
23
+ text="Service"
24
+ />
25
+ <NavItem
26
+ link="#"
27
+ text="Contacts"
28
+ />
29
+ </Nav>
30
+ )
31
+ }
32
+
33
+ export default SubtleHorizontalNav
@@ -9,8 +9,10 @@ examples:
9
9
  - subtle_with_icons_nav: Subtle With Icons
10
10
  - subtle_no_highlight_nav: Subtle No Highlight
11
11
  - horizontal_nav: Horizontal Nav
12
+ - subtle_horizontal_nav: Subtle Horizontal Nav
12
13
  - block_nav: Block
13
14
  - block_no_title_nav: Without Title
15
+ - new_tab: Open in a New Tab
14
16
 
15
17
  react:
16
18
  - default_nav: Default
@@ -22,6 +24,7 @@ examples:
22
24
  - subtle_with_icons_nav: Subtle With Icons
23
25
  - subtle_no_highlight_nav: Subtle No Highlight
24
26
  - horizontal_nav: Horizontal Nav
27
+ - subtle_horizontal_nav: Subtle Horizontal Nav
25
28
  - block_nav: Block
26
29
  - block_no_title_nav: Without Title
27
-
30
+ - new_tab: Open in a New Tab
@@ -1,5 +1,6 @@
1
1
  export { default as DefaultNav } from './_default_nav.jsx'
2
2
  export { default as HorizontalNav } from './_horizontal_nav.jsx'
3
+ export { default as SubtleHorizontalNav } from './_subtle_horizontal_nav.jsx'
3
4
  export { default as BlockNav } from './_block_nav.jsx'
4
5
  export { default as BlockNoTitleNav } from './_block_no_title_nav.jsx'
5
6
  export { default as NoHighlightNav } from './_no_highlight_nav.jsx'
@@ -9,3 +10,4 @@ export { default as SubtleNoHighlightNav } from './_subtle_no_highlight_nav.jsx'
9
10
  export { default as WithIconsNav } from './_with_icons_nav.jsx'
10
11
  export { default as SubtleWithIconsNav } from './_subtle_with_icons_nav.jsx'
11
12
  export { default as WithImgNav } from './_with_img_nav.jsx'
13
+ export { default as NewTab } from './_new_tab.jsx'
@@ -13,7 +13,9 @@ module Playbook
13
13
  prop :icon_left
14
14
  prop :icon_right
15
15
  prop :image_url
16
-
16
+ prop :target, type: Playbook::Props::Enum,
17
+ values: %w[_blank _self _parent _top],
18
+ default: "_self"
17
19
  def classname
18
20
  generate_classname("pb_nav_list_kit_item", active_class)
19
21
  end
@@ -30,7 +32,8 @@ module Playbook
30
32
 
31
33
  def link_options
32
34
  options.merge(
33
- href: link
35
+ href: link,
36
+ target: target
34
37
  )
35
38
  end
36
39
 
@@ -1,7 +1,7 @@
1
1
  /* @flow */
2
2
  /*eslint-disable react/no-multi-comp, flowtype/space-before-type-colon */
3
3
 
4
- import React from 'react'
4
+ import React, { forwardRef } from 'react'
5
5
  import Body from '../pb_body/_body.jsx'
6
6
  import classnames from 'classnames'
7
7
  import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
@@ -37,7 +37,7 @@ const Radio = ({
37
37
  value = 'radio_text',
38
38
  onChange = () => {},
39
39
  ...props
40
- }: RadioProps) => {
40
+ }: RadioProps, ref) => {
41
41
  const ariaProps = buildAriaProps(aria)
42
42
  const dataProps = buildDataProps(data)
43
43
  const classes = classnames(buildCss('pb_radio_kit'), { error }, { dark }, globalProps(props), className)
@@ -57,6 +57,7 @@ const Radio = ({
57
57
  id={id}
58
58
  name={name}
59
59
  onChange={onChange}
60
+ ref={ref}
60
61
  text={text}
61
62
  type="radio"
62
63
  value={value}
@@ -72,4 +73,4 @@ const Radio = ({
72
73
  )
73
74
  }
74
75
 
75
- export default Radio
76
+ export default forwardRef(Radio)
@@ -2,12 +2,15 @@ import React from 'react'
2
2
  import { Radio } from '../../'
3
3
 
4
4
  const RadioDefault = () => {
5
+ const ref = React.createRef()
6
+
5
7
  return (
6
8
  <div>
7
9
  <Radio
8
10
  defaultChecked
9
11
  label="Power"
10
12
  name="Group2"
13
+ ref={ref}
11
14
  value="Power"
12
15
  />
13
16
  <br />
@@ -1,2 +1,3 @@
1
1
  export { default as RadioDefault } from './_radio_default.jsx'
2
2
  export { default as RadioCustom } from './_radio_custom.jsx'
3
+ export { default as RadioError } from './_radio_error.jsx'
@@ -0,0 +1,71 @@
1
+ import React from 'react'
2
+ import { render, screen } from '../utilities/test-utils'
3
+
4
+ import Radio from './_radio'
5
+
6
+ const testId = 'radio1',
7
+ kitClass = 'pb_radio_kit'
8
+
9
+ test('returns namespaced class name', () => {
10
+ render(
11
+ <Radio
12
+ data={{ testid: testId }}
13
+ defaultChecked
14
+ label="Power"
15
+ name="Group2"
16
+ value="Power"
17
+ />
18
+ )
19
+
20
+ const kit = screen.getByTestId(testId)
21
+ expect(kit).toHaveClass(kitClass)
22
+ })
23
+
24
+ test('returns dark class name', () => {
25
+ render(
26
+ <Radio
27
+ dark
28
+ data={{ testid: testId }}
29
+ defaultChecked
30
+ label="Power"
31
+ name="Group2"
32
+ value="Power"
33
+ />
34
+ )
35
+
36
+ const kit = screen.getByTestId(testId)
37
+ expect(kit).toHaveClass(`${kitClass} dark`)
38
+ })
39
+
40
+ test('returns error class name', () => {
41
+ render(
42
+ <Radio
43
+ data={{ testid: testId }}
44
+ defaultChecked
45
+ error
46
+ label="Power"
47
+ name="Group2"
48
+ value="Power"
49
+ />
50
+ )
51
+
52
+ const kit = screen.getByTestId(testId)
53
+ expect(kit).toHaveClass(`${kitClass} error`)
54
+ })
55
+
56
+ test('returns dark + error class name', () => {
57
+ render(
58
+ <Radio
59
+ dark
60
+ data={{ testid: testId }}
61
+ defaultChecked
62
+ error
63
+ label="Power"
64
+ name="Group2"
65
+ value="Power"
66
+ />
67
+ )
68
+
69
+ const kit = screen.getByTestId(testId)
70
+ expect(kit).toHaveClass(`${kitClass} dark error`)
71
+ })
@@ -0,0 +1,25 @@
1
+
2
+ <%= pb_rails("rich_text_editor", props: { id: "content-preview-editor" }) %>
3
+ <div id="card-obfuscation" style="display:none">
4
+ <%= pb_rails("card", props: { margin_top: "md" }) do %>
5
+ <div id="content-preview" class="trix-content">
6
+ </div>
7
+ <% end %>
8
+ </div>
9
+ <%= pb_rails("button", props: { id: "preview-button", variant: "secondary", margin_top: "md" }) do %>
10
+ <span>Preview Output</span>
11
+ <% end %>
12
+
13
+ <script>
14
+ // Button event handler
15
+ const button = document.getElementById('preview-button');
16
+ button.addEventListener('click', function() {
17
+ const content = document.getElementById('content-preview-editor');
18
+ const previewArea = document.getElementById('content-preview');
19
+ const cardDiv = document.getElementById('card-obfuscation');
20
+
21
+ previewArea.innerHTML = content.value;
22
+ cardDiv.classList.add('mt_md');
23
+ cardDiv.style.display = 'block';
24
+ });
25
+ </script>
@@ -0,0 +1,45 @@
1
+ import React, { useState } from 'react'
2
+ import {
3
+ Button,
4
+ Card,
5
+ RichTextEditor,
6
+ } from '../../'
7
+
8
+ const RichTextEditorPreview = () => {
9
+ const [showPreview, setShowPreview] = useState(false)
10
+ const [previewText, setPreviewText] = useState(<div />)
11
+
12
+ const handleChange = (event) => setPreviewText(event)
13
+ const handleClick = () => {
14
+ setShowPreview(true)
15
+ }
16
+
17
+ return (
18
+ <div>
19
+ <RichTextEditor
20
+ id="content-preview-editor"
21
+ onChange={handleChange}
22
+ />
23
+ <If condition={showPreview}>
24
+ <Card marginTop="md">
25
+ <div
26
+ className="trix-content"
27
+ // eslint-disable-next-line react/no-danger
28
+ dangerouslySetInnerHTML={{ __html: previewText }}
29
+ id="preview-content"
30
+ />
31
+ </Card>
32
+ <Else />
33
+ <div />
34
+ </If>
35
+ <Button
36
+ id="preview-button"
37
+ marginTop="md"
38
+ onClick={handleClick}
39
+ text="Preview Output"
40
+ variant="secondary"
41
+ />
42
+ </div>
43
+ )
44
+ }
45
+ export default RichTextEditorPreview
@@ -1,11 +1,12 @@
1
1
  examples:
2
-
2
+
3
3
  rails:
4
4
  - rich_text_editor_default: Default
5
5
  - rich_text_editor_simple: Simple
6
6
  - rich_text_editor_focus: Focus
7
7
  - rich_text_editor_sticky: Sticky
8
8
  - rich_text_editor_templates: Templates
9
+ - rich_text_editor_preview: Preview
9
10
 
10
11
  react:
11
12
  - rich_text_editor_default: Default
@@ -13,3 +14,4 @@ examples:
13
14
  - rich_text_editor_focus: Focus
14
15
  - rich_text_editor_sticky: Sticky
15
16
  - rich_text_editor_templates: Templates
17
+ - rich_text_editor_preview: Preview
@@ -3,3 +3,4 @@ export { default as RichTextEditorSimple } from './_rich_text_editor_simple.jsx'
3
3
  export { default as RichTextEditorFocus } from './_rich_text_editor_focus.jsx'
4
4
  export { default as RichTextEditorSticky } from './_rich_text_editor_sticky.jsx'
5
5
  export { default as RichTextEditorTemplates } from './_rich_text_editor_templates.jsx'
6
+ export { default as RichTextEditorPreview } from './_rich_text_editor_preview.jsx'
@@ -1,6 +1,6 @@
1
1
  /* @flow */
2
2
 
3
- import React from 'react'
3
+ import React, { forwardRef } from 'react'
4
4
  import classnames from 'classnames'
5
5
  import {
6
6
  Body,
@@ -69,7 +69,7 @@ const Select = ({
69
69
  required = false,
70
70
  value,
71
71
  ...props
72
- }: SelectProps) => {
72
+ }: SelectProps, ref: React.ElementRef<"select">) => {
73
73
  const ariaProps = buildAriaProps(aria)
74
74
  const dataProps = buildDataProps(data)
75
75
  const optionsList = createOptions(options)
@@ -107,6 +107,7 @@ const Select = ({
107
107
  multiple={multiple}
108
108
  name={name}
109
109
  onChange={onChange}
110
+ ref={ref}
110
111
  required={required}
111
112
  value={value}
112
113
  >
@@ -132,4 +133,4 @@ const Select = ({
132
133
  )
133
134
  }
134
135
 
135
- export default Select
136
+ export default forwardRef(Select)
@@ -0,0 +1,51 @@
1
+ import React from 'react'
2
+ import { render, screen } from '../utilities/test-utils'
3
+
4
+ import Select from './_select'
5
+
6
+ const testId = 'select1',
7
+ kitClass = 'pb_select'
8
+
9
+ const options = [
10
+ {
11
+ value: '1',
12
+ text: 'Burgers',
13
+ },
14
+ {
15
+ value: '2',
16
+ text: 'Pizza',
17
+ },
18
+ {
19
+ value: '3',
20
+ text: 'Tacos',
21
+ },
22
+ ]
23
+
24
+ test('returns namespaced class name', () => {
25
+ render(
26
+ <Select
27
+ data={{ testid: testId }}
28
+ label="Favorite Food"
29
+ name="food"
30
+ options={options}
31
+ />
32
+ )
33
+
34
+ const kit = screen.getByTestId(testId)
35
+ expect(kit).toHaveClass(kitClass)
36
+ })
37
+
38
+ test('returns dark class name', () => {
39
+ render(
40
+ <Select
41
+ dark
42
+ data={{ testid: testId }}
43
+ label="Favorite Food"
44
+ name="food"
45
+ options={options}
46
+ />
47
+ )
48
+
49
+ const kit = screen.getByTestId(testId)
50
+ expect(kit).toHaveClass(`${kitClass} dark`)
51
+ })
@@ -3,7 +3,7 @@
3
3
  data: object.data,
4
4
  class: object.classname) do %>
5
5
  <%= pb_rails("body", props: { status: object.status }) do %>
6
- <%= pb_rails("icon", props: { fixed_width: true, icon: object.icon }) if object.icon %>
6
+ <%= pb_rails("icon", props: { fixed_width: true, icon: object.returned_icon }) if object.returned_icon %>
7
7
  <%= "#{object.value}%" if object.value %>
8
8
  <% end %>
9
9
  <% end %>
@@ -20,14 +20,18 @@ const iconMap = {
20
20
  type StatChangeProps = {
21
21
  change?: "increase" | "decrease" | "neutral",
22
22
  className?: string,
23
+ icon?: string,
23
24
  id?: string,
24
25
  value?: string | number,
25
26
  }
26
27
 
27
28
  const StatChange = (props: StatChangeProps) => {
28
- const { change = 'neutral', className, id, value } = props
29
+ const { change = 'neutral', className, icon, id, value } = props
29
30
  const status = statusMap[change] || 'neutral'
30
- const icon = iconMap[change]
31
+ let returnedIcon = iconMap[change]
32
+ if (icon) {
33
+ returnedIcon = icon
34
+ }
31
35
 
32
36
  return (
33
37
  <If condition={value}>
@@ -40,10 +44,10 @@ const StatChange = (props: StatChangeProps) => {
40
44
  id={id}
41
45
  >
42
46
  <Body status={status}>
43
- <If condition={icon}>
47
+ <If condition={returnedIcon}>
44
48
  <Icon
45
49
  fixed_width
46
- icon={icon}
50
+ icon={returnedIcon}
47
51
  />
48
52
  {' '}
49
53
  </If>
@@ -1,6 +1,6 @@
1
1
  <%= pb_rails("stat_change", props: {
2
2
  change: "increase",
3
- value: 28.4
3
+ value: 28.4,
4
4
  }) %>
5
5
 
6
6
  <br>