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,31 @@
1
+ <%= pb_rails "title", props: {
2
+ classname: "pb_home_address_street_address",
3
+ size: 4,
4
+ text: object.address_house_style,
5
+ dark: object.dark
6
+ } %>
7
+ <%= pb_rails "title", props: {
8
+ classname: "pb_home_address_street_address",
9
+ size: 4,
10
+ text: object.address_house_style2,
11
+ dark: object.dark
12
+ } %>
13
+ <%= pb_rails "body", props: {
14
+ color: "light",
15
+ text: object.city_state_zip,
16
+ dark: object.dark
17
+ } %>
18
+
19
+ <% if object.home_id %>
20
+ <%= pb_rails("hashtag", props: {
21
+ text: "#{object.home_id}",
22
+ url: object.home_url || "#",
23
+ type: "home",
24
+ dark: object.dark,
25
+ classname: "home-hashtag"}) %>
26
+ <% end %>
27
+
28
+ <%= pb_rails "body", props: { color: "light", tag: "span", dark: object.dark } do %>
29
+ <small><%= object.territory %></small>
30
+ <% end %>
31
+
@@ -0,0 +1,27 @@
1
+ <%= pb_rails("home_address_street", props: {
2
+ address: "70 Prospect Ave",
3
+ address_cont: "Apt M18",
4
+ city: "West Chester",
5
+ home_id: 8250263,
6
+ home_url: "https://powerhrg.com/",
7
+ house_style: "Colonial",
8
+ state: "PA",
9
+ zipcode: "19382",
10
+ territory: "PHL",
11
+ }) %>
12
+
13
+ <br>
14
+ <br>
15
+
16
+ <%= pb_rails("home_address_street", props: {
17
+ address: "70 Prospect Ave",
18
+ address_cont: "Apt M18",
19
+ city: "West Chester",
20
+ emphasis: "city",
21
+ home_id: 8250263,
22
+ home_url: "https://powerhrg.com/",
23
+ house_style: "Colonial",
24
+ state: "PA",
25
+ zipcode: "19382",
26
+ territory: "PHL",
27
+ }) %>
@@ -0,0 +1,36 @@
1
+ import React from 'react'
2
+ import { HomeAddressStreet } from '../../'
3
+
4
+ const HomeAddressStreetEmphasis = () => {
5
+ return (
6
+ <div>
7
+ <HomeAddressStreet
8
+ address="70 Prospect Ave"
9
+ addressCont="Apt M18"
10
+ city="West Chester"
11
+ homeId={8250263}
12
+ homeUrl="https://powerhrg.com/"
13
+ houseStyle="Colonial"
14
+ state="PA"
15
+ territory="PHL"
16
+ zipcode="19382"
17
+ />
18
+ <br />
19
+ <br />
20
+ <HomeAddressStreet
21
+ address="70 Prospect Ave"
22
+ addressCont="Apt M18"
23
+ city="West Chester"
24
+ emphasis="city"
25
+ homeId={8250263}
26
+ homeUrl="https://powerhrg.com/"
27
+ houseStyle="Colonial"
28
+ state="PA"
29
+ territory="PHL"
30
+ zipcode="19382"
31
+ />
32
+ </div>
33
+ )
34
+ }
35
+
36
+ export default HomeAddressStreetEmphasis
@@ -0,0 +1,2 @@
1
+ Emphasis on street happens by default. (no prop needed)
2
+ Emphasis on "city" makes the city emphasized, rather than the street.
@@ -2,12 +2,14 @@ examples:
2
2
 
3
3
  rails:
4
4
  - home_address_street_default: Default
5
+ - home_address_street_emphasis: Emphasis
5
6
  - home_address_street_modified: Modified
6
7
  - home_address_street_dark: Dark
7
8
 
8
9
 
9
10
  react:
10
11
  - home_address_street_default: Default
12
+ - home_address_street_emphasis: Emphasis
11
13
  - home_address_street_modified: Modified
12
14
  - home_address_street_dark: Dark
13
15
 
@@ -1,3 +1,4 @@
1
1
  export { default as HomeAddressStreetDefault } from './_home_address_street_default.jsx'
2
+ export { default as HomeAddressStreetEmphasis } from './_home_address_street_emphasis.jsx'
2
3
  export { default as HomeAddressStreetModified } from './_home_address_street_modified.jsx'
