// auto-split module function parseTemplate(text) { if (window.jsyaml && typeof jsyaml.load === 'function') { try { return jsyaml.load(text); } catch (e) {} } try { return JSON.parse(text); } catch (e) {} throw new Error('Vorlage konnte weder als YAML noch JSON gelesen werden.'); } function captureEditsIntoTemplate() { if (!template) return; const rows = [...(els.stepsTableBody?.querySelectorAll('tr') || [])]; template.steps = rows.map((row, i) => { const kind = row.getAttribute('data-kind') || 'step'; if (kind === 'group') { return { kind: 'group', title: (row.querySelector('.tpl-group-title')?.value || '').trim(), collapsed: row.getAttribute('data-collapsed') === '1' }; } return { kind: 'step', id: (row.querySelector('.tpl-id')?.value || '').trim() || `step-${String(i+1).padStart(3,'0')}`, title: (row.querySelector('.tpl-title')?.value || row.querySelector('.tpl-title')?.textContent || '').trim(), expected: (row.querySelector('.tpl-expected')?.value || '').trim(), required: !!(row.querySelector('.tpl-required')?.checked), status: row.querySelector('select.status')?.value || '', comment: row.querySelector('.run-comment')?.value || '', evidence: row.querySelector('.run-evidence')?.value || '' }; }); } function nextStepNumber() { const stepsOnly = (template?.steps || []).filter(s => (s.kind || s.type || 'step') === 'step'); // Versuche numerischen Suffix aus "step-XYZ" zu lesen, sonst zähle Steps const nums = stepsOnly .map(s => String(s.id || '')) .map(id => { const m = id.match(/step-(\d+)/i); return m ? parseInt(m[1], 10) : null; }) .filter(n => Number.isFinite(n)); const base = nums.length ? Math.max(...nums) : stepsOnly.length; return base + 1; } function makeStepId(n) { const num = String(Math.max(1, n)).padStart(3, '0'); return `step-${num}`; } function renumberSteps() { if (!template || !Array.isArray(template.steps)) return; let n = 1; template.steps.forEach(s => { const k = s.kind || s.type || 'step'; if (k !== 'step') return; const id = `step-${String(n).padStart(3,'0')}`; s.id = id; n++; }); } function ensureRenumberAndRender() { renumberSteps(); renderSteps(template.steps); recomputeGroupStyles(); } function renderSteps(steps) { if (!els.stepsTableBody) return; els.stepsTableBody.innerHTML = ''; let groupCollapsed = false; steps.forEach((s, idx) => { if ((s.kind || 'step') === 'group') { const trG = document.createElement('tr'); trG.setAttribute('data-kind', 'group'); trG.className = 'group-row'; if (s.collapsed) trG.setAttribute('data-collapsed', '1'); /* drag via handle only */ // trG.setAttribute('draggable','true'); trG.innerHTML = `