playbook_ui 4.6.1 → 4.7.0

Sign up to get free protection for your applications and to get access to all the features.
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