278 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
			Vendored
		
	
	
	
			
		
		
	
	
			278 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
			Vendored
		
	
	
	
| // remove dropdown menu when mouseleave in index more actions
 | |
| document.querySelectorAll("[data-table-list]").forEach((row) => {
 | |
|   row.addEventListener("mouseleave", function() {
 | |
|       if (row.querySelector("[data-dropdown-actions]")) {
 | |
|           row.querySelector("[data-dropdown-actions]").classList.remove("block");
 | |
|           row.querySelector("[data-dropdown-actions]").classList.add("hidden");
 | |
|       }
 | |
|   });
 | |
| });
 | |
| // remove dropdown menu when mouseleave in index more actions
 | |
| 
 | |
| //redirect edit or show page for table row click
 | |
| document.querySelectorAll("[data-table-body]").forEach((table) => {
 | |
|   let rows = table.querySelectorAll("tr");
 | |
| 
 | |
|   rows.forEach((row) => {
 | |
|       let row_href = row.getAttribute("href");
 | |
| 
 | |
|       if (! row_href) {
 | |
|           return;
 | |
|       }
 | |
| 
 | |
|       let td = row.getElementsByTagName("td");
 | |
|       let first_selector = row.querySelector('[data-bulkaction]') && row.querySelector('[data-bulkaction]') !== null ? 1 : 0;
 | |
| 
 | |
|       if (row_href) {
 | |
|         for (let i=first_selector; i<td.length-1; i++) {
 | |
|             let td_item = td[i];
 | |
|             td_item.addEventListener("click", () => {
 | |
|                 window.location.href = row_href;
 | |
|             });
 | |
|         }
 | |
|     }
 | |
|   });
 | |
| });
 | |
| //redirect edit or show page for table row click
 | |
| 
 | |
| //collapse accordion
 | |
| function toggleSub(key, event) {
 | |
|   let isExpanded =
 | |
|       document.querySelectorAll(
 | |
|           `[data-collapse="${key}"]` + ".active-collapse"
 | |
|       ).length > 0;
 | |
| 
 | |
|   if (isExpanded) {
 | |
|       this.collapseSub(key, event);
 | |
|   } else {
 | |
|       this.expandSub(key, event);
 | |
|   }
 | |
| }
 | |
| 
 | |
| function collapseSub(key, event) {
 | |
|   event.stopPropagation();
 | |
|   event.target.classList.add("rotate-90");
 | |
| 
 | |
|   document
 | |
|       .querySelectorAll(`[data-collapse="${key}"]` + ".active-collapse")
 | |
|       .forEach(function(element) {
 | |
|           element.classList.toggle("active-collapse");
 | |
|           element.classList.toggle("collapse-sub");
 | |
|       });
 | |
| 
 | |
|   // if collapsed key has childs(table row constantly), they will be collapsed as well
 | |
|   document
 | |
|       .querySelectorAll(`[data-collapse="${key}"]` + " button[node|='child']")
 | |
|       .forEach(function(element) {
 | |
|               element.childNodes[0].classList.add("rotate-90")
 | |
| 
 | |
|               this.collapseSub(element.getAttribute("node"), event);
 | |
|           }.bind(this)
 | |
|       );
 | |
| }
 | |
| 
 | |
| function expandSub(key, event) {
 | |
|   event.stopPropagation();
 | |
|   event.target.classList.remove("rotate-90");
 | |
| 
 | |
|   document
 | |
|       .querySelectorAll(`[data-collapse="${key}"]`)
 | |
|       .forEach(function(element) {
 | |
|           if (element.getAttribute("data-animation")) {
 | |
|               element.classList.toggle("active-collapse-animation");
 | |
|           }
 | |
| 
 | |
|           element.classList.toggle("active-collapse");
 | |
|           element.classList.toggle("collapse-sub");
 | |
|       });
 | |
| }
 | |
| //collapse accordion
 | |
| 
 | |
| // run dropdown and tooltip functions for Virtual DOM
 | |
