1
0
Fork 0
mirror of synced 2024-06-28 11:10:46 +12:00
appwrite/public/scripts/views/ui/open.js
2020-06-13 14:13:53 +03:00

134 lines
3.7 KiB
JavaScript

(function(window) {
window.ls.container.get("view").add({
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 buttonAria = element.dataset["buttonAria"] || "Open";
let buttonSelector = element.dataset["buttonSelector"] || "";
let hover = element.hasAttribute("data-hover");
let blur = element.hasAttribute("data-blur");
let button = window.document.createElement("button");
let isTouch = function() {
return (
"ontouchstart" in window || navigator.maxTouchPoints // works on most browsers
); // works on IE10/11 and Surface
};
button.innerText = buttonText;
button.className = buttonClass;
// button.tabIndex = 1;
button.type = "button";
if (buttonIcon) {
let icon = window.document.createElement("i");
icon.className = buttonIcon;
button.insertBefore(icon, button.firstChild);
}
if(buttonAria) {
button.setAttribute('aria-label', buttonAria);
}
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();
}, 400);
};
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;
};
if (blur) {
button.addEventListener("blur", closeDelay);
}
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);
}
});
}
element.addEventListener('click', function(event) {
let targetA = findParent('a', event.target);
let targetB = findParent('button', event.target);
if (!targetA && !targetB) {
return false; // no target
}
if (targetA && !targetA.href) {
// Just a normal click not an href
return false;
}
if (targetB && !targetB.classList.contains('link')) {
// Just a normal click not an href
return false;
}
closeDelay();
});
element.insertBefore(button, element.firstChild);
}
});
})(window);