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.
- checksums.yaml +4 -4
- data/app/controllers/playbook/application_controller.rb +5 -3
- data/app/helpers/playbook/application_helper.rb +13 -19
- data/app/helpers/playbook/pb_doc_helper.rb +41 -20
- data/app/helpers/playbook/pb_kit_helper.rb +1 -25
- data/app/helpers/playbook/pb_sample_helper.rb +24 -23
- data/app/pb_kits/playbook/_playbook.scss +1 -1
- data/app/pb_kits/playbook/config/_kit_example.html.erb +18 -4
- data/app/pb_kits/playbook/config/_kit_ui.html.erb +21 -21
- data/app/pb_kits/playbook/pb_currency/_currency.html.erb +1 -1
- data/app/pb_kits/playbook/pb_currency/_currency.jsx +16 -1
- data/app/pb_kits/playbook/pb_currency/_currency.scss +23 -1
- data/app/pb_kits/playbook/pb_currency/currency.rb +22 -0
- data/app/pb_kits/playbook/pb_currency/docs/{_currency_small.html.erb → _currency_alignment.html.erb} +3 -3
- data/app/pb_kits/playbook/pb_currency/docs/{_currency_small.jsx → _currency_alignment.jsx} +5 -5
- data/app/pb_kits/playbook/pb_currency/docs/_currency_no_symbol.html.erb +7 -0
- data/app/pb_kits/playbook/pb_currency/docs/_currency_no_symbol.jsx +17 -0
- data/app/pb_kits/playbook/pb_currency/docs/{_currency_large.html.erb → _currency_size.html.erb} +8 -7
- data/app/pb_kits/playbook/pb_currency/docs/{_currency_large.jsx → _currency_size.jsx} +9 -8
- data/app/pb_kits/playbook/pb_currency/docs/_currency_variants.html.erb +24 -0
- data/app/pb_kits/playbook/pb_currency/docs/{_currency_medium.jsx → _currency_variants.jsx} +13 -10
- data/app/pb_kits/playbook/pb_currency/docs/example.yml +8 -6
- data/app/pb_kits/playbook/pb_currency/docs/index.js +4 -3
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_anti_patterns.html.erb +23 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.html.erb +4 -4
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.jsx +2 -2
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.md +3 -1
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_disabled.html.erb +8 -8
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_flatpickr_methods.html.erb +27 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_flatpickr_methods.jsx +44 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_format.html.erb +4 -4
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_min_max.html.erb +2 -2
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range.html.erb +1 -1
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range.jsx +1 -1
- data/app/pb_kits/playbook/pb_date_picker/docs/_description.md +4 -2
- data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +3 -1
- data/app/pb_kits/playbook/pb_date_picker/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_filter/Filter/FilterDouble.jsx +20 -3
- data/app/pb_kits/playbook/pb_filter/Filter/FilterSingle.jsx +51 -31
- data/app/pb_kits/playbook/pb_filter/Filter/FiltersPopover.jsx +3 -4
- data/app/pb_kits/playbook/pb_filter/Filter/SortMenu.jsx +2 -2
- data/app/pb_kits/playbook/pb_filter/Filter/index.jsx +17 -16
- data/app/pb_kits/playbook/pb_filter/_filter.html.erb +1 -1
- data/app/pb_kits/playbook/pb_filter/_filter.scss +0 -2
- data/app/pb_kits/playbook/pb_filter/docs/_filter_min_width.html.erb +41 -0
- data/app/pb_kits/playbook/pb_filter/docs/_filter_min_width.jsx +57 -0
- data/app/pb_kits/playbook/pb_filter/docs/_filter_no_background.jsx +0 -41
- data/app/pb_kits/playbook/pb_filter/docs/_filter_no_background.md +1 -0
- data/app/pb_kits/playbook/pb_filter/docs/_filter_no_sort.html.erb +35 -0
- data/app/pb_kits/playbook/pb_filter/docs/_filter_no_sort.jsx +47 -0
- data/app/pb_kits/playbook/pb_filter/docs/_filter_no_sort.md +1 -0
- data/app/pb_kits/playbook/pb_filter/docs/_filter_only.html.erb +1 -1
- data/app/pb_kits/playbook/pb_filter/docs/_filter_single.html.erb +1 -1
- data/app/pb_kits/playbook/pb_filter/docs/example.yml +4 -0
- data/app/pb_kits/playbook/pb_filter/docs/index.js +2 -0
- data/app/pb_kits/playbook/pb_filter/filter.rb +1 -0
- data/app/pb_kits/playbook/pb_filter/templates/_core.html.erb +9 -9
- data/app/pb_kits/playbook/pb_filter/templates/_default.html.erb +1 -1
- data/app/pb_kits/playbook/pb_nav/_horizontal_nav.scss +22 -0
- data/app/pb_kits/playbook/pb_nav/_item.jsx +3 -0
- data/app/pb_kits/playbook/pb_nav/_subtle_mixin.scss +47 -0
- data/app/pb_kits/playbook/pb_nav/_vertical_nav.scss +2 -46
- data/app/pb_kits/playbook/pb_nav/docs/_new_tab.html.erb +6 -0
- data/app/pb_kits/playbook/pb_nav/docs/_new_tab.jsx +34 -0
- data/app/pb_kits/playbook/pb_nav/docs/_subtle_horizontal_nav.html.erb +6 -0
- data/app/pb_kits/playbook/pb_nav/docs/_subtle_horizontal_nav.jsx +33 -0
- data/app/pb_kits/playbook/pb_nav/docs/example.yml +4 -1
- data/app/pb_kits/playbook/pb_nav/docs/index.js +2 -0
- data/app/pb_kits/playbook/pb_nav/item.rb +5 -2
- data/app/pb_kits/playbook/pb_radio/_radio.jsx +4 -3
- data/app/pb_kits/playbook/pb_radio/docs/_radio_default.jsx +3 -0
- data/app/pb_kits/playbook/pb_radio/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_radio/radio.test.js +71 -0
- data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_preview.html.erb +25 -0
- data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_preview.jsx +45 -0
- data/app/pb_kits/playbook/pb_rich_text_editor/docs/example.yml +3 -1
- data/app/pb_kits/playbook/pb_rich_text_editor/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_select/_select.jsx +4 -3
- data/app/pb_kits/playbook/pb_select/select.test.js +51 -0
- data/app/pb_kits/playbook/pb_stat_change/_stat_change.html.erb +1 -1
- data/app/pb_kits/playbook/pb_stat_change/_stat_change.jsx +8 -4
- data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_default.html.erb +1 -1
- data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit.html.erb +17 -0
- data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit.jsx +28 -0
- data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit_two.html.erb +20 -0
- data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit_two.jsx +31 -0
- data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit_two.md +1 -0
- data/app/pb_kits/playbook/pb_stat_change/docs/example.yml +6 -4
- data/app/pb_kits/playbook/pb_stat_change/docs/index.js +2 -0
- data/app/pb_kits/playbook/pb_stat_change/stat_change.rb +12 -7
- data/app/pb_kits/playbook/pb_table/_table.scss +1 -57
- data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.html.erb +1 -1
- data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.jsx +1 -1
- data/app/pb_kits/playbook/pb_table/styles/_alignment.scss +32 -0
- data/app/pb_kits/playbook/pb_table/styles/_all.scss +4 -3
- data/app/pb_kits/playbook/pb_table/styles/_side_highlight.scss +24 -0
- data/app/pb_kits/playbook/pb_text_input/_text_input.jsx +8 -4
- data/app/pb_kits/playbook/pb_text_input/docs/_description.md +2 -1
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_custom.jsx +7 -1
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_default.jsx +78 -56
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.jsx +19 -11
- data/app/pb_kits/playbook/pb_text_input/text_input.test.js +77 -0
- data/app/pb_kits/playbook/pb_textarea/_textarea.jsx +5 -5
- data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +10 -7
- data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_default.html.erb +4 -4
- data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_selectors.html.erb +17 -0
- data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_selectors.md +3 -0
- data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_white.html.erb +1 -1
- data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_with_icon_circle.html.erb +10 -0
- data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_tooltip/index.js +87 -37
- data/app/pb_kits/playbook/pb_tooltip/tooltip.rb +3 -1
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.jsx +5 -1
- data/app/pb_kits/playbook/pb_typeahead/components/Option.jsx +2 -3
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async.html.erb +19 -3
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async.jsx +4 -2
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async.md +10 -2
- data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +5 -0
- data/app/pb_kits/playbook/react_rails_kits.js +1 -0
- data/lib/playbook.rb +6 -17
- data/lib/playbook/engine.rb +0 -3
- data/{app/pb_kits → lib}/playbook/props.rb +0 -0
- data/{app/pb_kits → lib}/playbook/props/array.rb +0 -0
- data/{app/pb_kits → lib}/playbook/props/base.rb +19 -3
- data/{app/pb_kits → lib}/playbook/props/boolean.rb +0 -0
- data/{app/pb_kits → lib}/playbook/props/date.rb +0 -0
- data/{app/pb_kits → lib}/playbook/props/enum.rb +0 -0
- data/{app/pb_kits → lib}/playbook/props/hash.rb +0 -0
- data/{app/pb_kits → lib}/playbook/props/hash_array.rb +0 -0
- data/{app/pb_kits → lib}/playbook/props/number.rb +0 -0
- data/{app/pb_kits → lib}/playbook/props/number_array.rb +0 -0
- data/{app/pb_kits → lib}/playbook/props/numeric.rb +0 -0
- data/{app/pb_kits → lib}/playbook/props/percentage.rb +0 -0
- data/{app/pb_kits → lib}/playbook/props/proc.rb +0 -0
- data/{app/pb_kits → lib}/playbook/props/string.rb +0 -0
- data/lib/playbook/version.rb +1 -1
- metadata +58 -28
- data/app/helpers/playbook/layout_helper.rb +0 -9
- data/app/pb_kits/playbook/pb_currency/docs/_currency_medium.html.erb +0 -21
- 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 />
|
@@ -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.
|
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
|
-
|
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={
|
47
|
+
<If condition={returnedIcon}>
|
44
48
|
<Icon
|
45
49
|
fixed_width
|
46
|
-
icon={
|
50
|
+
icon={returnedIcon}
|
47
51
|
/>
|
48
52
|
{' '}
|
49
53
|
</If>
|