| document.addEventListener("DOMContentLoaded", () => {
 | |
|     const triggers = [
 | |
|         { event: "mouseover", checker: isHoverable },
 | |
|         { event: "mouseout", checker: isHoverable },
 | |
|         { event: "click", checker: isClickable },
 | |
|     ];
 | |
| 
 | |
|     triggers.forEach(({ event, checker, fn }) => {
 | |
|         document.addEventListener(
 | |
|             event,
 | |
|             (e) => {
 | |
|                 const dropdownToggleEl = e.target.closest(
 | |
|                     "[data-dropdown-toggle]"
 | |
|                 );
 | |
|                 const tooltipToggleEl = e.target.closest(
 | |
|                     "[data-tooltip-target]"
 | |
|                 );
 | |
|                 if (dropdownToggleEl !== null && event == "click") {
 | |
|                     runDropdown(dropdownToggleEl);
 | |
|                 }
 | |
| 
 | |
|                 if (tooltipToggleEl !== null && event == "mouseover") {
 | |
|                   runTooltip(tooltipToggleEl);
 | |
|               }
 | |
|             },
 | |
|             false
 | |
|         );
 | |
|     });
 | |
| });
 | |
| 
 | |
| function isClickable(dropdownToggleEl) {
 | |
|     return dropdownToggleEl.getAttribute("data-dropdown-toggle") === "click";
 | |
| }
 | |
| 
 | |
| function isHoverable(tooltipToggleEl) {
 | |
|     return tooltipToggleEl.getAttribute("data-tooltip-target") === "hover";
 | |
| }
 | |
| //run dropdown and tooltip functions for Virtual DOM
 | |
| 
 | |
| // Toggle dropdown elements using [data-dropdown-toggle]
 | |
| function runDropdown(dropdownToggleEl) {
 | |
|     const dropdownMenuId = dropdownToggleEl.getAttribute(
 | |
|         "data-dropdown-toggle"
 | |
|     );
 | |
|     const dropdownMenuEl = document.getElementById(dropdownMenuId); // options
 | |
| 
 | |
|     const placement = dropdownToggleEl.getAttribute("data-dropdown-placement");
 | |
| 
 | |
|     var element = dropdownToggleEl;
 | |
| 
 | |
|     while (element.nodeName !== "BUTTON") {
 | |
|         element = element.parentNode;
 | |
|     }
 | |
| 
 | |
|     Popper.createPopper(element, dropdownMenuEl, {
 | |
|         placement: placement ? placement : "bottom-start",
 | |
|         modifiers: [
 | |
|             {
 | |
|                 name: "offset",
 | |
|                 options: {
 | |
|                     offset: [0, 10],
 | |
|                 },
 | |
|             },
 | |
|         ],
 | |
|     }); // toggle when click on the button
 | |
| 
 | |
|     dropdownMenuEl.classList.toggle("hidden");
 | |
|     dropdownMenuEl.classList.toggle("block");
 | |
| 
 | |
|     function handleDropdownOutsideClick(event) {
 | |
|         var targetElement = event.target; // clicked element
 | |
| 
 | |
|         if (
 | |
|             targetElement !== dropdownMenuEl &&
 | |
|             targetElement !== dropdownToggleEl &&
 | |
|             !dropdownToggleEl.contains(targetElement)
 | |
|         ) {
 | |
|             dropdownMenuEl.classList.add("hidden");
 | |
|             dropdownMenuEl.classList.remove("block");
 | |
|             document.body.removeEventListener(
 | |
|                 "click",
 | |
|                 handleDropdownOutsideClick,
 | |
|                 true
 | |
|             );
 | |
|         }
 | |
|     } // hide popper when clicking outside the element
 | |
| 
 | |
|     document.body.addEventListener("click", handleDropdownOutsideClick, true);
 | |
| 
 | |
|     if (dropdownMenuEl.getAttribute("data-click-outside-none") != null) {
 | |
|         if (event.target.getAttribute("data-click-outside") != null || event.target.parentElement.getAttribute("data-click-outside") != null) {
 | |
|             dropdownMenuEl.classList.add("hidden");
 | |
|             dropdownMenuEl.classList.remove("block");
 | |
|             return;
 | |
|         }
 | |
|         dropdownMenuEl.classList.add("block");
 | |
|         dropdownMenuEl.classList.remove("hidden");
 | |
|     }
 | |
| }
 | |
