import { LitElement, html } from '@lion/core';
import { OverlayMixin } from './OverlayMixin.js';
import { OverlayController } from './OverlayController.js';
export class LionOverlay extends OverlayMixin(LitElement) {
static get properties() {
return {
config: {
type: Object,
},
};
}
constructor() {
super();
this.config = {};
}
get config() {
return this._config;
}
set config(value) {
if (this._overlayCtrl) {
this._overlayCtrl.updateConfig(value);
}
this._config = value;
}
render() {
return html`
`;
}
// FIXME: This should be refactored to Array.from(this.children).find(child => child.slot === 'content')
// When this issue is fixed https://github.com/ing-bank/lion/issues/382
/**
* @override
* Overrides OverlayMixin
* Important to use this override, so that later, contentTemplates can also be accepted
*/
get _overlayContentNode() {
const contentNode = this.querySelector('[slot=content]');
if (contentNode) {
this._cachedOverlayContentNode = contentNode;
}
return contentNode || this._cachedOverlayContentNode;
}
/**
* @override
* Overrides OverlayMixin
*/
get _overlayInvokerNode() {
return Array.from(this.children).find(child => child.slot === 'invoker');
}
// eslint-disable-next-line class-methods-use-this
_defineOverlay({ contentNode, invokerNode }) {
return new OverlayController({
placementMode: 'global', // have to set a default
contentNode,
invokerNode,
...this.config,
});
}
_setupShowHideListeners() {
this.__close = () => {
this.opened = false;
};
this.__toggle = () => {
this.opened = !this.opened;
};
this._overlayCtrl.invokerNode.addEventListener('click', this.__toggle);
this._overlayCtrl.contentNode.addEventListener('close', this.__close);
}
_teardownShowHideListeners() {
this._overlayCtrl.invokerNode.removeEventListener('click', this.__toggle);
this._overlayCtrl.contentNode.removeEventListener('close', this.__close);
}
connectedCallback() {
super.connectedCallback();
this._setupShowHideListeners();
}
disconnectedCallback() {
super.disconnectedCallback();
this._teardownShowHideListeners();
}
}