@hed-hog/lms 0.0.361 → 0.0.365

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 (434) hide show
  1. package/dist/bitcode-wallet/bitcode-wallet.service.d.ts +66 -0
  2. package/dist/bitcode-wallet/bitcode-wallet.service.d.ts.map +1 -1
  3. package/dist/bitcode-wallet/bitcode-wallet.service.js +91 -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-export-scorm12-worker.service.d.ts +21 -0
  16. package/dist/course/course-export-scorm12-worker.service.d.ts.map +1 -0
  17. package/dist/course/course-export-scorm12-worker.service.js +109 -0
  18. package/dist/course/course-export-scorm12-worker.service.js.map +1 -0
  19. package/dist/course/course-export-scorm12.service.d.ts +42 -0
  20. package/dist/course/course-export-scorm12.service.d.ts.map +1 -0
  21. package/dist/course/course-export-scorm12.service.js +628 -0
  22. package/dist/course/course-export-scorm12.service.js.map +1 -0
  23. package/dist/course/course-export.service.d.ts +84 -0
  24. package/dist/course/course-export.service.d.ts.map +1 -0
  25. package/dist/course/course-export.service.js +237 -0
  26. package/dist/course/course-export.service.js.map +1 -0
  27. package/dist/course/course-lesson.controller.d.ts +4 -0
  28. package/dist/course/course-lesson.controller.d.ts.map +1 -1
  29. package/dist/course/course-lesson.controller.js +10 -0
  30. package/dist/course/course-lesson.controller.js.map +1 -1
  31. package/dist/course/course-structure.controller.d.ts +24 -9
  32. package/dist/course/course-structure.controller.d.ts.map +1 -1
  33. package/dist/course/course-structure.controller.js +30 -3
  34. package/dist/course/course-structure.controller.js.map +1 -1
  35. package/dist/course/course-structure.service.d.ts +25 -3
  36. package/dist/course/course-structure.service.d.ts.map +1 -1
  37. package/dist/course/course-structure.service.js +234 -24
  38. package/dist/course/course-structure.service.js.map +1 -1
  39. package/dist/course/course-video-conversion.service.d.ts +8 -0
  40. package/dist/course/course-video-conversion.service.d.ts.map +1 -1
  41. package/dist/course/course-video-conversion.service.js +87 -51
  42. package/dist/course/course-video-conversion.service.js.map +1 -1
  43. package/dist/course/course-video-hls.service.d.ts +57 -0
  44. package/dist/course/course-video-hls.service.d.ts.map +1 -0
  45. package/dist/course/course-video-hls.service.js +767 -0
  46. package/dist/course/course-video-hls.service.js.map +1 -0
  47. package/dist/course/course.controller.d.ts +115 -11
  48. package/dist/course/course.controller.d.ts.map +1 -1
  49. package/dist/course/course.controller.js +66 -28
  50. package/dist/course/course.controller.js.map +1 -1
  51. package/dist/course/course.mcp-tools.js +1 -1
  52. package/dist/course/course.mcp-tools.js.map +1 -1
  53. package/dist/course/course.module.d.ts.map +1 -1
  54. package/dist/course/course.module.js +13 -0
  55. package/dist/course/course.module.js.map +1 -1
  56. package/dist/course/course.service.d.ts +112 -11
  57. package/dist/course/course.service.d.ts.map +1 -1
  58. package/dist/course/course.service.js +682 -72
  59. package/dist/course/course.service.js.map +1 -1
  60. package/dist/course/dto/cleanup-course-storage.dto.d.ts +6 -0
  61. package/dist/course/dto/cleanup-course-storage.dto.d.ts.map +1 -0
  62. package/dist/course/dto/cleanup-course-storage.dto.js +34 -0
  63. package/dist/course/dto/cleanup-course-storage.dto.js.map +1 -0
  64. package/dist/course/dto/cleanup-upload-history.dto.d.ts +9 -0
  65. package/dist/course/dto/cleanup-upload-history.dto.d.ts.map +1 -0
  66. package/dist/course/dto/cleanup-upload-history.dto.js +36 -0
  67. package/dist/course/dto/cleanup-upload-history.dto.js.map +1 -0
  68. package/dist/course/dto/create-course-bulk-job.dto.d.ts +5 -0
  69. package/dist/course/dto/create-course-bulk-job.dto.d.ts.map +1 -0
  70. package/dist/course/dto/create-course-bulk-job.dto.js +26 -0
  71. package/dist/course/dto/create-course-bulk-job.dto.js.map +1 -0
  72. package/dist/course/dto/create-course-export.dto.d.ts +14 -0
  73. package/dist/course/dto/create-course-export.dto.d.ts.map +1 -0
  74. package/dist/course/dto/create-course-export.dto.js +71 -0
  75. package/dist/course/dto/create-course-export.dto.js.map +1 -0
  76. package/dist/course/dto/create-course-structure-lesson.dto.d.ts +2 -2
  77. package/dist/course/dto/create-course-structure-lesson.dto.d.ts.map +1 -1
  78. package/dist/course/dto/create-course-structure-lesson.dto.js +3 -2
  79. package/dist/course/dto/create-course-structure-lesson.dto.js.map +1 -1
  80. package/dist/course/lms-bulk-upload-automation.service.d.ts +54 -0
  81. package/dist/course/lms-bulk-upload-automation.service.d.ts.map +1 -0
  82. package/dist/course/lms-bulk-upload-automation.service.js +537 -0
  83. package/dist/course/lms-bulk-upload-automation.service.js.map +1 -0
  84. package/dist/course/lms-bulk-upload-infra.service.d.ts +32 -0
  85. package/dist/course/lms-bulk-upload-infra.service.d.ts.map +1 -0
  86. package/dist/course/lms-bulk-upload-infra.service.js +301 -0
  87. package/dist/course/lms-bulk-upload-infra.service.js.map +1 -0
  88. package/dist/course/lms-bulk-upload.constants.d.ts +4 -0
  89. package/dist/course/lms-bulk-upload.constants.d.ts.map +1 -0
  90. package/dist/course/lms-bulk-upload.constants.js +7 -0
  91. package/dist/course/lms-bulk-upload.constants.js.map +1 -0
  92. package/dist/course/lms-bulk-upload.controller.d.ts +144 -1
  93. package/dist/course/lms-bulk-upload.controller.d.ts.map +1 -1
  94. package/dist/course/lms-bulk-upload.controller.js +114 -4
  95. package/dist/course/lms-bulk-upload.controller.js.map +1 -1
  96. package/dist/course/lms-bulk-upload.service.d.ts +153 -3
  97. package/dist/course/lms-bulk-upload.service.d.ts.map +1 -1
  98. package/dist/course/lms-bulk-upload.service.js +659 -21
  99. package/dist/course/lms-bulk-upload.service.js.map +1 -1
  100. package/dist/course/lms-setting.controller.d.ts +6 -2
  101. package/dist/course/lms-setting.controller.d.ts.map +1 -1
  102. package/dist/course/lms-setting.controller.js +25 -8
  103. package/dist/course/lms-setting.controller.js.map +1 -1
  104. package/dist/course/scorm12-schemas.d.ts +4 -0
  105. package/dist/course/scorm12-schemas.d.ts.map +1 -0
  106. package/dist/course/scorm12-schemas.js +9 -0
  107. package/dist/course/scorm12-schemas.js.map +1 -0
  108. package/dist/enterprise/enterprise.controller.d.ts +20 -20
  109. package/dist/enterprise/enterprise.service.d.ts +20 -20
  110. package/dist/enterprise/training/training-admin.controller.d.ts +11 -11
  111. package/dist/enterprise/training/training-admin.service.d.ts +11 -11
  112. package/dist/enterprise/training/training-instructor.controller.d.ts +2 -2
  113. package/dist/enterprise/training/training-instructor.service.d.ts +2 -2
  114. package/dist/enterprise/training/training-student.controller.d.ts +1 -1
  115. package/dist/enterprise/training/training-student.service.d.ts +52 -1
  116. package/dist/enterprise/training/training-student.service.d.ts.map +1 -1
  117. package/dist/enterprise/training/training-student.service.js +217 -4
  118. package/dist/enterprise/training/training-student.service.js.map +1 -1
  119. package/dist/enterprise/training/training-viewer.controller.d.ts +2 -2
  120. package/dist/evaluation/evaluation.controller.d.ts +8 -8
  121. package/dist/evaluation/evaluation.service.d.ts +26 -8
  122. package/dist/evaluation/evaluation.service.d.ts.map +1 -1
  123. package/dist/evaluation/evaluation.service.js +125 -0
  124. package/dist/evaluation/evaluation.service.js.map +1 -1
  125. package/dist/exam/dto/create-standalone-question.dto.d.ts +12 -0
  126. package/dist/exam/dto/create-standalone-question.dto.d.ts.map +1 -0
  127. package/dist/exam/dto/create-standalone-question.dto.js +70 -0
  128. package/dist/exam/dto/create-standalone-question.dto.js.map +1 -0
  129. package/dist/exam/exam.module.d.ts.map +1 -1
  130. package/dist/exam/exam.module.js +2 -1
  131. package/dist/exam/exam.module.js.map +1 -1
  132. package/dist/exam/exam.service.d.ts +21 -0
  133. package/dist/exam/exam.service.d.ts.map +1 -1
  134. package/dist/exam/exam.service.js +80 -0
  135. package/dist/exam/exam.service.js.map +1 -1
  136. package/dist/exam/question.controller.d.ts +27 -0
  137. package/dist/exam/question.controller.d.ts.map +1 -0
  138. package/dist/exam/question.controller.js +53 -0
  139. package/dist/exam/question.controller.js.map +1 -0
  140. package/dist/lesson-xp-map/dto/create-lesson-xp-map.dto.d.ts +6 -0
  141. package/dist/lesson-xp-map/dto/create-lesson-xp-map.dto.d.ts.map +1 -0
  142. package/dist/lesson-xp-map/dto/create-lesson-xp-map.dto.js +34 -0
  143. package/dist/lesson-xp-map/dto/create-lesson-xp-map.dto.js.map +1 -0
  144. package/dist/lesson-xp-map/dto/create-lesson-xp-segment.dto.d.ts +28 -0
  145. package/dist/lesson-xp-map/dto/create-lesson-xp-segment.dto.d.ts.map +1 -0
  146. package/dist/lesson-xp-map/dto/create-lesson-xp-segment.dto.js +123 -0
  147. package/dist/lesson-xp-map/dto/create-lesson-xp-segment.dto.js.map +1 -0
  148. package/dist/lesson-xp-map/dto/review-lesson-xp-map.dto.d.ts +4 -0
  149. package/dist/lesson-xp-map/dto/review-lesson-xp-map.dto.d.ts.map +1 -0
  150. package/dist/lesson-xp-map/dto/review-lesson-xp-map.dto.js +22 -0
  151. package/dist/lesson-xp-map/dto/review-lesson-xp-map.dto.js.map +1 -0
  152. package/dist/lesson-xp-map/dto/update-lesson-xp-map.dto.d.ts +10 -0
  153. package/dist/lesson-xp-map/dto/update-lesson-xp-map.dto.d.ts.map +1 -0
  154. package/dist/lesson-xp-map/dto/update-lesson-xp-map.dto.js +52 -0
  155. package/dist/lesson-xp-map/dto/update-lesson-xp-map.dto.js.map +1 -0
  156. package/dist/lesson-xp-map/dto/update-lesson-xp-segment.dto.d.ts +15 -0
  157. package/dist/lesson-xp-map/dto/update-lesson-xp-segment.dto.d.ts.map +1 -0
  158. package/dist/lesson-xp-map/dto/update-lesson-xp-segment.dto.js +86 -0
  159. package/dist/lesson-xp-map/dto/update-lesson-xp-segment.dto.js.map +1 -0
  160. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.d.ts +30 -0
  161. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.d.ts.map +1 -0
  162. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.js +440 -0
  163. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.js.map +1 -0
  164. package/dist/lesson-xp-map/lesson-xp-map.controller.d.ts +87 -0
  165. package/dist/lesson-xp-map/lesson-xp-map.controller.d.ts.map +1 -0
  166. package/dist/lesson-xp-map/lesson-xp-map.controller.js +185 -0
  167. package/dist/lesson-xp-map/lesson-xp-map.controller.js.map +1 -0
  168. package/dist/lesson-xp-map/lesson-xp-map.module.d.ts +3 -0
  169. package/dist/lesson-xp-map/lesson-xp-map.module.d.ts.map +1 -0
  170. package/dist/lesson-xp-map/lesson-xp-map.module.js +34 -0
  171. package/dist/lesson-xp-map/lesson-xp-map.module.js.map +1 -0
  172. package/dist/lesson-xp-map/lesson-xp-map.service.d.ts +84 -0
  173. package/dist/lesson-xp-map/lesson-xp-map.service.d.ts.map +1 -0
  174. package/dist/lesson-xp-map/lesson-xp-map.service.js +353 -0
  175. package/dist/lesson-xp-map/lesson-xp-map.service.js.map +1 -0
  176. package/dist/lesson-xp-map/lesson-xp-segment.controller.d.ts +10 -0
  177. package/dist/lesson-xp-map/lesson-xp-segment.controller.d.ts.map +1 -0
  178. package/dist/lesson-xp-map/lesson-xp-segment.controller.js +63 -0
  179. package/dist/lesson-xp-map/lesson-xp-segment.controller.js.map +1 -0
  180. package/dist/lesson-xp-map/lesson-xp-segment.service.d.ts +27 -0
  181. package/dist/lesson-xp-map/lesson-xp-segment.service.d.ts.map +1 -0
  182. package/dist/lesson-xp-map/lesson-xp-segment.service.js +194 -0
  183. package/dist/lesson-xp-map/lesson-xp-segment.service.js.map +1 -0
  184. package/dist/libraries/lms/tsconfig.tsbuildinfo +1 -0
  185. package/dist/lms-commerce-access.subscriber.d.ts +11 -0
  186. package/dist/lms-commerce-access.subscriber.d.ts.map +1 -0
  187. package/dist/lms-commerce-access.subscriber.js +74 -0
  188. package/dist/lms-commerce-access.subscriber.js.map +1 -0
  189. package/dist/lms.module.d.ts.map +1 -1
  190. package/dist/lms.module.js +21 -5
  191. package/dist/lms.module.js.map +1 -1
  192. package/dist/platforma/dto/update-profile.dto.d.ts +17 -0
  193. package/dist/platforma/dto/update-profile.dto.d.ts.map +1 -0
  194. package/dist/platforma/dto/update-profile.dto.js +87 -0
  195. package/dist/platforma/dto/update-profile.dto.js.map +1 -0
  196. package/dist/platforma/platforma-video.service.d.ts +39 -0
  197. package/dist/platforma/platforma-video.service.d.ts.map +1 -0
  198. package/dist/platforma/platforma-video.service.js +301 -0
  199. package/dist/platforma/platforma-video.service.js.map +1 -0
  200. package/dist/platforma/platforma.controller.d.ts +182 -1
  201. package/dist/platforma/platforma.controller.d.ts.map +1 -1
  202. package/dist/platforma/platforma.controller.js +243 -2
  203. package/dist/platforma/platforma.controller.js.map +1 -1
  204. package/dist/platforma/platforma.service.d.ts +27 -0
  205. package/dist/platforma/platforma.service.d.ts.map +1 -0
  206. package/dist/platforma/platforma.service.js +274 -0
  207. package/dist/platforma/platforma.service.js.map +1 -0
  208. package/dist/student-xp/dto/grant-skill-card-xp.dto.d.ts +5 -0
  209. package/dist/student-xp/dto/grant-skill-card-xp.dto.d.ts.map +1 -0
  210. package/dist/student-xp/dto/grant-skill-card-xp.dto.js +26 -0
  211. package/dist/student-xp/dto/grant-skill-card-xp.dto.js.map +1 -0
  212. package/dist/student-xp/student-xp.controller.d.ts +56 -0
  213. package/dist/student-xp/student-xp.controller.d.ts.map +1 -0
  214. package/dist/student-xp/student-xp.controller.js +138 -0
  215. package/dist/student-xp/student-xp.controller.js.map +1 -0
  216. package/dist/student-xp/student-xp.module.d.ts +3 -0
  217. package/dist/student-xp/student-xp.module.d.ts.map +1 -0
  218. package/dist/student-xp/student-xp.module.js +25 -0
  219. package/dist/student-xp/student-xp.module.js.map +1 -0
  220. package/dist/student-xp/student-xp.service.d.ts +81 -0
  221. package/dist/student-xp/student-xp.service.d.ts.map +1 -0
  222. package/dist/student-xp/student-xp.service.js +247 -0
  223. package/dist/student-xp/student-xp.service.js.map +1 -0
  224. package/dist/xp-catalog/dto/create-xp-area.dto.d.ts +12 -0
  225. package/dist/xp-catalog/dto/create-xp-area.dto.d.ts.map +1 -0
  226. package/dist/xp-catalog/dto/create-xp-area.dto.js +63 -0
  227. package/dist/xp-catalog/dto/create-xp-area.dto.js.map +1 -0
  228. package/dist/xp-catalog/dto/create-xp-learning-type.dto.d.ts +11 -0
  229. package/dist/xp-catalog/dto/create-xp-learning-type.dto.d.ts.map +1 -0
  230. package/dist/xp-catalog/dto/create-xp-learning-type.dto.js +57 -0
  231. package/dist/xp-catalog/dto/create-xp-learning-type.dto.js.map +1 -0
  232. package/dist/xp-catalog/dto/create-xp-skill.dto.d.ts +11 -0
  233. package/dist/xp-catalog/dto/create-xp-skill.dto.d.ts.map +1 -0
  234. package/dist/xp-catalog/dto/create-xp-skill.dto.js +57 -0
  235. package/dist/xp-catalog/dto/create-xp-skill.dto.js.map +1 -0
  236. package/dist/xp-catalog/dto/update-xp-area.dto.d.ts +12 -0
  237. package/dist/xp-catalog/dto/update-xp-area.dto.d.ts.map +1 -0
  238. package/dist/xp-catalog/dto/update-xp-area.dto.js +66 -0
  239. package/dist/xp-catalog/dto/update-xp-area.dto.js.map +1 -0
  240. package/dist/xp-catalog/dto/update-xp-learning-type.dto.d.ts +11 -0
  241. package/dist/xp-catalog/dto/update-xp-learning-type.dto.d.ts.map +1 -0
  242. package/dist/xp-catalog/dto/update-xp-learning-type.dto.js +60 -0
  243. package/dist/xp-catalog/dto/update-xp-learning-type.dto.js.map +1 -0
  244. package/dist/xp-catalog/dto/update-xp-skill.dto.d.ts +11 -0
  245. package/dist/xp-catalog/dto/update-xp-skill.dto.d.ts.map +1 -0
  246. package/dist/xp-catalog/dto/update-xp-skill.dto.js +60 -0
  247. package/dist/xp-catalog/dto/update-xp-skill.dto.js.map +1 -0
  248. package/dist/xp-catalog/xp-area.controller.d.ts +25 -0
  249. package/dist/xp-catalog/xp-area.controller.d.ts.map +1 -0
  250. package/dist/xp-catalog/xp-area.controller.js +105 -0
  251. package/dist/xp-catalog/xp-area.controller.js.map +1 -0
  252. package/dist/xp-catalog/xp-area.service.d.ts +35 -0
  253. package/dist/xp-catalog/xp-area.service.d.ts.map +1 -0
  254. package/dist/xp-catalog/xp-area.service.js +168 -0
  255. package/dist/xp-catalog/xp-area.service.js.map +1 -0
  256. package/dist/xp-catalog/xp-catalog.module.d.ts +3 -0
  257. package/dist/xp-catalog/xp-catalog.module.d.ts.map +1 -0
  258. package/dist/xp-catalog/xp-catalog.module.js +29 -0
  259. package/dist/xp-catalog/xp-catalog.module.js.map +1 -0
  260. package/dist/xp-catalog/xp-learning-type.controller.d.ts +20 -0
  261. package/dist/xp-catalog/xp-learning-type.controller.d.ts.map +1 -0
  262. package/dist/xp-catalog/xp-learning-type.controller.js +96 -0
  263. package/dist/xp-catalog/xp-learning-type.controller.js.map +1 -0
  264. package/dist/xp-catalog/xp-learning-type.service.d.ts +30 -0
  265. package/dist/xp-catalog/xp-learning-type.service.d.ts.map +1 -0
  266. package/dist/xp-catalog/xp-learning-type.service.js +146 -0
  267. package/dist/xp-catalog/xp-learning-type.service.js.map +1 -0
  268. package/dist/xp-catalog/xp-skill.controller.d.ts +26 -0
  269. package/dist/xp-catalog/xp-skill.controller.d.ts.map +1 -0
  270. package/dist/xp-catalog/xp-skill.controller.js +113 -0
  271. package/dist/xp-catalog/xp-skill.controller.js.map +1 -0
  272. package/dist/xp-catalog/xp-skill.service.d.ts +37 -0
  273. package/dist/xp-catalog/xp-skill.service.d.ts.map +1 -0
  274. package/dist/xp-catalog/xp-skill.service.js +174 -0
  275. package/dist/xp-catalog/xp-skill.service.js.map +1 -0
  276. package/hedhog/data/evaluation_topic.yaml +17 -0
  277. package/hedhog/data/menu.yaml +91 -7
  278. package/hedhog/data/queue_definition.yaml +48 -0
  279. package/hedhog/data/route.yaml +511 -29
  280. package/hedhog/data/setting_group.yaml +20 -20
  281. package/hedhog/data/xp_area.yaml +164 -0
  282. package/hedhog/data/xp_learning_type.yaml +131 -0
  283. package/hedhog/data/xp_skill.yaml +1834 -0
  284. package/hedhog/frontend/app/achievements/page.tsx.ejs +108 -118
  285. package/hedhog/frontend/app/bitcodes/page.tsx.ejs +22 -34
  286. package/hedhog/frontend/app/bulk-upload-sessions/page.tsx.ejs +1749 -0
  287. package/hedhog/frontend/app/certificates/models/page.tsx.ejs +21 -45
  288. package/hedhog/frontend/app/classes/[id]/page.tsx.ejs +40 -74
  289. package/hedhog/frontend/app/classes/page.tsx.ejs +56 -85
  290. package/hedhog/frontend/app/courses/[id]/_components/CourseDangerZoneCard.tsx.ejs +3 -2
  291. package/hedhog/frontend/app/courses/[id]/_components/CourseMediaCard.tsx.ejs +48 -5
  292. package/hedhog/frontend/app/courses/[id]/page.tsx.ejs +73 -8
  293. package/hedhog/frontend/app/courses/[id]/structure/_components/course-export-sheet.tsx.ejs +420 -0
  294. package/hedhog/frontend/app/courses/[id]/structure/_components/course-exports-tab.tsx.ejs +308 -0
  295. package/hedhog/frontend/app/courses/[id]/structure/_components/course-operations-tab.tsx.ejs +19 -2
  296. package/hedhog/frontend/app/courses/[id]/structure/_components/course-overview-tab.tsx.ejs +1172 -0
  297. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree-dnd.tsx.ejs +16 -0
  298. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree.tsx.ejs +2 -0
  299. package/hedhog/frontend/app/courses/[id]/structure/_components/course-xp-overview-tab.tsx.ejs +623 -0
  300. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson-xp-tab.tsx.ejs +1458 -0
  301. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson.tsx.ejs +87 -46
  302. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-panel.tsx.ejs +8 -3
  303. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-session.tsx.ejs +31 -8
  304. package/hedhog/frontend/app/courses/[id]/structure/_components/drag-overlay.tsx.ejs +16 -9
  305. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-course.tsx.ejs +618 -480
  306. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-lesson.tsx.ejs +672 -737
  307. package/hedhog/frontend/app/courses/[id]/structure/_components/mock-data.ts.ejs +1 -2
  308. package/hedhog/frontend/app/courses/[id]/structure/_components/sortable-tree-row.tsx.ejs +3 -0
  309. package/hedhog/frontend/app/courses/[id]/structure/_components/store.ts.ejs +1 -0
  310. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-display-settings-popover.tsx.ejs +101 -85
  311. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row-lesson.tsx.ejs +24 -10
  312. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row.tsx.ejs +3 -0
  313. package/hedhog/frontend/app/courses/[id]/structure/_components/types.ts.ejs +1 -1
  314. package/hedhog/frontend/app/courses/[id]/structure/_components/use-tree-display-settings.ts.ejs +7 -1
  315. package/hedhog/frontend/app/courses/[id]/structure/_components/xp-premium-pills.tsx.ejs +44 -0
  316. package/hedhog/frontend/app/courses/[id]/structure/_data/adapters/course-structure.adapter.ts.ejs +6 -10
  317. package/hedhog/frontend/app/courses/[id]/structure/_data/services/course-structure.service.ts.ejs +49 -0
  318. package/hedhog/frontend/app/courses/[id]/structure/_data/types/api-course.types.ts.ejs +4 -3
  319. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-content-overview.ts.ejs +53 -0
  320. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-exports.ts.ejs +106 -0
  321. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-structure-mutations.ts.ejs +80 -1
  322. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-xp-overview.ts.ejs +76 -0
  323. package/hedhog/frontend/app/courses/[id]/structure/_data/use-lesson-xp-map.ts.ejs +128 -0
  324. package/hedhog/frontend/app/courses/[id]/structure/_data/use-lms-settings-query.ts.ejs +0 -2
  325. package/hedhog/frontend/app/courses/[id]/structure/_data/use-transcription-segments.ts.ejs +30 -0
  326. package/hedhog/frontend/app/courses/[id]/structure/_utils/xp-color-config.ts.ejs +115 -0
  327. package/hedhog/frontend/app/courses/_components/CourseDeleteDialog.tsx.ejs +223 -0
  328. package/hedhog/frontend/app/courses/_components/CourseRowActions.tsx.ejs +89 -0
  329. package/hedhog/frontend/app/courses/page.tsx.ejs +445 -230
  330. package/hedhog/frontend/app/enterprise/page.tsx.ejs +39 -63
  331. package/hedhog/frontend/app/exams/[id]/questions/page.tsx.ejs +53 -77
  332. package/hedhog/frontend/app/exams/page.tsx.ejs +54 -90
  333. package/hedhog/frontend/app/instructor-skills/page.tsx.ejs +23 -36
  334. package/hedhog/frontend/app/instructors/page.tsx.ejs +72 -81
  335. package/hedhog/frontend/app/paths/page.tsx.ejs +40 -68
  336. package/hedhog/frontend/app/training/page.tsx.ejs +40 -68
  337. package/hedhog/frontend/app/xp/areas/page.tsx.ejs +782 -0
  338. package/hedhog/frontend/app/xp/learning-types/page.tsx.ejs +690 -0
  339. package/hedhog/frontend/app/xp/skills/page.tsx.ejs +811 -0
  340. package/hedhog/frontend/messages/en.json +412 -31
  341. package/hedhog/frontend/messages/pt.json +412 -31
  342. package/hedhog/table/course_export.yaml +62 -0
  343. package/hedhog/table/lesson_xp_map.yaml +50 -0
  344. package/hedhog/table/lesson_xp_segment.yaml +40 -0
  345. package/hedhog/table/lesson_xp_segment_area.yaml +24 -0
  346. package/hedhog/table/lesson_xp_segment_learning_type.yaml +24 -0
  347. package/hedhog/table/lesson_xp_segment_skill.yaml +24 -0
  348. package/hedhog/table/lms_bulk_upload_item.yaml +44 -0
  349. package/hedhog/table/lms_bulk_upload_session.yaml +42 -0
  350. package/hedhog/table/student_area_xp.yaml +30 -0
  351. package/hedhog/table/student_learning_type_xp.yaml +30 -0
  352. package/hedhog/table/student_skill_xp.yaml +30 -0
  353. package/hedhog/table/student_xp_event.yaml +34 -0
  354. package/hedhog/table/xp_area.yaml +39 -0
  355. package/hedhog/table/xp_learning_type.yaml +34 -0
  356. package/hedhog/table/xp_skill.yaml +39 -0
  357. package/package.json +13 -8
  358. package/src/bitcode-wallet/bitcode-wallet.service.ts +152 -0
  359. package/src/bitcode-wallet/dto/create-current-bitcode-wallet-transaction.dto.ts +32 -0
  360. package/src/course/course-audio-transcription.service.ts +58 -21
  361. package/src/course/course-export-scorm12-worker.service.ts +124 -0
  362. package/src/course/course-export-scorm12.service.ts +668 -0
  363. package/src/course/course-export.service.ts +280 -0
  364. package/src/course/course-lesson.controller.ts +6 -1
  365. package/src/course/course-structure.controller.ts +23 -1
  366. package/src/course/course-structure.service.ts +273 -7
  367. package/src/course/course-video-conversion.service.ts +113 -75
  368. package/src/course/course-video-hls.service.ts +946 -0
  369. package/src/course/course.controller.ts +54 -21
  370. package/src/course/course.mcp-tools.ts +1 -1
  371. package/src/course/course.module.ts +13 -0
  372. package/src/course/course.service.ts +906 -76
  373. package/src/course/dto/cleanup-course-storage.dto.ts +23 -0
  374. package/src/course/dto/cleanup-upload-history.dto.ts +26 -0
  375. package/src/course/dto/create-course-bulk-job.dto.ts +10 -0
  376. package/src/course/dto/create-course-export.dto.ts +56 -0
  377. package/src/course/dto/create-course-structure-lesson.dto.ts +4 -3
  378. package/src/course/lms-bulk-upload-automation.service.ts +707 -0
  379. package/src/course/lms-bulk-upload-infra.service.ts +360 -0
  380. package/src/course/lms-bulk-upload.constants.ts +5 -0
  381. package/src/course/lms-bulk-upload.controller.ts +110 -4
  382. package/src/course/lms-bulk-upload.service.ts +1092 -204
  383. package/src/course/lms-setting.controller.ts +26 -8
  384. package/src/course/scorm12-schemas.ts +9 -0
  385. package/src/enterprise/training/training-student.service.ts +221 -2
  386. package/src/evaluation/evaluation.service.ts +123 -0
  387. package/src/exam/dto/create-standalone-question.dto.ts +66 -0
  388. package/src/exam/exam.module.ts +2 -1
  389. package/src/exam/exam.service.ts +86 -0
  390. package/src/exam/question.controller.ts +28 -0
  391. package/src/lesson-xp-map/dto/create-lesson-xp-map.dto.ts +17 -0
  392. package/src/lesson-xp-map/dto/create-lesson-xp-segment.dto.ts +102 -0
  393. package/src/lesson-xp-map/dto/review-lesson-xp-map.dto.ts +7 -0
  394. package/src/lesson-xp-map/dto/update-lesson-xp-map.dto.ts +36 -0
  395. package/src/lesson-xp-map/dto/update-lesson-xp-segment.dto.ts +78 -0
  396. package/src/lesson-xp-map/lesson-xp-ai-calculation.service.ts +570 -0
  397. package/src/lesson-xp-map/lesson-xp-map.controller.ts +116 -0
  398. package/src/lesson-xp-map/lesson-xp-map.module.ts +21 -0
  399. package/src/lesson-xp-map/lesson-xp-map.service.ts +442 -0
  400. package/src/lesson-xp-map/lesson-xp-segment.controller.ts +36 -0
  401. package/src/lesson-xp-map/lesson-xp-segment.service.ts +229 -0
  402. package/src/lms-commerce-access.subscriber.ts +88 -0
  403. package/src/lms.module.ts +21 -5
  404. package/src/platforma/dto/update-profile.dto.ts +59 -0
  405. package/src/platforma/platforma-video.service.ts +346 -0
  406. package/src/platforma/platforma.controller.ts +152 -3
  407. package/src/platforma/platforma.service.ts +268 -0
  408. package/src/student-xp/dto/grant-skill-card-xp.dto.ts +10 -0
  409. package/src/student-xp/student-xp.controller.ts +92 -0
  410. package/src/student-xp/student-xp.module.ts +12 -0
  411. package/src/student-xp/student-xp.service.ts +318 -0
  412. package/src/xp-catalog/dto/create-xp-area.dto.ts +40 -0
  413. package/src/xp-catalog/dto/create-xp-learning-type.dto.ts +35 -0
  414. package/src/xp-catalog/dto/create-xp-skill.dto.ts +35 -0
  415. package/src/xp-catalog/dto/update-xp-area.dto.ts +43 -0
  416. package/src/xp-catalog/dto/update-xp-learning-type.dto.ts +38 -0
  417. package/src/xp-catalog/dto/update-xp-skill.dto.ts +38 -0
  418. package/src/xp-catalog/xp-area.controller.ts +64 -0
  419. package/src/xp-catalog/xp-area.service.ts +196 -0
  420. package/src/xp-catalog/xp-catalog.module.ts +16 -0
  421. package/src/xp-catalog/xp-learning-type.controller.ts +59 -0
  422. package/src/xp-catalog/xp-learning-type.service.ts +170 -0
  423. package/src/xp-catalog/xp-skill.controller.ts +71 -0
  424. package/src/xp-catalog/xp-skill.service.ts +205 -0
  425. package/hedhog/data/video_resolution_profile.yaml +0 -7
  426. package/hedhog/frontend/app/video-resolution-profiles/page.tsx.ejs +0 -607
  427. package/hedhog/table/course_video_resolution_profile.yaml +0 -22
  428. package/hedhog/table/video_resolution_profile.yaml +0 -18
  429. package/src/video-resolution-profile/dto/create-video-resolution-profile.dto.ts +0 -16
  430. package/src/video-resolution-profile/dto/update-video-resolution-profile.dto.ts +0 -16
  431. package/src/video-resolution-profile/video-resolution-profile.controller.ts +0 -62
  432. package/src/video-resolution-profile/video-resolution-profile.mcp-tools.ts +0 -128
  433. package/src/video-resolution-profile/video-resolution-profile.module.ts +0 -13
  434. package/src/video-resolution-profile/video-resolution-profile.service.ts +0 -117
