feat(vocabService, VocabPracticeDialog, VocabLessonView): enhance vocabulary handling and exposure tracking
All checks were successful
Deploy to production / deploy (push) Successful in 2m51s

- Updated vocabService to merge extracted vocabularies and improve handling of learning and reference pairs.
- Introduced normalization and exposure tracking in VocabPracticeDialog to ensure diverse and underexposed vocabulary practice.
- Enhanced VocabLessonView with methods to identify underexposed vocabularies and adjust selection logic for improved learning outcomes.
- Implemented new constants for minimum exposure requirements to optimize vocabulary training sessions.
This commit is contained in:
Torsten Schulz (local)
2026-04-17 08:58:50 +02:00
parent d119869750
commit 54a77c2e08
5 changed files with 139 additions and 14 deletions

View File

@@ -614,6 +614,14 @@ export default class VocabService {
const practicalTasks = Array.isArray(lesson?.practicalTasks) ? lesson.practicalTasks : [];
const corePatterns = Array.isArray(lesson?.corePatterns) ? lesson.corePatterns : [];
corePatterns.forEach((entry) => {
const pattern = this._normalizeCorePatternEntry(entry);
const reference = String(pattern?.target || '').trim();
const learning = String(pattern?.gloss || '').trim();
if (!learning || !reference || learning === reference) return;
vocabMap.set(`${learning}-${reference}`, { learning, reference });
});
speakingPrompts.forEach((prompt, index) => {
const learning = String(prompt?.prompt || prompt?.title || '').trim();
const refEntry = corePatterns[index] ?? corePatterns[0];
@@ -1488,9 +1496,12 @@ export default class VocabService {
const extractedFromExercises = this._extractTrainerVocabsFromExercises(
(lesson.grammarExercises || []).map((exercise) => exercise.get({ plain: true }))
);
const vocabs = extractedFromExercises.length > 0
? extractedFromExercises
: this._extractTrainerVocabsFromLessonDidactics(lesson.get({ plain: true }));
const fallbackVocabs = this._extractTrainerVocabsFromLessonDidactics(lesson.get({ plain: true }));
const mergedVocabs = new Map();
[...fallbackVocabs, ...extractedFromExercises].forEach((entry) => {
if (!entry?.learning || !entry?.reference) return;
mergedVocabs.set(`${entry.learning}-${entry.reference}`, entry);
});
return {
lesson: {
@@ -1499,7 +1510,7 @@ export default class VocabService {
courseId: lesson.courseId,
courseTitle: lesson.course.title
},
vocabs
vocabs: Array.from(mergedVocabs.values())
};
}