@project-sunbird/collection-editor-react 1.0.11 → 1.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,9 @@
1
+ import { default as React } from 'react';
2
+ import { INode } from '../../types/editor';
3
+ interface LevelCourseItemProps {
4
+ item: INode;
5
+ onRemove: (id: string) => void;
6
+ isEditable: boolean;
7
+ }
8
+ export declare const LevelCourseItem: React.FC<LevelCourseItemProps>;
9
+ export {};
@@ -0,0 +1,7 @@
1
+ import { default as React } from 'react';
2
+ interface LevelExamItemProps {
3
+ levelId: string | null | undefined;
4
+ isEditable: boolean;
5
+ }
6
+ export declare const LevelExamItem: React.FC<LevelExamItemProps>;
7
+ export {};
@@ -0,0 +1,18 @@
1
+ import { INode } from '../types/editor';
2
+ export interface UseLevelExamResult {
3
+ course: INode | undefined;
4
+ filled: boolean;
5
+ courseName: string | undefined;
6
+ isActiveTarget: boolean;
7
+ armExam: () => void;
8
+ deleteExam: () => void;
9
+ }
10
+ /**
11
+ * Level Exam course for a single content Level — the optional, at-most-one
12
+ * course (canAddCourseToLevel already caps it) whose leaves are purely a
13
+ * question set, used to determine the learner's outcome for THIS Level
14
+ * specifically (distinct from the Prior/Outcome Assessments, which gate the
15
+ * whole path). Mirrors useAssessmentSlots.ts's shape, scoped to one Level
16
+ * (by id) instead of root's pinned pre/post positions.
17
+ */
18
+ export declare function useLevelExam(levelId: string | null | undefined): UseLevelExamResult;
@@ -1,12 +1,17 @@
1
1
  import { LibraryFilters } from '../components/LibraryDock/LibraryFilterPanel';
2
2
  /**
3
- * LP profile library filters: search is strictly constrained to Courses.
4
- * Filling the pre/post assessment slot has no competency constraint (the
5
- * prior assessment *defines* the skill scope, so it can't be filtered by
6
- * it). Browsing a Level otherwise shows every Course by default, narrowed
7
- * to the selected skills once the author has picked any.
3
+ * LP profile library filters: search is strictly constrained to Courses, or
4
+ * to Evaluation Course specifically while picking the Prior/Outcome slot or
5
+ * a Level Exam course (isPickingEvaluationCourse) — a course can only ever
6
+ * fill those roles by being authored under that category (see
7
+ * isEvaluationCourse). Filling the pre/post assessment slot additionally has
8
+ * no competency constraint (the prior assessment *defines* the skill scope,
9
+ * so it can't be filtered by it) — a Level Exam pick, by contrast, IS still
10
+ * narrowed by the Level's selected skills, same as any other course added to
11
+ * that Level. Browsing a Level otherwise shows every Course by default,
12
+ * narrowed to the selected skills once the author has picked any.
8
13
  */
9
- export declare function buildLpLibraryFilters(activeAssessmentSlot: 'pre' | 'post' | null, selectedSkills: string[], skillCategoryCode: string | undefined, frameworkId?: string): Record<string, unknown>;
14
+ export declare function buildLpLibraryFilters(activeAssessmentSlot: 'pre' | 'post' | null, isPickingEvaluationCourse: boolean, selectedSkills: string[], skillCategoryCode: string | undefined, frameworkId?: string): Record<string, unknown>;
10
15
  /**
11
16
  * LP profile search fields: append the resolved skill-category code so each
12
17
  * returned course carries its own skill tags in `metadata` — Skills
@@ -23,14 +28,21 @@ export declare function buildSearchFields(competencyScoped: boolean, skillCatego
23
28
  * there's no framework to scope search by, and with no skills selected on a
24
29
  * content Level there's nothing to filter by, so browsing must show nothing
25
30
  * rather than every course. Doesn't apply to Collection, root, an assessment
26
- * Level, or while filling the Prior/Outcome Assessment slot (that course
27
- * *defines* the skill scope, so it can't be filtered by it).
31
+ * Level, or while picking an Evaluation Course for the Prior/Outcome
32
+ * Assessment slot or a Level Exam — that course *defines* the skill scope
33
+ * (and isn't required to belong to any particular Curriculum), so neither
34
+ * gate applies while filling it. isPickingEvaluationCourse mirrors
35
+ * useLibrary's own activeAssessmentSlot-or-activeLevelExamTarget check.
28
36
  */
