@tinyweb_dev/oe-exam-sdk 0.1.28 → 0.1.30

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.
Files changed (796) hide show
  1. package/README.md +4 -4
  2. package/dist/api/contest-rooms.js +54 -1
  3. package/dist/api/contest-rooms.types.js +1 -1
  4. package/dist/api/exam-create.js +179 -1
  5. package/dist/api/exam-create.types.js +1 -1
  6. package/dist/api/exam-entry.js +68 -1
  7. package/dist/api/exam-entry.types.js +1 -1
  8. package/dist/api/exam-questions.js +149 -1
  9. package/dist/api/exam-questions.types.js +1 -1
  10. package/dist/api/exam-taking.js +84 -1
  11. package/dist/api/exam-taking.types.d.ts +7 -0
  12. package/dist/api/exam-taking.types.js +1 -1
  13. package/dist/api/index.js +8 -1
  14. package/dist/api/result-review.js +62 -1
  15. package/dist/api/result-review.types.js +16 -1
  16. package/dist/components/CueCardEditor.js +58 -1
  17. package/dist/components/common/ResolvedImage.js +15 -1
  18. package/dist/components/exams/CompletionDialog.js +8 -1
  19. package/dist/components/exams/CreateExamInfoForm.js +84 -1
  20. package/dist/components/exams/CreateExamPageContainer.js +110 -1
  21. package/dist/components/exams/ExamCreator.js +287 -1
  22. package/dist/components/exams/ExamPartTabs.js +138 -1
  23. package/dist/components/exams/ExamPreviewDialog.d.ts +6 -7
  24. package/dist/components/exams/ExamPreviewDialog.js +121 -1
  25. package/dist/components/exams/ExamPreviewPartContent.d.ts +18 -0
  26. package/dist/components/exams/ExamPreviewPartContent.js +27 -0
  27. package/dist/components/exams/ExamPreviewSidebar.d.ts +17 -0
  28. package/dist/components/exams/ExamPreviewSidebar.js +37 -0
  29. package/dist/components/exams/ExamQuestionGrid.js +37 -1
  30. package/dist/components/exams/ExamQuestionsPageContainer.js +112 -1
  31. package/dist/components/exams/ExamViewDialog.js +61 -1
  32. package/dist/components/exams/PartAudioUploader.js +9 -1
  33. package/dist/components/exams/TemplateSelector.js +76 -1
  34. package/dist/components/exams/UnsavedChangesDialog.js +7 -1
  35. package/dist/components/exams/api.js +3 -1
  36. package/dist/components/exams/create-exam.texts.js +1 -1
  37. package/dist/components/exams/create-exam.validation.js +18 -1
  38. package/dist/components/exams/entry/EntryRestartDialog.js +11 -1
  39. package/dist/components/exams/entry/StudentExamEntryPageContainer.js +358 -1
  40. package/dist/components/exams/entry/exam-entry.states.js +26 -1
  41. package/dist/components/exams/entry/exam-entry.utils.js +55 -1
  42. package/dist/components/exams/entry/fullscreen-loading.js +18 -1
  43. package/dist/components/exams/entry/index.js +4 -1
  44. package/dist/components/exams/exam-preview.types.d.ts +30 -0
  45. package/dist/components/exams/exam-preview.types.js +62 -0
  46. package/dist/components/exams/exam-question-status.js +45 -1
  47. package/dist/components/exams/exam-template.utils.js +18 -1
  48. package/dist/components/exams/index.d.ts +1 -0
  49. package/dist/components/exams/index.js +19 -1
  50. package/dist/components/exams/rooms/StudentContestRoomsPageContainer.js +183 -1
  51. package/dist/components/exams/rooms/contest-rooms.utils.js +93 -1
  52. package/dist/components/exams/rooms/index.js +2 -1
  53. package/dist/components/exams/take/ExamTakingApiContext.js +25 -1
  54. package/dist/components/exams/take/ExamTakingPageContainer.js +955 -1
  55. package/dist/components/exams/take/GenericQuestionRenderer.js +14 -1
  56. package/dist/components/exams/take/components/QuestionRenderer.js +207 -1
  57. package/dist/components/exams/take/components/index.js +11 -1
  58. package/dist/components/exams/take/components/question-renderers/ArticlesViewer.js +8 -1
  59. package/dist/components/exams/take/components/question-renderers/MoversAnswerTheQuestionRenderer.js +30 -1
  60. package/dist/components/exams/take/components/question-renderers/MoversChooseAdjectiveRenderer.js +63 -1
  61. package/dist/components/exams/take/components/question-renderers/MoversChooseBestAnswerRenderer.js +136 -1
  62. package/dist/components/exams/take/components/question-renderers/MoversColoringRenderer.js +379 -1
  63. package/dist/components/exams/take/components/question-renderers/MoversCrossOutWordGroupRenderer.d.ts +20 -0
  64. package/dist/components/exams/take/components/question-renderers/MoversCrossOutWordGroupRenderer.js +141 -0
  65. package/dist/components/exams/take/components/question-renderers/MoversFillWordHintRenderer.js +131 -1
  66. package/dist/components/exams/take/components/question-renderers/MoversGridFillRenderer.js +76 -1
  67. package/dist/components/exams/take/components/question-renderers/MoversLabelThePictureRenderer.js +68 -1
  68. package/dist/components/exams/take/components/question-renderers/MoversListenAndWriteRenderer.js +42 -1
  69. package/dist/components/exams/take/components/question-renderers/MoversMatchByWritingAnswerRenderer.js +131 -1
  70. package/dist/components/exams/take/components/question-renderers/MoversPictureChooseRenderer.js +76 -1
  71. package/dist/components/exams/take/components/question-renderers/MoversPictureFillBlankChooseRenderer.js +68 -1
  72. package/dist/components/exams/take/components/question-renderers/MoversReadingPassageRenderer.js +62 -1
  73. package/dist/components/exams/take/components/question-renderers/MoversTrueFalseRenderer.d.ts +1 -1
  74. package/dist/components/exams/take/components/question-renderers/MoversTrueFalseRenderer.js +51 -1
  75. package/dist/components/exams/take/components/question-renderers/MoversWordFillParagraphRenderer.js +171 -1
  76. package/dist/components/exams/take/components/question-renderers/MoversWordFillStructuredFormRenderer.js +198 -1
  77. package/dist/components/exams/take/components/question-renderers/MoversWordOrderAndMatchGroupRenderer.d.ts +15 -0
  78. package/dist/components/exams/take/components/question-renderers/MoversWordOrderAndMatchGroupRenderer.js +36 -0
  79. package/dist/components/exams/take/components/question-renderers/MoversWordOrderingRenderer.js +92 -1
  80. package/dist/components/exams/take/components/question-renderers/MoversWriteSentencesRenderer.js +11 -1
  81. package/dist/components/exams/take/components/question-renderers/MoversWritingRenderer.js +56 -1
  82. package/dist/components/exams/take/components/question-renderers/index.d.ts +2 -0
  83. package/dist/components/exams/take/components/question-renderers/index.js +25 -1
  84. package/dist/components/exams/take/components/speaking/SpeakingAudioPlayer.js +85 -1
  85. package/dist/components/exams/take/components/speaking/SpeakingContentFrame.js +10 -1
  86. package/dist/components/exams/take/components/speaking/SpeakingExamLayout.js +15 -1
  87. package/dist/components/exams/take/components/speaking/SpeakingHeader.js +6 -1
  88. package/dist/components/exams/take/components/speaking/SpeakingInstructionBar.js +8 -1
  89. package/dist/components/exams/take/components/speaking/SpeakingMicButton.js +59 -1
  90. package/dist/components/exams/take/components/speaking/SpeakingNavButton.js +7 -1
  91. package/dist/components/exams/take/components/speaking/SpeakingPartBadge.js +5 -1
  92. package/dist/components/exams/take/components/speaking/SpeakingReadDisplayedContent.module.css +120 -0
  93. package/dist/components/exams/take/components/speaking/SpeakingRecordingPreview.js +73 -1
  94. package/dist/components/exams/take/components/speaking/SpeakingReportErrorButton.js +8 -1
  95. package/dist/components/exams/take/components/speaking/SpeakingSpontaneousQA.module.css +344 -0
  96. package/dist/components/exams/take/components/speaking/SpeakingVideoIntro.js +32 -1
  97. package/dist/components/exams/take/components/speaking/index.js +1 -1
  98. package/dist/components/exams/take/components/speaking/renderers/SpeakingChooseAnswerGroupRenderer.js +63 -1
  99. package/dist/components/exams/take/components/speaking/renderers/SpeakingChooseObjectsRenderer.js +95 -1
  100. package/dist/components/exams/take/components/speaking/renderers/SpeakingCompareImagesRenderer.js +35 -1
  101. package/dist/components/exams/take/components/speaking/renderers/SpeakingConversationRenderer.js +147 -1
  102. package/dist/components/exams/take/components/speaking/renderers/SpeakingCueCardRenderer.js +232 -1
  103. package/dist/components/exams/take/components/speaking/renderers/SpeakingDescribeImageRenderer.js +193 -1
  104. package/dist/components/exams/take/components/speaking/renderers/SpeakingDragObjectsRenderer.js +155 -1
  105. package/dist/components/exams/take/components/speaking/renderers/SpeakingGNInterviewRenderer.js +212 -1
  106. package/dist/components/exams/take/components/speaking/renderers/SpeakingInfoExchangeRenderer.js +77 -1
  107. package/dist/components/exams/take/components/speaking/renderers/SpeakingListenAndSpeakAnswerRenderer.js +64 -1
  108. package/dist/components/exams/take/components/speaking/renderers/SpeakingOddOneOutRenderer.js +69 -1
  109. package/dist/components/exams/take/components/speaking/renderers/SpeakingQuestionListRenderer.js +64 -1
  110. package/dist/components/exams/take/components/speaking/renderers/SpeakingQuestionRenderer.js +92 -1
  111. package/dist/components/exams/take/components/speaking/renderers/SpeakingReadDisplayedContentRenderer.js +202 -1
  112. package/dist/components/exams/take/components/speaking/renderers/SpeakingSpontaneousQARenderer.js +339 -1
  113. package/dist/components/exams/take/components/speaking/renderers/SpeakingSpontaneousQaGroupRenderer.d.ts +19 -0
  114. package/dist/components/exams/take/components/speaking/renderers/SpeakingSpontaneousQaGroupRenderer.js +76 -0
  115. package/dist/components/exams/take/components/speaking/renderers/SpeakingStoryImagesRenderer.js +56 -1
  116. package/dist/components/exams/take/components/speaking/renderers/SpontaneousQACambridgeLayout.d.ts +24 -0
  117. package/dist/components/exams/take/components/speaking/renderers/SpontaneousQACambridgeLayout.js +120 -0
  118. package/dist/components/exams/take/components/speaking/renderers/SpontaneousQAInlineAudioPlayer.d.ts +8 -0
  119. package/dist/components/exams/take/components/speaking/renderers/SpontaneousQAInlineAudioPlayer.js +94 -0
  120. package/dist/components/exams/take/components/speaking/renderers/SpontaneousQASummerSkyAudioPlayer.d.ts +8 -0
  121. package/dist/components/exams/take/components/speaking/renderers/SpontaneousQASummerSkyAudioPlayer.js +101 -0
  122. package/dist/components/exams/take/components/speaking/renderers/index.d.ts +1 -0
  123. package/dist/components/exams/take/components/speaking/renderers/index.js +14 -1
  124. package/dist/components/exams/take/exam-taking.utils.d.ts +13 -0
  125. package/dist/components/exams/take/exam-taking.utils.js +203 -1
  126. package/dist/components/exams/take/hooks/index.js +2 -1
  127. package/dist/components/exams/take/hooks/useAnswerAutosave.js +71 -1
  128. package/dist/components/exams/take/hooks/useAttemptSubmit.js +38 -1
  129. package/dist/components/exams/take/hooks/useAutoSave.js +83 -1
  130. package/dist/components/exams/take/hooks/useExamCountdown.js +35 -1
  131. package/dist/components/exams/take/hooks/useExamTimer.js +97 -1
  132. package/dist/components/exams/take/hooks/useProctoringCamera.js +118 -1
  133. package/dist/components/exams/take/hooks/useProctoringSnapshot.js +76 -1
  134. package/dist/components/exams/take/hooks/useSpeakingConversationAudio.js +178 -1
  135. package/dist/components/exams/take/hooks/useSpeakingNavigation.js +51 -1
  136. package/dist/components/exams/take/hooks/useSpeakingRecorder.js +406 -1
  137. package/dist/components/exams/take/hooks/useSpeakingRendererSetup.js +136 -1
  138. package/dist/components/exams/take/hooks/useSpontaneousQaGroupRecorder.d.ts +11 -0
  139. package/dist/components/exams/take/hooks/useSpontaneousQaGroupRecorder.js +352 -0
  140. package/dist/components/exams/take/hooks/useSpontaneousQaGroupRendererSetup.d.ts +42 -0
  141. package/dist/components/exams/take/hooks/useSpontaneousQaGroupRendererSetup.js +166 -0
  142. package/dist/components/exams/take/hooks/useToeicAudio.js +35 -1
  143. package/dist/components/exams/take/index.js +6 -1
  144. package/dist/components/exams/take/types/speaking-cue-card.types.js +1 -1
  145. package/dist/components/exams/take/types/speaking.types.js +7 -1
  146. package/dist/components/exams/take/types.js +4 -1
  147. package/dist/components/exams/take/utils/answer-transformers.js +452 -1
  148. package/dist/components/exams/take/utils/cambridge-yle-inline-speaking.d.ts +21 -0
  149. package/dist/components/exams/take/utils/cambridge-yle-inline-speaking.js +44 -0
  150. package/dist/components/exams/take/utils/coloring-assignments.js +40 -1
  151. package/dist/components/exams/take/utils/cross-out-word-group.transformer.d.ts +21 -0
  152. package/dist/components/exams/take/utils/cross-out-word-group.transformer.js +83 -0
  153. package/dist/components/exams/take/utils/question-transformers.d.ts +43 -2
  154. package/dist/components/exams/take/utils/question-transformers.js +1137 -1
  155. package/dist/components/features/exam-entry/entry-state-cards.js +19 -1
  156. package/dist/components/features/exam-entry/index.js +2 -1
  157. package/dist/components/features/exam-entry/themed/CambridgeYleWaitingRoom.js +121 -1
  158. package/dist/components/features/exam-entry/themed/ThemedWaitingRoom.js +37 -1
  159. package/dist/components/features/exam-entry/themed/ToeicWaitingRoom.js +15 -1
  160. package/dist/components/features/exam-entry/themed/cambridge-yle-waiting-parts.js +80 -1
  161. package/dist/components/features/exam-entry/themed/components/CloseButton.js +6 -1
  162. package/dist/components/features/exam-entry/themed/components/ExamInfoPanel.js +17 -1
  163. package/dist/components/features/exam-entry/themed/components/ModeSelector.js +6 -1
  164. package/dist/components/features/exam-entry/themed/components/StartButton.js +12 -1
  165. package/dist/components/features/exam-entry/themed/components/index.js +4 -1
  166. package/dist/components/features/exam-entry/themed/index.js +3 -1
  167. package/dist/components/index.d.ts +1 -0
  168. package/dist/components/index.js +43 -1
  169. package/dist/components/questions/_shared/config/question-types.config.js +362 -1
  170. package/dist/components/questions/_shared/constants/color-palette.js +21 -1
  171. package/dist/components/questions/_shared/hooks/useAnswerGroupQuestionGroup.js +105 -1
  172. package/dist/components/questions/_shared/hooks/useBasicQuestionGroup.js +222 -1
  173. package/dist/components/questions/_shared/hooks/useCompareImagesGroup.js +140 -1
  174. package/dist/components/questions/_shared/hooks/useImageQuestionGroup.js +123 -1
  175. package/dist/components/questions/_shared/hooks/useInfoExchangeGroup.js +50 -1
  176. package/dist/components/questions/_shared/hooks/useQuestionFormState.js +54 -1
  177. package/dist/components/questions/_shared/hooks/useQuestionInitialization.js +123 -1
  178. package/dist/components/questions/_shared/hooks/useQuestionListGroup.js +121 -1
  179. package/dist/components/questions/_shared/hooks/useQuestionOnChange.js +70 -1
  180. package/dist/components/questions/_shared/hooks/useSceneQuestionGroup.js +194 -1
  181. package/dist/components/questions/_shared/index.js +7 -1
  182. package/dist/components/questions/_shared/types/answer-the-question.type.js +1 -1
  183. package/dist/components/questions/_shared/types/arrange-letters-into-words.type.js +1 -1
  184. package/dist/components/questions/_shared/types/choose-correct-adjective.type.js +3 -1
  185. package/dist/components/questions/_shared/types/choose-the-correct-answer-group.type.d.ts +1 -0
  186. package/dist/components/questions/_shared/types/choose-the-correct-answer-group.type.js +1 -1
  187. package/dist/components/questions/_shared/types/color-region.config.js +1 -1
  188. package/dist/components/questions/_shared/types/cross-out-word-group.type.d.ts +2 -0
  189. package/dist/components/questions/_shared/types/cross-out-word-group.type.js +1 -1
  190. package/dist/components/questions/_shared/types/fill-in-blank.type.js +1 -1
  191. package/dist/components/questions/_shared/types/fill-missing-words-in-grid.type.js +1 -1
  192. package/dist/components/questions/_shared/types/gn-speaking-interview.type.js +1 -1
  193. package/dist/components/questions/_shared/types/index.d.ts +1 -0
  194. package/dist/components/questions/_shared/types/index.js +14 -1
  195. package/dist/components/questions/_shared/types/label-the-picture.type.js +1 -1
  196. package/dist/components/questions/_shared/types/listen-and-choose-from-answer-group.type.js +1 -1
  197. package/dist/components/questions/_shared/types/listen-and-choose-objects-in-scene.type.js +1 -1
  198. package/dist/components/questions/_shared/types/listen-and-drag-objects-into-scene.type.js +1 -1
  199. package/dist/components/questions/_shared/types/listen-and-speak-answer.type.js +1 -1
  200. package/dist/components/questions/_shared/types/listen-and-speak-compare-images.type.js +1 -1
  201. package/dist/components/questions/_shared/types/listen-and-speak-image-group.type.js +1 -1
  202. package/dist/components/questions/_shared/types/listen-and-speak-info-exchange.type.js +1 -1
  203. package/dist/components/questions/_shared/types/listen-and-speak-odd-one-out.type.js +3 -1
  204. package/dist/components/questions/_shared/types/listen-and-speak-question-list.type.js +1 -1
  205. package/dist/components/questions/_shared/types/listen-and-speak-with-story-images.type.js +3 -1
  206. package/dist/components/questions/_shared/types/listen-and-tick-answer.type.js +1 -1
  207. package/dist/components/questions/_shared/types/listening-drawline.type.js +1 -1
  208. package/dist/components/questions/_shared/types/look-and-choose-answer.type.js +1 -1
  209. package/dist/components/questions/_shared/types/look-picture-fill-word-hint.type.js +1 -1
  210. package/dist/components/questions/_shared/types/match-by-writing-answer.type.js +1 -1
  211. package/dist/components/questions/_shared/types/multiple-choice.type.d.ts +5 -0
  212. package/dist/components/questions/_shared/types/multiple-choice.type.js +1 -1
  213. package/dist/components/questions/_shared/types/question-group.type.js +11 -1
  214. package/dist/components/questions/_shared/types/read-and-color-objects.type.js +1 -1
  215. package/dist/components/questions/_shared/types/read-displayed-content.type.js +1 -1
  216. package/dist/components/questions/_shared/types/read-passage-and-answer-questions.type.js +1 -1
  217. package/dist/components/questions/_shared/types/speaking-describe-image.type.js +1 -1
  218. package/dist/components/questions/_shared/types/spontaneous-qa-group.type.d.ts +37 -0
  219. package/dist/components/questions/_shared/types/spontaneous-qa-group.type.js +1 -0
  220. package/dist/components/questions/_shared/types/spontaneous-qa.type.js +1 -1
  221. package/dist/components/questions/_shared/types/true-false-group.type.js +1 -1
  222. package/dist/components/questions/_shared/types/word-fill-paragraph-with-options.type.js +1 -1
  223. package/dist/components/questions/_shared/types/word-fill-paragraph.type.js +1 -1
  224. package/dist/components/questions/_shared/types/word-fill-structured-form.type.d.ts +20 -11
  225. package/dist/components/questions/_shared/types/word-fill-structured-form.type.js +1 -1
  226. package/dist/components/questions/_shared/types/word-order-and-match-group.type.d.ts +38 -0
  227. package/dist/components/questions/_shared/types/word-order-and-match-group.type.js +1 -0
  228. package/dist/components/questions/_shared/types/word-ordering.type.js +1 -1
  229. package/dist/components/questions/_shared/types/write-a-short-letter.type.js +1 -1
  230. package/dist/components/questions/_shared/types/write-correct-verb-form.type.js +3 -1
  231. package/dist/components/questions/_shared/types/write-sentences.type.js +1 -1
  232. package/dist/components/questions/_shared/types/write-short-paragraph.type.js +1 -1
  233. package/dist/components/questions/_shared/utils/answer-builder.js +79 -1
  234. package/dist/components/questions/_shared/utils/createColorRegionRegistration.js +39 -1
  235. package/dist/components/questions/_shared/utils/id-generator.js +3 -1
  236. package/dist/components/questions/_shared/utils/parseFillBlankStem.d.ts +30 -0
  237. package/dist/components/questions/_shared/utils/parseFillBlankStem.js +69 -0
  238. package/dist/components/questions/_shared/utils/question-validation.js +21 -1
  239. package/dist/components/questions/components/ColorNode.js +85 -1
  240. package/dist/components/questions/components/ColorRegionClient.js +545 -1
  241. package/dist/components/questions/components/ColorRegionCreator.js +420 -1
  242. package/dist/components/questions/components/ColorRegionNode.js +59 -1
  243. package/dist/components/questions/components/CreatorGuide.js +103 -1
  244. package/dist/components/questions/components/NameNode.js +26 -1
  245. package/dist/components/questions/components/QuestionBankOption.js +46 -1
  246. package/dist/components/questions/components/QuestionBasicInfoForm.js +9 -1
  247. package/dist/components/questions/components/QuestionCommonFields.js +33 -1
  248. package/dist/components/questions/components/QuestionSearchDropdown.js +258 -1
  249. package/dist/components/questions/components/QuestionTypeSelector.js +32 -1
  250. package/dist/components/questions/components/QuestionTypeSpecificForms.js +6 -1
  251. package/dist/components/questions/components/RegionNode.js +94 -1
  252. package/dist/components/questions/components/index.js +14 -1
  253. package/dist/components/questions/creator/QuestionCreator.js +90 -1
  254. package/dist/components/questions/creator/QuestionGroupCreator.js +119 -1
  255. package/dist/components/questions/creator/dedicated-component-router.js +79 -1
  256. package/dist/components/questions/creator/index.js +3 -1
  257. package/dist/components/questions/creator/question-type-registry.js +90 -1
  258. package/dist/components/questions/groups/ArticlesGroupCard.js +121 -1
  259. package/dist/components/questions/groups/BasicQuestionGroupCard.js +50 -1
  260. package/dist/components/questions/groups/DocumentGroupCard.js +114 -1
  261. package/dist/components/questions/groups/MatchAnswerGroupCard.js +25 -1
  262. package/dist/components/questions/index.d.ts +1 -0
  263. package/dist/components/questions/index.js +11 -1
  264. package/dist/components/questions/question-bank/EditQuestionBankDialog.d.ts +2 -0
  265. package/dist/components/questions/question-bank/EditQuestionBankDialog.js +114 -0
  266. package/dist/components/questions/question-bank/QuestionEditorRenderer.d.ts +23 -0
  267. package/dist/components/questions/question-bank/QuestionEditorRenderer.js +75 -0
  268. package/dist/components/questions/question-bank/difficulty.d.ts +15 -0
  269. package/dist/components/questions/question-bank/difficulty.js +33 -0
  270. package/dist/components/questions/question-bank/editor-adapters/choice-adapters.d.ts +5 -0
  271. package/dist/components/questions/question-bank/editor-adapters/choice-adapters.js +101 -0
  272. package/dist/components/questions/question-bank/editor-adapters/index.d.ts +5 -0
  273. package/dist/components/questions/question-bank/editor-adapters/index.js +4 -0
  274. package/dist/components/questions/question-bank/editor-adapters/media-adapters.d.ts +6 -0
  275. package/dist/components/questions/question-bank/editor-adapters/media-adapters.js +140 -0
  276. package/dist/components/questions/question-bank/editor-adapters/types.d.ts +1 -0
  277. package/dist/components/questions/question-bank/editor-adapters/types.js +1 -0
  278. package/dist/components/questions/question-bank/editor-adapters/unsupported-fallback.d.ts +8 -0
  279. package/dist/components/questions/question-bank/editor-adapters/unsupported-fallback.js +6 -0
  280. package/dist/components/questions/question-bank/editor-adapters/writing-adapters.d.ts +5 -0
  281. package/dist/components/questions/question-bank/editor-adapters/writing-adapters.js +114 -0
  282. package/dist/components/questions/question-bank/index.d.ts +4 -0
  283. package/dist/components/questions/question-bank/index.js +3 -0
  284. package/dist/components/questions/question-bank/types.d.ts +59 -0
  285. package/dist/components/questions/question-bank/types.js +1 -0
  286. package/dist/components/questions/types/answer-the-question/AnswerTheQuestionClient.js +37 -1
  287. package/dist/components/questions/types/answer-the-question/AnswerTheQuestionCreator.js +351 -1
  288. package/dist/components/questions/types/answer-the-question/register.js +67 -1
  289. package/dist/components/questions/types/answer-the-question/transform.js +36 -1
  290. package/dist/components/questions/types/arrange-letters-into-words/ArrangeLettersIntoWordsClient.js +141 -1
  291. package/dist/components/questions/types/arrange-letters-into-words/ArrangeLettersIntoWordsCreator.js +118 -1
  292. package/dist/components/questions/types/arrange-letters-into-words/index.js +2 -1
  293. package/dist/components/questions/types/arrange-letters-into-words/register.js +4 -1
  294. package/dist/components/questions/types/arrange-letters-into-words/transform.js +24 -1
  295. package/dist/components/questions/types/choose-correct-adjective/ChooseCorrectAdjectiveClient.js +74 -1
  296. package/dist/components/questions/types/choose-correct-adjective/ChooseCorrectAdjectiveCreator.js +169 -1
  297. package/dist/components/questions/types/choose-correct-adjective/index.js +2 -1
  298. package/dist/components/questions/types/choose-correct-adjective/register.js +55 -1
  299. package/dist/components/questions/types/choose-correct-adjective/transform.js +16 -1
  300. package/dist/components/questions/types/choose-the-correct-answer/ChooseTheCorrectAnswerClient.js +149 -1
  301. package/dist/components/questions/types/choose-the-correct-answer/ChooseTheCorrectAnswerCreator.js +568 -1
  302. package/dist/components/questions/types/choose-the-correct-answer/index.js +3 -1
  303. package/dist/components/questions/types/choose-the-correct-answer/normalize.d.ts +9 -0
  304. package/dist/components/questions/types/choose-the-correct-answer/normalize.js +88 -1
  305. package/dist/components/questions/types/choose-the-correct-answer/register.js +99 -1
  306. package/dist/components/questions/types/choose-the-correct-answer/transform.js +70 -1
  307. package/dist/components/questions/types/choose-the-correct-answer-group/ChooseTheCorrectAnswerGroupClient.js +22 -1
  308. package/dist/components/questions/types/choose-the-correct-answer-group/ChooseTheCorrectAnswerGroupCreator.js +163 -1
  309. package/dist/components/questions/types/choose-the-correct-answer-group/index.js +3 -1
  310. package/dist/components/questions/types/choose-the-correct-answer-group/map-choose-the-correct-answer-group-data.js +94 -1
  311. package/dist/components/questions/types/choose-the-correct-answer-group/register.js +36 -1
  312. package/dist/components/questions/types/choose-the-correct-answer-group/transform.js +55 -1
  313. package/dist/components/questions/types/cross-out-word-group/CrossOutWordGroupClient.js +27 -1
  314. package/dist/components/questions/types/cross-out-word-group/CrossOutWordGroupCreator.js +231 -1
  315. package/dist/components/questions/types/cross-out-word-group/index.js +5 -1
  316. package/dist/components/questions/types/cross-out-word-group/map-cross-out-word-group-data.d.ts +1 -1
  317. package/dist/components/questions/types/cross-out-word-group/map-cross-out-word-group-data.js +110 -1
  318. package/dist/components/questions/types/cross-out-word-group/register.js +36 -1
  319. package/dist/components/questions/types/cross-out-word-group/transform.js +67 -1
  320. package/dist/components/questions/types/fill-in-blank/FillInBlankClient.js +275 -1
  321. package/dist/components/questions/types/fill-in-blank/FillInBlankCreator.js +464 -1
  322. package/dist/components/questions/types/fill-in-blank/index.js +2 -1
  323. package/dist/components/questions/types/fill-in-blank/register.js +148 -1
  324. package/dist/components/questions/types/fill-in-blank/transform.js +88 -1
  325. package/dist/components/questions/types/fill-missing-words-in-grid/FillMissingWordsInGridClient.js +117 -1
  326. package/dist/components/questions/types/fill-missing-words-in-grid/FillMissingWordsInGridCreator.js +671 -1
  327. package/dist/components/questions/types/fill-missing-words-in-grid/index.js +2 -1
  328. package/dist/components/questions/types/fill-missing-words-in-grid/register.js +37 -1
  329. package/dist/components/questions/types/fill-missing-words-in-grid/transform.js +15 -1
  330. package/dist/components/questions/types/gn-speaking-interview/GNSpeakingInterviewCreator.js +262 -1
  331. package/dist/components/questions/types/gn-speaking-interview/register.js +121 -1
  332. package/dist/components/questions/types/gn-speaking-interview/transform.js +48 -1
  333. package/dist/components/questions/types/image-object-matching/ImageObjectMatchingClient.js +16 -1
  334. package/dist/components/questions/types/image-object-matching/ImageObjectMatchingCreator.js +27 -1
  335. package/dist/components/questions/types/image-object-matching/index.js +2 -1
  336. package/dist/components/questions/types/image-object-matching/register.js +3 -1
  337. package/dist/components/questions/types/image-object-matching/transform.js +2 -1
  338. package/dist/components/questions/types/label-the-picture/LabelThePictureClient.js +102 -1
  339. package/dist/components/questions/types/label-the-picture/LabelThePictureCreator.js +344 -1
  340. package/dist/components/questions/types/label-the-picture/index.js +2 -1
  341. package/dist/components/questions/types/label-the-picture/register.js +54 -1
  342. package/dist/components/questions/types/label-the-picture/transform.js +28 -1
  343. package/dist/components/questions/types/listen-and-choose-from-answer-group/ListenAndChooseFromAnswerGroupClient.js +78 -1
  344. package/dist/components/questions/types/listen-and-choose-from-answer-group/ListenAndChooseFromAnswerGroupCreator.js +232 -1
  345. package/dist/components/questions/types/listen-and-choose-from-answer-group/index.js +2 -1
  346. package/dist/components/questions/types/listen-and-choose-from-answer-group/register.js +82 -1
  347. package/dist/components/questions/types/listen-and-choose-from-answer-group/transform.js +27 -1
  348. package/dist/components/questions/types/listen-and-choose-objects-in-scene/ListenAndChooseObjectsInSceneClient.js +70 -1
  349. package/dist/components/questions/types/listen-and-choose-objects-in-scene/ListenAndChooseObjectsInSceneCreator.js +386 -1
  350. package/dist/components/questions/types/listen-and-choose-objects-in-scene/index.js +2 -1
  351. package/dist/components/questions/types/listen-and-choose-objects-in-scene/register.js +100 -1
  352. package/dist/components/questions/types/listen-and-choose-objects-in-scene/transform.js +33 -1
  353. package/dist/components/questions/types/listen-and-drag-objects-into-scene/ListenAndDragObjectsIntoSceneClient.js +106 -1
  354. package/dist/components/questions/types/listen-and-drag-objects-into-scene/ListenAndDragObjectsIntoSceneCreator.js +457 -1
  355. package/dist/components/questions/types/listen-and-drag-objects-into-scene/index.js +2 -1
  356. package/dist/components/questions/types/listen-and-drag-objects-into-scene/register.js +110 -1
  357. package/dist/components/questions/types/listen-and-drag-objects-into-scene/transform.js +35 -1
  358. package/dist/components/questions/types/listen-and-speak-answer/ArrowIndicator.js +8 -1
  359. package/dist/components/questions/types/listen-and-speak-answer/ListenAndSpeakAnswerClient.js +22 -1
  360. package/dist/components/questions/types/listen-and-speak-answer/ListenAndSpeakAnswerCreator.js +291 -1
  361. package/dist/components/questions/types/listen-and-speak-answer/index.js +2 -1
  362. package/dist/components/questions/types/listen-and-speak-answer/register.js +84 -1
  363. package/dist/components/questions/types/listen-and-speak-answer/transform.js +27 -1
  364. package/dist/components/questions/types/listen-and-speak-compare-images/ListenAndSpeakCompareImagesClient.js +32 -1
  365. package/dist/components/questions/types/listen-and-speak-compare-images/ListenAndSpeakCompareImagesCreator.js +295 -1
  366. package/dist/components/questions/types/listen-and-speak-compare-images/register.js +79 -1
  367. package/dist/components/questions/types/listen-and-speak-compare-images/transform.js +27 -1
  368. package/dist/components/questions/types/listen-and-speak-image-group/ListenAndSpeakImageGroupClient.js +34 -1
  369. package/dist/components/questions/types/listen-and-speak-image-group/ListenAndSpeakImageGroupCreator.js +285 -1
  370. package/dist/components/questions/types/listen-and-speak-image-group/register.js +81 -1
  371. package/dist/components/questions/types/listen-and-speak-image-group/transform.js +26 -1
  372. package/dist/components/questions/types/listen-and-speak-info-exchange/ListenAndSpeakInfoExchangeClient.js +38 -1
  373. package/dist/components/questions/types/listen-and-speak-info-exchange/ListenAndSpeakInfoExchangeCreator.js +385 -1
  374. package/dist/components/questions/types/listen-and-speak-info-exchange/register.js +87 -1
  375. package/dist/components/questions/types/listen-and-speak-info-exchange/transform.js +32 -1
  376. package/dist/components/questions/types/listen-and-speak-odd-one-out/ListenAndSpeakOddOneOutClient.js +26 -1
  377. package/dist/components/questions/types/listen-and-speak-odd-one-out/ListenAndSpeakOddOneOutCreator.js +247 -1
  378. package/dist/components/questions/types/listen-and-speak-odd-one-out/register.js +59 -1
  379. package/dist/components/questions/types/listen-and-speak-odd-one-out/transform.js +18 -1
  380. package/dist/components/questions/types/listen-and-speak-question-list/ListenAndSpeakQuestionListClient.js +26 -1
  381. package/dist/components/questions/types/listen-and-speak-question-list/ListenAndSpeakQuestionListCreator.js +256 -1
  382. package/dist/components/questions/types/listen-and-speak-question-list/register.js +81 -1
  383. package/dist/components/questions/types/listen-and-speak-question-list/transform.js +26 -1
  384. package/dist/components/questions/types/listen-and-speak-with-story-images/ListenAndSpeakWithStoryImagesClient.js +26 -1
  385. package/dist/components/questions/types/listen-and-speak-with-story-images/ListenAndSpeakWithStoryImagesCreator.js +230 -1
  386. package/dist/components/questions/types/listen-and-speak-with-story-images/register.js +56 -1
  387. package/dist/components/questions/types/listen-and-speak-with-story-images/transform.js +16 -1
  388. package/dist/components/questions/types/look-picture-choose-correct-answer/LookPictureChooseCorrectAnswerClient.js +72 -1
  389. package/dist/components/questions/types/look-picture-choose-correct-answer/LookPictureChooseCorrectAnswerCreator.js +230 -1
  390. package/dist/components/questions/types/look-picture-choose-correct-answer/index.js +1 -1
  391. package/dist/components/questions/types/look-picture-choose-correct-answer/register.js +66 -1
  392. package/dist/components/questions/types/look-picture-choose-correct-answer/transform.js +42 -1
  393. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/LookPictureFillBlankChooseAnswerClient.js +96 -1
  394. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/LookPictureFillBlankChooseAnswerCreator.js +238 -1
  395. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/index.js +2 -1
  396. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/register.js +76 -1
  397. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/transform.js +19 -1
  398. package/dist/components/questions/types/look-picture-fill-word-hint/LookPictureFillWordHintClient.js +134 -1
  399. package/dist/components/questions/types/look-picture-fill-word-hint/LookPictureFillWordHintCreator.js +617 -1
  400. package/dist/components/questions/types/look-picture-fill-word-hint/index.js +2 -1
  401. package/dist/components/questions/types/look-picture-fill-word-hint/register.js +82 -1
  402. package/dist/components/questions/types/look-picture-fill-word-hint/transform.js +29 -1
  403. package/dist/components/questions/types/match-by-writing-answer/MatchByWritingAnswerClient.js +38 -1
  404. package/dist/components/questions/types/match-by-writing-answer/MatchByWritingAnswerCreator.js +359 -1
  405. package/dist/components/questions/types/match-by-writing-answer/index.js +3 -1
  406. package/dist/components/questions/types/match-by-writing-answer/register.js +58 -1
  407. package/dist/components/questions/types/match-by-writing-answer/transform.js +61 -1
  408. package/dist/components/questions/types/read-and-color-objects/ReadAndColorObjectsClient.js +16 -1
  409. package/dist/components/questions/types/read-and-color-objects/ReadAndColorObjectsCreator.js +23 -1
  410. package/dist/components/questions/types/read-and-color-objects/index.js +2 -1
  411. package/dist/components/questions/types/read-and-color-objects/register.js +3 -1
  412. package/dist/components/questions/types/read-and-color-objects/transform.js +36 -1
  413. package/dist/components/questions/types/read-displayed-content/ReadDisplayedContentCreator.js +125 -1
  414. package/dist/components/questions/types/read-displayed-content/register.js +64 -1
  415. package/dist/components/questions/types/read-displayed-content/transform.js +12 -1
  416. package/dist/components/questions/types/read-passage-and-answer-questions/ReadPassageAndAnswerQuestionsClient.js +65 -1
  417. package/dist/components/questions/types/read-passage-and-answer-questions/ReadPassageAndAnswerQuestionsCreator.js +511 -1
  418. package/dist/components/questions/types/read-passage-and-answer-questions/index.js +2 -1
  419. package/dist/components/questions/types/read-passage-and-answer-questions/register.js +58 -1
  420. package/dist/components/questions/types/read-passage-and-answer-questions/transform.js +28 -1
  421. package/dist/components/questions/types/speaking-conversation/SpeakingConversationCreator.js +373 -1
  422. package/dist/components/questions/types/speaking-conversation/SpeakingConversationPreviewClient.js +41 -1
  423. package/dist/components/questions/types/speaking-conversation/register.js +110 -1
  424. package/dist/components/questions/types/speaking-conversation/transform.js +34 -1
  425. package/dist/components/questions/types/speaking-cue-card/SpeakingCueCardCreator.js +74 -1
  426. package/dist/components/questions/types/speaking-cue-card/register.js +52 -1
  427. package/dist/components/questions/types/speaking-cue-card/transform.js +12 -1
  428. package/dist/components/questions/types/speaking-describe-image/SpeakingDescribeImageClient.js +10 -1
  429. package/dist/components/questions/types/speaking-describe-image/SpeakingDescribeImageCreator.js +161 -1
  430. package/dist/components/questions/types/speaking-describe-image/index.js +2 -1
  431. package/dist/components/questions/types/speaking-describe-image/register.js +69 -1
  432. package/dist/components/questions/types/speaking-describe-image/transform.js +16 -1
  433. package/dist/components/questions/types/spontaneous-qa/SpontaneousQACreator.js +234 -1
  434. package/dist/components/questions/types/spontaneous-qa/register.js +93 -1
  435. package/dist/components/questions/types/spontaneous-qa/transform.js +34 -1
  436. package/dist/components/questions/types/spontaneous-qa-group/SpontaneousQaGroupClient.d.ts +2 -0
  437. package/dist/components/questions/types/spontaneous-qa-group/SpontaneousQaGroupClient.js +9 -0
  438. package/dist/components/questions/types/spontaneous-qa-group/SpontaneousQaGroupCreator.d.ts +2 -0
  439. package/dist/components/questions/types/spontaneous-qa-group/SpontaneousQaGroupCreator.js +179 -0
  440. package/dist/components/questions/types/spontaneous-qa-group/creator-helpers.d.ts +5 -0
  441. package/dist/components/questions/types/spontaneous-qa-group/creator-helpers.js +43 -0
  442. package/dist/components/questions/types/spontaneous-qa-group/flatten.d.ts +14 -0
  443. package/dist/components/questions/types/spontaneous-qa-group/flatten.js +69 -0
  444. package/dist/components/questions/types/spontaneous-qa-group/index.d.ts +2 -0
  445. package/dist/components/questions/types/spontaneous-qa-group/index.js +2 -0
  446. package/dist/components/questions/types/spontaneous-qa-group/register.d.ts +2 -0
  447. package/dist/components/questions/types/spontaneous-qa-group/register.js +139 -0
  448. package/dist/components/questions/types/spontaneous-qa-group/transform.d.ts +2 -0
  449. package/dist/components/questions/types/spontaneous-qa-group/transform.js +52 -0
  450. package/dist/components/questions/types/true-false/TrueFalseClient.js +75 -1
  451. package/dist/components/questions/types/true-false/TrueFalseCreator.js +244 -1
  452. package/dist/components/questions/types/true-false/index.js +2 -1
  453. package/dist/components/questions/types/true-false/register.js +77 -1
  454. package/dist/components/questions/types/true-false/transform.js +32 -1
  455. package/dist/components/questions/types/true-false-group/TrueFalseGroupClient.js +25 -1
  456. package/dist/components/questions/types/true-false-group/TrueFalseGroupCreator.js +129 -1
  457. package/dist/components/questions/types/true-false-group/index.js +5 -1
  458. package/dist/components/questions/types/true-false-group/map-true-false-group-data.js +69 -1
  459. package/dist/components/questions/types/true-false-group/register.js +36 -1
  460. package/dist/components/questions/types/true-false-group/transform.js +43 -1
  461. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphClient.js +233 -1
  462. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphCreator.js +631 -1
  463. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphWrapper.js +28 -1
  464. package/dist/components/questions/types/word-fill-paragraph/index.js +2 -1
  465. package/dist/components/questions/types/word-fill-paragraph/register.js +136 -1
  466. package/dist/components/questions/types/word-fill-paragraph/transform.js +56 -1
  467. package/dist/components/questions/types/word-fill-structured-form/WfsfWordBankEditor.js +86 -1
  468. package/dist/components/questions/types/word-fill-structured-form/WordFillStructuredFormClient.js +246 -1
  469. package/dist/components/questions/types/word-fill-structured-form/WordFillStructuredFormCreator.d.ts +2 -0
  470. package/dist/components/questions/types/word-fill-structured-form/WordFillStructuredFormCreator.js +484 -1
  471. package/dist/components/questions/types/word-fill-structured-form/index.js +3 -1
  472. package/dist/components/questions/types/word-fill-structured-form/map-wfsf-question-data.js +113 -1
  473. package/dist/components/questions/types/word-fill-structured-form/register.js +36 -1
  474. package/dist/components/questions/types/word-fill-structured-form/transform.js +77 -1
  475. package/dist/components/questions/types/word-fill-structured-form/wfsf-word-bank.utils.js +110 -1
  476. package/dist/components/questions/types/word-order-and-match-group/WordOrderAndMatchGroupClient.d.ts +3 -0
  477. package/dist/components/questions/types/word-order-and-match-group/WordOrderAndMatchGroupClient.js +190 -0
  478. package/dist/components/questions/types/word-order-and-match-group/WordOrderAndMatchGroupCreator.d.ts +3 -0
  479. package/dist/components/questions/types/word-order-and-match-group/WordOrderAndMatchGroupCreator.js +182 -0
  480. package/dist/components/questions/types/word-order-and-match-group/index.d.ts +4 -0
  481. package/dist/components/questions/types/word-order-and-match-group/index.js +4 -0
  482. package/dist/components/questions/types/word-order-and-match-group/register.d.ts +2 -0
  483. package/dist/components/questions/types/word-order-and-match-group/register.js +121 -0
  484. package/dist/components/questions/types/word-order-and-match-group/transform.d.ts +2 -0
  485. package/dist/components/questions/types/word-order-and-match-group/transform.js +70 -0
  486. package/dist/components/questions/types/word-ordering/WordOrderingClient.js +84 -1
  487. package/dist/components/questions/types/word-ordering/WordOrderingCreator.js +192 -1
  488. package/dist/components/questions/types/word-ordering/index.js +2 -1
  489. package/dist/components/questions/types/word-ordering/register.js +46 -1
  490. package/dist/components/questions/types/word-ordering/transform.js +24 -1
  491. package/dist/components/questions/types/write-a-short-letter/WriteAShortLetterClient.js +99 -1
  492. package/dist/components/questions/types/write-a-short-letter/WriteAShortLetterCreator.js +320 -1
  493. package/dist/components/questions/types/write-a-short-letter/index.js +2 -1
  494. package/dist/components/questions/types/write-a-short-letter/register.js +68 -1
  495. package/dist/components/questions/types/write-a-short-letter/transform.js +25 -1
  496. package/dist/components/questions/types/write-correct-verb-form/WriteCorrectVerbFormClient.js +61 -1
  497. package/dist/components/questions/types/write-correct-verb-form/WriteCorrectVerbFormCreator.js +196 -1
  498. package/dist/components/questions/types/write-correct-verb-form/index.js +2 -1
  499. package/dist/components/questions/types/write-correct-verb-form/register.js +62 -1
  500. package/dist/components/questions/types/write-correct-verb-form/transform.js +17 -1
  501. package/dist/components/questions/types/write-sentences/WriteSentencesClient.js +22 -1
  502. package/dist/components/questions/types/write-sentences/WriteSentencesCreator.js +174 -1
  503. package/dist/components/questions/types/write-sentences/index.js +2 -1
  504. package/dist/components/questions/types/write-sentences/register.js +58 -1
  505. package/dist/components/questions/types/write-sentences/transform.js +28 -1
  506. package/dist/components/questions/types/write-short-paragraph/WriteShortParagraphClient.js +96 -1
  507. package/dist/components/questions/types/write-short-paragraph/WriteShortParagraphCreator.js +161 -1
  508. package/dist/components/questions/types/write-short-paragraph/index.js +2 -1
  509. package/dist/components/questions/types/write-short-paragraph/register.js +4 -1
  510. package/dist/components/questions/types/write-short-paragraph/transform.js +21 -1
  511. package/dist/components/questions/viewer/ChooseTheCorrectAnswerGroupViewer.js +11 -1
  512. package/dist/components/questions/viewer/CrossOutWordGroupViewer.js +8 -1
  513. package/dist/components/questions/viewer/QuestionGroupViewer.js +36 -1
  514. package/dist/components/questions/viewer/QuestionViewer.js +692 -1
  515. package/dist/components/questions/viewer/SpontaneousQaGroupViewer.d.ts +2 -1
  516. package/dist/components/questions/viewer/SpontaneousQaGroupViewer.js +82 -1
  517. package/dist/components/questions/viewer/TrueFalseGroupViewer.js +11 -1
  518. package/dist/components/questions/viewer/WordFillStructuredFormViewer.js +14 -1
  519. package/dist/components/questions/viewer/WordOrderAndMatchGroupViewer.d.ts +3 -1
  520. package/dist/components/questions/viewer/WordOrderAndMatchGroupViewer.js +95 -1
  521. package/dist/components/questions/viewer/index.js +8 -1
  522. package/dist/components/results/ResultReviewPageContainer.js +220 -1
  523. package/dist/components/results/ReviewQuestionRenderer.js +55 -1
  524. package/dist/components/results/hooks/useResultReviewPolling.js +76 -1
  525. package/dist/components/results/index.js +22 -1
  526. package/dist/components/results/renderers/QuestionExplanations.js +19 -1
  527. package/dist/components/results/renderers/ReviewChooseAdjectiveRenderer.js +94 -1
  528. package/dist/components/results/renderers/ReviewChooseBestAnswerRenderer.js +75 -1
  529. package/dist/components/results/renderers/ReviewColoringRenderer.js +110 -1
  530. package/dist/components/results/renderers/ReviewListenAndWriteRenderer.js +48 -1
  531. package/dist/components/results/renderers/ReviewListenChooseAnswerGroupRenderer.js +87 -1
  532. package/dist/components/results/renderers/ReviewListenChooseObjectsRenderer.js +104 -1
  533. package/dist/components/results/renderers/ReviewListenDragObjectsRenderer.js +123 -1
  534. package/dist/components/results/renderers/ReviewListeningHeader.js +104 -1
  535. package/dist/components/results/renderers/ReviewSpeakingAIPanel.js +116 -1
  536. package/dist/components/results/renderers/ReviewSpeakingMedia.js +48 -1
  537. package/dist/components/results/renderers/ReviewSpeakingQuestionItem.js +42 -1
  538. package/dist/components/results/renderers/ReviewSpeakingRenderer.js +12 -1
  539. package/dist/components/results/renderers/ReviewSpeakingRenderer.types.js +85 -1
  540. package/dist/components/results/renderers/review-question-body-dedicated.js +104 -1
  541. package/dist/components/results/renderers/review-question-body-movers.js +148 -1
  542. package/dist/components/results/renderers/review-speaking-map.js +226 -1
  543. package/dist/components/results/renderers/review-spontaneous-qa-group.d.ts +4 -0
  544. package/dist/components/results/renderers/review-spontaneous-qa-group.js +74 -0
  545. package/dist/components/results/report/BadgeTitle.js +5 -1
  546. package/dist/components/results/report/ExamSkillRow.js +20 -1
  547. package/dist/components/results/report/OceanEduExamReport.js +58 -1
  548. package/dist/components/results/report/OceanEduSpeakingReport.js +62 -1
  549. package/dist/components/results/report/OverallAssessmentSection.js +17 -1
  550. package/dist/components/results/report/ResultErrorState.js +18 -1
  551. package/dist/components/results/report/ResultLoadingState.js +10 -1
  552. package/dist/components/results/report/ResultNotPublicState.js +27 -1
  553. package/dist/components/results/report/SpeakingReportParts.js +14 -1
  554. package/dist/components/results/report/SpeakingReportShared.js +86 -1
  555. package/dist/components/results/report/SpeakingRubricSection.js +171 -1
  556. package/dist/components/results/report/speaking-report.utils.js +198 -1
  557. package/dist/components/results/result-review.utils.js +6 -1
  558. package/dist/components/results/review-data.js +222 -1
  559. package/dist/components/results/review-renderer.utils.js +97 -1
  560. package/dist/components/results/review-status.utils.js +36 -1
  561. package/dist/components/results/review-types.js +1 -1
  562. package/dist/components/results/speaking/SpeakingResultAudioPlayer.js +77 -1
  563. package/dist/components/results/speaking/SpeakingReviewResult.js +48 -1
  564. package/dist/components/results/utils/review-score.utils.js +72 -1
  565. package/dist/components/results/utils/speaking-summary.js +224 -1
  566. package/dist/components/results/utils/transform-speaking-review.js +183 -1
  567. package/dist/components/shared/RichTextEditor.d.ts +9 -0
  568. package/dist/components/shared/RichTextEditor.js +47 -0
  569. package/dist/components/shared/audio/SpeakingAudioPlayer.js +100 -1
  570. package/dist/components/themes/cambridge-yle/CambridgeYleAudioPlayer.js +140 -1
  571. package/dist/components/themes/cambridge-yle/CambridgeYleBottomNav.js +10 -1
  572. package/dist/components/themes/cambridge-yle/CambridgeYleExamLayout.d.ts +1 -1
  573. package/dist/components/themes/cambridge-yle/CambridgeYleExamLayout.js +18 -1
  574. package/dist/components/themes/cambridge-yle/CambridgeYleExampleText.js +11 -1
  575. package/dist/components/themes/cambridge-yle/CambridgeYleHeader.js +11 -1
  576. package/dist/components/themes/cambridge-yle/CambridgeYleInstructionBanner.d.ts +2 -1
  577. package/dist/components/themes/cambridge-yle/CambridgeYleInstructionBanner.js +19 -1
  578. package/dist/components/themes/cambridge-yle/CambridgeYleNavButton.js +13 -1
  579. package/dist/components/themes/cambridge-yle/CambridgeYlePartBanner.d.ts +1 -1
  580. package/dist/components/themes/cambridge-yle/CambridgeYlePartBanner.js +3 -1
  581. package/dist/components/themes/cambridge-yle/CambridgeYleProgressBar.js +6 -1
  582. package/dist/components/themes/cambridge-yle/CambridgeYleQuestionCard.js +5 -1
  583. package/dist/components/themes/cambridge-yle/CambridgeYleQuestionCardFullWidth.js +9 -1
  584. package/dist/components/themes/cambridge-yle/CambridgeYleSidebar.d.ts +2 -1
  585. package/dist/components/themes/cambridge-yle/CambridgeYleSidebar.js +61 -1
  586. package/dist/components/themes/cambridge-yle/CambridgeYleTimer.d.ts +1 -1
  587. package/dist/components/themes/cambridge-yle/CambridgeYleTimer.js +25 -1
  588. package/dist/components/themes/cambridge-yle/index.js +13 -1
  589. package/dist/components/themes/english-certification/EcAnswerTheQuestion.js +25 -1
  590. package/dist/components/themes/english-certification/EcMatchByWritingAnswer.js +89 -1
  591. package/dist/components/themes/english-certification/EcWordFillParagraph.js +56 -1
  592. package/dist/components/themes/english-certification/EcWordFillStructuredForm.js +192 -1
  593. package/dist/components/themes/english-certification/EcWritingTask.js +60 -1
  594. package/dist/components/themes/english-certification/EnglishCertificationAudioPlayer.js +108 -1
  595. package/dist/components/themes/english-certification/EnglishCertificationBrand.js +11 -1
  596. package/dist/components/themes/english-certification/EnglishCertificationExamLayout.js +34 -1
  597. package/dist/components/themes/english-certification/EnglishCertificationFlagButton.js +15 -1
  598. package/dist/components/themes/english-certification/EnglishCertificationFooterBar.js +19 -1
  599. package/dist/components/themes/english-certification/EnglishCertificationGroupedQuestion.js +166 -1
  600. package/dist/components/themes/english-certification/EnglishCertificationHeader.js +31 -1
  601. package/dist/components/themes/english-certification/EnglishCertificationInstructionBanner.js +79 -1
  602. package/dist/components/themes/english-certification/EnglishCertificationNavigationPanel.js +71 -1
  603. package/dist/components/themes/english-certification/EnglishCertificationOptionSelector.js +79 -1
  604. package/dist/components/themes/english-certification/EnglishCertificationPartHeader.js +47 -1
  605. package/dist/components/themes/english-certification/EnglishCertificationPassagePanel.js +77 -1
  606. package/dist/components/themes/english-certification/EnglishCertificationQuestionCard.js +25 -1
  607. package/dist/components/themes/english-certification/EnglishCertificationQuestionItem.js +36 -1
  608. package/dist/components/themes/english-certification/EnglishCertificationQuestionRenderer.js +81 -1
  609. package/dist/components/themes/english-certification/EnglishCertificationReadingSection.js +95 -1
  610. package/dist/components/themes/english-certification/EnglishCertificationSingleQuestion.js +18 -1
  611. package/dist/components/themes/english-certification/EnglishCertificationSingleQuestionList.js +32 -1
  612. package/dist/components/themes/english-certification/english-cert-scroll.js +163 -1
  613. package/dist/components/themes/english-certification/english-certification-theme.js +58 -1
  614. package/dist/components/themes/english-certification/grouped-question-utils.js +243 -1
  615. package/dist/components/themes/english-certification/index.js +24 -1
  616. package/dist/components/themes/index.js +25 -1
  617. package/dist/components/themes/summer-sky/SummerSkyAudioPlayer.js +170 -1
  618. package/dist/components/themes/summer-sky/SummerSkyExitModal.js +21 -1
  619. package/dist/components/themes/summer-sky/SummerSkyLayout.js +221 -1
  620. package/dist/components/themes/summer-sky/SummerSkySubmitModal.js +18 -1
  621. package/dist/components/themes/summer-sky/SummerSkyWaitingRoom.js +193 -1
  622. package/dist/components/themes/types.js +1 -1
  623. package/dist/components/ui/alert-dialog.js +26 -1
  624. package/dist/components/ui/alert.js +22 -1
  625. package/dist/components/ui/avatar.js +12 -1
  626. package/dist/components/ui/badge.js +38 -1
  627. package/dist/components/ui/button.js +35 -1
  628. package/dist/components/ui/calendar.js +76 -1
  629. package/dist/components/ui/card.js +16 -1
  630. package/dist/components/ui/carousel.js +91 -1
  631. package/dist/components/ui/checkbox.js +9 -1
  632. package/dist/components/ui/collapsible.js +13 -1
  633. package/dist/components/ui/command.js +34 -1
  634. package/dist/components/ui/confirm-dialog.js +49 -1
  635. package/dist/components/ui/dialog.js +23 -1
  636. package/dist/components/ui/drawer.js +35 -1
  637. package/dist/components/ui/dropdown-menu.js +33 -1
  638. package/dist/components/ui/file-upload.js +155 -1
  639. package/dist/components/ui/form.js +62 -1
  640. package/dist/components/ui/hover-card.js +10 -1
  641. package/dist/components/ui/image-preview.js +29 -1
  642. package/dist/components/ui/input.js +8 -1
  643. package/dist/components/ui/label.js +9 -1
  644. package/dist/components/ui/language-switcher.js +15 -1
  645. package/dist/components/ui/multi-select.js +90 -1
  646. package/dist/components/ui/points-input.js +33 -1
  647. package/dist/components/ui/popover.js +26 -1
  648. package/dist/components/ui/progress.js +16 -1
  649. package/dist/components/ui/radio-group.js +12 -1
  650. package/dist/components/ui/scroll-area.js +11 -1
  651. package/dist/components/ui/select.js +38 -1
  652. package/dist/components/ui/separator.js +8 -1
  653. package/dist/components/ui/sheet.js +40 -1
  654. package/dist/components/ui/single-select.js +76 -1
  655. package/dist/components/ui/skeleton.js +6 -1
  656. package/dist/components/ui/switch.js +8 -1
  657. package/dist/components/ui/table.js +20 -1
  658. package/dist/components/ui/tabs.js +17 -1
  659. package/dist/components/ui/textarea.js +8 -1
  660. package/dist/components/ui/tooltip.js +11 -1
  661. package/dist/index.d.ts +3 -0
  662. package/dist/index.js +24 -1
  663. package/dist/shared/constants/ApiConstant.d.ts +1 -0
  664. package/dist/shared/constants/ApiConstant.js +278 -1
  665. package/dist/shared/constants/QueryKeyConstant.js +112 -1
  666. package/dist/shared/constants/exam-level.enum.js +41 -1
  667. package/dist/shared/constants/landings/placement-test.constants.js +431 -1
  668. package/dist/shared/constants/question-skills.js +277 -1
  669. package/dist/shared/constants/routes.js +81 -1
  670. package/dist/shared/index.js +10 -1
  671. package/dist/shared/lib/hooks/index.js +10 -1
  672. package/dist/shared/lib/hooks/useAlertDialog.js +57 -1
  673. package/dist/shared/lib/hooks/useAudioPlayCounter.js +30 -1
  674. package/dist/shared/lib/hooks/useAudioPreview.js +81 -1
  675. package/dist/shared/lib/hooks/useAudioUpload.js +24 -1
  676. package/dist/shared/lib/hooks/useConfirmDialog.js +89 -1
  677. package/dist/shared/lib/hooks/useDebouncedCallback.js +32 -1
  678. package/dist/shared/lib/hooks/useDelayedAutoPlay.js +12 -1
  679. package/dist/shared/lib/hooks/useFileUpload.js +24 -1
  680. package/dist/shared/lib/hooks/useImageUrl.js +5 -1
  681. package/dist/shared/lib/hooks/usePresignedFileUrl.js +108 -1
  682. package/dist/shared/lib/hooks/useReactHookForm.js +31 -1
  683. package/dist/shared/lib/hooks/useToast.js +62 -1
  684. package/dist/shared/lib/html-content.js +22 -1
  685. package/dist/shared/lib/i18n/index.js +54 -1
  686. package/dist/shared/lib/i18n/messages/en/admin.d.ts +11 -4
  687. package/dist/shared/lib/i18n/messages/en/admin.js +2111 -1
  688. package/dist/shared/lib/i18n/messages/en/auth.js +86 -1
  689. package/dist/shared/lib/i18n/messages/en/common.js +140 -1
  690. package/dist/shared/lib/i18n/messages/en/file-upload.js +18 -1
  691. package/dist/shared/lib/i18n/messages/en/student.js +133 -1
  692. package/dist/shared/lib/i18n/messages/en/terms.js +37 -1
  693. package/dist/shared/lib/i18n/messages/en.d.ts +11 -4
  694. package/dist/shared/lib/i18n/messages/en.js +15 -1
  695. package/dist/shared/lib/i18n/messages/vi/admin.d.ts +11 -4
  696. package/dist/shared/lib/i18n/messages/vi/admin.js +2111 -1
  697. package/dist/shared/lib/i18n/messages/vi/auth.js +86 -1
  698. package/dist/shared/lib/i18n/messages/vi/common.js +140 -1
  699. package/dist/shared/lib/i18n/messages/vi/file-upload.js +18 -1
  700. package/dist/shared/lib/i18n/messages/vi/student.js +133 -1
  701. package/dist/shared/lib/i18n/messages/vi/terms.js +37 -1
  702. package/dist/shared/lib/i18n/messages/vi.d.ts +11 -4
  703. package/dist/shared/lib/i18n/messages/vi.js +15 -1
  704. package/dist/shared/lib/i18n/types.js +1 -1
  705. package/dist/shared/lib/stores/examQuestionStore.js +212 -1
  706. package/dist/shared/lib/stores/examTakingStore.js +240 -1
  707. package/dist/shared/lib/stores/gradingTransientStore.js +39 -1
  708. package/dist/shared/lib/stores/localeStore.js +10 -1
  709. package/dist/shared/lib/themes/config/starters.config.js +71 -1
  710. package/dist/shared/lib/themes/index.js +49 -1
  711. package/dist/shared/lib/themes/types.js +2 -1
  712. package/dist/shared/lib/toast.js +43 -1
  713. package/dist/shared/lib/utils/public-page.js +44 -1
  714. package/dist/shared/lib/utils/question-reverse-transform.js +438 -1
  715. package/dist/shared/lib/utils/question-transform-types.js +1 -1
  716. package/dist/shared/lib/utils/question-transform-validation.js +194 -1
  717. package/dist/shared/lib/utils/question-transform.js +199 -1
  718. package/dist/shared/lib/utils.js +168 -1
  719. package/dist/shared/lib/validation/choose-correct-answer.validation.js +111 -1
  720. package/dist/shared/lib/validation/label-the-picture.validation.js +19 -1
  721. package/dist/shared/lib/validation/listen-and-choose-from-answer-group.validation.js +46 -1
  722. package/dist/shared/lib/validation/listen-and-choose-objects-in-scene.validation.js +21 -1
  723. package/dist/shared/lib/validation/listen-and-drag-objects-into-scene.validation.js +34 -1
  724. package/dist/shared/lib/validation/listen-and-speak-answer.validation.js +40 -1
  725. package/dist/shared/lib/validation/listen-and-speak-compare-images.validation.js +45 -1
  726. package/dist/shared/lib/validation/listen-and-speak-image-group.validation.js +19 -1
  727. package/dist/shared/lib/validation/listen-and-speak-info-exchange.validation.js +39 -1
  728. package/dist/shared/lib/validation/listen-and-speak-odd-one-out.validation.js +32 -1
  729. package/dist/shared/lib/validation/listen-and-speak-question-list.validation.js +19 -1
  730. package/dist/shared/lib/validation/listen-and-speak-with-story-images.validation.js +28 -1
  731. package/dist/shared/lib/validation/look-picture-choose-correct-answer.validation.js +12 -1
  732. package/dist/shared/lib/validation/look-picture-fill-blank-choose-answer.validation.js +47 -1
  733. package/dist/shared/lib/validation/read-and-color-objects.validation.js +29 -1
  734. package/dist/shared/lib/validation/read-displayed-content.validation.js +28 -1
  735. package/dist/shared/lib/validation/speaking-conversation.validation.js +75 -1
  736. package/dist/shared/lib/validation/speaking-describe-image.validation.js +31 -1
  737. package/dist/shared/lib/validation/spontaneous-qa.validation.js +48 -1
  738. package/dist/shared/lib/validation/word-fill-paragraph-default.validation.js +38 -1
  739. package/dist/shared/lib/validation/word-fill-paragraph-with-options.validation.js +39 -1
  740. package/dist/shared/lib/validation/word-fill-paragraph.validation.js +43 -1
  741. package/dist/shared/lib/validation/word-ordering.validation.js +33 -1
  742. package/dist/shared/types/branch.types.js +6 -1
  743. package/dist/shared/types/common.types.js +49 -1
  744. package/dist/shared/types/entities/exam-schedule.types.js +5 -1
  745. package/dist/shared/types/entities/exam.types.js +1 -1
  746. package/dist/shared/types/entities/question.types.js +4 -1
  747. package/dist/shared/types/entities/result.types.js +4 -1
  748. package/dist/shared/types/entities/user.types.js +4 -1
  749. package/dist/shared/types/exam-taking.types.js +2 -1
  750. package/dist/shared/types/history.types.js +34 -1
  751. package/dist/shared/types/index.js +1 -1
  752. package/dist/shared/types/questions/choose-correct-adjective.js +4 -1
  753. package/dist/shared/types/questions/choose-the-correct-answer-group.d.ts +1 -0
  754. package/dist/shared/types/questions/choose-the-correct-answer-group.js +1 -1
  755. package/dist/shared/types/questions/choose-the-correct-answer.js +9 -1
  756. package/dist/shared/types/questions/cross-out-word-group.d.ts +2 -0
  757. package/dist/shared/types/questions/cross-out-word-group.js +1 -1
  758. package/dist/shared/types/questions/fill-missing-words-in-grid.js +11 -1
  759. package/dist/shared/types/questions/index.d.ts +1 -0
  760. package/dist/shared/types/questions/index.js +46 -1
  761. package/dist/shared/types/questions/listen-and-speak-answer.js +1 -1
  762. package/dist/shared/types/questions/listen-and-speak-compare-images.js +1 -1
  763. package/dist/shared/types/questions/listen-and-speak-image-group.js +1 -1
  764. package/dist/shared/types/questions/listen-and-speak-info-exchange.js +3 -1
  765. package/dist/shared/types/questions/listen-and-speak-odd-one-out.js +3 -1
  766. package/dist/shared/types/questions/listen-and-speak-question-list.js +1 -1
  767. package/dist/shared/types/questions/listen-and-speak-with-story-images.js +3 -1
  768. package/dist/shared/types/questions/look-picture-choose-correct-answer.js +5 -1
  769. package/dist/shared/types/questions/look-picture-fill-blank-choose-answer.js +9 -1
  770. package/dist/shared/types/questions/look-picture-fill-word-hint.js +7 -1
  771. package/dist/shared/types/questions/read-displayed-content.js +1 -1
  772. package/dist/shared/types/questions/speaking-conversation.js +7 -1
  773. package/dist/shared/types/questions/speaking-describe-image.js +1 -1
  774. package/dist/shared/types/questions/spontaneous-qa.js +1 -1
  775. package/dist/shared/types/questions/word-order-and-match-group.d.ts +33 -0
  776. package/dist/shared/types/questions/word-order-and-match-group.js +1 -0
  777. package/dist/shared/types/questions/write-correct-verb-form.js +12 -1
  778. package/dist/shared/types/role.types.js +1 -1
  779. package/dist/shared/types/structure-management.js +28 -1
  780. package/dist/shared/types/student.types.js +57 -1
  781. package/dist/shared/types/teacher-dashboard-rooms.js +2 -1
  782. package/package.json +184 -166
  783. package/dist/mcp/config.d.ts +0 -12
  784. package/dist/mcp/config.js +0 -1
  785. package/dist/mcp/http-client.d.ts +0 -6
  786. package/dist/mcp/http-client.js +0 -1
  787. package/dist/mcp/index.d.ts +0 -6
  788. package/dist/mcp/index.js +0 -2
  789. package/dist/mcp/tools/_helpers.d.ts +0 -4
  790. package/dist/mcp/tools/_helpers.js +0 -1
  791. package/dist/mcp/tools/exams.d.ts +0 -2
  792. package/dist/mcp/tools/exams.js +0 -1
  793. package/dist/mcp/tools/index.d.ts +0 -2
  794. package/dist/mcp/tools/index.js +0 -1
  795. package/dist/mcp/tools/results.d.ts +0 -2
  796. package/dist/mcp/tools/results.js +0 -1
