@vaadin/select
Version:
vaadin-select
70 lines (60 loc) • 1.96 kB
JavaScript
/**
* @license
* Copyright (c) 2017 - 2025 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import { DirMixin } from '@vaadin/component-base/src/dir-mixin.js';
import { OverlayMixin } from '@vaadin/overlay/src/vaadin-overlay-mixin.js';
import { PositionMixin } from '@vaadin/overlay/src/vaadin-overlay-position-mixin.js';
/**
* @polymerMixin
* @mixes DirMixin
* @mixes OverlayMixin
* @mixes PositionMixin
*/
export const SelectOverlayMixin = (superClass) =>
class SelectOverlayMixin extends PositionMixin(OverlayMixin(DirMixin(superClass))) {
static get observers() {
return ['_updateOverlayWidth(opened, owner)'];
}
/** @protected */
ready() {
super.ready();
this.restoreFocusOnClose = true;
}
/**
* Override method inherited from `Overlay` to always close on outside click,
* in order to avoid problem when using inside of the modeless dialog.
*
* @param {Event} event
* @return {boolean}
* @protected
*/
_shouldCloseOnOutsideClick(_event) {
return true;
}
/** @protected */
_getMenuElement() {
return Array.from(this.children).find((el) => el.localName !== 'style');
}
/** @private */
_updateOverlayWidth(opened, owner) {
if (opened && owner) {
const widthProperty = '--vaadin-select-overlay-width';
const customWidth = getComputedStyle(owner).getPropertyValue(widthProperty);
if (customWidth === '') {
this.style.removeProperty(widthProperty);
} else {
this.style.setProperty(widthProperty, customWidth);
}
}
}
requestContentUpdate() {
super.requestContentUpdate();
if (this.owner) {
// Ensure menuElement reference is correct.
const menuElement = this._getMenuElement();
this.owner._assignMenuElement(menuElement);
}
}
};