From e21949affb715965cf197ac0787b2a7f87def830 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 27 May 2026 14:11:55 +0200 Subject: [PATCH] feat: erweitere Vokabelkurs mit neuen Zahlen und verbessere Sichtbarkeit der Zahlenreihen --- .gitea/workflows/deploy.yml | 29 +++++++++++++++---- backend/scripts/bisaya-course-plan-24-43.js | 12 ++++++-- frontend/src/views/social/VocabLessonView.vue | 14 +++++++-- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 3ed0217..73c686a 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -31,6 +31,7 @@ jobs: git diff --name-only "$BASE" "$HEAD" > changed-files.txt cat changed-files.txt 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 echo "force_deploy=true" >> "$GITHUB_OUTPUT" @@ -44,23 +45,30 @@ jobs: echo "changed=false" >> "$GITHUB_OUTPUT" 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 echo "frontend_changed=true" >> "$GITHUB_OUTPUT" else echo "frontend_changed=false" >> "$GITHUB_OUTPUT" fi - # Auch Kurs-/Didaktik-Scripts muessen vor dem Sync auf dem Server - # vorliegen; sie sind keine rein externen Datenartefakte. - if grep -E '^backend/' changed-files.txt >/dev/null; then + # Kurs-/Didaktik-Scripts werden vor dem Sync separat uebertragen. + # Fuer sie sind npm ci, Migrationen und ein Backend-Restart nicht noetig. + if grep -E '^backend/' changed-files.txt \ + | grep -Ev "$COURSE_SCRIPT_PATTERN" >/dev/null; then echo "backend_app_changed=true" >> "$GITHUB_OUTPUT" else echo "backend_app_changed=false" >> "$GITHUB_OUTPUT" fi # 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 >/dev/null; then + if grep -E '^(frontend/|backend/)' changed-files.txt \ + | grep -Ev "$COURSE_SCRIPT_PATTERN" >/dev/null; then echo "app_changed=true" >> "$GITHUB_OUTPUT" else echo "app_changed=false" >> "$GITHUB_OUTPUT" @@ -82,6 +90,17 @@ jobs: "${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \ "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 if: steps.vocab_course_changes.outputs.app_changed == 'true' || steps.vocab_course_changes.outputs.force_deploy == 'true' run: | diff --git a/backend/scripts/bisaya-course-plan-24-43.js b/backend/scripts/bisaya-course-plan-24-43.js index fb11894..4f2c887 100644 --- a/backend/scripts/bisaya-course-plan-24-43.js +++ b/backend/scripts/bisaya-course-plan-24-43.js @@ -845,6 +845,7 @@ const BISAYA_DIDACTICS_24_43_BASE = { const NUMBERS_DIDACTIC = { learningGoals: [ 'Zahlen bis 20 sicher abrufen.', + 'Zusammengesetzte Zahlen wie 21 und 25 nach einem Muster bilden.', 'Runde Zahlen (30,40,..90,100) erkennen und nutzen.', '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: '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: '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: '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' } ], + 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: [ { 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: [ - { title: 'Zähllektionen', text: 'Mindestens einmal pro Woche eine 3–5 Minuten Zählübung: 1–20, dann runde Zahlen.' } + { title: 'Zähllektionen', text: 'Mindestens einmal pro Woche eine 3–5 Minuten Zählübung: 1–20, dann 21, 25, 29 und runde Zahlen.' } ] }; BISAYA_DIDACTICS_24_43_BASE['Zahlen & Zählen (Woche 3)'] = mergeDidactics({}, NUMBERS_DIDACTIC); diff --git a/frontend/src/views/social/VocabLessonView.vue b/frontend/src/views/social/VocabLessonView.vue index 20318f7..af5a8ce 100644 --- a/frontend/src/views/social/VocabLessonView.vue +++ b/frontend/src/views/social/VocabLessonView.vue @@ -1742,8 +1742,18 @@ export default { pushUnique(item?.reference, item?.learning); }); - // Begrenzen, damit die Vorbereitungsrunde kompakt bleibt - return out.slice(0, 30); + // Zahlenreihen muessen vollstaendig sichtbar bleiben: Ein pauschales + // 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() { return this.prepItems[this.lessonPrepIndex] || null;