29
- export declare function computeLibraryEmptyReason(competencyScoped: boolean, frameworkId: string | undefined, isLpLevel: boolean, activeAssessmentSlot: 'pre' | 'post' | null, selectedSkills: string[]): 'noCurriculum' | 'noSkills' | null;
37
+ export declare function computeLibraryEmptyReason(competencyScoped: boolean, frameworkId: string | undefined, isLpLevel: boolean, activeAssessmentSlot: 'pre' | 'post' | null, selectedSkills: string[], isPickingEvaluationCourse?: boolean): 'noCurriculum' | 'noSkills' | null;
30
38
  /**
31
39
  * Returns allowed primaryCategory values for the currently selected unit,
32
40
  * driven by editorConfig.config.hierarchy.levelN.children.Content.
33
41
  * Falls back to the full LIBRARY_PRIMARY_CATEGORIES constant.
42
+ *
43
+ * An Evaluation Course profile overrides this entirely, at every depth
44
+ * (root or any Course Unit) — its content must be Question Sets or ECML
45
+ * assessment content only, never regular course material.
34
46
  */
35
47
  export declare function useAllowedCategories(): string[];
36
48
  export declare function useLibrary(): {
@@ -275,6 +275,7 @@ declare const _default: {
275
275
  "itemAddedToast": "تمت إضافة \"{name}\"",
276
276
  "collapseLibraryPanelAriaLabel": "طي لوحة المكتبة",
277
277
  "collapseLibraryTitle": "طي المكتبة",
278
+ "cancelTargetAriaLabel": "إلغاء — العودة إلى التصفح",
278
279
  "headerTitle": "المكتبة",
279
280
  "searchPlaceholder": "البحث في المحتوى…",
280
281
  "searchAriaLabel": "البحث في المكتبة",
@@ -469,16 +470,21 @@ declare const _default: {
469
470
  "outcomeCheckBadge": "فحص النتيجة",
470
471
  "assessmentCourseMeta": "مقرر · بنك أسئلة فقط",
471
472
  "addAssessmentSlotButton": "إضافة {label} — مقرر يحتوي على بنك أسئلة فقط",
473
+ "addCourseToLevelButton": "إضافة مقرر إلى هذا المستوى",
474
+ "addLevelExamButton": "إضافة اختبار المستوى — مقرر يحتوي على بنك أسئلة فقط",
475
+ "levelExamMeta": "اختبار المستوى · بنك أسئلة فقط",
472
476
  "requiredSlotBadge": "مطلوب",
473
477
  "removeAssessmentSlotButton": "إزالة",
474
478
  "deletePriorAssessmentConfirm": "حذف التقييم المسبق يزيل الدرجة التي يعتمد عليها التخطي التكيفي لهذا المسار. هل تريد الاستمرار؟",
475
479
  "deleteAssessmentSlotConfirm": "هل تريد إزالة مقرر التقييم هذا من المسار؟",
480
+ "deleteLevelExamConfirm": "هل تريد إزالة مقرر اختبار المستوى هذا من المستوى؟",
476
481
  "deleteLevelConfirm": "هل تريد حذف \"{name}\" وكل ما يحتويه؟",
477
482
  "deleteCourseConfirm": "هل تريد إزالة هذا المقرر من المسار؟",
478
483
  "deleteMultipleConfirm": "هل تريد حذف {count} من العناصر المحددة من المسار؟",
479
484
  "courseNameUnavailable": "تفاصيل المقرر غير متوفرة",
480
- "notAssessmentCourseToast": "\"{name}\" ليس مقررًا يحتوي على بنك أسئلة فقط، لذا لا يمكن استخدامه كتقييم.",
485
+ "notAssessmentCourseToast": "\"{name}\" ليس مقرر تقييم (Evaluation Course)، لذا لا يمكن استخدامه كتقييم.",
481
486
  "bothSlotsFilledToast": "تم تعبئة تقييمي المسبق والنتائج بالفعل.",
487
+ "levelExamAlreadyFilledToast": "يحتوي هذا المستوى بالفعل على مقرر اختبار المستوى — أزِله قبل إضافة مقرر آخر.",
482
488
  "assessmentCheckFailedToast": "تعذر التحقق من هذا المقرر. حاول مرة أخرى.",
483
489
  "skillsHeading": "المهارات",
484
490
  "skillsOutOfScopeWarning": "خارج النطاق، يرجى إعادة الاختيار: {skills}",
@@ -528,11 +534,12 @@ declare const _default: {
528
534
  "outcomeAssessmentExplainerBody": "النجاح في بنك الأسئلة هذا هو ما يُصادق على اكتساب المهارة للمسار بأكمله — ودرجته هي ما تظهر في شهادة المتعلم.",
529
535
  "outcomeUnlocksHint": "يُفتح بعد المستوى الأخير",
530
536
  "assessmentCourseSectionTitle": "المقرر",
531
- "assessmentCourseSectionDescription": "مقرر واحد يكون محتواه الوحيد بنك أسئلة — لا تنتمي هنا أي أنواع محتوى أخرى.",
537
+ "assessmentCourseSectionDescription": "مقرر تقييم واحد (Evaluation Course) — لا يمكن أن يكون محتواه سوى بنوك أسئلة أو تقييم مقرر، وليس أي أنواع محتوى أخرى.",
532
538
  "libraryOpenLevelToAdd": "افتح مستوى للإضافة",
533
539
  "libraryAddToLevel": "إضافة إلى {level}",
534
540
  "libraryAddPriorAssessmentCourse": "إضافة مقرر التقييم المسبق",
535
541
  "libraryAddOutcomeAssessmentCourse": "إضافة مقرر تقييم النتائج",
542
+ "libraryAddLevelExamCourse": "إضافة مقرر اختبار المستوى لـ {level}",
536
543
  "policyStrictLabel": "صارمة",
537
544
  "policyStrictDescription": "يُنهي كل متعلم كل مستوى، بالترتيب — بصرف النظر عن درجة التقييم المسبق.",
538
545
  "policyAdaptiveLabel": "تكيفية",
@@ -553,9 +560,16 @@ declare const _default: {
553
560
  "dropOntoPathError": "أفلِت المقررات على مستوى، وليس على مسار التعلم مباشرة.",
554
561
  "priorSlotFilledToast": "التقييم المسبق يحتوي على مقرر بالفعل — أزِله قبل إضافة مقرر آخر.",
555
562
  "outcomeSlotFilledToast": "التقييم الختامي يحتوي على مقرر بالفعل — أزِله قبل إضافة مقرر آخر.",
563
+ "levelNeedsMixedContentToast": "هذا المستوى هو الأول أو الأخير في المسار — مقرر يحتوي فقط على بنك أسئلة كمحتوى وحيد له سيُعامل كتقييم مسبق/ختامي. أضف مقررًا آخر، أو مقررًا يحتوي على أكثر من بنك الأسئلة فقط.",
564
+ "cannotRemoveLastRegularCourseToast": "هذا المستوى هو الأول أو الأخير في المسار — إزالة هذا المقرر ستترك فقط مقرر اختبار المستوى، وسيتم التعامل معه كتقييم مسبق/ختامي. أضف مقررًا آخر أولاً.",
556
565
  "coursesRemovedFrameworkChangeToast": "تمت إزالة {count} من المقررات المرتبطة بمنهج مختلف من هذا المسار.",
557
566
  "levelSkillsResetFrameworkChangeToast": "تم مسح المهارات المختارة في {count} من المستويات — فهي لا تنطبق على المنهج الجديد.",
558
- "priorAssessmentNarrowedScopeToast": "أدى التقييم المسبق إلى تضييق نطاق المهارات — أصبح لدى {count} من المستويات مهارات خارج هذا النطاق."
567
+ "priorAssessmentNarrowedScopeToast": "أدى التقييم المسبق إلى تضييق نطاق المهارات — أصبح لدى {count} من المستويات مهارات خارج هذا النطاق.",
568
+ "coursesCardHeading": "المقررات",
569
+ "coursesCardDescription": "المقررات التي يُتمّها المتعلم لاجتياز هذا المستوى — قد يتضمن كل مقرر تقييماته الخاصة. اسحب المقبض لإعادة الترتيب، واستخدم القائمة للإزالة.",
570
+ "coursesEmptyHint": "لم تتم الإضافة بعد — اختر مقررًا من المكتبة.",
571
+ "courseMetaLabel": "مقرر",
572
+ "removeFromLevelMenuItem": "إزالة من المستوى"
559
573
  }
560
574
  }
561
575
  ;
@@ -275,6 +275,7 @@ declare const _default: {
275
275
  "itemAddedToast": "Added \"{name}\"",
276
276
  "collapseLibraryPanelAriaLabel": "Collapse library panel",
277
277
  "collapseLibraryTitle": "Collapse library",
278
+ "cancelTargetAriaLabel": "Cancel — go back to browsing",
278
279
  "headerTitle": "Library",
279
280
  "searchPlaceholder": "Search content…",
280
281
  "searchAriaLabel": "Search library",
@@ -471,14 +472,19 @@ declare const _default: {
471
472
  "addAssessmentSlotButton": "Add {label} — a course with only a question set",
472
473
  "requiredSlotBadge": "Required",
473
474
  "removeAssessmentSlotButton": "Remove",
475
+ "addCourseToLevelButton": "Add Course to this level",
476
+ "addLevelExamButton": "Add Level Exam — a course with only a question set",
477
+ "levelExamMeta": "Level Exam · Question set only",
474
478
  "deletePriorAssessmentConfirm": "Deleting the Prior Assessment removes the score this path's Adaptive skips are based on. Continue?",
475
479
  "deleteAssessmentSlotConfirm": "Remove this assessment course from the path?",
480
+ "deleteLevelExamConfirm": "Remove this Level Exam course from the level?",
476
481
  "deleteLevelConfirm": "Delete \"{name}\" and everything in it?",
477
482
  "deleteCourseConfirm": "Remove this course from the path?",
478
483
  "deleteMultipleConfirm": "Delete {count} selected items from the path?",
479
484
  "courseNameUnavailable": "Course details unavailable",
480
- "notAssessmentCourseToast": "\"{name}\" isn't a question-set-only course, so it can't be used as an assessment.",
485
+ "notAssessmentCourseToast": "\"{name}\" isn't an Evaluation Course, so it can't be used as an assessment.",
481
486
  "bothSlotsFilledToast": "Both Prior and Outcome Assessment slots are already filled.",
487
+ "levelExamAlreadyFilledToast": "This level already has a Level Exam course — remove it before adding a different one.",
482
488
  "assessmentCheckFailedToast": "Could not verify this course. Please try again.",
483
489
  "skillsHeading": "Skills",
484
490
  "skillsOutOfScopeWarning": "Out of scope, please re-select: {skills}",
@@ -528,11 +534,12 @@ declare const _default: {
528
534
  "outcomeAssessmentExplainerBody": "Passing this question set is what certifies the skill gain for the whole path — its score is what appears on the learner's certificate.",
529
535
  "outcomeUnlocksHint": "Unlocks after the last level",
530
536
  "assessmentCourseSectionTitle": "Course",
531
- "assessmentCourseSectionDescription": "A single course whose only content is a question set — no other content types belong here.",
537
+ "assessmentCourseSectionDescription": "A single Evaluation Course — its content can only be Question Sets or Course Assessment, never other content types.",
532
538
  "libraryOpenLevelToAdd": "Open a level to add",
533
539
  "libraryAddToLevel": "Add to {level}",
534
540
  "libraryAddPriorAssessmentCourse": "Add Prior Assessment course",
535
541
  "libraryAddOutcomeAssessmentCourse": "Add Outcome Assessment course",
542
+ "libraryAddLevelExamCourse": "Add Level Exam course for {level}",
536
543
  "policyStrictLabel": "Strict",
537
544
  "policyStrictDescription": "Every learner completes every level, in order — regardless of prior assessment score.",
538
545
  "policyAdaptiveLabel": "Adaptive",
@@ -553,9 +560,16 @@ declare const _default: {
553
560
  "dropOntoPathError": "Drop courses onto a level, not directly on the learning path.",
554
561
  "priorSlotFilledToast": "The Prior Assessment already has a course — remove it before adding a different one.",
555
562
  "outcomeSlotFilledToast": "The Outcome Assessment already has a course — remove it before adding a different one.",
563
+ "levelNeedsMixedContentToast": "This level is first or last in the path — a question-set-only course as its only content will be treated as a Prior/Outcome Assessment. Add another course, or one with more than just question sets.",
564
+ "cannotRemoveLastRegularCourseToast": "This level is first or last in the path — removing this course would leave only the Level Exam course, and it would be treated as a Prior/Outcome Assessment. Add another course first.",
556
565
  "coursesRemovedFrameworkChangeToast": "{count} course(s) tagged to a different curriculum were removed from this path.",
557
566
  "levelSkillsResetFrameworkChangeToast": "{count} Level(s) had their selected skills cleared — they don't apply to the new curriculum.",
558
- "priorAssessmentNarrowedScopeToast": "The Prior Assessment narrowed the skill scope — {count} Level(s) now have skills outside it."
567
+ "priorAssessmentNarrowedScopeToast": "The Prior Assessment narrowed the skill scope — {count} Level(s) now have skills outside it.",
568
+ "coursesCardHeading": "Courses",
569
+ "coursesCardDescription": "Courses a learner completes to clear this level — each course may include its own assessments internally. Drag the handle to reorder, use the menu to remove.",
570
+ "coursesEmptyHint": "Not added yet — pick a course from the Library.",
571
+ "courseMetaLabel": "Course",
572
+ "removeFromLevelMenuItem": "Remove from level"
559
573
  }
560
574
  }
561
575
  ;
@@ -275,6 +275,7 @@ declare const _default: {
275
275
  "itemAddedToast": "« {name} » ajouté",
276
276
  "collapseLibraryPanelAriaLabel": "Réduire le panneau de la bibliothèque",
277
277
  "collapseLibraryTitle": "Réduire la bibliothèque",
278
+ "cancelTargetAriaLabel": "Annuler — revenir à la navigation",
278
279
  "headerTitle": "Bibliothèque",
279
280
  "searchPlaceholder": "Rechercher du contenu…",
280
281
  "searchAriaLabel": "Rechercher dans la bibliothèque",
@@ -469,16 +470,21 @@ declare const _default: {
469
470
  "outcomeCheckBadge": "Vérification du résultat",
470
471
  "assessmentCourseMeta": "Cours · Questionnaire uniquement",
471
472
  "addAssessmentSlotButton": "Ajouter {label} — un cours contenant uniquement un questionnaire",
473
+ "addCourseToLevelButton": "Ajouter un cours à ce niveau",
474
+ "addLevelExamButton": "Ajouter l'examen de niveau — un cours contenant uniquement un questionnaire",
475
+ "levelExamMeta": "Examen de niveau · Questionnaire uniquement",
472
476
  "requiredSlotBadge": "Obligatoire",
473
477
  "removeAssessmentSlotButton": "Retirer",
474
478
  "deletePriorAssessmentConfirm": "Supprimer l'évaluation préalable retire le score sur lequel se basent les sauts adaptatifs de ce parcours. Continuer ?",
475
479
  "deleteAssessmentSlotConfirm": "Retirer ce cours d'évaluation du parcours ?",
480
+ "deleteLevelExamConfirm": "Retirer ce cours d'examen de niveau du niveau ?",
476
481
  "deleteLevelConfirm": "Supprimer « {name} » et tout son contenu ?",
477
482
  "deleteCourseConfirm": "Retirer ce cours du parcours ?",
478
483
  "deleteMultipleConfirm": "Supprimer les {count} éléments sélectionnés du parcours ?",
479
484
  "courseNameUnavailable": "Détails du cours indisponibles",
480
- "notAssessmentCourseToast": "« {name} » n'est pas un cours composé uniquement d'un questionnaire, il ne peut donc pas être utilisé comme évaluation.",
485
+ "notAssessmentCourseToast": "« {name} » n'est pas un Cours d'évaluation, il ne peut donc pas être utilisé comme évaluation.",
481
486
  "bothSlotsFilledToast": "Les évaluations préalable et finale sont déjà renseignées.",
487
+ "levelExamAlreadyFilledToast": "Ce niveau a déjà un cours d'examen de niveau — retirez-le avant d'en ajouter un autre.",
482
488
  "assessmentCheckFailedToast": "Impossible de vérifier ce cours. Veuillez réessayer.",
483
489
  "skillsHeading": "Compétences",
484
490
  "skillsOutOfScopeWarning": "Hors du périmètre, veuillez resélectionner : {skills}",
@@ -528,11 +534,12 @@ declare const _default: {
528
534
  "outcomeAssessmentExplainerBody": "Réussir ce questionnaire certifie l'acquisition de la compétence pour l'ensemble du parcours — son score est celui qui apparaît sur le certificat de l'apprenant.",
529
535
  "outcomeUnlocksHint": "Se débloque après le dernier niveau",
530
536
  "assessmentCourseSectionTitle": "Cours",
531
- "assessmentCourseSectionDescription": "Un seul cours dont le seul contenu est un questionnaire — aucun autre type de contenu n'a sa place ici.",
537
+ "assessmentCourseSectionDescription": "Un seul Cours d'évaluation — son contenu ne peut être que des questionnaires ou une Évaluation de cours, jamais d'autres types de contenu.",
532
538
  "libraryOpenLevelToAdd": "Ouvrez un niveau pour ajouter",
533
539
  "libraryAddToLevel": "Ajouter à {level}",
534
540
  "libraryAddPriorAssessmentCourse": "Ajouter le cours d'évaluation préalable",
535
541
  "libraryAddOutcomeAssessmentCourse": "Ajouter le cours d'évaluation finale",
542
+ "libraryAddLevelExamCourse": "Ajouter le cours d'examen de niveau pour {level}",
536
543
  "policyStrictLabel": "Strict",
537
544
  "policyStrictDescription": "Chaque apprenant termine chaque niveau, dans l'ordre — quel que soit le score de l'évaluation préalable.",
538
545
  "policyAdaptiveLabel": "Adaptatif",
@@ -553,9 +560,16 @@ declare const _default: {
553
560
  "dropOntoPathError": "Déposez les cours sur un niveau, pas directement sur le parcours d'apprentissage.",
554
561
  "priorSlotFilledToast": "L'Évaluation préalable contient déjà un cours — retirez-le avant d'en ajouter un autre.",
555
562
  "outcomeSlotFilledToast": "L'Évaluation finale contient déjà un cours — retirez-le avant d'en ajouter un autre.",
563
+ "levelNeedsMixedContentToast": "Ce niveau est premier ou dernier dans le parcours — un cours composé uniquement de bancs de questions comme seul contenu sera traité comme une évaluation préalable/finale. Ajoutez un autre cours, ou un cours contenant plus que des bancs de questions.",
564
+ "cannotRemoveLastRegularCourseToast": "Ce niveau est premier ou dernier dans le parcours — retirer ce cours ne laisserait que le cours d'examen de niveau, qui serait alors traité comme une évaluation préalable/finale. Ajoutez d'abord un autre cours.",
556
565
  "coursesRemovedFrameworkChangeToast": "{count} cours associé(s) à un autre curriculum ont été retirés de ce parcours.",
557
566
  "levelSkillsResetFrameworkChangeToast": "{count} niveau(x) ont eu leurs compétences sélectionnées effacées — elles ne s'appliquent pas au nouveau curriculum.",
558
- "priorAssessmentNarrowedScopeToast": "L'évaluation préalable a réduit le périmètre des compétences — {count} niveau(x) ont désormais des compétences hors de ce périmètre."
567
+ "priorAssessmentNarrowedScopeToast": "L'évaluation préalable a réduit le périmètre des compétences — {count} niveau(x) ont désormais des compétences hors de ce périmètre.",
568
+ "coursesCardHeading": "Cours",
569
+ "coursesCardDescription": "Cours qu'un apprenant termine pour valider ce niveau — chaque cours peut inclure ses propres évaluations. Faites glisser la poignée pour réorganiser, utilisez le menu pour retirer.",
570
+ "coursesEmptyHint": "Pas encore ajouté — choisissez un cours dans la bibliothèque.",
571
+ "courseMetaLabel": "Cours",
572
+ "removeFromLevelMenuItem": "Retirer du niveau"
559
573
  }
560
574
  }
561
575
  ;
@@ -275,6 +275,7 @@ declare const _default: {
275
275
  "itemAddedToast": "\"{name}\" adicionado",
276
276
  "collapseLibraryPanelAriaLabel": "Recolher painel da biblioteca",
277
277
  "collapseLibraryTitle": "Recolher biblioteca",
278
+ "cancelTargetAriaLabel": "Cancelar — voltar à navegação",
278
279
  "headerTitle": "Biblioteca",
279
280
  "searchPlaceholder": "Buscar conteúdo…",
280
281
  "searchAriaLabel": "Buscar na biblioteca",
@@ -469,16 +470,21 @@ declare const _default: {
469
470
  "outcomeCheckBadge": "Verificação de resultado",
470
471
  "assessmentCourseMeta": "Curso · Apenas banco de questões",
471
472
  "addAssessmentSlotButton": "Adicionar {label} — um curso com apenas um banco de questões",
473
+ "addCourseToLevelButton": "Adicionar curso a este nível",
474
+ "addLevelExamButton": "Adicionar Exame de nível — um curso com apenas um banco de questões",
475
+ "levelExamMeta": "Exame de nível · Apenas banco de questões",
472
476
  "requiredSlotBadge": "Obrigatório",
473
477
  "removeAssessmentSlotButton": "Remover",
474
478
  "deletePriorAssessmentConfirm": "Excluir a Avaliação prévia remove a pontuação usada pelos avanços adaptativos deste percurso. Continuar?",
475
479
  "deleteAssessmentSlotConfirm": "Remover este curso de avaliação do percurso?",
480
+ "deleteLevelExamConfirm": "Remover este curso de Exame de nível do nível?",
476
481
  "deleteLevelConfirm": "Excluir \"{name}\" e tudo o que ele contém?",
477
482
  "deleteCourseConfirm": "Remover este curso do percurso?",
478
483
  "deleteMultipleConfirm": "Excluir os {count} itens selecionados do percurso?",
479
484
  "courseNameUnavailable": "Detalhes do curso indisponíveis",
480
- "notAssessmentCourseToast": "\"{name}\" não é um curso composto somente por um banco de questões, portanto não pode ser usado como avaliação.",
485
+ "notAssessmentCourseToast": "\"{name}\" não é um Curso de Avaliação, portanto não pode ser usado como avaliação.",
481
486
  "bothSlotsFilledToast": "As avaliações prévia e de resultado já estão preenchidas.",
487
+ "levelExamAlreadyFilledToast": "Este nível já tem um curso de Exame de nível — remova-o antes de adicionar outro.",
482
488
  "assessmentCheckFailedToast": "Não foi possível verificar este curso. Tente novamente.",
483
489
  "skillsHeading": "Habilidades",
484
490
  "skillsOutOfScopeWarning": "Fora do escopo, selecione novamente: {skills}",
@@ -528,11 +534,12 @@ declare const _default: {
528
534
  "outcomeAssessmentExplainerBody": "Passar neste banco de questões certifica o ganho de habilidade de todo o percurso — sua pontuação é o que aparece no certificado do aprendiz.",
529
535
  "outcomeUnlocksHint": "Desbloqueia após o último nível",
530
536
  "assessmentCourseSectionTitle": "Curso",
531
- "assessmentCourseSectionDescription": "Um único curso cujo único conteúdo é um banco de questões — nenhum outro tipo de conteúdo pertence aqui.",
537
+ "assessmentCourseSectionDescription": "Um único Curso de Avaliação — seu conteúdo só pode ser Bancos de Questões ou Avaliação de Curso, nunca outros tipos de conteúdo.",
532
538
  "libraryOpenLevelToAdd": "Abra um nível para adicionar",
533
539
  "libraryAddToLevel": "Adicionar a {level}",
534
540
  "libraryAddPriorAssessmentCourse": "Adicionar curso de Avaliação prévia",
535
541
  "libraryAddOutcomeAssessmentCourse": "Adicionar curso de Avaliação de resultado",
542
+ "libraryAddLevelExamCourse": "Adicionar curso de Exame de nível para {level}",
536
543
  "policyStrictLabel": "Estrita",
537
544
  "policyStrictDescription": "Todo aprendiz completa todos os níveis, em ordem — independentemente da pontuação da avaliação prévia.",
538
545
  "policyAdaptiveLabel": "Adaptativa",
@@ -553,9 +560,16 @@ declare const _default: {
553
560
  "dropOntoPathError": "Solte os cursos sobre um nível, não diretamente na trilha de aprendizagem.",
554
561
  "priorSlotFilledToast": "A Avaliação prévia já tem um curso — remova-o antes de adicionar outro.",
555
562
  "outcomeSlotFilledToast": "A Avaliação final já tem um curso — remova-o antes de adicionar outro.",
563
+ "levelNeedsMixedContentToast": "Este nível é o primeiro ou o último no percurso — um curso composto apenas por bancos de questões como único conteúdo será tratado como uma Avaliação prévia/final. Adicione outro curso, ou um curso com mais do que apenas bancos de questões.",
564
+ "cannotRemoveLastRegularCourseToast": "Este nível é o primeiro ou o último no percurso — remover este curso deixaria apenas o curso de Exame de Nível, que seria tratado como uma Avaliação prévia/final. Adicione outro curso primeiro.",
556
565
  "coursesRemovedFrameworkChangeToast": "{count} curso(s) vinculados a outro currículo foram removidos desta trilha.",
557
566
  "levelSkillsResetFrameworkChangeToast": "{count} nível(is) tiveram as habilidades selecionadas apagadas — elas não se aplicam ao novo currículo.",
558
- "priorAssessmentNarrowedScopeToast": "A Avaliação prévia reduziu o escopo de habilidades — {count} nível(is) agora têm habilidades fora dele."
567
+ "priorAssessmentNarrowedScopeToast": "A Avaliação prévia reduziu o escopo de habilidades — {count} nível(is) agora têm habilidades fora dele.",
568
+ "coursesCardHeading": "Cursos",
569
+ "coursesCardDescription": "Cursos que um aprendiz conclui para cumprir este nível — cada curso pode incluir suas próprias avaliações internas. Arraste a alça para reordenar, use o menu para remover.",
570
+ "coursesEmptyHint": "Ainda não adicionado — escolha um curso na Biblioteca.",
571
+ "courseMetaLabel": "Curso",
572
+ "removeFromLevelMenuItem": "Remover do nível"
559
573
  }
560
574
  }
561
575
  ;