@@ -1 +1,86 @@
1
- export default{"auth.register.success":"Registration successful! Please log in.","auth.register.loadError":"Unable to load data. Please try again.","auth.register.title":"Create Account","auth.register.description":"Register a student account for Ocean Edu Exam","auth.register.withGoogle":"Sign up with Google","auth.register.signingUp":"Signing up...","auth.register.nameLabel":"Full Name","auth.register.namePlaceholder":"John Doe","auth.register.branchLabel":"Branch","auth.register.branchPlaceholder":"-- Select branch --","auth.register.levelLabel":"Level","auth.register.levelPlaceholder":"-- Select level --","auth.register.phoneLabel":"Phone Number","auth.register.phonePlaceholder":"0901234567","auth.register.emailLabel":"Email","auth.register.emailPlaceholder":"email@example.com","auth.register.identifierLabel":"Email or Username","auth.register.identifierPlaceholder":"email@example.com or username","auth.register.usernameLabel":"Username","auth.register.usernamePlaceholder":"username","auth.register.passwordLabel":"Password","auth.register.passwordPlaceholder":"••••••••","auth.register.confirmPasswordLabel":"Confirm Password","auth.register.confirmPasswordPlaceholder":"••••••••","auth.register.submit":"Register","auth.register.submitting":"Registering...","auth.register.failed":"Registration failed. Please try again.","auth.register.emailExists":"Email is already in use","auth.register.identifierExists":"Email or username is already in use","auth.register.phoneExists":"Phone number is already in use","auth.register.usernameExists":"Username is already in use","auth.register.loading":"Loading...","auth.register.hasAccount":"Already have an account?","auth.register.loginNow":"Sign in","auth.upgrade.success":"Account updated! Please log in again with your new email and password.","auth.upgrade.clientError":"An error occurred. Please try again.","auth.upgrade.systemError":"System error. Please try again later.","auth.lead.branchLoadError":"Unable to load branch list. Please reload the page.","auth.lead.submitSuccess":"Registration successful! Redirecting...","auth.login.title":"Ocean Edu Exam","auth.login.description":"Sign in to continue using the system","auth.login.withGoogle":"Sign in with Google","auth.login.loggingIn":"Signing in...","auth.login.secureNote":"Secure & Safe","auth.login.termsAgreement":"By signing in, you agree to our","auth.login.termsOfService":"Terms of Service","auth.login.emailLabel":"Email","auth.login.emailPlaceholder":"your-email@oceanedu.com","auth.login.identifierLabel":"Email or Username","auth.login.identifierPlaceholder":"email@oceanedu.com or username","auth.login.passwordLabel":"Password","auth.login.passwordPlaceholder":"••••••••","auth.login.submit":"Sign in","auth.login.submitting":"Signing in...","auth.login.failed":"Sign in failed","auth.login.or":"or","auth.login.googleError":"Google sign in failed. Please try again.","auth.login.noAccount":"Don't have an account?","auth.login.registerNow":"Register now","auth.completeProfile.title":"Complete Your Profile","auth.completeProfile.description":"Please update your personal information to use the system","auth.completeProfile.nameLabel":"Full Name","auth.completeProfile.namePlaceholder":"John Doe","auth.completeProfile.nameRequired":"Please enter your name","auth.completeProfile.phoneLabel":"Phone Number","auth.completeProfile.phonePlaceholder":"0901234567","auth.completeProfile.phoneRequired":"Please enter your phone number","auth.completeProfile.phoneInvalid":"Invalid phone number (10-11 digits)","auth.completeProfile.levelLabel":"English Level","auth.completeProfile.levelPlaceholder":"-- Select level --","auth.completeProfile.levelRequired":"Please select your English level","auth.completeProfile.dateOfBirthLabel":"Date of Birth","auth.completeProfile.branchLabel":"Branch","auth.completeProfile.branchPlaceholder":"-- Select branch (optional) --","auth.completeProfile.submit":"Complete","auth.completeProfile.submitting":"Updating...","auth.completeProfile.success":"Profile updated successfully!","auth.completeProfile.failed":"Update failed. Please try again."};
1
+ const auth = {
2
+ // Register
3
+ 'auth.register.success': 'Registration successful! Please log in.',
4
+ 'auth.register.loadError': 'Unable to load data. Please try again.',
5
+ 'auth.register.title': 'Create Account',
6
+ 'auth.register.description': 'Register a student account for Ocean Edu Exam',
7
+ 'auth.register.withGoogle': 'Sign up with Google',
8
+ 'auth.register.signingUp': 'Signing up...',
9
+ 'auth.register.nameLabel': 'Full Name',
10
+ 'auth.register.namePlaceholder': 'John Doe',
11
+ 'auth.register.branchLabel': 'Branch',
12
+ 'auth.register.branchPlaceholder': '-- Select branch --',
13
+ 'auth.register.levelLabel': 'Level',
14
+ 'auth.register.levelPlaceholder': '-- Select level --',
15
+ 'auth.register.phoneLabel': 'Phone Number',
16
+ 'auth.register.phonePlaceholder': '0901234567',
17
+ 'auth.register.emailLabel': 'Email',
18
+ 'auth.register.emailPlaceholder': 'email@example.com',
19
+ 'auth.register.identifierLabel': 'Email or Username',
20
+ 'auth.register.identifierPlaceholder': 'email@example.com or username',
21
+ 'auth.register.usernameLabel': 'Username',
22
+ 'auth.register.usernamePlaceholder': 'username',
23
+ 'auth.register.passwordLabel': 'Password',
24
+ 'auth.register.passwordPlaceholder': '••••••••',
25
+ 'auth.register.confirmPasswordLabel': 'Confirm Password',
26
+ 'auth.register.confirmPasswordPlaceholder': '••••••••',
27
+ 'auth.register.submit': 'Register',
28
+ 'auth.register.submitting': 'Registering...',
29
+ 'auth.register.failed': 'Registration failed. Please try again.',
30
+ 'auth.register.emailExists': 'Email is already in use',
31
+ 'auth.register.identifierExists': 'Email or username is already in use',
32
+ 'auth.register.phoneExists': 'Phone number is already in use',
33
+ 'auth.register.usernameExists': 'Username is already in use',
34
+ 'auth.register.loading': 'Loading...',
35
+ 'auth.register.hasAccount': 'Already have an account?',
36
+ 'auth.register.loginNow': 'Sign in',
37
+ // Account upgrade
38
+ 'auth.upgrade.success': 'Account updated! Please log in again with your new email and password.',
39
+ 'auth.upgrade.clientError': 'An error occurred. Please try again.',
40
+ 'auth.upgrade.systemError': 'System error. Please try again later.',
41
+ // Landing lead form
42
+ 'auth.lead.branchLoadError': 'Unable to load branch list. Please reload the page.',
43
+ 'auth.lead.submitSuccess': 'Registration successful! Redirecting...',
44
+ // Login dialog
45
+ 'auth.login.title': 'Ocean Edu Exam',
46
+ 'auth.login.description': 'Sign in to continue using the system',
47
+ 'auth.login.withGoogle': 'Sign in with Google',
48
+ 'auth.login.loggingIn': 'Signing in...',
49
+ 'auth.login.secureNote': 'Secure & Safe',
50
+ 'auth.login.termsAgreement': 'By signing in, you agree to our',
51
+ 'auth.login.termsOfService': 'Terms of Service',
52
+ 'auth.login.emailLabel': 'Email',
53
+ 'auth.login.emailPlaceholder': 'your-email@oceanedu.com',
54
+ 'auth.login.identifierLabel': 'Email or Username',
55
+ 'auth.login.identifierPlaceholder': 'email@oceanedu.com or username',
56
+ 'auth.login.passwordLabel': 'Password',
57
+ 'auth.login.passwordPlaceholder': '••••••••',
58
+ 'auth.login.submit': 'Sign in',
59
+ 'auth.login.submitting': 'Signing in...',
60
+ 'auth.login.failed': 'Sign in failed',
61
+ 'auth.login.or': 'or',
62
+ 'auth.login.googleError': 'Google sign in failed. Please try again.',
63
+ 'auth.login.noAccount': "Don't have an account?",
64
+ 'auth.login.registerNow': 'Register now',
65
+ // Complete profile dialog
66
+ 'auth.completeProfile.title': 'Complete Your Profile',
67
+ 'auth.completeProfile.description': 'Please update your personal information to use the system',
68
+ 'auth.completeProfile.nameLabel': 'Full Name',
69
+ 'auth.completeProfile.namePlaceholder': 'John Doe',
70
+ 'auth.completeProfile.nameRequired': 'Please enter your name',
71
+ 'auth.completeProfile.phoneLabel': 'Phone Number',
72
+ 'auth.completeProfile.phonePlaceholder': '0901234567',
73
+ 'auth.completeProfile.phoneRequired': 'Please enter your phone number',
74
+ 'auth.completeProfile.phoneInvalid': 'Invalid phone number (10-11 digits)',
75
+ 'auth.completeProfile.levelLabel': 'English Level',
76
+ 'auth.completeProfile.levelPlaceholder': '-- Select level --',
77
+ 'auth.completeProfile.levelRequired': 'Please select your English level',
78
+ 'auth.completeProfile.dateOfBirthLabel': 'Date of Birth',
79
+ 'auth.completeProfile.branchLabel': 'Branch',
80
+ 'auth.completeProfile.branchPlaceholder': '-- Select branch (optional) --',
81
+ 'auth.completeProfile.submit': 'Complete',
82
+ 'auth.completeProfile.submitting': 'Updating...',
83
+ 'auth.completeProfile.success': 'Profile updated successfully!',
84
+ 'auth.completeProfile.failed': 'Update failed. Please try again.',
85
+ };
86
+ export default auth;
@@ -1 +1,140 @@
1
- export default{"common.http.400":"Invalid data. Please check your input!","common.http.403":"You do not have permission to perform this action!","common.http.404":"Data not found!","common.http.409":"Data already exists!","common.http.500":"Server error. Please try again later!","common.http.generic":"An error occurred. Please try again!","common.cancel":"Cancel","common.close":"Close","common.error.system":"System error. Please try again later.","common.error.loadData":"Unable to load data. Please try again.","common.form.validationError":"Please check your input!","common.comingSoon":"Coming soon","common.examCreator.fillInfoBeforeSave":"Please fill in all information before saving!","common.examCreator.invalidQuestions":"Invalid question(s): {errors}","common.examCreator.noValidData":"No valid question data","common.examCreator.saveError":"Error saving question {index}","common.examCreator.saveWithBankSuccess":'Successfully saved question {index} and added to question bank with code "{code}".',"common.examCreator.saveSuccess":"Successfully saved question {index}.","common.examCreator.bankSelected":'Question selected from bank. Click "Save question" to save.',"common.examCreator.saveBeforeExit":"Please save the current question before exiting.","common.examCreator.previewLoadError":"Unable to load questions","common.autoFill.loadBankError":"Unable to load question bank information","common.autoFill.noQuestions":"No questions to fill","common.autoFill.success":"Filled {count} questions from bank","common.autoFill.noneApplied":"No questions were filled","common.autoFill.error":"An error occurred while auto-filling questions","common.question.create.fillInfo":"Please fill in all information!","common.question.create.success":"Question created successfully.","common.questionGroup.create.fillInfo":"Please fill in all information and select at least 1 question!","common.questionGroup.create.success":"Question group created successfully!","common.multipleChoice.minAnswers":"Minimum 2 answers required!","common.multipleChoice.enterQuestion":"Please enter the question!","common.multipleChoice.atLeastTwo":"Must have at least 2 answers!","common.multipleChoice.selectCorrect":"Please select the correct answer!","common.questionType.missingAnswer":"Missing cell #{index} at position ({row}, {col}): Please enter an answer!","common.questionType.addImage":"Question {index}: Please add an image","common.questionType.enterContent":"Question {index}: Please enter content","common.questionType.answerTooLong":"Answer cannot exceed {limit} words","common.audio.maxPlayReached":"You can only listen up to {maxPlay} times!","layout.sidebar.admin.dashboard":"Dashboard","layout.sidebar.admin.users":"User Management","layout.sidebar.admin.roles":"Roles","layout.sidebar.admin.classrooms":"Class Management","layout.sidebar.admin.branches":"Branch Management","layout.sidebar.admin.contests":"Contest Management","layout.sidebar.admin.rooms":"Room Management","layout.sidebar.admin.exams":"Exam Management","layout.sidebar.admin.questionBanks":"Question Banks","layout.sidebar.admin.schedules":"Schedule Management","layout.sidebar.admin.templates":"Exam Templates","layout.sidebar.admin.testParticipants":"Test Participants","layout.sidebar.admin.reports":"Reports","layout.sidebar.admin.settings":"System Settings","layout.sidebar.student.home":"Home","layout.sidebar.student.contests":"Contests","layout.sidebar.student.discoverContests":"Discover Contests","layout.sidebar.student.myContests":"My Contests","layout.sidebar.student.mySchedule":"My Schedule","layout.sidebar.student.examRooms":"Exam Rooms","layout.sidebar.student.roomList":"Room List","layout.sidebar.student.joinedRooms":"Joined Rooms","layout.sidebar.student.results":"Results","layout.sidebar.student.history":"Exam History","layout.sidebar.logout":"Log out","layout.sidebar.loggingOut":"Logging out...","layout.sidebar.expand":"Expand menu","layout.sidebar.collapse":"Collapse menu","layout.sidebar.systemAdmin.dashboard":"Dashboard","layout.sidebar.systemAdmin.users":"User Management","layout.topbar.greeting":"Hello, {name}","layout.topbar.notification":"Notifications","layout.topbar.userMenu":"User menu","layout.topbar.profile":"Profile","layout.topbar.changePassword":"Change Password","layout.topbar.systemAdmin":"System Admin","common.pagination.showing":"Showing {start} - {end} of {total} records","common.pagination.display":"Show:","common.pagination.first":"First","common.pagination.previous":"Previous","common.pagination.next":"Next","common.pagination.last":"Last","common.table.loading":"Loading data...","common.table.showing":"Showing {count} of {total} records","common.table.all":"All","common.table.clearFilters":"Clear filters","common.table.defaultTitle":"List","common.table.noData":"No data","common.table.search":"Search...","common.badge.role.systemAdmin":"System Admin","common.badge.role.admin":"Admin","common.badge.role.teacher":"Teacher","common.badge.role.student":"Student","common.badge.status.active":"Active","common.badge.status.inactive":"Inactive","common.badge.status.verified":"Verified","common.badge.status.pending":"Pending","common.badge.status.processing":"Processing","common.badge.status.completed":"Completed","common.badge.status.approved":"Approved","common.badge.status.graded":"Graded","common.badge.status.draft":"Draft","common.badge.status.rejected":"Rejected","common.badge.status.cancelled":"Cancelled","common.badge.status.failed":"Failed","common.badge.status.error":"Error","common.badge.status.locked":"Locked","common.badge.status.open":"Open","common.badge.status.ready":"Ready","common.badge.status.inProgress":"In Progress","common.badge.status.paid":"Paid","common.badge.status.success":"Success","common.badge.status.info":"Info","common.badge.status.unpaid":"Unpaid","common.badge.status.warning":"Warning","common.badge.status.overdue":"Overdue","common.badge.status.disabled":"Disabled","common.badge.status.archived":"Archived","common.badge.source.selfRegistered":"Self-registered","common.badge.source.createdByAdmin":"Created by admin","common.badge.source.createdByTeacher":"Created by teacher","common.badge.source.createdFromEBM":"Synced from EBM"};
1
+ const common = {
2
+ // HTTP status errors
3
+ 'common.http.400': 'Invalid data. Please check your input!',
4
+ 'common.http.403': 'You do not have permission to perform this action!',
5
+ 'common.http.404': 'Data not found!',
6
+ 'common.http.409': 'Data already exists!',
7
+ 'common.http.500': 'Server error. Please try again later!',
8
+ 'common.http.generic': 'An error occurred. Please try again!',
9
+ // Generic
10
+ 'common.cancel': 'Cancel',
11
+ 'common.close': 'Close',
12
+ 'common.error.system': 'System error. Please try again later.',
13
+ 'common.error.loadData': 'Unable to load data. Please try again.',
14
+ 'common.form.validationError': 'Please check your input!',
15
+ 'common.comingSoon': 'Coming soon',
16
+ // Exam creator (shared between admin & teacher)
17
+ 'common.examCreator.fillInfoBeforeSave': 'Please fill in all information before saving!',
18
+ 'common.examCreator.invalidQuestions': 'Invalid question(s): {errors}',
19
+ 'common.examCreator.noValidData': 'No valid question data',
20
+ 'common.examCreator.saveError': 'Error saving question {index}',
21
+ 'common.examCreator.saveWithBankSuccess': 'Successfully saved question {index} and added to question bank with code "{code}".',
22
+ 'common.examCreator.saveSuccess': 'Successfully saved question {index}.',
23
+ 'common.examCreator.bankSelected': 'Question selected from bank. Click "Save question" to save.',
24
+ 'common.examCreator.saveBeforeExit': 'Please save the current question before exiting.',
25
+ 'common.examCreator.previewLoadError': 'Unable to load questions',
26
+ // Auto fill questions
27
+ 'common.autoFill.loadBankError': 'Unable to load question bank information',
28
+ 'common.autoFill.noQuestions': 'No questions to fill',
29
+ 'common.autoFill.success': 'Filled {count} questions from bank',
30
+ 'common.autoFill.noneApplied': 'No questions were filled',
31
+ 'common.autoFill.error': 'An error occurred while auto-filling questions',
32
+ // Question creator
33
+ 'common.question.create.fillInfo': 'Please fill in all information!',
34
+ 'common.question.create.success': 'Question created successfully.',
35
+ 'common.questionGroup.create.fillInfo': 'Please fill in all information and select at least 1 question!',
36
+ 'common.questionGroup.create.success': 'Question group created successfully!',
37
+ // Multiple choice validation
38
+ 'common.multipleChoice.minAnswers': 'Minimum 2 answers required!',
39
+ 'common.multipleChoice.enterQuestion': 'Please enter the question!',
40
+ 'common.multipleChoice.atLeastTwo': 'Must have at least 2 answers!',
41
+ 'common.multipleChoice.selectCorrect': 'Please select the correct answer!',
42
+ // Question type validations
43
+ 'common.questionType.missingAnswer': 'Missing cell #{index} at position ({row}, {col}): Please enter an answer!',
44
+ 'common.questionType.addImage': 'Question {index}: Please add an image',
45
+ 'common.questionType.enterContent': 'Question {index}: Please enter content',
46
+ 'common.questionType.answerTooLong': 'Answer cannot exceed {limit} words',
47
+ // Audio
48
+ 'common.audio.maxPlayReached': 'You can only listen up to {maxPlay} times!',
49
+ // Layout — Sidebar
50
+ 'layout.sidebar.admin.dashboard': 'Dashboard',
51
+ 'layout.sidebar.admin.users': 'User Management',
52
+ 'layout.sidebar.admin.roles': 'Roles',
53
+ 'layout.sidebar.admin.classrooms': 'Class Management',
54
+ 'layout.sidebar.admin.branches': 'Branch Management',
55
+ 'layout.sidebar.admin.contests': 'Contest Management',
56
+ 'layout.sidebar.admin.rooms': 'Room Management',
57
+ 'layout.sidebar.admin.exams': 'Exam Management',
58
+ 'layout.sidebar.admin.questionBanks': 'Question Banks',
59
+ 'layout.sidebar.admin.schedules': 'Schedule Management',
60
+ 'layout.sidebar.admin.templates': 'Exam Templates',
61
+ 'layout.sidebar.admin.testParticipants': 'Test Participants',
62
+ 'layout.sidebar.admin.reports': 'Reports',
63
+ 'layout.sidebar.admin.settings': 'System Settings',
64
+ 'layout.sidebar.student.home': 'Home',
65
+ 'layout.sidebar.student.contests': 'Contests',
66
+ 'layout.sidebar.student.discoverContests': 'Discover Contests',
67
+ 'layout.sidebar.student.myContests': 'My Contests',
68
+ 'layout.sidebar.student.mySchedule': 'My Schedule',
69
+ 'layout.sidebar.student.examRooms': 'Exam Rooms',
70
+ 'layout.sidebar.student.roomList': 'Room List',
71
+ 'layout.sidebar.student.joinedRooms': 'Joined Rooms',
72
+ 'layout.sidebar.student.results': 'Results',
73
+ 'layout.sidebar.student.history': 'Exam History',
74
+ 'layout.sidebar.logout': 'Log out',
75
+ 'layout.sidebar.loggingOut': 'Logging out...',
76
+ 'layout.sidebar.expand': 'Expand menu',
77
+ 'layout.sidebar.collapse': 'Collapse menu',
78
+ // Layout — Sidebar (System Admin)
79
+ 'layout.sidebar.systemAdmin.dashboard': 'Dashboard',
80
+ 'layout.sidebar.systemAdmin.users': 'User Management',
81
+ // Layout — Topbar
82
+ 'layout.topbar.greeting': 'Hello, {name}',
83
+ 'layout.topbar.notification': 'Notifications',
84
+ 'layout.topbar.userMenu': 'User menu',
85
+ 'layout.topbar.profile': 'Profile',
86
+ 'layout.topbar.changePassword': 'Change Password',
87
+ 'layout.topbar.systemAdmin': 'System Admin',
88
+ // Pagination
89
+ 'common.pagination.showing': 'Showing {start} - {end} of {total} records',
90
+ 'common.pagination.display': 'Show:',
91
+ 'common.pagination.first': 'First',
92
+ 'common.pagination.previous': 'Previous',
93
+ 'common.pagination.next': 'Next',
94
+ 'common.pagination.last': 'Last',
95
+ // Table
96
+ 'common.table.loading': 'Loading data...',
97
+ 'common.table.showing': 'Showing {count} of {total} records',
98
+ 'common.table.all': 'All',
99
+ 'common.table.clearFilters': 'Clear filters',
100
+ 'common.table.defaultTitle': 'List',
101
+ 'common.table.noData': 'No data',
102
+ 'common.table.search': 'Search...',
103
+ // Badge — Role
104
+ 'common.badge.role.systemAdmin': 'System Admin',
105
+ 'common.badge.role.admin': 'Admin',
106
+ 'common.badge.role.teacher': 'Teacher',
107
+ 'common.badge.role.student': 'Student',
108
+ // Badge — Status
109
+ 'common.badge.status.active': 'Active',
110
+ 'common.badge.status.inactive': 'Inactive',
111
+ 'common.badge.status.verified': 'Verified',
112
+ 'common.badge.status.pending': 'Pending',
113
+ 'common.badge.status.processing': 'Processing',
114
+ 'common.badge.status.completed': 'Completed',
115
+ 'common.badge.status.approved': 'Approved',
116
+ 'common.badge.status.graded': 'Graded',
117
+ 'common.badge.status.draft': 'Draft',
118
+ 'common.badge.status.rejected': 'Rejected',
119
+ 'common.badge.status.cancelled': 'Cancelled',
120
+ 'common.badge.status.failed': 'Failed',
121
+ 'common.badge.status.error': 'Error',
122
+ 'common.badge.status.locked': 'Locked',
123
+ 'common.badge.status.open': 'Open',
124
+ 'common.badge.status.ready': 'Ready',
125
+ 'common.badge.status.inProgress': 'In Progress',
126
+ 'common.badge.status.paid': 'Paid',
127
+ 'common.badge.status.success': 'Success',
128
+ 'common.badge.status.info': 'Info',
129
+ 'common.badge.status.unpaid': 'Unpaid',
130
+ 'common.badge.status.warning': 'Warning',
131
+ 'common.badge.status.overdue': 'Overdue',
132
+ 'common.badge.status.disabled': 'Disabled',
133
+ 'common.badge.status.archived': 'Archived',
134
+ // Badge — Registration Source
135
+ 'common.badge.source.selfRegistered': 'Self-registered',
136
+ 'common.badge.source.createdByAdmin': 'Created by admin',
137
+ 'common.badge.source.createdByTeacher': 'Created by teacher',
138
+ 'common.badge.source.createdFromEBM': 'Synced from EBM',
139
+ };
140
+ export default common;
@@ -1 +1,18 @@
1
- export default{"fileUpload.success":"File uploaded successfully!","fileUpload.error":"File upload error: {message}","fileUpload.invalidFormat":"Invalid file format. Please select a file with format: {accept}","fileUpload.tooLarge":"File too large! Maximum size: {maxSize}MB","fileUpload.uploaded":"Uploaded: {name}","fileUpload.audio.success":"Audio file uploaded successfully!","fileUpload.audio.missingExamId":"Missing examId for audio upload","fileUpload.audio.error":"Unable to upload audio file. Please try again.","fileUpload.audio.timeout":"Audio upload timed out. Please try again.","fileUpload.audio.networkError":"Network error. Please check your connection and try again.","fileUpload.audio.tooLarge":"Audio file exceeds the allowed size. Please select a smaller file.","fileUpload.audio.noUrl":"No audio URL available to play","fileUpload.audio.playError":"Unable to play audio file"};
1
+ const fileUpload = {
2
+ // Generic file upload
3
+ 'fileUpload.success': 'File uploaded successfully!',
4
+ 'fileUpload.error': 'File upload error: {message}',
5
+ 'fileUpload.invalidFormat': 'Invalid file format. Please select a file with format: {accept}',
6
+ 'fileUpload.tooLarge': 'File too large! Maximum size: {maxSize}MB',
7
+ 'fileUpload.uploaded': 'Uploaded: {name}',
8
+ // Audio upload
9
+ 'fileUpload.audio.success': 'Audio file uploaded successfully!',
10
+ 'fileUpload.audio.missingExamId': 'Missing examId for audio upload',
11
+ 'fileUpload.audio.error': 'Unable to upload audio file. Please try again.',
12
+ 'fileUpload.audio.timeout': 'Audio upload timed out. Please try again.',
13
+ 'fileUpload.audio.networkError': 'Network error. Please check your connection and try again.',
14
+ 'fileUpload.audio.tooLarge': 'Audio file exceeds the allowed size. Please select a smaller file.',
15
+ 'fileUpload.audio.noUrl': 'No audio URL available to play',
16
+ 'fileUpload.audio.playError': 'Unable to play audio file',
17
+ };
18
+ export default fileUpload;
@@ -1 +1,133 @@
1
- export default{"student.room.join.enterCode":"Please enter the room code","student.room.join.success":"Joined exam room successfully!","student.room.join.invalidCode":"Invalid room code","student.room.join.noAccess":"You do not have access to this exam room","student.room.join.unavailable":"Exam room is not available","student.room.join.error":"Unable to join exam room","student.exam.entry.loadError":"Unable to load exam room information","student.exam.entry.notStarted":"Exam has not started yet","student.exam.entry.expired":"Exam time has expired","student.exam.entry.startError":"Unable to start the exam","student.exam.entry.otherRoom":"You have an ongoing exam in another room. Please complete it first.","student.exam.entry.continue":"Continuing the exam!","student.exam.entry.restartError":"Unable to restart the exam","student.exam.take.noActive":"No active exam in progress","student.exam.take.otherRoom":"You have another exam in progress","student.exam.take.submitted":"Exam has been submitted","student.exam.take.timeExpired":"Time is up","student.exam.take.loadError":"Error loading the exam","student.exam.take.autoSubmit":"Time's up! Submitting...","student.exam.take.timeWarning":"5 minutes left! Please finish your exam.","student.exam.take.saved":"Saved","student.exam.take.saveError":"Save error","student.exam.take.submitSuccess":"Exam submitted successfully!","student.exam.take.submittedAIGradingInProgress":"Submitted! AI is grading your Speaking answers, please wait a moment...","student.exam.take.submitError":"Unable to submit. Please try again.","student.schedule.exportSuccess":"Exported exam schedule to Google Calendar","student.audio.maxPlayReached":"You can only listen up to {maxPlayCount} times!","student.contest.discover.title":"Discover Contests","student.contest.discover.description":"Explore and join public contests","student.contest.discover.search":"Search contests...","student.contest.discover.noContests":"No contests available at the moment","student.contest.discover.upcoming":"Upcoming","student.contest.discover.inProgress":"In Progress","student.contest.discover.completed":"Completed","student.contest.discover.all":"All","student.contest.discover.register":"Register","student.contest.discover.registered":"Registered","student.contest.discover.viewDetail":"View Details","student.contest.discover.participants":"{count} participants","student.contest.discover.timeRemaining":"{time} remaining","student.contest.discover.myContestsTitle":"My Contests","student.contest.discover.myContestsDescription":"Contests you are currently participating in","student.contest.discover.viewAll":"View All","student.contest.discover.noMyContests":"You have not joined any contests yet","student.contest.discover.noDescription":"No description yet","student.contest.my.title":"My Contests","student.contest.my.description":"Contests you are participating in or have participated in","student.contest.my.participating":"Participating","student.contest.my.completed":"Completed","student.contest.my.all":"All","student.contest.my.noContests":"You have not joined any contests yet","student.contest.my.goDiscover":"Discover Contests","student.contest.my.enterContest":"Enter Contest","student.contest.detail.schedules":"Schedules","student.contest.detail.rooms":"Exam Rooms","student.contest.detail.results":"Results","student.contest.detail.history":"Exam History","student.contest.detail.overview":"Overview","student.contest.detail.notFound":"Contest not found","student.contest.detail.backToContests":"Back to Contests","student.contest.detail.registerNow":"Register Now","student.contest.detail.alreadyRegistered":"Registered ✓","student.contest.detail.registering":"Registering...","student.contest.detail.startDate":"Start","student.contest.detail.endDate":"End","student.contest.detail.examRooms":"Exam Rooms","student.contest.detail.participants":"Participants","student.contest.detail.aboutContest":"About This Contest","student.contest.detail.examFlow":"Your Journey","student.contest.detail.flowStep1Title":"Explore","student.contest.detail.flowStep1Desc":"Read contest info and rules","student.contest.detail.flowStep2Title":"Register","student.contest.detail.flowStep2Desc":"Sign up to participate","student.contest.detail.flowStep3Title":"Enter Room","student.contest.detail.flowStep3Desc":"Join your exam room when it's time","student.contest.detail.flowStep4Title":"Take Exam","student.contest.detail.flowStep4Desc":"Complete the exam within time limit","student.contest.detail.flowStep5Title":"Get Results","student.contest.detail.flowStep5Desc":"View your score and ranking","student.contest.detail.statsTitle":"Contest Statistics","student.contest.detail.avgScore":"Average Score","student.contest.detail.highestScore":"Highest Score","student.contest.detail.completionRate":"Completion Rate","student.contest.detail.countdown.days":"Days","student.contest.detail.countdown.hours":"Hours","student.contest.detail.countdown.minutes":"Mins","student.contest.detail.countdown.seconds":"Secs","student.contest.detail.countdown.startsIn":"Contest starts in","student.contest.detail.countdown.endsIn":"Contest ends in","student.contest.detail.countdown.ended":"Contest has ended","student.contest.detail.quickActions":"Quick Actions","student.contest.detail.viewRooms":"View Rooms","student.contest.detail.viewSchedule":"View Schedule","student.contest.detail.viewResults":"View Results","student.contest.visibility.internal":"Internal","student.contest.visibility.internalBadge":"Internal Contest","student.contest.visibility.registerPendingApproval":"Registration pending approval","student.contest.visibility.pendingApprovalDesc":"Your registration request has been submitted and is pending admin/mod approval.","student.contest.visibility.registerRequiresApproval":"Register (requires approval)","student.contest.visibility.approvalRequired":"Approval required","student.contest.visibility.approvalRequiredDesc":"This is an internal contest. After registering, you need admin or mod approval to participate.","student.contest.visibility.privateTitle":"Private Contest","student.contest.visibility.privateDesc":"This contest is private. You cannot view details or register. Please contact admin/mod to be added.","student.contest.visibility.accessDenied":"Access Denied","student.contest.visibility.accessDeniedDesc":"You do not have permission to view this contest.","student.contest.discover.registerSuccess":"Successfully registered for the contest!","student.contest.discover.registerPendingSuccess":"Registration request submitted! Please wait for admin/mod approval.","student.contest.discover.registerError":"Unable to register for the contest. Please try again.","student.contest.discover.cancelRegistration":"Cancel Registration","student.contest.discover.cancelRegistrationSuccess":"Successfully cancelled contest registration!","student.contest.discover.cancelRegistrationError":"Unable to cancel registration. Please try again.","student.contest.discover.cancelRegistrationExamAttempted":"Cannot cancel registration because you have already attempted the exam.","student.contest.discover.cancelRegistrationNotFound":"Contest registration not found.","student.contest.discover.cancelling":"Cancelling...","student.contest.registration.pending":"Pending Approval","student.contest.registration.pendingBadge":"⏳ Pending","student.contest.registration.pendingDesc":"Your registration request has been submitted and is waiting for admin approval.","student.contest.registration.rejected":"Registration Rejected","student.contest.registration.rejectedBadge":"✗ Rejected","student.contest.registration.rejectedDesc":"Your registration request has been rejected. Please contact admin for details.","student.contest.registration.approved":"Approved"};
1
+ const student = {
2
+ // Room & joining
3
+ 'student.room.join.enterCode': 'Please enter the room code',
4
+ 'student.room.join.success': 'Joined exam room successfully!',
5
+ 'student.room.join.invalidCode': 'Invalid room code',
6
+ 'student.room.join.noAccess': 'You do not have access to this exam room',
7
+ 'student.room.join.unavailable': 'Exam room is not available',
8
+ 'student.room.join.error': 'Unable to join exam room',
9
+ // Exam entry
10
+ 'student.exam.entry.loadError': 'Unable to load exam room information',
11
+ 'student.exam.entry.notStarted': 'Exam has not started yet',
12
+ 'student.exam.entry.expired': 'Exam time has expired',
13
+ 'student.exam.entry.startError': 'Unable to start the exam',
14
+ 'student.exam.entry.otherRoom': 'You have an ongoing exam in another room. Please complete it first.',
15
+ 'student.exam.entry.continue': 'Continuing the exam!',
16
+ 'student.exam.entry.restartError': 'Unable to restart the exam',
17
+ // Exam taking
18
+ 'student.exam.take.noActive': 'No active exam in progress',
19
+ 'student.exam.take.otherRoom': 'You have another exam in progress',
20
+ 'student.exam.take.submitted': 'Exam has been submitted',
21
+ 'student.exam.take.timeExpired': 'Time is up',
22
+ 'student.exam.take.loadError': 'Error loading the exam',
23
+ 'student.exam.take.autoSubmit': "Time's up! Submitting...",
24
+ 'student.exam.take.timeWarning': '5 minutes left! Please finish your exam.',
25
+ 'student.exam.take.saved': 'Saved',
26
+ 'student.exam.take.saveError': 'Save error',
27
+ 'student.exam.take.submitSuccess': 'Exam submitted successfully!',
28
+ 'student.exam.take.submittedAIGradingInProgress': 'Submitted! AI is grading your Speaking answers, please wait a moment...',
29
+ 'student.exam.take.submitError': 'Unable to submit. Please try again.',
30
+ // Schedule
31
+ 'student.schedule.exportSuccess': 'Exported exam schedule to Google Calendar',
32
+ // Audio
33
+ 'student.audio.maxPlayReached': 'You can only listen up to {maxPlayCount} times!',
34
+ // Contest pages
35
+ 'student.contest.discover.title': 'Discover Contests',
36
+ 'student.contest.discover.description': 'Explore and join public contests',
37
+ 'student.contest.discover.search': 'Search contests...',
38
+ 'student.contest.discover.noContests': 'No contests available at the moment',
39
+ 'student.contest.discover.upcoming': 'Upcoming',
40
+ 'student.contest.discover.inProgress': 'In Progress',
41
+ 'student.contest.discover.completed': 'Completed',
42
+ 'student.contest.discover.all': 'All',
43
+ 'student.contest.discover.register': 'Register',
44
+ 'student.contest.discover.registered': 'Registered',
45
+ 'student.contest.discover.viewDetail': 'View Details',
46
+ 'student.contest.discover.participants': '{count} participants',
47
+ 'student.contest.discover.timeRemaining': '{time} remaining',
48
+ 'student.contest.discover.myContestsTitle': 'My Contests',
49
+ 'student.contest.discover.myContestsDescription': 'Contests you are currently participating in',
50
+ 'student.contest.discover.viewAll': 'View All',
51
+ 'student.contest.discover.noMyContests': 'You have not joined any contests yet',
52
+ 'student.contest.discover.noDescription': 'No description yet',
53
+ 'student.contest.my.title': 'My Contests',
54
+ 'student.contest.my.description': 'Contests you are participating in or have participated in',
55
+ 'student.contest.my.participating': 'Participating',
56
+ 'student.contest.my.completed': 'Completed',
57
+ 'student.contest.my.all': 'All',
58
+ 'student.contest.my.noContests': 'You have not joined any contests yet',
59
+ 'student.contest.my.goDiscover': 'Discover Contests',
60
+ 'student.contest.my.enterContest': 'Enter Contest',
61
+ 'student.contest.detail.schedules': 'Schedules',
62
+ 'student.contest.detail.rooms': 'Exam Rooms',
63
+ 'student.contest.detail.results': 'Results',
64
+ 'student.contest.detail.history': 'Exam History',
65
+ 'student.contest.detail.overview': 'Overview',
66
+ 'student.contest.detail.notFound': 'Contest not found',
67
+ 'student.contest.detail.backToContests': 'Back to Contests',
68
+ // Contest detail - redesign
69
+ 'student.contest.detail.registerNow': 'Register Now',
70
+ 'student.contest.detail.alreadyRegistered': 'Registered ✓',
71
+ 'student.contest.detail.registering': 'Registering...',
72
+ 'student.contest.detail.startDate': 'Start',
73
+ 'student.contest.detail.endDate': 'End',
74
+ 'student.contest.detail.examRooms': 'Exam Rooms',
75
+ 'student.contest.detail.participants': 'Participants',
76
+ 'student.contest.detail.aboutContest': 'About This Contest',
77
+ 'student.contest.detail.examFlow': 'Your Journey',
78
+ 'student.contest.detail.flowStep1Title': 'Explore',
79
+ 'student.contest.detail.flowStep1Desc': 'Read contest info and rules',
80
+ 'student.contest.detail.flowStep2Title': 'Register',
81
+ 'student.contest.detail.flowStep2Desc': 'Sign up to participate',
82
+ 'student.contest.detail.flowStep3Title': 'Enter Room',
83
+ 'student.contest.detail.flowStep3Desc': 'Join your exam room when it\'s time',
84
+ 'student.contest.detail.flowStep4Title': 'Take Exam',
85
+ 'student.contest.detail.flowStep4Desc': 'Complete the exam within time limit',
86
+ 'student.contest.detail.flowStep5Title': 'Get Results',
87
+ 'student.contest.detail.flowStep5Desc': 'View your score and ranking',
88
+ 'student.contest.detail.statsTitle': 'Contest Statistics',
89
+ 'student.contest.detail.avgScore': 'Average Score',
90
+ 'student.contest.detail.highestScore': 'Highest Score',
91
+ 'student.contest.detail.completionRate': 'Completion Rate',
92
+ 'student.contest.detail.countdown.days': 'Days',
93
+ 'student.contest.detail.countdown.hours': 'Hours',
94
+ 'student.contest.detail.countdown.minutes': 'Mins',
95
+ 'student.contest.detail.countdown.seconds': 'Secs',
96
+ 'student.contest.detail.countdown.startsIn': 'Contest starts in',
97
+ 'student.contest.detail.countdown.endsIn': 'Contest ends in',
98
+ 'student.contest.detail.countdown.ended': 'Contest has ended',
99
+ 'student.contest.detail.quickActions': 'Quick Actions',
100
+ 'student.contest.detail.viewRooms': 'View Rooms',
101
+ 'student.contest.detail.viewSchedule': 'View Schedule',
102
+ 'student.contest.detail.viewResults': 'View Results',
103
+ // Contest visibility
104
+ 'student.contest.visibility.internal': 'Internal',
105
+ 'student.contest.visibility.internalBadge': 'Internal Contest',
106
+ 'student.contest.visibility.registerPendingApproval': 'Registration pending approval',
107
+ 'student.contest.visibility.pendingApprovalDesc': 'Your registration request has been submitted and is pending admin/mod approval.',
108
+ 'student.contest.visibility.registerRequiresApproval': 'Register (requires approval)',
109
+ 'student.contest.visibility.approvalRequired': 'Approval required',
110
+ 'student.contest.visibility.approvalRequiredDesc': 'This is an internal contest. After registering, you need admin or mod approval to participate.',
111
+ 'student.contest.visibility.privateTitle': 'Private Contest',
112
+ 'student.contest.visibility.privateDesc': 'This contest is private. You cannot view details or register. Please contact admin/mod to be added.',
113
+ 'student.contest.visibility.accessDenied': 'Access Denied',
114
+ 'student.contest.visibility.accessDeniedDesc': 'You do not have permission to view this contest.',
115
+ 'student.contest.discover.registerSuccess': 'Successfully registered for the contest!',
116
+ 'student.contest.discover.registerPendingSuccess': 'Registration request submitted! Please wait for admin/mod approval.',
117
+ 'student.contest.discover.registerError': 'Unable to register for the contest. Please try again.',
118
+ 'student.contest.discover.cancelRegistration': 'Cancel Registration',
119
+ 'student.contest.discover.cancelRegistrationSuccess': 'Successfully cancelled contest registration!',
120
+ 'student.contest.discover.cancelRegistrationError': 'Unable to cancel registration. Please try again.',
121
+ 'student.contest.discover.cancelRegistrationExamAttempted': 'Cannot cancel registration because you have already attempted the exam.',
122
+ 'student.contest.discover.cancelRegistrationNotFound': 'Contest registration not found.',
123
+ 'student.contest.discover.cancelling': 'Cancelling...',
124
+ // Registration status
125
+ 'student.contest.registration.pending': 'Pending Approval',
126
+ 'student.contest.registration.pendingBadge': '⏳ Pending',
127
+ 'student.contest.registration.pendingDesc': 'Your registration request has been submitted and is waiting for admin approval.',
128
+ 'student.contest.registration.rejected': 'Registration Rejected',
129
+ 'student.contest.registration.rejectedBadge': '✗ Rejected',
130
+ 'student.contest.registration.rejectedDesc': 'Your registration request has been rejected. Please contact admin for details.',
131
+ 'student.contest.registration.approved': 'Approved',
132
+ };
133
+ export default student;
@@ -1 +1,37 @@
1
- export default{"terms.page.title":"Terms of Service","terms.page.lastUpdated":"Last updated: April 15, 2026","terms.page.backToHome":"Back to Home","terms.section1.title":"1. Introduction","terms.section1.content":'Ocean Edu Exam ("Platform") is an online examination system developed and operated by Ocean Edu International English Language System. By accessing and using the Platform, you agree to comply with the terms and conditions set forth in this document. If you do not agree with any of these terms, please stop using the Platform.',"terms.section2.title":"2. Terms of Use","terms.section2.content":"To use the Platform, you must meet the following conditions:\n• Be at least 6 years old. Users under 13 years of age require consent and supervision from a parent or legal guardian.\n• Provide accurate and complete registration information.\n• Accept and comply with all of these Terms of Service.\n• Not use the Platform for illegal purposes or in violation of the rights of others.","terms.section3.title":"3. User Account","terms.section3.content":"You are responsible for:\n• Keeping your login credentials (email/username and password) secure.\n• Not sharing your account with others.\n• Notifying us immediately if you discover unauthorized access to your account.\n• Providing accurate personal information and updating it when changes occur.\n\nWe are not responsible for any damages arising from your failure to secure your account.","terms.section4.title":"4. Examination Rules","terms.section4.content":"When participating in exams on the Platform, you agree to:\n• Complete the exam by yourself without assistance from others.\n• Not use reference materials, assistive software, or any form of cheating.\n• Not copy, screenshot, record, or share exam content in any form.\n• Comply with the time limits and specific rules of each examination.\n\nViolation of exam rules may result in exam result cancellation and account suspension.","terms.section5.title":"5. Intellectual Property","terms.section5.content":"All content on the Platform, including but not limited to: exam papers, questions, images, audio, video, interface, source code, and related materials are the intellectual property of Ocean Edu or its licensed partners.\n\nYou may not:\n• Copy, distribute, modify, or create derivative works from Platform content.\n• Use content for commercial purposes without written consent.\n• Extract system data using automated tools (crawlers, bots, scrapers).","terms.section6.title":"6. Privacy & Security","terms.section6.content":"We are committed to protecting your personal information:\n• We collect minimal data necessary to provide the service (full name, email, exam results).\n• We do not sell or share personal information with third parties for commercial purposes.\n• We apply technical security measures to protect user data.\n• Exam result data is stored securely and accessible only to the user or authorized administrators.\n\nPlease contact us if you wish to request deletion of your personal data.","terms.section7.title":"7. Limitation of Liability","terms.section7.content":'The Platform is provided on an "as-is" basis. We strive to ensure stable system operation but do not guarantee:\n• 100% uninterrupted service availability.\n• Absence of technical errors or system issues.\n• Exam results absolutely and accurately reflecting actual ability.\n\nWe are not liable for indirect damages arising from the use or inability to use the Platform.',"terms.section8.title":"8. Account Termination","terms.section8.content":"We reserve the right to temporarily suspend or permanently delete your account if:\n• You violate these Terms of Service.\n• Cheating behavior is detected in examinations.\n• The Platform is used to harass, sabotage, or harm other users.\n• False information is provided during registration.\n\nYou may also request account deletion at any time by contacting us.","terms.section9.title":"9. Changes to Terms","terms.section9.content":"We reserve the right to update or modify these Terms of Service at any time. When significant changes are made:\n• We will notify you on the Platform or via your registered email.\n• The update date will be clearly noted at the top of the page.\n• Your continued use of the Platform after changes take effect constitutes acceptance of the new terms.","terms.section10.title":"10. Contact","terms.section10.content":"If you have any questions or concerns about these Terms of Service, please contact us:\n\n• Email: support@ocean.edu.vn\n• Hotline: 1900 0340\n• Website: https://ocean.edu.vn"};
1
+ const terms = {
2
+ // Page
3
+ 'terms.page.title': 'Terms of Service',
4
+ 'terms.page.lastUpdated': 'Last updated: April 15, 2026',
5
+ 'terms.page.backToHome': 'Back to Home',
6
+ // Section 1 - Introduction
7
+ 'terms.section1.title': '1. Introduction',
8
+ 'terms.section1.content': 'Ocean Edu Exam ("Platform") is an online examination system developed and operated by Ocean Edu International English Language System. By accessing and using the Platform, you agree to comply with the terms and conditions set forth in this document. If you do not agree with any of these terms, please stop using the Platform.',
9
+ // Section 2 - Terms of Use
10
+ 'terms.section2.title': '2. Terms of Use',
11
+ 'terms.section2.content': 'To use the Platform, you must meet the following conditions:\n• Be at least 6 years old. Users under 13 years of age require consent and supervision from a parent or legal guardian.\n• Provide accurate and complete registration information.\n• Accept and comply with all of these Terms of Service.\n• Not use the Platform for illegal purposes or in violation of the rights of others.',
12
+ // Section 3 - User Account
13
+ 'terms.section3.title': '3. User Account',
14
+ 'terms.section3.content': 'You are responsible for:\n• Keeping your login credentials (email/username and password) secure.\n• Not sharing your account with others.\n• Notifying us immediately if you discover unauthorized access to your account.\n• Providing accurate personal information and updating it when changes occur.\n\nWe are not responsible for any damages arising from your failure to secure your account.',
15
+ // Section 4 - Exam Rules
16
+ 'terms.section4.title': '4. Examination Rules',
17
+ 'terms.section4.content': 'When participating in exams on the Platform, you agree to:\n• Complete the exam by yourself without assistance from others.\n• Not use reference materials, assistive software, or any form of cheating.\n• Not copy, screenshot, record, or share exam content in any form.\n• Comply with the time limits and specific rules of each examination.\n\nViolation of exam rules may result in exam result cancellation and account suspension.',
18
+ // Section 5 - Intellectual Property
19
+ 'terms.section5.title': '5. Intellectual Property',
20
+ 'terms.section5.content': 'All content on the Platform, including but not limited to: exam papers, questions, images, audio, video, interface, source code, and related materials are the intellectual property of Ocean Edu or its licensed partners.\n\nYou may not:\n• Copy, distribute, modify, or create derivative works from Platform content.\n• Use content for commercial purposes without written consent.\n• Extract system data using automated tools (crawlers, bots, scrapers).',
21
+ // Section 6 - Privacy & Security
22
+ 'terms.section6.title': '6. Privacy & Security',
23
+ 'terms.section6.content': 'We are committed to protecting your personal information:\n• We collect minimal data necessary to provide the service (full name, email, exam results).\n• We do not sell or share personal information with third parties for commercial purposes.\n• We apply technical security measures to protect user data.\n• Exam result data is stored securely and accessible only to the user or authorized administrators.\n\nPlease contact us if you wish to request deletion of your personal data.',
24
+ // Section 7 - Limitation of Liability
25
+ 'terms.section7.title': '7. Limitation of Liability',
26
+ 'terms.section7.content': 'The Platform is provided on an "as-is" basis. We strive to ensure stable system operation but do not guarantee:\n• 100% uninterrupted service availability.\n• Absence of technical errors or system issues.\n• Exam results absolutely and accurately reflecting actual ability.\n\nWe are not liable for indirect damages arising from the use or inability to use the Platform.',
27
+ // Section 8 - Account Termination
28
+ 'terms.section8.title': '8. Account Termination',
29
+ 'terms.section8.content': 'We reserve the right to temporarily suspend or permanently delete your account if:\n• You violate these Terms of Service.\n• Cheating behavior is detected in examinations.\n• The Platform is used to harass, sabotage, or harm other users.\n• False information is provided during registration.\n\nYou may also request account deletion at any time by contacting us.',
30
+ // Section 9 - Changes to Terms
31
+ 'terms.section9.title': '9. Changes to Terms',
32
+ 'terms.section9.content': 'We reserve the right to update or modify these Terms of Service at any time. When significant changes are made:\n• We will notify you on the Platform or via your registered email.\n• The update date will be clearly noted at the top of the page.\n• Your continued use of the Platform after changes take effect constitutes acceptance of the new terms.',
33
+ // Section 10 - Contact
34
+ 'terms.section10.title': '10. Contact',
35
+ 'terms.section10.content': 'If you have any questions or concerns about these Terms of Service, please contact us:\n\n• Email: support@ocean.edu.vn\n• Hotline: 1900 0340\n• Website: https://ocean.edu.vn',
36
+ };
37
+ export default terms;
@@ -275,6 +275,12 @@ declare const en: {
275
275
  readonly 'admin.questionBank.dialog.edit.save': "Save changes";
276
276
  readonly 'admin.questionBank.dialog.edit.codeError': "Please enter question code";
277
277
  readonly 'admin.questionBank.dialog.edit.titleError': "Please enter title";
278
+ readonly 'admin.questionBank.dialog.edit.loading': "Loading...";
279
+ readonly 'admin.questionBank.dialog.edit.unsupportedNote': "Note:";
280
+ readonly 'admin.questionBank.dialog.edit.unsupportedType': "Question type \"{type}\" is not editable in this UI. Please use the exam creator to edit this question.";
281
+ readonly 'admin.questionBank.dialog.edit.contentLabel': "Question content";
282
+ readonly 'admin.questionBank.dialog.edit.answerLabel': "Correct answer";
283
+ readonly 'admin.questionBank.dialog.edit.explanationLabel': "Explanation";
278
284
  readonly 'admin.questionBank.dialog.delete.title': "Confirm Delete Question";
279
285
  readonly 'admin.questionBank.dialog.delete.message': "Are you sure you want to delete question";
280
286
  readonly 'admin.questionBank.dialog.delete.warning': "This action cannot be undone.";
@@ -1544,9 +1550,6 @@ declare const en: {
1544
1550
  readonly 'admin.exams.shuffle.info3': "Questions within the same Part are randomly shuffled";
1545
1551
  readonly 'admin.exams.shuffle.info4': "Variants are linked to the parent exam for management";
1546
1552
  readonly 'admin.exams.shuffle.countLabel': "Number of variants to create";
1547
- readonly 'admin.exams.shuffle.strategyLabel': "Existing exam handling option";
1548
- readonly 'admin.exams.shuffle.keepOld': "Keep existing exams and add new ones";
1549
- readonly 'admin.exams.shuffle.replaceAll': "Create a completely new set";
1550
1553
  readonly 'admin.exams.shuffle.existingVariants': "Existing exams ({count})";
1551
1554
  readonly 'admin.exams.shuffle.deleteAll': "Delete all ({count})";
1552
1555
  readonly 'admin.exams.shuffle.loading': "Loading...";
@@ -1637,21 +1640,25 @@ declare const en: {
1637
1640
  readonly 'admin.exams.preview.totalPoints': "Total Points:";
1638
1641
  readonly 'admin.exams.preview.progress': "Progress";
1639
1642
  readonly 'admin.exams.preview.loading': "Loading...";
1640
- readonly 'admin.exams.preview.questionNavigation': "Question Navigation";
1643
+ readonly 'admin.exams.preview.questionNavigation': "Part Navigation";
1641
1644
  readonly 'admin.exams.preview.all': "All";
1642
1645
  readonly 'admin.exams.preview.allQuestions': "All {count} questions";
1643
1646
  readonly 'admin.exams.preview.partQuestions': "Part {part}: {count} questions";
1644
1647
  readonly 'admin.exams.preview.collapse': "Collapse";
1645
1648
  readonly 'admin.exams.preview.detail': "Details";
1646
1649
  readonly 'admin.exams.preview.questionIndex': "Question {index} / {total}";
1650
+ readonly 'admin.exams.preview.partIndex': "Part {index} / {total}";
1647
1651
  readonly 'admin.exams.preview.noQuestions': "No questions yet";
1648
1652
  readonly 'admin.exams.preview.loadingQuestions': "Loading questions...";
1649
1653
  readonly 'admin.exams.preview.retry': "Retry";
1650
1654
  readonly 'admin.exams.preview.examNoQuestions': "This exam has no questions yet.";
1651
1655
  readonly 'admin.exams.preview.prevQuestion': "Previous Question";
1656
+ readonly 'admin.exams.preview.prevPart': "Previous Part";
1652
1657
  readonly 'admin.exams.preview.prev': "Prev";
1653
1658
  readonly 'admin.exams.preview.nextQuestion': "Next Question";
1659
+ readonly 'admin.exams.preview.nextPart': "Next Part";
1654
1660
  readonly 'admin.exams.preview.next': "Next";
1661
+ readonly 'admin.exams.preview.questionLabel': "Question {number}";
1655
1662
  readonly 'admin.exams.preview.footerNote': "This is a preview mode to check the layout and content of the exam.";
1656
1663
  readonly 'admin.exams.preview.close': "Close";
1657
1664
  readonly 'admin.exams.preview.loadError': "Unable to load questions. Please try again.";
@@ -1 +1,15 @@
1
- import o from"./en/common";import m from"./en/auth";import r from"./en/admin";import t from"./en/student";import e from"./en/file-upload";import n from"./en/terms";const f={...o,...m,...r,...t,...e,...n};export default f;
1
+ import common from './en/common';
2
+ import auth from './en/auth';
3
+ import admin from './en/admin';
4
+ import student from './en/student';
5
+ import fileUpload from './en/file-upload';
6
+ import terms from './en/terms';
7
+ const en = {
8
+ ...common,
9
+ ...auth,
10
+ ...admin,
11
+ ...student,
12
+ ...fileUpload,
13
+ ...terms,
14
+ };
15
+ export default en;
@@ -118,6 +118,12 @@ declare const admin: {
118
118
  readonly 'admin.questionBank.dialog.edit.save': "Lưu thay đổi";
119
119
  readonly 'admin.questionBank.dialog.edit.codeError': "Vui lòng nhập mã câu hỏi";
120
120
  readonly 'admin.questionBank.dialog.edit.titleError': "Vui lòng nhập tiêu đề";
121
+ readonly 'admin.questionBank.dialog.edit.loading': "Đang tải...";
122
+ readonly 'admin.questionBank.dialog.edit.unsupportedNote': "Lưu ý:";
123
+ readonly 'admin.questionBank.dialog.edit.unsupportedType': "Loại câu hỏi \"{type}\" chưa hỗ trợ chỉnh sửa trực tiếp trong giao diện này. Vui lòng sử dụng trang tạo đề thi để chỉnh sửa câu hỏi này.";
124
+ readonly 'admin.questionBank.dialog.edit.contentLabel': "Nội dung câu hỏi";
125
+ readonly 'admin.questionBank.dialog.edit.answerLabel': "Đáp án đúng";
126
+ readonly 'admin.questionBank.dialog.edit.explanationLabel': "Giải thích";
121
127
  readonly 'admin.questionBank.dialog.delete.title': "Xác nhận xóa câu hỏi";
122
128
  readonly 'admin.questionBank.dialog.delete.message': "Bạn có chắc chắn muốn xóa câu hỏi";
123
129
  readonly 'admin.questionBank.dialog.delete.warning': "Hành động này không thể hoàn tác.";
@@ -1387,9 +1393,6 @@ declare const admin: {
1387
1393
  readonly 'admin.exams.shuffle.info3': "Các câu hỏi trong cùng 1 Part được xáo trộn ngẫu nhiên";
1388
1394
  readonly 'admin.exams.shuffle.info4': "Các đề thi con được liên kết với đề thi cha để quản lý";
1389
1395
  readonly 'admin.exams.shuffle.countLabel': "Số lượng đề thi con muốn tạo";
1390
- readonly 'admin.exams.shuffle.strategyLabel': "Lựa chọn xử lý đề thi cũ";
1391
- readonly 'admin.exams.shuffle.keepOld': "Giữ lại các đề thi cũ và thêm đề mới";
1392
- readonly 'admin.exams.shuffle.replaceAll': "Tạo bộ đề mới hoàn toàn";
1393
1396
  readonly 'admin.exams.shuffle.existingVariants': "Đề thi đã có ({count})";
1394
1397
  readonly 'admin.exams.shuffle.deleteAll': "Xóa tất cả ({count})";
1395
1398
  readonly 'admin.exams.shuffle.loading': "Đang tải...";
@@ -1480,21 +1483,25 @@ declare const admin: {
1480
1483
  readonly 'admin.exams.preview.totalPoints': "Tổng điểm:";
1481
1484
  readonly 'admin.exams.preview.progress': "Tiến độ";
1482
1485
  readonly 'admin.exams.preview.loading': "Đang tải...";
1483
- readonly 'admin.exams.preview.questionNavigation': "Điều hướng câu hỏi";
1486
+ readonly 'admin.exams.preview.questionNavigation': "Điều hướng Part";
1484
1487
  readonly 'admin.exams.preview.all': "Tất cả";
1485
1488
  readonly 'admin.exams.preview.allQuestions': "Tất cả {count} câu hỏi";
1486
1489
  readonly 'admin.exams.preview.partQuestions': "Part {part}: {count} câu";
1487
1490
  readonly 'admin.exams.preview.collapse': "Thu gọn";
1488
1491
  readonly 'admin.exams.preview.detail': "Chi tiết";
1489
1492
  readonly 'admin.exams.preview.questionIndex': "Câu hỏi {index} / {total}";
1493
+ readonly 'admin.exams.preview.partIndex': "Part {index} / {total}";
1490
1494
  readonly 'admin.exams.preview.noQuestions': "Chưa có câu hỏi";
1491
1495
  readonly 'admin.exams.preview.loadingQuestions': "Đang tải câu hỏi...";
1492
1496
  readonly 'admin.exams.preview.retry': "Thử lại";
1493
1497
  readonly 'admin.exams.preview.examNoQuestions': "Đề thi này chưa có câu hỏi nào.";
1494
1498
  readonly 'admin.exams.preview.prevQuestion': "Câu trước";
1499
+ readonly 'admin.exams.preview.prevPart': "Part trước";
1495
1500
  readonly 'admin.exams.preview.prev': "Trước";
1496
1501
  readonly 'admin.exams.preview.nextQuestion': "Câu tiếp theo";
1502
+ readonly 'admin.exams.preview.nextPart': "Part tiếp theo";
1497
1503
  readonly 'admin.exams.preview.next': "Tiếp";
1504
+ readonly 'admin.exams.preview.questionLabel': "Câu {number}";
1498
1505
  readonly 'admin.exams.preview.footerNote': "Đây là chế độ xem trước để kiểm tra bố cục và nội dung đề thi.";
1499
1506
  readonly 'admin.exams.preview.close': "Đóng";
1500
1507
  readonly 'admin.exams.preview.loadError': "Không thể tải câu hỏi. Vui lòng thử lại.";