Tikettinäkymään 'Luo tehtävä' -nappi

Asiakaspalvelun tikettinäkymässä uusi nappi joka avaa
TODO-tehtävälomakkeen esitäytetyillä tiedoilla: otsikko
(tikettinumero + aihe), kategoria (tiketin tyypistä),
prioriteetti ja kuvaus (lähettäjän tiedot).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-11 14:28:17 +02:00
parent fb22e09c0b
commit ad4c5605f6

View File

@@ -1440,6 +1440,7 @@ async function showTicketDetail(id, companyId = '') {
<select id="ticket-customer-select" style="padding:6px 10px;border:2px solid #e0e0e0;border-radius:8px;font-size:0.85rem;"> <select id="ticket-customer-select" style="padding:6px 10px;border:2px solid #e0e0e0;border-radius:8px;font-size:0.85rem;">
<option value="">Ei asiakkuutta</option> <option value="">Ei asiakkuutta</option>
</select> </select>
<button class="btn-secondary" id="btn-ticket-to-todo" style="padding:6px 12px;font-size:0.82rem;" title="Luo tehtävä tästä tiketistä">📋 Tehtävä</button>
<button class="btn-danger" id="btn-ticket-delete" style="padding:6px 12px;font-size:0.82rem;">Poista</button> <button class="btn-danger" id="btn-ticket-delete" style="padding:6px 12px;font-size:0.82rem;">Poista</button>
</div> </div>
</div> </div>
@@ -1567,6 +1568,11 @@ async function showTicketDetail(id, companyId = '') {
} catch (e) { alert(e.message); } } catch (e) { alert(e.message); }
}); });
// Luo tehtävä tiketistä
document.getElementById('btn-ticket-to-todo')?.addEventListener('click', () => {
createTodoFromTicket(ticket);
});
// Tags: add new tag on Enter // Tags: add new tag on Enter
document.getElementById('ticket-tag-input').addEventListener('keydown', async (e) => { document.getElementById('ticket-tag-input').addEventListener('keydown', async (e) => {
if (e.key !== 'Enter') return; if (e.key !== 'Enter') return;
@@ -3901,6 +3907,27 @@ let todosData = [];
let currentTodoId = null; let currentTodoId = null;
let currentTodoSubTab = 'tasks'; let currentTodoSubTab = 'tasks';
function createTodoFromTicket(ticket) {
// Vaihda todo-välilehdelle ja avaa uusi tehtävälomake esitäytetyillä tiedoilla
switchToTab('todo');
switchTodoSubTab('tasks');
// Pieni viive jotta tab ehtii renderöityä
setTimeout(async () => {
await openTaskEdit(null);
const num = ticket.ticket_number ? `#${ticket.ticket_number} ` : '';
document.getElementById('task-form-title').value = num + (ticket.subject || '');
// Mapataan tiketin tyyppi tehtävän kategoriaan
const catMap = { tekniikka: 'tekniikka', laskutus: 'laskutus', vika: 'tekniikka', muu: 'muu' };
document.getElementById('task-form-category').value = catMap[ticket.type] || '';
// Mapataan prioriteetti
const prioMap = { urgent: 'kiireellinen', 'tärkeä': 'tarkea', normaali: 'normaali' };
document.getElementById('task-form-priority').value = prioMap[ticket.priority] || 'normaali';
// Kuvaus: lähettäjä + lyhyt viite
const desc = `Tiketti${num ? ' ' + num : ''}: ${ticket.subject || ''}\nLähettäjä: ${ticket.from_name || ''} <${ticket.from_email || ''}>`;
document.getElementById('task-form-desc').value = desc;
}, 100);
}
const todoStatusLabels = { avoin:'Avoin', kaynnissa:'Käynnissä', odottaa:'Odottaa', valmis:'Valmis', ehdotettu:'Ehdotettu', harkinnassa:'Harkinnassa', toteutettu:'Toteutettu', hylatty:'Hylätty' }; const todoStatusLabels = { avoin:'Avoin', kaynnissa:'Käynnissä', odottaa:'Odottaa', valmis:'Valmis', ehdotettu:'Ehdotettu', harkinnassa:'Harkinnassa', toteutettu:'Toteutettu', hylatty:'Hylätty' };
const todoPriorityLabels = { normaali:'Normaali', tarkea:'Tärkeä', kiireellinen:'Kiireellinen' }; const todoPriorityLabels = { normaali:'Normaali', tarkea:'Tärkeä', kiireellinen:'Kiireellinen' };
const todoCategoryLabels = { tekniikka:'Tekniikka', laskutus:'Laskutus', myynti:'Myynti', asennus:'Asennus', muu:'Muu' }; const todoCategoryLabels = { tekniikka:'Tekniikka', laskutus:'Laskutus', myynti:'Myynti', asennus:'Asennus', muu:'Muu' };