Choices/assets/scripts/src/components/container.js

95 lines
2.4 KiB
JavaScript
Raw Normal View History

2017-08-16 17:31:47 +02:00
/**
* Container
*/
export default class Container {
constructor(instance, element) {
2017-08-16 17:31:47 +02:00
this.instance = instance;
this.element = element;
this.config = instance.config;
this.classNames = instance.config.classNames;
this.isOpen = false;
this.isFlipped = false;
this.isFocussed = false;
2017-08-17 14:50:14 +02:00
this.isDisabled = false;
}
shouldFlip(dropdownPos) {
if (!dropdownPos) {
return false;
}
const body = document.body;
const html = document.documentElement;
const winHeight = Math.max(
body.scrollHeight,
body.offsetHeight,
html.clientHeight,
html.scrollHeight,
html.offsetHeight,
);
// If flip is enabled and the dropdown bottom position is
// greater than the window height flip the dropdown.
let shouldFlip = false;
if (this.config.position === 'auto') {
shouldFlip = dropdownPos >= winHeight;
} else if (this.config.position === 'top') {
shouldFlip = true;
}
return shouldFlip;
}
open(dropdownPos) {
this.element.classList.add(this.classNames.openState);
this.element.setAttribute('aria-expanded', 'true');
this.isOpen = true;
if (this.shouldFlip(dropdownPos)) {
this.element.classList.add(this.classNames.flippedState);
this.isFlipped = true;
}
}
close() {
this.element.classList.remove(this.classNames.openState);
this.element.setAttribute('aria-expanded', 'false');
2017-08-17 14:50:14 +02:00
this.element.removeAttribute('aria-activedescendant');
this.isOpen = false;
// A dropdown flips if it does not have space within the page
if (this.isFlipped) {
this.element.classList.remove(this.classNames.flippedState);
this.isFlipped = false;
}
}
focus() {
this.element.classList.add(this.classNames.focusState);
this.isFocussed = true;
}
blur() {
this.element.classList.remove(this.classNames.focusState);
this.isFocussed = false;
2017-08-16 17:31:47 +02:00
}
2017-08-17 14:50:14 +02:00
enable() {
this.element.classList.remove(this.config.classNames.disabledState);
this.element.removeAttribute('aria-disabled');
if (this.instance.isSelectOneElement) {
this.element.setAttribute('tabindex', '0');
}
this.isDisabled = false;
}
disable() {
this.element.classList.add(this.config.classNames.disabledState);
this.element.setAttribute('aria-disabled', 'true');
if (this.instance.isSelectOneElement) {
this.element.setAttribute('tabindex', '-1');
}
this.isDisabled = true;
}
2017-08-16 17:31:47 +02:00
}