@tinyweb_dev/oe-exam-sdk 0.1.26 → 0.1.28

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 (146) hide show
  1. package/README.md +79 -5
  2. package/dist/components/exams/ExamPreviewDialog.d.ts +7 -6
  3. package/dist/components/exams/ExamPreviewDialog.js +1 -1
  4. package/dist/components/exams/index.d.ts +0 -1
  5. package/dist/components/exams/take/components/QuestionRenderer.js +1 -1
  6. package/dist/components/exams/take/components/question-renderers/MoversListenAndWriteRenderer.js +1 -1
  7. package/dist/components/exams/take/components/question-renderers/MoversWordFillStructuredFormRenderer.js +1 -1
  8. package/dist/components/exams/take/exam-taking.utils.d.ts +0 -13
  9. package/dist/components/exams/take/exam-taking.utils.js +1 -1
  10. package/dist/components/exams/take/utils/answer-transformers.js +1 -1
  11. package/dist/components/exams/take/utils/question-transformers.d.ts +7 -17
  12. package/dist/components/exams/take/utils/question-transformers.js +1 -1
  13. package/dist/components/questions/_shared/config/question-types.config.js +1 -1
  14. package/dist/components/questions/_shared/types/choose-the-correct-answer-group.type.d.ts +36 -0
  15. package/dist/components/questions/_shared/types/cross-out-word-group.type.d.ts +40 -0
  16. package/dist/components/questions/_shared/types/index.d.ts +1 -0
  17. package/dist/components/questions/_shared/types/index.js +1 -1
  18. package/dist/components/questions/_shared/types/true-false-group.type.d.ts +31 -0
  19. package/dist/components/questions/_shared/types/true-false-group.type.js +1 -0
  20. package/dist/components/questions/_shared/types/word-fill-structured-form.type.d.ts +11 -17
  21. package/dist/components/questions/creator/question-type-registry.js +1 -1
  22. package/dist/components/questions/index.d.ts +0 -1
  23. package/dist/components/questions/index.js +1 -1
  24. package/dist/components/questions/types/choose-the-correct-answer-group/ChooseTheCorrectAnswerGroupClient.d.ts +2 -0
  25. package/dist/components/questions/types/choose-the-correct-answer-group/ChooseTheCorrectAnswerGroupClient.js +1 -0
  26. package/dist/components/questions/types/choose-the-correct-answer-group/ChooseTheCorrectAnswerGroupCreator.d.ts +2 -0
  27. package/dist/components/questions/types/choose-the-correct-answer-group/ChooseTheCorrectAnswerGroupCreator.js +1 -0
  28. package/dist/components/questions/types/choose-the-correct-answer-group/index.d.ts +3 -0
  29. package/dist/components/questions/types/choose-the-correct-answer-group/index.js +1 -0
  30. package/dist/components/questions/types/choose-the-correct-answer-group/map-choose-the-correct-answer-group-data.d.ts +4 -0
  31. package/dist/components/questions/types/choose-the-correct-answer-group/map-choose-the-correct-answer-group-data.js +1 -0
  32. package/dist/components/questions/types/choose-the-correct-answer-group/register.d.ts +2 -0
  33. package/dist/components/questions/types/choose-the-correct-answer-group/register.js +1 -0
  34. package/dist/components/questions/types/choose-the-correct-answer-group/transform.d.ts +2 -0
  35. package/dist/components/questions/types/choose-the-correct-answer-group/transform.js +1 -0
  36. package/dist/components/questions/types/cross-out-word-group/CrossOutWordGroupClient.d.ts +2 -0
  37. package/dist/components/questions/types/cross-out-word-group/CrossOutWordGroupClient.js +1 -0
  38. package/dist/components/questions/types/cross-out-word-group/CrossOutWordGroupCreator.d.ts +2 -0
  39. package/dist/components/questions/types/cross-out-word-group/CrossOutWordGroupCreator.js +1 -0
  40. package/dist/components/questions/types/cross-out-word-group/index.d.ts +5 -0
  41. package/dist/components/questions/types/cross-out-word-group/index.js +1 -0
  42. package/dist/components/questions/types/cross-out-word-group/map-cross-out-word-group-data.d.ts +6 -0
  43. package/dist/components/questions/types/cross-out-word-group/map-cross-out-word-group-data.js +1 -0
  44. package/dist/components/questions/types/cross-out-word-group/register.d.ts +2 -0
  45. package/dist/components/questions/types/cross-out-word-group/register.js +1 -0
  46. package/dist/components/questions/types/cross-out-word-group/transform.d.ts +2 -0
  47. package/dist/components/questions/types/cross-out-word-group/transform.js +1 -0
  48. package/dist/components/questions/types/true-false-group/TrueFalseGroupClient.d.ts +2 -0
  49. package/dist/components/questions/types/true-false-group/TrueFalseGroupClient.js +1 -0
  50. package/dist/components/questions/types/true-false-group/TrueFalseGroupCreator.d.ts +2 -0
  51. package/dist/components/questions/types/true-false-group/TrueFalseGroupCreator.js +1 -0
  52. package/dist/components/questions/types/true-false-group/index.d.ts +5 -0
  53. package/dist/components/questions/types/true-false-group/index.js +1 -0
  54. package/dist/components/questions/types/true-false-group/map-true-false-group-data.d.ts +4 -0
  55. package/dist/components/questions/types/true-false-group/map-true-false-group-data.js +1 -0
  56. package/dist/components/questions/types/true-false-group/register.d.ts +2 -0
  57. package/dist/components/questions/types/true-false-group/register.js +1 -0
  58. package/dist/components/questions/types/true-false-group/transform.d.ts +2 -0
  59. package/dist/components/questions/types/true-false-group/transform.js +1 -0
  60. package/dist/components/questions/types/word-fill-structured-form/index.d.ts +1 -0
  61. package/dist/components/questions/types/word-fill-structured-form/index.js +1 -1
  62. package/dist/components/questions/types/word-fill-structured-form/map-wfsf-question-data.d.ts +7 -0
  63. package/dist/components/questions/types/word-fill-structured-form/map-wfsf-question-data.js +1 -0
  64. package/dist/components/questions/types/word-fill-structured-form/register.js +1 -1
  65. package/dist/components/questions/types/word-fill-structured-form/transform.js +1 -1
  66. package/dist/components/questions/viewer/ChooseTheCorrectAnswerGroupViewer.d.ts +8 -0
  67. package/dist/components/questions/viewer/ChooseTheCorrectAnswerGroupViewer.js +1 -0
  68. package/dist/components/questions/viewer/CrossOutWordGroupViewer.d.ts +7 -0
  69. package/dist/components/questions/viewer/CrossOutWordGroupViewer.js +1 -0
  70. package/dist/components/questions/viewer/QuestionViewer.js +1 -1
  71. package/dist/components/questions/viewer/SpontaneousQaGroupViewer.d.ts +4 -0
  72. package/dist/components/questions/viewer/SpontaneousQaGroupViewer.js +1 -0
  73. package/dist/components/questions/viewer/TrueFalseGroupViewer.d.ts +8 -0
  74. package/dist/components/questions/viewer/TrueFalseGroupViewer.js +1 -0
  75. package/dist/components/questions/viewer/WordFillStructuredFormViewer.d.ts +9 -0
  76. package/dist/components/questions/viewer/WordFillStructuredFormViewer.js +1 -0
  77. package/dist/components/questions/viewer/WordOrderAndMatchGroupViewer.d.ts +4 -0
  78. package/dist/components/questions/viewer/WordOrderAndMatchGroupViewer.js +1 -0
  79. package/dist/components/questions/viewer/index.d.ts +6 -0
  80. package/dist/components/questions/viewer/index.js +1 -1
  81. package/dist/components/results/renderers/review-question-body-dedicated.js +1 -1
  82. package/dist/components/results/review-data.js +1 -1
  83. package/dist/components/themes/english-certification/EcWordFillStructuredForm.js +1 -1
  84. package/dist/index.d.ts +0 -2
  85. package/dist/index.js +1 -1
  86. package/dist/mcp/config.d.ts +12 -0
  87. package/dist/mcp/config.js +1 -0
  88. package/dist/mcp/http-client.d.ts +6 -0
  89. package/dist/mcp/http-client.js +1 -0
  90. package/dist/mcp/index.d.ts +6 -0
  91. package/dist/mcp/index.js +2 -0
  92. package/dist/mcp/tools/_helpers.d.ts +4 -0
  93. package/dist/mcp/tools/_helpers.js +1 -0
  94. package/dist/mcp/tools/exams.d.ts +2 -0
  95. package/dist/mcp/tools/exams.js +1 -0
  96. package/dist/mcp/tools/index.d.ts +2 -0
  97. package/dist/mcp/tools/index.js +1 -0
  98. package/dist/mcp/tools/results.d.ts +2 -0
  99. package/dist/mcp/tools/results.js +1 -0
  100. package/dist/shared/constants/question-skills.js +1 -1
  101. package/dist/shared/lib/i18n/messages/en/admin.d.ts +4 -11
  102. package/dist/shared/lib/i18n/messages/en/admin.js +1 -1
  103. package/dist/shared/lib/i18n/messages/en.d.ts +4 -11
  104. package/dist/shared/lib/i18n/messages/vi/admin.d.ts +4 -11
  105. package/dist/shared/lib/i18n/messages/vi/admin.js +1 -1
  106. package/dist/shared/lib/i18n/messages/vi.d.ts +4 -11
  107. package/dist/shared/lib/utils/question-reverse-transform.js +1 -1
  108. package/dist/shared/lib/utils/question-transform.js +1 -1
  109. package/dist/shared/types/common.types.d.ts +1 -1
  110. package/dist/shared/types/questions/choose-the-correct-answer-group.d.ts +41 -0
  111. package/dist/shared/types/questions/choose-the-correct-answer-group.js +1 -0
  112. package/dist/shared/types/questions/cross-out-word-group.d.ts +41 -0
  113. package/dist/shared/types/questions/cross-out-word-group.js +1 -0
  114. package/dist/shared/types/questions/index.d.ts +2 -0
  115. package/dist/shared/types/questions/index.js +1 -1
  116. package/package.json +166 -169
  117. package/dist/components/exams/ExamPreviewPartContent.d.ts +0 -18
  118. package/dist/components/exams/ExamPreviewPartContent.js +0 -1
  119. package/dist/components/exams/ExamPreviewSidebar.d.ts +0 -17
  120. package/dist/components/exams/ExamPreviewSidebar.js +0 -1
  121. package/dist/components/exams/exam-preview.types.d.ts +0 -34
  122. package/dist/components/exams/exam-preview.types.js +0 -1
  123. package/dist/components/questions/_shared/utils/parseFillBlankStem.d.ts +0 -30
  124. package/dist/components/questions/_shared/utils/parseFillBlankStem.js +0 -1
  125. package/dist/components/questions/question-bank/EditQuestionBankDialog.d.ts +0 -2
  126. package/dist/components/questions/question-bank/EditQuestionBankDialog.js +0 -1
  127. package/dist/components/questions/question-bank/QuestionEditorRenderer.d.ts +0 -23
  128. package/dist/components/questions/question-bank/QuestionEditorRenderer.js +0 -1
  129. package/dist/components/questions/question-bank/difficulty.d.ts +0 -15
  130. package/dist/components/questions/question-bank/difficulty.js +0 -1
  131. package/dist/components/questions/question-bank/editor-adapters/choice-adapters.d.ts +0 -5
  132. package/dist/components/questions/question-bank/editor-adapters/choice-adapters.js +0 -1
  133. package/dist/components/questions/question-bank/editor-adapters/index.d.ts +0 -5
  134. package/dist/components/questions/question-bank/editor-adapters/index.js +0 -1
  135. package/dist/components/questions/question-bank/editor-adapters/media-adapters.d.ts +0 -6
  136. package/dist/components/questions/question-bank/editor-adapters/media-adapters.js +0 -1
  137. package/dist/components/questions/question-bank/editor-adapters/types.d.ts +0 -1
  138. package/dist/components/questions/question-bank/editor-adapters/unsupported-fallback.d.ts +0 -8
  139. package/dist/components/questions/question-bank/editor-adapters/unsupported-fallback.js +0 -1
  140. package/dist/components/questions/question-bank/editor-adapters/writing-adapters.d.ts +0 -5
  141. package/dist/components/questions/question-bank/editor-adapters/writing-adapters.js +0 -1
  142. package/dist/components/questions/question-bank/index.d.ts +0 -4
  143. package/dist/components/questions/question-bank/index.js +0 -1
  144. package/dist/components/questions/question-bank/types.d.ts +0 -59
  145. /package/dist/components/questions/{question-bank/editor-adapters/types.js → _shared/types/choose-the-correct-answer-group.type.js} +0 -0
  146. /package/dist/components/questions/{question-bank/types.js → _shared/types/cross-out-word-group.type.js} +0 -0
