Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b484f93640 | ||
|
|
b90d2b2732 |
@@ -86,12 +86,11 @@ const TicketListView = {
|
|||||||
${(App.lookups.states || []).map(s => `<option value="${s.id}">${s.name}</option>`).join('')}
|
${(App.lookups.states || []).map(s => `<option value="${s.id}">${s.name}</option>`).join('')}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="filter-group">
|
<div class="filter-group" style="position:relative;">
|
||||||
<span class="filter-label">Coda</span>
|
<span class="filter-label">Coda</span>
|
||||||
<select class="filter-select" id="batch-queue">
|
<input type="text" class="form-input filter-select" id="batch-queue-search" placeholder="Cerca coda..." autocomplete="off" style="width:160px; padding: 4px 8px; font-family: inherit; font-size: 0.85rem;" />
|
||||||
<option value="">—</option>
|
<input type="hidden" id="batch-queue" />
|
||||||
${(App.lookups.queues || []).map(q => `<option value="${q.id}">${q.name}</option>`).join('')}
|
<div id="batch-queue-suggestions" class="autocomplete-suggestions" style="display:none; top: 100%; left: 0; width: 280px; z-index: 1001;"></div>
|
||||||
</select>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="filter-group">
|
<div class="filter-group">
|
||||||
<span class="filter-label">Owner</span>
|
<span class="filter-label">Owner</span>
|
||||||
@@ -100,6 +99,13 @@ const TicketListView = {
|
|||||||
${(App.lookups.users || []).map(u => `<option value="${u.id}">${u.first_name} ${u.last_name}</option>`).join('')}
|
${(App.lookups.users || []).map(u => `<option value="${u.id}">${u.first_name} ${u.last_name}</option>`).join('')}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="filter-group">
|
||||||
|
<span class="filter-label">Responsabile</span>
|
||||||
|
<select class="filter-select" id="batch-responsible">
|
||||||
|
<option value="">—</option>
|
||||||
|
${(App.lookups.users || []).map(u => `<option value="${u.id}">${u.first_name} ${u.last_name}</option>`).join('')}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
<div class="filter-group" style="position:relative;">
|
<div class="filter-group" style="position:relative;">
|
||||||
<span class="filter-label">Cliente</span>
|
<span class="filter-label">Cliente</span>
|
||||||
<input type="text" class="form-input filter-select" id="batch-customer-search" placeholder="Cerca cliente..." autocomplete="off" style="width:160px; padding: 4px 8px; font-family: inherit; font-size: 0.85rem;" />
|
<input type="text" class="form-input filter-select" id="batch-customer-search" placeholder="Cerca cliente..." autocomplete="off" style="width:160px; padding: 4px 8px; font-family: inherit; font-size: 0.85rem;" />
|
||||||
@@ -425,10 +431,14 @@ const TicketListView = {
|
|||||||
if (batchCustomerId) batchCustomerId.value = '';
|
if (batchCustomerId) batchCustomerId.value = '';
|
||||||
const batchState = document.getElementById('batch-state');
|
const batchState = document.getElementById('batch-state');
|
||||||
if (batchState) batchState.value = '';
|
if (batchState) batchState.value = '';
|
||||||
|
const batchQueueSearch = document.getElementById('batch-queue-search');
|
||||||
|
if (batchQueueSearch) batchQueueSearch.value = '';
|
||||||
const batchQueue = document.getElementById('batch-queue');
|
const batchQueue = document.getElementById('batch-queue');
|
||||||
if (batchQueue) batchQueue.value = '';
|
if (batchQueue) batchQueue.value = '';
|
||||||
const batchOwner = document.getElementById('batch-owner');
|
const batchOwner = document.getElementById('batch-owner');
|
||||||
if (batchOwner) batchOwner.value = '';
|
if (batchOwner) batchOwner.value = '';
|
||||||
|
const batchResponsible = document.getElementById('batch-responsible');
|
||||||
|
if (batchResponsible) batchResponsible.value = '';
|
||||||
|
|
||||||
this.updateBatchBar();
|
this.updateBatchBar();
|
||||||
});
|
});
|
||||||
@@ -488,11 +498,61 @@ const TicketListView = {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close suggestions on click outside
|
// Batch Queue Autocomplete
|
||||||
|
const batchQueueSearchInput = document.getElementById('batch-queue-search');
|
||||||
|
const batchQueueSuggestionsDiv = document.getElementById('batch-queue-suggestions');
|
||||||
|
const batchQueueIdInput = document.getElementById('batch-queue');
|
||||||
|
|
||||||
|
let batchQueueDebounce;
|
||||||
|
if (batchQueueSearchInput) {
|
||||||
|
batchQueueSearchInput.addEventListener('input', () => {
|
||||||
|
clearTimeout(batchQueueDebounce);
|
||||||
|
const q = batchQueueSearchInput.value.trim();
|
||||||
|
|
||||||
|
batchQueueDebounce = setTimeout(async () => {
|
||||||
|
try {
|
||||||
|
const queues = await App.api(`/api/queues/search?q=${encodeURIComponent(q)}`);
|
||||||
|
if (queues.length === 0) {
|
||||||
|
batchQueueSuggestionsDiv.innerHTML = '<div class="autocomplete-suggestion-item" style="color:var(--text-muted); cursor:default;">Nessuna coda trovata</div>';
|
||||||
|
batchQueueSuggestionsDiv.style.display = 'block';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
batchQueueSuggestionsDiv.innerHTML = queues.map(queue => `
|
||||||
|
<div class="autocomplete-suggestion-item" data-id="${queue.id}" data-name="${App.escapeHtml(queue.name)}">
|
||||||
|
<strong>${App.escapeHtml(queue.name)}</strong>
|
||||||
|
</div>
|
||||||
|
`).join('');
|
||||||
|
batchQueueSuggestionsDiv.style.display = 'block';
|
||||||
|
|
||||||
|
// Bind click
|
||||||
|
batchQueueSuggestionsDiv.querySelectorAll('.autocomplete-suggestion-item').forEach(item => {
|
||||||
|
item.addEventListener('click', () => {
|
||||||
|
batchQueueSearchInput.value = item.dataset.name;
|
||||||
|
if (batchQueueIdInput) batchQueueIdInput.value = item.dataset.id;
|
||||||
|
batchQueueSuggestionsDiv.style.display = 'none';
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
}, 300);
|
||||||
|
});
|
||||||
|
batchQueueSearchInput.addEventListener('focus', () => {
|
||||||
|
batchQueueSearchInput.value = '';
|
||||||
|
if (batchQueueIdInput) batchQueueIdInput.value = '';
|
||||||
|
batchQueueSearchInput.dispatchEvent(new Event('input'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close suggestions on click outside
|
||||||
document.addEventListener('click', (e) => {
|
document.addEventListener('click', (e) => {
|
||||||
if (batchCustomerSearchInput && e.target !== batchCustomerSearchInput && e.target !== batchCustomerSuggestionsDiv) {
|
if (batchCustomerSearchInput && e.target !== batchCustomerSearchInput && e.target !== batchCustomerSuggestionsDiv) {
|
||||||
batchCustomerSuggestionsDiv.style.display = 'none';
|
batchCustomerSuggestionsDiv.style.display = 'none';
|
||||||
}
|
}
|
||||||
|
if (batchQueueSearchInput && e.target !== batchQueueSearchInput && e.target !== batchQueueSuggestionsDiv) {
|
||||||
|
batchQueueSuggestionsDiv.style.display = 'none';
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Pagination
|
// Pagination
|
||||||
@@ -559,6 +619,7 @@ const TicketListView = {
|
|||||||
const batchState = document.getElementById('batch-state')?.value;
|
const batchState = document.getElementById('batch-state')?.value;
|
||||||
const batchQueue = document.getElementById('batch-queue')?.value;
|
const batchQueue = document.getElementById('batch-queue')?.value;
|
||||||
const batchOwner = document.getElementById('batch-owner')?.value;
|
const batchOwner = document.getElementById('batch-owner')?.value;
|
||||||
|
const batchResponsible = document.getElementById('batch-responsible')?.value;
|
||||||
const batchCustomerSearch = document.getElementById('batch-customer-search')?.value.trim();
|
const batchCustomerSearch = document.getElementById('batch-customer-search')?.value.trim();
|
||||||
let batchCustomerUserId = document.getElementById('batch-customer-user-id')?.value;
|
let batchCustomerUserId = document.getElementById('batch-customer-user-id')?.value;
|
||||||
let batchCustomerId = document.getElementById('batch-customer-id')?.value;
|
let batchCustomerId = document.getElementById('batch-customer-id')?.value;
|
||||||
@@ -573,6 +634,11 @@ const TicketListView = {
|
|||||||
if (batchState) updates.ticket_state_id = parseInt(batchState);
|
if (batchState) updates.ticket_state_id = parseInt(batchState);
|
||||||
if (batchQueue) updates.queue_id = parseInt(batchQueue);
|
if (batchQueue) updates.queue_id = parseInt(batchQueue);
|
||||||
if (batchOwner) updates.user_id = parseInt(batchOwner);
|
if (batchOwner) updates.user_id = parseInt(batchOwner);
|
||||||
|
if (batchResponsible) {
|
||||||
|
updates.responsible_user_id = parseInt(batchResponsible);
|
||||||
|
} else if (batchOwner) {
|
||||||
|
updates.responsible_user_id = parseInt(batchOwner);
|
||||||
|
}
|
||||||
if (batchCustomerUserId) updates.customer_user_id = batchCustomerUserId;
|
if (batchCustomerUserId) updates.customer_user_id = batchCustomerUserId;
|
||||||
if (batchCustomerId) updates.customer_id = batchCustomerId;
|
if (batchCustomerId) updates.customer_id = batchCustomerId;
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -1418,6 +1418,7 @@ router.patch('/batch/update', async (req, res) => {
|
|||||||
if (updates.ticket_priority_id !== undefined) ticketFields.PriorityID = updates.ticket_priority_id;
|
if (updates.ticket_priority_id !== undefined) ticketFields.PriorityID = updates.ticket_priority_id;
|
||||||
if (updates.queue_id !== undefined) ticketFields.QueueID = updates.queue_id;
|
if (updates.queue_id !== undefined) ticketFields.QueueID = updates.queue_id;
|
||||||
if (updates.user_id !== undefined) ticketFields.OwnerID = updates.user_id;
|
if (updates.user_id !== undefined) ticketFields.OwnerID = updates.user_id;
|
||||||
|
if (updates.responsible_user_id !== undefined) ticketFields.ResponsibleID = updates.responsible_user_id;
|
||||||
if (updates.customer_id !== undefined) ticketFields.CustomerID = updates.customer_id;
|
if (updates.customer_id !== undefined) ticketFields.CustomerID = updates.customer_id;
|
||||||
if (updates.customer_user_id !== undefined) ticketFields.CustomerUser = updates.customer_user_id;
|
if (updates.customer_user_id !== undefined) ticketFields.CustomerUser = updates.customer_user_id;
|
||||||
|
|
||||||
@@ -1470,7 +1471,7 @@ router.patch('/batch/update', async (req, res) => {
|
|||||||
try {
|
try {
|
||||||
await client.query('BEGIN');
|
await client.query('BEGIN');
|
||||||
|
|
||||||
const allowedFields = ['ticket_state_id', 'ticket_priority_id', 'queue_id', 'user_id', 'customer_id', 'customer_user_id'];
|
const allowedFields = ['ticket_state_id', 'ticket_priority_id', 'queue_id', 'user_id', 'responsible_user_id', 'customer_id', 'customer_user_id'];
|
||||||
const setClauses = [];
|
const setClauses = [];
|
||||||
const setParams = [];
|
const setParams = [];
|
||||||
let pIdx = 1;
|
let pIdx = 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user