playbook_ui 14.18.0.pre.alpha.PLAY20397473 → 14.18.0.pre.alpha.dropdownautocomplete7493
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_advanced_table/_advanced_table.scss +304 -21
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +5 -1
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +6 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color.jsx +80 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color.md +3 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.html.erb +58 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.md +3 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +3 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +2 -1
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.html.erb +2 -2
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +5 -0
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +5 -16
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.html.erb +5 -2
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.html.erb +28 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +17 -64
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb +58 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/{_dropdown_with_autocomplete_and_custom_display.jsx → _dropdown_with_autocomplete_with_subcomponents.jsx} +11 -25
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx +61 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.md +2 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb +52 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.md +2 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +7 -4
- data/app/pb_kits/playbook/pb_dropdown/docs/index.js +2 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +2 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +4 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +45 -1
- data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +10 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +3 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +12 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +3 -1
- data/app/pb_kits/playbook/pb_dropdown/index.js +57 -0
- data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +26 -0
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +1 -2
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +4 -4
- data/app/pb_kits/playbook/pb_select/docs/_select_error.html.erb +1 -1
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.html.erb +1 -1
- data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.html.erb +5 -1
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.html.erb +8 -1
- data/dist/chunks/_weekday_stacked-Da8b-KUp.js +45 -0
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/version.rb +1 -1
- metadata +16 -6
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.md +0 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_hook.jsx +0 -79
- data/dist/chunks/_weekday_stacked-CHQsoCdP.js +0 -45
@@ -36,7 +36,6 @@ type DropdownProps = {
|
|
36
36
|
onSelect?: (arg: GenericObject) => null;
|
37
37
|
options: GenericObject;
|
38
38
|
separators?: boolean;
|
39
|
-
triggerRef?: any;
|
40
39
|
variant?: "default" | "subtle";
|
41
40
|
};
|
42
41
|
|
@@ -65,7 +64,6 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
65
64
|
onSelect,
|
66
65
|
options,
|
67
66
|
separators = true,
|
68
|
-
triggerRef,
|
69
67
|
variant = "default",
|
70
68
|
} = props;
|
71
69
|
|
@@ -91,7 +89,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
91
89
|
const [focusedOptionIndex, setFocusedOptionIndex] = useState(-1);
|
92
90
|
|
93
91
|
const dropdownRef = useRef(null);
|
94
|
-
const inputRef = useRef(null);
|
92
|
+
const inputRef = useRef<HTMLInputElement>(null);
|
95
93
|
const inputWrapperRef = useRef(null);
|
96
94
|
const dropdownContainerRef = useRef(null);
|
97
95
|
|
@@ -99,15 +97,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
99
97
|
separateChildComponents(children);
|
100
98
|
|
101
99
|
useEffect(() => {
|
102
|
-
|
103
|
-
//Only needed for when useDropdown hook used with external trigger
|
104
|
-
if (triggerRef?.current) {
|
105
|
-
const parentElement = triggerRef.current.parentNode;
|
106
|
-
if (parentElement) {
|
107
|
-
parentElement.style.position = 'relative';
|
108
|
-
}
|
109
|
-
}
|
110
|
-
// Handle clicks outside the dropdown
|
100
|
+
// Handle clicks outside the dropdown
|
111
101
|
const handleClick = handleClickOutside({
|
112
102
|
inputWrapperRef,
|
113
103
|
dropdownContainerRef,
|
@@ -167,7 +157,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
167
157
|
};
|
168
158
|
|
169
159
|
const handleWrapperClick = () => {
|
170
|
-
autocomplete && inputRef
|
160
|
+
autocomplete && inputRef?.current?.focus();
|
171
161
|
toggleDropdown();
|
172
162
|
};
|
173
163
|
|
@@ -202,7 +192,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
202
192
|
{...htmlProps}
|
203
193
|
className={classes}
|
204
194
|
id={id}
|
205
|
-
style={
|
195
|
+
style={{position: "relative"}}
|
206
196
|
>
|
207
197
|
<DropdownContext.Provider
|
208
198
|
value={{
|
@@ -225,8 +215,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
225
215
|
setIsDropDownClosed,
|
226
216
|
setIsInputFocused,
|
227
217
|
setSelected,
|
228
|
-
toggleDropdown
|
229
|
-
triggerRef
|
218
|
+
toggleDropdown
|
230
219
|
}}
|
231
220
|
>
|
232
221
|
{label &&
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<%
|
1
|
+
<%
|
2
2
|
options = [
|
3
3
|
{ label: 'United States', value: 'United States', id: 'us' },
|
4
4
|
{ label: 'Canada', value: 'Canada', id: 'ca' },
|
@@ -6,4 +6,7 @@
|
|
6
6
|
]
|
7
7
|
%>
|
8
8
|
|
9
|
-
<%= pb_rails("dropdown", props: {
|
9
|
+
<%= pb_rails("dropdown", props: {
|
10
|
+
error: raw(pb_rails("icon", props: { icon: "warning" }) + " Please make a valid selection"),
|
11
|
+
options: options
|
12
|
+
}) %>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<%
|
2
|
+
options = [
|
3
|
+
{
|
4
|
+
label: "United States",
|
5
|
+
value: "United States",
|
6
|
+
areaCode: "+1",
|
7
|
+
icon: "🇺🇸",
|
8
|
+
id: "us"
|
9
|
+
},
|
10
|
+
{
|
11
|
+
label: "United Kingdom",
|
12
|
+
value: "United Kingdom",
|
13
|
+
areaCode: "+44",
|
14
|
+
icon: "🇬🇧",
|
15
|
+
id: "gb"
|
16
|
+
},
|
17
|
+
{
|
18
|
+
label: "Pakistan",
|
19
|
+
value: "Pakistan",
|
20
|
+
areaCode: "+92",
|
21
|
+
icon: "🇵🇰",
|
22
|
+
id: "pk"
|
23
|
+
}
|
24
|
+
]
|
25
|
+
|
26
|
+
%>
|
27
|
+
|
28
|
+
<%= pb_rails("dropdown", props: {options: options, autocomplete: true}) %>
|
@@ -1,86 +1,39 @@
|
|
1
1
|
import React from 'react'
|
2
2
|
|
3
3
|
import Dropdown from '../../pb_dropdown/_dropdown'
|
4
|
-
import Badge from '../../pb_badge/_badge'
|
5
|
-
import FlexItem from '../../pb_flex/_flex_item'
|
6
|
-
import User from '../../pb_user/_user'
|
7
4
|
|
8
5
|
const DropdownWithAutocomplete = (props) => {
|
9
6
|
|
10
7
|
const options = [
|
11
8
|
{
|
12
|
-
label: "
|
13
|
-
value: "
|
14
|
-
|
15
|
-
|
16
|
-
id: "
|
17
|
-
status: "Offline"
|
9
|
+
label: "United States",
|
10
|
+
value: "United States",
|
11
|
+
areaCode: "+1",
|
12
|
+
icon: "🇺🇸",
|
13
|
+
id: "us"
|
18
14
|
},
|
19
15
|
{
|
20
|
-
label: "
|
21
|
-
value: "
|
22
|
-
|
23
|
-
|
24
|
-
id: "
|
25
|
-
status: "Away"
|
16
|
+
label: "United Kingdom",
|
17
|
+
value: "United Kingdom",
|
18
|
+
areaCode: "+44",
|
19
|
+
icon: "🇬🇧",
|
20
|
+
id: "gb"
|
26
21
|
},
|
27
22
|
{
|
28
|
-
label: "
|
29
|
-
value: "
|
30
|
-
|
31
|
-
|
32
|
-
id: "
|
33
|
-
status: "Online"
|
34
|
-
},
|
35
|
-
{
|
36
|
-
label: "Courtney Long",
|
37
|
-
value: "Courtney Long",
|
38
|
-
territory: "PHL",
|
39
|
-
title: "Lead UX Designer",
|
40
|
-
id: "courtney-long",
|
41
|
-
status: "Online"
|
23
|
+
label: "Pakistan",
|
24
|
+
value: "Pakistan",
|
25
|
+
areaCode: "+92",
|
26
|
+
icon: "🇵🇰",
|
27
|
+
id: "pk"
|
42
28
|
}
|
43
|
-
]
|
44
|
-
|
29
|
+
]
|
45
30
|
|
46
31
|
return (
|
47
32
|
<div>
|
48
33
|
<Dropdown autocomplete
|
49
34
|
options={options}
|
50
35
|
{...props}
|
51
|
-
|
52
|
-
{options.map((option) => (
|
53
|
-
<Dropdown.Option key={option.id}
|
54
|
-
option={option}
|
55
|
-
>
|
56
|
-
<>
|
57
|
-
<FlexItem>
|
58
|
-
<User
|
59
|
-
align="left"
|
60
|
-
avatar
|
61
|
-
name={option.label}
|
62
|
-
orientation="horizontal"
|
63
|
-
territory={option.territory}
|
64
|
-
title={option.title}
|
65
|
-
/>
|
66
|
-
</FlexItem>
|
67
|
-
<FlexItem>
|
68
|
-
<Badge
|
69
|
-
rounded
|
70
|
-
text={option.status}
|
71
|
-
variant={`${
|
72
|
-
option.status === "Offline"
|
73
|
-
? "neutral"
|
74
|
-
: option.status === "Online"
|
75
|
-
? "success"
|
76
|
-
: "warning"
|
77
|
-
}`}
|
78
|
-
/>
|
79
|
-
</FlexItem>
|
80
|
-
</>
|
81
|
-
</Dropdown.Option>
|
82
|
-
))}
|
83
|
-
</Dropdown>
|
36
|
+
/>
|
84
37
|
</div>
|
85
38
|
)
|
86
39
|
}
|
data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
<%
|
2
|
+
options = [
|
3
|
+
{
|
4
|
+
label: "Jasper Furniss",
|
5
|
+
value: "Jasper Furniss",
|
6
|
+
territory: "PHL",
|
7
|
+
title: "Lead UX Engineer",
|
8
|
+
id: "jasper-furniss",
|
9
|
+
status: "Offline"
|
10
|
+
},
|
11
|
+
{
|
12
|
+
label: "Ramon Ruiz",
|
13
|
+
value: "Ramon Ruiz",
|
14
|
+
territory: "PHL",
|
15
|
+
title: "Senior UX Designer",
|
16
|
+
id: "ramon-ruiz",
|
17
|
+
status: "Away"
|
18
|
+
},
|
19
|
+
{
|
20
|
+
label: "Carlos Lima",
|
21
|
+
value: "Carlos Lima",
|
22
|
+
territory: "PHL",
|
23
|
+
title: "Nitro Developer",
|
24
|
+
id: "carlos-lima",
|
25
|
+
status: "Online"
|
26
|
+
},
|
27
|
+
{
|
28
|
+
label: "Courtney Long",
|
29
|
+
value: "Courtney Long",
|
30
|
+
territory: "PHL",
|
31
|
+
title: "Lead UX Designer",
|
32
|
+
id: "courtney-long",
|
33
|
+
status: "Online"
|
34
|
+
}
|
35
|
+
];
|
36
|
+
|
37
|
+
%>
|
38
|
+
|
39
|
+
<%= pb_rails("dropdown", props: {options: options}) do %>
|
40
|
+
<%= pb_rails("dropdown/dropdown_trigger", props: {placeholder: "Search...", autocomplete: true}) %>
|
41
|
+
<%= pb_rails("dropdown/dropdown_container") do %>
|
42
|
+
<% options.each do |option| %>
|
43
|
+
<%= pb_rails("dropdown/dropdown_option", props: {option: option}) do %>
|
44
|
+
<%= pb_rails("flex", props: {
|
45
|
+
align: "center",
|
46
|
+
justify: "between",
|
47
|
+
}) do %>
|
48
|
+
<%= pb_rails("flex/flex_item") do %>
|
49
|
+
<%= pb_rails("user", props: {name: option[:label], align:"left", avatar: true, orientation:"horizontal", territory:option[:territory], title: option[:title]}) %>
|
50
|
+
<% end %>
|
51
|
+
<%= pb_rails("flex/flex_item") do %>
|
52
|
+
<%= pb_rails("badge", props: {rounded: true, dark: true, text: option[:status], variant: option[:status] == "Offline" ? "neutral" : option[:status] == "Online" ? "success" : "warning" }) %>
|
53
|
+
<% end %>
|
54
|
+
<% end %>
|
55
|
+
<% end %>
|
56
|
+
<% end %>
|
57
|
+
<% end %>
|
58
|
+
<% end %>
|
@@ -1,15 +1,13 @@
|
|
1
|
-
import React
|
1
|
+
import React from 'react'
|
2
2
|
|
3
|
-
import Dropdown from '
|
3
|
+
import Dropdown from '../_dropdown'
|
4
4
|
import Badge from '../../pb_badge/_badge'
|
5
|
+
import Flex from '../../pb_flex/_flex'
|
5
6
|
import FlexItem from '../../pb_flex/_flex_item'
|
6
|
-
import Avatar from '../../pb_avatar/_avatar'
|
7
7
|
import User from '../../pb_user/_user'
|
8
8
|
|
9
9
|
|
10
|
-
const
|
11
|
-
const [selectedOption, setSelectedOption] = useState();
|
12
|
-
|
10
|
+
const DropdownWithAutocompleteWithSubcomponents = (props) => {
|
13
11
|
const options = [
|
14
12
|
{
|
15
13
|
label: "Jasper Furniss",
|
@@ -45,34 +43,21 @@ const DropdownWithAutocompleteAndCustomDisplay = (props) => {
|
|
45
43
|
}
|
46
44
|
];
|
47
45
|
|
48
|
-
const CustomDisplay = () => {
|
49
|
-
return (
|
50
|
-
<>
|
51
|
-
{
|
52
|
-
selectedOption && (
|
53
|
-
<Avatar
|
54
|
-
name={selectedOption.label}
|
55
|
-
size="xs"
|
56
|
-
/>
|
57
|
-
)
|
58
|
-
}
|
59
|
-
</>
|
60
|
-
)
|
61
|
-
};
|
62
46
|
|
63
47
|
return (
|
64
48
|
<div>
|
65
49
|
<Dropdown autocomplete
|
66
|
-
onSelect={(selectedItem) => setSelectedOption(selectedItem)}
|
67
50
|
options={options}
|
68
51
|
{...props}
|
69
52
|
>
|
70
|
-
<Dropdown.Trigger customDisplay={<CustomDisplay/>} />
|
71
53
|
{options.map((option) => (
|
72
54
|
<Dropdown.Option key={option.id}
|
73
55
|
option={option}
|
74
56
|
>
|
75
|
-
|
57
|
+
<Flex
|
58
|
+
align="center"
|
59
|
+
justify="between"
|
60
|
+
>
|
76
61
|
<FlexItem>
|
77
62
|
<User
|
78
63
|
align="left"
|
@@ -85,6 +70,7 @@ const DropdownWithAutocompleteAndCustomDisplay = (props) => {
|
|
85
70
|
</FlexItem>
|
86
71
|
<FlexItem>
|
87
72
|
<Badge
|
73
|
+
dark
|
88
74
|
rounded
|
89
75
|
text={option.status}
|
90
76
|
variant={`${
|
@@ -96,7 +82,7 @@ const DropdownWithAutocompleteAndCustomDisplay = (props) => {
|
|
96
82
|
}`}
|
97
83
|
/>
|
98
84
|
</FlexItem>
|
99
|
-
|
85
|
+
</Flex>
|
100
86
|
</Dropdown.Option>
|
101
87
|
))}
|
102
88
|
</Dropdown>
|
@@ -104,4 +90,4 @@ const DropdownWithAutocompleteAndCustomDisplay = (props) => {
|
|
104
90
|
)
|
105
91
|
}
|
106
92
|
|
107
|
-
export default
|
93
|
+
export default DropdownWithAutocompleteWithSubcomponents
|
@@ -0,0 +1 @@
|
|
1
|
+
`autocomplete` prop can also be used in conjunction with the subcomponent structure.
|
@@ -0,0 +1 @@
|
|
1
|
+
The `useDropdown` hook can also be used to toggle the dropdown open and closed using an external control. To do so, you must manage state with the custom hook, pass the `dropdown:'pb-dropdown-trigger'` data attribute to the external control and use the `isClosed` prop as shown.
|
@@ -0,0 +1,61 @@
|
|
1
|
+
import React, { useState } from 'react'
|
2
|
+
import Dropdown from '../../pb_dropdown/_dropdown'
|
3
|
+
import IconCircle from '../../pb_icon_circle/_icon_circle';
|
4
|
+
|
5
|
+
const DropdownWithSearch = (props) => {
|
6
|
+
const [selectedOption, setSelectedOption] = useState();
|
7
|
+
|
8
|
+
const options = [
|
9
|
+
{
|
10
|
+
label: "United States",
|
11
|
+
value: "United States",
|
12
|
+
icon: "🇺🇸",
|
13
|
+
id: "United-states"
|
14
|
+
|
15
|
+
},
|
16
|
+
{
|
17
|
+
label: "United Kingdom",
|
18
|
+
value: "United Kingdom",
|
19
|
+
icon: "🇬🇧",
|
20
|
+
id: "united-kingdom"
|
21
|
+
},
|
22
|
+
{
|
23
|
+
label: "Pakistan",
|
24
|
+
value: "Pakistan",
|
25
|
+
icon: "🇵🇰",
|
26
|
+
id: "pakistan"
|
27
|
+
}
|
28
|
+
];
|
29
|
+
|
30
|
+
|
31
|
+
return (
|
32
|
+
<div>
|
33
|
+
<Dropdown
|
34
|
+
onSelect={(selectedItem) => setSelectedOption(selectedItem)}
|
35
|
+
options={options}
|
36
|
+
{...props}
|
37
|
+
>
|
38
|
+
<Dropdown.Trigger>
|
39
|
+
<div key={selectedOption ? selectedOption.icon : "flag"}>
|
40
|
+
<IconCircle
|
41
|
+
cursor="pointer"
|
42
|
+
icon={selectedOption ? selectedOption.icon : "flag"}
|
43
|
+
variant="royal"
|
44
|
+
/>
|
45
|
+
</div>
|
46
|
+
</Dropdown.Trigger>
|
47
|
+
<Dropdown.Container maxWidth="xs"
|
48
|
+
searchbar
|
49
|
+
>
|
50
|
+
{options.map((option) => (
|
51
|
+
<Dropdown.Option key={option.id}
|
52
|
+
option={option}
|
53
|
+
/>
|
54
|
+
))}
|
55
|
+
</Dropdown.Container>
|
56
|
+
</Dropdown>
|
57
|
+
</div>
|
58
|
+
)
|
59
|
+
}
|
60
|
+
|
61
|
+
export default DropdownWithSearch
|
@@ -0,0 +1,52 @@
|
|
1
|
+
<%
|
2
|
+
options = [
|
3
|
+
{
|
4
|
+
label: "United States",
|
5
|
+
value: "United States",
|
6
|
+
areaCode: "+1",
|
7
|
+
icon: "🇺🇸",
|
8
|
+
id: "us"
|
9
|
+
},
|
10
|
+
{
|
11
|
+
label: "United Kingdom",
|
12
|
+
value: "United Kingdom",
|
13
|
+
areaCode: "+44",
|
14
|
+
icon: "🇬🇧",
|
15
|
+
id: "gb"
|
16
|
+
},
|
17
|
+
{
|
18
|
+
label: "Pakistan",
|
19
|
+
value: "Pakistan",
|
20
|
+
areaCode: "+92",
|
21
|
+
icon: "🇵🇰",
|
22
|
+
id: "pk"
|
23
|
+
}
|
24
|
+
]
|
25
|
+
|
26
|
+
%>
|
27
|
+
|
28
|
+
<%= pb_rails("dropdown", props: {options: options}) do %>
|
29
|
+
<%= pb_rails("dropdown/dropdown_trigger") do %>
|
30
|
+
<%= pb_rails("icon_circle", props: {icon:"flag", cursor: "pointer", variant:"royal"}) %>
|
31
|
+
<% end %>
|
32
|
+
<%= pb_rails("dropdown/dropdown_container", props:{max_width:"xs", searchbar: true}) do %>
|
33
|
+
<% options.each do |option| %>
|
34
|
+
<%= pb_rails("dropdown/dropdown_option", props: {option: option}) do %>
|
35
|
+
<%= pb_rails("flex", props: {
|
36
|
+
align: "center",
|
37
|
+
justify: "between",
|
38
|
+
}) do %>
|
39
|
+
<%= pb_rails("flex/flex_item") do %>
|
40
|
+
<%= pb_rails("flex") do %>
|
41
|
+
<%= pb_rails("icon", props: {icon: option[:icon]}) %>
|
42
|
+
<%= pb_rails("body", props: {text: option[:label], padding_left:"xs"}) %>
|
43
|
+
<% end %>
|
44
|
+
<% end %>
|
45
|
+
<%= pb_rails("flex/flex_item") do %>
|
46
|
+
<%= pb_rails("body", props: {color:"light", text: option[:areaCode]}) %>
|
47
|
+
<% end %>
|
48
|
+
<% end %>
|
49
|
+
<% end %>
|
50
|
+
<% end %>
|
51
|
+
<% end %>
|
52
|
+
<% end %>
|
@@ -1,12 +1,15 @@
|
|
1
1
|
examples:
|
2
2
|
rails:
|
3
3
|
- dropdown_default: Default
|
4
|
+
- dropdown_with_autocomplete: Autocomplete
|
4
5
|
- dropdown_subtle_variant: Subtle Variant
|
5
6
|
- dropdown_subcomponent_structure_rails: Subcomponent Structure
|
7
|
+
- dropdown_with_autocomplete_with_subcomponents: Autocomplete with Subcomponent Structure
|
6
8
|
- dropdown_with_label: With Label
|
7
9
|
- dropdown_with_custom_options_rails: Custom Options
|
8
10
|
- dropdown_with_custom_display_rails: Custom Display
|
9
11
|
- dropdown_with_custom_trigger_rails: Custom Trigger
|
12
|
+
- dropdown_with_search_rails: Custom Trigger Dropdown with Search
|
10
13
|
- dropdown_with_custom_padding: Custom Option Padding
|
11
14
|
- dropdown_error: Dropdown with Error
|
12
15
|
- dropdown_default_value: Default Value
|
@@ -15,20 +18,20 @@ examples:
|
|
15
18
|
|
16
19
|
react:
|
17
20
|
- dropdown_default: Default
|
21
|
+
- dropdown_with_autocomplete: Autocomplete
|
18
22
|
- dropdown_subtle_variant: Subtle Variant
|
19
23
|
- dropdown_subcomponent_structure: Subcomponent Structure
|
24
|
+
- dropdown_with_autocomplete_with_subcomponents: Autocomplete with Subcomponent Structure
|
20
25
|
- dropdown_with_label: With Label
|
21
26
|
- dropdown_with_custom_options: Custom Options
|
22
27
|
- dropdown_with_custom_display: Custom Display
|
23
28
|
- dropdown_with_custom_trigger: Custom Trigger
|
29
|
+
- dropdown_with_search: Custom Trigger Dropdown with Search
|
24
30
|
- dropdown_with_custom_padding: Custom Option Padding
|
25
31
|
- dropdown_error: Dropdown with Error
|
26
32
|
- dropdown_default_value: Default Value
|
27
33
|
- dropdown_blank_selection: Blank Selection
|
28
34
|
- dropdown_clear_selection: Clear Selection
|
29
35
|
- dropdown_separators_hidden: Separators Hidden
|
30
|
-
|
31
|
-
# - dropdown_with_autocomplete_and_custom_display: Autocomplete with Custom Display
|
32
|
-
# - dropdown_with_external_control: useDropdown Hook
|
33
|
-
# - dropdown_with_hook: useDropdown Hook with Any Trigger
|
36
|
+
- dropdown_with_external_control: useDropdown Hook
|
34
37
|
|
@@ -3,11 +3,10 @@ export { default as DropdownWithCustomDisplay } from './_dropdown_with_custom_di
|
|
3
3
|
export { default as DropdownWithCustomOptions } from './_dropdown_with_custom_options.jsx'
|
4
4
|
export { default as DropdownWithCustomTrigger } from './_dropdown_with_custom_trigger.jsx'
|
5
5
|
export { default as DropdownWithAutocomplete } from './_dropdown_with_autocomplete.jsx'
|
6
|
-
export { default as
|
6
|
+
export { default as DropdownWithAutocompleteWithSubcomponents } from './_dropdown_with_autocomplete_with_subcomponents.jsx'
|
7
7
|
export { default as DropdownWithCustomPadding } from './_dropdown_with_custom_padding.jsx'
|
8
8
|
export { default as DropdownWithLabel } from './_dropdown_with_label.jsx'
|
9
9
|
export { default as DropdownWithExternalControl } from './_dropdown_with_external_control.jsx'
|
10
|
-
export { default as DropdownWithHook } from './_dropdown_with_hook.jsx'
|
11
10
|
export { default as DropdownSubcomponentStructure } from './_dropdown_subcomponent_structure.jsx'
|
12
11
|
export { default as DropdownError } from './_dropdown_error.jsx'
|
13
12
|
export { default as DropdownDefaultValue } from './_dropdown_default_value.jsx'
|
@@ -15,3 +14,4 @@ export { default as DropdownBlankSelection } from './_dropdown_blank_selection.j
|
|
15
14
|
export { default as DropdownClearSelection } from './_dropdown_clear_selection.jsx'
|
16
15
|
export { default as DropdownSubtleVariant } from './_dropdown_subtle_variant.jsx'
|
17
16
|
export { default as DropdownSeparatorsHidden } from './_dropdown_separators_hidden.jsx'
|
17
|
+
export {default as DropdownWithSearch} from './_dropdown_with_search.jsx'
|
@@ -14,8 +14,8 @@
|
|
14
14
|
<%= content.presence %>
|
15
15
|
<%= pb_rails("body", props: { status: "negative", text: object.error }) %>
|
16
16
|
<% else %>
|
17
|
-
<%= pb_rails("dropdown/dropdown_trigger") %>
|
18
|
-
<%= pb_rails("dropdown/dropdown_container") do %>
|
17
|
+
<%= pb_rails("dropdown/dropdown_trigger", props:{autocomplete: object.autocomplete}) %>
|
18
|
+
<%= pb_rails("dropdown/dropdown_container", props: {searchbar: object.searchbar}) do %>
|
19
19
|
<% if options_with_blank.present? %>
|
20
20
|
<% options_with_blank.each do |option| %>
|
21
21
|
<%= pb_rails("dropdown/dropdown_option", props: {option: option}) %>
|
@@ -18,6 +18,10 @@ module Playbook
|
|
18
18
|
default: "default"
|
19
19
|
prop :separators, type: Playbook::Props::Boolean,
|
20
20
|
default: true
|
21
|
+
prop :autocomplete, type: Playbook::Props::Boolean,
|
22
|
+
default: false
|
23
|
+
prop :searchbar, type: Playbook::Props::Boolean,
|
24
|
+
default: false
|
21
25
|
|
22
26
|
def data
|
23
27
|
Hash(prop(:data)).merge(pb_dropdown: true)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import React from "react"
|
2
2
|
import { render, screen } from "../utilities/test-utils"
|
3
3
|
|
4
|
-
import { Dropdown, Icon } from 'playbook-ui'
|
4
|
+
import { Dropdown, Icon, IconCircle } from 'playbook-ui'
|
5
5
|
|
6
6
|
|
7
7
|
const testId = 'dropdown'
|
@@ -219,4 +219,48 @@ test('show error message', () => {
|
|
219
219
|
|
220
220
|
const kit = screen.getByTestId(testId)
|
221
221
|
expect(kit).toHaveTextContent(errorMessage)
|
222
|
+
})
|
223
|
+
|
224
|
+
test("autocomplete prop to render input", () => {
|
225
|
+
render (
|
226
|
+
<Dropdown
|
227
|
+
autocomplete
|
228
|
+
data={{ testid: testId }}
|
229
|
+
options={options}
|
230
|
+
/>
|
231
|
+
)
|
232
|
+
|
233
|
+
const kit = screen.getByTestId(testId)
|
234
|
+
const input = kit.querySelector('.dropdown_input')
|
235
|
+
expect(input).toBeInTheDocument()
|
236
|
+
})
|
237
|
+
|
238
|
+
test("searchbar prop to render TextInput in container", () => {
|
239
|
+
render (
|
240
|
+
<Dropdown
|
241
|
+
data={{ testid: testId }}
|
242
|
+
options={options}
|
243
|
+
>
|
244
|
+
<Dropdown.Trigger>
|
245
|
+
<IconCircle
|
246
|
+
cursor="pointer"
|
247
|
+
icon="flag"
|
248
|
+
variant="royal"
|
249
|
+
/>
|
250
|
+
</Dropdown.Trigger>
|
251
|
+
<Dropdown.Container maxWidth="xs"
|
252
|
+
searchbar
|
253
|
+
>
|
254
|
+
{options.map((option) => (
|
255
|
+
<Dropdown.Option key={option.id}
|
256
|
+
option={option}
|
257
|
+
/>
|
258
|
+
))}
|
259
|
+
</Dropdown.Container>
|
260
|
+
</Dropdown>
|
261
|
+
)
|
262
|
+
|
263
|
+
const kit = screen.getByTestId(testId)
|
264
|
+
const searchbar = kit.querySelector('.pb_text_input_kit')
|
265
|
+
expect(searchbar).toBeInTheDocument()
|
222
266
|
})
|
@@ -1,4 +1,14 @@
|
|
1
1
|
<%= pb_content_tag do %>
|
2
|
+
<% if object.searchbar %>
|
3
|
+
<%= pb_rails("text_input", props: {padding_top:"xs", padding_x:"xs"}) do %>
|
4
|
+
<input
|
5
|
+
type="text"
|
6
|
+
placeholder="Search…"
|
7
|
+
data-dropdown-search
|
8
|
+
autocomplete="off"
|
9
|
+
/>
|
10
|
+
<% end %>
|
11
|
+
<% end %>
|
2
12
|
<%= pb_rails("list", props: {ordered: false, borderless: false}) do %>
|
3
13
|
<% if content.present? %>
|
4
14
|
<%= content.presence %>
|