@tinyweb_dev/oe-exam-sdk 0.1.1 → 0.1.2

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 (485) hide show
  1. package/dist/api/exam-create.js +1 -179
  2. package/dist/api/exam-create.types.js +1 -1
  3. package/dist/api/exam-questions.js +1 -98
  4. package/dist/api/exam-questions.types.js +1 -1
  5. package/dist/api/exam-taking.js +1 -73
  6. package/dist/api/exam-taking.types.js +1 -1
  7. package/dist/api/index.js +1 -6
  8. package/dist/api/result-review.js +1 -50
  9. package/dist/api/result-review.types.js +1 -1
  10. package/dist/components/CueCardEditor.js +1 -58
  11. package/dist/components/common/ResolvedImage.js +1 -15
  12. package/dist/components/exams/CreateExamInfoForm.js +1 -35
  13. package/dist/components/exams/CreateExamPageContainer.js +1 -103
  14. package/dist/components/exams/ExamCreator.js +1 -89
  15. package/dist/components/exams/ExamPartTabs.js +1 -40
  16. package/dist/components/exams/ExamQuestionGrid.js +1 -18
  17. package/dist/components/exams/ExamQuestionsPageContainer.js +1 -90
  18. package/dist/components/exams/PartAudioUploader.js +1 -9
  19. package/dist/components/exams/TemplateSelector.js +1 -66
  20. package/dist/components/exams/api.js +1 -3
  21. package/dist/components/exams/create-exam.validation.js +1 -18
  22. package/dist/components/exams/exam-template.utils.js +1 -18
  23. package/dist/components/exams/index.js +1 -10
  24. package/dist/components/exams/take/ExamTakingPageContainer.js +1 -153
  25. package/dist/components/exams/take/GenericQuestionRenderer.js +1 -14
  26. package/dist/components/exams/take/exam-taking.utils.js +1 -88
  27. package/dist/components/exams/take/hooks/useSpeakingRecorder.js +1 -24
  28. package/dist/components/exams/take/index.js +1 -2
  29. package/dist/components/exams/take/types.js +1 -1
  30. package/dist/components/index.js +1 -42
  31. package/dist/components/questions/_shared/config/question-types.config.js +1 -333
  32. package/dist/components/questions/_shared/constants/color-palette.js +1 -21
  33. package/dist/components/questions/_shared/hooks/useAnswerGroupQuestionGroup.js +1 -105
  34. package/dist/components/questions/_shared/hooks/useBasicQuestionGroup.js +1 -222
  35. package/dist/components/questions/_shared/hooks/useCompareImagesGroup.js +1 -140
  36. package/dist/components/questions/_shared/hooks/useImageQuestionGroup.js +1 -123
  37. package/dist/components/questions/_shared/hooks/useInfoExchangeGroup.js +1 -50
  38. package/dist/components/questions/_shared/hooks/useQuestionFormState.js +1 -54
  39. package/dist/components/questions/_shared/hooks/useQuestionInitialization.js +1 -123
  40. package/dist/components/questions/_shared/hooks/useQuestionListGroup.js +1 -121
  41. package/dist/components/questions/_shared/hooks/useQuestionOnChange.js +1 -70
  42. package/dist/components/questions/_shared/hooks/useSceneQuestionGroup.js +1 -194
  43. package/dist/components/questions/_shared/index.js +1 -7
  44. package/dist/components/questions/_shared/types/answer-the-question.type.js +1 -1
  45. package/dist/components/questions/_shared/types/arrange-letters-into-words.type.js +1 -1
  46. package/dist/components/questions/_shared/types/choose-correct-adjective.type.js +1 -3
  47. package/dist/components/questions/_shared/types/color-region.config.js +1 -1
  48. package/dist/components/questions/_shared/types/fill-in-blank.type.js +1 -1
  49. package/dist/components/questions/_shared/types/fill-missing-words-in-grid.type.js +1 -1
  50. package/dist/components/questions/_shared/types/gn-speaking-interview.type.js +1 -1
  51. package/dist/components/questions/_shared/types/index.js +1 -12
  52. package/dist/components/questions/_shared/types/label-the-picture.type.js +1 -1
  53. package/dist/components/questions/_shared/types/listen-and-choose-from-answer-group.type.js +1 -1
  54. package/dist/components/questions/_shared/types/listen-and-choose-objects-in-scene.type.js +1 -1
  55. package/dist/components/questions/_shared/types/listen-and-drag-objects-into-scene.type.js +1 -1
  56. package/dist/components/questions/_shared/types/listen-and-speak-answer.type.js +1 -1
  57. package/dist/components/questions/_shared/types/listen-and-speak-compare-images.type.js +1 -1
  58. package/dist/components/questions/_shared/types/listen-and-speak-image-group.type.js +1 -1
  59. package/dist/components/questions/_shared/types/listen-and-speak-info-exchange.type.js +1 -1
  60. package/dist/components/questions/_shared/types/listen-and-speak-odd-one-out.type.js +1 -3
  61. package/dist/components/questions/_shared/types/listen-and-speak-question-list.type.js +1 -1
  62. package/dist/components/questions/_shared/types/listen-and-speak-with-story-images.type.js +1 -3
  63. package/dist/components/questions/_shared/types/listen-and-tick-answer.type.js +1 -1
  64. package/dist/components/questions/_shared/types/listening-drawline.type.js +1 -1
  65. package/dist/components/questions/_shared/types/look-and-choose-answer.type.js +1 -1
  66. package/dist/components/questions/_shared/types/look-picture-fill-word-hint.type.js +1 -1
  67. package/dist/components/questions/_shared/types/match-by-writing-answer.type.js +1 -1
  68. package/dist/components/questions/_shared/types/multiple-choice.type.js +1 -1
  69. package/dist/components/questions/_shared/types/question-group.type.js +1 -11
  70. package/dist/components/questions/_shared/types/read-and-color-objects.type.js +1 -1
  71. package/dist/components/questions/_shared/types/read-displayed-content.type.js +1 -1
  72. package/dist/components/questions/_shared/types/read-passage-and-answer-questions.type.js +1 -1
  73. package/dist/components/questions/_shared/types/speaking-describe-image.type.js +1 -1
  74. package/dist/components/questions/_shared/types/spontaneous-qa.type.js +1 -1
  75. package/dist/components/questions/_shared/types/word-fill-paragraph-with-options.type.js +1 -1
  76. package/dist/components/questions/_shared/types/word-fill-paragraph.type.js +1 -1
  77. package/dist/components/questions/_shared/types/word-fill-structured-form.type.js +1 -1
  78. package/dist/components/questions/_shared/types/word-ordering.type.js +1 -1
  79. package/dist/components/questions/_shared/types/write-a-short-letter.type.js +1 -1
  80. package/dist/components/questions/_shared/types/write-correct-verb-form.type.js +1 -3
  81. package/dist/components/questions/_shared/types/write-sentences.type.js +1 -1
  82. package/dist/components/questions/_shared/types/write-short-paragraph.type.js +1 -1
  83. package/dist/components/questions/_shared/utils/answer-builder.js +1 -79
  84. package/dist/components/questions/_shared/utils/createColorRegionRegistration.js +1 -39
  85. package/dist/components/questions/_shared/utils/id-generator.js +1 -3
  86. package/dist/components/questions/_shared/utils/question-validation.js +1 -21
  87. package/dist/components/questions/components/ColorNode.js +1 -85
  88. package/dist/components/questions/components/ColorRegionClient.js +1 -545
  89. package/dist/components/questions/components/ColorRegionCreator.js +1 -420
  90. package/dist/components/questions/components/ColorRegionNode.js +1 -59
  91. package/dist/components/questions/components/CreatorGuide.js +1 -103
  92. package/dist/components/questions/components/NameNode.js +1 -26
  93. package/dist/components/questions/components/QuestionBankOption.js +1 -46
  94. package/dist/components/questions/components/QuestionBasicInfoForm.js +1 -9
  95. package/dist/components/questions/components/QuestionCommonFields.js +1 -33
  96. package/dist/components/questions/components/QuestionSearchDropdown.js +1 -258
  97. package/dist/components/questions/components/QuestionTypeSelector.js +1 -32
  98. package/dist/components/questions/components/QuestionTypeSpecificForms.js +1 -6
  99. package/dist/components/questions/components/RegionNode.js +1 -94
  100. package/dist/components/questions/components/index.js +1 -14
  101. package/dist/components/questions/creator/QuestionCreator.js +1 -90
  102. package/dist/components/questions/creator/QuestionGroupCreator.js +1 -119
  103. package/dist/components/questions/creator/dedicated-component-router.js +1 -79
  104. package/dist/components/questions/creator/index.js +1 -3
  105. package/dist/components/questions/creator/question-type-registry.js +1 -80
  106. package/dist/components/questions/groups/ArticlesGroupCard.js +1 -121
  107. package/dist/components/questions/groups/BasicQuestionGroupCard.js +1 -50
  108. package/dist/components/questions/groups/DocumentGroupCard.js +1 -114
  109. package/dist/components/questions/groups/MatchAnswerGroupCard.js +1 -25
  110. package/dist/components/questions/index.js +1 -10
  111. package/dist/components/questions/types/answer-the-question/AnswerTheQuestionClient.js +1 -37
  112. package/dist/components/questions/types/answer-the-question/AnswerTheQuestionCreator.js +1 -351
  113. package/dist/components/questions/types/answer-the-question/register.js +1 -67
  114. package/dist/components/questions/types/answer-the-question/transform.js +1 -36
  115. package/dist/components/questions/types/arrange-letters-into-words/ArrangeLettersIntoWordsClient.js +1 -141
  116. package/dist/components/questions/types/arrange-letters-into-words/ArrangeLettersIntoWordsCreator.js +1 -118
  117. package/dist/components/questions/types/arrange-letters-into-words/index.js +1 -2
  118. package/dist/components/questions/types/arrange-letters-into-words/register.js +1 -4
  119. package/dist/components/questions/types/arrange-letters-into-words/transform.js +1 -24
  120. package/dist/components/questions/types/choose-correct-adjective/ChooseCorrectAdjectiveClient.js +1 -64
  121. package/dist/components/questions/types/choose-correct-adjective/ChooseCorrectAdjectiveCreator.js +1 -169
  122. package/dist/components/questions/types/choose-correct-adjective/index.js +1 -2
  123. package/dist/components/questions/types/choose-correct-adjective/register.js +1 -55
  124. package/dist/components/questions/types/choose-correct-adjective/transform.js +1 -16
  125. package/dist/components/questions/types/choose-the-correct-answer/ChooseTheCorrectAnswerClient.js +1 -131
  126. package/dist/components/questions/types/choose-the-correct-answer/ChooseTheCorrectAnswerCreator.js +1 -581
  127. package/dist/components/questions/types/choose-the-correct-answer/index.js +1 -2
  128. package/dist/components/questions/types/choose-the-correct-answer/register.js +1 -101
  129. package/dist/components/questions/types/choose-the-correct-answer/transform.js +1 -43
  130. package/dist/components/questions/types/fill-in-blank/FillInBlankClient.js +1 -275
  131. package/dist/components/questions/types/fill-in-blank/FillInBlankCreator.js +1 -448
  132. package/dist/components/questions/types/fill-in-blank/index.js +1 -2
  133. package/dist/components/questions/types/fill-in-blank/register.js +1 -138
  134. package/dist/components/questions/types/fill-in-blank/transform.js +1 -59
  135. package/dist/components/questions/types/fill-missing-words-in-grid/FillMissingWordsInGridClient.js +1 -117
  136. package/dist/components/questions/types/fill-missing-words-in-grid/FillMissingWordsInGridCreator.js +1 -671
  137. package/dist/components/questions/types/fill-missing-words-in-grid/index.js +1 -2
  138. package/dist/components/questions/types/fill-missing-words-in-grid/register.js +1 -37
  139. package/dist/components/questions/types/fill-missing-words-in-grid/transform.js +1 -15
  140. package/dist/components/questions/types/gn-speaking-interview/GNSpeakingInterviewCreator.js +1 -262
  141. package/dist/components/questions/types/gn-speaking-interview/register.js +1 -121
  142. package/dist/components/questions/types/gn-speaking-interview/transform.js +1 -48
  143. package/dist/components/questions/types/image-object-matching/ImageObjectMatchingClient.js +1 -16
  144. package/dist/components/questions/types/image-object-matching/ImageObjectMatchingCreator.js +1 -27
  145. package/dist/components/questions/types/image-object-matching/index.js +1 -2
  146. package/dist/components/questions/types/image-object-matching/register.js +1 -3
  147. package/dist/components/questions/types/image-object-matching/transform.js +1 -2
  148. package/dist/components/questions/types/label-the-picture/LabelThePictureClient.js +1 -102
  149. package/dist/components/questions/types/label-the-picture/LabelThePictureCreator.js +1 -344
  150. package/dist/components/questions/types/label-the-picture/index.js +1 -2
  151. package/dist/components/questions/types/label-the-picture/register.js +1 -54
  152. package/dist/components/questions/types/label-the-picture/transform.js +1 -28
  153. package/dist/components/questions/types/listen-and-choose-from-answer-group/ListenAndChooseFromAnswerGroupClient.js +1 -78
  154. package/dist/components/questions/types/listen-and-choose-from-answer-group/ListenAndChooseFromAnswerGroupCreator.js +1 -232
  155. package/dist/components/questions/types/listen-and-choose-from-answer-group/index.js +1 -2
  156. package/dist/components/questions/types/listen-and-choose-from-answer-group/register.js +1 -82
  157. package/dist/components/questions/types/listen-and-choose-from-answer-group/transform.js +1 -27
  158. package/dist/components/questions/types/listen-and-choose-objects-in-scene/ListenAndChooseObjectsInSceneClient.js +1 -70
  159. package/dist/components/questions/types/listen-and-choose-objects-in-scene/ListenAndChooseObjectsInSceneCreator.js +1 -386
  160. package/dist/components/questions/types/listen-and-choose-objects-in-scene/index.js +1 -2
  161. package/dist/components/questions/types/listen-and-choose-objects-in-scene/register.js +1 -100
  162. package/dist/components/questions/types/listen-and-choose-objects-in-scene/transform.js +1 -33
  163. package/dist/components/questions/types/listen-and-drag-objects-into-scene/ListenAndDragObjectsIntoSceneClient.js +1 -106
  164. package/dist/components/questions/types/listen-and-drag-objects-into-scene/ListenAndDragObjectsIntoSceneCreator.js +1 -457
  165. package/dist/components/questions/types/listen-and-drag-objects-into-scene/index.js +1 -2
  166. package/dist/components/questions/types/listen-and-drag-objects-into-scene/register.js +1 -110
  167. package/dist/components/questions/types/listen-and-drag-objects-into-scene/transform.js +1 -35
  168. package/dist/components/questions/types/listen-and-speak-answer/ArrowIndicator.js +1 -8
  169. package/dist/components/questions/types/listen-and-speak-answer/ListenAndSpeakAnswerClient.js +1 -22
  170. package/dist/components/questions/types/listen-and-speak-answer/ListenAndSpeakAnswerCreator.js +1 -291
  171. package/dist/components/questions/types/listen-and-speak-answer/index.js +1 -2
  172. package/dist/components/questions/types/listen-and-speak-answer/register.js +1 -84
  173. package/dist/components/questions/types/listen-and-speak-answer/transform.js +1 -27
  174. package/dist/components/questions/types/listen-and-speak-compare-images/ListenAndSpeakCompareImagesClient.js +1 -32
  175. package/dist/components/questions/types/listen-and-speak-compare-images/ListenAndSpeakCompareImagesCreator.js +1 -295
  176. package/dist/components/questions/types/listen-and-speak-compare-images/register.js +1 -79
  177. package/dist/components/questions/types/listen-and-speak-compare-images/transform.js +1 -27
  178. package/dist/components/questions/types/listen-and-speak-image-group/ListenAndSpeakImageGroupClient.js +1 -34
  179. package/dist/components/questions/types/listen-and-speak-image-group/ListenAndSpeakImageGroupCreator.js +1 -285
  180. package/dist/components/questions/types/listen-and-speak-image-group/register.js +1 -81
  181. package/dist/components/questions/types/listen-and-speak-image-group/transform.js +1 -26
  182. package/dist/components/questions/types/listen-and-speak-info-exchange/ListenAndSpeakInfoExchangeClient.js +1 -38
  183. package/dist/components/questions/types/listen-and-speak-info-exchange/ListenAndSpeakInfoExchangeCreator.js +1 -385
  184. package/dist/components/questions/types/listen-and-speak-info-exchange/register.js +1 -87
  185. package/dist/components/questions/types/listen-and-speak-info-exchange/transform.js +1 -32
  186. package/dist/components/questions/types/listen-and-speak-odd-one-out/ListenAndSpeakOddOneOutClient.js +1 -26
  187. package/dist/components/questions/types/listen-and-speak-odd-one-out/ListenAndSpeakOddOneOutCreator.js +1 -247
  188. package/dist/components/questions/types/listen-and-speak-odd-one-out/register.js +1 -59
  189. package/dist/components/questions/types/listen-and-speak-odd-one-out/transform.js +1 -18
  190. package/dist/components/questions/types/listen-and-speak-question-list/ListenAndSpeakQuestionListClient.js +1 -26
  191. package/dist/components/questions/types/listen-and-speak-question-list/ListenAndSpeakQuestionListCreator.js +1 -256
  192. package/dist/components/questions/types/listen-and-speak-question-list/register.js +1 -81
  193. package/dist/components/questions/types/listen-and-speak-question-list/transform.js +1 -26
  194. package/dist/components/questions/types/listen-and-speak-with-story-images/ListenAndSpeakWithStoryImagesClient.js +1 -26
  195. package/dist/components/questions/types/listen-and-speak-with-story-images/ListenAndSpeakWithStoryImagesCreator.js +1 -230
  196. package/dist/components/questions/types/listen-and-speak-with-story-images/register.js +1 -56
  197. package/dist/components/questions/types/listen-and-speak-with-story-images/transform.js +1 -16
  198. package/dist/components/questions/types/look-picture-choose-correct-answer/LookPictureChooseCorrectAnswerClient.js +1 -72
  199. package/dist/components/questions/types/look-picture-choose-correct-answer/LookPictureChooseCorrectAnswerCreator.js +1 -230
  200. package/dist/components/questions/types/look-picture-choose-correct-answer/index.js +1 -1
  201. package/dist/components/questions/types/look-picture-choose-correct-answer/register.js +1 -66
  202. package/dist/components/questions/types/look-picture-choose-correct-answer/transform.js +1 -42
  203. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/LookPictureFillBlankChooseAnswerClient.js +1 -96
  204. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/LookPictureFillBlankChooseAnswerCreator.js +1 -238
  205. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/index.js +1 -2
  206. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/register.js +1 -76
  207. package/dist/components/questions/types/look-picture-fill-blank-choose-answer/transform.js +1 -19
  208. package/dist/components/questions/types/look-picture-fill-word-hint/LookPictureFillWordHintClient.js +1 -134
  209. package/dist/components/questions/types/look-picture-fill-word-hint/LookPictureFillWordHintCreator.js +1 -617
  210. package/dist/components/questions/types/look-picture-fill-word-hint/index.js +1 -2
  211. package/dist/components/questions/types/look-picture-fill-word-hint/register.js +1 -82
  212. package/dist/components/questions/types/look-picture-fill-word-hint/transform.js +1 -29
  213. package/dist/components/questions/types/match-by-writing-answer/MatchByWritingAnswerClient.js +1 -38
  214. package/dist/components/questions/types/match-by-writing-answer/MatchByWritingAnswerCreator.js +1 -359
  215. package/dist/components/questions/types/match-by-writing-answer/index.js +1 -3
  216. package/dist/components/questions/types/match-by-writing-answer/register.js +1 -58
  217. package/dist/components/questions/types/match-by-writing-answer/transform.js +1 -61
  218. package/dist/components/questions/types/read-and-color-objects/ReadAndColorObjectsClient.js +1 -16
  219. package/dist/components/questions/types/read-and-color-objects/ReadAndColorObjectsCreator.js +1 -23
  220. package/dist/components/questions/types/read-and-color-objects/index.js +1 -2
  221. package/dist/components/questions/types/read-and-color-objects/register.js +1 -3
  222. package/dist/components/questions/types/read-and-color-objects/transform.js +1 -36
  223. package/dist/components/questions/types/read-displayed-content/ReadDisplayedContentCreator.js +1 -125
  224. package/dist/components/questions/types/read-displayed-content/register.js +1 -64
  225. package/dist/components/questions/types/read-displayed-content/transform.js +1 -12
  226. package/dist/components/questions/types/read-passage-and-answer-questions/ReadPassageAndAnswerQuestionsClient.js +1 -64
  227. package/dist/components/questions/types/read-passage-and-answer-questions/ReadPassageAndAnswerQuestionsCreator.js +1 -511
  228. package/dist/components/questions/types/read-passage-and-answer-questions/index.js +1 -2
  229. package/dist/components/questions/types/read-passage-and-answer-questions/register.js +1 -58
  230. package/dist/components/questions/types/read-passage-and-answer-questions/transform.js +1 -28
  231. package/dist/components/questions/types/speaking-conversation/SpeakingConversationCreator.js +1 -373
  232. package/dist/components/questions/types/speaking-conversation/SpeakingConversationPreviewClient.js +1 -41
  233. package/dist/components/questions/types/speaking-conversation/register.js +1 -110
  234. package/dist/components/questions/types/speaking-conversation/transform.js +1 -34
  235. package/dist/components/questions/types/speaking-cue-card/SpeakingCueCardCreator.js +1 -74
  236. package/dist/components/questions/types/speaking-cue-card/register.js +1 -52
  237. package/dist/components/questions/types/speaking-cue-card/transform.js +1 -12
  238. package/dist/components/questions/types/speaking-describe-image/SpeakingDescribeImageClient.js +1 -10
  239. package/dist/components/questions/types/speaking-describe-image/SpeakingDescribeImageCreator.js +1 -161
  240. package/dist/components/questions/types/speaking-describe-image/index.js +1 -2
  241. package/dist/components/questions/types/speaking-describe-image/register.js +1 -69
  242. package/dist/components/questions/types/speaking-describe-image/transform.js +1 -16
  243. package/dist/components/questions/types/spontaneous-qa/SpontaneousQACreator.js +1 -234
  244. package/dist/components/questions/types/spontaneous-qa/register.js +1 -93
  245. package/dist/components/questions/types/spontaneous-qa/transform.js +1 -34
  246. package/dist/components/questions/types/true-false/TrueFalseClient.js +1 -75
  247. package/dist/components/questions/types/true-false/TrueFalseCreator.js +1 -244
  248. package/dist/components/questions/types/true-false/index.js +1 -2
  249. package/dist/components/questions/types/true-false/register.js +1 -77
  250. package/dist/components/questions/types/true-false/transform.js +1 -32
  251. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphClient.js +1 -233
  252. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphCreator.js +1 -631
  253. package/dist/components/questions/types/word-fill-paragraph/WordFillParagraphWrapper.js +1 -28
  254. package/dist/components/questions/types/word-fill-paragraph/index.js +1 -2
  255. package/dist/components/questions/types/word-fill-paragraph/register.js +1 -136
  256. package/dist/components/questions/types/word-fill-paragraph/transform.js +1 -56
  257. package/dist/components/questions/types/word-fill-structured-form/WordFillStructuredFormClient.js +1 -138
  258. package/dist/components/questions/types/word-fill-structured-form/WordFillStructuredFormCreator.js +1 -261
  259. package/dist/components/questions/types/word-fill-structured-form/index.js +1 -2
  260. package/dist/components/questions/types/word-fill-structured-form/register.js +1 -67
  261. package/dist/components/questions/types/word-fill-structured-form/transform.js +1 -40
  262. package/dist/components/questions/types/word-ordering/WordOrderingClient.js +1 -84
  263. package/dist/components/questions/types/word-ordering/WordOrderingCreator.js +1 -192
  264. package/dist/components/questions/types/word-ordering/index.js +1 -2
  265. package/dist/components/questions/types/word-ordering/register.js +1 -46
  266. package/dist/components/questions/types/word-ordering/transform.js +1 -24
  267. package/dist/components/questions/types/write-a-short-letter/WriteAShortLetterClient.js +1 -98
  268. package/dist/components/questions/types/write-a-short-letter/WriteAShortLetterCreator.js +1 -320
  269. package/dist/components/questions/types/write-a-short-letter/index.js +1 -2
  270. package/dist/components/questions/types/write-a-short-letter/register.js +1 -68
  271. package/dist/components/questions/types/write-a-short-letter/transform.js +1 -25
  272. package/dist/components/questions/types/write-correct-verb-form/WriteCorrectVerbFormClient.js +1 -61
  273. package/dist/components/questions/types/write-correct-verb-form/WriteCorrectVerbFormCreator.js +1 -196
  274. package/dist/components/questions/types/write-correct-verb-form/index.js +1 -2
  275. package/dist/components/questions/types/write-correct-verb-form/register.js +1 -62
  276. package/dist/components/questions/types/write-correct-verb-form/transform.js +1 -17
  277. package/dist/components/questions/types/write-sentences/WriteSentencesClient.js +1 -22
  278. package/dist/components/questions/types/write-sentences/WriteSentencesCreator.js +1 -174
  279. package/dist/components/questions/types/write-sentences/index.js +1 -2
  280. package/dist/components/questions/types/write-sentences/register.js +1 -58
  281. package/dist/components/questions/types/write-sentences/transform.js +1 -28
  282. package/dist/components/questions/types/write-short-paragraph/WriteShortParagraphClient.js +1 -96
  283. package/dist/components/questions/types/write-short-paragraph/WriteShortParagraphCreator.js +1 -161
  284. package/dist/components/questions/types/write-short-paragraph/index.js +1 -2
  285. package/dist/components/questions/types/write-short-paragraph/register.js +1 -4
  286. package/dist/components/questions/types/write-short-paragraph/transform.js +1 -21
  287. package/dist/components/questions/viewer/QuestionGroupViewer.js +1 -36
  288. package/dist/components/questions/viewer/QuestionViewer.js +1 -446
  289. package/dist/components/questions/viewer/index.js +1 -2
  290. package/dist/components/results/ResultReviewPageContainer.js +1 -98
  291. package/dist/components/results/ReviewQuestionRenderer.js +1 -72
  292. package/dist/components/results/index.js +1 -2
  293. package/dist/components/results/result-review.utils.js +1 -6
  294. package/dist/components/results/review-data.js +1 -150
  295. package/dist/components/results/review-renderer.utils.js +1 -97
  296. package/dist/components/results/review-types.js +1 -1
  297. package/dist/components/themes/cambridge-yle/CambridgeYleAudioPlayer.js +1 -138
  298. package/dist/components/themes/cambridge-yle/CambridgeYleBottomNav.js +1 -12
  299. package/dist/components/themes/cambridge-yle/CambridgeYleExamLayout.js +1 -18
  300. package/dist/components/themes/cambridge-yle/CambridgeYleExampleText.js +1 -11
  301. package/dist/components/themes/cambridge-yle/CambridgeYleHeader.js +1 -11
  302. package/dist/components/themes/cambridge-yle/CambridgeYleInstructionBanner.js +1 -9
  303. package/dist/components/themes/cambridge-yle/CambridgeYleNavButton.js +1 -13
  304. package/dist/components/themes/cambridge-yle/CambridgeYlePartBanner.js +1 -8
  305. package/dist/components/themes/cambridge-yle/CambridgeYleProgressBar.js +1 -6
  306. package/dist/components/themes/cambridge-yle/CambridgeYleQuestionCard.js +1 -5
  307. package/dist/components/themes/cambridge-yle/CambridgeYleQuestionCardFullWidth.js +1 -9
  308. package/dist/components/themes/cambridge-yle/CambridgeYleSidebar.js +1 -41
  309. package/dist/components/themes/cambridge-yle/CambridgeYleTimer.js +1 -25
  310. package/dist/components/themes/cambridge-yle/index.js +1 -13
  311. package/dist/components/themes/english-certification/EcAnswerTheQuestion.js +1 -24
  312. package/dist/components/themes/english-certification/EcMatchByWritingAnswer.js +1 -88
  313. package/dist/components/themes/english-certification/EcWordFillParagraph.js +1 -55
  314. package/dist/components/themes/english-certification/EcWordFillStructuredForm.js +1 -156
  315. package/dist/components/themes/english-certification/EcWritingTask.js +1 -34
  316. package/dist/components/themes/english-certification/EnglishCertificationAudioPlayer.js +1 -114
  317. package/dist/components/themes/english-certification/EnglishCertificationBrand.js +1 -11
  318. package/dist/components/themes/english-certification/EnglishCertificationExamLayout.js +1 -21
  319. package/dist/components/themes/english-certification/EnglishCertificationFlagButton.js +1 -15
  320. package/dist/components/themes/english-certification/EnglishCertificationFooterBar.js +1 -19
  321. package/dist/components/themes/english-certification/EnglishCertificationGroupedQuestion.js +1 -148
  322. package/dist/components/themes/english-certification/EnglishCertificationHeader.js +1 -31
  323. package/dist/components/themes/english-certification/EnglishCertificationNavigationPanel.js +1 -71
  324. package/dist/components/themes/english-certification/EnglishCertificationOptionSelector.js +1 -33
  325. package/dist/components/themes/english-certification/EnglishCertificationPassagePanel.js +1 -16
  326. package/dist/components/themes/english-certification/EnglishCertificationQuestionCard.js +1 -22
  327. package/dist/components/themes/english-certification/EnglishCertificationQuestionItem.js +1 -37
  328. package/dist/components/themes/english-certification/EnglishCertificationQuestionRenderer.js +1 -72
  329. package/dist/components/themes/english-certification/EnglishCertificationReadingSection.js +1 -90
  330. package/dist/components/themes/english-certification/EnglishCertificationSingleQuestion.js +1 -18
  331. package/dist/components/themes/english-certification/EnglishCertificationSingleQuestionList.js +1 -29
  332. package/dist/components/themes/english-certification/english-certification-theme.js +1 -58
  333. package/dist/components/themes/english-certification/grouped-question-utils.js +1 -218
  334. package/dist/components/themes/english-certification/index.js +1 -21
  335. package/dist/components/themes/index.js +1 -6
  336. package/dist/components/themes/summer-sky/SummerSkyAudioPlayer.js +1 -170
  337. package/dist/components/themes/summer-sky/SummerSkyLayout.js +1 -221
  338. package/dist/components/themes/summer-sky/SummerSkySubmitModal.js +1 -18
  339. package/dist/components/themes/summer-sky/SummerSkyWaitingRoom.js +1 -194
  340. package/dist/components/themes/types.js +1 -1
  341. package/dist/components/ui/alert-dialog.js +1 -26
  342. package/dist/components/ui/alert.js +1 -22
  343. package/dist/components/ui/avatar.js +1 -12
  344. package/dist/components/ui/badge.js +1 -38
  345. package/dist/components/ui/button.js +1 -35
  346. package/dist/components/ui/calendar.js +1 -76
  347. package/dist/components/ui/card.js +1 -16
  348. package/dist/components/ui/carousel.js +1 -91
  349. package/dist/components/ui/checkbox.js +1 -9
  350. package/dist/components/ui/collapsible.js +1 -13
  351. package/dist/components/ui/command.js +1 -34
  352. package/dist/components/ui/confirm-dialog.js +1 -49
  353. package/dist/components/ui/dialog.js +1 -23
  354. package/dist/components/ui/drawer.js +1 -35
  355. package/dist/components/ui/dropdown-menu.js +1 -33
  356. package/dist/components/ui/file-upload.js +1 -155
  357. package/dist/components/ui/form.js +1 -62
  358. package/dist/components/ui/hover-card.js +1 -10
  359. package/dist/components/ui/image-preview.js +1 -29
  360. package/dist/components/ui/input.js +1 -8
  361. package/dist/components/ui/label.js +1 -9
  362. package/dist/components/ui/language-switcher.js +1 -15
  363. package/dist/components/ui/multi-select.js +1 -90
  364. package/dist/components/ui/points-input.js +1 -33
  365. package/dist/components/ui/popover.js +1 -26
  366. package/dist/components/ui/progress.js +1 -16
  367. package/dist/components/ui/radio-group.js +1 -12
  368. package/dist/components/ui/scroll-area.js +1 -11
  369. package/dist/components/ui/select.js +1 -38
  370. package/dist/components/ui/separator.js +1 -8
  371. package/dist/components/ui/sheet.js +1 -40
  372. package/dist/components/ui/single-select.js +1 -76
  373. package/dist/components/ui/skeleton.js +1 -6
  374. package/dist/components/ui/switch.js +1 -8
  375. package/dist/components/ui/table.js +1 -20
  376. package/dist/components/ui/tabs.js +1 -17
  377. package/dist/components/ui/textarea.js +1 -8
  378. package/dist/components/ui/tooltip.js +1 -11
  379. package/dist/index.js +1 -19
  380. package/dist/mcp/config.js +1 -32
  381. package/dist/mcp/http-client.js +1 -48
  382. package/dist/mcp/index.js +1 -29
  383. package/dist/mcp/tools/_helpers.js +1 -25
  384. package/dist/mcp/tools/exams.js +1 -439
  385. package/dist/mcp/tools/index.js +1 -6
  386. package/dist/mcp/tools/results.js +1 -19
  387. package/dist/shared/constants/ApiConstant.js +1 -276
  388. package/dist/shared/constants/QueryKeyConstant.js +1 -112
  389. package/dist/shared/constants/exam-level.enum.js +1 -41
  390. package/dist/shared/constants/landings/placement-test.constants.js +1 -431
  391. package/dist/shared/constants/question-skills.js +1 -267
  392. package/dist/shared/constants/routes.js +1 -81
  393. package/dist/shared/index.js +1 -7
  394. package/dist/shared/lib/hooks/index.js +1 -10
  395. package/dist/shared/lib/hooks/useAlertDialog.js +1 -57
  396. package/dist/shared/lib/hooks/useAudioPlayCounter.js +1 -30
  397. package/dist/shared/lib/hooks/useAudioPreview.js +1 -81
  398. package/dist/shared/lib/hooks/useAudioUpload.js +1 -24
  399. package/dist/shared/lib/hooks/useConfirmDialog.js +1 -89
  400. package/dist/shared/lib/hooks/useDebouncedCallback.js +1 -32
  401. package/dist/shared/lib/hooks/useDelayedAutoPlay.js +1 -12
  402. package/dist/shared/lib/hooks/useFileUpload.js +1 -24
  403. package/dist/shared/lib/hooks/useImageUrl.js +1 -5
  404. package/dist/shared/lib/hooks/usePresignedFileUrl.js +1 -10
  405. package/dist/shared/lib/hooks/useReactHookForm.js +1 -31
  406. package/dist/shared/lib/hooks/useToast.js +1 -62
  407. package/dist/shared/lib/i18n/index.js +1 -54
  408. package/dist/shared/lib/i18n/messages/en/admin.js +1 -2104
  409. package/dist/shared/lib/i18n/messages/en/auth.js +1 -86
  410. package/dist/shared/lib/i18n/messages/en/common.js +1 -140
  411. package/dist/shared/lib/i18n/messages/en/file-upload.js +1 -18
  412. package/dist/shared/lib/i18n/messages/en/student.js +1 -133
  413. package/dist/shared/lib/i18n/messages/en/terms.js +1 -37
  414. package/dist/shared/lib/i18n/messages/en.js +1 -15
  415. package/dist/shared/lib/i18n/messages/vi/admin.js +1 -2104
  416. package/dist/shared/lib/i18n/messages/vi/auth.js +1 -86
  417. package/dist/shared/lib/i18n/messages/vi/common.js +1 -140
  418. package/dist/shared/lib/i18n/messages/vi/file-upload.js +1 -18
  419. package/dist/shared/lib/i18n/messages/vi/student.js +1 -133
  420. package/dist/shared/lib/i18n/messages/vi/terms.js +1 -37
  421. package/dist/shared/lib/i18n/messages/vi.js +1 -15
  422. package/dist/shared/lib/i18n/types.js +1 -1
  423. package/dist/shared/lib/stores/examQuestionStore.js +1 -212
  424. package/dist/shared/lib/stores/localeStore.js +1 -10
  425. package/dist/shared/lib/utils/public-page.js +1 -44
  426. package/dist/shared/lib/utils/question-transform-types.js +1 -1
  427. package/dist/shared/lib/utils/question-transform.js +1 -174
  428. package/dist/shared/lib/utils.js +1 -168
  429. package/dist/shared/lib/validation/choose-correct-answer.validation.js +1 -111
  430. package/dist/shared/lib/validation/label-the-picture.validation.js +1 -19
  431. package/dist/shared/lib/validation/listen-and-choose-from-answer-group.validation.js +1 -46
  432. package/dist/shared/lib/validation/listen-and-choose-objects-in-scene.validation.js +1 -21
  433. package/dist/shared/lib/validation/listen-and-drag-objects-into-scene.validation.js +1 -34
  434. package/dist/shared/lib/validation/listen-and-speak-answer.validation.js +1 -40
  435. package/dist/shared/lib/validation/listen-and-speak-compare-images.validation.js +1 -45
  436. package/dist/shared/lib/validation/listen-and-speak-image-group.validation.js +1 -19
  437. package/dist/shared/lib/validation/listen-and-speak-info-exchange.validation.js +1 -39
  438. package/dist/shared/lib/validation/listen-and-speak-odd-one-out.validation.js +1 -32
  439. package/dist/shared/lib/validation/listen-and-speak-question-list.validation.js +1 -19
  440. package/dist/shared/lib/validation/listen-and-speak-with-story-images.validation.js +1 -28
  441. package/dist/shared/lib/validation/look-picture-choose-correct-answer.validation.js +1 -12
  442. package/dist/shared/lib/validation/look-picture-fill-blank-choose-answer.validation.js +1 -47
  443. package/dist/shared/lib/validation/read-and-color-objects.validation.js +1 -29
  444. package/dist/shared/lib/validation/read-displayed-content.validation.js +1 -28
  445. package/dist/shared/lib/validation/speaking-conversation.validation.js +1 -75
  446. package/dist/shared/lib/validation/speaking-describe-image.validation.js +1 -31
  447. package/dist/shared/lib/validation/spontaneous-qa.validation.js +1 -48
  448. package/dist/shared/lib/validation/word-fill-paragraph-default.validation.js +1 -38
  449. package/dist/shared/lib/validation/word-fill-paragraph-with-options.validation.js +1 -39
  450. package/dist/shared/lib/validation/word-fill-paragraph.validation.js +1 -43
  451. package/dist/shared/lib/validation/word-ordering.validation.js +1 -33
  452. package/dist/shared/types/branch.types.js +1 -6
  453. package/dist/shared/types/common.types.js +1 -50
  454. package/dist/shared/types/entities/exam-schedule.types.js +1 -5
  455. package/dist/shared/types/entities/exam.types.js +1 -1
  456. package/dist/shared/types/entities/question.types.js +1 -4
  457. package/dist/shared/types/entities/result.types.js +1 -4
  458. package/dist/shared/types/entities/user.types.js +1 -4
  459. package/dist/shared/types/exam-taking.types.js +1 -2
  460. package/dist/shared/types/history.types.js +1 -34
  461. package/dist/shared/types/index.js +1 -1
  462. package/dist/shared/types/questions/choose-correct-adjective.js +1 -4
  463. package/dist/shared/types/questions/choose-the-correct-answer.js +1 -9
  464. package/dist/shared/types/questions/fill-missing-words-in-grid.js +1 -11
  465. package/dist/shared/types/questions/index.js +1 -40
  466. package/dist/shared/types/questions/listen-and-speak-answer.js +1 -1
  467. package/dist/shared/types/questions/listen-and-speak-compare-images.js +1 -1
  468. package/dist/shared/types/questions/listen-and-speak-image-group.js +1 -1
  469. package/dist/shared/types/questions/listen-and-speak-info-exchange.js +1 -3
  470. package/dist/shared/types/questions/listen-and-speak-odd-one-out.js +1 -3
  471. package/dist/shared/types/questions/listen-and-speak-question-list.js +1 -1
  472. package/dist/shared/types/questions/listen-and-speak-with-story-images.js +1 -3
  473. package/dist/shared/types/questions/look-picture-choose-correct-answer.js +1 -5
  474. package/dist/shared/types/questions/look-picture-fill-blank-choose-answer.js +1 -9
  475. package/dist/shared/types/questions/look-picture-fill-word-hint.js +1 -7
  476. package/dist/shared/types/questions/read-displayed-content.js +1 -1
  477. package/dist/shared/types/questions/speaking-conversation.js +1 -7
  478. package/dist/shared/types/questions/speaking-describe-image.js +1 -1
  479. package/dist/shared/types/questions/spontaneous-qa.js +1 -1
  480. package/dist/shared/types/questions/write-correct-verb-form.js +1 -12
  481. package/dist/shared/types/role.types.js +1 -1
  482. package/dist/shared/types/structure-management.js +1 -28
  483. package/dist/shared/types/student.types.js +1 -54
  484. package/dist/shared/types/teacher-dashboard-rooms.js +1 -2
  485. package/package.json +4 -2
