playbook_ui 4.6.1 → 4.7.0

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +1 -0
  3. data/app/pb_kits/playbook/data/menu.yml +2 -1
  4. data/app/pb_kits/playbook/index.js +1 -0
  5. data/app/pb_kits/playbook/packs/examples.js +2 -0
  6. data/app/pb_kits/playbook/packs/kits/pb_form_pill.js +1 -0
  7. data/app/pb_kits/playbook/pb_form_pill/_form_pill.html.erb +22 -0
  8. data/app/pb_kits/playbook/pb_form_pill/_form_pill.jsx +60 -0
  9. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +49 -0
  10. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_tag.html.erb +4 -0
  11. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_tag.jsx +11 -0
  12. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_user.html.erb +12 -0
  13. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_user.jsx +19 -0
  14. data/app/pb_kits/playbook/pb_form_pill/docs/example.yml +10 -0
  15. data/app/pb_kits/playbook/pb_form_pill/docs/index.js +2 -0
  16. data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +23 -0
  17. data/app/pb_kits/playbook/pb_home_address_street/_city_emphasis.html.erb +40 -0
  18. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.html.erb +6 -35
  19. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.jsx +53 -17
  20. data/app/pb_kits/playbook/pb_home_address_street/_street_emphasis.html.erb +31 -0
  21. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_emphasis.html.erb +27 -0
  22. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_emphasis.jsx +36 -0
  23. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_emphasis.md +2 -0
  24. data/app/pb_kits/playbook/pb_home_address_street/docs/example.yml +2 -0
  25. data/app/pb_kits/playbook/pb_home_address_street/docs/index.js +1 -0
  26. data/app/pb_kits/playbook/pb_home_address_street/home_address_street.rb +11 -0
  27. data/app/pb_kits/playbook/pb_popover/_popover.jsx +102 -53
  28. data/app/pb_kits/playbook/pb_popover/docs/_description.md +13 -1
  29. data/app/pb_kits/playbook/pb_popover/docs/_popover_click_any.html.erb +19 -0
  30. data/app/pb_kits/playbook/pb_popover/docs/_popover_click_any.jsx +40 -0
  31. data/app/pb_kits/playbook/pb_popover/docs/_popover_click_inside.html.erb +14 -0
  32. data/app/pb_kits/playbook/pb_popover/docs/_popover_click_inside.jsx +40 -0
  33. data/app/pb_kits/playbook/pb_popover/docs/_popover_click_outside.html.erb +14 -0
  34. data/app/pb_kits/playbook/pb_popover/docs/_popover_click_outside.jsx +40 -0
  35. data/app/pb_kits/playbook/pb_popover/docs/_popover_default.jsx +18 -21
  36. data/app/pb_kits/playbook/pb_popover/docs/_popover_list.jsx +32 -34
  37. data/app/pb_kits/playbook/pb_popover/docs/_popover_portal.jsx +24 -26
  38. data/app/pb_kits/playbook/pb_popover/docs/_popover_with_button.jsx +24 -26
  39. data/app/pb_kits/playbook/pb_popover/docs/example.yml +7 -1
  40. data/app/pb_kits/playbook/pb_popover/docs/index.js +3 -0
  41. data/app/pb_kits/playbook/pb_popover/index.js +51 -3
  42. data/app/pb_kits/playbook/pb_popover/popover.rb +4 -0
  43. data/app/pb_kits/playbook/tokens/_colors.scss +1 -1
  44. data/lib/playbook/version.rb +1 -1
  45. metadata +24 -2
@@ -0,0 +1,14 @@
1
+ <%= pb_rails("button", props: { text: "Click me then click outside", variant: "secondary", id: 'outside-popover-1' }) %>
2
+ <%= pb_rails("popover", props: {
3
+ close_on_click: "outside",
4
+ trigger_element_id: "outside-popover-1",
5
+ tooltip_id: "outside-tooltip-1",
6
+ position: 'right',
7
+ offset: false
8
+ }) do %>
9
+ Whoa. I'm a popover that can be closed by clicking outside of me.
10
+ <% end %>
11
+
12
+
13
+
14
+
@@ -0,0 +1,40 @@
1
+ import React, { useState } from 'react'
2
+ import {
3
+ Button,
4
+ PbReactPopover,
5
+ } from '../..'
6
+
7
+ const PopoverClickOutside = () => {
8
+ const [showPopover, setShowPopover] = useState(false)
9
+
10
+ const handleTogglePopover = () => {
11
+ setShowPopover(!showPopover)
12
+ }
13
+
14
+ const handleShouldClosePopover = (shouldClosePopover) => {
15
+ setShowPopover(!shouldClosePopover)
16
+ }
17
+
18
+ const popoverTrigger = (
19
+ <Button
20
+ onClick={handleTogglePopover}
21
+ text="Button Secondary"
22
+ variant="secondary"
23
+ />
24
+ )
25
+
26
+ return (
27
+ <PbReactPopover
28
+ closeOnClick="outside"
29
+ offset
30
+ placement="bottom"
31
+ reference={popoverTrigger}
32
+ shouldClosePopover={handleShouldClosePopover}
33
+ show={showPopover}
34
+ >
35
+ {'Whoa. I\'m a popover.'}
36
+ </PbReactPopover>
37
+ )
38
+ }
39
+
40
+ export default PopoverClickOutside
@@ -1,29 +1,26 @@
1
- import React from 'react'
1
+ import React, { useState } from 'react'
2
2
  import {
3
3
  PbReactPopover,
4
4
  } from '../..'