@@ -275,12 +275,6 @@ declare const vi: {
275
275
  readonly 'admin.questionBank.dialog.edit.save': "Lưu thay đổi";
276
276
  readonly 'admin.questionBank.dialog.edit.codeError': "Vui lòng nhập mã câu hỏi";
277
277
  readonly 'admin.questionBank.dialog.edit.titleError': "Vui lòng nhập tiêu đề";
278
- readonly 'admin.questionBank.dialog.edit.loading': "Đang tải...";
279
- readonly 'admin.questionBank.dialog.edit.unsupportedNote': "Lưu ý:";
280
- 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.";
281
- readonly 'admin.questionBank.dialog.edit.contentLabel': "Nội dung câu hỏi";
282
- readonly 'admin.questionBank.dialog.edit.answerLabel': "Đáp án đúng";
283
- readonly 'admin.questionBank.dialog.edit.explanationLabel': "Giải thích";
284
278
  readonly 'admin.questionBank.dialog.delete.title': "Xác nhận xóa câu hỏi";
285
279
  readonly 'admin.questionBank.dialog.delete.message': "Bạn có chắc chắn muốn xóa câu hỏi";
286
280
  readonly 'admin.questionBank.dialog.delete.warning': "Hành động này không thể hoàn tác.";
@@ -1550,6 +1544,9 @@ declare const vi: {
1550
1544
  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";
1551
1545
  readonly 'admin.exams.shuffle.info4': "Các đề thi con được liên kết với đề thi cha để quản lý";
1552
1546
  readonly 'admin.exams.shuffle.countLabel': "Số lượng đề thi con muốn tạo";
1547
+ readonly 'admin.exams.shuffle.strategyLabel': "Lựa chọn xử lý đề thi cũ";
1548
+ readonly 'admin.exams.shuffle.keepOld': "Giữ lại các đề thi cũ và thêm đề mới";
1549
+ readonly 'admin.exams.shuffle.replaceAll': "Tạo bộ đề mới hoàn toàn";
1553
1550
  readonly 'admin.exams.shuffle.existingVariants': "Đề thi đã có ({count})";
1554
1551
  readonly 'admin.exams.shuffle.deleteAll': "Xóa tất cả ({count})";
1555
1552
  readonly 'admin.exams.shuffle.loading': "Đang tải...";
@@ -1640,25 +1637,21 @@ declare const vi: {
1640
1637
  readonly 'admin.exams.preview.totalPoints': "Tổng điểm:";
1641
1638
  readonly 'admin.exams.preview.progress': "Tiến độ";
1642
1639
  readonly 'admin.exams.preview.loading': "Đang tải...";
1643
- readonly 'admin.exams.preview.questionNavigation': "Điều hướng Part";
1640
+ readonly 'admin.exams.preview.questionNavigation': "Điều hướng câu hỏi";
1644
1641
  readonly 'admin.exams.preview.all': "Tất cả";
1645
1642
  readonly 'admin.exams.preview.allQuestions': "Tất cả {count} câu hỏi";
1646
1643
  readonly 'admin.exams.preview.partQuestions': "Part {part}: {count} câu";
1647
1644
  readonly 'admin.exams.preview.collapse': "Thu gọn";
1648
1645
  readonly 'admin.exams.preview.detail': "Chi tiết";
1649
1646
  readonly 'admin.exams.preview.questionIndex': "Câu hỏi {index} / {total}";
1650
- readonly 'admin.exams.preview.partIndex': "Part {index} / {total}";
1651
1647
  readonly 'admin.exams.preview.noQuestions': "Chưa có câu hỏi";
1652
1648
  readonly 'admin.exams.preview.loadingQuestions': "Đang tải câu hỏi...";
1653
1649
  readonly 'admin.exams.preview.retry': "Thử lại";
1654
1650
  readonly 'admin.exams.preview.examNoQuestions': "Đề thi này chưa có câu hỏi nào.";
1655
1651
  readonly 'admin.exams.preview.prevQuestion': "Câu trước";
1656
- readonly 'admin.exams.preview.prevPart': "Part trước";
1657
1652
  readonly 'admin.exams.preview.prev': "Trước";
1658
1653
  readonly 'admin.exams.preview.nextQuestion': "Câu tiếp theo";
1659
- readonly 'admin.exams.preview.nextPart': "Part tiếp theo";
1660
1654
  readonly 'admin.exams.preview.next': "Tiếp";
1661
- readonly 'admin.exams.preview.questionLabel': "Câu {number}";
1662
1655
  readonly 'admin.exams.preview.footerNote': "Đây là chế độ xem trước để kiểm tra bố cục và nội dung đề thi.";
1663
1656
  readonly 'admin.exams.preview.close': "Đóng";
1664
1657
  readonly 'admin.exams.preview.loadError': "Không thể tải câu hỏi. Vui lòng thử lại.";
@@ -1 +1 @@
1
- const n=n=>"object"==typeof n&&null!==n&&!Array.isArray(n),e=e=>n(e)?e:{},t=n=>Array.isArray(n)?n:[],o=(n,e="")=>"string"==typeof n?n:e,r=(n,e)=>"number"==typeof n&&Number.isFinite(n)?n:e,s=n=>e(n.correctAnswer??n.correct_answer),i=n=>e(n.questionGroup??n.question_group),_=n=>Number.parseFloat(String(n.total_points??n.points??1))||1,a=n=>{const e=n?.toUpperCase();return"EASY"===e||"MEDIUM"===e||"HARD"===e?e:void 0},E=n=>{const e=n?.toUpperCase();return"LISTENING"===e||"READING"===e||"WRITING"===e||"SPEAKING"===e?e:void 0},A=n=>({content:n.content,answer:s(n)}),N=n=>{const r=e(n.content),i=s(n);return{content:"",answer:{imageUrl:o(r.imageUrl),question:o(r.question),options:t(r.options).map(n=>"string"==typeof n?n:o(e(n).text)),correctAnswer:i.answer??i.correctAnswer??-1,explanation:o(n.explanation),points:_(n)}}},p=n=>{const t=e(n.content),a=s(n),E=i(n);return{content:"",answer:{...e(E.payload),...t,...a,groupNumber:r(E.groupNumber,1),explanation:o(n.explanation),points:_(n)}}},u=n=>{const t=s(n),r=e(n.content);return{content:n.content??"",answer:{...t,...r,explanation:o(n.explanation),points:_(n)}}},S={CHOOSE_THE_CORRECT_ANSWER:n=>{const r=e(n.content),i=s(n),a=i.answer??-1,E=Boolean(r.multipleAnswers??i.multipleAnswers??Array.isArray(a));return{content:"",answer:{question:o(r.question),optionType:o(r.optionType,"text"),options:t(r.options),imageUrl:o(r.imageUrl),askerName:o(r.askerName),answererName:o(r.answererName),correctAnswer:E?Array.isArray(a)?a:-1===a?[]:[a]:Array.isArray(a)?a[0]??-1:a,multipleAnswers:E,explanation:o(n.explanation),points:_(n)}}},LOOK_PICTURE_CHOOSE_CORRECT_ANSWER:N,LOOK_PICTURE_FILL_BLANK_CHOOSE_ANSWER:N,FILL_IN_BLANK:n=>{const r=e(n.content),i=s(n),a=e(t(r.blanks)[0]);return{content:"",answer:{question:o(r.question??a.text),answers:Array.isArray(i.answers)?i.answers:[],caseSensitive:Boolean(i.caseSensitive??!1),imageUrl:o(r.imageUrl),showHints:Boolean(r.showHints??!1),hints:t(r.hints),explanation:o(n.explanation),points:_(n),blanks:t(r.blanks)}}},READ_PASSAGE_AND_ANSWER_QUESTIONS:n=>{const a=e(n.content),E=s(n),A=i(n),N=e(A.payload);return{content:"",answer:{passage:o(N.passage??a.passage),passageTitle:o(N.passageTitle??a.passageTitle),instructions:o(N.instructions??a.instructions),singleQuestion:{id:o(n.id,`question-${String(n.question_number??n.questionNumber??1)}`),question:o(a.question),options:t(a.options),correctAnswer:E.correctAnswer??E.answer??-1,points:_(n),groupNumber:r(A.groupNumber,1)}}}},LABEL_THE_PICTURE:n=>{const r=e(n.content),i=s(n),_=e(i.labels??i.answers);return{content:"",answer:{imageUrl:o(r.imageUrl),wordBank:t(r.wordBank),labels:t(r.labels).map(n=>{const t=e(n),r=o(t.id);return{...t,correctAnswer:t.correctAnswer??_[r]??""}})}}},READ_AND_COLOR_OBJECTS:p,IMAGE_OBJECT_MATCHING:p,FILL_MISSING_WORDS_IN_GRID:n=>({content:n.content??{},answer:s(n)}),LOOK_PICTURE_FILL_WORD_HINT:p,ANSWER_THE_QUESTION:p,TRUE_FALSE:u,WORD_ORDERING:u,WORD_FILL_PARAGRAPH:u,MATCH_BY_WRITING_ANSWER:p,WRITE_SENTENCES:p,WRITE_A_SHORT_LETTER:u,WRITE_CORRECT_VERB_FORM:u,CHOOSE_CORRECT_ADJECTIVE:u,WORD_FILL_STRUCTURED_FORM:p,LISTEN_AND_CHOOSE_FROM_ANSWER_GROUP:p,LISTEN_AND_CHOOSE_OBJECTS_IN_SCENE:p,LISTEN_AND_DRAG_OBJECTS_INTO_SCENE:p,LISTEN_AND_SPEAK_ANSWER:p,LISTEN_AND_SPEAK_IMAGE_GROUP:p,LISTEN_AND_SPEAK_QUESTION_LIST:p,LISTEN_AND_SPEAK_COMPARE_IMAGES:p,LISTEN_AND_SPEAK_WITH_STORY_IMAGES:p,LISTEN_AND_SPEAK_ODD_ONE_OUT:p,LISTEN_AND_SPEAK_INFO_EXCHANGE:p,SPEAKING_DESCRIBE_IMAGE:u,READ_DISPLAYED_CONTENT:u,SPONTANEOUS_QA:u,SPEAKING_CONVERSATION:p,SPEAKING_CUE_CARD:u,GN_SPEAKING_INTERVIEW:p};export function transformApiQuestionToFrontend(e){const t=String(e.questionType??e.question_type??e.type??""),s=(S[t]??A)(e),i=(e=>{const t=e.questionBank??e.question_bank;return n(t)?t:void 0})(e);return{id:o(e.id),type:t,content:s.content,answer:s.answer,points:_(e),level:(N=e.level,"Pre-A1"===N||"A1"===N||"A2"===N||"B1"===N||"B2"===N||"C1"===N||"C2"===N?N:void 0),difficulty:a(o(e.difficulty??e.difficult_level)),skill:E(o(e.questionSkillType??e.question_skill_type??e.skill)),explanation:o(e.explanation),partId:o(e.partId??e.part_id),questionNumber:r(e.questionNumber??e.question_number,1),isCompleted:!0,questionGroup:e.questionGroup,questionBank:i?{id:o(i.id),code:o(i.code),title:o(i.title)}:void 0};var N}export function transformApiQuestionsToFrontend(n){return n.map(transformApiQuestionToFrontend)}
1
+ const e=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),t=t=>e(t)?t:{},n=e=>Array.isArray(e)?e:[],o=(e,t="")=>"string"==typeof e?e:t,r=(e,t)=>"number"==typeof e&&Number.isFinite(e)?e:t,s=e=>t(e.correctAnswer??e.correct_answer),i=e=>t(e.questionGroup??e.question_group),a=e=>Number.parseFloat(String(e.total_points??e.points??1))||1,_=e=>{const t=e?.toUpperCase();return"EASY"===t||"MEDIUM"===t||"HARD"===t?t:void 0},p=e=>{const t=e?.toUpperCase();return"LISTENING"===t||"READING"===t||"WRITING"===t||"SPEAKING"===t?t:void 0},E=e=>({content:e.content,answer:s(e)}),c=e=>{const r=t(e.content),i=s(e);return{content:"",answer:{imageUrl:o(r.imageUrl),question:o(r.question),options:n(r.options).map(e=>"string"==typeof e?e:o(t(e).text)),correctAnswer:i.answer??i.correctAnswer??-1,explanation:o(e.explanation),points:a(e)}}},u=e=>{const n=t(e.content),_=s(e),p=i(e);return{content:"",answer:{...t(p.payload),...n,..._,groupNumber:r(p.groupNumber,1),explanation:o(e.explanation),points:a(e)}}},A=e=>{const n=s(e),r=t(e.content);return{content:e.content??"",answer:{...n,...r,explanation:o(e.explanation),points:a(e)}}},l={CHOOSE_THE_CORRECT_ANSWER:e=>{const r=t(e.content),i=s(e),_=i.answer??-1,p=Boolean(r.multipleAnswers??i.multipleAnswers??Array.isArray(_));return{content:"",answer:{question:o(r.question),optionType:o(r.optionType,"text"),options:n(r.options),imageUrl:o(r.imageUrl),askerName:o(r.askerName),answererName:o(r.answererName),correctAnswer:p?Array.isArray(_)?_:-1===_?[]:[_]:Array.isArray(_)?_[0]??-1:_,multipleAnswers:p,explanation:o(e.explanation),points:a(e)}}},CHOOSE_THE_CORRECT_ANSWER_GROUP:e=>{const i=t(e.content),a=s(e),_=n(a.answer).map(e=>o(e)),p=n(i.items).map((e,s)=>{const i=t(e),a=t(i.content),p=t(i.correctAnswer),E=n(a.options).map((e,n)=>{const r=t(e);return{id:o(r.id,`opt-${n+1}`),text:o(r.text)}}),c=!0===i.isExample;return{question:o(a.question),optionType:"image"===o(a.optionType,"text")?"image":"text",options:E.length>=2?E:[{id:"opt-1",text:""},{id:"opt-2",text:""},{id:"opt-3",text:""}],correctAnswer:o(p.answer)||_[s]||E[0]?.id||"opt-1",isExample:c,points:c?0:r(i.points,1),questionNumber:r(i.questionNumber,s+1)}});return{content:"",answer:{instruction:o(t(i.meta).instruction,"Choose the correct answer."),items:p,explanation:o(e.explanation),points:p.reduce((e,t)=>t.isExample?e:e+t.points,0)}}},TRUE_FALSE_GROUP:e=>{const i=t(e.content),a=s(e),_=n(a.answer),p=n(i.items).map((e,n)=>{const s=t(e),i=t(s.content),a=t(s.correctAnswer),p=!0===s.isExample,E="boolean"==typeof a.answer?a.answer:"boolean"!=typeof _[n]||_[n];return{question:o(i.question),correctAnswer:E,isExample:p,points:p?0:r(s.points,1),questionNumber:r(s.questionNumber,n+1)}});return{content:"",answer:{instruction:o(t(i.meta).instruction,"Tick True or False."),items:p,explanation:o(e.explanation),points:p.reduce((e,t)=>t.isExample?e:e+t.points,0)}}},CROSS_OUT_WORD_GROUP:e=>{const i=t(e.content),a=s(e),_=n(a.answer),p=n(i.items).map((e,n)=>{const s=t(e),i=t(s.content),a=t(t(s.correctAnswer).answer),p=t(_[n]),E=Object.keys(a).length>0?a:p,c=!0===s.isExample,u="CROSS_OUT_AND_REPLACE"===i.type||"CROSS_OUT_AND_REPLACE"===E.type?"CROSS_OUT_AND_REPLACE":"CROSS_OUT",A="CROSS_OUT_AND_REPLACE"===u?{type:"CROSS_OUT_AND_REPLACE",crossOut:o(E.crossOut),replaceWith:o(E.replaceWith)}:{type:"CROSS_OUT",crossOut:o(E.crossOut)};return{type:u,question:o(i.question),correctAnswer:A,isExample:c,points:c?0:r(s.points,1),questionNumber:r(s.questionNumber,n+1)}});return{content:"",answer:{instruction:o(t(i.meta).instruction,"Cross out the extra or incorrect word. If the word is incorrect, write the correct word. If the line is correct, leave it blank."),items:p,explanation:o(e.explanation),points:p.reduce((e,t)=>t.isExample?e:e+t.points,0)}}},LOOK_PICTURE_CHOOSE_CORRECT_ANSWER:c,LOOK_PICTURE_FILL_BLANK_CHOOSE_ANSWER:c,FILL_IN_BLANK:e=>{const r=t(e.content),i=s(e),_=t(n(r.blanks)[0]);return{content:"",answer:{question:o(r.question??_.text),answers:Array.isArray(i.answers)?i.answers:[],caseSensitive:Boolean(i.caseSensitive??!1),imageUrl:o(r.imageUrl),showHints:Boolean(r.showHints??!1),hints:n(r.hints),explanation:o(e.explanation),points:a(e),blanks:n(r.blanks)}}},READ_PASSAGE_AND_ANSWER_QUESTIONS:e=>{const _=t(e.content),p=s(e),E=i(e),c=t(E.payload);return{content:"",answer:{passage:o(c.passage??_.passage),passageTitle:o(c.passageTitle??_.passageTitle),instructions:o(c.instructions??_.instructions),singleQuestion:{id:o(e.id,`question-${String(e.question_number??e.questionNumber??1)}`),question:o(_.question),options:n(_.options),correctAnswer:p.correctAnswer??p.answer??-1,points:a(e),groupNumber:r(E.groupNumber,1)}}}},LABEL_THE_PICTURE:e=>{const r=t(e.content),i=s(e),a=t(i.labels??i.answers);return{content:"",answer:{imageUrl:o(r.imageUrl),wordBank:n(r.wordBank),labels:n(r.labels).map(e=>{const n=t(e),r=o(n.id);return{...n,correctAnswer:n.correctAnswer??a[r]??""}})}}},READ_AND_COLOR_OBJECTS:u,IMAGE_OBJECT_MATCHING:u,FILL_MISSING_WORDS_IN_GRID:e=>({content:e.content??{},answer:s(e)}),LOOK_PICTURE_FILL_WORD_HINT:u,ANSWER_THE_QUESTION:u,TRUE_FALSE:A,WORD_ORDERING:A,WORD_FILL_PARAGRAPH:A,MATCH_BY_WRITING_ANSWER:u,WRITE_SENTENCES:u,WRITE_A_SHORT_LETTER:A,WRITE_CORRECT_VERB_FORM:A,CHOOSE_CORRECT_ADJECTIVE:A,WORD_FILL_STRUCTURED_FORM:u,LISTEN_AND_CHOOSE_FROM_ANSWER_GROUP:u,LISTEN_AND_CHOOSE_OBJECTS_IN_SCENE:u,LISTEN_AND_DRAG_OBJECTS_INTO_SCENE:u,LISTEN_AND_SPEAK_ANSWER:u,LISTEN_AND_SPEAK_IMAGE_GROUP:u,LISTEN_AND_SPEAK_QUESTION_LIST:u,LISTEN_AND_SPEAK_COMPARE_IMAGES:u,LISTEN_AND_SPEAK_WITH_STORY_IMAGES:u,LISTEN_AND_SPEAK_ODD_ONE_OUT:u,LISTEN_AND_SPEAK_INFO_EXCHANGE:u,SPEAKING_DESCRIBE_IMAGE:A,READ_DISPLAYED_CONTENT:A,SPONTANEOUS_QA:A,SPEAKING_CONVERSATION:u,SPEAKING_CUE_CARD:A,GN_SPEAKING_INTERVIEW:u};export function transformApiQuestionToFrontend(t){const n=String(t.questionType??t.question_type??t.type??""),s=(l[n]??E)(t),i=(t=>{const n=t.questionBank??t.question_bank;return e(n)?n:void 0})(t);return{id:o(t.id),type:n,content:s.content,answer:s.answer,points:a(t),level:(c=t.level,"Pre-A1"===c||"A1"===c||"A2"===c||"B1"===c||"B2"===c||"C1"===c||"C2"===c?c:void 0),difficulty:_(o(t.difficulty??t.difficult_level)),skill:p(o(t.questionSkillType??t.question_skill_type??t.skill)),explanation:o(t.explanation),partId:o(t.partId??t.part_id),questionNumber:r(t.questionNumber??t.question_number,1),isCompleted:!0,questionGroup:t.questionGroup,questionBank:i?{id:o(i.id),code:o(i.code),title:o(i.title)}:void 0};var c}export function transformApiQuestionsToFrontend(e){return e.map(transformApiQuestionToFrontend)}
@@ -1 +1 @@
1
- import{validateQuestionForTransform as o}from"./question-transform-validation";import{transformLookPictureChooseCorrectAnswer as t}from"../../../components/questions/types/look-picture-choose-correct-answer/transform";import{transformLookPictureFillBlankChooseAnswer as s}from"../../../components/questions/types/look-picture-fill-blank-choose-answer/transform";import{transformLookPictureFillWordHint as e}from"../../../components/questions/types/look-picture-fill-word-hint/transform";import{transformReadAndColorObjects as n}from"../../../components/questions/types/read-and-color-objects/transform";import{transformReadPassageAndAnswerQuestions as r}from"../../../components/questions/types/read-passage-and-answer-questions/transform";import{transformArrangeLettersIntoWords as a}from"../../../components/questions/types/arrange-letters-into-words/transform";import{transformWriteShortParagraph as i}from"../../../components/questions/types/write-short-paragraph/transform";import{transformWriteAShortLetter as p}from"../../../components/questions/types/write-a-short-letter/transform";import{transformFillMissingWordsInGrid as m}from"../../../components/questions/types/fill-missing-words-in-grid/transform";import{transformLabelThePicture as u}from"../../../components/questions/types/label-the-picture/transform";import{transformChooseTheCorrectAnswer as c}from"../../../components/questions/types/choose-the-correct-answer/transform";import{transformFillInBlank as _}from"../../../components/questions/types/fill-in-blank/transform";import{transformWriteCorrectVerbForm as E}from"../../../components/questions/types/write-correct-verb-form/transform";import{transformChooseCorrectAdjective as f}from"../../../components/questions/types/choose-correct-adjective/transform";import{transformAnswerTheQuestion as N}from"../../../components/questions/types/answer-the-question/transform";import{transformTrueFalse as A}from"../../../components/questions/types/true-false/transform";import{transformWordOrdering as I}from"../../../components/questions/types/word-ordering/transform";import{transformWordFillParagraph as d}from"../../../components/questions/types/word-fill-paragraph/transform";import{transformMatchByWritingAnswer as T}from"../../../components/questions/types/match-by-writing-answer/transform";import{transformWriteSentences as l}from"../../../components/questions/types/write-sentences/transform";import{transformListenAndChooseFromAnswerGroup as S}from"../../../components/questions/types/listen-and-choose-from-answer-group/transform";import{transformListenAndChooseObjectsInScene as R}from"../../../components/questions/types/listen-and-choose-objects-in-scene/transform";import{transformListenAndDragObjectsIntoScene as q}from"../../../components/questions/types/listen-and-drag-objects-into-scene/transform";import{transformListenAndSpeakAnswer as D}from"../../../components/questions/types/listen-and-speak-answer/transform";import{transformListenAndSpeakImageGroup as O}from"../../../components/questions/types/listen-and-speak-image-group/transform";import{transformListenAndSpeakQuestionList as L}from"../../../components/questions/types/listen-and-speak-question-list/transform";import{transformListenAndSpeakCompareImages as y}from"../../../components/questions/types/listen-and-speak-compare-images/transform";import{transformListenAndSpeakOddOneOut as C}from"../../../components/questions/types/listen-and-speak-odd-one-out/transform";import{transformListenAndSpeakWithStoryImages as G}from"../../../components/questions/types/listen-and-speak-with-story-images/transform";import{transformListenAndSpeakInfoExchange as g}from"../../../components/questions/types/listen-and-speak-info-exchange/transform";import{transformSpeakingDescribeImage as w}from"../../../components/questions/types/speaking-describe-image/transform";import{transformReadDisplayedContent as h}from"../../../components/questions/types/read-displayed-content/transform";import{transformSpontaneousQA as k}from"../../../components/questions/types/spontaneous-qa/transform";import{transformSpeakingConversation as P}from"../../../components/questions/types/speaking-conversation/transform";import{transformSpeakingCueCard as b}from"../../../components/questions/types/speaking-cue-card/transform";import{transformGNSpeakingInterview as B}from"../../../components/questions/types/gn-speaking-interview/transform";import{transformWordFillStructuredForm as W}from"../../../components/questions/types/word-fill-structured-form/transform";const v={LOOK_PICTURE_CHOOSE_CORRECT_ANSWER:t,LOOK_PICTURE_FILL_BLANK_CHOOSE_ANSWER:s,LOOK_PICTURE_FILL_WORD_HINT:e,READ_AND_COLOR_OBJECTS:n,IMAGE_OBJECT_MATCHING:n,READ_PASSAGE_AND_ANSWER_QUESTIONS:r,ARRANGE_LETTERS_INTO_WORDS:a,WRITE_SHORT_PARAGRAPH:i,WRITE_A_SHORT_LETTER:p,FILL_MISSING_WORDS_IN_GRID:m,LABEL_THE_PICTURE:u,CHOOSE_THE_CORRECT_ANSWER:c,FILL_IN_BLANK:_,WRITE_CORRECT_VERB_FORM:E,CHOOSE_CORRECT_ADJECTIVE:f,ANSWER_THE_QUESTION:N,TRUE_FALSE:A,WORD_ORDERING:I,WORD_FILL_PARAGRAPH:d,MATCH_BY_WRITING_ANSWER:T,WRITE_SENTENCES:l,LISTEN_AND_CHOOSE_FROM_ANSWER_GROUP:S,LISTEN_AND_CHOOSE_OBJECTS_IN_SCENE:R,LISTEN_AND_DRAG_OBJECTS_INTO_SCENE:q,LISTEN_AND_SPEAK_ANSWER:D,LISTEN_AND_SPEAK_IMAGE_GROUP:O,LISTEN_AND_SPEAK_QUESTION_LIST:L,LISTEN_AND_SPEAK_COMPARE_IMAGES:y,LISTEN_AND_SPEAK_ODD_ONE_OUT:C,LISTEN_AND_SPEAK_WITH_STORY_IMAGES:G,LISTEN_AND_SPEAK_INFO_EXCHANGE:g,SPEAKING_DESCRIBE_IMAGE:w,READ_DISPLAYED_CONTENT:h,SPONTANEOUS_QA:k,SPEAKING_CONVERSATION:P,SPEAKING_CUE_CARD:b,GN_SPEAKING_INTERVIEW:B,WORD_FILL_STRUCTURED_FORM:W};export function transformQuestionToApiFormat(o,t={}){const{partId:s,partNo:e,questionNumber:n,addToQuestionBank:r,questionBankCode:a,questionBankTitle:i,sectionId:p,examLevel:m,subjectId:u}=t,{id:c,type:_,points:E,explanation:f}=o,N=_?v[_]:void 0,A=N?N(o):{apiContent:{},apiCorrectAnswer:{}},{apiContent:I,apiCorrectAnswer:d,totalPoints:T,hintLetters:l,groupNumber:S,passageData:R,imageData:q,basicGroupData:D,questionListGroupData:O,sceneData:L,answerGroupData:y,compareImagesGroupData:C,infoExchangeGroupData:G,conversationGroupData:g,isExample:w,suggestedAnswers:h}=A,k=o.answer,P=o.content,b={id:c,questionType:_||"",content:I,correctAnswer:d||{},points:T??E??1,explanation:A.explanation||f||k?.explanation||P?.explanation||"",questionNumber:n,partId:s,partNo:e,...null!=p?{sectionId:p}:{},questionSkillType:o.skill,examLevel:m,subjectId:u,addToQuestionBank:r??!1,questionBank:r&&a&&i?{code:a,title:i}:void 0,isExample:w||!1};h&&h.length>0&&(b.suggestedAnswers=h);const B=function(o){const{hintLetters:t,passageData:s,imageData:e,basicGroupData:n,sceneData:r,answerGroupData:a,questionListGroupData:i,compareImagesGroupData:p,infoExchangeGroupData:m,conversationGroupData:u}=o;if(t&&t.length>0)return{hintLetters:t};if(s)return s;if(e)return e;if(n&&(n.title||n.subtitle||n.content||n.imageUrl||n.articles))return n;return r||(a||(i||(p||(m||(u||void 0)))))}({hintLetters:l,passageData:R,imageData:q,basicGroupData:D,sceneData:L,answerGroupData:y,questionListGroupData:O,compareImagesGroupData:C,infoExchangeGroupData:G,conversationGroupData:g});return B&&(b.isGroup=!0,b.questionGroup={payload:B,groupNumber:S||1}),b}export function transformQuestionsToApiFormat(t){const s=[],e=[];return t.forEach((t,n)=>{const{question:r,partId:a,partNo:i,sectionId:p,addToQuestionBank:m,questionBankCode:u,questionBankTitle:c,examLevel:_,subjectId:E}=t,f=o(r);if(!f.isValid)return void e.push({index:n,errors:f.errors});const N=r.questionNumber??n+1;s.push(transformQuestionToApiFormat(r,{partId:a,partNo:i,questionNumber:N,addToQuestionBank:m,questionBankCode:u,questionBankTitle:c,sectionId:p,examLevel:_,subjectId:E}))}),{validQuestions:s,invalidQuestions:e}}
1
+ import{validateQuestionForTransform as o}from"./question-transform-validation";import{transformLookPictureChooseCorrectAnswer as t}from"../../../components/questions/types/look-picture-choose-correct-answer/transform";import{transformLookPictureFillBlankChooseAnswer as s}from"../../../components/questions/types/look-picture-fill-blank-choose-answer/transform";import{transformLookPictureFillWordHint as e}from"../../../components/questions/types/look-picture-fill-word-hint/transform";import{transformReadAndColorObjects as n}from"../../../components/questions/types/read-and-color-objects/transform";import{transformReadPassageAndAnswerQuestions as r}from"../../../components/questions/types/read-passage-and-answer-questions/transform";import{transformArrangeLettersIntoWords as a}from"../../../components/questions/types/arrange-letters-into-words/transform";import{transformWriteShortParagraph as i}from"../../../components/questions/types/write-short-paragraph/transform";import{transformWriteAShortLetter as p}from"../../../components/questions/types/write-a-short-letter/transform";import{transformFillMissingWordsInGrid as m}from"../../../components/questions/types/fill-missing-words-in-grid/transform";import{transformLabelThePicture as u}from"../../../components/questions/types/label-the-picture/transform";import{transformChooseTheCorrectAnswer as c}from"../../../components/questions/types/choose-the-correct-answer/transform";import{transformChooseTheCorrectAnswerGroup as _}from"../../../components/questions/types/choose-the-correct-answer-group/transform";import{transformCrossOutWordGroup as E}from"../../../components/questions/types/cross-out-word-group/transform";import{transformFillInBlank as f}from"../../../components/questions/types/fill-in-blank/transform";import{transformWriteCorrectVerbForm as N}from"../../../components/questions/types/write-correct-verb-form/transform";import{transformChooseCorrectAdjective as A}from"../../../components/questions/types/choose-correct-adjective/transform";import{transformAnswerTheQuestion as I}from"../../../components/questions/types/answer-the-question/transform";import{transformTrueFalse as T}from"../../../components/questions/types/true-false/transform";import{transformWordOrdering as d}from"../../../components/questions/types/word-ordering/transform";import{transformWordFillParagraph as R}from"../../../components/questions/types/word-fill-paragraph/transform";import{transformMatchByWritingAnswer as S}from"../../../components/questions/types/match-by-writing-answer/transform";import{transformWriteSentences as l}from"../../../components/questions/types/write-sentences/transform";import{transformListenAndChooseFromAnswerGroup as O}from"../../../components/questions/types/listen-and-choose-from-answer-group/transform";import{transformListenAndChooseObjectsInScene as q}from"../../../components/questions/types/listen-and-choose-objects-in-scene/transform";import{transformListenAndDragObjectsIntoScene as D}from"../../../components/questions/types/listen-and-drag-objects-into-scene/transform";import{transformListenAndSpeakAnswer as C}from"../../../components/questions/types/listen-and-speak-answer/transform";import{transformListenAndSpeakImageGroup as y}from"../../../components/questions/types/listen-and-speak-image-group/transform";import{transformListenAndSpeakQuestionList as L}from"../../../components/questions/types/listen-and-speak-question-list/transform";import{transformListenAndSpeakCompareImages as G}from"../../../components/questions/types/listen-and-speak-compare-images/transform";import{transformListenAndSpeakOddOneOut as g}from"../../../components/questions/types/listen-and-speak-odd-one-out/transform";import{transformListenAndSpeakWithStoryImages as w}from"../../../components/questions/types/listen-and-speak-with-story-images/transform";import{transformListenAndSpeakInfoExchange as h}from"../../../components/questions/types/listen-and-speak-info-exchange/transform";import{transformSpeakingDescribeImage as k}from"../../../components/questions/types/speaking-describe-image/transform";import{transformReadDisplayedContent as P}from"../../../components/questions/types/read-displayed-content/transform";import{transformSpontaneousQA as b}from"../../../components/questions/types/spontaneous-qa/transform";import{transformSpeakingConversation as W}from"../../../components/questions/types/speaking-conversation/transform";import{transformSpeakingCueCard as B}from"../../../components/questions/types/speaking-cue-card/transform";import{transformGNSpeakingInterview as H}from"../../../components/questions/types/gn-speaking-interview/transform";import{transformWordFillStructuredForm as U}from"../../../components/questions/types/word-fill-structured-form/transform";const v={LOOK_PICTURE_CHOOSE_CORRECT_ANSWER:t,LOOK_PICTURE_FILL_BLANK_CHOOSE_ANSWER:s,LOOK_PICTURE_FILL_WORD_HINT:e,READ_AND_COLOR_OBJECTS:n,IMAGE_OBJECT_MATCHING:n,READ_PASSAGE_AND_ANSWER_QUESTIONS:r,ARRANGE_LETTERS_INTO_WORDS:a,WRITE_SHORT_PARAGRAPH:i,WRITE_A_SHORT_LETTER:p,FILL_MISSING_WORDS_IN_GRID:m,LABEL_THE_PICTURE:u,CHOOSE_THE_CORRECT_ANSWER:c,CHOOSE_THE_CORRECT_ANSWER_GROUP:_,CROSS_OUT_WORD_GROUP:E,FILL_IN_BLANK:f,WRITE_CORRECT_VERB_FORM:N,CHOOSE_CORRECT_ADJECTIVE:A,ANSWER_THE_QUESTION:I,TRUE_FALSE:T,WORD_ORDERING:d,WORD_FILL_PARAGRAPH:R,MATCH_BY_WRITING_ANSWER:S,WRITE_SENTENCES:l,LISTEN_AND_CHOOSE_FROM_ANSWER_GROUP:O,LISTEN_AND_CHOOSE_OBJECTS_IN_SCENE:q,LISTEN_AND_DRAG_OBJECTS_INTO_SCENE:D,LISTEN_AND_SPEAK_ANSWER:C,LISTEN_AND_SPEAK_IMAGE_GROUP:y,LISTEN_AND_SPEAK_QUESTION_LIST:L,LISTEN_AND_SPEAK_COMPARE_IMAGES:G,LISTEN_AND_SPEAK_ODD_ONE_OUT:g,LISTEN_AND_SPEAK_WITH_STORY_IMAGES:w,LISTEN_AND_SPEAK_INFO_EXCHANGE:h,SPEAKING_DESCRIBE_IMAGE:k,READ_DISPLAYED_CONTENT:P,SPONTANEOUS_QA:b,SPEAKING_CONVERSATION:W,SPEAKING_CUE_CARD:B,GN_SPEAKING_INTERVIEW:H,WORD_FILL_STRUCTURED_FORM:U};export function transformQuestionToApiFormat(o,t={}){const{partId:s,partNo:e,questionNumber:n,addToQuestionBank:r,questionBankCode:a,questionBankTitle:i,sectionId:p,examLevel:m,subjectId:u}=t,{id:c,type:_,points:E,explanation:f}=o,N=_?v[_]:void 0,A=N?N(o):{apiContent:{},apiCorrectAnswer:{}},{apiContent:I,apiCorrectAnswer:T,totalPoints:d,hintLetters:R,groupNumber:S,passageData:l,imageData:O,basicGroupData:q,questionListGroupData:D,sceneData:C,answerGroupData:y,compareImagesGroupData:L,infoExchangeGroupData:G,conversationGroupData:g,isExample:w,suggestedAnswers:h}=A,k=o.answer,P=o.content,b={id:c,questionType:_||"",content:I,correctAnswer:T||{},points:d??E??1,explanation:A.explanation||f||k?.explanation||P?.explanation||"",questionNumber:n,partId:s,partNo:e,...null!=p?{sectionId:p}:{},questionSkillType:o.skill,examLevel:m,subjectId:u,addToQuestionBank:r??!1,questionBank:r&&a&&i?{code:a,title:i}:void 0,isExample:w||!1};h&&h.length>0&&(b.suggestedAnswers=h);const W=function(o){const{hintLetters:t,passageData:s,imageData:e,basicGroupData:n,sceneData:r,answerGroupData:a,questionListGroupData:i,compareImagesGroupData:p,infoExchangeGroupData:m,conversationGroupData:u}=o;if(t&&t.length>0)return{hintLetters:t};if(s)return s;if(e)return e;if(n&&(n.title||n.subtitle||n.content||n.imageUrl||n.articles))return n;return r||(a||(i||(p||(m||(u||void 0)))))}({hintLetters:R,passageData:l,imageData:O,basicGroupData:q,sceneData:C,answerGroupData:y,questionListGroupData:D,compareImagesGroupData:L,infoExchangeGroupData:G,conversationGroupData:g});return W&&(b.isGroup=!0,b.questionGroup={payload:W,groupNumber:S||1}),b}export function transformQuestionsToApiFormat(t){const s=[],e=[];return t.forEach((t,n)=>{const{question:r,partId:a,partNo:i,sectionId:p,addToQuestionBank:m,questionBankCode:u,questionBankTitle:c,examLevel:_,subjectId:E}=t,f=o(r);if(!f.isValid)return void e.push({index:n,errors:f.errors});const N=r.questionNumber??n+1;s.push(transformQuestionToApiFormat(r,{partId:a,partNo:i,questionNumber:N,addToQuestionBank:m,questionBankCode:u,questionBankTitle:c,sectionId:p,examLevel:_,subjectId:E}))}),{validQuestions:s,invalidQuestions:e}}
@@ -29,7 +29,7 @@ export declare enum StudentSelectionType {
29
29
  }
30
30
  export type ResultStatus = 'PENDING' | 'PARTIAL_GRADED' | 'GRADED';
31
31
  export type StudentStatus = 'NOT_STARTED' | 'IN_PROGRESS' | 'SUBMITTED';
32
- export type QuestionType = 'FILL_IN_BLANK' | 'TRUE_FALSE' | 'MATCHING' | 'ORDERING' | 'LISTENING' | 'COLORING' | 'ESSAY' | 'LISTEN_AND_FILL_IN_THE_BLANK_WITH_IMAGE' | 'LISTEN_AND_TICK_ANSWER' | 'LISTEN_AND_FILL_NAME_NUMBER' | 'LISTENING_FILL_BLANK' | 'LISTENING_COLOR' | 'TICK_TRUE_OR_FALSE' | 'TICK_YES_OR_NO' | 'READING_TICK_CROSS' | 'ARRANGE_LETTERS_INTO_WORDS' | 'READ_PASSAGE_AND_COMPLETE_STORY' | 'CLOZE_TEST_WITH_TICK_BOX' | 'READ_AND_CHOOSE_APPROPRIATE_WORD' | 'WRITE_SHORT_PARAGRAPH' | 'LABEL_THE_PICTURE' | 'READING_LETTER_ARRANGE' | 'READING_PASSAGE_FILL' | 'FILL_BLANK' | 'FILL_MISSING_WORDS_IN_GRID' | 'LOOK_PICTURE_CHOOSE_CORRECT_ANSWER' | 'LOOK_PICTURE_FILL_BLANK_CHOOSE_ANSWER' | 'LOOK_PICTURE_FILL_WORD_HINT' | 'LABEL_THE_PICTURE' | 'READ_AND_COLOR_OBJECTS' | 'IMAGE_OBJECT_MATCHING' | 'READ_PASSAGE_AND_ANSWER_QUESTIONS' | 'CHOOSE_THE_CORRECT_ANSWER' | 'WRITE_A_SHORT_LETTER' | 'WRITE_CORRECT_VERB_FORM' | 'CHOOSE_CORRECT_ADJECTIVE' | 'ANSWER_THE_QUESTION' | 'WORD_ORDERING' | 'WORD_FILL_PARAGRAPH' | 'MATCH_BY_WRITING_ANSWER' | 'WRITE_SENTENCES' | 'LISTEN_AND_CHOOSE_FROM_ANSWER_GROUP' | 'LISTEN_AND_CHOOSE_OBJECTS_IN_SCENE' | 'LISTEN_AND_DRAG_OBJECTS_INTO_SCENE' | 'LISTEN_AND_SPEAK_ANSWER' | 'LISTEN_AND_SPEAK_IMAGE_GROUP' | 'LISTEN_AND_SPEAK_QUESTION_LIST' | 'LISTEN_AND_SPEAK_COMPARE_IMAGES' | 'LISTEN_AND_SPEAK_WITH_STORY_IMAGES' | 'LISTEN_AND_SPEAK_ODD_ONE_OUT' | 'LISTEN_AND_SPEAK_INFO_EXCHANGE' | 'READ_DISPLAYED_CONTENT' | 'SPEAKING_DESCRIBE_IMAGE' | 'SPONTANEOUS_QA' | 'SPEAKING_CONVERSATION' | 'GN_SPEAKING_INTERVIEW' | 'SPEAKING_CUE_CARD' | 'WORD_FILL_STRUCTURED_FORM';
32
+ export type QuestionType = 'FILL_IN_BLANK' | 'TRUE_FALSE' | 'MATCHING' | 'ORDERING' | 'LISTENING' | 'COLORING' | 'ESSAY' | 'LISTEN_AND_FILL_IN_THE_BLANK_WITH_IMAGE' | 'LISTEN_AND_TICK_ANSWER' | 'LISTEN_AND_FILL_NAME_NUMBER' | 'LISTENING_FILL_BLANK' | 'LISTENING_COLOR' | 'TICK_TRUE_OR_FALSE' | 'TICK_YES_OR_NO' | 'READING_TICK_CROSS' | 'ARRANGE_LETTERS_INTO_WORDS' | 'READ_PASSAGE_AND_COMPLETE_STORY' | 'CLOZE_TEST_WITH_TICK_BOX' | 'READ_AND_CHOOSE_APPROPRIATE_WORD' | 'WRITE_SHORT_PARAGRAPH' | 'LABEL_THE_PICTURE' | 'READING_LETTER_ARRANGE' | 'READING_PASSAGE_FILL' | 'FILL_BLANK' | 'FILL_MISSING_WORDS_IN_GRID' | 'LOOK_PICTURE_CHOOSE_CORRECT_ANSWER' | 'LOOK_PICTURE_FILL_BLANK_CHOOSE_ANSWER' | 'LOOK_PICTURE_FILL_WORD_HINT' | 'LABEL_THE_PICTURE' | 'READ_AND_COLOR_OBJECTS' | 'IMAGE_OBJECT_MATCHING' | 'READ_PASSAGE_AND_ANSWER_QUESTIONS' | 'CHOOSE_THE_CORRECT_ANSWER' | 'CHOOSE_THE_CORRECT_ANSWER_GROUP' | 'TRUE_FALSE_GROUP' | 'CROSS_OUT_WORD_GROUP' | 'SPONTANEOUS_QA_GROUP' | 'WORD_ORDER_AND_MATCH_GROUP' | 'WRITE_A_SHORT_LETTER' | 'WRITE_CORRECT_VERB_FORM' | 'CHOOSE_CORRECT_ADJECTIVE' | 'ANSWER_THE_QUESTION' | 'WORD_ORDERING' | 'WORD_FILL_PARAGRAPH' | 'MATCH_BY_WRITING_ANSWER' | 'WRITE_SENTENCES' | 'LISTEN_AND_CHOOSE_FROM_ANSWER_GROUP' | 'LISTEN_AND_CHOOSE_OBJECTS_IN_SCENE' | 'LISTEN_AND_DRAG_OBJECTS_INTO_SCENE' | 'LISTEN_AND_SPEAK_ANSWER' | 'LISTEN_AND_SPEAK_IMAGE_GROUP' | 'LISTEN_AND_SPEAK_QUESTION_LIST' | 'LISTEN_AND_SPEAK_COMPARE_IMAGES' | 'LISTEN_AND_SPEAK_WITH_STORY_IMAGES' | 'LISTEN_AND_SPEAK_ODD_ONE_OUT' | 'LISTEN_AND_SPEAK_INFO_EXCHANGE' | 'READ_DISPLAYED_CONTENT' | 'SPEAKING_DESCRIBE_IMAGE' | 'SPONTANEOUS_QA' | 'SPEAKING_CONVERSATION' | 'GN_SPEAKING_INTERVIEW' | 'SPEAKING_CUE_CARD' | 'WORD_FILL_STRUCTURED_FORM';
33
33
  export type Level = 'Pre-A1' | 'A1' | 'A2' | 'B1' | 'B2' | 'C1' | 'C2';
34
34
  export type Difficulty = 'EASY' | 'MEDIUM' | 'HARD';
35
35
  export type Skill = 'LISTENING' | 'READING' | 'WRITING' | 'SPEAKING';
@@ -0,0 +1,41 @@
1
+ export interface ChooseTheCorrectAnswerGroupOption {
2
+ id: string;
3
+ text?: string;
4
+ imageUrl?: string;
5
+ }
6
+ export interface ChooseTheCorrectAnswerGroupItemContent {
7
+ question: string;
8
+ options: ChooseTheCorrectAnswerGroupOption[];
9
+ optionType?: 'text' | 'image';
10
+ }
11
+ export interface ChooseTheCorrectAnswerGroupItem {
12
+ questionType?: 'CHOOSE_THE_CORRECT_ANSWER';
13
+ isExample?: boolean;
14
+ content: ChooseTheCorrectAnswerGroupItemContent;
15
+ correctAnswer?: {
16
+ answer: string;
17
+ };
18
+ points?: number;
19
+ questionNumber?: number;
20
+ }
21
+ export interface ChooseTheCorrectAnswerGroupContent {
22
+ meta?: {
23
+ instruction?: string;
24
+ };
25
+ items: ChooseTheCorrectAnswerGroupItem[];
26
+ }
27
+ export interface ChooseTheCorrectAnswerGroupCorrectAnswer {
28
+ answer: string[];
29
+ }
30
+ export interface ChooseTheCorrectAnswerGroupAPIPayload {
31
+ id?: string;
32
+ questionType: 'CHOOSE_THE_CORRECT_ANSWER_GROUP';
33
+ content: ChooseTheCorrectAnswerGroupContent;
34
+ correctAnswer: ChooseTheCorrectAnswerGroupCorrectAnswer;
35
+ points: number;
36
+ explanation?: string;
37
+ questionNumber: number;
38
+ partId?: string;
39
+ partNo?: number;
40
+ }
41
+ export type ChooseTheCorrectAnswerGroupLocalStorage = ChooseTheCorrectAnswerGroupAPIPayload;
@@ -0,0 +1,41 @@
1
+ export type CrossOutWordItemMode = 'CROSS_OUT' | 'CROSS_OUT_AND_REPLACE';
2
+ export interface CrossOutWordGroupItemAnswer {
3
+ type: CrossOutWordItemMode;
4
+ crossOut: string;
5
+ replaceWith?: string;
6
+ }
7
+ export interface CrossOutWordGroupItemContent {
8
+ type: CrossOutWordItemMode;
9
+ question: string;
10
+ }
11
+ export interface CrossOutWordGroupItem {
12
+ questionType?: 'CROSS_OUT_WORD';
13
+ isExample?: boolean;
14
+ content: CrossOutWordGroupItemContent;
15
+ correctAnswer?: {
16
+ answer: CrossOutWordGroupItemAnswer;
17
+ };
18
+ points?: number;
19
+ questionNumber?: number;
20
+ }
21
+ export interface CrossOutWordGroupContent {
22
+ meta?: {
23
+ instruction?: string;
24
+ };
25
+ items: CrossOutWordGroupItem[];
26
+ }
27
+ export interface CrossOutWordGroupCorrectAnswer {
28
+ answer: CrossOutWordGroupItemAnswer[];
29
+ }
30
+ export interface CrossOutWordGroupAPIPayload {
31
+ id?: string;
32
+ questionType: 'CROSS_OUT_WORD_GROUP';
33
+ content: CrossOutWordGroupContent;
34
+ correctAnswer: CrossOutWordGroupCorrectAnswer;
35
+ points: number;
36
+ explanation?: string;
37
+ questionNumber: number;
38
+ partId?: string;
39
+ partNo?: number;
40
+ }
41
+ export type CrossOutWordGroupLocalStorage = CrossOutWordGroupAPIPayload;
@@ -16,6 +16,8 @@
16
16
  * - LocalStorage: Same format but WITHOUT addToQuestionBank and questionBank
17
17
  */
18
18
  export * from './choose-the-correct-answer';
19
+ export * from './choose-the-correct-answer-group';
20
+ export * from './cross-out-word-group';
19
21
  export * from './write-correct-verb-form';
20
22
  export * from './choose-correct-adjective';
21
23
  export * from './look-picture-fill-blank-choose-answer';
@@ -1 +1 @@
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
+ export*from"./choose-the-correct-answer";export*from"./choose-the-correct-answer-group";export*from"./cross-out-word-group";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";