@@ -1,75 +1 @@
1
- import { z } from 'zod';
2
- /**
3
- * Zod validation schema for SPEAKING_CONVERSATION creator form.
4
- *
5
- * Key rules:
6
- * - responder: 'PARTNER' → partnerAudioUrl required, points auto-set to 0
7
- * - responder: 'STUDENT' → points must be >= 1
8
- */
9
- export const speakingConversationFormSchema = z
10
- .object({
11
- // ─── Group Data ─────────────────────────────────────────────────────────
12
- partnerName: z.string().optional(),
13
- partnerAvatarUrl: z.string().optional(),
14
- images: z
15
- .array(z.object({
16
- id: z.string(),
17
- url: z.string(),
18
- label: z.string(),
19
- }))
20
- .optional()
21
- .default([]),
22
- // ─── Question Content ────────────────────────────────────────────────────
23
- responder: z.enum(['PARTNER', 'STUDENT'], {
24
- message: 'Vui lòng chọn người trả lời!',
25
- }),
26
- interlocutorAudioUrl: z.string().optional(),
27
- partnerAudioUrl: z.string().optional(),
28
- questionText: z.string().optional(),
29
- isBackup: z.boolean().optional().default(false),
30
- // ─── Expected Answers ────────────────────────────────────────────────────
31
- expectedAnswers: z.array(z.string()).optional().default(['']),
32
- // ─── Explanation ─────────────────────────────────────────────────────────
33
- explanation: z.string().optional(),
34
- // ─── Points ──────────────────────────────────────────────────────────────
35
- points: z
36
- .union([z.string(), z.number()])
37
- .transform((val, ctx) => {
38
- if (val === '' || val === undefined || val === null) {
39
- ctx.addIssue({
40
- code: z.ZodIssueCode.custom,
41
- message: 'Vui lòng nhập điểm!',
42
- });
43
- return z.NEVER;
44
- }
45
- const num = typeof val === 'string' ? parseInt(val, 10) : val;
46
- if (isNaN(num)) {
47
- ctx.addIssue({
48
- code: z.ZodIssueCode.custom,
49
- message: 'Vui lòng nhập điểm hợp lệ!',
50
- });
51
- return z.NEVER;
52
- }
53
- return num;
54
- })
55
- .pipe(z.number().min(0, 'Điểm số phải >= 0')),
56
- })
57
- .superRefine((data, ctx) => {
58
- // PARTNER questions require partnerAudioUrl
59
- if (data.responder === 'PARTNER' &&
60
- (!data.partnerAudioUrl || data.partnerAudioUrl.trim() === '')) {
61
- ctx.addIssue({
62
- code: z.ZodIssueCode.custom,
63
- message: 'Câu hỏi mẫu (Partner) cần có audio của Partner!',
64
- path: ['partnerAudioUrl'],
65
- });
66
- }
67
- // STUDENT questions require points >= 1
68
- if (data.responder === 'STUDENT' && data.points < 1) {
69
- ctx.addIssue({
70
- code: z.ZodIssueCode.custom,
71
- message: 'Câu hỏi học sinh phải có điểm >= 1!',
72
- path: ['points'],
73
- });
74
- }
75
- });
1
+ import{z as e}from"zod";export const speakingConversationFormSchema=e.object({partnerName:e.string().optional(),partnerAvatarUrl:e.string().optional(),images:e.array(e.object({id:e.string(),url:e.string(),label:e.string()})).optional().default([]),responder:e.enum(["PARTNER","STUDENT"],{message:"Vui lòng chọn người trả lời!"}),interlocutorAudioUrl:e.string().optional(),partnerAudioUrl:e.string().optional(),questionText:e.string().optional(),isBackup:e.boolean().optional().default(!1),expectedAnswers:e.array(e.string()).optional().default([""]),explanation:e.string().optional(),points:e.union([e.string(),e.number()]).transform((n,o)=>{if(""===n||null==n)return o.addIssue({code:e.ZodIssueCode.custom,message:"Vui lòng nhập điểm!"}),e.NEVER;const r="string"==typeof n?parseInt(n,10):n;return isNaN(r)?(o.addIssue({code:e.ZodIssueCode.custom,message:"Vui lòng nhập điểm hợp lệ!"}),e.NEVER):r}).pipe(e.number().min(0,"Điểm số phải >= 0"))}).superRefine((n,o)=>{"PARTNER"!==n.responder||n.partnerAudioUrl&&""!==n.partnerAudioUrl.trim()||o.addIssue({code:e.ZodIssueCode.custom,message:"Câu hỏi mẫu (Partner) cần có audio của Partner!",path:["partnerAudioUrl"]}),"STUDENT"===n.responder&&n.points<1&&o.addIssue({code:e.ZodIssueCode.custom,message:"Câu hỏi học sinh phải có điểm >= 1!",path:["points"]})});
@@ -1,31 +1 @@
1
- import { z } from 'zod';
2
- export const speakingDescribeImageFormSchema = z.object({
3
- question: z.string().optional(),
4
- imageUrl: z.string().min(1, 'Vui lòng upload hình ảnh!'),
5
- expectedAnswers: z
6
- .array(z.string().min(1, 'Vui lòng nhập đáp án!'))
7
- .min(1, 'Cần tối thiểu 1 đáp án!')
8
- .refine((options) => options.filter((opt) => opt.trim() !== '').length >= 1, { message: 'Cần tối thiểu 1 đáp án hợp lệ!' }),
9
- explanation: z.string().optional(),
10
- points: z
11
- .union([z.string(), z.number()])
12
- .transform((val, ctx) => {
13
- if (val === '' || val === undefined || val === null) {
14
- ctx.addIssue({
15
- code: z.ZodIssueCode.custom,
16
- message: 'Vui lòng nhập điểm!',
17
- });
18
- return z.NEVER;
19
- }
20
- const num = typeof val === 'string' ? parseInt(val, 10) : val;
21
- if (isNaN(num)) {
22
- ctx.addIssue({
23
- code: z.ZodIssueCode.custom,
24
- message: 'Vui lòng nhập điểm hợp lệ!',
25
- });
26
- return z.NEVER;
27
- }
28
- return num;
29
- })
30
- .pipe(z.number().min(1, 'Điểm số phải >= 1')),
31
- });
1
+ import{z as n}from"zod";export const speakingDescribeImageFormSchema=n.object({question:n.string().optional(),imageUrl:n.string().min(1,"Vui lòng upload hình ảnh!"),expectedAnswers:n.array(n.string().min(1,"Vui lòng nhập đáp án!")).min(1,"Cần tối thiểu 1 đáp án!").refine(n=>n.filter(n=>""!==n.trim()).length>=1,{message:"Cần tối thiểu 1 đáp án hợp lệ!"}),explanation:n.string().optional(),points:n.union([n.string(),n.number()]).transform((e,i)=>{if(""===e||null==e)return i.addIssue({code:n.ZodIssueCode.custom,message:"Vui lòng nhập điểm!"}),n.NEVER;const s="string"==typeof e?parseInt(e,10):e;return isNaN(s)?(i.addIssue({code:n.ZodIssueCode.custom,message:"Vui lòng nhập điểm hợp lệ!"}),n.NEVER):s}).pipe(n.number().min(1,"Điểm số phải >= 1"))});
@@ -1,48 +1 @@
1
- import { z } from 'zod';
2
- export const spontaneousQAFormSchema = z
3
- .object({
4
- inputType: z.enum(['AUDIO', 'TEXT'], {
5
- message: 'Vui lòng chọn hình thức nhập câu hỏi!',
6
- }),
7
- audioUrl: z.string().optional(),
8
- questionText: z.string().optional(),
9
- sampleAnswers: z.array(z.string()).optional().default(['']),
10
- explanation: z.string().optional(),
11
- points: z
12
- .union([z.string(), z.number()])
13
- .transform((val, ctx) => {
14
- if (val === '' || val === undefined || val === null) {
15
- ctx.addIssue({
16
- code: z.ZodIssueCode.custom,
17
- message: 'Vui lòng nhập điểm!',
18
- });
19
- return z.NEVER;
20
- }
21
- const num = typeof val === 'string' ? parseInt(val, 10) : val;
22
- if (isNaN(num)) {
23
- ctx.addIssue({
24
- code: z.ZodIssueCode.custom,
25
- message: 'Vui lòng nhập điểm hợp lệ!',
26
- });
27
- return z.NEVER;
28
- }
29
- return num;
30
- })
31
- .pipe(z.number().min(1, 'Điểm số phải >= 1')),
32
- })
33
- .superRefine((data, ctx) => {
34
- if (data.inputType === 'AUDIO' && (!data.audioUrl || data.audioUrl.trim() === '')) {
35
- ctx.addIssue({
36
- code: z.ZodIssueCode.custom,
37
- message: 'Vui lòng upload file audio câu hỏi!',
38
- path: ['audioUrl'],
39
- });
40
- }
41
- if (data.inputType === 'TEXT' && (!data.questionText || data.questionText.trim() === '')) {
42
- ctx.addIssue({
43
- code: z.ZodIssueCode.custom,
44
- message: 'Vui lòng nhập nội dung câu hỏi!',
45
- path: ['questionText'],
46
- });
47
- }
48
- });
1
+ import{z as e}from"zod";export const spontaneousQAFormSchema=e.object({inputType:e.enum(["AUDIO","TEXT"],{message:"Vui lòng chọn hình thức nhập câu hỏi!"}),audioUrl:e.string().optional(),questionText:e.string().optional(),sampleAnswers:e.array(e.string()).optional().default([""]),explanation:e.string().optional(),points:e.union([e.string(),e.number()]).transform((s,n)=>{if(""===s||null==s)return n.addIssue({code:e.ZodIssueCode.custom,message:"Vui lòng nhập điểm!"}),e.NEVER;const o="string"==typeof s?parseInt(s,10):s;return isNaN(o)?(n.addIssue({code:e.ZodIssueCode.custom,message:"Vui lòng nhập điểm hợp lệ!"}),e.NEVER):o}).pipe(e.number().min(1,"Điểm số phải >= 1"))}).superRefine((s,n)=>{"AUDIO"!==s.inputType||s.audioUrl&&""!==s.audioUrl.trim()||n.addIssue({code:e.ZodIssueCode.custom,message:"Vui lòng upload file audio câu hỏi!",path:["audioUrl"]}),"TEXT"!==s.inputType||s.questionText&&""!==s.questionText.trim()||n.addIssue({code:e.ZodIssueCode.custom,message:"Vui lòng nhập nội dung câu hỏi!",path:["questionText"]})});
@@ -1,38 +1 @@
1
- import { z } from 'zod';
2
- /**
3
- * Validation schema for WORD_FILL_PARAGRAPH with DEFAULT viewMode.
4
- * In DEFAULT mode, each placeholder {0}, {1}, ... gets a text input
5
- * for the correct answer — no word bank, no options.
6
- */
7
- export const wordFillParagraphDefaultFormSchema = z.object({
8
- title: z.string().optional().default(''),
9
- imageUrl: z.string().optional(),
10
- paragraph: z.string().min(1, 'Vui lòng nhập đoạn văn!'),
11
- answers: z
12
- .array(z.string().min(1, 'Vui lòng nhập đáp án cho chỗ trống này!'))
13
- .min(1, 'Cần ít nhất 1 đáp án!'),
14
- exampleAnswer: z.array(z.string()).optional().default([]),
15
- caseSensitive: z.boolean().optional().default(false),
16
- explanation: z.string().optional(),
17
- points: z
18
- .union([z.string(), z.number()])
19
- .transform((val, ctx) => {
20
- if (val === '' || val === undefined || val === null) {
21
- ctx.addIssue({
22
- code: z.ZodIssueCode.custom,
23
- message: 'Vui lòng nhập điểm!',
24
- });
25
- return z.NEVER;
26
- }
27
- const num = typeof val === 'string' ? parseInt(val, 10) : val;
28
- if (isNaN(num)) {
29
- ctx.addIssue({
30
- code: z.ZodIssueCode.custom,
31
- message: 'Điểm không hợp lệ!',
32
- });
33
- return z.NEVER;
34
- }
35
- return num;
36
- })
37
- .pipe(z.number().min(1, 'Điểm phải >= 1')),
38
- });
1
+ import{z as n}from"zod";export const wordFillParagraphDefaultFormSchema=n.object({title:n.string().optional().default(""),imageUrl:n.string().optional(),paragraph:n.string().min(1,"Vui lòng nhập đoạn văn!"),answers:n.array(n.string().min(1,"Vui lòng nhập đáp án cho chỗ trống này!")).min(1,"Cần ít nhất 1 đáp án!"),exampleAnswer:n.array(n.string()).optional().default([]),caseSensitive:n.boolean().optional().default(!1),explanation:n.string().optional(),points:n.union([n.string(),n.number()]).transform((e,t)=>{if(""===e||null==e)return t.addIssue({code:n.ZodIssueCode.custom,message:"Vui lòng nhập điểm!"}),n.NEVER;const i="string"==typeof e?parseInt(e,10):e;return isNaN(i)?(t.addIssue({code:n.ZodIssueCode.custom,message:"Điểm không hợp lệ!"}),n.NEVER):i}).pipe(n.number().min(1,"Điểm phải >= 1"))});
@@ -1,39 +1 @@
1
- import { z } from 'zod';
2
- const wordBankWithOptionsItemSchema = z.object({
3
- options: z.array(z.string().min(1, 'Vui lòng nhập đáp án!')).min(2, 'Mỗi chỗ trống cần ít nhất 2 lựa chọn!'),
4
- isExample: z.boolean().optional(),
5
- });
6
- export const wordFillParagraphWithOptionsFormSchema = z.object({
7
- title: z.string().optional().default(''),
8
- imageUrl: z.string().optional(),
9
- paragraph: z.string().min(1, 'Vui lòng nhập đoạn văn!'),
10
- wordBank: z
11
- .array(wordBankWithOptionsItemSchema)
12
- .min(1, 'Cần ít nhất 1 chỗ trống với lựa chọn!'),
13
- answers: z
14
- .array(z.string().min(1, 'Vui lòng chọn đáp án cho chỗ trống này!'))
15
- .min(1, 'Cần ít nhất 1 đáp án!'),
16
- caseSensitive: z.boolean().optional().default(false),
17
- explanation: z.string().optional(),
18
- points: z
19
- .union([z.string(), z.number()])
20
- .transform((val, ctx) => {
21
- if (val === '' || val === undefined || val === null) {
22
- ctx.addIssue({
23
- code: z.ZodIssueCode.custom,
24
- message: 'Vui lòng nhập điểm!',
25
- });
26
- return z.NEVER;
27
- }
28
- const num = typeof val === 'string' ? parseInt(val, 10) : val;
29
- if (isNaN(num)) {
30
- ctx.addIssue({
31
- code: z.ZodIssueCode.custom,
32
- message: 'Điểm không hợp lệ!',
33
- });
34
- return z.NEVER;
35
- }
36
- return num;
37
- })
38
- .pipe(z.number().min(1, 'Điểm phải >= 1')),
39
- });
1
+ import{z as n}from"zod";const i=n.object({options:n.array(n.string().min(1,"Vui lòng nhập đáp án!")).min(2,"Mỗi chỗ trống cần ít nhất 2 lựa chọn!"),isExample:n.boolean().optional()});export const wordFillParagraphWithOptionsFormSchema=n.object({title:n.string().optional().default(""),imageUrl:n.string().optional(),paragraph:n.string().min(1,"Vui lòng nhập đoạn văn!"),wordBank:n.array(i).min(1,"Cần ít nhất 1 chỗ trống với lựa chọn!"),answers:n.array(n.string().min(1,"Vui lòng chọn đáp án cho chỗ trống này!")).min(1,"Cần ít nhất 1 đáp án!"),caseSensitive:n.boolean().optional().default(!1),explanation:n.string().optional(),points:n.union([n.string(),n.number()]).transform((i,t)=>{if(""===i||null==i)return t.addIssue({code:n.ZodIssueCode.custom,message:"Vui lòng nhập điểm!"}),n.NEVER;const o="string"==typeof i?parseInt(i,10):i;return isNaN(o)?(t.addIssue({code:n.ZodIssueCode.custom,message:"Điểm không hợp lệ!"}),n.NEVER):o}).pipe(n.number().min(1,"Điểm phải >= 1"))});
@@ -1,43 +1 @@
1
- import { z } from 'zod';
2
- const wordBankItemSchema = z.object({
3
- word: z.string().min(1, 'Vui lòng nhập từ!'),
4
- content: z.string().optional(),
5
- imageUrl: z.string().optional(),
6
- isExample: z.boolean().optional(),
7
- });
8
- export const wordFillParagraphFormSchema = z.object({
9
- title: z.string().optional().default(''),
10
- imageUrl: z.string().optional(),
11
- paragraph: z.string().min(1, 'Vui lòng nhập đoạn văn!'),
12
- wordBank: z
13
- .array(wordBankItemSchema)
14
- .min(2, 'Cần ít nhất 2 từ trong word bank!'),
15
- answers: z
16
- .array(z.string().min(1, 'Vui lòng chọn đáp án cho chỗ trống này!'))
17
- .min(1, 'Cần ít nhất 1 đáp án!'),
18
- exampleAnswer: z.array(z.string()).optional().default([]),
19
- isExample: z.boolean().optional(),
20
- caseSensitive: z.boolean().optional().default(false),
21
- explanation: z.string().optional(),
22
- points: z
23
- .union([z.string(), z.number()])
24
- .transform((val, ctx) => {
25
- if (val === '' || val === undefined || val === null) {
26
- ctx.addIssue({
27
- code: z.ZodIssueCode.custom,
28
- message: 'Vui lòng nhập điểm!',
29
- });
30
- return z.NEVER;
31
- }
32
- const num = typeof val === 'string' ? parseInt(val, 10) : val;
33
- if (isNaN(num)) {
34
- ctx.addIssue({
35
- code: z.ZodIssueCode.custom,
36
- message: 'Điểm không hợp lệ!',
37
- });
38
- return z.NEVER;
39
- }
40
- return num;
41
- })
42
- .pipe(z.number().min(1, 'Điểm phải >= 1')),
43
- });
1
+ import{z as n}from"zod";const o=n.object({word:n.string().min(1,"Vui lòng nhập từ!"),content:n.string().optional(),imageUrl:n.string().optional(),isExample:n.boolean().optional()});export const wordFillParagraphFormSchema=n.object({title:n.string().optional().default(""),imageUrl:n.string().optional(),paragraph:n.string().min(1,"Vui lòng nhập đoạn văn!"),wordBank:n.array(o).min(2,"Cần ít nhất 2 từ trong word bank!"),answers:n.array(n.string().min(1,"Vui lòng chọn đáp án cho chỗ trống này!")).min(1,"Cần ít nhất 1 đáp án!"),exampleAnswer:n.array(n.string()).optional().default([]),isExample:n.boolean().optional(),caseSensitive:n.boolean().optional().default(!1),explanation:n.string().optional(),points:n.union([n.string(),n.number()]).transform((o,t)=>{if(""===o||null==o)return t.addIssue({code:n.ZodIssueCode.custom,message:"Vui lòng nhập điểm!"}),n.NEVER;const i="string"==typeof o?parseInt(o,10):o;return isNaN(i)?(t.addIssue({code:n.ZodIssueCode.custom,message:"Điểm không hợp lệ!"}),n.NEVER):i}).pipe(n.number().min(1,"Điểm phải >= 1"))});
@@ -1,33 +1 @@
1
- import { z } from 'zod';
2
- export const wordOrderingFormSchema = z.object({
3
- words: z
4
- .array(z.string().min(1, 'Vui lòng nhập từ/chữ cái!'))
5
- .min(2, 'Cần ít nhất 2 từ/chữ cái!'),
6
- answer: z
7
- .array(z.string().min(1, 'Vui lòng nhập đáp án!'))
8
- .min(2, 'Cần ít nhất 2 từ/chữ cái trong đáp án!'),
9
- imageUrl: z.string().optional(),
10
- isExample: z.boolean().optional(),
11
- explanation: z.string().optional(),
12
- points: z
13
- .union([z.string(), z.number()])
14
- .transform((val, ctx) => {
15
- if (val === '' || val === undefined || val === null) {
16
- ctx.addIssue({
17
- code: z.ZodIssueCode.custom,
18
- message: 'Vui lòng nhập điểm!',
19
- });
20
- return z.NEVER;
21
- }
22
- const num = typeof val === 'string' ? parseInt(val, 10) : val;
23
- if (isNaN(num)) {
24
- ctx.addIssue({
25
- code: z.ZodIssueCode.custom,
26
- message: 'Điểm không hợp lệ!',
27
- });
28
- return z.NEVER;
29
- }
30
- return num;
31
- })
32
- .pipe(z.number().min(1, 'Điểm phải >= 1')),
33
- });
1
+ import{z as n}from"zod";export const wordOrderingFormSchema=n.object({words:n.array(n.string().min(1,"Vui lòng nhập từ/chữ cái!")).min(2,"Cần ít nhất 2 từ/chữ cái!"),answer:n.array(n.string().min(1,"Vui lòng nhập đáp án!")).min(2,"Cần ít nhất 2 từ/chữ cái trong đáp án!"),imageUrl:n.string().optional(),isExample:n.boolean().optional(),explanation:n.string().optional(),points:n.union([n.string(),n.number()]).transform((i,o)=>{if(""===i||null==i)return o.addIssue({code:n.ZodIssueCode.custom,message:"Vui lòng nhập điểm!"}),n.NEVER;const t="string"==typeof i?parseInt(i,10):i;return isNaN(t)?(o.addIssue({code:n.ZodIssueCode.custom,message:"Điểm không hợp lệ!"}),n.NEVER):t}).pipe(n.number().min(1,"Điểm phải >= 1"))});
@@ -1,6 +1 @@
1
- /**
2
- * Branch Management Types
3
- * Types for branch (chi nhánh) management feature
4
- * Based on API documentation: docs/api/admin/branchs/branch-management-api.md
5
- */
6
- export {};
1
+ export{};
@@ -1,50 +1 @@
1
- /**
2
- * Common shared types across the application
3
- */
4
- // User role enum for role-based permissions
5
- export var UserRole;
6
- (function (UserRole) {
7
- UserRole["SYSTEM_ADMIN"] = "SYSTEM_ADMIN";
8
- UserRole["ADMIN"] = "ADMIN";
9
- UserRole["TEACHER"] = "TEACHER";
10
- UserRole["STUDENT"] = "STUDENT";
11
- })(UserRole || (UserRole = {}));
12
- export var Gender;
13
- (function (Gender) {
14
- Gender["MALE"] = "male";
15
- Gender["FEMALE"] = "female";
16
- Gender["OTHER"] = "other";
17
- })(Gender || (Gender = {}));
18
- export var RoomType;
19
- (function (RoomType) {
20
- RoomType["CONTEST"] = "CONTEST";
21
- RoomType["PRACTICE_TEST"] = "PRACTICE_TEST";
22
- })(RoomType || (RoomType = {}));
23
- export var ExamRoomStatus;
24
- (function (ExamRoomStatus) {
25
- ExamRoomStatus["SCHEDULED"] = "SCHEDULED";
26
- ExamRoomStatus["IN_PROGRESS"] = "IN_PROGRESS";
27
- ExamRoomStatus["COMPLETED"] = "COMPLETED";
28
- })(ExamRoomStatus || (ExamRoomStatus = {}));
29
- export var StudentSelectionType;
30
- (function (StudentSelectionType) {
31
- StudentSelectionType["ALL"] = "ALL";
32
- StudentSelectionType["SPECIFIC"] = "SPECIFIC";
33
- })(StudentSelectionType || (StudentSelectionType = {}));
34
- // Skill enum for programmatic use
35
- export var SkillEnum;
36
- (function (SkillEnum) {
37
- SkillEnum["LISTENING"] = "LISTENING";
38
- SkillEnum["SPEAKING"] = "SPEAKING";
39
- SkillEnum["READING"] = "READING";
40
- SkillEnum["WRITING"] = "WRITING";
41
- })(SkillEnum || (SkillEnum = {}));
42
- // Exam template theme enum
43
- export var ExamTemplateTheme;
44
- (function (ExamTemplateTheme) {
45
- ExamTemplateTheme["CAMBRIDGE_YLE"] = "CAMBRIDGE_YLE";
46
- ExamTemplateTheme["FLYER_WOODEN"] = "FLYER_WOODEN";
47
- ExamTemplateTheme["SPACESHIP"] = "SPACESHIP";
48
- ExamTemplateTheme["SUMMER_SKY"] = "SUMMER_SKY";
49
- ExamTemplateTheme["IELTS_LRW"] = "IELTS_LRW";
50
- })(ExamTemplateTheme || (ExamTemplateTheme = {}));
1
+ export var UserRole;!function(E){E.SYSTEM_ADMIN="SYSTEM_ADMIN",E.ADMIN="ADMIN",E.TEACHER="TEACHER",E.STUDENT="STUDENT"}(UserRole||(UserRole={}));export var Gender;!function(E){E.MALE="male",E.FEMALE="female",E.OTHER="other"}(Gender||(Gender={}));export var RoomType;!function(E){E.CONTEST="CONTEST",E.PRACTICE_TEST="PRACTICE_TEST"}(RoomType||(RoomType={}));export var ExamRoomStatus;!function(E){E.SCHEDULED="SCHEDULED",E.IN_PROGRESS="IN_PROGRESS",E.COMPLETED="COMPLETED"}(ExamRoomStatus||(ExamRoomStatus={}));export var StudentSelectionType;!function(E){E.ALL="ALL",E.SPECIFIC="SPECIFIC"}(StudentSelectionType||(StudentSelectionType={}));export var SkillEnum;!function(E){E.LISTENING="LISTENING",E.SPEAKING="SPEAKING",E.READING="READING",E.WRITING="WRITING"}(SkillEnum||(SkillEnum={}));export var ExamTemplateTheme;!function(E){E.CAMBRIDGE_YLE="CAMBRIDGE_YLE",E.FLYER_WOODEN="FLYER_WOODEN",E.SPACESHIP="SPACESHIP",E.SUMMER_SKY="SUMMER_SKY",E.IELTS_LRW="IELTS_LRW"}(ExamTemplateTheme||(ExamTemplateTheme={}));
@@ -1,5 +1 @@
1
- /**
2
- * Exam Schedule entity types
3
- * Quản lý lịch thi - Schedule cho từng kỳ thi
4
- */
5
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1,4 +1 @@
1
- /**
2
- * Question entity types
3
- */
4
- export {};
1
+ export{};
@@ -1,4 +1 @@
1
- /**
2
- * Exam result entity types
3
- */
4
- export {};
1
+ export{};
@@ -1,4 +1 @@
1
- /**
2
- * User entity types
3
- */
4
- export {};
1
+ export{};
@@ -1,2 +1 @@
1
- // Student Exam Taking Types
2
- export {};
1
+ export{};
@@ -1,34 +1 @@
1
- // Student Exam History Types
2
- // Default filter values
3
- export const DEFAULT_HISTORY_FILTERS = {
4
- level: 'ALL',
5
- skill: 'ALL',
6
- testName: '',
7
- status: 'ALL',
8
- };
9
- // Display labels for exam levels
10
- export const EXAM_LEVEL_LABELS = {
11
- STARTERS: 'STARTERS',
12
- MOVERS: 'MOVERS',
13
- FLYERS: 'FLYERS',
14
- PET: 'PET',
15
- KET: 'KET',
16
- TOEFL_JUNIOR: 'TOEFL JUNIOR',
17
- };
18
- // Display labels for skills
19
- export const SKILL_LABELS = {
20
- listening: 'Listening',
21
- 'reading & writing': 'Reading & Writing',
22
- writing: 'Writing',
23
- };
24
- // All exam levels for filter dropdown
25
- export const ALL_EXAM_LEVELS = [
26
- 'STARTERS',
27
- 'MOVERS',
28
- 'FLYERS',
29
- 'PET',
30
- 'KET',
31
- 'TOEFL_JUNIOR',
32
- ];
33
- // All skills for filter dropdown
34
- export const ALL_SKILLS = ['listening', 'reading & writing', 'writing'];
1
+ export const DEFAULT_HISTORY_FILTERS={level:"ALL",skill:"ALL",testName:"",status:"ALL"};export const EXAM_LEVEL_LABELS={STARTERS:"STARTERS",MOVERS:"MOVERS",FLYERS:"FLYERS",PET:"PET",KET:"KET",TOEFL_JUNIOR:"TOEFL JUNIOR"};export const SKILL_LABELS={listening:"Listening","reading & writing":"Reading & Writing",writing:"Writing"};export const ALL_EXAM_LEVELS=["STARTERS","MOVERS","FLYERS","PET","KET","TOEFL_JUNIOR"];export const ALL_SKILLS=["listening","reading & writing","writing"];
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1,4 +1 @@
1
- /**
2
- * API Payload interface for CHOOSE_CORRECT_ADJECTIVE question type
3
- */
4
- export {};
1
+ export{};
@@ -1,9 +1 @@
1
- /**
2
- * API Payload interface for CHOOSE_THE_CORRECT_ANSWER question type
3
- *
4
- * Used for:
5
- * - API GET /manage/exams/{examId}/questions response
6
- * - API POST /admin/questions/batch request/response
7
- * - localStorage storage (without addToQuestionBank and questionBank)
8
- */
9
- export {};
1
+ export{};
@@ -1,11 +1 @@
1
- /**
2
- * FILL_MISSING_WORDS_IN_GRID Question Type Interfaces
3
- *
4
- * This question type displays a grid where some cells are empty (missing words)
5
- * and the student needs to fill in the correct letters/words.
6
- *
7
- * API format (camelCase):
8
- * - content: { grid, rows, columns, disabledCells }
9
- * - correctAnswer: { answers, caseSensitive }
10
- */
11
- export {};
1
+ export{};
@@ -1,40 +1 @@
1
- /**
2
- * Question Payload Types
3
- *
4
- * This folder contains TypeScript interfaces for each question type's API payload format.
5
- * Each file corresponds to one question_type value.
6
- *
7
- * Usage:
8
- * ```typescript
9
- * import { ChooseTheCorrectAnswerAPIPayload } from '@/shared/types/question-payloads/choose-the-correct-answer';
10
- * // or import all from index
11
- * import { ChooseTheCorrectAnswerAPIPayload } from '@/shared/types/question-payloads';
12
- * ```
13
- *
14
- * Format Guidelines:
15
- * - API Payload: Full format sent to/from API (includes addToQuestionBank, questionBank)
16
- * - LocalStorage: Same format but WITHOUT addToQuestionBank and questionBank
17
- */
18
- // CHOOSE_THE_CORRECT_ANSWER
19
- export * from './choose-the-correct-answer';
20
- // WRITE_CORRECT_VERB_FORM
21
- export * from './write-correct-verb-form';
22
- // CHOOSE_CORRECT_ADJECTIVE
23
- export * from './choose-correct-adjective';
24
- // LOOK_PICTURE_FILL_BLANK_CHOOSE_ANSWER
25
- export * from './look-picture-fill-blank-choose-answer';
26
- // FILL_MISSING_WORDS_IN_GRID
27
- export * from './fill-missing-words-in-grid';
28
- // LOOK_PICTURE_FILL_WORD_HINT
29
- export * from './look-picture-fill-word-hint';
30
- // LOOK_PICTURE_CHOOSE_CORRECT_ANSWER
31
- export * from './look-picture-choose-correct-answer';
32
- // Add more question types here as they are created:
33
- // etc.
34
- export * from './listen-and-speak-answer';
35
- // READ_DISPLAYED_CONTENT
36
- export * from './read-displayed-content';
37
- // SPEAKING_DESCRIBE_IMAGE
38
- export * from './speaking-describe-image';
39
- // SPONTANEOUS_QA
40
- export * from './spontaneous-qa';
1
+ export*from"./choose-the-correct-answer";export*from"./write-correct-verb-form";export*from"./choose-correct-adjective";export*from"./look-picture-fill-blank-choose-answer";export*from"./fill-missing-words-in-grid";export*from"./look-picture-fill-word-hint";export*from"./look-picture-choose-correct-answer";export*from"./listen-and-speak-answer";export*from"./read-displayed-content";export*from"./speaking-describe-image";export*from"./spontaneous-qa";
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1,3 +1 @@
1
- // API-level types for LISTEN_AND_SPEAK_INFO_EXCHANGE
2
- // (Flyers Part 2 - Information Exchange: 2a = ANSWER mode, 2b = ASK mode)
3
- export {};
1
+ export{};
@@ -1,3 +1 @@
1
- // API-level types for LISTEN_AND_SPEAK_ODD_ONE_OUT question type
2
- // (Movers Part 3 - Which One Is Different? Why?)
3
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1,3 +1 @@
1
- // API-level types for LISTEN_AND_SPEAK_WITH_STORY_IMAGES question type
2
- // (Movers Part 2 - Tell the Story)
3
- export {};
1
+ export{};
@@ -1,5 +1 @@
1
- /**
2
- * API Types for LOOK_PICTURE_CHOOSE_CORRECT_ANSWER question type
3
- * Reference: .question_type/LookPictureChooseCorrectAnswer.json
4
- */
5
- export {};
1
+ export{};
@@ -1,9 +1 @@
1
- /**
2
- * API Payload interface for LOOK_PICTURE_FILL_BLANK_CHOOSE_ANSWER question type
3
- *
4
- * Used for:
5
- * - API GET /manage/exams/{examId}/questions response
6
- * - API POST /admin/questions/batch request/response
7
- * - localStorage storage (without addToQuestionBank and questionBank)
8
- */
9
- export {};
1
+ export{};
@@ -1,7 +1 @@
1
- /**
2
- * API Types for LOOK_PICTURE_FILL_WORD_HINT question type
3
- * Reference: .question_type/LookPictureFillWordHint.json
4
- *
5
- * API uses camelCase format
6
- */
7
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1,7 +1 @@
1
- /**
2
- * Type definitions for SPEAKING_CONVERSATION question type.
3
- * Used in admin creator, student exam renderer, and teacher grading.
4
- *
5
- * Design reference: docs/exams/speaking/key-for-school/KEY_FOR_SCHOOLS_SPEAKING.md
6
- */
7
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};
@@ -1 +1 @@
1
- export {};
1
+ export{};