playbook_ui 12.10.0 → 12.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +1 -1
  3. data/app/pb_kits/playbook/pb_button/_button.tsx +15 -3
  4. data/app/pb_kits/playbook/pb_button/button.rb +10 -1
  5. data/app/pb_kits/playbook/pb_button/button.test.js +92 -61
  6. data/app/pb_kits/playbook/pb_button/docs/_button_link.html.erb +3 -2
  7. data/app/pb_kits/playbook/pb_button/docs/_button_link.jsx +12 -2
  8. data/app/pb_kits/playbook/pb_button/docs/_button_link.md +1 -0
  9. data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.tsx +3 -3
  10. data/app/pb_kits/playbook/pb_circle_chart/circle_chart.rb +3 -0
  11. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_custom_tooltip.html.erb +20 -0
  12. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_custom_tooltip.jsx +31 -0
  13. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_custom_tooltip.md +3 -0
  14. data/app/pb_kits/playbook/pb_circle_chart/docs/example.yml +3 -1
  15. data/app/pb_kits/playbook/pb_circle_chart/docs/index.js +1 -0
  16. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_day_styles.scss +1 -1
  17. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.tsx +13 -1
  18. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_auto_close.jsx +68 -0
  19. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_auto_close.md +1 -0
  20. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/example.yml +1 -0
  21. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/index.js +1 -0
  22. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.rb +6 -1
  23. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/index.js +17 -0
  24. data/app/pb_kits/playbook/pb_rich_text_editor/{_rich_text_editor.jsx → _rich_text_editor.tsx} +40 -32
  25. data/app/pb_kits/playbook/pb_rich_text_editor/{inlineFocus.js → inlineFocus.ts} +1 -1
  26. data/app/pb_kits/playbook/pb_rich_text_editor/{useFocus.js → useFocus.ts} +1 -1
  27. data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.tsx +1 -0
  28. data/app/pb_kits/playbook/pb_selectable_card_icon/_selectable_card_icon.test.js +67 -0
  29. data/app/pb_kits/playbook/pb_selectable_card_icon/{_selectable_card_icon.jsx → _selectable_card_icon.tsx} +26 -28
  30. data/app/pb_kits/playbook/pb_source/{_source.jsx → _source.tsx} +33 -29
  31. data/app/pb_kits/playbook/pb_source/source.test.js +82 -0
  32. data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +4 -1
  33. data/lib/playbook/version.rb +2 -2
  34. metadata +15 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f9e1489462a3801b52dfe684f47a206bd828e7acef14d05c33d0f82fc2338cee
4
- data.tar.gz: 01d894ce63d37e36d7ba7cac5e6469c51f280b06d43a736046899300b3c6b230
3
+ metadata.gz: 52982a7fd482e46a592ec1dd33c640b2f4c3468c8c2c6ef89e63c2ac3aedc642
4
+ data.tar.gz: 9b01af38e5ed588b0d649a9ff770a3aa6529cf8673eec79919b197f9c1cdacaa
5
5
  SHA512:
6
- metadata.gz: 4ce7e5fa512dfe372904d822f263888f05557305935ff171c48582aa1d80a67ddbfb772a92598ecffce4d39a6399a6b34e27b754b4f11f46da116cb5db358030
7
- data.tar.gz: 47eccdf4be23394775ab3ebd74e0797d0b49290906dd0ae7da66d289b04702f374152cbc1180963ee5a0c9d8c31988d61a7421d00adeb34aa55ca1c150a81671
6
+ metadata.gz: a6c68065b2497b859a00255121fd7240cf0dc4f667c3c74ccccf1e59b6dae29d1a8c5146fe95780a1c9e5f90ced89fad71f79046a0c70b1723268e1674170b6d
7
+ data.tar.gz: '08ea2b02f9def8c1da0372a5a4b76a8740217256cb47582fda6d668736adbd936c7b086313a533a51ad0c1e809366068dfecf799dd5098b3d9296c83e374d638'
@@ -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 displayButton = () => {
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="noreferrer"
143
+ rel={target !== 'child' ? 'noreferrer' : null}
132
144
  role="link"
133
145
  tabIndex={tabIndex}
134
- target={newWindow ? '_blank' : null}
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] = "_blank" if new_window
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
- text = 'Button Text',
10
- value = '1234'
9
+ text = 'Button Text',
10
+ value = '1234'
11
11
 
