This commit is contained in:
team3
2026-07-27 12:47:32 +02:00
parent 1c8a4fd4fd
commit 41185eaccc
16 changed files with 582 additions and 230 deletions

View File

@@ -188,9 +188,16 @@ function problemeAn(feld, funktion = '', original = null) {
return props.probleme.filter(p =>
p.feld === feld &&
(p.funktion || '') === funktion &&
!p.ganzes_feld &&
(original === null || p.original === original))
}
// Umbau einer ganzen Liste: hängt unter der Feldüberschrift, nicht unter einer Zeile
function problemeFeld(feld, funktion = '') {
return props.probleme.filter(p =>
p.feld === feld && (p.funktion || '') === funktion && p.ganzes_feld)
}
// Bleibt die alte Zeile im Vorschlag stehen, kommt nur etwas dazu — sie ist in Ordnung
function fehlerAn(feld, funktion = '', original = null) {
return problemeAn(feld, funktion, original).some(p => vorschlagsArt(p) !== 'ergaenzen')
@@ -200,6 +207,8 @@ function fehlerAn(feld, funktion = '', original = null) {
// mehrere. Gesucht wird über den Text, nicht über den Index: bei mehreren Vorschlägen
// hintereinander hat sich die Liste schon verschoben.
function zeileAendern(text, p) {
// Leeres original: das Feld war leer, es gibt keine Zeile zum Anknüpfen
if (!p.original) return vorschlagsZeilen(p).map(z => `- ${z}`).join('\n')
const zeilen = text.split('\n')
const i = zeilen.findIndex(z => z.replace(/^[-*]\s*/, '').trim() === p.original)
if (i < 0) return null
@@ -227,6 +236,11 @@ function anwenden(p) {
ziel.art = p.vorschlag
} else if (p.feld === 'regeln' || p.feld === 'testen') {
if (typeof ziel[p.feld] !== 'string') return false // z. B. testen auf Kartenebene
if (p.ganzes_feld) {
// Umbau der ganzen Liste — einzelne Zeilen daraus wären nicht sinnvoll
ziel[p.feld] = vorschlagsZeilen(p).map(z => `- ${z}`).join('\n')
return true
}
const neu = zeileAendern(ziel[p.feld], p)
if (neu === null) return false // Zeile schon weg oder umgeschrieben
ziel[p.feld] = neu
@@ -317,6 +331,7 @@ function alleAblehnen() {
<!-- Karten-Regeln nur in der ausführlichen Ansicht -->
<section v-if="gross" :class="{ leer: !s.regeln && !istAktiv('regeln') }">
<p class="gruppe">Regeln</p>
<ProblemHinweis :probleme="problemeFeld('regeln')" @annehmen="annehmen" @ablehnen="ablehnen" />
<textarea
v-if="istAktiv('regeln')"
ref="feldRef"
@@ -388,6 +403,7 @@ function alleAblehnen() {
<!-- Regeln als Punktliste, ein Block je Funktion -->
<div v-if="istAktiv('regeln', i) || f.regeln" class="block">
<p class="mini">Regeln</p>
<ProblemHinweis :probleme="problemeFeld('regeln', f.text)" @annehmen="annehmen" @ablehnen="ablehnen" />
<textarea
v-if="istAktiv('regeln', i)"
ref="feldRef"
@@ -412,6 +428,7 @@ function alleAblehnen() {
<!-- Testen als nummerierte Schritte -->
<div v-if="istAktiv('testen', i) || f.testen" class="block">
<p class="mini">Testen</p>
<ProblemHinweis :probleme="problemeFeld('testen', f.text)" @annehmen="annehmen" @ablehnen="ablehnen" />
<textarea
v-if="istAktiv('testen', i)"
ref="feldRef"

View File

@@ -25,6 +25,7 @@ const text = (p) => (vorschlagsArt(p) === 'entfernen' ? p.original : p.vorschlag
<p class="vorschlag" :class="vorschlagsArt(p)">
<span v-if="zeichen(p)" class="zeichen">{{ zeichen(p) }}</span>{{ text(p) }}
</p>
<p v-if="p.regel" class="regel" :title="p.regel">{{ p.regel }}</p>
</div>
</template>
@@ -61,6 +62,15 @@ const text = (p) => (vorschlagsArt(p) === 'entfernen' ? p.original : p.vorschlag
white-space: pre-line; /* mehrzeilige Vorschläge bleiben mehrzeilig */
}
.vorschlag.entfernen { text-decoration: line-through; color: var(--dezent); }
/* Die belegte Katalogzeile — macht den Vorschlag nachprüfbar */
.regel {
margin: 0.15rem 0 0;
font-size: 0.72rem;
color: var(--dezent);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.zeichen {
display: inline-block;
width: 1rem;