Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
82 lines
3.2 KiB
JavaScript
82 lines
3.2 KiB
JavaScript
/* Szenarien-Seite (Ausbaustufe 14): Umschaltlogik der Formulare
|
|
* „Neue Änderung an Bestehendem" (.aenderung-form, auch in den Edit-Zeilen
|
|
* der Einträge) und „Neue Zahlung nur in diesem Szenario" (.zahlung-form).
|
|
* UX-Regel: Felder werden nur per disabled gesperrt, nie entfernt;
|
|
* gesperrte Felder tragen den Tooltip TIP. Gesperrte Felder sendet htmx
|
|
* nicht mit.
|
|
*/
|
|
(function () {
|
|
'use strict';
|
|
|
|
var TIP = 'Für diese Eintragsart nicht relevant';
|
|
var WERT_LABEL = { percent: 'Prozentsatz (%)', absolute: 'Kürzung (€)', set: 'Neuer Betrag (€)' };
|
|
|
|
function sperren(el, gesperrt) {
|
|
if (!el) { return; }
|
|
el.disabled = gesperrt;
|
|
if (gesperrt) { el.title = TIP; } else { el.removeAttribute('title'); }
|
|
}
|
|
|
|
function feld(form, name) { return form.querySelector('[name="' + name + '"]'); }
|
|
|
|
function beschriften(form, cls, text) {
|
|
var el = form.querySelector('.' + cls);
|
|
if (el) { el.textContent = text; }
|
|
}
|
|
|
|
// Ziel-Typ: passende Auswahl (Kategorie oder Posten) zeigen und freigeben.
|
|
function zielTyp(select) {
|
|
var form = select.closest('form');
|
|
var istKategorie = select.value === 'category';
|
|
var kat = form.querySelector('.mod-target-category');
|
|
var rec = form.querySelector('.mod-target-recurring');
|
|
kat.style.display = istKategorie ? '' : 'none';
|
|
rec.style.display = istKategorie ? 'none' : '';
|
|
sperren(kat.querySelector('select'), !istKategorie);
|
|
sperren(rec.querySelector('select'), istKategorie);
|
|
}
|
|
|
|
function aenderungArt(select) {
|
|
var form = select.closest('form');
|
|
var art = select.value;
|
|
var mitWert = Object.prototype.hasOwnProperty.call(WERT_LABEL, art);
|
|
var wert = feld(form, 'value');
|
|
sperren(wert, !mitWert);
|
|
if (art === 'set') {
|
|
// Vorzeichenfalle: Ausgaben sind negativ (wie Fixposten-Beträge).
|
|
wert.placeholder = '-250,00';
|
|
wert.title = 'Neuer Betrag mit Vorzeichen (Ausgabe negativ)';
|
|
if (wert.value === '0') { wert.value = ''; }
|
|
} else {
|
|
wert.removeAttribute('placeholder');
|
|
}
|
|
beschriften(form, 'value-label', mitWert ? WERT_LABEL[art] : 'Wert');
|
|
sperren(feld(form, 'start_date'), art === 'ende');
|
|
beschriften(form, 'bis-label', art === 'ende' ? 'Endet am' : 'Gültig bis');
|
|
var typ = feld(form, 'target_type');
|
|
var kategorieOption = typ.querySelector('option[value="category"]');
|
|
// „Neuer Betrag" gibt es nur für Posten.
|
|
if (art === 'set') { typ.value = 'recurring'; }
|
|
kategorieOption.disabled = art === 'set';
|
|
zielTyp(typ);
|
|
}
|
|
|
|
function zahlungArt(select) {
|
|
var form = select.closest('form');
|
|
var einmal = select.value === 'einmal';
|
|
sperren(feld(form, 'due'), !einmal);
|
|
['rhythm', 'due_day', 'start_date', 'end_date'].forEach(function (name) {
|
|
sperren(feld(form, name), einmal);
|
|
});
|
|
form.setAttribute('hx-post', form.getAttribute(einmal ? 'data-planned-url' : 'data-recurring-url'));
|
|
if (window.htmx) { window.htmx.process(form); }
|
|
}
|
|
|
|
function init(root) {
|
|
root.querySelectorAll('.aenderung-form select[name="kind"]').forEach(aenderungArt);
|
|
root.querySelectorAll('.zahlung-form select.zahlung-art').forEach(zahlungArt);
|
|
}
|
|
|
|
window.FBSzenario = { zielTyp: zielTyp, aenderungArt: aenderungArt, zahlungArt: zahlungArt, init: init };
|
|
})();
|