12
12
  test('passes type, text, and value props to button', () => {
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)
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
- render(
36
- <Button
37
- data={{ testid: 'link-test' }}
38
- link={link}
39
- />
40
- )
35
+ render(
36
+ <Button
37
+ data={{ testid: 'link-test' }}
38
+ link={link}
39
+ />
40
+ )
41
41
 
42
- const kit = screen.getByTestId('link-test')
42
+ const kit = screen.getByTestId('link-test')
43
43
 
44
- expect(kit).toHaveAttribute('href', link)
44
+ expect(kit).toHaveAttribute('href', link)
45
45
  })
46
46
 
47
47
  test('button with secondary variant', () => {
48
- render(
49
- <Button
50
- data={{ testid: 'variant-test' }}
51
- variant="secondary"
52
- />
53
- )
48
+ render(
49
+ <Button
50
+ data={{ testid: 'variant-test' }}
51
+ variant="secondary"
52
+ />
53
+ )
54
54
 
55
- const kit = screen.getByTestId('variant-test')
55
+ const kit = screen.getByTestId('variant-test')
56
56
 
57
- expect(kit).toHaveClass('pb_button_kit_secondary_inline_enabled')
58
- expect(kit).toHaveAttribute('type', 'button')
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
- render(
63
- <Button
64
- data={{ testid: 'disable-test' }}
65
- disabled
66
- />
67
- )
62
+ render(
63
+ <Button
64
+ data={{ testid: 'disable-test' }}
65
+ disabled
66
+ />
67
+ )
68
68
 
69
- const kit = screen.getByTestId('disable-test')
69
+ const kit = screen.getByTestId('disable-test')
70
70
 
71
- expect(kit).toBeDisabled()
71
+ expect(kit).toBeDisabled()
72
72
  })
73
73
 
74
74
  test('click event', async () => {
75
- render(
76
- <Button
77
- data={{ testid: 'click-test' }}
78
- onClick={() => appendAlert('clicked button!')}
79
- />
80
- )
75
+ render(
76
+ <Button
77
+ data={{ testid: 'click-test' }}
78
+ onClick={() => appendAlert('clicked button!')}
79
+ />
80
+ )
81
81
 
82
- const kit = screen.getByTestId('click-test')
82
+ const kit = screen.getByTestId('click-test')
83
83
 
84
- fireEvent.click(kit)
84
+ fireEvent.click(kit)
85
85
 
86
- await waitFor(() => screen.getByText('clicked button!'))
86
+ await waitFor(() => screen.getByText('clicked button!'))
87
87
 
88
- expect(screen.getByText('clicked button!')).toBeInTheDocument()
88
+ expect(screen.getByText('clicked button!')).toBeInTheDocument()
89
89
  })
90
90
 
91
91
  test('size prop', () => {
92
- render(
93
- <Button
94
- data={{ testid: 'size-test' }}
95
- size="sm"
96
- />
97
- )
92
+ render(
93
+ <Button
94
+ data={{ testid: 'size-test' }}
95
+ size="sm"
96
+ />
97
+ )
98
98
 
99
- const kit = screen.getByTestId('size-test')
99
+ const kit = screen.getByTestId('size-test')
100
100
 
101
- expect(kit).toHaveClass('pb_button_kit_primary_inline_enabled size_sm')
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: "A Tag Button Disabled", aria: { label: "Disabled link to Google" }, disabled: true, 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: "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
- <div>
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
- </div>
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};">&#9679; </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
@@ -0,0 +1,3 @@
1
+ A custom tooltip format can be specified. The desired format can be passed as a `string` of custom HTML to the `tooltipHtml` prop.
2
+
3
+ `{point.name}` and `{point.y}` are useful values that can be referenced for each point in the graph.
@@ -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"
@@ -34,7 +34,7 @@
34
34
  }
35
35
  .flatpickr-day.inRange {
36
36
  background-color: #F7FBFF;
37
- border: 2px;
37
+ border-color: transparent;
38
38
  box-shadow: -$space_xs + 4 0 0 #F7FBFF, $space_xs - 3 0 0 #F7FBFF;
39
39
  }
40
40
  /*
@@ -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 = () => {
@@ -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
@@ -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.
@@ -11,3 +11,4 @@ examples:
11
11
  - fixed_confirmation_toast_multi_line: Multi Line
12
12
  - fixed_confirmation_toast_close: Click to Close
13
13
  - fixed_confirmation_toast_positions: Click to Show Positions
14
+ - fixed_confirmation_toast_auto_close: Click to Show Auto Close
@@ -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
  }