(function () { 'use strict'; const DEFAULT_ACTION_CONFIG = { default_category: null, allow_company_templates: true, allow_global_templates: true }; let modalElement = null; let modalInstance = null; let currentCaseId = null; let currentAction = null; let availableTemplates = []; let currentPreview = null; function notify(message, level) { if (typeof window.showNotification === 'function') { window.showNotification(message, level || 'info'); return; } if (level === 'error') { alert(message); } } function ensureModal() { if (modalElement) return; const html = `
`; document.body.insertAdjacentHTML('beforeend', html); modalElement = document.getElementById('taskTemplateSelectorModal'); modalInstance = new bootstrap.Modal(modalElement); document.getElementById('ttSource').addEventListener('change', refreshTemplates); document.getElementById('ttCategory').addEventListener('change', refreshTemplates); document.getElementById('ttTemplateSearch').addEventListener('input', renderTemplateList); document.getElementById('ttTemplate').addEventListener('change', onTemplateSelected); document.getElementById('ttAssigneeMode').addEventListener('change', onAssigneeModeChanged); document.getElementById('ttPreviewBtn').addEventListener('click', runPreview); document.getElementById('ttRunBtn').addEventListener('click', runTemplate); document.getElementById('ttRefreshRunsBtn').addEventListener('click', loadRunHistory); modalElement.addEventListener('shown.bs.modal', () => { document.getElementById('ttTemplateSearch').focus(); }); } function todayIso() { const now = new Date(); const month = String(now.getMonth() + 1).padStart(2, '0'); const day = String(now.getDate()).padStart(2, '0'); return `${now.getFullYear()}-${month}-${day}`; } async function fetchCase(caseId) { const response = await fetch(`/api/v1/sag/${caseId}`, { credentials: 'include' }); if (!response.ok) { throw new Error('Kunne ikke hente sag'); } return response.json(); } function getActionConfig() { const cfg = (currentAction && currentAction.config) || {}; return { ...DEFAULT_ACTION_CONFIG, ...cfg }; } async function refreshTemplates() { const source = document.getElementById('ttSource').value; const category = document.getElementById('ttCategory').value; const params = new URLSearchParams(); if (source) params.set('source', source); if (category) params.set('category', category); try { const caseRow = await fetchCase(currentCaseId); if (caseRow && caseRow.customer_id) { params.set('company_id', String(caseRow.customer_id)); } const response = await fetch(`/api/v1/task-templates?${params.toString()}`, { credentials: 'include' }); if (!response.ok) { const payload = await response.json().catch(() => ({})); throw new Error(payload.detail || 'Kunne ikke hente templates'); } availableTemplates = await response.json(); renderTemplateList(); } catch (error) { console.error('Failed to load templates:', error); availableTemplates = []; renderTemplateList(); notify(error.message || 'Kunne ikke hente templates', 'error'); } } function renderTemplateList() { const search = String(document.getElementById('ttTemplateSearch').value || '').toLowerCase().trim(); const select = document.getElementById('ttTemplate'); const emptyState = document.getElementById('ttTemplateEmpty'); const filtered = availableTemplates.filter((template) => { if (!search) return true; const haystack = `${template.name || ''} ${template.description || ''} ${template.category || ''}`.toLowerCase(); return haystack.includes(search); }); select.innerHTML = filtered.map((template) => { const scopeLabel = template.template_type === 'company' ? 'Firma' : template.template_type === 'global' ? 'Faelles' : 'Intern'; const cat = template.category || 'andet'; return ``; }).join(''); emptyState.classList.toggle('d-none', filtered.length > 0); document.getElementById('ttRunBtn').disabled = true; currentPreview = null; document.getElementById('ttPreviewSummary').textContent = 'Ingen preview endnu.'; document.getElementById('ttPreviewList').innerHTML = ''; } function onTemplateSelected() { currentPreview = null; document.getElementById('ttRunBtn').disabled = true; document.getElementById('ttPreviewSummary').textContent = 'Template valgt. Klik "Opdater preview".'; document.getElementById('ttPreviewList').innerHTML = ''; } function onAssigneeModeChanged() { const mode = document.getElementById('ttAssigneeMode').value; const userInput = document.getElementById('ttAssigneeUserId'); const roleInput = document.getElementById('ttAssigneeRoleId'); userInput.classList.toggle('d-none', mode !== 'specific_user'); roleInput.classList.toggle('d-none', mode !== 'specific_role'); } function buildPayload() { const templateId = Number(document.getElementById('ttTemplate').value); if (!templateId) { throw new Error('Vaelg en template'); } const mode = document.getElementById('ttMode').value; const assigneeMode = document.getElementById('ttAssigneeMode').value; const startDate = document.getElementById('ttStartDate').value || todayIso(); const assigneeUserIdRaw = document.getElementById('ttAssigneeUserId').value; const assigneeRoleIdRaw = document.getElementById('ttAssigneeRoleId').value; const payload = { template_id: templateId, start_date: startDate, mode, assignee_mode: assigneeMode, }; if (assigneeMode === 'specific_user') { const parsed = Number(assigneeUserIdRaw); if (!parsed) throw new Error('Udfyld medarbejder ID'); payload.assignee_user_id = parsed; } if (assigneeMode === 'specific_role') { const parsed = Number(assigneeRoleIdRaw); if (!parsed) throw new Error('Udfyld rolle ID'); payload.assignee_role_id = parsed; } return payload; } function renderPreview(preview) { const summary = preview.summary || {}; const list = Array.isArray(preview.items) ? preview.items : []; document.getElementById('ttPreviewSummary').textContent = `Du er ved at oprette: ${summary.subcases || 0} undersager, ${summary.tasks || 0} opgaver, ${summary.assignments || 0} tildelinger, ${summary.deadlines || 0} deadlines.`; document.getElementById('ttPreviewList').innerHTML = list.map((item) => { const typeLabel = item.item_type === 'subcase' ? 'Undersag' : 'Task'; return `