feat(bisaya-course): add new 'Ort & Richtung' section with learning goals and practical tasks
All checks were successful
Deploy to production / deploy (push) Successful in 4m46s
All checks were successful
Deploy to production / deploy (push) Successful in 4m46s
- Introduced a new section for 'Ort & Richtung' in the Bisaya didactics, including learning goals, core patterns, grammar focus, speaking prompts, and practical tasks to enhance language learning. - Updated the lesson didactics to include the new section, ensuring comprehensive coverage of location and direction vocabulary.
This commit is contained in:
@@ -15,7 +15,13 @@
|
||||
{{ $t('socialnetwork.vocab.courses.quickReviewIntro', { count: reviewQueue.length }) }}
|
||||
</p>
|
||||
|
||||
<div v-if="reviewDone" class="review-done">
|
||||
<div v-if="reviewDone && reviewEmptyNoPatterns" class="review-done review-done--empty">
|
||||
<h3>{{ $t('socialnetwork.vocab.courses.quickReviewNoTermsTitle') }}</h3>
|
||||
<p>{{ $t('socialnetwork.vocab.courses.quickReviewNoTermsBody') }}</p>
|
||||
<button type="button" @click="backToCourse">{{ $t('socialnetwork.vocab.courses.quickReviewBackToCourse') }}</button>
|
||||
</div>
|
||||
|
||||
<div v-else-if="reviewDone" class="review-done">
|
||||
<h3>{{ $t('socialnetwork.vocab.courses.quickReviewDoneTitle') }}</h3>
|
||||
<p>{{ $t('socialnetwork.vocab.courses.quickReviewDoneScore', { correct: correctCount, total: reviewQueue.length }) }}</p>
|
||||
<button type="button" @click="backToCourse">{{ $t('socialnetwork.vocab.courses.quickReviewBackToCourse') }}</button>
|
||||
@@ -91,6 +97,8 @@ export default {
|
||||
needsFeedbackAck: false,
|
||||
correctCount: 0,
|
||||
reviewDone: false,
|
||||
/** Keine Kernmuster geladen — nicht mit normalem Abschluss verwechseln */
|
||||
reviewEmptyNoPatterns: false,
|
||||
weakVocabMap: {}
|
||||
};
|
||||
},
|
||||
@@ -280,6 +288,7 @@ export default {
|
||||
this.lesson = data;
|
||||
this.reviewQueue = this.buildQueue();
|
||||
if (this.reviewQueue.length === 0) {
|
||||
this.reviewEmptyNoPatterns = true;
|
||||
this.reviewDone = true;
|
||||
} else {
|
||||
this.setupCurrent();
|
||||
|
||||
@@ -239,10 +239,18 @@
|
||||
<span v-if="previousVocab && previousVocab.length > 0" class="mode-badge" :class="{ 'mode-active': vocabTrainerPhase === 'mixed' }">
|
||||
{{ $t('socialnetwork.vocab.courses.mixedReview') }}
|
||||
</span>
|
||||
<span class="mode-badge" :class="{ 'mode-active': vocabTrainerMode === 'multiple_choice', 'mode-completed': vocabTrainerMode === 'typing' }">
|
||||
<span
|
||||
class="mode-badge mode-clickable"
|
||||
:class="{ 'mode-active': vocabTrainerMode === 'multiple_choice', 'mode-completed': vocabTrainerMode === 'typing' }"
|
||||
@click="switchBackToMultipleChoice"
|
||||
>
|
||||
{{ $t('socialnetwork.vocab.courses.modeMultipleChoice') }}
|
||||
</span>
|
||||
<span class="mode-badge" :class="{ 'mode-active': vocabTrainerMode === 'typing' }">
|
||||
<span
|
||||
class="mode-badge mode-clickable"
|
||||
:class="{ 'mode-active': vocabTrainerMode === 'typing' }"
|
||||
@click="switchToTyping"
|
||||
>
|
||||
{{ $t('socialnetwork.vocab.courses.modeTyping') }}
|
||||
</span>
|
||||
<button @click="stopVocabTrainer" class="btn-stop-trainer">{{ $t('socialnetwork.vocab.courses.stopTrainer') }}</button>
|
||||
@@ -280,7 +288,7 @@
|
||||
</div>
|
||||
<!-- Texteingabe Modus -->
|
||||
<div v-if="vocabTrainerMode === 'typing' && (!vocabTrainerAnswered || !vocabTrainerLastCorrect)" class="vocab-answer-area typing">
|
||||
<div v-if="vocabTrainerAutoSwitchedToTyping" class="mode-switch-notice">
|
||||
<div class="mode-switch-notice">
|
||||
<button @click="switchBackToMultipleChoice" class="btn-switch-mode">
|
||||
{{ $t('socialnetwork.vocab.courses.switchBackToMultipleChoice') }}
|
||||
</button>
|
||||
@@ -3396,9 +3404,9 @@ export default {
|
||||
const isReviewLesson = ['review', 'vocab_review'].includes(lessonType)
|
||||
|| ['review', 'vocab_review', 'intensive_review'].includes(didacticMode);
|
||||
const switchAfterAttempts = isReviewLesson
|
||||
? Math.max(8, Math.ceil(this.trainerExerciseUnlockAttempts * 0.35))
|
||||
? Math.max(4, Math.ceil(this.trainerExerciseUnlockAttempts * 0.25))
|
||||
: this.trainerExerciseUnlockAttempts;
|
||||
const requiredSuccessRate = isReviewLesson ? 75 : 80;
|
||||
const requiredSuccessRate = isReviewLesson ? 70 : 80;
|
||||
|
||||
if (this.vocabTrainerMode === 'multiple_choice' && this.vocabTrainerTotalAttempts >= switchAfterAttempts) {
|
||||
const successRate = (this.vocabTrainerCorrect / this.vocabTrainerTotalAttempts) * 100;
|
||||
@@ -3427,6 +3435,15 @@ export default {
|
||||
// Starte neue Frage im Multiple Choice Modus
|
||||
this.nextVocabQuestion();
|
||||
},
|
||||
switchToTyping() {
|
||||
if (!this.vocabTrainerActive || this.vocabTrainerMode === 'typing') {
|
||||
return;
|
||||
}
|
||||
this.vocabTrainerMode = 'typing';
|
||||
this.vocabTrainerAutoSwitchedToTyping = false;
|
||||
this.vocabTrainerPool = [...this.trainableLessonVocab, ...this.vocabTrainerMixedPool];
|
||||
this.nextVocabQuestion();
|
||||
},
|
||||
getEquivalentVocabAnswers(prompt, direction, allVocabs) {
|
||||
const normalizedPrompt = this.normalizeVocab(prompt);
|
||||
const matches = [];
|
||||
@@ -5077,6 +5094,14 @@ export default {
|
||||
color: #6c757d;
|
||||
}
|
||||
|
||||
.mode-badge.mode-clickable {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.mode-badge.mode-clickable:hover {
|
||||
filter: brightness(0.98);
|
||||
}
|
||||
|
||||
.mode-badge.mode-active {
|
||||
background: var(--color-primary);
|
||||
color: #2b1f14;
|
||||
|
||||
Reference in New Issue
Block a user