@randstad-design/orbit-multitheme
Version:
multitheme Front-end code based on Randstad Human Forward components
87 lines (79 loc) • 2.05 kB
JavaScript
/**
* closable.js
* Script closes element incl animation
*/
import ElementHelpers from '../helpers/element-helpers';
/**
* Declare constants
*/
const attributeBase = 'data-rs-closable';
export class Closable {
constructor(element) {
this.element = element;
this.elements = ElementHelpers.getElementsByAttribute(
this.element.getAttribute(attributeBase)
);
this.addEventHandlers();
}
/**
* Declare classes
*/
get classes() {
return {
closableClosed: 'closable--closed'
};
}
/**
* Add event handlers
*/
addEventHandlers() {
this.element.addEventListener('click', (clickEvent) => {
clickEvent.preventDefault();
if (this.elements.length > 0) {
this.elements.forEach((element) => {
if (
element.scrollHeight > 0 &&
!element.classList.contains(this.classes.closableClosed)
) {
element.style.maxHeight = `${element.scrollHeight}px`;
}
element.classList.add(this.classes.closableClosed);
element.style.maxHeight = '0px';
setTimeout(() => {
element.remove();
}, 700);
});
}
});
// set max height on window load, to prevent max height is too low caused by slow loading elements
window.addEventListener('load', () => {
this.setMaxHeightElements();
});
// on window resize, set max height elements
window.addEventListener('resize', () => {
this.setMaxHeightElements();
});
}
/**
* Set max height elements
*/
setMaxHeightElements() {
if (this.elements.length > 0) {
this.elements.forEach((element) => {
if (
element.scrollHeight > 0 &&
!element.classList.contains(this.classes.closableClosed)
) {
element.style.maxHeight = 'none';
element.style.maxHeight = `${element.scrollHeight}px`;
}
});
}
}
/**
* Get selector
*/
static getSelector() {
return '[' + attributeBase + ']';
}
}