feat: erweitere Vokabelkurs mit neuen Zahlen und verbessere Sichtbarkeit der Zahlenreihen
All checks were successful
Deploy to production / deploy (push) Successful in 2m30s

This commit is contained in:
Torsten Schulz (local)
2026-05-27 14:11:55 +02:00
parent cf007ffa51
commit e21949affb
3 changed files with 46 additions and 9 deletions

View File

@@ -31,6 +31,7 @@ jobs:
git diff --name-only "$BASE" "$HEAD" > changed-files.txt git diff --name-only "$BASE" "$HEAD" > changed-files.txt
cat changed-files.txt cat changed-files.txt
COMMIT_MESSAGE="$(git log -1 --pretty=%B "$HEAD" || true)" COMMIT_MESSAGE="$(git log -1 --pretty=%B "$HEAD" || true)"
COURSE_SCRIPT_PATTERN='^backend/scripts/.*(bisaya|course|didactics|vocab)'
if echo "$COMMIT_MESSAGE" | grep -qi '\[force-deploy\]'; then if echo "$COMMIT_MESSAGE" | grep -qi '\[force-deploy\]'; then
echo "force_deploy=true" >> "$GITHUB_OUTPUT" echo "force_deploy=true" >> "$GITHUB_OUTPUT"
@@ -44,23 +45,30 @@ jobs:
echo "changed=false" >> "$GITHUB_OUTPUT" echo "changed=false" >> "$GITHUB_OUTPUT"
fi fi
if grep -E "$COURSE_SCRIPT_PATTERN" changed-files.txt >/dev/null; then
echo "course_scripts_changed=true" >> "$GITHUB_OUTPUT"
else
echo "course_scripts_changed=false" >> "$GITHUB_OUTPUT"
fi
if grep -E '^frontend/' changed-files.txt >/dev/null; then if grep -E '^frontend/' changed-files.txt >/dev/null; then
echo "frontend_changed=true" >> "$GITHUB_OUTPUT" echo "frontend_changed=true" >> "$GITHUB_OUTPUT"
else else
echo "frontend_changed=false" >> "$GITHUB_OUTPUT" echo "frontend_changed=false" >> "$GITHUB_OUTPUT"
fi fi
# Auch Kurs-/Didaktik-Scripts muessen vor dem Sync auf dem Server # Kurs-/Didaktik-Scripts werden vor dem Sync separat uebertragen.
# vorliegen; sie sind keine rein externen Datenartefakte. # Fuer sie sind npm ci, Migrationen und ein Backend-Restart nicht noetig.
if grep -E '^backend/' changed-files.txt >/dev/null; then if grep -E '^backend/' changed-files.txt \
| grep -Ev "$COURSE_SCRIPT_PATTERN" >/dev/null; then
echo "backend_app_changed=true" >> "$GITHUB_OUTPUT" echo "backend_app_changed=true" >> "$GITHUB_OUTPUT"
else else
echo "backend_app_changed=false" >> "$GITHUB_OUTPUT" echo "backend_app_changed=false" >> "$GITHUB_OUTPUT"
fi fi
# App-Code-Änderungen, die einen echten Deploy benötigen # App-Code-Änderungen, die einen echten Deploy benötigen
# Backend-Sync-Scripts müssen vor ihrem Einsatz deployed werden. if grep -E '^(frontend/|backend/)' changed-files.txt \
if grep -E '^(frontend/|backend/)' changed-files.txt >/dev/null; then | grep -Ev "$COURSE_SCRIPT_PATTERN" >/dev/null; then
echo "app_changed=true" >> "$GITHUB_OUTPUT" echo "app_changed=true" >> "$GITHUB_OUTPUT"
else else
echo "app_changed=false" >> "$GITHUB_OUTPUT" echo "app_changed=false" >> "$GITHUB_OUTPUT"
@@ -82,6 +90,17 @@ jobs:
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \ "${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
"echo SSH OK" "echo SSH OK"
- name: Deploy vocab course scripts without app rebuild
if: steps.vocab_course_changes.outputs.course_scripts_changed == 'true' && steps.vocab_course_changes.outputs.backend_app_changed != 'true' && steps.vocab_course_changes.outputs.force_deploy != 'true'
shell: bash
run: |
set -euo pipefail
tar -czf - backend/scripts \
| ssh -i ~/.ssh/id_ed25519 \
-p "${{ secrets.PROD_PORT }}" \
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
"sudo -n -u yourpart tar -xzf - -C /opt/yourpart"
- name: Run deployment script - name: Run deployment script
if: steps.vocab_course_changes.outputs.app_changed == 'true' || steps.vocab_course_changes.outputs.force_deploy == 'true' if: steps.vocab_course_changes.outputs.app_changed == 'true' || steps.vocab_course_changes.outputs.force_deploy == 'true'
run: | run: |

