(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 = '
';
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 += '
';
html += '
';
html += '| Aufgabe | ' + esc(data.task_title) + ' |
';
html += '| Mitarbeiter | ' + esc(data.contact_name);
if (data.contact_email) { html += ' (' + esc(data.contact_email) + ')'; }
html += ' |
';
html += '| Zyklus | ' + esc(data.cycle_key) + ' |
';
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 = '';
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();
}
});
})();