Skip to content

Commit f2260fb

Browse files
committed
refactor!: update multi-select-combo-box to use native popover
1 parent fabaed5 commit f2260fb

File tree

7 files changed

+155
-38
lines changed

7 files changed

+155
-38
lines changed

packages/multi-select-combo-box/src/vaadin-multi-select-combo-box-mixin.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,18 @@ export const MultiSelectComboBoxMixin = (superClass) =>
418418
});
419419
}
420420

421+
/**
422+
* Override method from `ComboBoxBaseMixin` to render scroller in the slot.
423+
* @protected
424+
* @override
425+
*/
426+
_renderScroller(scroller) {
427+
scroller.setAttribute('slot', 'overlay');
428+
// Prevent focusing scroller on input Tab
429+
scroller.setAttribute('tabindex', '-1');
430+
this.appendChild(scroller);
431+
}
432+
421433
/**
422434
* Override method from `ComboBoxBaseMixin` to implement clearing logic.
423435
* @protected

packages/multi-select-combo-box/src/vaadin-multi-select-combo-box-overlay.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,22 @@ class MultiSelectComboBoxOverlay extends ComboBoxOverlayMixin(
4545
</div>
4646
`;
4747
}
48+
49+
/**
50+
* @protected
51+
* @override
52+
*/
53+
_attachOverlay() {
54+
this.showPopover();
55+
}
56+
57+
/**
58+
* @protected
59+
* @override
60+
*/
61+
_detachOverlay() {
62+
this.hidePopover();
63+
}
4864
}
4965

5066
defineCustomElement(MultiSelectComboBoxOverlay);

packages/multi-select-combo-box/src/vaadin-multi-select-combo-box.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ export interface MultiSelectComboBoxEventMap<TItem> extends HTMLElementEventMap
110110
* `helper-text` | The helper text element wrapper
111111
* `required-indicator` | The `required` state indicator element
112112
* `toggle-button` | The toggle button
113+
* `overlay` | The overlay container
114+
* `content` | The overlay content
115+
* `loader` | The loading indicator shown while loading items
113116
*
114117
* The following state attributes are available for styling:
115118
*

