playbook_ui 14.19.0.pre.alpha.PLAY21297675 → 14.19.0.pre.alpha.PLAY21377811
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_dropdown/_dropdown.scss +1 -1
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +77 -19
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +31 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.md +5 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.jsx +56 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.md +3 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.jsx +58 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.md +3 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.html.erb +20 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.html.erb +19 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.md +3 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.html.erb +20 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.jsx +57 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.html.erb +50 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.jsx +105 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.html.erb +22 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.jsx +67 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx +11 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.md +1 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +33 -2
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.md +3 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +11 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/index.js +5 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +16 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +34 -13
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +3 -1
- data/app/pb_kits/playbook/pb_dropdown/hooks/useHandleOnKeydown.tsx +0 -6
- data/app/pb_kits/playbook/pb_dropdown/index.js +336 -30
- data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +39 -12
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +16 -12
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +79 -13
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/MultiSelectTriggerDisplay.tsx +58 -0
- data/app/pb_kits/playbook/pb_file_upload/_file_upload.scss +13 -0
- data/app/pb_kits/playbook/pb_file_upload/_file_upload.tsx +11 -1
- data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.html.erb +1 -0
- data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.jsx +41 -0
- data/app/pb_kits/playbook/pb_file_upload/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_file_upload/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +1 -0
- data/app/pb_kits/playbook/pb_file_upload/file_upload.rb +7 -1
- data/app/pb_kits/playbook/pb_file_upload/fileupload.test.js +18 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -0
- data/app/pb_kits/playbook/pb_form_group/_error_state_mixin.scss +2 -2
- data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +19 -12
- data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +13 -7
- data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +2 -2
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_reset.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.md +2 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.md +3 -1
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.html.erb +22 -22
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.jsx +22 -22
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.html.erb +22 -22
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.jsx +22 -22
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children_with_radios.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_form.html.erb +11 -11
- data/app/pb_kits/playbook/pb_person/_person.tsx +12 -2
- data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +9 -9
- data/app/pb_kits/playbook/pb_text_input/_text_input.scss +4 -2
- data/dist/chunks/_typeahead-CLGxsWj4.js +22 -0
- data/dist/chunks/_weekday_stacked-BrJMDrKs.js +45 -0
- data/dist/chunks/{lib-B20MXZcW.js → lib-BB_ZEriO.js} +2 -2
- data/dist/chunks/{pb_form_validation-WWvUXPKD.js → pb_form_validation-C0la9CZR.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +1 -1
- data/dist/playbook-rails-react-bindings.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/version.rb +1 -1
- metadata +26 -7
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.html.erb +0 -10
- data/dist/chunks/_typeahead-BPSIWtFT.js +0 -22
- data/dist/chunks/_weekday_stacked-BeuPAmxG.js +0 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e3cef0436d45ddc7db0c5a43cd08231dca01397143bb6b165b064a62531527c
|
4
|
+
data.tar.gz: 760ebb338693dff4549a55d3ff38d7f8ffca698b23f916449e9960d2bb96b58f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88b34b166112f11627a7ff072f529b2c2840e389c59abcf3ff237b94d1ace1bf18217c5b154340d76e4abac08b3ed22c4ac194b9fe4da80f9d55fcf2fffdb0c9
|
7
|
+
data.tar.gz: e77a82b26eea3ea8de2874c6717ee31c75e152581e68ef15021a22bf3e23761c60a2aa488500ac5bab31f2919903d4b4dd5f8606003d912ee015460e0290e000
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle } from "react";
|
1
|
+
import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle, useMemo } from "react";
|
2
2
|
import classnames from "classnames";
|
3
3
|
import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from "../utilities/props";
|
4
4
|
import { globalProps } from "../utilities/globalProps";
|
@@ -25,6 +25,7 @@ type DropdownProps = {
|
|
25
25
|
blankSelection?: string;
|
26
26
|
children?: React.ReactChild[] | React.ReactChild | React.ReactElement[];
|
27
27
|
className?: string;
|
28
|
+
formPillProps?: GenericObject;
|
28
29
|
dark?: boolean;
|
29
30
|
data?: { [key: string]: string };
|
30
31
|
defaultValue?: GenericObject;
|
@@ -33,6 +34,7 @@ type DropdownProps = {
|
|
33
34
|
id?: string;
|
34
35
|
isClosed?: boolean;
|
35
36
|
label?: string;
|
37
|
+
multiSelect?: boolean;
|
36
38
|
onSelect?: (arg: GenericObject) => null;
|
37
39
|
options: GenericObject;
|
38
40
|
separators?: boolean;
|
@@ -61,6 +63,8 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
61
63
|
id,
|
62
64
|
isClosed = true,
|
63
65
|
label,
|
66
|
+
multiSelect = false,
|
67
|
+
formPillProps,
|
64
68
|
onSelect,
|
65
69
|
options,
|
66
70
|
separators = true,
|
@@ -80,7 +84,20 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
80
84
|
const [isDropDownClosed, setIsDropDownClosed, toggleDropdown] = useDropdown(isClosed);
|
81
85
|
|
82
86
|
const [filterItem, setFilterItem] = useState("");
|
83
|
-
const
|
87
|
+
const initialSelected = useMemo(() => {
|
88
|
+
if (multiSelect) {
|
89
|
+
if (Array.isArray(defaultValue)) return defaultValue;
|
90
|
+
return defaultValue && Object.keys(defaultValue).length
|
91
|
+
? [defaultValue]
|
92
|
+
: [];
|
93
|
+
}
|
94
|
+
return defaultValue || {};
|
95
|
+
}, [multiSelect, defaultValue]);
|
96
|
+
|
97
|
+
const [selected, setSelected] = useState<GenericObject | GenericObject[]>(
|
98
|
+
initialSelected
|
99
|
+
);
|
100
|
+
|
84
101
|
const [isInputFocused, setIsInputFocused] = useState(false);
|
85
102
|
const [hasTriggerSubcomponent, setHasTriggerSubcomponent] = useState(true);
|
86
103
|
const [hasContainerSubcomponent, setHasContainerSubcomponent] =
|
@@ -93,6 +110,12 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
93
110
|
const inputWrapperRef = useRef(null);
|
94
111
|
const dropdownContainerRef = useRef(null);
|
95
112
|
|
113
|
+
const selectedArray = Array.isArray(selected)
|
114
|
+
? selected
|
115
|
+
: selected && Object.keys(selected).length
|
116
|
+
? [selected]
|
117
|
+
: [];
|
118
|
+
|
96
119
|
const { trigger, container, otherChildren } =
|
97
120
|
separateChildComponents(children);
|
98
121
|
|
@@ -124,16 +147,23 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
124
147
|
|
125
148
|
const blankSelectionOption: GenericObject = blankSelection ? [{ label: blankSelection, value: "" }] : [];
|
126
149
|
const optionsWithBlankSelection = blankSelectionOption.concat(options);
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
150
|
+
|
151
|
+
const availableOptions = useMemo(()=> {
|
152
|
+
if (!multiSelect) return optionsWithBlankSelection;
|
153
|
+
return optionsWithBlankSelection.filter((option: GenericObject) => !selectedArray.some((sel) => sel.label === option.label));
|
154
|
+
}, [optionsWithBlankSelection, selectedArray, multiSelect]);
|
155
|
+
|
156
|
+
const filteredOptions = useMemo(() => {
|
157
|
+
return availableOptions.filter((opt: GenericObject) =>
|
158
|
+
String(opt.label).toLowerCase().includes(filterItem.toLowerCase())
|
159
|
+
);
|
160
|
+
}, [availableOptions, filterItem]);
|
131
161
|
|
132
162
|
// For keyboard accessibility: Set focus within dropdown to selected item if it exists
|
133
163
|
useEffect(() => {
|
134
164
|
if (!isDropDownClosed) {
|
135
165
|
let newIndex = 0;
|
136
|
-
if (selected && selected
|
166
|
+
if (selected && !Array.isArray(selected) && selected.label) {
|
137
167
|
const selectedIndex = filteredOptions.findIndex((option: GenericObject) => option.label === selected.label);
|
138
168
|
if (selectedIndex >= 0) {
|
139
169
|
newIndex = selectedIndex;
|
@@ -149,12 +179,27 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
149
179
|
setIsDropDownClosed(false);
|
150
180
|
};
|
151
181
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
182
|
+
|
183
|
+
const handleOptionClick = (clickedItem: GenericObject) => {
|
184
|
+
if (multiSelect) {
|
185
|
+
setSelected((prev) => {
|
186
|
+
const list = prev as GenericObject[];
|
187
|
+
const exists = list.find((option) => option.value === clickedItem.value);
|
188
|
+
const next = exists
|
189
|
+
? list.filter((option) => option.value !== clickedItem.value)
|
190
|
+
: [...list, clickedItem];
|
191
|
+
onSelect && onSelect(next);
|
192
|
+
return next;
|
193
|
+
});
|
194
|
+
setFilterItem("");
|
195
|
+
setIsDropDownClosed(true);
|
196
|
+
} else {
|
197
|
+
setSelected(clickedItem);
|
198
|
+
setFilterItem("");
|
199
|
+
setIsDropDownClosed(true);
|
200
|
+
onSelect && onSelect(clickedItem);
|
201
|
+
}
|
202
|
+
};
|
158
203
|
|
159
204
|
const handleWrapperClick = () => {
|
160
205
|
autocomplete && inputRef?.current?.focus();
|
@@ -162,9 +207,14 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
162
207
|
};
|
163
208
|
|
164
209
|
const handleBackspace = () => {
|
210
|
+
if (multiSelect) {
|
211
|
+
setSelected([]);
|
212
|
+
onSelect && onSelect([]);
|
213
|
+
} else {
|
165
214
|
setSelected({});
|
166
215
|
onSelect && onSelect(null);
|
167
216
|
setFocusedOptionIndex(-1);
|
217
|
+
}
|
168
218
|
};
|
169
219
|
|
170
220
|
const componentsToRender = prepareSubcomponents({
|
@@ -178,12 +228,17 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
178
228
|
});
|
179
229
|
|
180
230
|
useImperativeHandle(ref, () => ({
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
231
|
+
clearSelected: () => {
|
232
|
+
if (multiSelect) {
|
233
|
+
setSelected([]);
|
234
|
+
onSelect && onSelect([]);
|
235
|
+
} else {
|
236
|
+
setSelected({});
|
237
|
+
onSelect && onSelect(null);
|
238
|
+
}
|
239
|
+
setFilterItem("");
|
240
|
+
setIsDropDownClosed(true);
|
241
|
+
},
|
187
242
|
}));
|
188
243
|
|
189
244
|
return (
|
@@ -201,6 +256,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
201
256
|
filteredOptions,
|
202
257
|
filterItem,
|
203
258
|
focusedOptionIndex,
|
259
|
+
formPillProps,
|
204
260
|
handleBackspace,
|
205
261
|
handleChange,
|
206
262
|
handleOptionClick,
|
@@ -209,6 +265,8 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
209
265
|
inputWrapperRef,
|
210
266
|
isDropDownClosed,
|
211
267
|
isInputFocused,
|
268
|
+
multiSelect,
|
269
|
+
onSelect,
|
212
270
|
optionsWithBlankSelection,
|
213
271
|
selected,
|
214
272
|
setFocusedOptionIndex,
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<%
|
2
|
+
options = [
|
3
|
+
{ label: 'United States', value: 'United States', id: 'us' },
|
4
|
+
{ label: 'Canada', value: 'Canada', id: 'ca' },
|
5
|
+
{ label: 'Pakistan', value: 'Pakistan', id: 'pk' },
|
6
|
+
]
|
7
|
+
|
8
|
+
%>
|
9
|
+
|
10
|
+
<%
|
11
|
+
options2 = [
|
12
|
+
{ label: 'India', value: 'India', id: 'in' },
|
13
|
+
{ label: 'Mexico', value: 'Mexico', id: 'mx' },
|
14
|
+
{ label: 'Brazil', value: 'Brazil', id: 'br' },
|
15
|
+
{ label: 'Argentina', value: 'Argentina', id: 'ar' },
|
16
|
+
{ label: 'Colombia', value: 'Colombia', id: 'co' },
|
17
|
+
{ label: 'Chile', value: 'Chile', id: 'cl' },
|
18
|
+
{ label: 'Peru', value: 'Peru', id: 'pe' },
|
19
|
+
]
|
20
|
+
|
21
|
+
%>
|
22
|
+
|
23
|
+
<%= pb_rails("dropdown", props: {options: options}) %>
|
24
|
+
|
25
|
+
<script>
|
26
|
+
document.addEventListener("pb:dropdown:selected", (e) => {
|
27
|
+
const option = e.detail;
|
28
|
+
const dropdown = e.target;
|
29
|
+
console.log("Selected option:", option);
|
30
|
+
})
|
31
|
+
</script>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
This kit's `options` prop requires an array of objects, each of which will be used as the selectable options within the dropdown. Each option object can support any number of key-value pairs, but each MUST contain `label`, `value` and `id`.
|
2
|
+
|
3
|
+
The kit also comes with a custom event called "pb:dropdown:selected" which updates dynamically with the selection as it changes. See code snippet to see this in action.
|
4
|
+
|
5
|
+
In addition, a data attribute called `data-option-selected` with the selection is also rendered on the parent dropdown div.
|
@@ -0,0 +1,56 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import Dropdown from '../../pb_dropdown/_dropdown'
|
3
|
+
|
4
|
+
const DropdownMultiSelect = (props) => {
|
5
|
+
|
6
|
+
const options = [
|
7
|
+
{
|
8
|
+
label: "United States",
|
9
|
+
value: "United States",
|
10
|
+
},
|
11
|
+
{
|
12
|
+
label: "United Kingdom",
|
13
|
+
value: "United Kingdom",
|
14
|
+
},
|
15
|
+
{
|
16
|
+
label: "Canada",
|
17
|
+
value: "Canada",
|
18
|
+
},
|
19
|
+
{
|
20
|
+
label: "Pakistan",
|
21
|
+
value: "Pakistan",
|
22
|
+
},
|
23
|
+
{
|
24
|
+
label: "India",
|
25
|
+
value: "India",
|
26
|
+
},
|
27
|
+
{
|
28
|
+
label: "Australia",
|
29
|
+
value: "Australia",
|
30
|
+
},
|
31
|
+
{
|
32
|
+
label: "New Zealand",
|
33
|
+
value: "New Zealand",
|
34
|
+
},
|
35
|
+
{
|
36
|
+
label: "Italy",
|
37
|
+
value: "Italy",
|
38
|
+
},
|
39
|
+
{
|
40
|
+
label: "Spain",
|
41
|
+
value: "Spain",
|
42
|
+
}
|
43
|
+
];
|
44
|
+
|
45
|
+
return (
|
46
|
+
<div>
|
47
|
+
<Dropdown
|
48
|
+
multiSelect
|
49
|
+
options={options}
|
50
|
+
{...props}
|
51
|
+
/>
|
52
|
+
</div>
|
53
|
+
)
|
54
|
+
}
|
55
|
+
|
56
|
+
export default DropdownMultiSelect
|
@@ -0,0 +1,58 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import Dropdown from '../../pb_dropdown/_dropdown'
|
3
|
+
|
4
|
+
const DropdownMultiSelectDisplay = (props) => {
|
5
|
+
|
6
|
+
const options = [
|
7
|
+
{
|
8
|
+
label: "United States",
|
9
|
+
value: "United States",
|
10
|
+
},
|
11
|
+
{
|
12
|
+
label: "United Kingdom",
|
13
|
+
value: "United Kingdom",
|
14
|
+
},
|
15
|
+
{
|
16
|
+
label: "Canada",
|
17
|
+
value: "Canada",
|
18
|
+
},
|
19
|
+
{
|
20
|
+
label: "Pakistan",
|
21
|
+
value: "Pakistan",
|
22
|
+
},
|
23
|
+
{
|
24
|
+
label: "India",
|
25
|
+
value: "India",
|
26
|
+
},
|
27
|
+
{
|
28
|
+
label: "Australia",
|
29
|
+
value: "Australia",
|
30
|
+
},
|
31
|
+
{
|
32
|
+
label: "New Zealand",
|
33
|
+
value: "New Zealand",
|
34
|
+
},
|
35
|
+
{
|
36
|
+
label: "Italy",
|
37
|
+
value: "Italy",
|
38
|
+
},
|
39
|
+
{
|
40
|
+
label: "Spain",
|
41
|
+
value: "Spain",
|
42
|
+
}
|
43
|
+
];
|
44
|
+
|
45
|
+
|
46
|
+
return (
|
47
|
+
<div>
|
48
|
+
<Dropdown
|
49
|
+
formPillProps={{size:"small", color:"neutral"}}
|
50
|
+
multiSelect
|
51
|
+
options={options}
|
52
|
+
{...props}
|
53
|
+
/>
|
54
|
+
</div>
|
55
|
+
)
|
56
|
+
}
|
57
|
+
|
58
|
+
export default DropdownMultiSelectDisplay
|
@@ -0,0 +1,3 @@
|
|
1
|
+
By default, the `multiSelect` prop will render selected options as the default FormPill. `FormPillProps` however can be used to customize these Pills with any props that exist for the FormPill.
|
2
|
+
|
3
|
+
This prop must be an object that contains valid FormPill props. For a full list of FormPill props, see [here](https://playbook.powerapp.cloud/kits/form_pill/react).
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<%
|
2
|
+
options = [
|
3
|
+
{ label: 'United States', value: 'United States', id: 'us' },
|
4
|
+
{ label: 'Canada', value: 'Canada', id: 'ca' },
|
5
|
+
{ label: 'Pakistan', value: 'Pakistan', id: 'pk' },
|
6
|
+
{ label: 'India', value: 'India', id: 'in' },
|
7
|
+
{ label: 'United Kingdom', value: 'United Kingdom', id: 'uk' },
|
8
|
+
{ label: 'Australia', value: 'Australia', id: 'au' },
|
9
|
+
{ label: 'New Zealand', value: 'New Zealand', id: 'nz' },
|
10
|
+
{ label: 'Germany', value: 'Germany', id: 'de' },
|
11
|
+
{ label: 'France', value: 'France', id: 'fr' },
|
12
|
+
{ label: 'Italy', value: 'Italy', id: 'it' },
|
13
|
+
]
|
14
|
+
%>
|
15
|
+
|
16
|
+
<%= pb_rails("dropdown", props: {
|
17
|
+
options: options,
|
18
|
+
multi_select: true,
|
19
|
+
form_pill_props: { size:"small", color:"neutral" },
|
20
|
+
}) %>
|
@@ -0,0 +1 @@
|
|
1
|
+
By default, the `multi_select` prop will render selected options as the default form_pill. `form_pill_props` however can be used to customize these Pills with props that exist for the form_pill. Currently, only the '[color](https://playbook.powerapp.cloud/kits/form_pill/rails#form-pill-colors)' and '[size](https://playbook.powerapp.cloud/kits/form_pill/rails#form-pill-size)' props are supported as shown here.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<%
|
2
|
+
options = [
|
3
|
+
{ label: 'United States', value: 'United States', id: 'us' },
|
4
|
+
{ label: 'Canada', value: 'Canada', id: 'ca' },
|
5
|
+
{ label: 'Pakistan', value: 'Pakistan', id: 'pk' },
|
6
|
+
{ label: 'India', value: 'India', id: 'in' },
|
7
|
+
{ label: 'United Kingdom', value: 'United Kingdom', id: 'uk' },
|
8
|
+
{ label: 'Australia', value: 'Australia', id: 'au' },
|
9
|
+
{ label: 'New Zealand', value: 'New Zealand', id: 'nz' },
|
10
|
+
{ label: 'Germany', value: 'Germany', id: 'de' },
|
11
|
+
{ label: 'France', value: 'France', id: 'fr' },
|
12
|
+
{ label: 'Italy', value: 'Italy', id: 'it' },
|
13
|
+
]
|
14
|
+
%>
|
15
|
+
|
16
|
+
<%= pb_rails("dropdown", props: {
|
17
|
+
options: options,
|
18
|
+
multi_select: true,
|
19
|
+
}) %>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<%
|
2
|
+
options = [
|
3
|
+
{ label: 'United States', value: 'United States', id: 'us' },
|
4
|
+
{ label: 'Canada', value: 'Canada', id: 'ca' },
|
5
|
+
{ label: 'Pakistan', value: 'Pakistan', id: 'pk' },
|
6
|
+
{ label: 'India', value: 'India', id: 'in' },
|
7
|
+
{ label: 'United Kingdom', value: 'United Kingdom', id: 'uk' },
|
8
|
+
{ label: 'Australia', value: 'Australia', id: 'au' },
|
9
|
+
{ label: 'New Zealand', value: 'New Zealand', id: 'nz' },
|
10
|
+
{ label: 'Germany', value: 'Germany', id: 'de' },
|
11
|
+
{ label: 'France', value: 'France', id: 'fr' },
|
12
|
+
{ label: 'Italy', value: 'Italy', id: 'it' },
|
13
|
+
]
|
14
|
+
%>
|
15
|
+
|
16
|
+
<%= pb_rails("dropdown", props: {
|
17
|
+
autocomplete: true,
|
18
|
+
options: options,
|
19
|
+
multi_select: true,
|
20
|
+
}) %>
|
@@ -0,0 +1,57 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import Dropdown from '../../pb_dropdown/_dropdown'
|
3
|
+
|
4
|
+
const DropdownMultiSelectWithAutocomplete = (props) => {
|
5
|
+
|
6
|
+
const options = [
|
7
|
+
{
|
8
|
+
label: "United States",
|
9
|
+
value: "United States",
|
10
|
+
},
|
11
|
+
{
|
12
|
+
label: "United Kingdom",
|
13
|
+
value: "United Kingdom",
|
14
|
+
},
|
15
|
+
{
|
16
|
+
label: "Canada",
|
17
|
+
value: "Canada",
|
18
|
+
},
|
19
|
+
{
|
20
|
+
label: "Pakistan",
|
21
|
+
value: "Pakistan",
|
22
|
+
},
|
23
|
+
{
|
24
|
+
label: "India",
|
25
|
+
value: "India",
|
26
|
+
},
|
27
|
+
{
|
28
|
+
label: "Australia",
|
29
|
+
value: "Australia",
|
30
|
+
},
|
31
|
+
{
|
32
|
+
label: "New Zealand",
|
33
|
+
value: "New Zealand",
|
34
|
+
},
|
35
|
+
{
|
36
|
+
label: "Italy",
|
37
|
+
value: "Italy",
|
38
|
+
},
|
39
|
+
{
|
40
|
+
label: "Spain",
|
41
|
+
value: "Spain",
|
42
|
+
}
|
43
|
+
];
|
44
|
+
|
45
|
+
return (
|
46
|
+
<div>
|
47
|
+
<Dropdown
|
48
|
+
autocomplete
|
49
|
+
multiSelect
|
50
|
+
options={options}
|
51
|
+
{...props}
|
52
|
+
/>
|
53
|
+
</div>
|
54
|
+
)
|
55
|
+
}
|
56
|
+
|
57
|
+
export default DropdownMultiSelectWithAutocomplete
|
@@ -0,0 +1 @@
|
|
1
|
+
`multiSelect` can also be used with the `autocomplete` functionality.
|
data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.html.erb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
<%
|
2
|
+
options = [
|
3
|
+
{
|
4
|
+
label: "United States",
|
5
|
+
value: "United States",
|
6
|
+
areaCode: "+1",
|
7
|
+
icon: "🇺🇸",
|
8
|
+
id: "us"
|
9
|
+
},
|
10
|
+
{
|
11
|
+
label: "Canada",
|
12
|
+
value: "Canada",
|
13
|
+
areaCode: "+1",
|
14
|
+
icon: "🇨🇦",
|
15
|
+
id: "ca"
|
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, multi_select: true }) do %>
|
29
|
+
<%= pb_rails("dropdown/dropdown_trigger", props:{ multi_select: true }) %>
|
30
|
+
<%= pb_rails("dropdown/dropdown_container") do %>
|
31
|
+
<% options.each do |option| %>
|
32
|
+
<%= pb_rails("dropdown/dropdown_option", props: {option: option}) do %>
|
33
|
+
<%= pb_rails("flex", props: {
|
34
|
+
align: "center",
|
35
|
+
justify: "between",
|
36
|
+
}) do %>
|
37
|
+
<%= pb_rails("flex/flex_item") do %>
|
38
|
+
<%= pb_rails("flex") do %>
|
39
|
+
<%= pb_rails("icon", props: {icon: option[:icon]}) %>
|
40
|
+
<%= pb_rails("body", props: {text: option[:label], padding_left:"xs"}) %>
|
41
|
+
<% end %>
|
42
|
+
<% end %>
|
43
|
+
<%= pb_rails("flex/flex_item") do %>
|
44
|
+
<%= pb_rails("body", props: {color:"light", text: option[:areaCode]}) %>
|
45
|
+
<% end %>
|
46
|
+
<% end %>
|
47
|
+
<% end %>
|
48
|
+
<% end %>
|
49
|
+
<% end %>
|
50
|
+
<% end %>
|
@@ -0,0 +1,105 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import Dropdown from '../../pb_dropdown/_dropdown'
|
3
|
+
import Body from '../../pb_body/_body'
|
4
|
+
import Flex from '../../pb_flex/_flex'
|
5
|
+
import FlexItem from '../../pb_flex/_flex_item'
|
6
|
+
import Icon from '../../pb_icon/_icon'
|
7
|
+
|
8
|
+
const DropdownMultiSelectWithCustomOptions = (props) => {
|
9
|
+
|
10
|
+
const options = [
|
11
|
+
{
|
12
|
+
label: "United States",
|
13
|
+
value: "United States",
|
14
|
+
areaCode: "+1",
|
15
|
+
icon: "🇺🇸",
|
16
|
+
id: "United-states"
|
17
|
+
},
|
18
|
+
{
|
19
|
+
label: "Canada",
|
20
|
+
value: "Canada",
|
21
|
+
areaCode: "+1",
|
22
|
+
icon: "🇨🇦",
|
23
|
+
id: "canada"
|
24
|
+
},
|
25
|
+
{
|
26
|
+
label: "Pakistan",
|
27
|
+
value: "Pakistan",
|
28
|
+
areaCode: "+92",
|
29
|
+
icon: "🇵🇰",
|
30
|
+
id: "pakistan"
|
31
|
+
},
|
32
|
+
{
|
33
|
+
label: "India",
|
34
|
+
value: "India",
|
35
|
+
areaCode: "+91",
|
36
|
+
icon: "🇮🇳",
|
37
|
+
id: "india"
|
38
|
+
},
|
39
|
+
{
|
40
|
+
label: "Australia",
|
41
|
+
value: "Australia",
|
42
|
+
areaCode: "+61",
|
43
|
+
icon: "🇦🇺",
|
44
|
+
id: "australia"
|
45
|
+
},
|
46
|
+
{
|
47
|
+
label: "New Zealand",
|
48
|
+
value: "New Zealand",
|
49
|
+
areaCode: "+64",
|
50
|
+
icon: "🇳🇿",
|
51
|
+
id: "new-zealand"
|
52
|
+
},
|
53
|
+
{
|
54
|
+
label: "Italy",
|
55
|
+
value: "Italy",
|
56
|
+
areaCode: "+39",
|
57
|
+
icon: "🇮🇹",
|
58
|
+
id: "italy"
|
59
|
+
},
|
60
|
+
{
|
61
|
+
label: "Spain",
|
62
|
+
value: "Spain",
|
63
|
+
areaCode: "+34",
|
64
|
+
icon: "🇪🇸",
|
65
|
+
id: "spain"
|
66
|
+
}
|
67
|
+
];
|
68
|
+
|
69
|
+
return (
|
70
|
+
<div>
|
71
|
+
<Dropdown
|
72
|
+
multiSelect
|
73
|
+
options={options}
|
74
|
+
{...props}
|
75
|
+
>
|
76
|
+
{options.map((option) => (
|
77
|
+
<Dropdown.Option key={option.id}
|
78
|
+
option={option}
|
79
|
+
>
|
80
|
+
<Flex
|
81
|
+
align="center"
|
82
|
+
justify="between"
|
83
|
+
>
|
84
|
+
<FlexItem>
|
85
|
+
<Flex>
|
86
|
+
<Icon icon={option.icon}
|
87
|
+
paddingRight="xs"
|
88
|
+
/>
|
89
|
+
<Body text={option.label} />
|
90
|
+
</Flex>
|
91
|
+
</FlexItem>
|
92
|
+
<FlexItem>
|
93
|
+
<Body color="light"
|
94
|
+
text={option.areaCode}
|
95
|
+
/>
|
96
|
+
</FlexItem>
|
97
|
+
</Flex>
|
98
|
+
</Dropdown.Option>
|
99
|
+
))}
|
100
|
+
</Dropdown>
|
101
|
+
</div>
|
102
|
+
)
|
103
|
+
}
|
104
|
+
|
105
|
+
export default DropdownMultiSelectWithCustomOptions
|