@hed-hog/lms 0.0.361 → 0.0.364

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 (329) hide show
  1. package/dist/bitcode-wallet/bitcode-wallet.service.d.ts +65 -0
  2. package/dist/bitcode-wallet/bitcode-wallet.service.d.ts.map +1 -1
  3. package/dist/bitcode-wallet/bitcode-wallet.service.js +72 -0
  4. package/dist/bitcode-wallet/bitcode-wallet.service.js.map +1 -1
  5. package/dist/bitcode-wallet/dto/create-current-bitcode-wallet-transaction.dto.d.ts +8 -0
  6. package/dist/bitcode-wallet/dto/create-current-bitcode-wallet-transaction.dto.d.ts.map +1 -0
  7. package/dist/bitcode-wallet/dto/create-current-bitcode-wallet-transaction.dto.js +40 -0
  8. package/dist/bitcode-wallet/dto/create-current-bitcode-wallet-transaction.dto.js.map +1 -0
  9. package/dist/class-group/class-group.controller.d.ts +16 -16
  10. package/dist/class-group/class-group.service.d.ts +12 -12
  11. package/dist/course/course-audio-transcription.service.d.ts +3 -2
  12. package/dist/course/course-audio-transcription.service.d.ts.map +1 -1
  13. package/dist/course/course-audio-transcription.service.js +49 -8
  14. package/dist/course/course-audio-transcription.service.js.map +1 -1
  15. package/dist/course/course-lesson.controller.d.ts +4 -0
  16. package/dist/course/course-lesson.controller.d.ts.map +1 -1
  17. package/dist/course/course-lesson.controller.js +10 -0
  18. package/dist/course/course-lesson.controller.js.map +1 -1
  19. package/dist/course/course-structure.controller.d.ts +11 -4
  20. package/dist/course/course-structure.controller.d.ts.map +1 -1
  21. package/dist/course/course-structure.controller.js +14 -0
  22. package/dist/course/course-structure.controller.js.map +1 -1
  23. package/dist/course/course-structure.service.d.ts +15 -1
  24. package/dist/course/course-structure.service.d.ts.map +1 -1
  25. package/dist/course/course-structure.service.js +139 -4
  26. package/dist/course/course-structure.service.js.map +1 -1
  27. package/dist/course/course-video-conversion.service.d.ts +8 -0
  28. package/dist/course/course-video-conversion.service.d.ts.map +1 -1
  29. package/dist/course/course-video-conversion.service.js +87 -51
  30. package/dist/course/course-video-conversion.service.js.map +1 -1
  31. package/dist/course/course.controller.d.ts +73 -1
  32. package/dist/course/course.controller.d.ts.map +1 -1
  33. package/dist/course/course.controller.js +27 -3
  34. package/dist/course/course.controller.js.map +1 -1
  35. package/dist/course/course.module.d.ts.map +1 -1
  36. package/dist/course/course.module.js +2 -0
  37. package/dist/course/course.module.js.map +1 -1
  38. package/dist/course/course.service.d.ts +108 -4
  39. package/dist/course/course.service.d.ts.map +1 -1
  40. package/dist/course/course.service.js +631 -30
  41. package/dist/course/course.service.js.map +1 -1
  42. package/dist/course/dto/cleanup-course-storage.dto.d.ts +6 -0
  43. package/dist/course/dto/cleanup-course-storage.dto.d.ts.map +1 -0
  44. package/dist/course/dto/cleanup-course-storage.dto.js +33 -0
  45. package/dist/course/dto/cleanup-course-storage.dto.js.map +1 -0
  46. package/dist/course/dto/cleanup-upload-history.dto.d.ts +9 -0
  47. package/dist/course/dto/cleanup-upload-history.dto.d.ts.map +1 -0
  48. package/dist/course/dto/cleanup-upload-history.dto.js +36 -0
  49. package/dist/course/dto/cleanup-upload-history.dto.js.map +1 -0
  50. package/dist/course/dto/create-course-bulk-job.dto.d.ts +4 -0
  51. package/dist/course/dto/create-course-bulk-job.dto.d.ts.map +1 -0
  52. package/dist/course/dto/create-course-bulk-job.dto.js +21 -0
  53. package/dist/course/dto/create-course-bulk-job.dto.js.map +1 -0
  54. package/dist/course/lms-bulk-upload-automation.service.d.ts +39 -0
  55. package/dist/course/lms-bulk-upload-automation.service.d.ts.map +1 -0
  56. package/dist/course/lms-bulk-upload-automation.service.js +443 -0
  57. package/dist/course/lms-bulk-upload-automation.service.js.map +1 -0
  58. package/dist/course/lms-bulk-upload-infra.service.d.ts +31 -0
  59. package/dist/course/lms-bulk-upload-infra.service.d.ts.map +1 -0
  60. package/dist/course/lms-bulk-upload-infra.service.js +277 -0
  61. package/dist/course/lms-bulk-upload-infra.service.js.map +1 -0
  62. package/dist/course/lms-bulk-upload.constants.d.ts +4 -0
  63. package/dist/course/lms-bulk-upload.constants.d.ts.map +1 -0
  64. package/dist/course/lms-bulk-upload.constants.js +7 -0
  65. package/dist/course/lms-bulk-upload.constants.js.map +1 -0
  66. package/dist/course/lms-bulk-upload.controller.d.ts +116 -0
  67. package/dist/course/lms-bulk-upload.controller.d.ts.map +1 -1
  68. package/dist/course/lms-bulk-upload.controller.js +71 -2
  69. package/dist/course/lms-bulk-upload.controller.js.map +1 -1
  70. package/dist/course/lms-bulk-upload.service.d.ts +142 -3
  71. package/dist/course/lms-bulk-upload.service.d.ts.map +1 -1
  72. package/dist/course/lms-bulk-upload.service.js +606 -21
  73. package/dist/course/lms-bulk-upload.service.js.map +1 -1
  74. package/dist/course/lms-setting.controller.d.ts +4 -1
  75. package/dist/course/lms-setting.controller.d.ts.map +1 -1
  76. package/dist/course/lms-setting.controller.js +21 -6
  77. package/dist/course/lms-setting.controller.js.map +1 -1
  78. package/dist/enterprise/enterprise.controller.d.ts +20 -20
  79. package/dist/enterprise/enterprise.service.d.ts +20 -20
  80. package/dist/enterprise/training/training-admin.controller.d.ts +11 -11
  81. package/dist/enterprise/training/training-admin.service.d.ts +11 -11
  82. package/dist/enterprise/training/training-instructor.controller.d.ts +2 -2
  83. package/dist/enterprise/training/training-instructor.service.d.ts +2 -2
  84. package/dist/enterprise/training/training-student.controller.d.ts +1 -1
  85. package/dist/enterprise/training/training-student.service.d.ts +1 -1
  86. package/dist/enterprise/training/training-viewer.controller.d.ts +2 -2
  87. package/dist/evaluation/evaluation.controller.d.ts +8 -8
  88. package/dist/evaluation/evaluation.service.d.ts +8 -8
  89. package/dist/lesson-xp-map/dto/create-lesson-xp-map.dto.d.ts +6 -0
  90. package/dist/lesson-xp-map/dto/create-lesson-xp-map.dto.d.ts.map +1 -0
  91. package/dist/lesson-xp-map/dto/create-lesson-xp-map.dto.js +34 -0
  92. package/dist/lesson-xp-map/dto/create-lesson-xp-map.dto.js.map +1 -0
  93. package/dist/lesson-xp-map/dto/create-lesson-xp-segment.dto.d.ts +28 -0
  94. package/dist/lesson-xp-map/dto/create-lesson-xp-segment.dto.d.ts.map +1 -0
  95. package/dist/lesson-xp-map/dto/create-lesson-xp-segment.dto.js +123 -0
  96. package/dist/lesson-xp-map/dto/create-lesson-xp-segment.dto.js.map +1 -0
  97. package/dist/lesson-xp-map/dto/review-lesson-xp-map.dto.d.ts +4 -0
  98. package/dist/lesson-xp-map/dto/review-lesson-xp-map.dto.d.ts.map +1 -0
  99. package/dist/lesson-xp-map/dto/review-lesson-xp-map.dto.js +22 -0
  100. package/dist/lesson-xp-map/dto/review-lesson-xp-map.dto.js.map +1 -0
  101. package/dist/lesson-xp-map/dto/update-lesson-xp-map.dto.d.ts +10 -0
  102. package/dist/lesson-xp-map/dto/update-lesson-xp-map.dto.d.ts.map +1 -0
  103. package/dist/lesson-xp-map/dto/update-lesson-xp-map.dto.js +52 -0
  104. package/dist/lesson-xp-map/dto/update-lesson-xp-map.dto.js.map +1 -0
  105. package/dist/lesson-xp-map/dto/update-lesson-xp-segment.dto.d.ts +15 -0
  106. package/dist/lesson-xp-map/dto/update-lesson-xp-segment.dto.d.ts.map +1 -0
  107. package/dist/lesson-xp-map/dto/update-lesson-xp-segment.dto.js +86 -0
  108. package/dist/lesson-xp-map/dto/update-lesson-xp-segment.dto.js.map +1 -0
  109. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.d.ts +26 -0
  110. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.d.ts.map +1 -0
  111. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.js +304 -0
  112. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.js.map +1 -0
  113. package/dist/lesson-xp-map/lesson-xp-map.controller.d.ts +87 -0
  114. package/dist/lesson-xp-map/lesson-xp-map.controller.d.ts.map +1 -0
  115. package/dist/lesson-xp-map/lesson-xp-map.controller.js +185 -0
  116. package/dist/lesson-xp-map/lesson-xp-map.controller.js.map +1 -0
  117. package/dist/lesson-xp-map/lesson-xp-map.module.d.ts +3 -0
  118. package/dist/lesson-xp-map/lesson-xp-map.module.d.ts.map +1 -0
  119. package/dist/lesson-xp-map/lesson-xp-map.module.js +34 -0
  120. package/dist/lesson-xp-map/lesson-xp-map.module.js.map +1 -0
  121. package/dist/lesson-xp-map/lesson-xp-map.service.d.ts +84 -0
  122. package/dist/lesson-xp-map/lesson-xp-map.service.d.ts.map +1 -0
  123. package/dist/lesson-xp-map/lesson-xp-map.service.js +353 -0
  124. package/dist/lesson-xp-map/lesson-xp-map.service.js.map +1 -0
  125. package/dist/lesson-xp-map/lesson-xp-segment.controller.d.ts +10 -0
  126. package/dist/lesson-xp-map/lesson-xp-segment.controller.d.ts.map +1 -0
  127. package/dist/lesson-xp-map/lesson-xp-segment.controller.js +63 -0
  128. package/dist/lesson-xp-map/lesson-xp-segment.controller.js.map +1 -0
  129. package/dist/lesson-xp-map/lesson-xp-segment.service.d.ts +27 -0
  130. package/dist/lesson-xp-map/lesson-xp-segment.service.d.ts.map +1 -0
  131. package/dist/lesson-xp-map/lesson-xp-segment.service.js +194 -0
  132. package/dist/lesson-xp-map/lesson-xp-segment.service.js.map +1 -0
  133. package/dist/libraries/lms/tsconfig.tsbuildinfo +1 -0
  134. package/dist/lms.module.d.ts.map +1 -1
  135. package/dist/lms.module.js +17 -2
  136. package/dist/lms.module.js.map +1 -1
  137. package/dist/platforma/dto/update-profile.dto.d.ts +17 -0
  138. package/dist/platforma/dto/update-profile.dto.d.ts.map +1 -0
  139. package/dist/platforma/dto/update-profile.dto.js +87 -0
  140. package/dist/platforma/dto/update-profile.dto.js.map +1 -0
  141. package/dist/platforma/platforma.controller.d.ts +88 -1
  142. package/dist/platforma/platforma.controller.d.ts.map +1 -1
  143. package/dist/platforma/platforma.controller.js +85 -2
  144. package/dist/platforma/platforma.controller.js.map +1 -1
  145. package/dist/platforma/platforma.service.d.ts +27 -0
  146. package/dist/platforma/platforma.service.d.ts.map +1 -0
  147. package/dist/platforma/platforma.service.js +274 -0
  148. package/dist/platforma/platforma.service.js.map +1 -0
  149. package/dist/student-xp/student-xp.controller.d.ts +41 -0
  150. package/dist/student-xp/student-xp.controller.d.ts.map +1 -0
  151. package/dist/student-xp/student-xp.controller.js +114 -0
  152. package/dist/student-xp/student-xp.controller.js.map +1 -0
  153. package/dist/student-xp/student-xp.module.d.ts +3 -0
  154. package/dist/student-xp/student-xp.module.d.ts.map +1 -0
  155. package/dist/student-xp/student-xp.module.js +25 -0
  156. package/dist/student-xp/student-xp.module.js.map +1 -0
  157. package/dist/student-xp/student-xp.service.d.ts +65 -0
  158. package/dist/student-xp/student-xp.service.d.ts.map +1 -0
  159. package/dist/student-xp/student-xp.service.js +197 -0
  160. package/dist/student-xp/student-xp.service.js.map +1 -0
  161. package/dist/xp-catalog/dto/create-xp-area.dto.d.ts +12 -0
  162. package/dist/xp-catalog/dto/create-xp-area.dto.d.ts.map +1 -0
  163. package/dist/xp-catalog/dto/create-xp-area.dto.js +63 -0
  164. package/dist/xp-catalog/dto/create-xp-area.dto.js.map +1 -0
  165. package/dist/xp-catalog/dto/create-xp-learning-type.dto.d.ts +11 -0
  166. package/dist/xp-catalog/dto/create-xp-learning-type.dto.d.ts.map +1 -0
  167. package/dist/xp-catalog/dto/create-xp-learning-type.dto.js +57 -0
  168. package/dist/xp-catalog/dto/create-xp-learning-type.dto.js.map +1 -0
  169. package/dist/xp-catalog/dto/create-xp-skill.dto.d.ts +11 -0
  170. package/dist/xp-catalog/dto/create-xp-skill.dto.d.ts.map +1 -0
  171. package/dist/xp-catalog/dto/create-xp-skill.dto.js +57 -0
  172. package/dist/xp-catalog/dto/create-xp-skill.dto.js.map +1 -0
  173. package/dist/xp-catalog/dto/update-xp-area.dto.d.ts +12 -0
  174. package/dist/xp-catalog/dto/update-xp-area.dto.d.ts.map +1 -0
  175. package/dist/xp-catalog/dto/update-xp-area.dto.js +66 -0
  176. package/dist/xp-catalog/dto/update-xp-area.dto.js.map +1 -0
  177. package/dist/xp-catalog/dto/update-xp-learning-type.dto.d.ts +11 -0
  178. package/dist/xp-catalog/dto/update-xp-learning-type.dto.d.ts.map +1 -0
  179. package/dist/xp-catalog/dto/update-xp-learning-type.dto.js +60 -0
  180. package/dist/xp-catalog/dto/update-xp-learning-type.dto.js.map +1 -0
  181. package/dist/xp-catalog/dto/update-xp-skill.dto.d.ts +11 -0
  182. package/dist/xp-catalog/dto/update-xp-skill.dto.d.ts.map +1 -0
  183. package/dist/xp-catalog/dto/update-xp-skill.dto.js +60 -0
  184. package/dist/xp-catalog/dto/update-xp-skill.dto.js.map +1 -0
  185. package/dist/xp-catalog/xp-area.controller.d.ts +25 -0
  186. package/dist/xp-catalog/xp-area.controller.d.ts.map +1 -0
  187. package/dist/xp-catalog/xp-area.controller.js +105 -0
  188. package/dist/xp-catalog/xp-area.controller.js.map +1 -0
  189. package/dist/xp-catalog/xp-area.service.d.ts +35 -0
  190. package/dist/xp-catalog/xp-area.service.d.ts.map +1 -0
  191. package/dist/xp-catalog/xp-area.service.js +168 -0
  192. package/dist/xp-catalog/xp-area.service.js.map +1 -0
  193. package/dist/xp-catalog/xp-catalog.module.d.ts +3 -0
  194. package/dist/xp-catalog/xp-catalog.module.d.ts.map +1 -0
  195. package/dist/xp-catalog/xp-catalog.module.js +29 -0
  196. package/dist/xp-catalog/xp-catalog.module.js.map +1 -0
  197. package/dist/xp-catalog/xp-learning-type.controller.d.ts +20 -0
  198. package/dist/xp-catalog/xp-learning-type.controller.d.ts.map +1 -0
  199. package/dist/xp-catalog/xp-learning-type.controller.js +96 -0
  200. package/dist/xp-catalog/xp-learning-type.controller.js.map +1 -0
  201. package/dist/xp-catalog/xp-learning-type.service.d.ts +30 -0
  202. package/dist/xp-catalog/xp-learning-type.service.d.ts.map +1 -0
  203. package/dist/xp-catalog/xp-learning-type.service.js +146 -0
  204. package/dist/xp-catalog/xp-learning-type.service.js.map +1 -0
  205. package/dist/xp-catalog/xp-skill.controller.d.ts +26 -0
  206. package/dist/xp-catalog/xp-skill.controller.d.ts.map +1 -0
  207. package/dist/xp-catalog/xp-skill.controller.js +113 -0
  208. package/dist/xp-catalog/xp-skill.controller.js.map +1 -0
  209. package/dist/xp-catalog/xp-skill.service.d.ts +37 -0
  210. package/dist/xp-catalog/xp-skill.service.d.ts.map +1 -0
  211. package/dist/xp-catalog/xp-skill.service.js +174 -0
  212. package/dist/xp-catalog/xp-skill.service.js.map +1 -0
  213. package/hedhog/data/menu.yaml +101 -0
  214. package/hedhog/data/route.yaml +512 -0
  215. package/hedhog/data/setting_group.yaml +1 -1
  216. package/hedhog/data/xp_area.yaml +164 -0
  217. package/hedhog/data/xp_learning_type.yaml +131 -0
  218. package/hedhog/data/xp_skill.yaml +1834 -0
  219. package/hedhog/frontend/app/achievements/page.tsx.ejs +108 -118
  220. package/hedhog/frontend/app/bitcodes/page.tsx.ejs +22 -34
  221. package/hedhog/frontend/app/bulk-upload-sessions/page.tsx.ejs +1453 -0
  222. package/hedhog/frontend/app/certificates/models/page.tsx.ejs +21 -45
  223. package/hedhog/frontend/app/classes/[id]/page.tsx.ejs +40 -74
  224. package/hedhog/frontend/app/classes/page.tsx.ejs +56 -85
  225. package/hedhog/frontend/app/courses/[id]/_components/CourseDangerZoneCard.tsx.ejs +3 -2
  226. package/hedhog/frontend/app/courses/[id]/_components/CourseMediaCard.tsx.ejs +48 -5
  227. package/hedhog/frontend/app/courses/[id]/page.tsx.ejs +4 -4
  228. package/hedhog/frontend/app/courses/[id]/structure/_components/course-operations-tab.tsx.ejs +19 -2
  229. package/hedhog/frontend/app/courses/[id]/structure/_components/course-overview-tab.tsx.ejs +1170 -0
  230. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree-dnd.tsx.ejs +16 -0
  231. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree.tsx.ejs +2 -0
  232. package/hedhog/frontend/app/courses/[id]/structure/_components/course-xp-overview-tab.tsx.ejs +623 -0
  233. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson-xp-tab.tsx.ejs +1458 -0
  234. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson.tsx.ejs +55 -2
  235. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-course.tsx.ejs +442 -104
  236. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-lesson.tsx.ejs +296 -49
  237. package/hedhog/frontend/app/courses/[id]/structure/_components/sortable-tree-row.tsx.ejs +3 -0
  238. package/hedhog/frontend/app/courses/[id]/structure/_components/store.ts.ejs +1 -0
  239. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-display-settings-popover.tsx.ejs +101 -85
  240. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row-lesson.tsx.ejs +21 -1
  241. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row.tsx.ejs +3 -0
  242. package/hedhog/frontend/app/courses/[id]/structure/_components/use-tree-display-settings.ts.ejs +7 -1
  243. package/hedhog/frontend/app/courses/[id]/structure/_components/xp-premium-pills.tsx.ejs +44 -0
  244. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-content-overview.ts.ejs +54 -0
  245. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-structure-mutations.ts.ejs +52 -0
  246. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-xp-overview.ts.ejs +76 -0
  247. package/hedhog/frontend/app/courses/[id]/structure/_data/use-lesson-xp-map.ts.ejs +128 -0
  248. package/hedhog/frontend/app/courses/[id]/structure/_data/use-transcription-segments.ts.ejs +30 -0
  249. package/hedhog/frontend/app/courses/[id]/structure/_utils/xp-color-config.ts.ejs +115 -0
  250. package/hedhog/frontend/app/courses/_components/CourseDeleteDialog.tsx.ejs +223 -0
  251. package/hedhog/frontend/app/courses/_components/CourseRowActions.tsx.ejs +89 -0
  252. package/hedhog/frontend/app/courses/page.tsx.ejs +400 -230
  253. package/hedhog/frontend/app/enterprise/page.tsx.ejs +39 -63
  254. package/hedhog/frontend/app/exams/[id]/questions/page.tsx.ejs +53 -77
  255. package/hedhog/frontend/app/exams/page.tsx.ejs +54 -90
  256. package/hedhog/frontend/app/instructor-skills/page.tsx.ejs +23 -36
  257. package/hedhog/frontend/app/instructors/page.tsx.ejs +72 -81
  258. package/hedhog/frontend/app/paths/page.tsx.ejs +40 -68
  259. package/hedhog/frontend/app/training/page.tsx.ejs +40 -68
  260. package/hedhog/frontend/app/xp/areas/page.tsx.ejs +782 -0
  261. package/hedhog/frontend/app/xp/learning-types/page.tsx.ejs +690 -0
  262. package/hedhog/frontend/app/xp/skills/page.tsx.ejs +811 -0
  263. package/hedhog/frontend/messages/en.json +386 -3
  264. package/hedhog/frontend/messages/pt.json +386 -3
  265. package/hedhog/table/lesson_xp_map.yaml +50 -0
  266. package/hedhog/table/lesson_xp_segment.yaml +40 -0
  267. package/hedhog/table/lesson_xp_segment_area.yaml +24 -0
  268. package/hedhog/table/lesson_xp_segment_learning_type.yaml +24 -0
  269. package/hedhog/table/lesson_xp_segment_skill.yaml +24 -0
  270. package/hedhog/table/lms_bulk_upload_item.yaml +44 -0
  271. package/hedhog/table/lms_bulk_upload_session.yaml +42 -0
  272. package/hedhog/table/student_area_xp.yaml +30 -0
  273. package/hedhog/table/student_learning_type_xp.yaml +30 -0
  274. package/hedhog/table/student_skill_xp.yaml +30 -0
  275. package/hedhog/table/student_xp_event.yaml +34 -0
  276. package/hedhog/table/xp_area.yaml +39 -0
  277. package/hedhog/table/xp_learning_type.yaml +34 -0
  278. package/hedhog/table/xp_skill.yaml +39 -0
  279. package/package.json +8 -7
  280. package/src/bitcode-wallet/bitcode-wallet.service.ts +113 -0
  281. package/src/bitcode-wallet/dto/create-current-bitcode-wallet-transaction.dto.ts +32 -0
  282. package/src/course/course-audio-transcription.service.ts +58 -21
  283. package/src/course/course-lesson.controller.ts +6 -1
  284. package/src/course/course-structure.controller.ts +10 -0
  285. package/src/course/course-structure.service.ts +174 -1
  286. package/src/course/course-video-conversion.service.ts +113 -75
  287. package/src/course/course.controller.ts +22 -3
  288. package/src/course/course.module.ts +2 -0
  289. package/src/course/course.service.ts +847 -30
  290. package/src/course/dto/cleanup-course-storage.dto.ts +22 -0
  291. package/src/course/dto/cleanup-upload-history.dto.ts +26 -0
  292. package/src/course/dto/create-course-bulk-job.dto.ts +6 -0
  293. package/src/course/lms-bulk-upload-automation.service.ts +560 -0
  294. package/src/course/lms-bulk-upload-infra.service.ts +327 -0
  295. package/src/course/lms-bulk-upload.constants.ts +5 -0
  296. package/src/course/lms-bulk-upload.controller.ts +79 -3
  297. package/src/course/lms-bulk-upload.service.ts +1029 -204
  298. package/src/course/lms-setting.controller.ts +22 -6
  299. package/src/lesson-xp-map/dto/create-lesson-xp-map.dto.ts +17 -0
  300. package/src/lesson-xp-map/dto/create-lesson-xp-segment.dto.ts +102 -0
  301. package/src/lesson-xp-map/dto/review-lesson-xp-map.dto.ts +7 -0
  302. package/src/lesson-xp-map/dto/update-lesson-xp-map.dto.ts +36 -0
  303. package/src/lesson-xp-map/dto/update-lesson-xp-segment.dto.ts +78 -0
  304. package/src/lesson-xp-map/lesson-xp-ai-calculation.service.ts +396 -0
  305. package/src/lesson-xp-map/lesson-xp-map.controller.ts +116 -0
  306. package/src/lesson-xp-map/lesson-xp-map.module.ts +21 -0
  307. package/src/lesson-xp-map/lesson-xp-map.service.ts +442 -0
  308. package/src/lesson-xp-map/lesson-xp-segment.controller.ts +36 -0
  309. package/src/lesson-xp-map/lesson-xp-segment.service.ts +229 -0
  310. package/src/lms.module.ts +17 -2
  311. package/src/platforma/dto/update-profile.dto.ts +59 -0
  312. package/src/platforma/platforma.controller.ts +57 -2
  313. package/src/platforma/platforma.service.ts +268 -0
  314. package/src/student-xp/student-xp.controller.ts +76 -0
  315. package/src/student-xp/student-xp.module.ts +12 -0
  316. package/src/student-xp/student-xp.service.ts +236 -0
  317. package/src/xp-catalog/dto/create-xp-area.dto.ts +40 -0
  318. package/src/xp-catalog/dto/create-xp-learning-type.dto.ts +35 -0
  319. package/src/xp-catalog/dto/create-xp-skill.dto.ts +35 -0
  320. package/src/xp-catalog/dto/update-xp-area.dto.ts +43 -0
  321. package/src/xp-catalog/dto/update-xp-learning-type.dto.ts +38 -0
  322. package/src/xp-catalog/dto/update-xp-skill.dto.ts +38 -0
  323. package/src/xp-catalog/xp-area.controller.ts +64 -0
  324. package/src/xp-catalog/xp-area.service.ts +196 -0
  325. package/src/xp-catalog/xp-catalog.module.ts +16 -0
  326. package/src/xp-catalog/xp-learning-type.controller.ts +59 -0
  327. package/src/xp-catalog/xp-learning-type.service.ts +170 -0
  328. package/src/xp-catalog/xp-skill.controller.ts +71 -0
  329. package/src/xp-catalog/xp-skill.service.ts +205 -0