packages/multi-select-combo-box/src/vaadin-multi-select-combo-box.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ import { MultiSelectComboBoxMixin } from './vaadin-multi-select-combo-box-mixin.
4747
* `helper-text` | The helper text element wrapper
4848
* `required-indicator` | The `required` state indicator element
4949
* `toggle-button` | The toggle button
50+
* `overlay` | The overlay container
51+
* `content` | The overlay content
52+
* `loader` | The loading indicator shown while loading items
5053
*
5154
* The following state attributes are available for styling:
5255
*
@@ -149,13 +152,17 @@ class MultiSelectComboBox extends MultiSelectComboBoxMixin(
149152
150153
<vaadin-multi-select-combo-box-overlay
151154
id="overlay"
155+
popover="manual"
156+
exportparts="overlay, content, loader"
152157
.owner="${this}"
153158
.opened="${this._overlayOpened}"
154159
?loading="${this.loading}"
155160
theme="${ifDefined(this._theme)}"
156161
.positionTarget="${this._inputField}"
157162
no-vertical-overlap
158-
></vaadin-multi-select-combo-box-overlay>
163+
>
164+
<slot name="overlay"></slot>
165+
</vaadin-multi-select-combo-box-overlay>
159166
160167
<slot name="tooltip"></slot>
161168
`;

packages/multi-select-combo-box/test/basic.test.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,4 +407,23 @@ describe('basic', () => {
407407
expect(item.textContent).to.equal('');
408408
});
409409
});
410+
411+
describe('exportparts', () => {
412+
let overlay;
413+
414+
beforeEach(() => {
415+
overlay = comboBox.$.overlay;
416+
});
417+
418+
it('should export overlay parts for styling', () => {
419+
const parts = [...overlay.shadowRoot.querySelectorAll('[part]')]
420+
.map((el) => el.getAttribute('part'))
421+
.filter((part) => part !== 'backdrop');
422+
const exportParts = overlay.getAttribute('exportparts').split(', ');
423+
424+
parts.forEach((part) => {
425+
expect(exportParts).to.include(part);
426+
});
427+
});
428+
});
410429
});

packages/multi-select-combo-box/test/chips.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,7 @@ describe('chips', () => {
556556
it('should adapt overlay width to the input field width while opened', async () => {
557557
comboBox.opened = true;
558558

559-
const overlay = document.querySelector('vaadin-multi-select-combo-box-overlay');
559+
const overlay = comboBox.$.overlay;
560560
const overlayPart = overlay.$.overlay;
561561
const width = overlayPart.offsetWidth;
562562
expect(width).to.equal(comboBox.clientWidth);

packages/multi-select-combo-box/test/dom/__snapshots__/multi-select-combo-box.test.snap.js

Lines changed: 96 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@ export const snapshots = {};
33

44
snapshots["vaadin-multi-select-combo-box host default"] =
55
`<vaadin-multi-select-combo-box>
6+
<vaadin-multi-select-combo-box-scroller
7+
aria-multiselectable="true"
8+
id="vaadin-multi-select-combo-box-scroller-3"
9+
role="listbox"
10+
slot="overlay"
11+
tabindex="-1"
12+
>
13+
</vaadin-multi-select-combo-box-scroller>
614
<label
715
for="input-vaadin-multi-select-combo-box-4"
816
id="label-vaadin-multi-select-combo-box-0"
@@ -39,6 +47,14 @@ snapshots["vaadin-multi-select-combo-box host default"] =
3947

4048
snapshots["vaadin-multi-select-combo-box host label"] =
4149
`<vaadin-multi-select-combo-box has-label="">
50+
<vaadin-multi-select-combo-box-scroller
51+
aria-multiselectable="true"
52+
id="vaadin-multi-select-combo-box-scroller-3"
53+
role="listbox"
54+
slot="overlay"
55+
tabindex="-1"
56+
>
57+
</vaadin-multi-select-combo-box-scroller>
4258
<label
4359
for="input-vaadin-multi-select-combo-box-4"
4460
id="label-vaadin-multi-select-combo-box-0"
@@ -77,6 +93,14 @@ snapshots["vaadin-multi-select-combo-box host label"] =
7793

7894
snapshots["vaadin-multi-select-combo-box host helper"] =
7995
`<vaadin-multi-select-combo-box has-helper="">
96+
<vaadin-multi-select-combo-box-scroller
97+
aria-multiselectable="true"
98+
id="vaadin-multi-select-combo-box-scroller-3"
99+
role="listbox"
100+
slot="overlay"
101+
tabindex="-1"
102+
>
103+
</vaadin-multi-select-combo-box-scroller>
80104
<label
81105
for="input-vaadin-multi-select-combo-box-4"
82106
id="label-vaadin-multi-select-combo-box-0"
@@ -123,6 +147,14 @@ snapshots["vaadin-multi-select-combo-box host error"] =
123147
has-error-message=""
124148
invalid=""
125149
>
150+
<vaadin-multi-select-combo-box-scroller
151+
aria-multiselectable="true"
152+
id="vaadin-multi-select-combo-box-scroller-3"
153+
role="listbox"
154+
slot="overlay"
155+
tabindex="-1"
156+
>
157+
</vaadin-multi-select-combo-box-scroller>
126158
<label
127159
for="input-vaadin-multi-select-combo-box-4"
128160
id="label-vaadin-multi-select-combo-box-0"
@@ -162,6 +194,14 @@ snapshots["vaadin-multi-select-combo-box host error"] =
162194

163195
snapshots["vaadin-multi-select-combo-box host required"] =
164196
`<vaadin-multi-select-combo-box required="">
197+
<vaadin-multi-select-combo-box-scroller
198+
aria-multiselectable="true"
199+
id="vaadin-multi-select-combo-box-scroller-3"
200+
role="listbox"
201+
slot="overlay"
202+
tabindex="-1"
203+
>
204+
</vaadin-multi-select-combo-box-scroller>
165205
<label
166206
for="input-vaadin-multi-select-combo-box-4"
167207
id="label-vaadin-multi-select-combo-box-0"
@@ -202,6 +242,14 @@ snapshots["vaadin-multi-select-combo-box host disabled"] =
202242
aria-disabled="true"
203243
disabled=""
204244
>
245+
<vaadin-multi-select-combo-box-scroller
246+
aria-multiselectable="true"
247+
id="vaadin-multi-select-combo-box-scroller-3"
248+
role="listbox"
249+
slot="overlay"
250+
tabindex="-1"
251+
>
252+
</vaadin-multi-select-combo-box-scroller>
205253
<label
206254
for="input-vaadin-multi-select-combo-box-4"
207255
id="label-vaadin-multi-select-combo-box-0"
@@ -241,6 +289,14 @@ snapshots["vaadin-multi-select-combo-box host disabled"] =
241289

242290
snapshots["vaadin-multi-select-combo-box host readonly"] =
243291
`<vaadin-multi-select-combo-box readonly="">
292+
<vaadin-multi-select-combo-box-scroller
293+
aria-multiselectable="true"
294+
id="vaadin-multi-select-combo-box-scroller-3"
295+
role="listbox"
296+
slot="overlay"
297+
tabindex="-1"
298+
>
299+
</vaadin-multi-select-combo-box-scroller>
244300
<label
245301
for="input-vaadin-multi-select-combo-box-4"
246302
id="label-vaadin-multi-select-combo-box-0"
@@ -279,6 +335,14 @@ snapshots["vaadin-multi-select-combo-box host readonly"] =
279335

280336
snapshots["vaadin-multi-select-combo-box host placeholder"] =
281337
`<vaadin-multi-select-combo-box placeholder="Placeholder">
338+
<vaadin-multi-select-combo-box-scroller
339+
aria-multiselectable="true"
340+
id="vaadin-multi-select-combo-box-scroller-3"
341+
role="listbox"
342+
slot="overlay"
343+
tabindex="-1"
344+
>
345+
</vaadin-multi-select-combo-box-scroller>
282346
<label
283347
for="input-vaadin-multi-select-combo-box-4"
284348
id="label-vaadin-multi-select-combo-box-0"
@@ -319,6 +383,14 @@ snapshots["vaadin-multi-select-combo-box host opened default"] =
319383
focused=""
320384
opened=""
321385
>
386+
<vaadin-multi-select-combo-box-scroller
387+
aria-multiselectable="true"
388+
id="vaadin-multi-select-combo-box-scroller-3"
389+
role="listbox"
390+
slot="overlay"
391+
tabindex="-1"
392+
>
393+
</vaadin-multi-select-combo-box-scroller>
322394
<label
323395
for="input-vaadin-multi-select-combo-box-4"
324396
id="label-vaadin-multi-select-combo-box-0"
@@ -356,31 +428,27 @@ snapshots["vaadin-multi-select-combo-box host opened default"] =
356428

357429
snapshots["vaadin-multi-select-combo-box host opened overlay"] =
358430
`<vaadin-multi-select-combo-box-overlay
431+
exportparts="overlay, content, loader"
359432
id="overlay"
360433
no-vertical-overlap=""
434+
popover="manual"
361435
>
362-
<vaadin-multi-select-combo-box-scroller
363-
aria-multiselectable="true"
364-
id="vaadin-multi-select-combo-box-scroller-3"
365-
role="listbox"
366-
>
367-
</vaadin-multi-select-combo-box-scroller>
436+
<slot name="overlay">
437+
</slot>
368438
</vaadin-multi-select-combo-box-overlay>
369439
`;
370440
/* end snapshot vaadin-multi-select-combo-box host opened overlay */
371441

372442
snapshots["vaadin-multi-select-combo-box host opened overlay class"] =
373443
`<vaadin-multi-select-combo-box-overlay
374444
class="custom multi-select-combo-box-overlay"
445+
exportparts="overlay, content, loader"
375446
id="overlay"
376447
no-vertical-overlap=""
448+
popover="manual"
377449
>
378-
<vaadin-multi-select-combo-box-scroller
379-
aria-multiselectable="true"
380-
id="vaadin-multi-select-combo-box-scroller-3"
381-
role="listbox"
382-
>
383-
</vaadin-multi-select-combo-box-scroller>
450+
<slot name="overlay">
451+
</slot>
384452
</vaadin-multi-select-combo-box-overlay>
385453
`;
386454
/* end snapshot vaadin-multi-select-combo-box host opened overlay class */
@@ -437,15 +505,13 @@ snapshots["vaadin-multi-select-combo-box shadow default"] =
437505
</div>
438506
</div>
439507
<vaadin-multi-select-combo-box-overlay
508+
exportparts="overlay, content, loader"
440509
id="overlay"
441510
no-vertical-overlap=""
511+
popover="manual"
442512
>
443-
<vaadin-multi-select-combo-box-scroller
444-
aria-multiselectable="true"
445-
id="vaadin-multi-select-combo-box-scroller-3"
446-
role="listbox"
447-
>
448-
</vaadin-multi-select-combo-box-scroller>
513+
<slot name="overlay">
514+
</slot>
449515
</vaadin-multi-select-combo-box-overlay>
450516
<slot name="tooltip">
451517
</slot>
@@ -507,15 +573,13 @@ snapshots["vaadin-multi-select-combo-box shadow disabled"] =
507573
</div>
508574
</div>
509575
<vaadin-multi-select-combo-box-overlay
576+
exportparts="overlay, content, loader"
510577
id="overlay"
511578
no-vertical-overlap=""
579+
popover="manual"
512580
>
513-
<vaadin-multi-select-combo-box-scroller
514-
aria-multiselectable="true"
515-
id="vaadin-multi-select-combo-box-scroller-3"
516-
role="listbox"
517-
>
518-
</vaadin-multi-select-combo-box-scroller>
581+
<slot name="overlay">
582+
</slot>
519583
</vaadin-multi-select-combo-box-overlay>
520584
<slot name="tooltip">
521585
</slot>
@@ -577,15 +641,13 @@ snapshots["vaadin-multi-select-combo-box shadow readonly"] =
577641
</div>
578642
</div>
579643
<vaadin-multi-select-combo-box-overlay
644+
exportparts="overlay, content, loader"
580645
id="overlay"
581646
no-vertical-overlap=""
647+
popover="manual"
582648
>
583-
<vaadin-multi-select-combo-box-scroller
584-
aria-multiselectable="true"
585-
id="vaadin-multi-select-combo-box-scroller-3"
586-
role="listbox"
587-
>
588-
</vaadin-multi-select-combo-box-scroller>
649+
<slot name="overlay">
650+
</slot>
589651
</vaadin-multi-select-combo-box-overlay>
590652
<slot name="tooltip">
591653
</slot>
@@ -647,15 +709,13 @@ snapshots["vaadin-multi-select-combo-box shadow invalid"] =
647709
</div>
648710
</div>
649711
<vaadin-multi-select-combo-box-overlay
712+
exportparts="overlay, content, loader"
650713
id="overlay"
651714
no-vertical-overlap=""
715+
popover="manual"
652716
>
653-
<vaadin-multi-select-combo-box-scroller
654-
aria-multiselectable="true"
655-
id="vaadin-multi-select-combo-box-scroller-3"
656-
role="listbox"
657-
>
658-
</vaadin-multi-select-combo-box-scroller>
717+
<slot name="overlay">
718+
</slot>
659719
</vaadin-multi-select-combo-box-overlay>
660720
<slot name="tooltip">
661721
</slot>

0 commit comments

Comments
 (0)