@@ -72,7 +72,7 @@ const TITLE_PATTERNS = [
72
72
  'Conceitos fundamentais',
73
73
  'Configuracao do ambiente',
74
74
  'Pratica guiada passo a passo',
75
- 'Exercicio: implementacao',
75
+ 'Pratica: implementacao',
76
76
  'Quiz de revisao',
77
77
  'Caso de uso real',
78
78
  'Implementacao completa',
@@ -107,7 +107,6 @@ const LESSON_TYPES: LessonType[] = [
107
107
  'video',
108
108
  'video',
109
109
  'questao',
110
- 'exercicio',
111
110
  ];
112
111
  const PROVIDERS: VideoProvider[] = [
113
112
  'youtube',
@@ -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
  }
@@ -1,13 +1,12 @@
1
1
  'use client';
2
2
 
3
+ import { useState } from 'react';
4
+
3
5
  import { Button } from '@/components/ui/button';
4
6
  import { Label } from '@/components/ui/label';
5
- import {
6
- Popover,
7
- PopoverContent,
8
- PopoverTrigger,
9
- } from '@/components/ui/popover';
7
+ import { ResizableSheetContent } from '@/components/ui/resizable-sheet-content';
10
8
  import { Separator } from '@/components/ui/separator';
9
+ import { Sheet, SheetHeader, SheetTitle } from '@/components/ui/sheet';
11
10
  import { Switch } from '@/components/ui/switch';
12
11
  import {
13
12
  Tooltip,
@@ -26,6 +25,7 @@ import { useTreeDisplaySettings } from './use-tree-display-settings';
26
25
 
27
26
  export function TreeDisplaySettingsPopover() {
28
27
  const t = useTranslations('lms.CoursesPage.StructurePage.displaySettings');
28
+ const [open, setOpen] = useState(false);
29
29
  const {
30
30
  showStatusDot,
31
31
  showVisibility,
@@ -33,98 +33,114 @@ export function TreeDisplaySettingsPopover() {
33
33
  showVideoIndicator,
34
34
  showResourcesIndicator,
35
35
  showTranscriptionIndicator,
36
+ showXpCalculatedIndicator,
36
37
  update,
37
38
  } = useTreeDisplaySettings();
38
39
 
39
40
  return (
40
- <Popover>
41
+ <>
41
42
  <TooltipProvider>
42
43
  <Tooltip>
43
44
  <TooltipTrigger asChild>
44
- <PopoverTrigger asChild>
45
- <Button
46
- variant="ghost"
47
- size="sm"
48
- className="h-8 gap-1.5 text-xs text-muted-foreground hover:text-foreground"
49
- >
50
- <SlidersHorizontal className="size-3.5" />
51
- <span className="sr-only sm:not-sr-only">{t('label')}</span>
52
- </Button>
53
- </PopoverTrigger>
45
+ <Button
46
+ variant="ghost"
47
+ size="sm"
48
+ className="h-8 gap-1.5 text-xs text-muted-foreground hover:text-foreground"
49
+ onClick={() => setOpen(true)}
50
+ >
51
+ <SlidersHorizontal className="size-3.5" />
52
+ <span className="sr-only sm:not-sr-only">{t('label')}</span>
53
+ </Button>
54
54
  </TooltipTrigger>
55
55
  <TooltipContent side="bottom">{t('title')}</TooltipContent>
56
56
  </Tooltip>
57
57
  </TooltipProvider>
58
58
 
59
- <PopoverContent align="end" className="w-56 p-0">
60
- <div className="px-3 py-2.5 border-b">
61
- <p className="text-xs font-semibold">{t('sectionTitle')}</p>
62
- <p className="text-[0.65rem] text-muted-foreground mt-0.5">
63
- {t('sectionDescription')}
64
- </p>
65
- </div>
66
-
67
- <div className="flex flex-col gap-0">
68
- <SettingRow
69
- id="show-status-dot"
70
- label={t('showStatusDot.label')}
71
- description={t('showStatusDot.description')}
72
- checked={showStatusDot}
73
- onCheckedChange={(v) => update({ showStatusDot: v })}
74
- />
75
-
76
- <Separator />
77
-
78
- <SettingRow
79
- id="show-visibility"
80
- label={t('showVisibility.label')}
81
- description={t('showVisibility.description')}
82
- checked={showVisibility}
83
- onCheckedChange={(v) => update({ showVisibility: v })}
84
- />
85
-
86
- <Separator />
87
-
88
- <SettingRow
89
- id="show-code"
90
- label={t('showCode.label')}
91
- description={t('showCode.description')}
92
- checked={showCode}
93
- onCheckedChange={(v) => update({ showCode: v })}
94
- />
95
-
96
- <Separator />
97
-
98
- <SettingRow
99
- id="show-video-indicator"
100
- label={t('showVideoIndicator.label')}
101
- description={t('showVideoIndicator.description')}
102
- checked={showVideoIndicator}
103
- onCheckedChange={(v) => update({ showVideoIndicator: v })}
104
- />
105
-
106
- <Separator />
107
-
108
- <SettingRow
109
- id="show-resources-indicator"
110
- label={t('showResourcesIndicator.label')}
111
- description={t('showResourcesIndicator.description')}
112
- checked={showResourcesIndicator}
113
- onCheckedChange={(v) => update({ showResourcesIndicator: v })}
114
- />
115
-
116
- <Separator />
117
-
118
- <SettingRow
119
- id="show-transcription-indicator"
120
- label={t('showTranscriptionIndicator.label')}
121
- description={t('showTranscriptionIndicator.description')}
122
- checked={showTranscriptionIndicator}
123
- onCheckedChange={(v) => update({ showTranscriptionIndicator: v })}
124
- />
125
- </div>
126
- </PopoverContent>
127
- </Popover>
59
+ <Sheet open={open} onOpenChange={setOpen}>
60
+ <ResizableSheetContent
61
+ sheetId="lms-course-display-settings"
62
+ side="right"
63
+ className="p-0 flex flex-col"
64
+ >
65
+ <SheetHeader className="px-4 py-3 border-b shrink-0">
66
+ <SheetTitle className="text-sm">{t('sectionTitle')}</SheetTitle>
67
+ <p className="text-[0.65rem] text-muted-foreground mt-0.5">
68
+ {t('sectionDescription')}
69
+ </p>
70
+ </SheetHeader>
71
+
72
+ <div className="flex flex-col gap-0 overflow-y-auto">
73
+ <SettingRow
74
+ id="show-status-dot"
75
+ label={t('showStatusDot.label')}
76
+ description={t('showStatusDot.description')}
77
+ checked={showStatusDot}
78
+ onCheckedChange={(v) => update({ showStatusDot: v })}
79
+ />
80
+
81
+ <Separator />
82
+
83
+ <SettingRow
84
+ id="show-visibility"
85
+ label={t('showVisibility.label')}
86
+ description={t('showVisibility.description')}
87
+ checked={showVisibility}
88
+ onCheckedChange={(v) => update({ showVisibility: v })}
89
+ />
90
+
91
+ <Separator />
92
+
93
+ <SettingRow
94
+ id="show-code"
95
+ label={t('showCode.label')}
96
+ description={t('showCode.description')}
97
+ checked={showCode}
98
+ onCheckedChange={(v) => update({ showCode: v })}
99
+ />
100
+
101
+ <Separator />
102
+
103
+ <SettingRow
104
+ id="show-video-indicator"
105
+ label={t('showVideoIndicator.label')}
106
+ description={t('showVideoIndicator.description')}
107
+ checked={showVideoIndicator}
108
+ onCheckedChange={(v) => update({ showVideoIndicator: v })}
109
+ />
110
+
111
+ <Separator />
112
+
113
+ <SettingRow
114
+ id="show-resources-indicator"
115
+ label={t('showResourcesIndicator.label')}
116
+ description={t('showResourcesIndicator.description')}
117
+ checked={showResourcesIndicator}
118
+ onCheckedChange={(v) => update({ showResourcesIndicator: v })}
119
+ />
120
+
121
+ <Separator />
122
+
123
+ <SettingRow
124
+ id="show-transcription-indicator"
125
+ label={t('showTranscriptionIndicator.label')}
126
+ description={t('showTranscriptionIndicator.description')}
127
+ checked={showTranscriptionIndicator}
128
+ onCheckedChange={(v) => update({ showTranscriptionIndicator: v })}
129
+ />
130
+
131
+ <Separator />
132
+
133
+ <SettingRow
134
+ id="show-xp-calculated-indicator"
135
+ label={t('showXpCalculatedIndicator.label')}
136
+ description={t('showXpCalculatedIndicator.description')}
137
+ checked={showXpCalculatedIndicator}
138
+ onCheckedChange={(v) => update({ showXpCalculatedIndicator: v })}
139
+ />
140
+ </div>
141
+ </ResizableSheetContent>
142
+ </Sheet>
143
+ </>
128
144
  );
129
145
  }
130
146
 
@@ -7,8 +7,8 @@ import {
7
7
  TooltipTrigger,
8
8
  } from '@/components/ui/tooltip';
9
9
  import { cn } from '@/lib/utils';
10
+ import { useApp, useQuery } from '@hed-hog/next-app-provider';
10
11
  import {
11
- ClipboardList,
12
12
  Clock3,
13
13
  Eye,
14
14
  EyeOff,
@@ -19,23 +19,23 @@ import {
19
19
  Paperclip,
20
20
  ScrollText,
21
21
  Video,
22
+ Zap,
22
23
  type LucideIcon,
23
24
  } from 'lucide-react';
24
25
  import { useTranslations } from 'next-intl';
25
26
  import { useEffect, useRef } from 'react';
26
- import { useApp, useQuery } from '@hed-hog/next-app-provider';
27
- import { useUpdateLessonMutation } from '../_data/use-course-structure-mutations';
28
27
  import {
29
28
  getQueueJob,
30
29
  type QueueJobStatus,
31
30
  } from '../_data/services/course-structure.service';
31
+ import { useUpdateLessonMutation } from '../_data/use-course-structure-mutations';
32
32
  import { HighlightedText } from './highlighted-text';
33
33
  import { useStructureStore } from './store';
34
- import type { Lesson, LessonStatus, LessonType } from './types';
35
34
  import {
36
35
  getLessonAttachedResourceCount,
37
36
  getLessonUploadedVideoCount,
38
37
  } from './tree-helpers';
38
+ import type { Lesson, LessonStatus, LessonType } from './types';
39
39
  import { useTreeDisplaySettings } from './use-tree-display-settings';
40
40
 
41
41
  // ── Type configs ──────────────────────────────────────────────────────────────
@@ -47,11 +47,6 @@ const LESSON_TYPE_CONFIG: Record<
47
47
  video: { icon: Video, color: 'text-violet-500', label: 'Vídeo' },
48
48
  post: { icon: FileText, color: 'text-emerald-500', label: 'Post' },
49
49
  questao: { icon: HelpCircle, color: 'text-amber-500', label: 'Quiz' },
50
- exercicio: {
51
- icon: ClipboardList,
52
- color: 'text-rose-500',
53
- label: 'Exercício',
54
- },
55
50
  };
56
51
 
57
52
  const STATUS_CONFIG: Record<LessonStatus, { label: string; dot: string }> = {
@@ -66,6 +61,7 @@ const STATUS_CONFIG: Record<LessonStatus, { label: string; dot: string }> = {
66
61
 
67
62
  interface TreeRowLessonProps {
68
63
  data: Lesson;
64
+ hasXpMap: boolean;
69
65
  isSelected: boolean;
70
66
  isActive: boolean;
71
67
  query: string;
@@ -77,6 +73,7 @@ interface TreeRowLessonProps {
77
73
 
78
74
  export function TreeRowLesson({
79
75
  data,
76
+ hasXpMap,
80
77
  isSelected,
81
78
  isActive,
82
79
  query,
@@ -97,6 +94,7 @@ export function TreeRowLesson({
97
94
  showVideoIndicator,
98
95
  showResourcesIndicator,
99
96
  showTranscriptionIndicator,
97
+ showXpCalculatedIndicator,
100
98
  } = useTreeDisplaySettings();
101
99
 
102
100
  const inlineRenamingId = useStructureStore((s) => s.inlineRenamingId);
@@ -186,6 +184,9 @@ export function TreeRowLesson({
186
184
  : `${durationM}m`;
187
185
  const attachedResourceCount = getLessonAttachedResourceCount(data);
188
186
  const uploadedVideoCount = getLessonUploadedVideoCount(data);
187
+ const hasTranscription =
188
+ Boolean(data.transcription?.trim()) ||
189
+ Boolean(data.transcriptionSegments?.some((segment) => segment.text.trim()));
189
190
 
190
191
  const videoJobVisualState =
191
192
  data.type !== 'video'
@@ -374,7 +375,7 @@ export function TreeRowLesson({
374
375
  {/* Transcription indicator */}
375
376
  {showTranscriptionIndicator &&
376
377
  data.type === 'video' &&
377
- data.transcription && (
378
+ hasTranscription && (
378
379
  <Tooltip>
379
380
  <TooltipTrigger asChild>
380
381
  <span
@@ -387,6 +388,19 @@ export function TreeRowLesson({
387
388
  <TooltipContent>{t('hasTranscription')}</TooltipContent>
388
389
  </Tooltip>
389
390
  )}
391
+ {showXpCalculatedIndicator && data.type === 'video' && hasXpMap && (
392
+ <Tooltip>
393
+ <TooltipTrigger asChild>
394
+ <span
395
+ aria-label={t('xpCalculated')}
396
+ className="inline-flex items-center"
397
+ >
398
+ <Zap className="size-3 shrink-0 text-amber-500" />
399
+ </span>
400
+ </TooltipTrigger>
401
+ <TooltipContent>{t('xpCalculated')}</TooltipContent>
402
+ </Tooltip>
403
+ )}
390
404
  </div>
391
405
  )}
392
406
  </div>
@@ -23,6 +23,7 @@ interface TreeRowProps {
23
23
  >;
24
24
  /** Full ordered visible list — required for SHIFT-range selection. */
25
25
  visibleItems: FlatItem[];
26
+ lessonsWithXpMap: Set<string>;
26
27
  }
27
28
 
28
29
  export function TreeRow({
@@ -35,6 +36,7 @@ export function TreeRow({
35
36
  lessonCountMap,
36
37
  sessionIndicatorMap,
37
38
  visibleItems,
39
+ lessonsWithXpMap,
38
40
  }: TreeRowProps) {
39
41
  const selectItem = useStructureStore((s) => s.selectItem);
40
42
  const toggleExpand = useStructureStore((s) => s.toggleExpand);
@@ -108,6 +110,7 @@ export function TreeRow({
108
110
  <TreeContextMenu item={item}>
109
111
  <TreeRowLesson
110
112
  data={item.data as Lesson}
113
+ hasXpMap={lessonsWithXpMap.has(String(item.id))}
111
114
  isSelected={isSelected}
112
115
  isActive={isActive}
113
116
  query={query}
@@ -2,7 +2,7 @@
2
2
  // Types — LMS Course Structure TreeView
3
3
  // ─────────────────────────────────────────────────────────────────────────────
4
4
 
5
- export type LessonType = 'video' | 'questao' | 'post' | 'exercicio';
5
+ export type LessonType = 'video' | 'questao' | 'post';
6
6
  export type VideoProvider = 'youtube' | 'vimeo' | 'file_storage';
7
7
  export type ItemType = 'course' | 'session' | 'lesson';
8
8
 
@@ -19,6 +19,8 @@ export interface TreeDisplaySettings {
19
19
  showResourcesIndicator: boolean;
20
20
  /** Show a transcription icon when a video lesson has transcription text */
21
21
  showTranscriptionIndicator: boolean;
22
+ /** Show an XP icon when a video lesson already has XP map calculated */
23
+ showXpCalculatedIndicator: boolean;
22
24
  }
23
25
 
24
26
  interface TreeDisplaySettingsStore extends TreeDisplaySettings {
@@ -37,7 +39,8 @@ const DEFAULTS: TreeDisplaySettings = {
37
39
  showCode: false,
38
40
  showVideoIndicator: false,
39
41
  showResourcesIndicator: false,
40
- showTranscriptionIndicator: false,
42
+ showTranscriptionIndicator: true,
43
+ showXpCalculatedIndicator: true,
41
44
  };
42
45
 
43
46
  // ─────────────────────────────────────────────────────────────────────────────
@@ -60,6 +63,7 @@ export const useTreeDisplaySettings = create<TreeDisplaySettingsStore>(
60
63
  showVideoIndicator: s.showVideoIndicator,
61
64
  showResourcesIndicator: s.showResourcesIndicator,
62
65
  showTranscriptionIndicator: s.showTranscriptionIndicator,
66
+ showXpCalculatedIndicator: s.showXpCalculatedIndicator,
63
67
  ...partial,
64
68
  };
65
69
  localStorage.setItem(LS_KEY, JSON.stringify(toSave));
@@ -89,6 +93,8 @@ if (typeof window !== 'undefined') {
89
93
  showTranscriptionIndicator:
90
94
  saved.showTranscriptionIndicator ??
91
95
  DEFAULTS.showTranscriptionIndicator,
96
+ showXpCalculatedIndicator:
97
+ saved.showXpCalculatedIndicator ?? DEFAULTS.showXpCalculatedIndicator,
92
98
  });
93
99
  }
94
100
  } catch {
@@ -0,0 +1,44 @@
1
+ 'use client';
2
+
3
+ import { cn } from '@/lib/utils';
4
+
5
+ export function XpHighlightPill({
6
+ label,
7
+ value,
8
+ tone,
9
+ }: {
10
+ label: string;
11
+ value: string;
12
+ tone: 'sky' | 'amber' | 'emerald' | 'violet';
13
+ }) {
14
+ const toneClassName =
15
+ tone === 'sky'
16
+ ? 'border-sky-500/15 bg-sky-500/10 text-sky-700 dark:text-sky-300'
17
+ : tone === 'amber'
18
+ ? 'border-amber-500/15 bg-amber-500/10 text-amber-700 dark:text-amber-300'
19
+ : tone === 'emerald'
20
+ ? 'border-emerald-500/15 bg-emerald-500/10 text-emerald-700 dark:text-emerald-300'
21
+ : 'border-violet-500/15 bg-violet-500/10 text-violet-700 dark:text-violet-300';
22
+
23
+ return (
24
+ <div
25
+ className={cn(
26
+ 'inline-flex items-center gap-2 rounded-full border px-2.5 py-1 text-xs shadow-sm transition-all duration-200 hover:-translate-y-0.5 hover:shadow-md',
27
+ toneClassName
28
+ )}
29
+ >
30
+ <span className="text-[10px] font-semibold uppercase tracking-[0.14em] opacity-80">
31
+ {label}
32
+ </span>
33
+ <span className="font-semibold">{value}</span>
34
+ </div>
35
+ );
36
+ }
37
+
38
+ export function XpMetaPill({ value }: { value: string }) {
39
+ return (
40
+ <span className="rounded-full border border-border/50 bg-background/90 px-2 py-0.5 text-[10px] font-semibold text-muted-foreground shadow-sm transition-all duration-200 hover:-translate-y-0.5 hover:border-border hover:bg-background hover:text-foreground hover:shadow-md">
41
+ {value}
42
+ </span>
43
+ );
44
+ }
@@ -14,9 +14,8 @@
14
14
  *
15
15
  * ⚠️ KNOWN MISMATCHES (documented with inline comments):
16
16
  * 1. exameVinculado (number) ↔ linkedExam (string) — converted with String()/Number()
17
- * 2. 'exercicio' tipo exists in backend and is now part of frontend LessonType.
18
- * 3. Session.order — not returned by API; inferred from sorted array position.
19
- * 4. Resource.size / url — not returned by API; left as empty string / undefined.
17
+ * 2. Session.ordernot returned by API; inferred from sorted array position.
18
+ * 3. Resource.size / url — not returned by API; left as empty string / undefined.
20
19
  */
21
20
 
22
21
  import type {
@@ -55,7 +54,7 @@ import type {
55
54
  * Map backend lesson type to the frontend LessonType union.
56
55
  *
57
56
  * ⚠️ ADAPTER POINT:
58
- * 'exercicio' is now part of the frontend LessonType union.
57
+ * Keep this helper updated if backend introduces new lesson type aliases.
59
58
  */
60
59
  function normalizeLessonType(tipo: ApiLesson['tipo']): LessonType {
61
60
  return tipo as LessonType;
@@ -129,7 +128,7 @@ export function normalizeCourse(raw: ApiCourse): Course {
129
128
  description: raw.descricao,
130
129
  slug: raw.slug,
131
130
  offeringType: raw.offeringType,
132
- published: false,
131
+ published: raw.status === 'published',
133
132
  };
134
133
  }
135
134
 
@@ -301,9 +300,7 @@ export function toCreateLessonPayload(
301
300
  ): ApiCreateLessonPayload {
302
301
  return {
303
302
  titulo: data.title,
304
- // ⚠️ TYPE NOTE: 'exercicio' is not in the frontend LessonType but the
305
- // backend accepts it. Cast is safe as long as LessonType ⊆ ApiLesson['tipo'].
306
- tipo: data.type as ApiCreateLessonPayload['tipo'],
303
+ tipo: data.type,
307
304
  duracao: data.duration,
308
305
  published: data.published,
309
306
  statusProducao: data.status,
@@ -361,8 +358,7 @@ export function toUpdateLessonPayload(
361
358
  ): ApiUpdateLessonPayload {
362
359
  const payload: ApiUpdateLessonPayload = {};
363
360
  if (data.title !== undefined) payload.titulo = data.title;
364
- if (data.type !== undefined)
365
- payload.tipo = data.type as ApiCreateLessonPayload['tipo'];
361
+ if (data.type !== undefined) payload.tipo = data.type;
366
362
  if (data.duration !== undefined) payload.duracao = data.duration;
367
363
  if (data.published !== undefined) payload.published = data.published;
368
364
  if (data.status !== undefined) payload.statusProducao = data.status;
@@ -54,6 +54,7 @@ type RequestFn = (input: {
54
54
  data?: unknown;
55
55
  headers?: Record<string, string>;
56
56
  onUploadProgress?: (event: { loaded: number; total?: number }) => void;
57
+ showErrors?: boolean;
57
58
  }) => Promise<{ data: unknown }>;
58
59
 
59
60
  export type QueueJobStatus =
@@ -584,6 +585,7 @@ export async function getQueueJob(
584
585
  const response = await request({
585
586
  url: `/queue/jobs/${jobId}`,
586
587
  method: 'GET',
588
+ showErrors: false,
587
589
  });
588
590
  return extractData<QueueJobResponse>(response);
589
591
  }
@@ -604,3 +606,50 @@ export async function deleteFile(
604
606
  data: { ids: [fileId] },
605
607
  });
606
608
  }
609
+
610
+ // ── Questions ─────────────────────────────────────────────────────────────────
611
+
612
+ export interface ApiQuestion {
613
+ id: number;
614
+ questionType: string;
615
+ statement: string;
616
+ points: number;
617
+ subjectId: number | null;
618
+ subjectName: string | null;
619
+ }
620
+
621
+ export interface ApiQuestionListResponse {
622
+ total: number;
623
+ page: number;
624
+ limit: number;
625
+ data: ApiQuestion[];
626
+ }
627
+
628
+ export interface CreateQuestionPayload {
629
+ statement: string;
630
+ questionType?: string;
631
+ points?: number;
632
+ subjectId?: number;
633
+ explanation?: string;
634
+ alternatives?: { text: string; isCorrect: boolean }[];
635
+ fillBlankAnswers?: { answer: string; alternatives?: string[] }[];
636
+ matchingPairs?: { id: string; leftText: string; rightText: string }[];
637
+ }
638
+
639
+ export async function listQuestions(
640
+ request: RequestFn,
641
+ search?: string
642
+ ): Promise<ApiQuestionListResponse> {
643
+ const params = new URLSearchParams({ limit: '100' });
644
+ if (search?.trim()) params.set('search', search.trim());
645
+ const response = await request({ url: `/lms/questions?${params}`, method: 'GET' });
646
+ return response.data as ApiQuestionListResponse;
647
+ }
648
+
649
+ export async function createQuestion(
650
+ request: RequestFn,
651
+ dto: CreateQuestionPayload
652
+ ): Promise<ApiQuestion> {
653
+ const response = await request({ url: '/lms/questions', method: 'POST', data: dto });
654
+ return response.data as ApiQuestion;
655
+ }
@@ -65,7 +65,7 @@ export interface ApiLessonInstructor {
65
65
  * The backend maps DB lesson types to UI types in mapDbTypeToUiType():
66
66
  * DB 'video' → UI 'video'
67
67
  * DB 'text' → UI 'post'
68
- * DB 'quiz' → UI 'questao' or 'exercicio' (based on content.sourceType)
68
+ * DB 'quiz' → UI 'questao' (based on content.sourceType)
69
69
  *
70
70
  * ⚠️ BACKEND NOTE — missing fields:
71
71
  * `order` and `visibility` are NOT included in the API response.
@@ -80,7 +80,7 @@ export interface ApiLesson {
80
80
  descricaoPrivada: string;
81
81
  locale_id?: number | null;
82
82
  /** UI-level lesson type resolved by the backend service. */
83
- tipo: 'video' | 'questao' | 'post' | 'exercicio';
83
+ tipo: 'video' | 'questao' | 'post';
84
84
  /** Duration in minutes. */
85
85
  duracao: number;
86
86
  published?: boolean;
@@ -140,6 +140,7 @@ export interface ApiCourse {
140
140
  titulo: string;
141
141
  descricao: string;
142
142
  offeringType?: 'scheduled' | 'on_demand' | 'blended';
143
+ status?: 'draft' | 'published' | 'archived';
143
144
  recursos?: ApiCourseResource[];
144
145
  }
145
146
 
@@ -207,7 +208,7 @@ export interface ApiUpdateSessionPayload {
207
208
  */
208
209
  export interface ApiCreateLessonPayload {
209
210
  titulo: string;
210
- tipo: 'video' | 'questao' | 'post' | 'exercicio';
211
+ tipo: 'video' | 'questao' | 'post';
211
212
  /** Duration in minutes. */
212
213
  duracao: number;
213
214
  published?: boolean;