playbook_ui 14.19.0.pre.alpha.PLAY2171advancedtable7832 → 14.19.0.pre.alpha.PLAY2172homeaddressstreetundefinedstatebug7716
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/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_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 +3 -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 +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-rph2mGIB.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/version.rb +1 -1
- metadata +7 -26
- 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
@@ -13,7 +13,6 @@ const DROPDOWN_PLACEHOLDER = "[data-dropdown-placeholder]";
|
|
13
13
|
const DROPDOWN_INPUT = "#dropdown-selected-option";
|
14
14
|
const SEARCH_INPUT_SELECTOR = "[data-dropdown-autocomplete]";
|
15
15
|
const SEARCH_BAR_SELECTOR = "[data-dropdown-search]";
|
16
|
-
const CLEAR_ICON_SELECTOR = "#dropdown_clear_icon";
|
17
16
|
|
18
17
|
export default class PbDropdown extends PbEnhancedElement {
|
19
18
|
static get selector() {
|
@@ -21,18 +20,11 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
21
20
|
}
|
22
21
|
|
23
22
|
get target() {
|
24
|
-
return this.element.querySelector(CONTAINER_SELECTOR);
|
23
|
+
return this.element.parentNode.querySelector(CONTAINER_SELECTOR);
|
25
24
|
}
|
26
25
|
|
27
|
-
selectedOptions = new Set();
|
28
|
-
clearBtn = null;
|
29
|
-
|
30
26
|
connect() {
|
31
27
|
this.keyboardHandler = new PbDropdownKeyboard(this);
|
32
|
-
this.isMultiSelect = this.element.dataset.pbDropdownMultiSelect === "true";
|
33
|
-
this.formPillProps = this.element.dataset.formPillProps
|
34
|
-
? JSON.parse(this.element.dataset.formPillProps)
|
35
|
-
: {};
|
36
28
|
this.setDefaultValue();
|
37
29
|
this.bindEventListeners();
|
38
30
|
this.bindSearchInput();
|
@@ -40,26 +32,6 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
40
32
|
this.handleFormValidation();
|
41
33
|
this.handleFormReset();
|
42
34
|
this.bindSearchBar();
|
43
|
-
this.updatePills();
|
44
|
-
|
45
|
-
this.clearBtn = this.element.querySelector(CLEAR_ICON_SELECTOR);
|
46
|
-
if (this.clearBtn) {
|
47
|
-
this.clearBtn.style.display = "none";
|
48
|
-
this.clearBtn.addEventListener("click", (e) => {
|
49
|
-
e.stopPropagation();
|
50
|
-
this.clearSelection();
|
51
|
-
});
|
52
|
-
}
|
53
|
-
this.updateClearButton();
|
54
|
-
}
|
55
|
-
|
56
|
-
updateClearButton() {
|
57
|
-
if (!this.clearBtn) return;
|
58
|
-
const hasSelection = this.isMultiSelect
|
59
|
-
? this.selectedOptions.size > 0
|
60
|
-
: Boolean(this.element.querySelector(DROPDOWN_INPUT).value);
|
61
|
-
|
62
|
-
this.clearBtn.style.display = hasSelection ? "" : "none";
|
63
35
|
}
|
64
36
|
|
65
37
|
bindEventListeners() {
|
@@ -80,7 +52,7 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
80
52
|
bindSearchBar() {
|
81
53
|
this.searchBar = this.element.querySelector(SEARCH_BAR_SELECTOR);
|
82
54
|
if (!this.searchBar) return;
|
83
|
-
|
55
|
+
|
84
56
|
this.searchBar.addEventListener("input", (e) =>
|
85
57
|
this.handleSearch(e.target.value)
|
86
58
|
);
|
@@ -101,28 +73,11 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
101
73
|
);
|
102
74
|
}
|
103
75
|
|
104
|
-
adjustDropdownHeight() {
|
105
|
-
if (this.target.classList.contains("open")) {
|
106
|
-
const el = this.target;
|
107
|
-
el.style.height = "auto";
|
108
|
-
requestAnimationFrame(() => {
|
109
|
-
const newHeight = el.scrollHeight + "px";
|
110
|
-
el.offsetHeight; // force reflow
|
111
|
-
el.style.height = newHeight;
|
112
|
-
});
|
113
|
-
}
|
114
|
-
}
|
115
|
-
|
116
76
|
handleSearch(term = "") {
|
117
77
|
const lcTerm = term.toLowerCase();
|
118
78
|
this.element.querySelectorAll(OPTION_SELECTOR).forEach((opt) => {
|
119
|
-
|
120
|
-
|
121
|
-
opt.style.display = "none";
|
122
|
-
return;
|
123
|
-
}
|
124
|
-
const label = JSON.parse(opt.dataset.dropdownOptionLabel)
|
125
|
-
.label.toString()
|
79
|
+
const label = JSON.parse(opt.dataset.dropdownOptionLabel).label
|
80
|
+
.toString()
|
126
81
|
.toLowerCase();
|
127
82
|
|
128
83
|
// hide or show option
|
@@ -130,7 +85,15 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
130
85
|
opt.style.display = match ? "" : "none";
|
131
86
|
});
|
132
87
|
|
133
|
-
this.
|
88
|
+
if (this.target.classList.contains("open")) {
|
89
|
+
const el = this.target;
|
90
|
+
el.style.height = "auto";
|
91
|
+
requestAnimationFrame(() => {
|
92
|
+
const newHeight = el.scrollHeight + "px";
|
93
|
+
el.offsetHeight; // force reflow
|
94
|
+
el.style.height = newHeight;
|
95
|
+
});
|
96
|
+
}
|
134
97
|
}
|
135
98
|
|
136
99
|
handleOptionClick(event) {
|
@@ -139,26 +102,10 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
139
102
|
|
140
103
|
if (option) {
|
141
104
|
const value = option.dataset.dropdownOptionLabel;
|
142
|
-
|
143
|
-
const alreadySelected = this.selectedOptions.has(value);
|
144
|
-
if (alreadySelected) {
|
145
|
-
this.selectedOptions.delete(value);
|
146
|
-
} else {
|
147
|
-
this.selectedOptions.add(value);
|
148
|
-
}
|
149
|
-
this.updatePills();
|
150
|
-
this.syncHiddenInputs();
|
151
|
-
if (this.searchInput && this.isMultiSelect) {
|
152
|
-
this.searchInput.value = "";
|
153
|
-
this.handleBackspaceClear();
|
154
|
-
}
|
155
|
-
} else {
|
156
|
-
hiddenInput.value = JSON.parse(value).id;
|
157
|
-
}
|
158
|
-
|
105
|
+
hiddenInput.value = JSON.parse(value).id;
|
159
106
|
this.clearFormValidation(hiddenInput);
|
107
|
+
|
160
108
|
this.onOptionSelected(value, option);
|
161
|
-
this.updateClearButton();
|
162
109
|
}
|
163
110
|
}
|
164
111
|
|
@@ -190,54 +137,23 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
190
137
|
}
|
191
138
|
}
|
192
139
|
|
193
|
-
emitSelectionChange() {
|
194
|
-
let detail;
|
195
|
-
|
196
|
-
if (this.isMultiSelect) {
|
197
|
-
detail = Array.from(this.selectedOptions).map(JSON.parse);
|
198
|
-
} else {
|
199
|
-
const hiddenInput = this.element.querySelector(DROPDOWN_INPUT);
|
200
|
-
detail = hiddenInput.value
|
201
|
-
? JSON.parse(
|
202
|
-
this.element.querySelector(
|
203
|
-
OPTION_SELECTOR +
|
204
|
-
`[data-dropdown-option-label*='"id":"${hiddenInput.value}"']`
|
205
|
-
).dataset.dropdownOptionLabel
|
206
|
-
)
|
207
|
-
: null;
|
208
|
-
}
|
209
|
-
this.element.setAttribute("data-option-selected", JSON.stringify(detail));
|
210
|
-
this.element.dispatchEvent(
|
211
|
-
new CustomEvent("pb:dropdown:selected", {
|
212
|
-
detail,
|
213
|
-
bubbles: true,
|
214
|
-
})
|
215
|
-
);
|
216
|
-
}
|
217
|
-
|
218
140
|
onOptionSelected(value, selectedOption) {
|
219
141
|
const triggerElement = this.element.querySelector(DROPDOWN_TRIGGER_DISPLAY);
|
220
142
|
const customDisplayElement = this.element.querySelector(
|
221
143
|
"#dropdown_trigger_custom_display"
|
222
144
|
);
|
223
|
-
|
224
145
|
if (triggerElement) {
|
225
|
-
|
226
|
-
|
227
|
-
triggerElement.textContent = selectedLabel;
|
228
|
-
this.emitSelectionChange();
|
229
|
-
}
|
146
|
+
const selectedLabel = JSON.parse(value).label;
|
147
|
+
triggerElement.textContent = selectedLabel;
|
230
148
|
if (customDisplayElement) {
|
231
|
-
triggerElement.textContent = "";
|
232
149
|
customDisplayElement.style.display = "block";
|
233
150
|
customDisplayElement.style.paddingRight = "8px";
|
234
151
|
}
|
235
152
|
}
|
236
153
|
|
237
154
|
const autocompleteInput = this.element.querySelector(SEARCH_INPUT_SELECTOR);
|
238
|
-
if (autocompleteInput
|
155
|
+
if (autocompleteInput){
|
239
156
|
autocompleteInput.value = JSON.parse(value).label;
|
240
|
-
this.emitSelectionChange();
|
241
157
|
}
|
242
158
|
|
243
159
|
const customTrigger = this.element.querySelector(CUSTOM_DISPLAY_SELECTOR);
|
@@ -249,24 +165,10 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
249
165
|
}
|
250
166
|
|
251
167
|
const options = this.element.querySelectorAll(OPTION_SELECTOR);
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
JSON.parse(option).id ===
|
257
|
-
JSON.parse(selectedOption.dataset.dropdownOptionLabel).id
|
258
|
-
) {
|
259
|
-
selectedOption.style.display = "none";
|
260
|
-
this.adjustDropdownHeight();
|
261
|
-
}
|
262
|
-
});
|
263
|
-
} else {
|
264
|
-
options.forEach((option) => {
|
265
|
-
option.classList.remove("pb_dropdown_option_selected");
|
266
|
-
});
|
267
|
-
selectedOption.classList.add("pb_dropdown_option_selected");
|
268
|
-
}
|
269
|
-
this.updateClearButton();
|
168
|
+
options.forEach((option) => {
|
169
|
+
option.classList.remove("pb_dropdown_option_selected");
|
170
|
+
});
|
171
|
+
selectedOption.classList.add("pb_dropdown_option_selected");
|
270
172
|
}
|
271
173
|
|
272
174
|
showElement(elem) {
|
@@ -340,66 +242,21 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
340
242
|
errorLabelElement.remove();
|
341
243
|
}
|
342
244
|
}
|
343
|
-
if (this.isMultiSelect) {
|
344
|
-
if (this.selectedOptions.size > 0) {
|
345
|
-
const dropdownWrapperElement = input.closest(".dropdown_wrapper");
|
346
|
-
dropdownWrapperElement.classList.remove("error");
|
347
|
-
const errorLabelElement = dropdownWrapperElement.querySelector(
|
348
|
-
".pb_body_kit_negative"
|
349
|
-
);
|
350
|
-
if (errorLabelElement) {
|
351
|
-
errorLabelElement.remove();
|
352
|
-
}
|
353
|
-
}
|
354
|
-
}
|
355
245
|
}
|
356
246
|
|
357
247
|
setDefaultValue() {
|
358
248
|
const hiddenInput = this.element.querySelector(DROPDOWN_INPUT);
|
359
|
-
const
|
360
|
-
this.element.querySelectorAll(OPTION_SELECTOR)
|
361
|
-
);
|
362
|
-
const defaultValue = hiddenInput.dataset.defaultValue || "";
|
363
|
-
if (!defaultValue) return;
|
364
|
-
|
365
|
-
if (this.isMultiSelect) {
|
366
|
-
const ids = defaultValue.split(",");
|
367
|
-
ids.forEach((id) => {
|
368
|
-
const selectedOption = optionEls.find((opt) => {
|
369
|
-
try {
|
370
|
-
return JSON.parse(opt.dataset.dropdownOptionLabel).id === id;
|
371
|
-
} catch {
|
372
|
-
return false;
|
373
|
-
}
|
374
|
-
});
|
375
|
-
if (!selectedOption) {
|
376
|
-
console.warn(`Dropdown default ID ${id} not found`);
|
377
|
-
return;
|
378
|
-
}
|
379
|
-
|
380
|
-
const raw = selectedOption.dataset.dropdownOptionLabel;
|
381
|
-
this.selectedOptions.add(raw);
|
249
|
+
const options = this.element.querySelectorAll(OPTION_SELECTOR);
|
382
250
|
|
383
|
-
|
384
|
-
|
251
|
+
const defaultValue = hiddenInput.dataset.defaultValue || "";
|
252
|
+
hiddenInput.value = defaultValue;
|
385
253
|
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
hiddenInput.value = defaultValue;
|
392
|
-
const selectedOption = optionEls.find((opt) => {
|
393
|
-
try {
|
394
|
-
return (
|
395
|
-
JSON.parse(opt.dataset.dropdownOptionLabel).id === defaultValue
|
396
|
-
);
|
397
|
-
} catch {
|
398
|
-
return false;
|
399
|
-
}
|
254
|
+
if (defaultValue) {
|
255
|
+
const selectedOption = Array.from(options).find((option) => {
|
256
|
+
return (
|
257
|
+
JSON.parse(option.dataset.dropdownOptionLabel).id === defaultValue
|
258
|
+
);
|
400
259
|
});
|
401
|
-
if (!selectedOption) return;
|
402
|
-
|
403
260
|
selectedOption.classList.add("pb_dropdown_option_selected");
|
404
261
|
this.setTriggerElementText(
|
405
262
|
JSON.parse(selectedOption.dataset.dropdownOptionLabel).label
|
@@ -422,32 +279,12 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
422
279
|
const options = this.element.querySelectorAll(OPTION_SELECTOR);
|
423
280
|
options.forEach((option) => {
|
424
281
|
option.classList.remove("pb_dropdown_option_selected");
|
425
|
-
option.style.display = "";
|
426
282
|
});
|
427
283
|
|
428
284
|
hiddenInput.value = "";
|
429
285
|
|
430
286
|
const defaultPlaceholder = this.element.querySelector(DROPDOWN_PLACEHOLDER);
|
431
287
|
this.setTriggerElementText(defaultPlaceholder.dataset.dropdownPlaceholder);
|
432
|
-
|
433
|
-
if (this.searchInput) {
|
434
|
-
this.searchInput.value = "";
|
435
|
-
if (this.target.classList.contains("open")) {
|
436
|
-
const el = this.target;
|
437
|
-
el.style.height = "auto";
|
438
|
-
requestAnimationFrame(() => {
|
439
|
-
const newHeight = el.scrollHeight + "px";
|
440
|
-
el.offsetHeight; // force reflow
|
441
|
-
el.style.height = newHeight;
|
442
|
-
});
|
443
|
-
}
|
444
|
-
}
|
445
|
-
if (this.isMultiSelect) {
|
446
|
-
this.selectedOptions.clear();
|
447
|
-
this.updatePills();
|
448
|
-
this.updateClearButton();
|
449
|
-
this.syncHiddenInputs();
|
450
|
-
}
|
451
288
|
}
|
452
289
|
|
453
290
|
setTriggerElementText(text) {
|
@@ -456,147 +293,4 @@ export default class PbDropdown extends PbEnhancedElement {
|
|
456
293
|
triggerElement.textContent = text;
|
457
294
|
}
|
458
295
|
}
|
459
|
-
|
460
|
-
updatePills() {
|
461
|
-
if (!this.isMultiSelect) return;
|
462
|
-
|
463
|
-
const wrapper = this.element.querySelector("#dropdown_pills_wrapper");
|
464
|
-
const placeholder = this.element.querySelector(
|
465
|
-
"#dropdown_trigger_display_multi_select"
|
466
|
-
);
|
467
|
-
if (!wrapper) return;
|
468
|
-
|
469
|
-
wrapper.innerHTML = "";
|
470
|
-
// Show or hide the placeholder based on selected options
|
471
|
-
if (placeholder) {
|
472
|
-
if (this.selectedOptions.size > 0) {
|
473
|
-
placeholder.style.display = "none";
|
474
|
-
} else {
|
475
|
-
placeholder.style.display = "";
|
476
|
-
}
|
477
|
-
}
|
478
|
-
|
479
|
-
Array.from(this.selectedOptions).map((option) => {
|
480
|
-
// Create a form pill for each selected option
|
481
|
-
const pill = document.createElement("div");
|
482
|
-
const color = this.formPillProps.color || "primary";
|
483
|
-
pill.classList.add(`pb_form_pill_kit_${color}`, "mr_xs");
|
484
|
-
if (this.formPillProps.size === "small") {
|
485
|
-
pill.classList.add("small");
|
486
|
-
}
|
487
|
-
pill.tabIndex = 0;
|
488
|
-
pill.dataset.pillId = JSON.parse(option).id;
|
489
|
-
const innerDiv = document.createElement("h3");
|
490
|
-
innerDiv.className = "pb_title_kit_size_4 pb_form_pill_text";
|
491
|
-
innerDiv.textContent = JSON.parse(option).label;
|
492
|
-
pill.appendChild(innerDiv);
|
493
|
-
|
494
|
-
const closeIcon = document.createElement("div");
|
495
|
-
closeIcon.className = "pb_form_pill_close";
|
496
|
-
closeIcon.innerHTML = `<svg class="pb_custom_icon svg-inline--fa svg_${
|
497
|
-
this.formPillProps.size === "small" ? "xs" : "sm"
|
498
|
-
} svg_fw" xmlns="http://www.w3.org/2000/svg" width="auto" height="auto" viewBox="0 0 31 25"><path fill="currentColor" d="M23.0762 6.77734L17.4512 12.4023L23.0293 17.9805C23.498 18.4023 23.498 19.1055 23.0293 19.5273C22.6074 19.9961 21.9043 19.9961 21.4824 19.5273L15.8574 13.9492L10.2793 19.5273C9.85742 19.9961 9.1543 19.9961 8.73242 19.5273C8.26367 19.1055 8.26367 18.4023 8.73242 17.9336L14.3105 12.3555L8.73242 6.77734C8.26367 6.35547 8.26367 5.65234 8.73242 5.18359C9.1543 4.76172 9.85742 4.76172 10.3262 5.18359L15.9043 10.8086L21.4824 5.23047C21.9043 4.76172 22.6074 4.76172 23.0762 5.23047C23.498 5.65234 23.498 6.35547 23.0762 6.77734Z"/></svg>`;
|
499
|
-
pill.appendChild(closeIcon);
|
500
|
-
|
501
|
-
closeIcon.addEventListener("click", (e) => {
|
502
|
-
e.stopPropagation();
|
503
|
-
const id = pill.dataset.pillId;
|
504
|
-
this.selectedOptions.delete(option);
|
505
|
-
|
506
|
-
const optEl = this.element.querySelector(
|
507
|
-
`${OPTION_SELECTOR}[data-dropdown-option-label*='"id":${JSON.stringify(
|
508
|
-
id
|
509
|
-
)}']`
|
510
|
-
);
|
511
|
-
if (optEl) {
|
512
|
-
optEl.style.display = "";
|
513
|
-
if (this.target.classList.contains("open")) {
|
514
|
-
this.showElement(this.target);
|
515
|
-
}
|
516
|
-
}
|
517
|
-
|
518
|
-
this.updatePills();
|
519
|
-
this.updateClearButton();
|
520
|
-
this.emitSelectionChange();
|
521
|
-
this.syncHiddenInputs();
|
522
|
-
});
|
523
|
-
wrapper.appendChild(pill);
|
524
|
-
});
|
525
|
-
}
|
526
|
-
|
527
|
-
clearSelection() {
|
528
|
-
if (this.isMultiSelect) {
|
529
|
-
this.selectedOptions.clear();
|
530
|
-
this.element.querySelectorAll(OPTION_SELECTOR).forEach((opt) => {
|
531
|
-
opt.style.display = "";
|
532
|
-
});
|
533
|
-
if (this.target.classList.contains("open")) {
|
534
|
-
this.showElement(this.target);
|
535
|
-
}
|
536
|
-
}
|
537
|
-
const customDisplay = this.element.querySelector(
|
538
|
-
"#dropdown_trigger_custom_display"
|
539
|
-
);
|
540
|
-
if (customDisplay) {
|
541
|
-
customDisplay.style.display = "none";
|
542
|
-
}
|
543
|
-
this.resetDropdownValue();
|
544
|
-
this.updatePills();
|
545
|
-
this.updateClearButton();
|
546
|
-
this.syncHiddenInputs();
|
547
|
-
this.emitSelectionChange();
|
548
|
-
}
|
549
|
-
|
550
|
-
syncHiddenInputs() {
|
551
|
-
if (!this.isMultiSelect) return;
|
552
|
-
this.element
|
553
|
-
.querySelectorAll('input[data-generated="true"]')
|
554
|
-
.forEach((n) => n.remove());
|
555
|
-
|
556
|
-
const baseInput = this.element.querySelector(DROPDOWN_INPUT);
|
557
|
-
if (!baseInput) return;
|
558
|
-
// for multi_select, for each selectedOption, create a hidden input
|
559
|
-
const name = baseInput.getAttribute("name");
|
560
|
-
this.selectedOptions.forEach((raw) => {
|
561
|
-
const id = JSON.parse(raw).id;
|
562
|
-
const inp = document.createElement("input");
|
563
|
-
inp.type = "hidden";
|
564
|
-
inp.name = name;
|
565
|
-
inp.value = id;
|
566
|
-
inp.dataset.generated = "true";
|
567
|
-
baseInput.insertAdjacentElement("afterend", inp);
|
568
|
-
});
|
569
|
-
baseInput.value = "";
|
570
|
-
}
|
571
|
-
|
572
|
-
handleBackspaceClear() {
|
573
|
-
if (!this.isMultiSelect) {
|
574
|
-
this.element.querySelectorAll(OPTION_SELECTOR).forEach((opt) => {
|
575
|
-
opt.classList.remove("pb_dropdown_option_selected");
|
576
|
-
opt.style.display = "";
|
577
|
-
this.adjustDropdownHeight();
|
578
|
-
});
|
579
|
-
|
580
|
-
const hiddenInput = this.element.querySelector(DROPDOWN_INPUT);
|
581
|
-
if (hiddenInput) hiddenInput.value = "";
|
582
|
-
|
583
|
-
const placeholder = this.element.querySelector(DROPDOWN_PLACEHOLDER);
|
584
|
-
if (placeholder)
|
585
|
-
this.setTriggerElementText(placeholder.dataset.dropdownPlaceholder);
|
586
|
-
}
|
587
|
-
if (this.isMultiSelect) {
|
588
|
-
this.element.querySelectorAll(OPTION_SELECTOR).forEach((opt) => {
|
589
|
-
const optValue = opt.dataset.dropdownOptionLabel;
|
590
|
-
if (
|
591
|
-
this.selectedOptions.size > 0 &&
|
592
|
-
this.selectedOptions.has(optValue)
|
593
|
-
) {
|
594
|
-
opt.style.display = "none";
|
595
|
-
} else {
|
596
|
-
opt.style.display = "";
|
597
|
-
}
|
598
|
-
this.adjustDropdownHeight();
|
599
|
-
});
|
600
|
-
}
|
601
|
-
}
|
602
296
|
}
|
@@ -27,13 +27,6 @@ export class PbDropdownKeyboard {
|
|
27
27
|
}
|
28
28
|
}
|
29
29
|
|
30
|
-
getVisibleOptions() {
|
31
|
-
// We only want to return the options that are visible
|
32
|
-
return Array.from(
|
33
|
-
this.dropdownElement.querySelectorAll(OPTION_SELECTOR)
|
34
|
-
).filter((opt) => opt.style.display !== "none");
|
35
|
-
}
|
36
|
-
|
37
30
|
openDropdownIfClosed() {
|
38
31
|
if (!this.dropdown.target.classList.contains("open")) {
|
39
32
|
this.dropdown.showElement(this.dropdown.target);
|
@@ -78,7 +71,7 @@ export class PbDropdownKeyboard {
|
|
78
71
|
if (this.searchInput) {
|
79
72
|
setTimeout(() => {
|
80
73
|
if (this.searchInput.value.trim() === "") {
|
81
|
-
this.dropdown.
|
74
|
+
this.dropdown.resetDropdownValue();
|
82
75
|
}
|
83
76
|
}, 0);
|
84
77
|
}
|
@@ -88,43 +81,23 @@ export class PbDropdownKeyboard {
|
|
88
81
|
}
|
89
82
|
}
|
90
83
|
|
91
|
-
moveFocus(direction) {
|
92
|
-
const allOptions = Array.from(
|
93
|
-
this.dropdownElement.querySelectorAll(OPTION_SELECTOR)
|
94
|
-
);
|
95
|
-
const visible = this.getVisibleOptions();
|
96
|
-
if (!visible.length) return;
|
97
|
-
|
84
|
+
moveFocus(direction) {
|
98
85
|
if (this.focusedOptionIndex !== -1) {
|
99
|
-
|
86
|
+
this.options[this.focusedOptionIndex].classList.remove(
|
100
87
|
"pb_dropdown_option_focused"
|
101
88
|
);
|
102
89
|
}
|
103
|
-
|
104
|
-
|
105
|
-
this.
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
const nextVisibleIndex =
|
110
|
-
(prevVisibleIndex + direction + visible.length) % visible.length;
|
111
|
-
|
112
|
-
const nextEl = visible[nextVisibleIndex];
|
113
|
-
nextEl.classList.add("pb_dropdown_option_focused");
|
114
|
-
|
115
|
-
this.focusedOptionIndex = allOptions.indexOf(nextEl);
|
90
|
+
this.focusedOptionIndex =
|
91
|
+
(this.focusedOptionIndex + direction + this.options.length) %
|
92
|
+
this.options.length;
|
93
|
+
this.options[this.focusedOptionIndex].classList.add(
|
94
|
+
"pb_dropdown_option_focused"
|
95
|
+
);
|
116
96
|
}
|
117
97
|
|
118
|
-
|
119
98
|
selectOption() {
|
120
|
-
const
|
121
|
-
|
122
|
-
);
|
123
|
-
if (this.focusedOptionIndex < 0) return;
|
124
|
-
|
125
|
-
const optionEl = allOptions[this.focusedOptionIndex];
|
126
|
-
this.dropdown.handleOptionClick({ target: optionEl });
|
127
|
-
this.dropdown.toggleElement(this.dropdown.target);
|
128
|
-
this.dropdown.updateClearButton();
|
99
|
+
const option = this.options[this.focusedOptionIndex];
|
100
|
+
this.dropdown.onOptionSelected(option.dataset.dropdownOptionLabel, option);
|
101
|
+
this.dropdown.hideElement(this.dropdown.target);
|
129
102
|
}
|
130
103
|
}
|
@@ -45,31 +45,27 @@ const DropdownOption = (props: DropdownOptionProps) => {
|
|
45
45
|
filterItem,
|
46
46
|
focusedOptionIndex,
|
47
47
|
handleOptionClick,
|
48
|
-
multiSelect,
|
49
48
|
selected,
|
50
49
|
} = useContext(DropdownContext);
|
51
50
|
|
52
|
-
const isItemMatchingFilter = (option: GenericObject
|
53
|
-
const label = typeof option
|
51
|
+
const isItemMatchingFilter = (option: GenericObject) => {
|
52
|
+
const label = typeof option.label === 'string' ? option.label.toLowerCase() : option.label;
|
54
53
|
return String(label).toLowerCase().includes(filterItem.toLowerCase());
|
55
54
|
}
|
56
55
|
|
57
|
-
|
58
|
-
const isSelected = Array.isArray(selected)
|
59
|
-
? selected.some((item) => item.label === option?.label)
|
60
|
-
: (selected as GenericObject)?.label === option?.label;
|
61
|
-
|
62
|
-
|
63
|
-
if (!isItemMatchingFilter(option) || (multiSelect && isSelected)) {
|
56
|
+
if (!isItemMatchingFilter(option)) {
|
64
57
|
return null;
|
65
58
|
}
|
66
59
|
const isFocused =
|
67
60
|
focusedOptionIndex >= 0 &&
|
68
|
-
filteredOptions[focusedOptionIndex].label === option
|
61
|
+
filteredOptions[focusedOptionIndex].label === option.label;
|
69
62
|
const focusedClass = isFocused && "focused";
|
70
63
|
|
71
|
-
const selectedClass =
|
72
|
-
|
64
|
+
const selectedClass = `${
|
65
|
+
selected?.label === option.label
|
66
|
+
? "selected"
|
67
|
+
: "list"
|
68
|
+
}`;
|
73
69
|
const ariaProps = buildAriaProps(aria);
|
74
70
|
const dataProps = buildDataProps(data);
|
75
71
|
const htmlProps = buildHtmlProps(htmlOptions);
|
@@ -96,14 +92,14 @@ const DropdownOption = (props: DropdownOptionProps) => {
|
|
96
92
|
<ListItem
|
97
93
|
cursor="pointer"
|
98
94
|
dark={dark}
|
99
|
-
data-name={option
|
100
|
-
key={option
|
95
|
+
data-name={option.value}
|
96
|
+
key={option.label}
|
101
97
|
padding="none"
|
102
98
|
>
|
103
99
|
{children ?
|
104
100
|
<div className="dropdown_option_wrapper">{children}</div> :
|
105
101
|
<Body dark={dark}
|
106
|
-
text={option
|
102
|
+
text={option.label}
|
107
103
|
/>
|
108
104
|
}
|
109
105
|
</ListItem>
|