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:
2025-10-30 11:43:06 -05:00
parent 0ce353ea9d
commit 91d52d2de5
1692 changed files with 202851 additions and 0 deletions

View File

@@ -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));
}
}
}