/* ===================================================================== aether-medical — Bausteine für die Bögen Setzt vorformulierten Text in ein Formular ein. Mehr tut diese Datei nicht, und mehr soll sie nicht tun: * Sie schreibt nichts zum Server. Der Text landet im Textfeld, gespeichert wird danach von Hand. * Sie überschreibt nichts. Steht schon etwas im Feld, wird der Baustein darunter gehängt. * Sie wählt nichts aus. Welcher Baustein passt, entscheidet der, der ihn einsetzt. ===================================================================== */ "use strict"; const Bausteine = (() => { const { sicher, aufruf, meldung, bestaetigen } = App; /** * Hängt Text an ein Textfeld an, ohne Vorhandenes zu verlieren. * @param {HTMLTextAreaElement} feld Zielfeld * @param {string} text Einzusetzender Text */ function anhaengen(feld, text) { const vorhanden = feld.value.trim(); feld.value = vorhanden ? vorhanden + "\n\n" + text : text; } /** * Öffnet die Bausteinauswahl für einen Bogen. * @param {object} o { * modul Modulkennung, unter der die Aktion liegt * behaelter Element, in dem die Textfelder stehen * nachEinsetzen Rückruf nach dem Einsetzen (freiwillig) * } */ async function einsetzen(o) { let d; try { d = await aufruf(o.modul, "bausteine", {}); } catch (fehler) { return meldung(fehler.message, "fehler"); } if (!d.bausteine.length) { return meldung("Für diesen Bogen ist kein Baustein hinterlegt.", "fehler"); } let gewaehlt = null; // aktuell gewählter Baustein const abgewaehlt = {}; // Felder, die der Nutzer ausgenommen hat bestaetigen({ titel: "Baustein einsetzen", inhalt: `
🧩
Der Baustein füllt nur das Formular. Gespeichert wird nichts — das machst du danach selbst. Text, der schon im Feld steht, bleibt erhalten; der Baustein kommt darunter.
${d.bausteine.map((b) => `
${sicher(b.kennung)}
${sicher(b.name)}
${d.felder .filter((f) => b.inhalt[f.id]) .map((f) => sicher(f.name)).join(" · ") || "leer"}
`).join("")}
Wähle einen Baustein, um seinen Text zu sehen.
`, bestaetigenText: "In den Bogen einsetzen", bestaetigt: (el, zu) => { if (!gewaehlt) return meldung("Bitte einen Baustein wählen.", "fehler"); const gefuellt = []; const uebersprungen = []; d.felder.forEach((feld) => { const text = gewaehlt.inhalt[feld.id]; if (!text || abgewaehlt[feld.id]) return; // Gesperrte Felder gibt es im Bogen gar nicht — sie bleiben aussen vor const ziel = o.behaelter.querySelector(`textarea[name=${feld.id}]`); if (!ziel) { uebersprungen.push(feld.name); return; } anhaengen(ziel, text); gefuellt.push(feld.name); }); zu(); if (!gefuellt.length) { return meldung("Kein Feld des Bogens ließ sich füllen.", "fehler"); } meldung(uebersprungen.length ? `Eingesetzt in ${gefuellt.length} Feld(er). Übersprungen: ${uebersprungen.join(", ")}.` : `Eingesetzt in ${gefuellt.length} Feld(er). Noch nicht gespeichert.`, "gut"); if (o.nachEinsetzen) o.nachEinsetzen(gefuellt); }, nachOeffnen: (hg) => { const vorschau = hg.querySelector("[data-vorschau]"); /** Zeigt, was der Baustein in welches Feld schreiben würde */ function zeigeVorschau() { vorschau.innerHTML = `
Wird eingesetzt Häkchen entfernen, was nicht mit soll
${d.felder.filter((f) => gewaehlt.inhalt[f.id]).map((f) => `
${sicher(gewaehlt.inhalt[f.id]) .replace(/\n/g, "
")}
`).join("")}`; vorschau.querySelectorAll("[data-feld]").forEach((el) => { el.addEventListener("change", () => { abgewaehlt[el.dataset.feld] = !el.checked; }); }); } hg.querySelectorAll("[data-baustein]").forEach((el) => { el.addEventListener("click", () => { gewaehlt = d.bausteine.find((b) => b.id === +el.dataset.baustein); // Bei einem Wechsel gelten wieder alle Felder Object.keys(abgewaehlt).forEach((k) => delete abgewaehlt[k]); hg.querySelectorAll("[data-baustein]") .forEach((zeile) => zeile.classList.remove("gewaehlt")); el.classList.add("gewaehlt"); zeigeVorschau(); }); }); }, }); } return { einsetzen }; })();