@@ -20,6 +20,7 @@ import {
20
20
  ListChecks,
21
21
  Loader2,
22
22
  Lock,
23
+ Mic,
23
24
  Pencil,
24
25
  Play,
25
26
  Plus,
@@ -64,6 +65,7 @@ import { Label } from '@/components/ui/label';
64
65
  import { Progress } from '@/components/ui/progress';
65
66
  import { ResizableSheetContent } from '@/components/ui/resizable-sheet-content';
66
67
  import { ScrollArea } from '@/components/ui/scroll-area';
68
+ import { Skeleton } from '@/components/ui/skeleton';
67
69
  import {
68
70
  Select,
69
71
  SelectContent,
@@ -119,6 +121,7 @@ import {
119
121
  import {
120
122
  useDeleteLessonMutation,
121
123
  useUpdateLessonMutation,
124
+ useUpdateResourceTypeMutation,
122
125
  } from '../_data/use-course-structure-mutations';
123
126
  import {
124
127
  courseStructureQueryKey,
@@ -126,9 +129,11 @@ import {
126
129
  } from '../_data/use-course-structure-query';
127
130
  import { useLmsSettingsQuery } from '../_data/use-lms-settings-query';
128
131
  import {
132
+ useStartTranscriptionMutation,
129
133
  useTranscriptionSegmentsQuery,
130
134
  useUpdateTranscriptionSegmentsMutation,
131
135
  } from '../_data/use-transcription-segments';
136
+ import { LessonXpTab } from './detail-lesson-xp-tab';
132
137
  import { IconActionTooltip } from './icon-action-tooltip';
133
138
  import { useStructureStore } from './store';
134
139
  import type {
@@ -219,6 +224,43 @@ type TranslateFn = (
219
224
  key: string,
220
225
  values?: Record<string, string | number>
221
226
  ) => string;
227
+ type GenericResourceType =
228
+ | 'supplementary_material'
229
+ | 'student_download'
230
+ | 'attachment'
231
+ | 'document'
232
+ | 'lesson_audio';
233
+
234
+ const GENERIC_RESOURCE_TYPES: GenericResourceType[] = [
235
+ 'supplementary_material',
236
+ 'student_download',
237
+ 'attachment',
238
+ 'document',
239
+ ];
240
+
241
+ const GENERIC_RESOURCE_TYPE_LABEL_KEYS: Record<GenericResourceType, string> = {
242
+ supplementary_material: 'lessonForm.resourceTypes.supplementary_material',
243
+ student_download: 'lessonForm.resourceTypes.student_download',
244
+ attachment: 'lessonForm.resourceTypes.attachment',
245
+ document: 'lessonForm.resourceTypes.document',
246
+ lesson_audio: 'lessonForm.resourceTypes.lesson_audio',
247
+ };
248
+
249
+ function humanizeResourceType(type: string): string {
250
+ return type
251
+ .split(/[_:./-]+/)
252
+ .filter(Boolean)
253
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
254
+ .join(' ');
255
+ }
256
+
257
+ function getResourceTypeLabel(t: TranslateFn, type: string): string {
258
+ if (type in GENERIC_RESOURCE_TYPE_LABEL_KEYS) {
259
+ return t(GENERIC_RESOURCE_TYPE_LABEL_KEYS[type as GenericResourceType]);
260
+ }
261
+
262
+ return humanizeResourceType(type);
263
+ }
222
264
 
223
265
  type LessonEditorTab =
224
266
  | 'dados'
@@ -227,7 +269,8 @@ type LessonEditorTab =
227
269
  | 'imagens'
228
270
  | 'transcricao'
229
271
  | 'audios'
230
- | 'recursos';
272
+ | 'recursos'
273
+ | 'xp';
231
274
 
232
275
  const ACTIVE_VIDEO_JOB_STATUSES: QueueJobStatus[] = [
233
276
  'pending',
@@ -788,6 +831,7 @@ export function EditorLesson({ lessonId }: EditorLessonProps) {
788
831
  const lesson = useStructureStore((s) =>
789
832
  s.lessons.find((l) => l.id === lessonId)
790
833
  );
834
+ const updateLessonInStore = useStructureStore((s) => s.updateLesson);
791
835
  const sessions = useStructureStore((s) => s.sessions);
792
836
  const persistedVideoProvider: VideoProvider | undefined =
793
837
  lesson?.videoProvider === 'youtube' || lesson?.videoProvider === 'vimeo'
@@ -800,6 +844,9 @@ export function EditorLesson({ lessonId }: EditorLessonProps) {
800
844
  const updateTranscriptionSegments = useUpdateTranscriptionSegmentsMutation(
801
845
  lesson?.id ?? null
802
846
  );
847
+ const { mutate: startTranscription, isPending: isStartingTranscription } =
848
+ useStartTranscriptionMutation(lesson?.id ?? null);
849
+ const updateResourceTypeMutation = useUpdateResourceTypeMutation();
803
850
  const deleteLesson = useDeleteLessonMutation();
804
851
  const showConfirm = useStructureStore((s) => s.showConfirm);
805
852
  const courseId = useStructureStore((s) => s.courseId);
@@ -912,6 +959,11 @@ export function EditorLesson({ lessonId }: EditorLessonProps) {
912
959
  );
913
960
  const [jobDetailOpen, setJobDetailOpen] = useState(false);
914
961
  const [resourcesDirty, setResourcesDirty] = useState(false);
962
+ // 🆕 Filtro de tipo de recurso (estado de sessão)
963
+ const [resourceTypeFilter, setResourceTypeFilter] = useState<string>('all');
964
+ const [isUpdatingResourceType, setIsUpdatingResourceType] = useState<
965
+ string | null
966
+ >(null);
915
967
  const [conversionJobId, setConversionJobId] = useState<number | null>(null);
916
968
  const [videoUploadError, setVideoUploadError] = useState<string | null>(null);
917
969
  const [dragOver, setDragOver] = useState(false);
@@ -1056,8 +1108,10 @@ export function EditorLesson({ lessonId }: EditorLessonProps) {
1056
1108
  >(() => toEditableTranscriptionSegments());
1057
1109
  const [transcriptionDirty, setTranscriptionDirty] = useState(false);
1058
1110
 
1059
- const { data: fetchedTranscriptionSegments = [] } =
1060
- useTranscriptionSegmentsQuery(lesson?.id ?? null);
1111
+ const {
1112
+ data: fetchedTranscriptionSegments = [],
1113
+ isLoading: isLoadingTranscription,
1114
+ } = useTranscriptionSegmentsQuery(lesson?.id ?? null);
1061
1115
 
1062
1116
  const {
1063
1117
  data: courseVideoProfiles = [],
@@ -1164,7 +1218,12 @@ export function EditorLesson({ lessonId }: EditorLessonProps) {
1164
1218
  toEditableTranscriptionSegments(fetchedTranscriptionSegments)
1165
1219
  );
1166
1220
  setTranscriptionDirty(false);
1167
- }, [lesson?.id, fetchedTranscriptionSegments]);
1221
+ if (lesson?.id) {
1222
+ updateLessonInStore(lesson.id, {
1223
+ transcriptionSegments: fetchedTranscriptionSegments,
1224
+ });
1225
+ }
1226
+ }, [lesson?.id, fetchedTranscriptionSegments, updateLessonInStore]);
1168
1227
 
1169
1228
  useEffect(() => {
1170
1229
  const frameIds = new Set(videoFrames.map((frame) => frame.id));
@@ -1432,9 +1491,26 @@ export function EditorLesson({ lessonId }: EditorLessonProps) {
1432
1491
  (res) =>
1433
1492
  res.type !== 'video_original' && !res.type.startsWith('video_profile:')
1434
1493
  );
1435
- const supplementaryResources = genericResources.filter(
1436
- (res) => res.type === 'supplementary_material'
1437
- );
1494
+ // Todos os recursos genéricos aparecem na aba Recursos
1495
+ const supplementaryResources = genericResources;
1496
+
1497
+ // 🆕 Recursos filtrados baseado no tipo selecionado
1498
+ const filteredSupplementaryResources =
1499
+ resourceTypeFilter === 'all'
1500
+ ? supplementaryResources
1501
+ : supplementaryResources.filter((res) => res.type === resourceTypeFilter);
1502
+
1503
+ // 🆕 Tipos únicos presentes nos recursos atuais
1504
+ const availableResourceTypes = Array.from(
1505
+ new Set(supplementaryResources.map((res) => res.type).filter(Boolean))
1506
+ ).sort();
1507
+
1508
+ const resourceTypeFilterOptions = availableResourceTypes.map((type) => ({
1509
+ type,
1510
+ count: supplementaryResources.filter((res) => res.type === type).length,
1511
+ label: getResourceTypeLabel(t, type),
1512
+ }));
1513
+
1438
1514
  const isConversionJobActive = conversionJob
1439
1515
  ? ACTIVE_VIDEO_JOB_STATUSES.includes(conversionJob.status)
1440
1516
  : false;
@@ -1785,6 +1861,24 @@ export function EditorLesson({ lessonId }: EditorLessonProps) {
1785
1861
  }
1786
1862
  }
1787
1863
 
1864
+ // 🆕 Handler para atualizar tipo de recurso
1865
+ function handleUpdateResourceType(resourceId: string, newType: string) {
1866
+ if (!lesson?.id) return;
1867
+
1868
+ setIsUpdatingResourceType(resourceId);
1869
+ updateResourceTypeMutation.mutate(
1870
+ {
1871
+ lessonId: lesson.id,
1872
+ resourceId,
1873
+ newType,
1874
+ newTypeLabel: getResourceTypeLabel(t, newType),
1875
+ },
1876
+ {
1877
+ onSettled: () => setIsUpdatingResourceType(null),
1878
+ }
1879
+ );
1880
+ }
1881
+
1788
1882
  async function openVideoPreview(res: Resource) {
1789
1883
  const requestId = ++videoPreviewRequestIdRef.current;
1790
1884
  setVideoPreviewResource(res);
@@ -2767,6 +2861,12 @@ export function EditorLesson({ lessonId }: EditorLessonProps) {
2767
2861
  >
2768
2862
  {t('lessonForm.tabResources')}
2769
2863
  </TabsTrigger>
2864
+ <TabsTrigger
2865
+ value="xp"
2866
+ className="h-6 px-2 text-[11px] shrink-0 sm:h-7 sm:px-2.5 sm:text-xs"
2867
+ >
2868
+ XP
2869
+ </TabsTrigger>
2770
2870
  </TabsList>
2771
2871
 
2772
2872
  {/* ── Tab Dados ────────────────────────────────────────────────── */}
@@ -4474,29 +4574,79 @@ export function EditorLesson({ lessonId }: EditorLessonProps) {
4474
4574
  <CardHeader className="px-3 pt-2 pb-1">
4475
4575
  <CardTitle className="text-xs font-medium text-muted-foreground uppercase tracking-wider flex items-center justify-between gap-2">
4476
4576
  <span>{t('lessonForm.transcriptionSegments')}</span>
4477
- <Button
4478
- type="button"
4479
- variant="outline"
4480
- size="sm"
4481
- className="h-6 text-xs px-2"
4482
- onClick={() =>
4483
- updateTranscriptionSegmentsState((prev) => [
4484
- ...prev,
4485
- {
4486
- id: segmentId(),
4487
- start: '00:00',
4488
- end: '00:15',
4489
- text: '',
4490
- },
4491
- ])
4492
- }
4493
- >
4494
- <Plus className="size-3 mr-1" />
4495
- {t('lessonForm.newTranscriptionSegment')}
4496
- </Button>
4577
+ <div className="flex items-center gap-1.5">
4578
+ <Button
4579
+ type="button"
4580
+ variant="outline"
4581
+ size="sm"
4582
+ className="h-6 text-xs px-2"
4583
+ disabled={isStartingTranscription}
4584
+ onClick={() =>
4585
+ startTranscription({
4586
+ onSuccess: () => {
4587
+ toast.success('Transcrição iniciada!');
4588
+ queryClient.invalidateQueries({
4589
+ queryKey: [
4590
+ 'lesson-transcription-segments',
4591
+ lesson?.id,
4592
+ ],
4593
+ });
4594
+ },
4595
+ onError: (err) => {
4596
+ toast.error(
4597
+ err.message ||
4598
+ 'Erro ao iniciar a transcrição.'
4599
+ );
4600
+ },
4601
+ })
4602
+ }
4603
+ >
4604
+ {isStartingTranscription ? (
4605
+ <Loader2 className="size-3 mr-1 animate-spin" />
4606
+ ) : (
4607
+ <Mic className="size-3 mr-1" />
4608
+ )}
4609
+ Iniciar transcrição
4610
+ </Button>
4611
+ <Button
4612
+ type="button"
4613
+ variant="outline"
4614
+ size="sm"
4615
+ className="h-6 text-xs px-2"
4616
+ onClick={() =>
4617
+ updateTranscriptionSegmentsState((prev) => [
4618
+ ...prev,
4619
+ {
4620
+ id: segmentId(),
4621
+ start: '00:00',
4622
+ end: '00:15',
4623
+ text: '',
4624
+ },
4625
+ ])
4626
+ }
4627
+ >
4628
+ <Plus className="size-3 mr-1" />
4629
+ {t('lessonForm.newTranscriptionSegment')}
4630
+ </Button>
4631
+ </div>
4497
4632
  </CardTitle>
4498
4633
  </CardHeader>
4499
4634
  <CardContent className="px-3 pb-2 flex flex-col gap-2">
4635
+ {isLoadingTranscription
4636
+ ? Array.from({ length: 3 }).map((_, i) => (
4637
+ <div
4638
+ key={i}
4639
+ className="rounded-md border bg-background/80 p-2"
4640
+ >
4641
+ <div className="grid grid-cols-1 md:grid-cols-[92px_92px_1fr_auto] gap-2 items-start">
4642
+ <Skeleton className="h-8 w-full" />
4643
+ <Skeleton className="h-8 w-full" />
4644
+ <Skeleton className="h-8 w-full" />
4645
+ <Skeleton className="h-8 w-8 rounded-md" />
4646
+ </div>
4647
+ </div>
4648
+ ))
4649
+ : null}
4500
4650
  {transcriptionSegments.map((segment, index) => (
4501
4651
  <div
4502
4652
  key={segment.id}
@@ -4733,18 +4883,60 @@ export function EditorLesson({ lessonId }: EditorLessonProps) {
4733
4883
  </p>
4734
4884
  )}
4735
4885
 
4886
+ {/* 🆕 Filtro de tipo de recurso */}
4887
+ {supplementaryResources.length > 0 && (
4888
+ <div className="flex items-center gap-2 px-1">
4889
+ <label
4890
+ htmlFor="resource-type-filter"
4891
+ className="text-xs font-medium"
4892
+ >
4893
+ {t('lessonForm.filterBy')}:
4894
+ </label>
4895
+ <Select
4896
+ value={resourceTypeFilter}
4897
+ onValueChange={setResourceTypeFilter}
4898
+ >
4899
+ <SelectTrigger
4900
+ id="resource-type-filter"
4901
+ className="h-8 w-56 text-xs"
4902
+ >
4903
+ <SelectValue />
4904
+ </SelectTrigger>
4905
+ <SelectContent>
4906
+ <SelectItem value="all">
4907
+ {t('common.all')} ({supplementaryResources.length})
4908
+ </SelectItem>
4909
+ {resourceTypeFilterOptions.map(
4910
+ ({ type, count, label }) => (
4911
+ <SelectItem key={type} value={type}>
4912
+ {label} ({count})
4913
+ </SelectItem>
4914
+ )
4915
+ )}
4916
+ </SelectContent>
4917
+ </Select>
4918
+ </div>
4919
+ )}
4920
+
4736
4921
  {/* Resource list */}
4737
- {supplementaryResources.length === 0 ? (
4922
+ {filteredSupplementaryResources.length === 0 ? (
4738
4923
  <p className="text-center text-xs text-muted-foreground py-1">
4739
4924
  {t('questionEditor.noLinkedResources')}
4740
4925
  </p>
4741
4926
  ) : (
4742
4927
  <div className="flex flex-col gap-1">
4743
- {supplementaryResources.map((res) => {
4928
+ {filteredSupplementaryResources.map((res) => {
4744
4929
  const metadata = resolveResourceMetadata(res);
4745
4930
  const isDownloadingResource = downloadingResourceKeys.has(
4746
4931
  String(res.fileId ?? res.id)
4747
4932
  );
4933
+ const resourceTypeOptions =
4934
+ !res.type ||
4935
+ GENERIC_RESOURCE_TYPES.includes(
4936
+ res.type as GenericResourceType
4937
+ )
4938
+ ? GENERIC_RESOURCE_TYPES
4939
+ : [...GENERIC_RESOURCE_TYPES, res.type];
4748
4940
 
4749
4941
  return (
4750
4942
  <div
@@ -4767,26 +4959,69 @@ export function EditorLesson({ lessonId }: EditorLessonProps) {
4767
4959
  </div>
4768
4960
  </div>
4769
4961
 
4770
- <div className="flex items-center gap-1.5 pr-1">
4771
- <Switch
4772
- checked={Boolean(res.public)}
4773
- onCheckedChange={(checked) => {
4774
- setLocalResources((prev) =>
4775
- prev.map((item) =>
4776
- item.id === res.id
4777
- ? { ...item, public: checked }
4778
- : item
4779
- )
4780
- );
4781
- setResourcesDirty(true);
4782
- }}
4783
- aria-label={t('lessonForm.public')}
4784
- />
4785
- <span className="text-[0.65rem] text-muted-foreground whitespace-nowrap">
4786
- {res.public
4787
- ? t('lessonForm.public')
4788
- : t('lessonForm.private')}
4789
- </span>
4962
+ <div className="flex shrink-0 items-center gap-1.5 pr-1">
4963
+ <div className="flex items-center gap-1">
4964
+ <label
4965
+ htmlFor={`type-${res.id}`}
4966
+ className="sr-only"
4967
+ >
4968
+ {t('lessonForm.resourceType')}
4969
+ </label>
4970
+ <Select
4971
+ value={res.type || undefined}
4972
+ disabled={isUpdatingResourceType === res.id}
4973
+ onValueChange={(value) =>
4974
+ handleUpdateResourceType(res.id, value)
4975
+ }
4976
+ >
4977
+ <SelectTrigger
4978
+ id={`type-${res.id}`}
4979
+ className="h-4 w-32 px-1.5 py-0 text-[0.56rem] leading-none [&>svg]:size-2.5"
4980
+ >
4981
+ <SelectValue
4982
+ placeholder={t(
4983
+ 'lessonForm.typePlaceholder'
4984
+ )}
4985
+ />
4986
+ </SelectTrigger>
4987
+ <SelectContent>
4988
+ {resourceTypeOptions.map((type) => (
4989
+ <SelectItem
4990
+ key={type}
4991
+ value={type}
4992
+ className="text-xs"
4993
+ >
4994
+ {getResourceTypeLabel(t, type)}
4995
+ </SelectItem>
4996
+ ))}
4997
+ </SelectContent>
4998
+ </Select>
4999
+ {isUpdatingResourceType === res.id && (
5000
+ <Loader2 className="size-2.5 animate-spin text-muted-foreground" />
5001
+ )}
5002
+ </div>
5003
+
5004
+ <div className="flex items-center gap-1">
5005
+ <Switch
5006
+ checked={Boolean(res.public)}
5007
+ onCheckedChange={(checked) => {
5008
+ setLocalResources((prev) =>
5009
+ prev.map((item) =>
5010
+ item.id === res.id
5011
+ ? { ...item, public: checked }
5012
+ : item
5013
+ )
5014
+ );
5015
+ setResourcesDirty(true);
5016
+ }}
5017
+ aria-label={t('lessonForm.public')}
5018
+ />
5019
+ <span className="text-[0.65rem] text-muted-foreground whitespace-nowrap">
5020
+ {res.public
5021
+ ? t('lessonForm.public')
5022
+ : t('lessonForm.private')}
5023
+ </span>
5024
+ </div>
4790
5025
  </div>
4791
5026
 
4792
5027
  <IconActionTooltip
@@ -4857,6 +5092,18 @@ export function EditorLesson({ lessonId }: EditorLessonProps) {
4857
5092
  </div>
4858
5093
  </ScrollArea>
4859
5094
  </TabsContent>
5095
+
5096
+ {/* ── Tab XP ───────────────────────────────────────────────────── */}
5097
+ <TabsContent
5098
+ value="xp"
5099
+ className="flex-1 min-h-0 mt-0 overflow-y-auto p-2 sm:p-3"
5100
+ >
5101
+ <LessonXpTab
5102
+ lessonId={lessonId}
5103
+ activeTab={activeTab}
5104
+ hasTranscription={transcriptionSegments.length > 0}
5105
+ />
5106
+ </TabsContent>
4860
5107
  </Tabs>
4861
5108
 
4862
5109
  <Dialog
@@ -22,6 +22,7 @@ interface SortableTreeRowProps {
22
22
  visibleItems: FlatItem[];
23
23
  /** When true (filter active) drag is disabled. */
24
24
  dragDisabled: boolean;
25
+ lessonsWithXpMap: Set<string>;
25
26
  }
26
27
 
27
28
  export function SortableTreeRow({
@@ -35,6 +36,7 @@ export function SortableTreeRow({
35
36
  sessionIndicatorMap,
36
37
  visibleItems,
37
38
  dragDisabled,
39
+ lessonsWithXpMap,
38
40
  }: SortableTreeRowProps) {
39
41
  const {
40
42
  attributes,
@@ -79,6 +81,7 @@ export function SortableTreeRow({
79
81
  lessonCountMap={lessonCountMap}
80
82
  sessionIndicatorMap={sessionIndicatorMap}
81
83
  visibleItems={visibleItems}
84
+ lessonsWithXpMap={lessonsWithXpMap}
82
85
  />
83
86
  </div>
84
87
  </div>
@@ -124,6 +124,7 @@ interface StructureState {
124
124
  data: Partial<
125
125
  LessonFormValues & {
126
126
  transcription?: string;
127
+ transcriptionSegments?: Lesson['transcriptionSegments'];
127
128
  videoConversionJobId?: number;
128
129
  resources?: Lesson['resources'];
129
130
  }