import Component from './component';
import * as Helpers from './dom-helpers';
/* UniformModal.initialize
Options
content: string|$el|function
klass: string - classes to append to modal container
* use blurrable to keep some elements from being blurred ie.
...
*/
export default class Modal extends Component {
initialize (options) {
this.options = {};
this.options.klass = options.klass || false;
this.content = options.content;
Helpers.addClass(this.el, 'uniformModal');
this.listenTo(document, 'keyup', this.keyup);
this.listenTo(this.el, 'click', this.checkCloseButton);
}
keyup (e) {
if(e.which != 27) return;
this.close();
}
render () {
var that = this;
var content = typeof this.content == 'function' ? this.content() : this.content;
this.highest_z_index = 0;
this.overlay = document.createElement('div');
Helpers.addClass(this.overlay, 'uniformModal-overlay');
this.blur = document.createElement('div');
Helpers.addClass(this.blur, 'uniformModal-blur');
this.original_scroll = window.scrollY;
this.blur.style.top = 0 - this.original_scroll + "px";
if (document.body.querySelectorAll('.uniformModal').length > 0) {
this.highest_z_index = Math.max(Array.prototype.map.call(document.body.querySelectorAll('.uniformModal'), function(el){
return parseInt(Helpers.css(el, 'zIndex'));
}));
this.el.style.zIndex = this.highest_z_index + 2;
}
this.el.appendChild(this.overlay);
let next_element = document.body.children[0]
while(next_element){
const element = next_element;
next_element = element.nextElementSibling;
if(!element.matches('[blurrable="false"]')) {
this.blur.appendChild(element)
}
}
Helpers.addClass(document.body, 'uniformModal-active');
document.body.appendChild(this.blur);
document.body.appendChild(this.el);
var container = document.createElement('div');
Helpers.addClass(container, 'uniformModal-container');
if (content instanceof Node) {
container.appendChild(content);
} else {
container.innerHTML = content;
}
var closeButton = document.createElement('div');
Helpers.addClass(closeButton, 'uniformModal-close');
this.el.appendChild(closeButton);
this.el.style.top = window.scrollY;
this.listenTo(this.overlay, 'click', this.close);
this.el.appendChild(container);
if (this.options.klass) Helpers.addClass(container, this.options.klass);
if (content.innerHTML) Helpers.trigger(content, 'rendered');
this.trigger('rendered');
return this;
}
checkCloseButton (e) {
if(Helpers.hasClass(e.target, 'uniformModal-close'))
this.close();
}
close () {
Helpers.removeClass(document.querySelectorAll('uniformModal-active'), 'uniformModal-active');
var elements = this.blur.children;
var elementCount = elements.length
for(var i=0; i < elementCount; i++){
document.body.appendChild(elements[0]);
}
if(this.blur.parentNode) this.blur.parentNode.removeChild(this.blur);
window.scrollTo(0, this.original_scroll);
this.trigger('closed');
this.remove();
}
remove () {
Component.prototype.remove.apply(this, arguments);
if(this.overlay && this.overlay.parentNode) this.overlay.parentNode.removeChild(this.overlay);
delete this.overlay;
}
}