playbook_ui 12.10.0 → 12.12.0.pre.alpha.PLAY697sandpacklayoutstyles413
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.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +1 -1
- data/app/pb_kits/playbook/pb_button/_button.tsx +15 -3
- data/app/pb_kits/playbook/pb_button/button.rb +10 -1
- data/app/pb_kits/playbook/pb_button/button.test.js +92 -61
- data/app/pb_kits/playbook/pb_button/docs/_button_link.html.erb +3 -2
- data/app/pb_kits/playbook/pb_button/docs/_button_link.jsx +12 -2
- data/app/pb_kits/playbook/pb_button/docs/_button_link.md +1 -0
- data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.tsx +3 -3
- data/app/pb_kits/playbook/pb_circle_chart/circle_chart.rb +3 -0
- data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_custom_tooltip.html.erb +20 -0
- data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_custom_tooltip.jsx +31 -0
- data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_custom_tooltip.md +3 -0
- data/app/pb_kits/playbook/pb_circle_chart/docs/example.yml +3 -1
- data/app/pb_kits/playbook/pb_circle_chart/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_date_picker/sass_partials/_day_styles.scss +1 -1
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.tsx +13 -1
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_auto_close.jsx +68 -0
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_auto_close.md +1 -0
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.rb +6 -1
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/index.js +17 -0
- data/app/pb_kits/playbook/pb_rich_text_editor/{_rich_text_editor.jsx → _rich_text_editor.tsx} +40 -32
- data/app/pb_kits/playbook/pb_rich_text_editor/{inlineFocus.js → inlineFocus.ts} +1 -1
- data/app/pb_kits/playbook/pb_rich_text_editor/{useFocus.js → useFocus.ts} +1 -1
- data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.tsx +1 -0
- data/app/pb_kits/playbook/pb_selectable_card_icon/_selectable_card_icon.test.js +67 -0
- data/app/pb_kits/playbook/pb_selectable_card_icon/{_selectable_card_icon.jsx → _selectable_card_icon.tsx} +26 -28
- data/app/pb_kits/playbook/pb_source/{_source.jsx → _source.tsx} +33 -29
- data/app/pb_kits/playbook/pb_source/source.test.js +82 -0
- data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +4 -1
- data/lib/playbook/version.rb +2 -2
- metadata +20 -12
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: eac850ebbc05e1ce91f38e6377564b32fa3ba241de3ff599b5e0084a39666223
|
|
4
|
+
data.tar.gz: 2ce42692684f6598b0c22d7e763ff9bd815044bd28ea806b659746d1f73ea098
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 268d73b140d2e8aeb3086a4588b2a42c3f3c0dd26d7c4112b37583bcd85e9657fe59e6854042e2a8c9ca02bb139e4aef5aec926430d9da6f2b98c2c1b92d2d2e
|
|
7
|
+
data.tar.gz: f58ed28b37d12a8e3555f44612a907aabb5e60b81cba57c78c017bb86328c6d437d14999849106847bc5967f59f51daac1c3e5bca921f7e7f7958dffc1ee843a
|
|
@@ -7,7 +7,7 @@ import { globalProps, GlobalProps } from '../utilities/globalProps'
|
|
|
7
7
|
import Image from '../pb_image/_image'
|
|
8
8
|
import OnlineStatus from '../pb_online_status/_online_status'
|
|
9
9
|
|
|
10
|
-
type AvatarProps = {
|
|
10
|
+
export type AvatarProps = {
|
|
11
11
|
aria?: {[key: string]: string},
|
|
12
12
|
className?: string,
|
|
13
13
|
data?: {[key: string]: string},
|
|
@@ -25,6 +25,7 @@ type ButtonPropTypes = {
|
|
|
25
25
|
onClick?: EventHandler,
|
|
26
26
|
tabIndex?: number,
|
|
27
27
|
size?: 'sm' | 'md' | 'lg',
|
|
28
|
+
target?: string,
|
|
28
29
|
text?: string,
|
|
29
30
|
type?: 'inline' | null,
|
|
30
31
|
htmlType?: 'submit' | 'reset' | 'button' | undefined,
|
|
@@ -70,6 +71,7 @@ const Button = (props: ButtonPropTypes) => {
|
|
|
70
71
|
tabIndex,
|
|
71
72
|
link = null,
|
|
72
73
|
newWindow = false,
|
|
74
|
+
target = '',
|
|
73
75
|
text,
|
|
74
76
|
htmlType = 'button',
|
|
75
77
|
value,
|
|
@@ -119,7 +121,17 @@ const Button = (props: ButtonPropTypes) => {
|
|
|
119
121
|
}
|
|
120
122
|
}
|
|
121
123
|
|
|
122
|
-
const
|
|
124
|
+
const getTargetAttribute = () => {
|
|
125
|
+
if (target && link) {
|
|
126
|
+
return target
|
|
127
|
+
} else if (newWindow) {
|
|
128
|
+
return '_blank'
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return null
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const displayButton = () => {
|
|
123
135
|
if (link)
|
|
124
136
|
return (
|
|
125
137
|
<a
|
|
@@ -128,10 +140,10 @@ const Button = (props: ButtonPropTypes) => {
|
|
|
128
140
|
className={css}
|
|
129
141
|
href={link}
|
|
130
142
|
id={id}
|
|
131
|
-
rel=
|
|
143
|
+
rel={target !== 'child' ? 'noreferrer' : null}
|
|
132
144
|
role="link"
|
|
133
145
|
tabIndex={tabIndex}
|
|
134
|
-
target={
|
|
146
|
+
target={getTargetAttribute()}
|
|
135
147
|
>
|
|
136
148
|
{ifLoading()}
|
|
137
149
|
</a>
|
|
@@ -18,6 +18,7 @@ module Playbook
|
|
|
18
18
|
prop :variant, type: Playbook::Props::Enum,
|
|
19
19
|
values: %w[primary secondary link],
|
|
20
20
|
default: "primary"
|
|
21
|
+
prop :target
|
|
21
22
|
prop :text
|
|
22
23
|
prop :type
|
|
23
24
|
prop :value
|
|
@@ -41,11 +42,19 @@ module Playbook
|
|
|
41
42
|
}.compact
|
|
42
43
|
end
|
|
43
44
|
|
|
45
|
+
def target_attribute
|
|
46
|
+
if target && link
|
|
47
|
+
target
|
|
48
|
+
elsif new_window
|
|
49
|
+
"_blank"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
44
53
|
def link_options
|
|
45
54
|
options.tap do |option|
|
|
46
55
|
option[:href] = link
|
|
47
56
|
option[:role] = "link"
|
|
48
|
-
option[:target] =
|
|
57
|
+
option[:target] = target_attribute if target_attribute.present?
|
|
49
58
|
option[:tabindex] = 0
|
|
50
59
|
end
|
|
51
60
|
end
|
|
@@ -6,97 +6,128 @@ import Button from './_button'
|
|
|
6
6
|
|
|
7
7
|
// Primary Test Variables
|
|
8
8
|
const htmlType = 'submit',
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
text = 'Button Text',
|
|
10
|
+
value = '1234'
|
|
11
11
|
|
|
12
12
|
test('passes type, text, and value props to button', () => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
13
|
+
render(
|
|
14
|
+
<Button
|
|
15
|
+
data={{ testid: 'primary-test' }}
|
|
16
|
+
htmlType={htmlType}
|
|
17
|
+
text={text}
|
|
18
|
+
value={value}
|
|
19
|
+
/>
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
const kit = screen.getByTestId('primary-test')
|
|
23
|
+
const content = screen.getByText(text)
|
|
24
|
+
|
|
25
|
+
expect(kit).toHaveClass('pb_button_kit_primary_inline_enabled')
|
|
26
|
+
expect(kit).toHaveAttribute('type', htmlType)
|
|
27
|
+
expect(kit).toHaveAttribute('value', value)
|
|
28
|
+
expect(content).toHaveTextContent(text)
|
|
29
29
|
})
|
|
30
30
|
|
|
31
31
|
// Link Test Variables
|
|
32
32
|
const link = 'https://www.google.com'
|
|
33
33
|
|
|
34
34
|
test('adds link to button', () => {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
render(
|
|
36
|
+
<Button
|
|
37
|
+
data={{ testid: 'link-test' }}
|
|
38
|
+
link={link}
|
|
39
|
+
/>
|
|
40
|
+
)
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
const kit = screen.getByTestId('link-test')
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
expect(kit).toHaveAttribute('href', link)
|
|
45
45
|
})
|
|
46
46
|
|
|
47
47
|
test('button with secondary variant', () => {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
48
|
+
render(
|
|
49
|
+
<Button
|
|
50
|
+
data={{ testid: 'variant-test' }}
|
|
51
|
+
variant="secondary"
|
|
52
|
+
/>
|
|
53
|
+
)
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
const kit = screen.getByTestId('variant-test')
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
expect(kit).toHaveClass('pb_button_kit_secondary_inline_enabled')
|
|
58
|
+
expect(kit).toHaveAttribute('type', 'button')
|
|
59
59
|
})
|
|
60
60
|
|
|
61
61
|
test('disable prop', () => {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
62
|
+
render(
|
|
63
|
+
<Button
|
|
64
|
+
data={{ testid: 'disable-test' }}
|
|
65
|
+
disabled
|
|
66
|
+
/>
|
|
67
|
+
)
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
const kit = screen.getByTestId('disable-test')
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
expect(kit).toBeDisabled()
|
|
72
72
|
})
|
|
73
73
|
|
|
74
74
|
test('click event', async () => {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
75
|
+
render(
|
|
76
|
+
<Button
|
|
77
|
+
data={{ testid: 'click-test' }}
|
|
78
|
+
onClick={() => appendAlert('clicked button!')}
|
|
79
|
+
/>
|
|
80
|
+
)
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
const kit = screen.getByTestId('click-test')
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
fireEvent.click(kit)
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
await waitFor(() => screen.getByText('clicked button!'))
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
expect(screen.getByText('clicked button!')).toBeInTheDocument()
|
|
89
89
|
})
|
|
90
90
|
|
|
91
91
|
test('size prop', () => {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
92
|
+
render(
|
|
93
|
+
<Button
|
|
94
|
+
data={{ testid: 'size-test' }}
|
|
95
|
+
size="sm"
|
|
96
|
+
/>
|
|
97
|
+
)
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
const kit = screen.getByTestId('size-test')
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
expect(kit).toHaveClass('pb_button_kit_primary_inline_enabled size_sm')
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
test('should render target prop', () => {
|
|
105
|
+
render(
|
|
106
|
+
<Button
|
|
107
|
+
data={{ testid: 'variant-test' }}
|
|
108
|
+
link="https://google.com"
|
|
109
|
+
target="_parent"
|
|
110
|
+
variant="secondary"
|
|
111
|
+
/>
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
const kit = screen.getByTestId('variant-test')
|
|
115
|
+
expect(kit).toHaveAttribute('target', '_parent')
|
|
116
|
+
expect(kit).toHaveAttribute('rel', 'noreferrer')
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
test('should render child target prop', () => {
|
|
120
|
+
render(
|
|
121
|
+
<Button
|
|
122
|
+
data={{ testid: 'variant-test' }}
|
|
123
|
+
link="https://google.com"
|
|
124
|
+
newWindow
|
|
125
|
+
target="child"
|
|
126
|
+
variant="secondary"
|
|
127
|
+
/>
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
const kit = screen.getByTestId('variant-test')
|
|
131
|
+
expect(kit).toHaveAttribute('target', 'child')
|
|
132
|
+
expect(kit).not.toHaveAttribute('rel')
|
|
102
133
|
})
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
<%= pb_rails("button", props: { text: "A Tag Button", aria: { label: "Link to Google" }, tag: "a", link: "http://google.com", margin_right: "lg" }) %>
|
|
2
|
-
<%= pb_rails("button", props: { text: "Open in new Window", aria: { label: "Link to Google in new window" }, new_window: true, link: "http://google.com",margin_right: "lg" }) %>
|
|
3
|
-
<%= pb_rails("button", props: { text: "
|
|
2
|
+
<%= pb_rails("button", props: { text: "Open in new Window", aria: { label: "Link to Google in new window" }, new_window: true, link: "http://google.com", margin_right: "lg" }) %>
|
|
3
|
+
<%= pb_rails("button", props: { text: "Open in a Child Tab", aria: { label: "Link to Playbook in new window" }, link: "https://playbook.powerapp.cloud/", margin_right: "lg", target: "child"}) %>
|
|
4
|
+
<%= pb_rails("button", props: { text: "A Tag Button Disabled", aria: { label: "Disabled link to Google" }, disabled: true, link: "http://google.com", margin_right: "lg" }) %>
|
|
@@ -2,7 +2,7 @@ import React from 'react'
|
|
|
2
2
|
import { Button } from '../../'
|
|
3
3
|
|
|
4
4
|
const ButtonLink = (props) => (
|
|
5
|
-
|
|
5
|
+
<>
|
|
6
6
|
<Button
|
|
7
7
|
aria={{ label: 'Link to Google' }}
|
|
8
8
|
link="https://google.com"
|
|
@@ -22,6 +22,16 @@ const ButtonLink = (props) => (
|
|
|
22
22
|
{...props}
|
|
23
23
|
/>
|
|
24
24
|
{' '}
|
|
25
|
+
<Button
|
|
26
|
+
aria={{ label: 'Link to Playbook in new window' }}
|
|
27
|
+
link="https://playbook.powerapp.cloud/"
|
|
28
|
+
marginRight='lg'
|
|
29
|
+
tabIndex={0}
|
|
30
|
+
target='child'
|
|
31
|
+
text="Open in a Child Tab"
|
|
32
|
+
{...props}
|
|
33
|
+
/>
|
|
34
|
+
{' '}
|
|
25
35
|
<Button
|
|
26
36
|
aria={{ label: 'Disabled link to Google' }}
|
|
27
37
|
disabled
|
|
@@ -31,7 +41,7 @@ const ButtonLink = (props) => (
|
|
|
31
41
|
text="A Tag Button Disabled"
|
|
32
42
|
{...props}
|
|
33
43
|
/>
|
|
34
|
-
|
|
44
|
+
</>
|
|
35
45
|
)
|
|
36
46
|
|
|
37
47
|
export default ButtonLink
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
The `link` prop accepts a string that is used as an href value and causes the button to act as a link. The default behavior of a link is to open in the current window. You can optionally alter the link behavior by adding the `newWindow` prop (boolean), which will open the link in a new window, or by calling the `target` prop, which accepts `_self`, `_blank`, `_parent`, `_top`, `child`, or any string, allowing you to specify any link target.
|
|
@@ -32,6 +32,7 @@ type CircleChartProps = {
|
|
|
32
32
|
startAngle?: number;
|
|
33
33
|
style?: string;
|
|
34
34
|
title?: string;
|
|
35
|
+
tooltipHtml: string;
|
|
35
36
|
useHtml?: boolean;
|
|
36
37
|
zMin?: number;
|
|
37
38
|
layout?: "horizontal" | "vertical" | "proximate";
|
|
@@ -78,6 +79,7 @@ const CircleChart = ({
|
|
|
78
79
|
startAngle = null,
|
|
79
80
|
style = "pie",
|
|
80
81
|
title,
|
|
82
|
+
tooltipHtml,
|
|
81
83
|
useHtml = false,
|
|
82
84
|
zMin = null,
|
|
83
85
|
layout = "horizontal",
|
|
@@ -100,9 +102,7 @@ const CircleChart = ({
|
|
|
100
102
|
Highcharts.setOptions({
|
|
101
103
|
tooltip: {
|
|
102
104
|
headerFormat: null,
|
|
103
|
-
pointFormat:
|
|
104
|
-
'<span style="font-weight: bold; color:{point.color};">●</span>{point.name}: ' +
|
|
105
|
-
"<b>{point.y}</b>",
|
|
105
|
+
pointFormat: tooltipHtml ? tooltipHtml : '<span style="font-weight: bold; color:{point.color};">●</span>{point.name}: ' + "<b>{point.y}</b>",
|
|
106
106
|
useHTML: useHtml,
|
|
107
107
|
},
|
|
108
108
|
});
|
|
@@ -24,6 +24,9 @@ module Playbook
|
|
|
24
24
|
prop :use_html, type: Playbook::Props::Boolean, default: false
|
|
25
25
|
prop :legend, type: Playbook::Props::Boolean, default: false
|
|
26
26
|
prop :title, default: ""
|
|
27
|
+
prop :tooltip_html, default: '<span style="font-weight: bold; color:{point.color};">● </span>
|
|
28
|
+
{point.name}: ' + '<b>{point.y}
|
|
29
|
+
</b>'
|
|
27
30
|
prop :height
|
|
28
31
|
prop :rounded, type: Playbook::Props::Boolean, default: false
|
|
29
32
|
prop :colors, type: Playbook::Props::Array,
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<% data = [{
|
|
2
|
+
name: 'Waiting for Calls',
|
|
3
|
+
value: 41,
|
|
4
|
+
},
|
|
5
|
+
{
|
|
6
|
+
name: 'On Call',
|
|
7
|
+
value: 49,
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
name: 'After call',
|
|
11
|
+
value: 10,
|
|
12
|
+
}
|
|
13
|
+
] %>
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
<%= pb_rails("circle_chart", props: {
|
|
17
|
+
chart_data: data,
|
|
18
|
+
tooltip_html: "<p>Custom tooltip for {point.name} <br/>with value: {point.y}</p>",
|
|
19
|
+
id: "default-test"
|
|
20
|
+
}) %>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
import CircleChart from '../_circle_chart'
|
|
4
|
+
|
|
5
|
+
const data = [
|
|
6
|
+
{
|
|
7
|
+
name: 'Waiting for Calls',
|
|
8
|
+
value: 41,
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: 'On Call',
|
|
12
|
+
value: 49,
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: 'After call',
|
|
16
|
+
value: 10,
|
|
17
|
+
},
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
const CircleChartCustomTooltip = (props) => (
|
|
21
|
+
<div>
|
|
22
|
+
<CircleChart
|
|
23
|
+
chartData={data}
|
|
24
|
+
id="circle-chart-default"
|
|
25
|
+
tooltipHtml= '<p>Custom tooltip for {point.name} <br/>with value: {point.y}</p>'
|
|
26
|
+
{...props}
|
|
27
|
+
/>
|
|
28
|
+
</div>
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
export default CircleChartCustomTooltip
|
|
@@ -9,7 +9,8 @@ examples:
|
|
|
9
9
|
- circle_chart_with_legend_kit: Legend
|
|
10
10
|
- circle_chart_legend_position: Legend Position
|
|
11
11
|
- circle_chart_with_title: Title
|
|
12
|
-
- circle_chart_inner_sizes: Inner Circle Size Options
|
|
12
|
+
- circle_chart_inner_sizes: Inner Circle Size Options
|
|
13
|
+
- circle_chart_custom_tooltip: Tooltip Customization
|
|
13
14
|
|
|
14
15
|
react:
|
|
15
16
|
- circle_chart_default: Default Style
|
|
@@ -22,5 +23,6 @@ examples:
|
|
|
22
23
|
- circle_chart_legend_position: Legend Position
|
|
23
24
|
- circle_chart_with_title: Title
|
|
24
25
|
- circle_chart_inner_sizes: Inner Circle Size Options
|
|
26
|
+
- circle_chart_custom_tooltip: Tooltip Customization
|
|
25
27
|
|
|
26
28
|
|
|
@@ -8,3 +8,4 @@ export { default as CircleChartWithLegendKit } from './_circle_chart_with_legend
|
|
|
8
8
|
export { default as CircleChartLegendPosition } from './_circle_chart_legend_position.jsx'
|
|
9
9
|
export { default as CircleChartWithTitle } from './_circle_chart_with_title.jsx'
|
|
10
10
|
export { default as CircleChartInnerSizes } from './_circle_chart_inner_sizes.jsx'
|
|
11
|
+
export { default as CircleChartCustomTooltip } from "./_circle_chart_custom_tooltip.jsx"
|
|
@@ -14,6 +14,7 @@ const iconMap = {
|
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
type FixedConfirmationToastProps = {
|
|
17
|
+
autoClose?: number;
|
|
17
18
|
className?: string;
|
|
18
19
|
closeable?: boolean;
|
|
19
20
|
data?: string;
|
|
@@ -30,11 +31,12 @@ type FixedConfirmationToastProps = {
|
|
|
30
31
|
const FixedConfirmationToast = (props: FixedConfirmationToastProps) => {
|
|
31
32
|
const [showToast, toggleToast] = useState(true);
|
|
32
33
|
const {
|
|
34
|
+
autoClose = 0,
|
|
33
35
|
className,
|
|
34
36
|
closeable = false,
|
|
35
37
|
horizontal,
|
|
36
38
|
multiLine = false,
|
|
37
|
-
onClose = () => {},
|
|
39
|
+
onClose = () => { },
|
|
38
40
|
open = true,
|
|
39
41
|
status = "neutral",
|
|
40
42
|
text,
|
|
@@ -49,8 +51,18 @@ const FixedConfirmationToast = (props: FixedConfirmationToastProps) => {
|
|
|
49
51
|
);
|
|
50
52
|
const icon = iconMap[status];
|
|
51
53
|
|
|
54
|
+
const autoCloseToast = () => {
|
|
55
|
+
if (autoClose && open) {
|
|
56
|
+
setTimeout(() => {
|
|
57
|
+
toggleToast(false);
|
|
58
|
+
onClose();
|
|
59
|
+
}, autoClose);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
52
63
|
useEffect(() => {
|
|
53
64
|
toggleToast(open);
|
|
65
|
+
autoCloseToast();
|
|
54
66
|
}, [open]);
|
|
55
67
|
|
|
56
68
|
const handleClick = () => {
|
data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_auto_close.jsx
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import React, { useState } from 'react'
|
|
2
|
+
|
|
3
|
+
import Button from '../../pb_button/_button'
|
|
4
|
+
import FixedConfirmationToast from '../_fixed_confirmation_toast'
|
|
5
|
+
|
|
6
|
+
const FixedConfirmationToastAutoClose = (props) => {
|
|
7
|
+
|
|
8
|
+
const [open, setOpen] = useState(false)
|
|
9
|
+
const [openCloseable, setOpenCloseable] = useState(false)
|
|
10
|
+
|
|
11
|
+
const handleClick = () => {
|
|
12
|
+
setOpen(true)
|
|
13
|
+
}
|
|
14
|
+
const handleClickCloseable = () => {
|
|
15
|
+
setOpenCloseable(true)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const handleClose = () => {
|
|
19
|
+
setOpen(false)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const handleCloseCloseable = () => {
|
|
23
|
+
setOpenCloseable(false)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<>
|
|
28
|
+
<Button
|
|
29
|
+
onClick={handleClick}
|
|
30
|
+
text="Show Auto Close Toast"
|
|
31
|
+
variant="secondary"
|
|
32
|
+
{...props}
|
|
33
|
+
/>
|
|
34
|
+
{' '}
|
|
35
|
+
<Button
|
|
36
|
+
onClick={handleClickCloseable}
|
|
37
|
+
text="Show Closeable Auto Close Toast"
|
|
38
|
+
variant="secondary"
|
|
39
|
+
{...props}
|
|
40
|
+
/>
|
|
41
|
+
|
|
42
|
+
<FixedConfirmationToast
|
|
43
|
+
autoClose={3000}
|
|
44
|
+
horizontal='center'
|
|
45
|
+
onClose={handleClose}
|
|
46
|
+
open={open}
|
|
47
|
+
status='tip'
|
|
48
|
+
text='I will disappear in 3 seconds.'
|
|
49
|
+
vertical='top'
|
|
50
|
+
{...props}
|
|
51
|
+
/>
|
|
52
|
+
|
|
53
|
+
<FixedConfirmationToast
|
|
54
|
+
autoClose={10000}
|
|
55
|
+
closeable
|
|
56
|
+
horizontal='center'
|
|
57
|
+
onClose={handleCloseCloseable}
|
|
58
|
+
open={openCloseable}
|
|
59
|
+
status='tip'
|
|
60
|
+
text='I will disappear in 10 seconds.'
|
|
61
|
+
vertical='top'
|
|
62
|
+
{...props}
|
|
63
|
+
/>
|
|
64
|
+
</>
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export default FixedConfirmationToastAutoClose
|
data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_auto_close.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Auto close is used when you want the confirmation toast to close automatically after a certain time. `autoClose` property will be a delay number in ms.
|
|
@@ -2,3 +2,4 @@ export { default as FixedConfirmationToastDefault } from './_fixed_confirmation_
|
|
|
2
2
|
export { default as FixedConfirmationToastMultiLine } from './_fixed_confirmation_toast_multi_line.jsx'
|
|
3
3
|
export { default as FixedConfirmationToastClose } from './_fixed_confirmation_toast_close.jsx'
|
|
4
4
|
export { default as FixedConfirmationToastPositions } from './_fixed_confirmation_toast_positions.jsx'
|
|
5
|
+
export { default as FixedConfirmationToastAutoClose } from './_fixed_confirmation_toast_auto_close.jsx'
|
|
@@ -19,6 +19,7 @@ module Playbook
|
|
|
19
19
|
prop :vertical, type: Playbook::Props::Enum,
|
|
20
20
|
values: [nil, "top", "bottom"],
|
|
21
21
|
default: nil
|
|
22
|
+
prop :auto_close, type: Playbook::Props::Number
|
|
22
23
|
|
|
23
24
|
def show_text?
|
|
24
25
|
text.present?
|
|
@@ -28,6 +29,10 @@ module Playbook
|
|
|
28
29
|
closeable.present? ? " remove_toast" : ""
|
|
29
30
|
end
|
|
30
31
|
|
|
32
|
+
def auto_close_class
|
|
33
|
+
auto_close.present? ? " auto_close_#{auto_close}" : ""
|
|
34
|
+
end
|
|
35
|
+
|
|
31
36
|
def position_class
|
|
32
37
|
horizontal && vertical ? " positioned_toast #{vertical} #{horizontal}" : ""
|
|
33
38
|
end
|
|
@@ -50,7 +55,7 @@ module Playbook
|
|
|
50
55
|
end
|
|
51
56
|
|
|
52
57
|
def classname
|
|
53
|
-
generate_classname("pb_fixed_confirmation_toast_kit", status, multi_line_class) + close_class + position_class
|
|
58
|
+
generate_classname("pb_fixed_confirmation_toast_kit", status, multi_line_class) + close_class + position_class + auto_close_class
|
|
54
59
|
end
|
|
55
60
|
end
|
|
56
61
|
end
|
|
@@ -7,6 +7,8 @@ export default class PbFixedConfirmationToast extends PbEnhancedElement {
|
|
|
7
7
|
|
|
8
8
|
connect() {
|
|
9
9
|
this.self = this.element
|
|
10
|
+
this.autoCloseToast(this.self)
|
|
11
|
+
|
|
10
12
|
this.self.addEventListener('click', () => {
|
|
11
13
|
this.removeToast(this.self)
|
|
12
14
|
})
|
|
@@ -15,4 +17,19 @@ export default class PbFixedConfirmationToast extends PbEnhancedElement {
|
|
|
15
17
|
removeToast(elem) {
|
|
16
18
|
elem.parentNode.removeChild(elem)
|
|
17
19
|
}
|
|
20
|
+
|
|
21
|
+
autoCloseToast(element) {
|
|
22
|
+
const classListValues = element.classList.value
|
|
23
|
+
const hasAutoCloseClass = classListValues.includes('auto_close')
|
|
24
|
+
|
|
25
|
+
if (hasAutoCloseClass) {
|
|
26
|
+
const classList = classListValues.split(' ')
|
|
27
|
+
const autoCloseValue = classList[classList.length - 1].split('_')[2]
|
|
28
|
+
const autoCloseIntValue = parseInt(autoCloseValue)
|
|
29
|
+
|
|
30
|
+
setTimeout(() => {
|
|
31
|
+
this.removeToast(element)
|
|
32
|
+
}, autoCloseIntValue)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
18
35
|
}
|