playbook_ui 14.20.0.pre.alpha.revert4637revert4621PLAY2033atactionbarrails7855 → 14.20.0.pre.rc.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.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +35 -61
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +22 -36
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +19 -6
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +8 -16
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +0 -9
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta.md +2 -6
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.jsx +0 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.md +1 -3
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_default.md +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +0 -2
- data/app/pb_kits/playbook/pb_advanced_table/index.js +12 -155
- data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +0 -4
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +1 -1
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +19 -77
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.html.erb +10 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx +0 -11
- 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 +2 -33
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.md +1 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +1 -11
- data/app/pb_kits/playbook/pb_dropdown/docs/index.js +0 -5
- data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +2 -16
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +13 -34
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +1 -3
- data/app/pb_kits/playbook/pb_dropdown/hooks/useHandleOnKeydown.tsx +6 -0
- data/app/pb_kits/playbook/pb_dropdown/index.js +30 -336
- data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +12 -39
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +12 -16
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +13 -79
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +0 -1
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +0 -1
- 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 +12 -19
- data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +7 -13
- 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 +0 -2
- 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 +1 -3
- 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 +2 -12
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +3 -73
- data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +0 -1
- data/app/pb_kits/playbook/pb_typeahead/docs/index.js +0 -1
- data/dist/chunks/_typeahead-BPSIWtFT.js +22 -0
- data/dist/chunks/_weekday_stacked-PfWrqC3z.js +45 -0
- data/dist/chunks/lib-B20MXZcW.js +29 -0
- data/dist/chunks/{pb_form_validation-BZ2AVAi_.js → pb_form_validation-WWvUXPKD.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +2 -2
- 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/kit_base.rb +3 -3
- data/lib/playbook/version.rb +2 -2
- metadata +7 -32
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions_rails.html.erb +0 -137
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions_rails.md +0 -3
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_header_rails.html.erb +0 -40
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_header_rails.md +0 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_action_bar.html.erb +0 -23
- data/app/pb_kits/playbook/pb_advanced_table/table_action_bar.rb +0 -19
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +0 -31
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.md +0 -5
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.jsx +0 -56
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.md +0 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.jsx +0 -58
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.md +0 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.html.erb +0 -20
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.md +0 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.html.erb +0 -19
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.md +0 -3
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.html.erb +0 -20
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.jsx +0 -57
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.md +0 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.html.erb +0 -50
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.jsx +0 -105
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.html.erb +0 -22
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.jsx +0 -67
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/MultiSelectTriggerDisplay.tsx +0 -58
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.jsx +0 -23
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.md +0 -1
- data/dist/chunks/_typeahead-BmOWdDtp.js +0 -22
- data/dist/chunks/_weekday_stacked-CvcuQyr9.js +0 -45
- data/dist/chunks/lib-D5R1BjUn.js +0 -29
@@ -1,4 +1,4 @@
|
|
1
|
-
import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle
|
1
|
+
import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle } 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,7 +25,6 @@ type DropdownProps = {
|
|
25
25
|
blankSelection?: string;
|
26
26
|
children?: React.ReactChild[] | React.ReactChild | React.ReactElement[];
|
27
27
|
className?: string;
|
28
|
-
formPillProps?: GenericObject;
|
29
28
|
dark?: boolean;
|
30
29
|
data?: { [key: string]: string };
|
31
30
|
defaultValue?: GenericObject;
|
@@ -34,7 +33,6 @@ type DropdownProps = {
|
|
34
33
|
id?: string;
|
35
34
|
isClosed?: boolean;
|
36
35
|
label?: string;
|
37
|
-
multiSelect?: boolean;
|
38
36
|
onSelect?: (arg: GenericObject) => null;
|
39
37
|
options: GenericObject;
|
40
38
|
separators?: boolean;
|
@@ -63,8 +61,6 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
63
61
|
id,
|
64
62
|
isClosed = true,
|
65
63
|
label,
|
66
|
-
multiSelect = false,
|
67
|
-
formPillProps,
|
68
64
|
onSelect,
|
69
65
|
options,
|
70
66
|
separators = true,
|
@@ -84,20 +80,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
84
80
|
const [isDropDownClosed, setIsDropDownClosed, toggleDropdown] = useDropdown(isClosed);
|
85
81
|
|
86
82
|
const [filterItem, setFilterItem] = useState("");
|
87
|
-
const
|
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
|
-
|
83
|
+
const [selected, setSelected] = useState<GenericObject>(defaultValue);
|
101
84
|
const [isInputFocused, setIsInputFocused] = useState(false);
|
102
85
|
const [hasTriggerSubcomponent, setHasTriggerSubcomponent] = useState(true);
|
103
86
|
const [hasContainerSubcomponent, setHasContainerSubcomponent] =
|
@@ -110,12 +93,6 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
110
93
|
const inputWrapperRef = useRef(null);
|
111
94
|
const dropdownContainerRef = useRef(null);
|
112
95
|
|
113
|
-
const selectedArray = Array.isArray(selected)
|
114
|
-
? selected
|
115
|
-
: selected && Object.keys(selected).length
|
116
|
-
? [selected]
|
117
|
-
: [];
|
118
|
-
|
119
96
|
const { trigger, container, otherChildren } =
|
120
97
|
separateChildComponents(children);
|
121
98
|
|
@@ -147,23 +124,16 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
147
124
|
|
148
125
|
const blankSelectionOption: GenericObject = blankSelection ? [{ label: blankSelection, value: "" }] : [];
|
149
126
|
const optionsWithBlankSelection = blankSelectionOption.concat(options);
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
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]);
|
127
|
+
const filteredOptions = optionsWithBlankSelection?.filter((option: GenericObject) => {
|
128
|
+
const label = typeof option.label === 'string' ? option.label.toLowerCase() : option.label;
|
129
|
+
return String(label).toLowerCase().includes(filterItem.toLowerCase());
|
130
|
+
});
|
161
131
|
|
162
132
|
// For keyboard accessibility: Set focus within dropdown to selected item if it exists
|
163
133
|
useEffect(() => {
|
164
134
|
if (!isDropDownClosed) {
|
165
135
|
let newIndex = 0;
|
166
|
-
if (selected &&
|
136
|
+
if (selected && selected?.label) {
|
167
137
|
const selectedIndex = filteredOptions.findIndex((option: GenericObject) => option.label === selected.label);
|
168
138
|
if (selectedIndex >= 0) {
|
169
139
|
newIndex = selectedIndex;
|
@@ -179,27 +149,12 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
179
149
|
setIsDropDownClosed(false);
|
180
150
|
};
|
181
151
|
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
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
|
-
};
|
152
|
+
const handleOptionClick = (selectedItem: GenericObject) => {
|
153
|
+
setSelected(selectedItem);
|
154
|
+
setFilterItem("");
|
155
|
+
setIsDropDownClosed(true);
|
156
|
+
onSelect && onSelect(selectedItem);
|
157
|
+
};
|
203
158
|
|
204
159
|
const handleWrapperClick = () => {
|
205
160
|
autocomplete && inputRef?.current?.focus();
|
@@ -207,14 +162,9 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
207
162
|
};
|
208
163
|
|
209
164
|
const handleBackspace = () => {
|
210
|
-
if (multiSelect) {
|
211
|
-
setSelected([]);
|
212
|
-
onSelect && onSelect([]);
|
213
|
-
} else {
|
214
165
|
setSelected({});
|
215
166
|
onSelect && onSelect(null);
|
216
167
|
setFocusedOptionIndex(-1);
|
217
|
-
}
|
218
168
|
};
|
219
169
|
|
220
170
|
const componentsToRender = prepareSubcomponents({
|
@@ -228,17 +178,12 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
228
178
|
});
|
229
179
|
|
230
180
|
useImperativeHandle(ref, () => ({
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
onSelect && onSelect(null);
|
238
|
-
}
|
239
|
-
setFilterItem("");
|
240
|
-
setIsDropDownClosed(true);
|
241
|
-
},
|
181
|
+
clearSelected: () => {
|
182
|
+
setSelected({});
|
183
|
+
setFilterItem("");
|
184
|
+
setIsDropDownClosed(true);
|
185
|
+
onSelect && onSelect(null);
|
186
|
+
},
|
242
187
|
}));
|
243
188
|
|
244
189
|
return (
|
@@ -256,7 +201,6 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
256
201
|
filteredOptions,
|
257
202
|
filterItem,
|
258
203
|
focusedOptionIndex,
|
259
|
-
formPillProps,
|
260
204
|
handleBackspace,
|
261
205
|
handleChange,
|
262
206
|
handleOptionClick,
|
@@ -265,8 +209,6 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
265
209
|
inputWrapperRef,
|
266
210
|
isDropDownClosed,
|
267
211
|
isInputFocused,
|
268
|
-
multiSelect,
|
269
|
-
onSelect,
|
270
212
|
optionsWithBlankSelection,
|
271
213
|
selected,
|
272
214
|
setFocusedOptionIndex,
|
@@ -6,7 +6,6 @@ import Flex from '../../pb_flex/_flex'
|
|
6
6
|
import FlexItem from '../../pb_flex/_flex_item'
|
7
7
|
import Avatar from '../../pb_avatar/_avatar'
|
8
8
|
import User from '../../pb_user/_user'
|
9
|
-
import Body from '../../pb_body/_body'
|
10
9
|
|
11
10
|
const DropdownWithCustomDisplay = (props) => {
|
12
11
|
const [selectedOption, setSelectedOption] = useState();
|
@@ -51,20 +50,10 @@ const DropdownWithCustomDisplay = (props) => {
|
|
51
50
|
<>
|
52
51
|
{
|
53
52
|
selectedOption && (
|
54
|
-
<Flex align="center">
|
55
53
|
<Avatar
|
56
54
|
name={selectedOption.label}
|
57
55
|
size="xs"
|
58
56
|
/>
|
59
|
-
<Body
|
60
|
-
marginX="xs"
|
61
|
-
text={selectedOption.label}
|
62
|
-
/>
|
63
|
-
<Badge
|
64
|
-
text={selectedOption.status}
|
65
|
-
variant={selectedOption.status == "Offline" ? "neutral" : selectedOption.status == "Online" ? "success" : "warning"}
|
66
|
-
/>
|
67
|
-
</Flex>
|
68
57
|
)
|
69
58
|
}
|
70
59
|
</>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
Optionally utilize `customDisplay` on the `Dropdown.Trigger` subcomponent to customize its content after an option is selected.
|
1
|
+
Optionally utilize `customDisplay` on the `Dropdown.Trigger` subcomponent to customize its content after an option is selected. The component passed to customDisplay will be rendered to the left of the default text-based display. In this example the Avatar kit is being used.
|
2
2
|
|
3
3
|
The `placeholder` prop can also be used to customize the placeholder text for the default `Dropdown.Trigger`.
|
4
4
|
|
@@ -38,11 +38,7 @@
|
|
38
38
|
|
39
39
|
<%
|
40
40
|
custom_display = capture do
|
41
|
-
pb_rails("
|
42
|
-
concat(pb_rails("avatar", props: { name: "", size: "xs", id: "dropdown-avatar" }))
|
43
|
-
concat(pb_rails("body", props: { text: "", size: "xs", margin_x: "xs", id: "dropdown-avatar-name" }))
|
44
|
-
concat(pb_rails("badge", props: { text: "", id: "dropdown-avatar-status" }))
|
45
|
-
end
|
41
|
+
pb_rails("avatar", props: { name: "Courtney Long", size: "xs" })
|
46
42
|
end
|
47
43
|
%>
|
48
44
|
|
@@ -66,31 +62,4 @@
|
|
66
62
|
<% end %>
|
67
63
|
<% end %>
|
68
64
|
<% end %>
|
69
|
-
<% end %>
|
70
|
-
|
71
|
-
|
72
|
-
<script>
|
73
|
-
document.addEventListener("pb:dropdown:selected", (e) => {
|
74
|
-
const option = e.detail;
|
75
|
-
const dropdown = e.target;
|
76
|
-
|
77
|
-
const display = dropdown.querySelector("#dropdown_trigger_custom_display");
|
78
|
-
if (!display) return;
|
79
|
-
|
80
|
-
const nameEl = display.querySelector("#dropdown-avatar-name");
|
81
|
-
if (nameEl) nameEl.textContent = option.label;
|
82
|
-
|
83
|
-
const avatarEl = display.querySelector("#dropdown-avatar").querySelector(".avatar_wrapper");
|
84
|
-
const initials = (option.label[0] + option.label.split(" ").pop()[0]).toUpperCase();
|
85
|
-
if (avatarEl) {
|
86
|
-
avatarEl.dataset.name = option.label;
|
87
|
-
avatarEl.setAttribute("data-initials", initials);
|
88
|
-
}
|
89
|
-
const badgeEl = display.querySelector("#dropdown-avatar-status");
|
90
|
-
const variant = option.status === "Online" ? "success" : option.status === "Offline" ? "neutral" : "warning";
|
91
|
-
if (badgeEl) {
|
92
|
-
badgeEl.querySelector("span").textContent = option.status;
|
93
|
-
badgeEl.className = 'pb_badge_kit_' + variant;
|
94
|
-
}
|
95
|
-
});
|
96
|
-
</script>
|
65
|
+
<% end %>
|
@@ -1,6 +1,4 @@
|
|
1
|
-
Optionally utilize `custom_display` on the `dropdown/dropdown_trigger` subcomponent to customize its content after an option is selected.
|
2
|
-
|
3
|
-
Make use of a script to help set the custom_display with the correct value. By using the pb:dropdown:selected event listener, you can target the kits with a querySelector and update them dynamically with the values needed to match the selected option. Make sure to add an ID to the kits being passed in.
|
1
|
+
Optionally utilize `custom_display` on the `dropdown/dropdown_trigger` subcomponent to customize its content after an option is selected. The component passed to custom_display will be rendered to the left of the default text-based display. In this example the Avatar kit is being used.
|
4
2
|
|
5
3
|
The `placeholder` prop can also be used to customize the placeholder text for the default `dropdown/dropdown_trigger`.
|
6
4
|
|
@@ -1,45 +1,35 @@
|
|
1
1
|
examples:
|
2
2
|
rails:
|
3
|
-
-
|
3
|
+
- dropdown_default: Default
|
4
4
|
- dropdown_with_autocomplete: Autocomplete
|
5
|
-
- dropdown_multi_select_rails: Multi Select
|
6
|
-
- dropdown_multi_select_with_autocomplete: Multi Select with Autocomplete
|
7
|
-
- dropdown_multi_select_display_rails: Multi Select with Form Pill Props
|
8
5
|
- dropdown_subtle_variant: Subtle Variant
|
9
6
|
- dropdown_subcomponent_structure_rails: Subcomponent Structure
|
10
7
|
- dropdown_with_autocomplete_with_subcomponents: Autocomplete with Subcomponent Structure
|
11
8
|
- dropdown_with_label: With Label
|
12
9
|
- dropdown_with_custom_options_rails: Custom Options
|
13
|
-
- dropdown_multi_select_with_custom_options: Multi Select with Custom Options
|
14
10
|
- dropdown_with_custom_display_rails: Custom Display
|
15
11
|
- dropdown_with_custom_trigger_rails: Custom Trigger
|
16
12
|
- dropdown_with_search_rails: Custom Trigger Dropdown with Search
|
17
13
|
- dropdown_with_custom_padding: Custom Option Padding
|
18
14
|
- dropdown_error: Dropdown with Error
|
19
15
|
- dropdown_default_value: Default Value
|
20
|
-
- dropdown_multi_select_with_default: Multi Select Default Value
|
21
16
|
- dropdown_blank_selection: Blank Selection
|
22
17
|
- dropdown_separators_hidden: Separators Hidden
|
23
18
|
|
24
19
|
react:
|
25
20
|
- dropdown_default: Default
|
26
21
|
- dropdown_with_autocomplete: Autocomplete
|
27
|
-
- dropdown_multi_select: Multi Select
|
28
|
-
- dropdown_multi_select_with_autocomplete: Multi Select with Autocomplete
|
29
|
-
- dropdown_multi_select_display: Multi Select with Form Pill Props
|
30
22
|
- dropdown_subtle_variant: Subtle Variant
|
31
23
|
- dropdown_subcomponent_structure: Subcomponent Structure
|
32
24
|
- dropdown_with_autocomplete_with_subcomponents: Autocomplete with Subcomponent Structure
|
33
25
|
- dropdown_with_label: With Label
|
34
26
|
- dropdown_with_custom_options: Custom Options
|
35
|
-
- dropdown_multi_select_with_custom_options: Multi Select with Custom Options
|
36
27
|
- dropdown_with_custom_display: Custom Display
|
37
28
|
- dropdown_with_custom_trigger: Custom Trigger
|
38
29
|
- dropdown_with_search: Custom Trigger Dropdown with Search
|
39
30
|
- dropdown_with_custom_padding: Custom Option Padding
|
40
31
|
- dropdown_error: Dropdown with Error
|
41
32
|
- dropdown_default_value: Default Value
|
42
|
-
- dropdown_multi_select_with_default: Multi Select Default Value
|
43
33
|
- dropdown_blank_selection: Blank Selection
|
44
34
|
- dropdown_clear_selection: Clear Selection
|
45
35
|
- dropdown_separators_hidden: Separators Hidden
|
@@ -15,8 +15,3 @@ export { default as DropdownClearSelection } from './_dropdown_clear_selection.j
|
|
15
15
|
export { default as DropdownSubtleVariant } from './_dropdown_subtle_variant.jsx'
|
16
16
|
export { default as DropdownSeparatorsHidden } from './_dropdown_separators_hidden.jsx'
|
17
17
|
export {default as DropdownWithSearch} from './_dropdown_with_search.jsx'
|
18
|
-
export { default as DropdownMultiSelect } from './_dropdown_multi_select.jsx'
|
19
|
-
export { default as DropdownMultiSelectDisplay } from './_dropdown_multi_select_display.jsx'
|
20
|
-
export { default as DropdownMultiSelectWithAutocomplete } from './_dropdown_multi_select_with_autocomplete.jsx'
|
21
|
-
export { default as DropdownMultiSelectWithDefault } from './_dropdown_multi_select_with_default.jsx'
|
22
|
-
export { default as DropdownMultiSelectWithCustomOptions } from './_dropdown_multi_select_with_custom_options.jsx'
|
@@ -6,7 +6,7 @@
|
|
6
6
|
<input
|
7
7
|
data-default-value="<%= input_default_value %>"
|
8
8
|
id="dropdown-selected-option"
|
9
|
-
name="<%= object.name
|
9
|
+
name="<%= object.name %>"
|
10
10
|
style="display: none"
|
11
11
|
<%= object.required ? "required" : ""%>
|
12
12
|
/>
|
@@ -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", props:{
|
18
|
-
<%= pb_rails("dropdown/dropdown_container", props: {
|
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}) %>
|
@@ -22,17 +22,9 @@ module Playbook
|
|
22
22
|
default: false
|
23
23
|
prop :searchbar, type: Playbook::Props::Boolean,
|
24
24
|
default: false
|
25
|
-
prop :multi_select, type: Playbook::Props::Boolean,
|
26
|
-
default: false
|
27
|
-
prop :form_pill_props, type: Playbook::Props::HashProp,
|
28
|
-
default: {}
|
29
25
|
|
30
26
|
def data
|
31
|
-
Hash(prop(:data)).merge(
|
32
|
-
pb_dropdown: true,
|
33
|
-
pb_dropdown_multi_select: multi_select,
|
34
|
-
form_pill_props: form_pill_props.to_json
|
35
|
-
)
|
27
|
+
Hash(prop(:data)).merge(pb_dropdown: true)
|
36
28
|
end
|
37
29
|
|
38
30
|
def classname
|
@@ -46,13 +38,7 @@ module Playbook
|
|
46
38
|
end
|
47
39
|
|
48
40
|
def input_default_value
|
49
|
-
|
50
|
-
|
51
|
-
if multi_select
|
52
|
-
default_value.map { |v| v.transform_keys(&:to_s)["id"] }.join(",")
|
53
|
-
else
|
54
|
-
default_value.transform_keys(&:to_s)["id"]
|
55
|
-
end
|
41
|
+
default_value.present? ? default_value.transform_keys(&:to_s)["id"] : ""
|
56
42
|
end
|
57
43
|
|
58
44
|
def separators_class
|
@@ -14,7 +14,7 @@
|
|
14
14
|
padding_y:"xs",
|
15
15
|
html_options: {tabindex:"0"}
|
16
16
|
}) do %>
|
17
|
-
<%= pb_rails("flex/flex_item"
|
17
|
+
<%= pb_rails("flex/flex_item") do %>
|
18
18
|
<%= pb_rails("flex", props: {align: "center"}) do %>
|
19
19
|
<% if object.custom_display.present? %>
|
20
20
|
<%= pb_rails("flex", props: {align: "center"}) do %>
|
@@ -24,44 +24,23 @@
|
|
24
24
|
<%= pb_rails("body", props: {text: object.default_display_placeholder, id: "dropdown_trigger_display"}) %>
|
25
25
|
<% end %>
|
26
26
|
<% else %>
|
27
|
-
<% if object.
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
type="text"
|
36
|
-
placeholder="<%= object.placeholder || 'Select…' %>"
|
37
|
-
autocomplete="off"
|
38
|
-
/>
|
39
|
-
<% else %>
|
40
|
-
<%= pb_rails("body", props: {text: object.default_display_placeholder, id: "dropdown_trigger_display_multi_select"}) %>
|
41
|
-
<% end %>
|
42
|
-
<% end %>
|
27
|
+
<% if object.autocomplete %>
|
28
|
+
<input
|
29
|
+
data-dropdown-autocomplete
|
30
|
+
class="dropdown_input"
|
31
|
+
type="text"
|
32
|
+
placeholder="<%= object.placeholder || 'Select…' %>"
|
33
|
+
autocomplete="off"
|
34
|
+
/>
|
43
35
|
<% else %>
|
44
|
-
|
45
|
-
<input
|
46
|
-
data-dropdown-autocomplete
|
47
|
-
class="dropdown_input"
|
48
|
-
type="text"
|
49
|
-
placeholder="<%= object.placeholder || 'Select…' %>"
|
50
|
-
autocomplete="off"
|
51
|
-
/>
|
52
|
-
<% else %>
|
53
|
-
<%= pb_rails("body", props: {text: object.default_display_placeholder, id: "dropdown_trigger_display"}) %>
|
54
|
-
<% end %>
|
36
|
+
<%= pb_rails("body", props: {text: object.default_display_placeholder, id: "dropdown_trigger_display"}) %>
|
55
37
|
<% end %>
|
56
38
|
<% end %>
|
57
39
|
<% end %>
|
58
40
|
<% end %>
|
59
|
-
<%= pb_rails("flex
|
60
|
-
<%= pb_rails("
|
61
|
-
|
62
|
-
<%= pb_rails("icon", props: {icon: "chevron-down", cursor: "pointer", size:"sm", id: "dropdown_open_icon"}) %>
|
63
|
-
<%= pb_rails("icon", props: {icon: "chevron-up", cursor: "pointer", size:"sm", id: "dropdown_close_icon"}) %>
|
64
|
-
<% end %>
|
41
|
+
<%= pb_rails("body", props: {display: "flex"}) do %>
|
42
|
+
<%= pb_rails("icon", props: {icon: "chevron-down", cursor: "pointer", size:"sm", id: "dropdown_open_icon"}) %>
|
43
|
+
<%= pb_rails("icon", props: {icon: "chevron-up", cursor: "pointer", size:"sm", id: "dropdown_close_icon"}) %>
|
65
44
|
<% end %>
|
66
45
|
<% end %>
|
67
46
|
<% end %>
|
@@ -11,8 +11,6 @@ module Playbook
|
|
11
11
|
prop :custom_display
|
12
12
|
prop :autocomplete, type: Playbook::Props::Boolean,
|
13
13
|
default: false
|
14
|
-
prop :multi_select, type: Playbook::Props::Boolean,
|
15
|
-
default: false
|
16
14
|
|
17
15
|
def data
|
18
16
|
Hash(prop(:data)).merge(dropdown_trigger: true, dropdown_placeholder: default_display_placeholder)
|
@@ -27,7 +25,7 @@ module Playbook
|
|
27
25
|
end
|
28
26
|
|
29
27
|
def trigger_wrapper_classes
|
30
|
-
generate_classname("dropdown_trigger_wrapper", ("select_only" unless autocomplete
|
28
|
+
generate_classname("dropdown_trigger_wrapper", ("select_only" unless autocomplete))
|
31
29
|
end
|
32
30
|
end
|
33
31
|
end
|