This commit is contained in:
AlexBa16
2026-06-08 15:29:52 +02:00
commit 27903eed4a
9931 changed files with 1535659 additions and 0 deletions
@@ -0,0 +1,100 @@
/**
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
/**
* Debounce
* https://gist.github.com/nmsdvid/8807205
*
* @param { function } callback The callback function to be executed
* @param { int } time The time to wait before firing the callback
* @param { int } interval The interval
*/
const debounce = (callback, time = 250, interval) => (...args) => clearTimeout(interval, interval = setTimeout(callback, time, ...args));
((window, document, Joomla) => {
Joomla.unpublishModule = element => {
// Get variables
const baseUrl = 'index.php?option=com_modules&task=modules.unpublish&format=json';
const id = element.getAttribute('data-module-id');
Joomla.request({
url: `${baseUrl}&cid=${id}`,
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
onSuccess: () => {
const wrapper = element.closest('.module-wrapper');
wrapper.parentNode.removeChild(wrapper);
Joomla.renderMessages({
message: [Joomla.Text._('COM_CPANEL_UNPUBLISH_MODULE_SUCCESS')]
});
},
onError: () => {
Joomla.renderMessages({
error: [Joomla.Text._('COM_CPANEL_UNPUBLISH_MODULE_ERROR')]
});
}
});
};
const onBoot = () => {
const cpanelModules = document.getElementById('content');
if (cpanelModules) {
cpanelModules.querySelectorAll('.unpublish-module').forEach(link => {
link.addEventListener('click', ({
target
}) => Joomla.unpublishModule(target));
});
}
// Cleanup
document.removeEventListener('DOMContentLoaded', onBoot);
};
// Initialise
document.addEventListener('DOMContentLoaded', onBoot);
// Masonry layout for cpanel cards
const MasonryLayout = {
$gridBox: null,
gridAutoRows: 0,
gridRowGap: 10,
// Calculate "grid-row-end" property
resizeGridItem($cell, rowHeight, rowGap) {
const $content = $cell.querySelector('.card');
if ($content) {
const contentHeight = $content.getBoundingClientRect().height + rowGap;
const rowSpan = Math.ceil(contentHeight / (rowHeight + rowGap));
$cell.style.gridRowEnd = `span ${rowSpan}`;
}
},
// Check a size of every cell in the grid
resizeAllGridItems() {
const $gridCells = [].slice.call(this.$gridBox.children);
$gridCells.forEach($cell => this.resizeGridItem($cell, this.gridAutoRows, this.gridRowGap));
},
initialise() {
this.$gridBox = document.querySelector('#cpanel-modules .card-columns');
const gridStyle = window.getComputedStyle(this.$gridBox);
this.gridAutoRows = parseInt(gridStyle.getPropertyValue('grid-auto-rows'), 10) || this.gridAutoRows;
this.gridRowGap = parseInt(gridStyle.getPropertyValue('grid-row-gap'), 10) || this.gridRowGap;
this.resizeAllGridItems();
// Recheck the layout after all content (fonts and images) is loaded.
window.addEventListener('load', () => this.resizeAllGridItems());
// Recheck the layout when the menu is toggled
window.addEventListener('joomla:menu-toggle', () => {
// 300ms is animation time, need to wait for the animation to end
setTimeout(() => this.resizeAllGridItems(), 330);
});
// Watch on window resize
window.addEventListener('resize', debounce(() => this.resizeAllGridItems(), 50));
}
};
// Initialise Masonry layout at the very beginning, to avoid jumping.
// We can do this because the script is deferred.
MasonryLayout.initialise();
})(window, document, window.Joomla);
@@ -0,0 +1,4 @@
/**
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/const debounce=(i,r=250,t)=>(...d)=>clearTimeout(t,t=setTimeout(i,r,...d));((i,r,t)=>{t.unpublishModule=e=>{const s="index.php?option=com_modules&task=modules.unpublish&format=json",o=e.getAttribute("data-module-id");t.request({url:`${s}&cid=${o}`,method:"POST",headers:{"Content-Type":"application/json"},onSuccess:()=>{const n=e.closest(".module-wrapper");n.parentNode.removeChild(n),t.renderMessages({message:[t.Text._("COM_CPANEL_UNPUBLISH_MODULE_SUCCESS")]})},onError:()=>{t.renderMessages({error:[t.Text._("COM_CPANEL_UNPUBLISH_MODULE_ERROR")]})}})};const d=()=>{const e=r.getElementById("content");e&&e.querySelectorAll(".unpublish-module").forEach(s=>{s.addEventListener("click",({target:o})=>t.unpublishModule(o))}),r.removeEventListener("DOMContentLoaded",d)};r.addEventListener("DOMContentLoaded",d),{$gridBox:null,gridAutoRows:0,gridRowGap:10,resizeGridItem(e,s,o){const n=e.querySelector(".card");if(n){const l=n.getBoundingClientRect().height+o,a=Math.ceil(l/(s+o));e.style.gridRowEnd=`span ${a}`}},resizeAllGridItems(){[].slice.call(this.$gridBox.children).forEach(s=>this.resizeGridItem(s,this.gridAutoRows,this.gridRowGap))},initialise(){this.$gridBox=r.querySelector("#cpanel-modules .card-columns");const e=i.getComputedStyle(this.$gridBox);this.gridAutoRows=parseInt(e.getPropertyValue("grid-auto-rows"),10)||this.gridAutoRows,this.gridRowGap=parseInt(e.getPropertyValue("grid-row-gap"),10)||this.gridRowGap,this.resizeAllGridItems(),i.addEventListener("load",()=>this.resizeAllGridItems()),i.addEventListener("joomla:menu-toggle",()=>{setTimeout(()=>this.resizeAllGridItems(),330)}),i.addEventListener("resize",debounce(()=>this.resizeAllGridItems(),50))}}.initialise()})(window,document,window.Joomla);
@@ -0,0 +1,54 @@
/**
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
((document, Joomla) => {
const init = () => {
// Cleanup
window.removeEventListener('load', init);
// Get the elements
const elements = document.querySelectorAll('.system-counter');
if (elements.length) {
elements.forEach(element => {
const badgeurl = element.getAttribute('data-url');
if (badgeurl && Joomla && Joomla.request && typeof Joomla.request === 'function') {
Joomla.enqueueRequest({
url: badgeurl,
method: 'POST',
promise: true
}).then(xhr => {
const resp = xhr.responseText;
let response;
try {
response = JSON.parse(resp);
} catch (error) {
throw new Error('Failed to parse JSON');
}
if (response.error || !response.success) {
element.classList.remove('icon-spin', 'icon-spinner');
element.classList.add('text-danger', 'icon-remove');
} else if (response.data) {
const elem = document.createElement('span');
elem.classList.add('float-end', 'badge', 'bg-warning', 'text-dark');
elem.innerHTML = Joomla.sanitizeHtml(response.data);
element.parentNode.replaceChild(elem, element);
} else {
element.classList.remove('icon-spin', 'icon-spinner');
element.classList.add('icon-check', 'text-success');
}
}).catch(() => {
element.classList.remove('icon-spin', 'icon-spinner');
element.classList.add('text-danger', 'icon-remove');
});
}
});
}
};
// Give some times to the layout and other scripts to settle their stuff
window.addEventListener('load', () => {
setTimeout(init, 300);
});
})(document, Joomla);
@@ -0,0 +1,4 @@
/**
* @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/((n,s)=>{const i=()=>{window.removeEventListener("load",i);const c=n.querySelectorAll(".system-counter");c.length&&c.forEach(e=>{const a=e.getAttribute("data-url");a&&s&&s.request&&typeof s.request=="function"&&s.enqueueRequest({url:a,method:"POST",promise:!0}).then(o=>{const d=o.responseText;let t;try{t=JSON.parse(d)}catch{throw new Error("Failed to parse JSON")}if(t.error||!t.success)e.classList.remove("icon-spin","icon-spinner"),e.classList.add("text-danger","icon-remove");else if(t.data){const r=n.createElement("span");r.classList.add("float-end","badge","bg-warning","text-dark"),r.innerHTML=s.sanitizeHtml(t.data),e.parentNode.replaceChild(r,e)}else e.classList.remove("icon-spin","icon-spinner"),e.classList.add("icon-check","text-success")}).catch(()=>{e.classList.remove("icon-spin","icon-spinner"),e.classList.add("text-danger","icon-remove")})})};window.addEventListener("load",()=>{setTimeout(i,300)})})(document,Joomla);