feat(cloudron): add tirreno package artifacts
- Add CloudronStack/output/CloudronPackages-Artifacts/tirreno/ directory and its contents - Includes package manifest, Dockerfile, source code, documentation, and build artifacts - Add tirreno-1761840148.tar.gz as a build artifact - Add tirreno-cloudron-package-1761841304.tar.gz as the Cloudron package - Include all necessary files for the tirreno Cloudron package This adds the complete tirreno Cloudron package artifacts to the repository.
This commit is contained in:
		@@ -0,0 +1,134 @@
 | 
			
		||||
import {renderUserActionButtons} from './DataRenderers.js?v=2';
 | 
			
		||||
import {handleAjaxError} from './utils/ErrorHandler.js?v=2';
 | 
			
		||||
 | 
			
		||||
export class UserGridActionButtons {
 | 
			
		||||
 | 
			
		||||
    constructor(tableId) {
 | 
			
		||||
        this.tableId = tableId;
 | 
			
		||||
        const onTableLoaded = this.onTableLoaded.bind(this);
 | 
			
		||||
        window.addEventListener('tableLoaded', onTableLoaded, false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onTableLoaded(e) {
 | 
			
		||||
        const tableId = e.detail.tableId;
 | 
			
		||||
        const buttons = document.querySelectorAll(`#${tableId} button`);
 | 
			
		||||
 | 
			
		||||
        const onButtonClick = this.onButtonClick.bind(this);
 | 
			
		||||
        buttons.forEach(button => button.addEventListener('click', onButtonClick, false));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onButtonClick(e) {
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        e.stopPropagation();
 | 
			
		||||
 | 
			
		||||
        const me = this;
 | 
			
		||||
        const target = e.target;
 | 
			
		||||
        const url = '/admin/manageUser';
 | 
			
		||||
        const token = document.head.querySelector('[name=\'csrf-token\'][content]').content;
 | 
			
		||||
        const data = {userId: target.dataset.userId, type: target.dataset.type, token: token};
 | 
			
		||||
 | 
			
		||||
        target.classList.add('is-loading');
 | 
			
		||||
 | 
			
		||||
        $.ajax({
 | 
			
		||||
            type: 'POST',
 | 
			
		||||
            url: url,
 | 
			
		||||
            data: data,
 | 
			
		||||
            scope: me,
 | 
			
		||||
            target: target,
 | 
			
		||||
            success: me.onSuccess,
 | 
			
		||||
            error: handleAjaxError,
 | 
			
		||||
            dataType: 'json'
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onSuccessCount(data) {
 | 
			
		||||
        const span = document.querySelector('span.reviewed-users-tile');
 | 
			
		||||
        span.textContent = data.total;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setMenuCount() {
 | 
			
		||||
        const token = document.head.querySelector('[name=\'csrf-token\'][content]').content;
 | 
			
		||||
        $.ajax({
 | 
			
		||||
            type: 'GET',
 | 
			
		||||
            url: '/admin/loadReviewQueueCount',
 | 
			
		||||
            data: {token: token},
 | 
			
		||||
            success: this.onSuccessCount,
 | 
			
		||||
            error: handleAjaxError,
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onSuccess() {
 | 
			
		||||
        const me   = this.scope;
 | 
			
		||||
 | 
			
		||||
        const target     = this.target;
 | 
			
		||||
        const type       = target.dataset.type;
 | 
			
		||||
        const buttonType = target.dataset.buttonType;
 | 
			
		||||
        const accountId  = target.dataset.userId;
 | 
			
		||||
        const tableRow   = target.closest('tr');
 | 
			
		||||
 | 
			
		||||
        target.classList.remove('is-loading');
 | 
			
		||||
 | 
			
		||||
        const twoButtonsContainer = target.closest('.legitfraud');
 | 
			
		||||
        if (twoButtonsContainer && !twoButtonsContainer.hasAttribute('counterUpdated')) {
 | 
			
		||||
            twoButtonsContainer.setAttribute('counterUpdated', 0);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ('fraudButton' === buttonType) {
 | 
			
		||||
            const td = target.closest('td');
 | 
			
		||||
            const fraudButton = td.querySelector('[data-type="fraud"]');
 | 
			
		||||
            const legitButton = td.querySelector('[data-type="legit"]');
 | 
			
		||||
 | 
			
		||||
            if ('fraud' === type) {
 | 
			
		||||
                fraudButton.classList.replace('is-neutral', 'is-highlighted');
 | 
			
		||||
                fraudButton.setAttribute('disabled', '');
 | 
			
		||||
 | 
			
		||||
                legitButton.classList.replace('is-highlighted', 'is-neutral');
 | 
			
		||||
                legitButton.removeAttribute('disabled');
 | 
			
		||||
            } else {
 | 
			
		||||
                legitButton.classList.replace('is-neutral', 'is-highlighted');
 | 
			
		||||
                legitButton.setAttribute('disabled', '');
 | 
			
		||||
 | 
			
		||||
                fraudButton.classList.replace('is-highlighted', 'is-neutral');
 | 
			
		||||
                fraudButton.removeAttribute('disabled');
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            const counterUpdated    = twoButtonsContainer.getAttribute('counterUpdated');
 | 
			
		||||
            const wasCounterUpdated = parseInt(counterUpdated, 10);
 | 
			
		||||
            if (!wasCounterUpdated) {
 | 
			
		||||
                const card = target.closest('.card');
 | 
			
		||||
                const span = card.querySelector('.card-header-title span');
 | 
			
		||||
                let total  = parseInt(span.innerHTML, 10);
 | 
			
		||||
 | 
			
		||||
                if (total > 0) {
 | 
			
		||||
                    total -= 1;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                span.textContent = total;
 | 
			
		||||
 | 
			
		||||
                twoButtonsContainer.setAttribute('counterUpdated', 1);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (tableRow) {
 | 
			
		||||
                const dataTable = $(`#${me.tableId}`).DataTable();
 | 
			
		||||
                dataTable.row(tableRow).remove().draw(false);
 | 
			
		||||
                me.setMenuCount();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ('reviewedButton' === buttonType) {
 | 
			
		||||
            //Get HTML w/ new fraud&legit buttons
 | 
			
		||||
            const record = {reviewed: true, accountid: accountId};
 | 
			
		||||
            const html   = renderUserActionButtons(record);
 | 
			
		||||
 | 
			
		||||
            const td = target.closest('td');
 | 
			
		||||
            td.replaceChildren(html);
 | 
			
		||||
 | 
			
		||||
            //Add event listener to newly created buttons
 | 
			
		||||
            const buttons = td.querySelectorAll('button');
 | 
			
		||||
            const onButtonClick = me.onButtonClick.bind(me);
 | 
			
		||||
            buttons.forEach(button => button.addEventListener('click', onButtonClick, false));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user