Aggiunte stored procedure più utili le altre pfff
This commit is contained in:
+155
-45
@@ -3,6 +3,32 @@
|
||||
* Minimal, fast form for creating new tickets.
|
||||
*/
|
||||
const TicketCreateView = {
|
||||
savedState: null,
|
||||
|
||||
saveState() {
|
||||
const stateEl = document.getElementById('create-state');
|
||||
if (!stateEl) return;
|
||||
this.savedState = {
|
||||
state_id: stateEl.value,
|
||||
title: document.getElementById('create-title').value,
|
||||
queue_name: document.getElementById('create-queue-search').value,
|
||||
queue_id: document.getElementById('create-queue').value,
|
||||
type_id: document.getElementById('create-type').value,
|
||||
owner_name: document.getElementById('create-owner-search').value,
|
||||
owner_id: document.getElementById('create-owner').value,
|
||||
responsible_name: document.getElementById('create-responsible-search').value,
|
||||
responsible_id: document.getElementById('create-responsible').value,
|
||||
user_search: document.getElementById('create-user-search').value,
|
||||
customer_user_id: document.getElementById('create-customer-user-id').value,
|
||||
customer_id: document.getElementById('create-customer-id').value,
|
||||
company_search: document.getElementById('create-company-search').value,
|
||||
priority_id: document.getElementById('create-priority').value,
|
||||
subject: document.getElementById('create-subject').value,
|
||||
body: document.getElementById('create-body').value,
|
||||
isAdvancedVisible: document.getElementById('advanced-options').style.display !== 'none'
|
||||
};
|
||||
},
|
||||
|
||||
async render() {
|
||||
const container = document.getElementById('view-container');
|
||||
container.innerHTML = '<div class="loading-screen"><div class="spinner"></div><p>Caricamento form...</p></div>';
|
||||
@@ -10,6 +36,57 @@ const TicketCreateView = {
|
||||
try {
|
||||
await App.ensureLookups();
|
||||
|
||||
// Check if we have incoming query parameters (e.g. from Teams integration)
|
||||
const hashParts = window.location.hash.split('?');
|
||||
const searchStr = hashParts.length > 1 ? hashParts[1] : window.location.search;
|
||||
const urlParams = new URLSearchParams(searchStr);
|
||||
const incomingBody = urlParams.get('body');
|
||||
const incomingCustomer = urlParams.get('customer');
|
||||
const incomingSubject = urlParams.get('subject');
|
||||
|
||||
if (incomingBody || incomingCustomer || incomingSubject) {
|
||||
let foundCustomer = null;
|
||||
if (incomingCustomer) {
|
||||
try {
|
||||
const results = await App.api(`/api/customer-users/search?q=${encodeURIComponent(incomingCustomer)}`);
|
||||
if (results && results.length > 0) {
|
||||
foundCustomer = results[0];
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn('Failed to search customer for Teams integration:', e);
|
||||
}
|
||||
}
|
||||
|
||||
// Prepopulate default active agent details
|
||||
const currentAgentId = localStorage.getItem('activeAgentId') || '1';
|
||||
const activeAgent = (App.lookups.users || []).find(u => String(u.id) === String(currentAgentId));
|
||||
const agentName = activeAgent ? `${activeAgent.first_name} ${activeAgent.last_name}` : '';
|
||||
const agentId = activeAgent ? activeAgent.id : '';
|
||||
|
||||
this.savedState = {
|
||||
state_id: '1', // default state
|
||||
title: 'Segnalazione da Teams',
|
||||
queue_name: App.lookups.queues && App.lookups.queues.length > 0 ? App.lookups.queues[0].name : '',
|
||||
queue_id: App.lookups.queues && App.lookups.queues.length > 0 ? App.lookups.queues[0].id : '',
|
||||
type_id: '',
|
||||
owner_name: agentName,
|
||||
owner_id: agentId,
|
||||
responsible_name: agentName,
|
||||
responsible_id: agentId,
|
||||
user_search: foundCustomer ? `${foundCustomer.first_name} ${foundCustomer.last_name} <${foundCustomer.email}>` : (incomingCustomer || ''),
|
||||
customer_user_id: foundCustomer ? foundCustomer.login : (incomingCustomer || ''),
|
||||
customer_id: foundCustomer ? foundCustomer.customer_id : '',
|
||||
company_search: foundCustomer ? foundCustomer.customer_id : '',
|
||||
priority_id: '3',
|
||||
subject: incomingSubject || 'Messaggio da Microsoft Teams',
|
||||
body: incomingBody || '',
|
||||
isAdvancedVisible: false
|
||||
};
|
||||
|
||||
// Clean query parameters from URL to prevent duplicate inserts on reload
|
||||
window.history.replaceState({}, document.title, window.location.pathname + window.location.hash.split('?')[0]);
|
||||
}
|
||||
|
||||
container.innerHTML = `
|
||||
<a class="back-link" onclick="history.back()">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="width:16px;height:16px;"><path d="M19 12H5M12 19l-7-7 7-7"/></svg>
|
||||
@@ -158,57 +235,83 @@ const TicketCreateView = {
|
||||
const advancedOptions = document.getElementById('advanced-options');
|
||||
const arrow = document.getElementById('advanced-arrow');
|
||||
|
||||
// Pre-populate default values asynchronously
|
||||
setTimeout(async () => {
|
||||
// 1. Owner & Responsible pre-population with active agent
|
||||
const currentAgentId = localStorage.getItem('activeAgentId') || '1';
|
||||
const activeAgent = (App.lookups.users || []).find(u => String(u.id) === String(currentAgentId));
|
||||
if (activeAgent) {
|
||||
if (ownerSearchInput && ownerIdInput) {
|
||||
ownerSearchInput.value = `${activeAgent.first_name} ${activeAgent.last_name}`;
|
||||
ownerIdInput.value = activeAgent.id;
|
||||
}
|
||||
if (responsibleSearchInput && responsibleIdInput) {
|
||||
responsibleSearchInput.value = `${activeAgent.first_name} ${activeAgent.last_name}`;
|
||||
responsibleIdInput.value = activeAgent.id;
|
||||
}
|
||||
// Restore saved state if exists, otherwise load defaults asynchronously
|
||||
if (this.savedState) {
|
||||
document.getElementById('create-state').value = this.savedState.state_id;
|
||||
document.getElementById('create-title').value = this.savedState.title;
|
||||
document.getElementById('create-queue-search').value = this.savedState.queue_name;
|
||||
document.getElementById('create-queue').value = this.savedState.queue_id;
|
||||
if (document.getElementById('create-type')) {
|
||||
document.getElementById('create-type').value = this.savedState.type_id;
|
||||
}
|
||||
document.getElementById('create-owner-search').value = this.savedState.owner_name;
|
||||
document.getElementById('create-owner').value = this.savedState.owner_id;
|
||||
document.getElementById('create-responsible-search').value = this.savedState.responsible_name;
|
||||
document.getElementById('create-responsible').value = this.savedState.responsible_id;
|
||||
document.getElementById('create-user-search').value = this.savedState.user_search;
|
||||
document.getElementById('create-customer-user-id').value = this.savedState.customer_user_id;
|
||||
document.getElementById('create-customer-id').value = this.savedState.customer_id;
|
||||
document.getElementById('create-company-search').value = this.savedState.company_search;
|
||||
document.getElementById('create-priority').value = this.savedState.priority_id;
|
||||
document.getElementById('create-subject').value = this.savedState.subject;
|
||||
document.getElementById('create-body').value = this.savedState.body;
|
||||
|
||||
// 2. Customer User pre-population with first match
|
||||
try {
|
||||
const companies = await App.api('/api/customer-companies/search?q=cliente');
|
||||
if (companies.length > 0 && customerIdInput && companySearchInput) {
|
||||
const defaultCompany = companies[0];
|
||||
customerIdInput.value = defaultCompany.customer_id;
|
||||
companySearchInput.value = defaultCompany.customer_id;
|
||||
|
||||
// Search users for this company
|
||||
const users = await App.api(`/api/customer-users/search?q=&customer_company_id=${encodeURIComponent(defaultCompany.customer_id)}`);
|
||||
if (users.length > 0 && userSearchInput && customerUserIdInput) {
|
||||
const defaultUser = users[0];
|
||||
userSearchInput.value = `${defaultUser.first_name} ${defaultUser.last_name}`;
|
||||
customerUserIdInput.value = defaultUser.login;
|
||||
} else {
|
||||
// Fallback: use company name as customer user ID
|
||||
userSearchInput.value = defaultCompany.name;
|
||||
customerUserIdInput.value = defaultCompany.customer_id;
|
||||
if (this.savedState.isAdvancedVisible) {
|
||||
advancedOptions.style.display = 'grid';
|
||||
if (arrow) arrow.style.transform = 'rotate(90deg)';
|
||||
}
|
||||
} else {
|
||||
setTimeout(async () => {
|
||||
// 1. Owner & Responsible pre-population with active agent
|
||||
const currentAgentId = localStorage.getItem('activeAgentId') || '1';
|
||||
const activeAgent = (App.lookups.users || []).find(u => String(u.id) === String(currentAgentId));
|
||||
if (activeAgent) {
|
||||
if (ownerSearchInput && ownerIdInput) {
|
||||
ownerSearchInput.value = `${activeAgent.first_name} ${activeAgent.last_name}`;
|
||||
ownerIdInput.value = activeAgent.id;
|
||||
}
|
||||
if (responsibleSearchInput && responsibleIdInput) {
|
||||
responsibleSearchInput.value = `${activeAgent.first_name} ${activeAgent.last_name}`;
|
||||
responsibleIdInput.value = activeAgent.id;
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Error pre-populating defaults:', err);
|
||||
}
|
||||
|
||||
// 3. Queue pre-population
|
||||
try {
|
||||
const queues = await App.api('/api/queues/search?q=');
|
||||
if (queues.length > 0 && queueSearchInput && queueIdInput) {
|
||||
queueSearchInput.value = queues[0].name;
|
||||
queueIdInput.value = queues[0].id;
|
||||
// 2. Customer User pre-population with first match
|
||||
try {
|
||||
const companies = await App.api('/api/customer-companies/search?q=cliente');
|
||||
if (companies.length > 0 && customerIdInput && companySearchInput) {
|
||||
const defaultCompany = companies[0];
|
||||
customerIdInput.value = defaultCompany.customer_id;
|
||||
companySearchInput.value = defaultCompany.customer_id;
|
||||
|
||||
// Search users for this company
|
||||
const users = await App.api(`/api/customer-users/search?q=&customer_company_id=${encodeURIComponent(defaultCompany.customer_id)}`);
|
||||
if (users.length > 0 && userSearchInput && customerUserIdInput) {
|
||||
const defaultUser = users[0];
|
||||
userSearchInput.value = `${defaultUser.first_name} ${defaultUser.last_name}`;
|
||||
customerUserIdInput.value = defaultUser.login;
|
||||
} else {
|
||||
// Fallback: use company name as customer user ID
|
||||
userSearchInput.value = defaultCompany.name;
|
||||
customerUserIdInput.value = defaultCompany.customer_id;
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Error pre-populating defaults:', err);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Error pre-populating queues:', err);
|
||||
}
|
||||
}, 50);
|
||||
|
||||
// 3. Queue pre-population
|
||||
try {
|
||||
const queues = await App.api('/api/queues/search?q=');
|
||||
if (queues.length > 0 && queueSearchInput && queueIdInput) {
|
||||
queueSearchInput.value = queues[0].name;
|
||||
queueIdInput.value = queues[0].id;
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Error pre-populating queues:', err);
|
||||
}
|
||||
}, 50);
|
||||
}
|
||||
|
||||
// Collapsible Options Toggle
|
||||
if (toggleBtn && advancedOptions && arrow) {
|
||||
@@ -491,6 +594,7 @@ const TicketCreateView = {
|
||||
});
|
||||
|
||||
Toast.success(`Ticket #${result.tn} creato!`);
|
||||
this.savedState = null; // Clear cached state on success
|
||||
|
||||
// Navigate to the new ticket
|
||||
window.location.hash = `#/tickets/${result.id}`;
|
||||
@@ -506,5 +610,11 @@ const TicketCreateView = {
|
||||
`;
|
||||
}
|
||||
});
|
||||
|
||||
// Save state on any input/change in the form
|
||||
document.querySelectorAll('.create-form input, .create-form select, .create-form textarea').forEach(el => {
|
||||
el.addEventListener('input', () => this.saveState());
|
||||
el.addEventListener('change', () => this.saveState());
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user