| // Toggle dropdown elements using [data-dropdown-toggle]
 | |
| 
 | |
| // Tooltip elements using [data-tooltip-target], [data-tooltip-placement]
 | |
| function runTooltip(tooltipToggleEl) {
 | |
|     const tooltipEl = document.getElementById(
 | |
|         tooltipToggleEl.getAttribute("data-tooltip-target")
 | |
|     );
 | |
|     const placement = tooltipToggleEl.getAttribute("data-tooltip-placement");
 | |
|     const trigger = tooltipToggleEl.getAttribute("data-tooltip-trigger");
 | |
|     const popperInstance = Popper.createPopper(tooltipToggleEl, tooltipEl, {
 | |
|         placement: placement ? placement : "top",
 | |
|         modifiers: [
 | |
|             {
 | |
|                 name: "offset",
 | |
|                 options: {
 | |
|                     offset: [0, 8],
 | |
|                 },
 | |
|             },
 | |
|         ],
 | |
|     });
 | |
| 
 | |
|     function show() {
 | |
|         // Make the tooltip visible
 | |
|         tooltipEl.classList.remove("opacity-0");
 | |
|         tooltipEl.classList.add("opacity-100");
 | |
|         tooltipEl.classList.remove("invisible");
 | |
|         tooltipEl.classList.add("visible"); // Enable the event listeners
 | |
| 
 | |
|         popperInstance.setOptions((options) => ({
 | |
|             ...options,
 | |
|             modifiers: [
 | |
|                 ...options.modifiers,
 | |
|                 {
 | |
|                     name: "eventListeners",
 | |
|                     enabled: true,
 | |
|                 },
 | |
|             ],
 | |
|         })); // Update its position
 | |
| 
 | |
|         popperInstance.update();
 | |
|     }
 | |
| 
 | |
|     function hide() {
 | |
|         // Hide the tooltip
 | |
|         tooltipEl.classList.remove("opacity-100");
 | |
|         tooltipEl.classList.add("opacity-0");
 | |
|         tooltipEl.classList.remove("visible");
 | |
|         tooltipEl.classList.add("invisible"); // Disable the event listeners
 | |
| 
 | |
|         popperInstance.setOptions((options) => ({
 | |
|             ...options,
 | |
|             modifiers: [
 | |
|                 ...options.modifiers,
 | |
|                 {
 | |
|                     name: "eventListeners",
 | |
|                     enabled: false,
 | |
|                 },
 | |
|             ],
 | |
|         }));
 | |
|     }
 | |
| 
 | |
|     var showEvents = [];
 | |
|     var hideEvents = [];
 | |
| 
 | |
|     switch (trigger) {
 | |
|         case "hover":
 | |
|             showEvents = ["mouseenter", "focus"];
 | |
|             hideEvents = ["mouseleave", "blur"];
 | |
|             break;
 | |
| 
 | |
|         case "click":
 | |
|             showEvents = ["click", "focus"];
 | |
|             hideEvents = ["focusout", "blur"];
 | |
|             break;
 | |
| 
 | |
|         default:
 | |
|             showEvents = ["mouseenter", "focus"];
 | |
|             hideEvents = ["mouseleave", "blur"];
 | |
|     }
 | |
| 
 | |
|     showEvents.forEach((event) => {
 | |
|         tooltipToggleEl.addEventListener(event, show);
 | |
|     });
 | |
|     hideEvents.forEach((event) => {
 | |
|         tooltipToggleEl.addEventListener(event, hide);
 | |
|     });
 | |
| }
 | |
| // Tooltip elements using [data-tooltip-target], [data-tooltip-placement]
 |