1
0
Fork 0
mirror of synced 2024-07-02 21:20:58 +12:00
appwrite/public/scripts/views/ui/open.js

117 lines
4 KiB
JavaScript
Raw Normal View History

2019-05-09 18:54:39 +12:00
(function (window) {
2019-05-09 20:01:51 +12:00
window.ls.container.get('view').add({
2019-05-09 18:54:39 +12:00
selector: 'data-ls-ui-open',
controller: function(element, window) {
let def = (element.classList.contains('open')) ? 'open' : 'close';
let buttonClass = element.dataset['buttonClass'] || 'ls-ui-open';
let buttonText = element.dataset['buttonText'] || '';
let buttonIcon = element.dataset['buttonIcon'] || '';
let buttonSelector = element.dataset['buttonSelector'] || '';
let hover = element.hasAttribute('data-hover');
let blur = element.hasAttribute('data-blur');
let button = window.document.createElement('button');
2019-05-09 18:54:39 +12:00
let isTouch = function() {
return 'ontouchstart' in window // works on most browsers
|| navigator.maxTouchPoints; // works on IE10/11 and Surface
};
button.innerText = buttonText;
button.className = buttonClass;
button.tabIndex = 1;
2019-08-09 18:28:16 +12:00
button.type = 'button';
2019-05-09 18:54:39 +12:00
if(buttonIcon) {
let icon = window.document.createElement('i');
icon.className = buttonIcon;
button.insertBefore(icon, button.firstChild);
}
if(def === 'close') {
element.classList.add('close');
element.classList.remove('open');
}
else {
element.classList.add('open');
element.classList.remove('close');
}
button.addEventListener('click', function() {
element.classList.toggle('open');
element.classList.toggle('close');
});
if(hover && !isTouch()) {
element.addEventListener('mouseover', function() {
element.classList.add('open');
element.classList.remove('close');
});
element.addEventListener('mouseout', function() {
element.classList.add('close');
element.classList.remove('open');
});
}
let close = function() {
element.classList.add('close');
element.classList.remove('open');
};
let closeDelay = function() {
window.setTimeout(function() {
close();
}, 150);
};
let findParent = function(tagName, el) {
if ((el.nodeName || el.tagName).toLowerCase() === tagName.toLowerCase()){
return el;
}
while (el = el.parentNode){
if ((el.nodeName || el.tagName).toLowerCase() === tagName.toLowerCase()){
return el;
}
}
return null;
};
2019-08-09 18:28:16 +12:00
if(blur) {
button.addEventListener('blur', closeDelay);
}
2019-05-09 18:54:39 +12:00
2019-08-31 11:47:33 +12:00
if(buttonSelector) {
let buttonElements = element.querySelectorAll(buttonSelector);
buttonElements.forEach((node) => {
node.addEventListener('click', function() {
element.classList.toggle('open');
element.classList.toggle('close');
});
if(blur) {
node.addEventListener('blur', closeDelay);
}
});
}
2019-05-09 18:54:39 +12:00
element.addEventListener('click', function (event) {
let target = findParent('a', event.target);
if(!target) {
return false; // no target
}
if(!target.href) { // Just a normal click not an href
return false;
}
closeDelay();
});
element.insertBefore(button, element.firstChild);
}
});
})(window);