View File

@@ -845,6 +845,7 @@ const BISAYA_DIDACTICS_24_43_BASE = {
const NUMBERS_DIDACTIC = { const NUMBERS_DIDACTIC = {
learningGoals: [ learningGoals: [
'Zahlen bis 20 sicher abrufen.', 'Zahlen bis 20 sicher abrufen.',
'Zusammengesetzte Zahlen wie 21 und 25 nach einem Muster bilden.',
'Runde Zahlen (30,40,..90,100) erkennen und nutzen.', 'Runde Zahlen (30,40,..90,100) erkennen und nutzen.',
'Große Zahlen (200, 1000, 2000) in Preisen und Mengen verstehen.' 'Große Zahlen (200, 1000, 2000) in Preisen und Mengen verstehen.'
], ],
@@ -853,16 +854,23 @@ const NUMBERS_DIDACTIC = {
{ target: 'Unom', gloss: 'sechs' }, { target: 'Pito', gloss: 'sieben' }, { target: 'Walo', gloss: 'acht' }, { target: 'Siyam', gloss: 'neun' }, { target: 'Napulo', gloss: 'zehn' }, { target: 'Unom', gloss: 'sechs' }, { target: 'Pito', gloss: 'sieben' }, { target: 'Walo', gloss: 'acht' }, { target: 'Siyam', gloss: 'neun' }, { target: 'Napulo', gloss: 'zehn' },
{ target: 'Napulo ug usa', gloss: 'elf' }, { target: 'Napulo ug duha', gloss: 'zwölf' }, { target: 'Napulo ug tulo', gloss: 'dreizehn' }, { target: 'Napulo ug upat', gloss: 'vierzehn' }, { target: 'Napulo ug lima', gloss: 'fünfzehn' }, { target: 'Napulo ug usa', gloss: 'elf' }, { target: 'Napulo ug duha', gloss: 'zwölf' }, { target: 'Napulo ug tulo', gloss: 'dreizehn' }, { target: 'Napulo ug upat', gloss: 'vierzehn' }, { target: 'Napulo ug lima', gloss: 'fünfzehn' },
{ target: 'Napulo ug unom', gloss: 'sechzehn' }, { target: 'Napulo ug pito', gloss: 'siebzehn' }, { target: 'Napulo ug walo', gloss: 'achtzehn' }, { target: 'Napulo ug siyam', gloss: 'neunzehn' }, { target: 'Baynte', gloss: 'zwanzig' }, { target: 'Napulo ug unom', gloss: 'sechzehn' }, { target: 'Napulo ug pito', gloss: 'siebzehn' }, { target: 'Napulo ug walo', gloss: 'achtzehn' }, { target: 'Napulo ug siyam', gloss: 'neunzehn' }, { target: 'Baynte', gloss: 'zwanzig' },
{ target: 'Kaluhaan ug usa', gloss: 'einundzwanzig' }, { target: 'Kaluhaan ug lima', gloss: 'fünfundzwanzig' }, { target: 'Kaluhaan ug siyam', gloss: 'neunundzwanzig' },
{ target: 'Katloan ug usa', gloss: 'einunddreißig' }, { target: 'Katloan ug lima', gloss: 'fünfunddreißig' }, { target: 'Kalim-an ug walo', gloss: 'achtundfünfzig' },
{ target: 'Traysenta', gloss: 'dreißig' }, { target: 'Kwarenta', gloss: 'vierzig' }, { target: 'Singkwenta', gloss: 'fünfzig' }, { target: 'Sesenta', gloss: 'sechzig' }, { target: 'Setenta', gloss: 'siebzig' }, { target: 'Traysenta', gloss: 'dreißig' }, { target: 'Kwarenta', gloss: 'vierzig' }, { target: 'Singkwenta', gloss: 'fünfzig' }, { target: 'Sesenta', gloss: 'sechzig' }, { target: 'Setenta', gloss: 'siebzig' },
{ target: 'Otsenta', gloss: 'achtzig' }, { target: 'Nobenta', gloss: 'neunzig' }, { target: 'Usa ka gatos', gloss: 'einhundert' }, { target: 'Duha ka gatos', gloss: 'zweihundert' }, { target: 'Otsenta', gloss: 'achtzig' }, { target: 'Nobenta', gloss: 'neunzig' }, { target: 'Usa ka gatos', gloss: 'einhundert' }, { target: 'Duha ka gatos', gloss: 'zweihundert' },
{ target: 'Usa ka libo', gloss: 'tausend' }, { target: 'Duha ka libo', gloss: 'zweitausend' } { target: 'Usa ka libo', gloss: 'tausend' }, { target: 'Duha ka libo', gloss: 'zweitausend' }
], ],
grammarFocus: [
{ title: '11 bis 19', text: 'Bei der nativen Bildung steht zuerst zehn und danach mit „ug“ die Einerzahl.', example: 'Napulo ug usa = elf; Napulo ug lima = fünfzehn.' },
{ title: 'Zahlen über 20', text: 'Dasselbe Muster funktioniert mit höheren Zehnern: Zehner + „ug“ + Einer. Bei Preisen hört man zusätzlich oft spanisch geprägte Kurzformen wie „baynte“.', example: 'Kaluhaan ug lima = fünfundzwanzig; Baynte = zwanzig.' }
],
speakingPrompts: [ speakingPrompts: [
{ title: 'Zähle bis 20', prompt: 'Zähle laut von Usa bis Baynte.' }, { title: 'Zähle bis 20', prompt: 'Zähle laut von Usa bis Baynte.' },
{ title: 'Preisangaben', prompt: 'Nenne Preise mit Zahlwörtern, z.B. Singkwenta, Usa ka gatos oder Duha ka libo.' } { title: 'Zusammengesetzte Zahlen', prompt: 'Nenne 21, 25, 29, 31, 35 und 58 mit dem Muster Zehner + ug + Einer.', cue: 'Kaluhaan ug usa. Kaluhaan ug lima. Katloan ug usa.' },
{ title: 'Preisangaben', prompt: 'Nenne Preise mit Zahlwörtern, z.B. Kaluhaan ug lima, Singkwenta, Usa ka gatos oder Duha ka libo.' }
], ],
practicalTasks: [ practicalTasks: [
{ title: 'Zähllektionen', text: 'Mindestens einmal pro Woche eine 35 Minuten Zählübung: 120, dann runde Zahlen.' } { title: 'Zähllektionen', text: 'Mindestens einmal pro Woche eine 35 Minuten Zählübung: 120, dann 21, 25, 29 und runde Zahlen.' }
] ]
}; };
BISAYA_DIDACTICS_24_43_BASE['Zahlen & Zählen (Woche 3)'] = mergeDidactics({}, NUMBERS_DIDACTIC); BISAYA_DIDACTICS_24_43_BASE['Zahlen & Zählen (Woche 3)'] = mergeDidactics({}, NUMBERS_DIDACTIC);