3
4
  export { default as HomeAddressStreetDark } from './_home_address_street_dark.jsx'
@@ -10,6 +10,9 @@ module Playbook
10
10
  prop :address
11
11
  prop :address_cont
12
12
  prop :city
13
+ prop :emphasis, type: Playbook::Props::Enum,
14
+ values: %w[street city],
15
+ default: "street"
13
16
  prop :home_id, type: Playbook::Props::Number
14
17
  prop :home_url
15
18
  prop :house_style
@@ -26,6 +29,14 @@ module Playbook
26
29
  "#{city.titleize}, #{state} #{zipcode}"
27
30
  end
28
31
 
32
+ def city_state
33
+ "#{city.titleize}, #{state}"
34
+ end
35
+
36
+ def zip
37
+ zipcode.to_s
38
+ end
39
+
29
40
  def address_house_style
30
41
  "#{address.titleize} #{separator} #{house_style}"
31
42
  end
@@ -10,14 +10,20 @@ import {
10
10
  Reference as PopperReference,
11
11
  } from 'react-popper'
12
12
 
13
- import { buildCss } from '../utilities/props'
13
+ import {
14
+ buildCss,
15
+ noop,
16
+ } from '../utilities/props'
17
+
14
18
  import { Card } from '../'
15
19
 
16
20
  type PbPopoverProps = {
17
21
  className?: String,
22
+ closeOnClick?: 'outside' | 'inside',
18
23
  offset?: Boolean,
19
24
  reference: PopperReference,
20
25
  show?: Boolean,
26
+ shouldClosePopover?: () => Boolean,
21
27
  } & PopperProps
22
28
 
