feat: aggiunta possibilità di inserire massivamente i ticket selezionati all'interno dei gruppi.
This commit is contained in:
@@ -118,6 +118,7 @@ const TicketListView = {
|
||||
</div>
|
||||
` : ''}
|
||||
<button class="btn btn-primary btn-sm" id="batch-apply">Applica</button>
|
||||
<button class="btn btn-primary btn-sm" id="batch-add-group" disabled style="background: var(--accent-primary); border-color: var(--accent-primary); margin-left: 8px;">Aggiungi a gruppo</button>
|
||||
<button class="btn btn-primary btn-sm" id="batch-merge" disabled style="background: rgba(160, 65, 71, 0.32); border-color: var(--accent-primary); color: var(--text-primary); margin-left: 8px;">Unisci Selezionati</button>
|
||||
<button class="btn btn-primary btn-sm" id="batch-open-tabs" disabled style="background: var(--accent-primary); border-color: var(--accent-primary); margin-left: 8px;">Apri ticket in schede</button>
|
||||
<button class="btn btn-ghost btn-xs" id="batch-cancel">Annulla</button>
|
||||
@@ -310,6 +311,12 @@ const TicketListView = {
|
||||
batchApply.addEventListener('click', () => this.applyBatch());
|
||||
}
|
||||
|
||||
// Batch add to group
|
||||
const batchAddGroup = document.getElementById('batch-add-group');
|
||||
if (batchAddGroup) {
|
||||
batchAddGroup.addEventListener('click', () => this.addToGroup());
|
||||
}
|
||||
|
||||
// Batch merge (Issue #7)
|
||||
const batchMerge = document.getElementById('batch-merge');
|
||||
if (batchMerge) {
|
||||
@@ -597,6 +604,12 @@ const TicketListView = {
|
||||
count.textContent = `${this.selectedIds.size} selezionat${this.selectedIds.size === 1 ? 'o' : 'i'}`;
|
||||
}
|
||||
|
||||
// Enable/disable add to group button
|
||||
const addGroupBtn = document.getElementById('batch-add-group');
|
||||
if (addGroupBtn) {
|
||||
addGroupBtn.disabled = this.selectedIds.size === 0;
|
||||
}
|
||||
|
||||
// Enable/disable merge button
|
||||
const mergeBtn = document.getElementById('batch-merge');
|
||||
if (mergeBtn) {
|
||||
@@ -714,10 +727,86 @@ const TicketListView = {
|
||||
Toast.success(res.message || 'Ticket uniti con successo');
|
||||
this.selectedIds.clear();
|
||||
this.selectedOrder = [];
|
||||
this.render();
|
||||
} catch (err) {
|
||||
Toast.error('Errore durante l\'unione: ' + err.message);
|
||||
this.updateBatchBar();
|
||||
}
|
||||
},
|
||||
|
||||
async addToGroup() {
|
||||
if (this.selectedIds.size === 0) return;
|
||||
|
||||
try {
|
||||
const groups = await App.api('/api/groups');
|
||||
if (!groups || groups.length === 0) {
|
||||
Toast.warning('non sono presenti gruppi');
|
||||
return;
|
||||
}
|
||||
|
||||
// Show group selection prompt/dialog
|
||||
const groupOptions = groups.map(g => `<option value="${g.id}">${App.escapeHtml(g.nome)}</option>`).join('');
|
||||
const dialogHtml = `
|
||||
<div id="batch-group-modal" style="position: fixed; inset: 0; z-index: 8000; background: rgba(0,0,0,0.5); backdrop-filter: blur(4px); display: flex; align-items: center; justify-content: center;">
|
||||
<div style="background: var(--bg-card); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); width: 400px; max-width: 90vw; padding: var(--space-lg); box-shadow: var(--shadow-lg);">
|
||||
<h4 style="margin: 0 0 var(--space-md) 0; font-size: 1rem; font-weight: 600; color: var(--text-primary);">Aggiungi a Gruppo</h4>
|
||||
<p style="font-size: 0.85rem; color: var(--text-secondary); margin-bottom: var(--space-md);">Seleziona il gruppo a cui aggiungere i <strong>${this.selectedIds.size}</strong> ticket selezionati:</p>
|
||||
<select id="batch-group-select" class="form-select" style="width: 100%; margin-bottom: var(--space-lg);">
|
||||
${groupOptions}
|
||||
</select>
|
||||
<div style="display: flex; gap: var(--space-sm); justify-content: flex-end;">
|
||||
<button class="btn btn-ghost btn-sm" id="batch-group-cancel">Annulla</button>
|
||||
<button class="btn btn-primary btn-sm" id="batch-group-confirm">Aggiungi</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
// Append modal to body
|
||||
const modalContainer = document.createElement('div');
|
||||
modalContainer.innerHTML = dialogHtml;
|
||||
document.body.appendChild(modalContainer);
|
||||
|
||||
const closeModal = () => modalContainer.remove();
|
||||
|
||||
document.getElementById('batch-group-cancel').addEventListener('click', closeModal);
|
||||
document.getElementById('batch-group-confirm').addEventListener('click', async () => {
|
||||
const groupId = document.getElementById('batch-group-select').value;
|
||||
if (!groupId) return;
|
||||
|
||||
const confirmBtn = document.getElementById('batch-group-confirm');
|
||||
confirmBtn.disabled = true;
|
||||
confirmBtn.textContent = 'Aggiunta...';
|
||||
|
||||
let addedCount = 0;
|
||||
let errorsCount = 0;
|
||||
|
||||
for (const ticketId of this.selectedIds) {
|
||||
try {
|
||||
await App.api(`/api/groups/${groupId}/tickets`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({ ticket_identifier: ticketId })
|
||||
});
|
||||
addedCount++;
|
||||
} catch (err) {
|
||||
// Conflict (already in group) or other errors
|
||||
errorsCount++;
|
||||
}
|
||||
}
|
||||
|
||||
closeModal();
|
||||
|
||||
if (addedCount > 0) {
|
||||
Toast.success(`${addedCount} ticket aggiunti al gruppo!`);
|
||||
this.selectedIds.clear();
|
||||
this.selectedOrder = [];
|
||||
this.render();
|
||||
} else if (errorsCount > 0) {
|
||||
Toast.warning('I ticket selezionati appartengono già a questo gruppo.');
|
||||
}
|
||||
});
|
||||
|
||||
} catch (err) {
|
||||
Toast.error('Errore durante il recupero dei gruppi: ' + err.message);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user