View File

@@ -1742,8 +1742,18 @@ export default {
pushUnique(item?.reference, item?.learning); pushUnique(item?.reference, item?.learning);
}); });
// Begrenzen, damit die Vorbereitungsrunde kompakt bleibt // Zahlenreihen muessen vollstaendig sichtbar bleiben: Ein pauschales
return out.slice(0, 30); // Limit wuerde bei gemischten Checkpoints die Beispiele 11-19 und
// zusammengesetzte Zahlen wie 21/25 abschneiden.
const numberGlosses = new Set([
'eins', 'zwei', 'drei', 'vier', 'fünf', 'sechs', 'sieben', 'acht', 'neun', 'zehn',
'elf', 'zwölf', 'dreizehn', 'vierzehn', 'fünfzehn', 'sechzehn', 'siebzehn',
'achtzehn', 'neunzehn', 'zwanzig', 'einundzwanzig', 'fünfundzwanzig'
]);
const numberPatternCount = this.normalizedCorePatterns.filter((pattern) =>
numberGlosses.has(String(pattern?.gloss || '').trim().toLowerCase())
).length;
return numberPatternCount >= 10 ? out : out.slice(0, 30);
}, },
currentPrepItem() { currentPrepItem() {
return this.prepItems[this.lessonPrepIndex] || null; return this.prepItems[this.lessonPrepIndex] || null;