23
29
  const POPOVER_OFFSET_Y = {
@@ -65,57 +71,100 @@ const Popover = ({
65
71
  </Popper>
66
72
  )
67
73
 
68
- const PbReactPopover = ({
69
- className,
70
- children,
71
- modifiers = {},
72
- offset = false,
73
- placement = 'left',
74
- portal = 'body',
75
- reference,
76
- referenceElement,
77
- show = false,
78
- usePortal = false,
79
- }: PbPopoverProps) => {
80
- const popoverComponent = (
81
- <Popover
82
- className={className}
83
- modifiers={modifiers}
84
- offset={offset}
85
- placement={placement}
86
- referenceElement={referenceElement}
87
- show={show}
88
- >
89
- {children}
90
- </Popover>
91
- )
92
-
93
- return (
94
- <PopperManager>
95
- <If condition={reference && !referenceElement}>
96
- <PopperReference>
97
- {({ ref }) => (
98
- <span
99
- className="pb_popover_reference_wrapper"
100
- ref={ref}
101
- >
102
- <reference.type
103
- {...reference.props}
104
- />
105
- </span>
74
+ export default class PbReactPopover extends React.Component<PbPopoverProps> {
75
+ static defaultProps = {
76
+ modifiers: {},
77
+ offset: false,
78
+ placement: 'left',
79
+ portal: 'body',
80
+ show: false,
81
+ shouldClosePopover: noop,
82
+ usePortal: false,
83
+ }
84
+
85
+ componentDidMount() {
86
+ const { closeOnClick, shouldClosePopover } = this.props
87
+
88
+ if (!closeOnClick) return
89
+
90
+ document.body.addEventListener('click', ({ target }) => {
91
+ const targetIsPopover = target.closest('[class^=popover_tooltip]') !== null
92
+ const targetIsReference = target.closest('.pb_popover_reference_wrapper') !== null
93
+
94
+ if (targetIsReference) return
95
+
96
+ switch (closeOnClick) {
97
+ case 'outside':
98
+ if (!targetIsPopover) {
99
+ shouldClosePopover(true)
100
+ }
101
+ break
102
+ case 'inside':
103
+ if (targetIsPopover) {
104
+ shouldClosePopover(true)
105
+ }
106
+ break
107
+ case 'any':
108
+ shouldClosePopover(true)
109
+ break
110
+ }
111
+ })
112
+ }
113
+
114
+ props: PbPopoverProps
115
+
116
+ render() {
117
+ const {
118
+ className,
119
+ children,
120
+ modifiers,
121
+ offset,
122
+ placement,
123
+ portal,
124
+ reference,
125
+ referenceElement,
126
+ show,
127
+ usePortal,
128
+ } = this.props
129
+
130
+ const popoverComponent = (
131
+ <Popover
132
+ className={className}
133
+ modifiers={modifiers}
134
+ offset={offset}
135
+ placement={placement}
136
+ referenceElement={referenceElement}
137
+ show={show}
138
+ >
139
+ {children}
140
+ </Popover>
141
+ )
142
+
143
+ return (
144
+ <PopperManager>
145
+ <If condition={reference && !referenceElement}>
146
+ <PopperReference>
147
+ {({ ref }) => (
148
+ <span
149
+ className="pb_popover_reference_wrapper"
150
+ ref={ref}
151
+ >
152
+ <reference.type
153
+ {...reference.props}
154
+ />
155
+ </span>
156
+ )}
157
+ </PopperReference>
158
+ </If>
159
+ <If condition={usePortal}>
160
+ {ReactDOM.createPortal(
161
+ popoverComponent,
162
+ document.querySelector(portal)
106
163
  )}
107
- </PopperReference>
108
- </If>
109
- <If condition={usePortal}>
110
- {ReactDOM.createPortal(
111
- popoverComponent,
112
- document.querySelector(portal)
113
- )}
114
- <Else />
115
- {popoverComponent}
116
- </If>
117
- </PopperManager>
118
- )
164
+ <Else />
165
+ {popoverComponent}
166
+ </If>
167
+ </PopperManager>
168
+ )
169
+ }
119
170
  }
120
-
121
- export default PbReactPopover
@@ -1 +1,13 @@
1
- A popover is a way to toggle content on top of other content. It can be used for small texts, small forms, or even dropdowns.
1
+ A `popover` is a way to toggle content on top of other content. It can be used for small texts, small forms, or even dropdowns. By default, popover will toggle open/closed by simply clicking the trigger element.
2
+
3
+ ### Enhancements
4
+
5
+ In addition, you may also choose to enable enhanced functionality so that the popover may be toggled by clicking outside of the "trigger element" and/or popover itself.
6
+
7
+ #### Usecase #1 - Close on click into popover content
8
+
9
+ You are building a single page application where clicking into the popover itself triggers some asynchronous actions which mutate the UI instantaneously. As a result, may want the popover to automatically close after a selection has been made from the popover contents.
10
+
11
+ #### Usecase #2 - Close only on click outside of popover content
12
+
13
+ You are building an custom in-page results filter list which is contained inside of the popover's content area. Since the filter list contains 5 filters, you may want to keep the popover open so that users may select multiple filters then only close the popover when users click outside of the popover.
@@ -0,0 +1,19 @@
1
+ <%= pb_rails("button", props: {
2
+ text: "Click me then click anywhere",
3
+ variant: "secondary",
4
+ id: 'any-popover-1'
5
+ }) %>
6
+
7
+ <%= pb_rails("popover", props: {
8
+ close_on_click: "any",
9
+ trigger_element_id: "any-popover-1",
10
+ tooltip_id: "any-tooltip-1",
11
+ position: 'right',
12
+ offset: false
13
+ }) do %>
14
+ Whoa. I'm a popover that can be closed by clicking anywhere.
15
+ <% end %>
16
+
17
+
18
+
19
+
@@ -0,0 +1,40 @@
1
+ import React, { useState } from 'react'
2
+ import {
3
+ Button,
4
+ PbReactPopover,
5
+ } from '../..'
6
+
7
+ const PopoverClickAny = () => {
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="any"
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 PopoverClickAny
@@ -0,0 +1,14 @@
1
+ <%= pb_rails("button", props: { text: "Click me then click the popover", variant: "secondary", id: 'inside-popover-1' }) %>
2
+ <%= pb_rails("popover", props: {
3
+ close_on_click: "inside",
4
+ trigger_element_id: "inside-popover-1",
5
+ tooltip_id: "inside-tooltip-1",
6
+ position: 'right',
7
+ offset: false
8
+ }) do %>
9
+ Whoa. I'm a popover that can be closed by clicking inside 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 PopoverClickInside = () => {
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="inside"
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 PopoverClickInside