5
5
 
6
- export default class PopoverDefault extends React.Component {
7
- state = {
8
- showPopover: false,
9
- }
6
+ const PopoverDefault = () => {
7
+ const [showPopover, setShowPopover] = useState(false)
10
8
 
11
- handleTogglePopover = () => {
12
- this.setState({ showPopover: !this.state.showPopover })
9
+ const handleTogglePopover = () => {
10
+ setShowPopover(!showPopover)
13
11
  }
12
+ const popoverReference = (
13
+ <span onClick={handleTogglePopover}>{'Click me.'}</span>
14
+ )
14
15
 
15
- render() {
16
- const popoverReference = (
17
- <span onClick={this.handleTogglePopover}>{'Click me.'}</span>
18
- )
19
-
20
- return (
21
- <PbReactPopover
22
- reference={popoverReference}
23
- show={this.state.showPopover}
24
- >
25
- {'Whoa. I\'m a popover.'}
26
- </PbReactPopover>
27
- )
28
- }
16
+ return (
17
+ <PbReactPopover
18
+ reference={popoverReference}
19
+ show={showPopover}
20
+ >
21
+ {'Whoa. I\'m a popover.'}
22
+ </PbReactPopover>
23
+ )
29
24
  }
25
+
26
+ export default PopoverDefault
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React, { useState } from 'react'
2
2
  import {
3
3
  Button,
4
4
  List,
@@ -6,41 +6,39 @@ import {
6
6
  PbReactPopover,
7
7
  } from '../..'
8
8
 
9
- export default class PopoverWithButton extends React.Component {
10
- state = {
11
- showPopover: false,
12
- }
9
+ const PopoverWithButton = () => {
10
+ const [showPopover, setShowPopover] = useState(false)
13
11
 
14
- handleTogglePopover = () => {
15
- this.setState({ showPopover: !this.state.showPopover })
12
+ const handleTogglePopover = () => {
13
+ setShowPopover(!showPopover)
16
14
  }
17
15
 
18
- render() {
19
- const popoverReference = (
20
- <Button
21
- onClick={this.handleTogglePopover}
22
- text="Button Secondary"
23
- variant="secondary"
24
- />
25
- )
16
+ const popoverReference = (
17
+ <Button
18
+ onClick={handleTogglePopover}
19
+ text="Button Secondary"
20
+ variant="secondary"
21
+ />
22
+ )
26
23
 
27
- return (
28
- <div style={{ height: '400px', textAlign: 'center' }}>
29
- <PbReactPopover
30
- offset
31
- placement="bottom"
32
- reference={popoverReference}
33
- show={this.state.showPopover}
34
- >
35
- <List>
36
- <ListItem>{'Popularity'}</ListItem>
37
- <ListItem>{'Title'}</ListItem>
38
- <ListItem>{'Duration'}</ListItem>
39
- <ListItem>{'Date Started'}</ListItem>
40
- <ListItem>{'Date Ended'}</ListItem>
41
- </List>
42
- </PbReactPopover>
43
- </div>
44
- )
45
- }
24
+ return (
25
+ <div style={{ height: '400px', textAlign: 'center' }}>
26
+ <PbReactPopover
27
+ offset
28
+ placement="bottom"
29
+ reference={popoverReference}
30
+ show={showPopover}
31
+ >
32
+ <List>
33
+ <ListItem>{'Popularity'}</ListItem>
34
+ <ListItem>{'Title'}</ListItem>
35
+ <ListItem>{'Duration'}</ListItem>
36
+ <ListItem>{'Date Started'}</ListItem>
37
+ <ListItem>{'Date Ended'}</ListItem>
38
+ </List>
39
+ </PbReactPopover>
40
+ </div>
41
+ )
46
42
  }
43
+
44
+ export default PopoverWithButton
@@ -1,36 +1,34 @@
1
- import React from 'react'
1
+ import React, { useState } from 'react'
2
2
  import {
3
3
  Button,
4
4
  PbReactPopover,
5
5
  } from '../..'
6
6
 
7
- export default class PopoverPortal extends React.Component {
8
- state = {
9
- showPopover: false,
10
- }
7
+ const PopoverPortal = () => {
8
+ const [showPopover, setShowPopover] = useState(false)
11
9
 
12
- handleTogglePopover = () => {
13
- this.setState({ showPopover: !this.state.showPopover })
10
+ const handleTogglePopover = () => {
11
+ setShowPopover(!showPopover)
14
12
  }
15
13
 
16
- render() {
17
- const popoverReference = (
18
- <Button
19
- onClick={this.handleTogglePopover}
20
- text="Button Secondary"
21
- variant="secondary"
22
- />
23
- )
14
+ const popoverReference = (
15
+ <Button
16
+ onClick={handleTogglePopover}
17
+ text="Button Secondary"
18
+ variant="secondary"
19
+ />
20
+ )
24
21
 
25
- return (
26
- <PbReactPopover
27
- placement="bottom"
28
- reference={popoverReference}
29
- show={this.state.showPopover}
30
- usePortal
31
- >
32
- {'Whoa. I\'m a portal popover.'}
33
- </PbReactPopover>
34
- )
35
- }
22
+ return (
23
+ <PbReactPopover
24
+ placement="bottom"
25
+ reference={popoverReference}
26
+ show={showPopover}
27
+ usePortal
28
+ >
29
+ {'Whoa. I\'m a portal popover.'}
30
+ </PbReactPopover>
31
+ )
36
32
  }
33
+
34
+ export default PopoverPortal
@@ -1,36 +1,34 @@
1
- import React from 'react'
1
+ import React, { useState } from 'react'
2
2
  import {
3
3
  Button,
4
4
  PbReactPopover,
5
5
  } from '../..'
6
6
 
7
- export default class PopoverWithButton extends React.Component {
8
- state = {
9
- showPopover: false,
10
- }
7
+ const PopoverWithButton = () => {
8
+ const [showPopover, setShowPopover] = useState(false)
11
9
 
12
- handleTogglePopover = () => {
13
- this.setState({ showPopover: !this.state.showPopover })
10
+ const handleTogglePopover = () => {
11
+ setShowPopover(!showPopover)
14
12
  }
15
13
 
16
- render() {
17
- const popoverReference = (
18
- <Button
19
- onClick={this.handleTogglePopover}
20
- text="Button Secondary"
21
- variant="secondary"
22
- />
23
- )
14
+ const popoverReference = (
15
+ <Button
16
+ onClick={handleTogglePopover}
17
+ text="Button Secondary"
18
+ variant="secondary"
19
+ />
20
+ )
24
21
 
25
- return (
26
- <PbReactPopover
27
- offset
28
- placement="bottom"
29
- reference={popoverReference}
30
- show={this.state.showPopover}
31
- >
32
- {'Whoa. I\'m a popover.'}
33
- </PbReactPopover>
34
- )
35
- }
22
+ return (
23
+ <PbReactPopover
24
+ offset
25
+ placement="bottom"
26
+ reference={popoverReference}
27
+ show={showPopover}
28
+ >
29
+ {'Whoa. I\'m a popover.'}
30
+ </PbReactPopover>
31
+ )
36
32
  }
33
+
34
+ export default PopoverWithButton
@@ -3,9 +3,15 @@ examples:
3
3
  - popover_default: Default
4
4
  - popover_with_button: With Button
5
5
  - popover_list: With any children
6
+ - popover_click_outside: Close on click outside
7
+ - popover_click_inside: Close on click inside
8
+ - popover_click_any: Close on click anywhere
6
9
 
7
10
  react:
8
11
  - popover_default: Default
9
12
  - popover_with_button: With Button
10
13
  - popover_list: With any children
11
- - popover_portal: Use with `portal` option
14
+ - popover_portal: Use with `portal` option
15
+ - popover_click_outside: Close on click outside
16
+ - popover_click_inside: Close on click inside
17
+ - popover_click_any: Close on click anywhere
@@ -2,3 +2,6 @@ export { default as PopoverDefault } from './_popover_default.jsx'
2
2
  export { default as PopoverWithButton } from './_popover_with_button.jsx'
3
3
  export { default as PopoverList } from './_popover_list.jsx'
4
4
  export { default as PopoverPortal } from './_popover_portal.jsx'
5
+ export { default as PopoverClickOutside } from './_popover_click_outside.jsx'
6
+ export { default as PopoverClickInside } from './_popover_click_inside.jsx'
7
+ export { default as PopoverClickAny } from './_popover_click_any.jsx'
@@ -18,12 +18,56 @@ export default class PbPopover extends PbEnhancedElement {
18
18
  },
19
19
  })
20
20
 
21
- this.triggerElement.addEventListener('click', () => {
22
- this.tooltip.classList.toggle('show')
23
- this.popper.scheduleUpdate()
21
+ this.triggerElement.addEventListener('click', (event) => {
22
+ event.preventDefault()
23
+ event.stopPropagation()
24
+
25
+ if (!this.tooltip.classList.contains('show')) {
26
+ this.checkCloseTooltip()
27
+ }
28
+
29
+ setTimeout(() => {
30
+ this.popper.scheduleUpdate()
31
+ this.tooltip.classList.toggle('show')
32
+ }, 0)
24
33
  })
25
34
  }
26
35
 
36
+ checkCloseTooltip() {
37
+ document.querySelector('body').addEventListener('click', ({ target }) => {
38
+ const isTriggerElement = target.closest(`#${this.triggerElementId}`) !== null
39
+ const isTooltipElement = target.closest(`#${this.tooltipId}`) !== null
40
+
41
+ switch (this.closeOnClick) {
42
+ case 'any':
43
+ this.hideTooltip()
44
+ break
45
+ case 'outside':
46
+ if (isTooltipElement) {
47
+ this.checkCloseTooltip()
48
+ } else {
49
+ this.hideTooltip()
50
+ }
51
+ break
52
+ case 'inside':
53
+ if (isTooltipElement || isTriggerElement) {
54
+ this.hideTooltip()
55
+ } else {
56
+ this.checkCloseTooltip()
57
+ }
58
+ break
59
+ }
60
+ }, { once: true })
61
+ }
62
+
63
+ hideTooltip() {
64
+ this.tooltip.classList.remove('show')
65
+ }
66
+
67
+ toggleTooltip() {
68
+ this.tooltip.classList.toggle('show')
69
+ }
70
+
27
71
  get triggerElement() {
28
72
  return this._triggerElement = (this._triggerElement || document.querySelector(`#${this.triggerElementId}`))
29
73
  }
@@ -47,4 +91,8 @@ export default class PbPopover extends PbEnhancedElement {
47
91
  get offset() {
48
92
  return this.element.dataset.pbPopoverOffset === 'true' ? POPOVER_OFFSET_Y : '0,0'
49
93
  }
94
+
95
+ get closeOnClick() {
96
+ return this.element.dataset.pbPopoverCloseOnClick
97
+ }
50
98
  }
@@ -10,6 +10,9 @@ module Playbook
10
10
  prop :trigger_element_id
11
11
  prop :tooltip_id
12
12
  prop :offset, type: Playbook::Props::Boolean, default: false
13
+ prop :close_on_click, type: Playbook::Props::Enum,
14
+ values: %w[none outside inside any],
15
+ default: "none"
13
16
 
14
17
  def classname
15
18
  generate_classname("pb_popover_kit")
@@ -22,6 +25,7 @@ module Playbook
22
25
  pb_popover_trigger_element_id: trigger_element_id,
23
26
  pb_popover_tooltip_id: tooltip_id,
24
27
  pb_popover_offset: offset,
28
+ pb_popover_close_on_click: close_on_click
25
29
  )
26
30
  end
27
31
  end
@@ -167,7 +167,7 @@ $status_color_text: (
167
167
  error: $error,
168
168
  info: $info,
169
169
  neutral: darken($neutral, 15%),
170
- primary: lighten($primary, 10%)
170
+ primary: $primary
171
171
  );
172
172
 
173
173
  // Link colors ------------------------
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Playbook
4
- VERSION = "4.6.1"
4
+ VERSION = "4.7.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: playbook_ui
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.6.1
4
+ version: 4.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Power UX
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-03-09 00:00:00.000000000 Z
12
+ date: 2020-03-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
@@ -439,6 +439,7 @@ files:
439
439
  - app/pb_kits/playbook/packs/kits/pb_distribution_bar.js
440
440
  - app/pb_kits/playbook/packs/kits/pb_fixed_confirmation_toast.js
441
441
  - app/pb_kits/playbook/packs/kits/pb_flex.js
442
+ - app/pb_kits/playbook/packs/kits/pb_form_pill.js
442
443
  - app/pb_kits/playbook/packs/kits/pb_hashtag.js
443
444
  - app/pb_kits/playbook/packs/kits/pb_highlight.js
444
445
  - app/pb_kits/playbook/packs/kits/pb_home_address_street.js
@@ -826,6 +827,16 @@ files:
826
827
  - app/pb_kits/playbook/pb_form/form_builder/simple_form_builder.rb
827
828
  - app/pb_kits/playbook/pb_form/form_builder/typeahead_field.rb
828
829
  - app/pb_kits/playbook/pb_form/pb_form_validation.js
830
+ - app/pb_kits/playbook/pb_form_pill/_form_pill.html.erb
831
+ - app/pb_kits/playbook/pb_form_pill/_form_pill.jsx
832
+ - app/pb_kits/playbook/pb_form_pill/_form_pill.scss
833
+ - app/pb_kits/playbook/pb_form_pill/docs/_form_pill_tag.html.erb
834
+ - app/pb_kits/playbook/pb_form_pill/docs/_form_pill_tag.jsx
835
+ - app/pb_kits/playbook/pb_form_pill/docs/_form_pill_user.html.erb
836
+ - app/pb_kits/playbook/pb_form_pill/docs/_form_pill_user.jsx
837
+ - app/pb_kits/playbook/pb_form_pill/docs/example.yml
838
+ - app/pb_kits/playbook/pb_form_pill/docs/index.js
839
+ - app/pb_kits/playbook/pb_form_pill/form_pill.rb
829
840
  - app/pb_kits/playbook/pb_hashtag/_hashtag.html.erb
830
841
  - app/pb_kits/playbook/pb_hashtag/_hashtag.jsx
831
842
  - app/pb_kits/playbook/pb_hashtag/_hashtag.scss
@@ -848,9 +859,11 @@ files:
848
859
  - app/pb_kits/playbook/pb_highlight/docs/example.yml
849
860
  - app/pb_kits/playbook/pb_highlight/docs/index.js
850
861
  - app/pb_kits/playbook/pb_highlight/highlight.rb
862
+ - app/pb_kits/playbook/pb_home_address_street/_city_emphasis.html.erb
851
863
  - app/pb_kits/playbook/pb_home_address_street/_home_address_street.html.erb
852
864
  - app/pb_kits/playbook/pb_home_address_street/_home_address_street.jsx
853
865
  - app/pb_kits/playbook/pb_home_address_street/_home_address_street.scss
866
+ - app/pb_kits/playbook/pb_home_address_street/_street_emphasis.html.erb
854
867
  - app/pb_kits/playbook/pb_home_address_street/docs/_description.md
855
868
  - app/pb_kits/playbook/pb_home_address_street/docs/_footer.md
856
869
  - app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_dark.html.erb
@@ -858,6 +871,9 @@ files:
858
871
  - app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_default.html.erb
859
872
  - app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_default.jsx
860
873
  - app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_default.md
874
+ - app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_emphasis.html.erb
875
+ - app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_emphasis.jsx
876
+ - app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_emphasis.md
861
877
  - app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_modified.html.erb
862
878
  - app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_modified.jsx
863
879
  - app/pb_kits/playbook/pb_home_address_street/docs/example.yml
@@ -1138,6 +1154,12 @@ files:
1138
1154
  - app/pb_kits/playbook/pb_popover/_popover.jsx
1139
1155
  - app/pb_kits/playbook/pb_popover/_popover.scss
1140
1156
  - app/pb_kits/playbook/pb_popover/docs/_description.md
1157
+ - app/pb_kits/playbook/pb_popover/docs/_popover_click_any.html.erb
1158
+ - app/pb_kits/playbook/pb_popover/docs/_popover_click_any.jsx
1159
+ - app/pb_kits/playbook/pb_popover/docs/_popover_click_inside.html.erb
1160
+ - app/pb_kits/playbook/pb_popover/docs/_popover_click_inside.jsx
1161
+ - app/pb_kits/playbook/pb_popover/docs/_popover_click_outside.html.erb
1162
+ - app/pb_kits/playbook/pb_popover/docs/_popover_click_outside.jsx
1141
1163
  - app/pb_kits/playbook/pb_popover/docs/_popover_default.html.erb
1142
1164
  - app/pb_kits/playbook/pb_popover/docs/_popover_default.jsx
1143
1165
  - app/pb_kits/playbook/pb_popover/docs/_popover_list.html.erb