refactor(bisaya-course): enhance pedagogy logic for German lessons
All checks were successful
Deploy to production / deploy (push) Successful in 2m57s

- Updated the `getGermanForBisayaLessonPedagogy` function to include lesson titles for improved didactic mode determination, specifically adding support for 'contrast_training'.
- Modified multiple scripts to utilize the updated pedagogy function, ensuring consistent application of the new logic across various course phases.
- Enhanced the VocabService to recognize and handle 'contrast_training' as a didactic mode, improving lesson management and user experience.
- Updated UI components to reflect the new didactic mode, ensuring clarity in lesson presentation.
This commit is contained in:
Torsten Schulz (local)
2026-04-01 15:52:53 +02:00
parent 10fc78e81d
commit 3ff8e4fc40
8 changed files with 63 additions and 8 deletions

View File

@@ -106,7 +106,7 @@ async function createGermanForBisayaCourse(ownerHashedId) {
for (const lessonData of ALL_GERMAN_FOR_BISAYA_LESSONS) {
const didactics = ALL_GERMAN_FOR_BISAYA_DIDACTICS[lessonData.title] || {};
const pedagogy = getGermanForBisayaLessonPedagogy(lessonData.num, lessonData.type);
const pedagogy = getGermanForBisayaLessonPedagogy(lessonData.num, lessonData.type, lessonData.title);
await VocabCourseLesson.create({
courseId: course.id,

View File

@@ -37,7 +37,7 @@ async function extendGermanForBisayaPhase3() {
if (existing) continue;
const didactics = GERMAN_FOR_BISAYA_PHASE3_DIDACTICS[lessonData.title] || {};
const pedagogy = getGermanForBisayaLessonPedagogy(lessonData.num, lessonData.type);
const pedagogy = getGermanForBisayaLessonPedagogy(lessonData.num, lessonData.type, lessonData.title);
await VocabCourseLesson.create({
courseId: course.id,

View File

@@ -37,7 +37,7 @@ async function extendGermanForBisayaPhase4() {
if (existing) continue;
const didactics = GERMAN_FOR_BISAYA_PHASE4_DIDACTICS[lessonData.title] || {};
const pedagogy = getGermanForBisayaLessonPedagogy(lessonData.num, lessonData.type);
const pedagogy = getGermanForBisayaLessonPedagogy(lessonData.num, lessonData.type, lessonData.title);
await VocabCourseLesson.create({
courseId: course.id,

View File

@@ -37,7 +37,7 @@ async function extendGermanForBisayaPhase5() {
if (existing) continue;
const didactics = GERMAN_FOR_BISAYA_PHASE5_DIDACTICS[lessonData.title] || {};
const pedagogy = getGermanForBisayaLessonPedagogy(lessonData.num, lessonData.type);
const pedagogy = getGermanForBisayaLessonPedagogy(lessonData.num, lessonData.type, lessonData.title);
await VocabCourseLesson.create({
courseId: course.id,

View File

@@ -1,14 +1,37 @@
export function getGermanForBisayaLessonPedagogy(lessonNumber, lessonType) {
function isContrastTrainingLesson(lessonType, lessonTitle = '') {
const normalizedType = String(lessonType || '').toLowerCase();
if (normalizedType !== 'grammar') {
return false;
}
const title = String(lessonTitle || '').toLowerCase();
return [
'kontrast',
'fehlertraining',
' / ',
'nicht / kein',
'der / die / das',
'wo / wohin',
'du / sie',
'haben / sein',
'ich bin / ich habe',
'ich bin / ich heiße / ich komme'
].some((marker) => title.includes(marker));
}
export function getGermanForBisayaLessonPedagogy(lessonNumber, lessonType, lessonTitle = '') {
const phaseLabel = lessonNumber <= 60 ? 'quickstart' : lessonNumber <= 120 ? 'daily_life' : 'stabilization';
const blockNumber = Math.ceil(lessonNumber / 10);
let didacticMode = 'core_input';
if (lessonType === 'conversation') didacticMode = 'guided_dialogue';
if (lessonType === 'grammar') didacticMode = 'pattern_drill';
if (isContrastTrainingLesson(lessonType, lessonTitle)) didacticMode = 'contrast_training';
if (lessonType === 'review') didacticMode = 'intensive_review';
if (lessonType === 'culture') didacticMode = 'real_life_scenario';
const difficultyWeight =
didacticMode === 'contrast_training' ? 3 :
lessonType === 'grammar' ? 3 :
lessonType === 'review' ? 2 :
lessonType === 'conversation' ? 2 :
@@ -16,6 +39,7 @@ export function getGermanForBisayaLessonPedagogy(lessonNumber, lessonType) {
const newUnitTarget =
lessonType === 'review' ? 2 :
didacticMode === 'contrast_training' ? 3 :
lessonType === 'grammar' ? 4 :
phaseLabel === 'quickstart' ? 6 :
phaseLabel === 'daily_life' ? 5 :
@@ -23,6 +47,7 @@ export function getGermanForBisayaLessonPedagogy(lessonNumber, lessonType) {
const reviewWeight =
lessonType === 'review' ? 90 :
didacticMode === 'contrast_training' ? 70 :
lessonType === 'grammar' ? 60 :
lessonType === 'vocab' ? 55 :
lessonType === 'culture' ? 20 :