(function () { 'use strict'; var dialog = document.getElementById('task-cert-mark-completed-dialog'); var config = document.getElementById('task-cert-mark-completed-config'); if (!dialog || !config) { return; } var methodsUrl = config.getAttribute('data-methods-url') || ''; var submitUrl = config.getAttribute('data-submit-url') || ''; var taskId = parseInt(config.getAttribute('data-task-id') || '0', 10); if (!methodsUrl || !submitUrl || !taskId) { return; } var METHOD_LABELS = { knowledge_read: 'Wissensbestätigung', form_submit: 'Formular', quiz: 'Quiz', manual_approval: 'Manuelle Freigabe' }; function esc(str) { var div = document.createElement('div'); div.appendChild(document.createTextNode(String(str == null ? '' : str))); return div.innerHTML; } function buildMethodHtml(method) { var id = method.id; var type = method.method_type; var label = METHOD_LABELS[type] || type; var required = method.is_required ? '' : ' (optional)'; var fulfilled = method.already_fulfilled; var html = '
'; html += '' + esc(label) + required; if (fulfilled) { html += ' Bereits erledigt'; } html += ''; if (fulfilled) { html += '

Wird übersprungen.

'; } else if (type === 'knowledge_read') { html += '

Alle ' + method.knowledge_post_count + ' Beiträge werden automatisch als gelesen markiert.

'; } else if (type === 'quiz') { html += '

Quiz wird automatisch als bestanden gewertet (' + method.quiz_question_count + ' Fragen, volle Punktzahl).

'; } else if (type === 'manual_approval') { html += '

Manuelle Freigabe wird automatisch erteilt.

'; } else if (type === 'form_submit') { var fields = method.form_fields || []; if (fields.length === 0) { html += '

Keine Formularfelder definiert.

'; } else { html += '
'; for (var i = 0; i < fields.length; i++) { html += buildFieldHtml(id, fields[i]); } html += '
'; } } html += '
'; return html; } function buildFieldHtml(methodId, field) { var key = field.field_key; var label = field.label || key; var type = field.field_type; var req = field.is_required ? ' (Pflicht)' : ''; var placeholder = esc(field.placeholder || ''); var name = 'method__' + methodId + '__' + key; var inputId = 'mc-field-' + methodId + '-' + key; var html = '
'; html += ''; if (type === 'textarea') { html += ''; } else if (type === 'select' && field.options.length > 0) { html += ''; } else if (type === 'checkbox' && field.options.length > 0) { html += '
'; for (var j = 0; j < field.options.length; j++) { html += ''; } html += '
'; } else if (type === 'radio' && field.options.length > 0) { html += '
'; for (var k = 0; k < field.options.length; k++) { html += ''; } html += '
'; } else { var inputType = type === 'number' ? 'number' : (type === 'date' ? 'date' : 'text'); html += ''; } html += '
'; return html; } function buildDialogContent(data) { var html = '
'; html += '
'; html += '

Als erledigt markieren

'; html += ''; html += '
'; html += '
'; html += ''; html += ''; html += ''; html += ''; html += '
Aufgabe' + esc(data.task_title) + '
Mitarbeiter' + esc(data.contact_name); if (data.contact_email) { html += ' (' + esc(data.contact_email) + ')'; } html += '
Zyklus' + esc(data.cycle_key) + '
'; html += '
'; html += '
'; html += ''; if (data.methods && data.methods.length > 0) { html += '
'; html += '

Methoden

'; html += '

Einreichungen werden automatisch erstellt. Bei Formularen können Sie optional Antworten hinterlegen.

'; for (var i = 0; i < data.methods.length; i++) { html += buildMethodHtml(data.methods[i]); } html += '
'; } html += '
'; html += '

Admin-Notiz

'; html += ''; html += '
'; html += '
'; html += ''; html += ''; html += '
'; html += ''; html += '
'; html += '
'; return html; } function collectFormData(data) { var form = document.getElementById('task-cert-mark-completed-form'); if (!form) { return null; } var adminNote = (form.querySelector('[name="admin_note"]') || {}).value || ''; var csrfToken = (form.querySelector('[name="csrf_token"]') || {}).value || ''; var methodPayloads = {}; var methods = data.methods || []; for (var i = 0; i < methods.length; i++) { var m = methods[i]; if (m.already_fulfilled || m.method_type !== 'form_submit') { continue; } var fields = m.form_fields || []; var payload = {}; for (var j = 0; j < fields.length; j++) { var key = fields[j].field_key; var name = 'method__' + m.id + '__' + key; if (fields[j].field_type === 'checkbox') { var checked = form.querySelectorAll('[name="' + name + '[]"]:checked'); var vals = []; for (var k = 0; k < checked.length; k++) { vals.push(checked[k].value); } payload[key] = vals; } else { var el = form.querySelector('[name="' + name + '"]'); payload[key] = el ? el.value : ''; } } methodPayloads[m.id] = payload; } return { csrf_token: csrfToken, task_id: taskId, assignment_id: data.assignment_id, admin_note: adminNote, method: methodPayloads }; } function showError(msg) { var errEl = document.getElementById('task-cert-dialog-error'); if (errEl) { errEl.textContent = msg; errEl.hidden = false; } } function setLoading(on) { var btn = dialog.querySelector('[type="submit"]'); if (btn) { btn.disabled = on; btn.textContent = on ? 'Wird gespeichert...' : 'Als erledigt markieren'; } } var currentData = null; function openDialog(assignmentId) { dialog.innerHTML = '

Daten werden geladen...

'; dialog.showModal(); fetch(methodsUrl + '?assignment_id=' + assignmentId, { credentials: 'same-origin' }) .then(function (res) { return res.json(); }) .then(function (data) { if (data.error) { dialog.innerHTML = '
' + esc(data.error) + '
'; return; } currentData = data; dialog.innerHTML = buildDialogContent(data); }) .catch(function (err) { dialog.innerHTML = '
Fehler: ' + esc(err.message) + '
'; }); } function submitDialog() { if (!currentData) { return; } var body = collectFormData(currentData); if (!body) { return; } setLoading(true); fetch(submitUrl, { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }) .then(function (res) { return res.json(); }) .then(function (result) { if (result.success) { dialog.close(); if (window.TaskCertAdminActions && window.TaskCertAdminActions.showToast) { window.TaskCertAdminActions.showToast('Zuweisung als erledigt markiert.', 'success'); } setTimeout(function () { location.reload(); }, 800); } else { setLoading(false); showError(result.error || 'Unbekannter Fehler'); } }) .catch(function (err) { setLoading(false); showError('Netzwerkfehler: ' + err.message); }); } // Event delegation document.addEventListener('click', function (e) { var btn = e.target.closest('.task-cert-btn-mark-completed'); if (btn) { e.preventDefault(); var aid = parseInt(btn.getAttribute('data-assignment-id') || '0', 10); if (aid > 0) { openDialog(aid); } return; } if (e.target.closest('.task-cert-dialog-close') || e.target.closest('.task-cert-dialog-cancel')) { dialog.close(); return; } }); dialog.addEventListener('submit', function (e) { e.preventDefault(); submitDialog(); }); dialog.addEventListener('click', function (e) { if (e.target === dialog) { dialog.close(); } }); })();