@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
@@ -1,607 +0,0 @@
1
- 'use client';
2
-
3
- import {
4
- EmptyState,
5
- Page,
6
- PageHeader,
7
- PaginationFooter,
8
- SearchBar,
9
- } from '@/components/entity-list';
10
- import { FfmpegParamsEditor } from '@/components/ffmpeg-params-editor';
11
- import {
12
- AlertDialog,
13
- AlertDialogAction,
14
- AlertDialogCancel,
15
- AlertDialogContent,
16
- AlertDialogDescription,
17
- AlertDialogHeader,
18
- AlertDialogTitle,
19
- } from '@/components/ui/alert-dialog';
20
- import { Badge } from '@/components/ui/badge';
21
- import { Button } from '@/components/ui/button';
22
- import {
23
- Form,
24
- FormControl,
25
- FormField,
26
- FormItem,
27
- FormLabel,
28
- FormMessage,
29
- } from '@/components/ui/form';
30
- import { Input } from '@/components/ui/input';
31
- import {
32
- Select,
33
- SelectContent,
34
- SelectItem,
35
- SelectTrigger,
36
- SelectValue,
37
- } from '@/components/ui/select';
38
- import {
39
- Sheet,
40
- SheetHeader,
41
- SheetTitle,
42
- } from '@/components/ui/sheet';
43
- import { ResizableSheetContent } from '@/components/ui/resizable-sheet-content';
44
- import { Skeleton } from '@/components/ui/skeleton';
45
- import {
46
- Table,
47
- TableBody,
48
- TableCell,
49
- TableHead,
50
- TableHeader,
51
- TableRow,
52
- } from '@/components/ui/table';
53
- import {
54
- Tooltip,
55
- TooltipContent,
56
- TooltipTrigger,
57
- } from '@/components/ui/tooltip';
58
- import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
59
- import { cn } from '@/lib/utils';
60
- import { useApp, useQuery } from '@hed-hog/next-app-provider';
61
- import { zodResolver } from '@hookform/resolvers/zod';
62
- import {
63
- Film,
64
- PauseCircle,
65
- Pencil,
66
- PlayCircle,
67
- Plus,
68
- Trash2,
69
- } from 'lucide-react';
70
- import { useTranslations } from 'next-intl';
71
- import { useEffect, useState } from 'react';
72
- import { useForm } from 'react-hook-form';
73
- import { toast } from 'sonner';
74
- import * as z from 'zod';
75
-
76
- // ─── Types ────────────────────────────────────────────────────────────────────
77
-
78
- type VideoResolutionProfile = {
79
- id: number;
80
- name: string;
81
- ffmpeg_params: string;
82
- status: 'active' | 'inactive';
83
- };
84
-
85
- type ProfilePaginatedResult = {
86
- data: VideoResolutionProfile[];
87
- total: number;
88
- page: number;
89
- pageSize: number;
90
- lastPage?: number;
91
- };
92
-
93
- // ─── Zod schema ───────────────────────────────────────────────────────────────
94
-
95
- const createSchema = (t: ReturnType<typeof useTranslations>) =>
96
- z.object({
97
- name: z
98
- .string()
99
- .min(1, t('form.validation.required'))
100
- .max(100, t('form.validation.max100')),
101
- ffmpeg_params: z.string().min(1, t('form.validation.required')),
102
- status: z.enum(['active', 'inactive']),
103
- });
104
-
105
- type ProfileFormValues = z.infer<ReturnType<typeof createSchema>>;
106
-
107
- // ─── ProfileFormSheet ──────────────────────────────────────────────────────────
108
-
109
- interface ProfileFormSheetProps {
110
- open: boolean;
111
- onOpenChange: (open: boolean) => void;
112
- profileToEdit: VideoResolutionProfile | null;
113
- onSaved: () => void;
114
- }
115
-
116
- function ProfileFormSheet({
117
- open,
118
- onOpenChange,
119
- profileToEdit,
120
- onSaved,
121
- }: ProfileFormSheetProps) {
122
- const { request } = useApp();
123
- const t = useTranslations('lms.VideoResolutionProfilesPage');
124
- const [isSaving, setIsSaving] = useState(false);
125
-
126
- const form = useForm<ProfileFormValues>({
127
- resolver: zodResolver(createSchema(t)),
128
- defaultValues: { name: '', ffmpeg_params: '', status: 'active' },
129
- });
130
-
131
- useEffect(() => {
132
- if (open) {
133
- if (profileToEdit) {
134
- form.reset({
135
- name: profileToEdit.name,
136
- ffmpeg_params: profileToEdit.ffmpeg_params,
137
- status: profileToEdit.status,
138
- });
139
- } else {
140
- form.reset({ name: '', ffmpeg_params: '', status: 'active' });
141
- }
142
- }
143
- }, [open, profileToEdit, form]);
144
-
145
- const onSubmit = async (values: ProfileFormValues) => {
146
- try {
147
- setIsSaving(true);
148
- if (profileToEdit) {
149
- await request({
150
- url: `/lms/video-resolution-profiles/${profileToEdit.id}`,
151
- method: 'PATCH',
152
- data: values,
153
- });
154
- toast.success(t('messages.updateSuccess'));
155
- } else {
156
- await request({
157
- url: '/lms/video-resolution-profiles',
158
- method: 'POST',
159
- data: values,
160
- });
161
- toast.success(t('messages.createSuccess'));
162
- }
163
- onSaved();
164
- onOpenChange(false);
165
- } catch {
166
- toast.error(t('messages.saveError'));
167
- } finally {
168
- setIsSaving(false);
169
- }
170
- };
171
-
172
- return (
173
- <Sheet open={open} onOpenChange={onOpenChange}>
174
- <ResizableSheetContent
175
- sheetId="lms-video-resolution-profiles-form-sheet"
176
- defaultWidth={560}
177
- minWidth={420}
178
- maxWidth={920}
179
- className="w-full overflow-y-auto sm:max-w-lg"
180
- >
181
- <SheetHeader>
182
- <SheetTitle>
183
- {profileToEdit ? t('sheet.editTitle') : t('sheet.createTitle')}
184
- </SheetTitle>
185
- </SheetHeader>
186
-
187
- <Form {...form}>
188
- <form
189
- onSubmit={form.handleSubmit(onSubmit)}
190
- className="flex flex-col gap-4 px-4 py-4"
191
- >
192
- <div className="grid grid-cols-2 gap-4">
193
- <FormField
194
- control={form.control}
195
- name="name"
196
- render={({ field }) => (
197
- <FormItem>
198
- <FormLabel>{t('form.name')}</FormLabel>
199
- <FormControl>
200
- <Input
201
- placeholder={t('form.namePlaceholder')}
202
- {...field}
203
- />
204
- </FormControl>
205
- <FormMessage />
206
- </FormItem>
207
- )}
208
- />
209
-
210
- <FormField
211
- control={form.control}
212
- name="status"
213
- render={({ field }) => (
214
- <FormItem>
215
- <FormLabel>{t('form.status')}</FormLabel>
216
- <Select onValueChange={field.onChange} value={field.value}>
217
- <FormControl>
218
- <SelectTrigger className="w-full">
219
- <SelectValue
220
- placeholder={t('form.statusPlaceholder')}
221
- />
222
- </SelectTrigger>
223
- </FormControl>
224
- <SelectContent>
225
- <SelectItem value="active">
226
- {t('status.active')}
227
- </SelectItem>
228
- <SelectItem value="inactive">
229
- {t('status.inactive')}
230
- </SelectItem>
231
- </SelectContent>
232
- </Select>
233
- <FormMessage />
234
- </FormItem>
235
- )}
236
- />
237
- </div>
238
-
239
- <FormField
240
- control={form.control}
241
- name="ffmpeg_params"
242
- render={({ field }) => (
243
- <FormItem>
244
- <FormLabel>{t('form.ffmpegParams')}</FormLabel>
245
- <FormControl>
246
- <FfmpegParamsEditor
247
- value={field.value}
248
- onChange={field.onChange}
249
- />
250
- </FormControl>
251
- <FormMessage />
252
- </FormItem>
253
- )}
254
- />
255
-
256
- <div className="flex justify-end gap-2 pt-2">
257
- <Button
258
- type="button"
259
- variant="outline"
260
- onClick={() => onOpenChange(false)}
261
- disabled={isSaving}
262
- >
263
- {t('actions.cancel')}
264
- </Button>
265
- <Button type="submit" disabled={isSaving}>
266
- {isSaving ? t('actions.saving') : t('actions.save')}
267
- </Button>
268
- </div>
269
- </form>
270
- </Form>
271
- </ResizableSheetContent>
272
- </Sheet>
273
- );
274
- }
275
-
276
- // ─── Page ─────────────────────────────────────────────────────────────────────
277
-
278
- export default function VideoResolutionProfilesPage() {
279
- const { request } = useApp();
280
- const t = useTranslations('lms.VideoResolutionProfilesPage');
281
-
282
- const [page, setPage] = useState(1);
283
- const [pageSize, setPageSize] = usePersistedPageSize({
284
- storageKey: 'pagination:global:pageSize',
285
- defaultValue: 6,
286
- allowedValues: [6, 12, 24, 48],
287
- });
288
- const [searchInput, setSearchInput] = useState('');
289
- const [debouncedSearch, setDebouncedSearch] = useState('');
290
- const [sheetOpen, setSheetOpen] = useState(false);
291
- const [profileToEdit, setProfileToEdit] =
292
- useState<VideoResolutionProfile | null>(null);
293
- const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
294
- const [profileToDelete, setProfileToDelete] =
295
- useState<VideoResolutionProfile | null>(null);
296
- const [isDeleting, setIsDeleting] = useState(false);
297
- const [togglingProfileId, setTogglingProfileId] = useState<number | null>(
298
- null
299
- );
300
-
301
- useEffect(() => {
302
- const timeout = setTimeout(() => {
303
- setDebouncedSearch(searchInput.trim());
304
- setPage(1);
305
- }, 300);
306
- return () => clearTimeout(timeout);
307
- }, [searchInput]);
308
-
309
- const {
310
- data: paginate = { data: [], total: 0, page: 1, pageSize, lastPage: 1 },
311
- isLoading,
312
- refetch: refetchList,
313
- } = useQuery<ProfilePaginatedResult>({
314
- queryKey: [
315
- 'lms-video-resolution-profiles',
316
- page,
317
- pageSize,
318
- debouncedSearch,
319
- ],
320
- queryFn: async () => {
321
- const params = new URLSearchParams({
322
- page: String(page),
323
- pageSize: String(pageSize),
324
- });
325
- if (debouncedSearch) params.set('search', debouncedSearch);
326
- const response = await request<ProfilePaginatedResult>({
327
- url: `/lms/video-resolution-profiles?${params.toString()}`,
328
- method: 'GET',
329
- });
330
- return response.data;
331
- },
332
- placeholderData: (prev) =>
333
- prev ?? { data: [], total: 0, page: 1, pageSize, lastPage: 1 },
334
- });
335
-
336
- const totalPages = Math.max(
337
- 1,
338
- (paginate.lastPage ?? Math.ceil((paginate.total || 0) / pageSize)) || 1
339
- );
340
-
341
- useEffect(() => {
342
- if (page > totalPages) setPage(totalPages);
343
- }, [page, totalPages]);
344
-
345
- const openCreateSheet = () => {
346
- setProfileToEdit(null);
347
- setSheetOpen(true);
348
- };
349
-
350
- const openEditSheet = (profile: VideoResolutionProfile) => {
351
- setProfileToEdit(profile);
352
- setSheetOpen(true);
353
- };
354
-
355
- const handleSaved = async () => {
356
- await refetchList();
357
- };
358
-
359
- const handleDeleteConfirm = async () => {
360
- if (!profileToDelete) return;
361
- try {
362
- setIsDeleting(true);
363
- await request({
364
- url: `/lms/video-resolution-profiles/${profileToDelete.id}`,
365
- method: 'DELETE',
366
- });
367
- toast.success(t('messages.deleteSuccess'));
368
- setDeleteDialogOpen(false);
369
- setProfileToDelete(null);
370
- await refetchList();
371
- } catch {
372
- toast.error(t('messages.deleteError'));
373
- } finally {
374
- setIsDeleting(false);
375
- }
376
- };
377
-
378
- const handleQuickStatusToggle = async (profile: VideoResolutionProfile) => {
379
- const nextStatus = profile.status === 'active' ? 'inactive' : 'active';
380
-
381
- try {
382
- setTogglingProfileId(profile.id);
383
- await request({
384
- url: `/lms/video-resolution-profiles/${profile.id}`,
385
- method: 'PATCH',
386
- data: { status: nextStatus },
387
- });
388
- toast.success(t('messages.updateSuccess'));
389
- await refetchList();
390
- } catch {
391
- toast.error(t('messages.saveError'));
392
- } finally {
393
- setTogglingProfileId(null);
394
- }
395
- };
396
-
397
- return (
398
- <Page>
399
- <PageHeader
400
- breadcrumbs={[
401
- { label: t('breadcrumbs.home'), href: '/' },
402
- { label: t('breadcrumbs.lms'), href: '/lms' },
403
- { label: t('breadcrumbs.current') },
404
- ]}
405
- title={t('title')}
406
- description={t('description')}
407
- actions={[
408
- {
409
- label: t('actions.create'),
410
- onClick: openCreateSheet,
411
- icon: <Plus className="h-4 w-4" />,
412
- },
413
- ]}
414
- />
415
-
416
- <SearchBar
417
- searchQuery={searchInput}
418
- onSearchChange={(value) => setSearchInput(value)}
419
- onSearch={() => setPage(1)}
420
- placeholder={t('filters.searchPlaceholder')}
421
- />
422
-
423
- {isLoading ? (
424
- <div className="space-y-3 p-4">
425
- {Array.from({ length: 5 }).map((_, i) => (
426
- <Skeleton key={i} className="h-14 w-full" />
427
- ))}
428
- </div>
429
- ) : paginate.data.length === 0 ? (
430
- <EmptyState
431
- icon={<Film className="h-12 w-12" />}
432
- title={t('empty.title')}
433
- description={t('empty.description')}
434
- actionLabel={t('actions.create')}
435
- actionIcon={<Plus className="mr-2 h-4 w-4" />}
436
- onAction={openCreateSheet}
437
- />
438
- ) : (
439
- <div className="overflow-x-auto">
440
- <Table>
441
- <TableHeader>
442
- <TableRow>
443
- <TableHead>{t('table.name')}</TableHead>
444
- <TableHead>{t('table.ffmpegParams')}</TableHead>
445
- <TableHead>{t('table.status')}</TableHead>
446
- <TableHead className="w-10" />
447
- </TableRow>
448
- </TableHeader>
449
- <TableBody>
450
- {paginate.data.map((profile) => (
451
- <TableRow
452
- key={profile.id}
453
- className="cursor-pointer"
454
- onDoubleClick={() => openEditSheet(profile)}
455
- >
456
- <TableCell>
457
- <span className="font-medium text-sm">{profile.name}</span>
458
- </TableCell>
459
- <TableCell className="max-w-xs">
460
- <span className="font-mono text-xs text-muted-foreground truncate block max-w-xs">
461
- {profile.ffmpeg_params}
462
- </span>
463
- </TableCell>
464
- <TableCell>
465
- <Badge
466
- variant="outline"
467
- className={cn(
468
- 'border px-2.5 py-1 text-xs font-medium',
469
- profile.status === 'active'
470
- ? 'border-green-500/20 bg-green-500/10 text-green-600'
471
- : 'border-gray-500/20 bg-gray-500/10 text-gray-600'
472
- )}
473
- >
474
- {profile.status === 'active'
475
- ? t('status.active')
476
- : t('status.inactive')}
477
- </Badge>
478
- </TableCell>
479
- <TableCell className="text-right">
480
- <div className="flex items-center justify-end gap-1">
481
- <Tooltip>
482
- <TooltipTrigger asChild>
483
- <Button
484
- variant="ghost"
485
- size="icon"
486
- className="h-8 w-8 cursor-pointer"
487
- onClick={(event) => {
488
- event.stopPropagation();
489
- openEditSheet(profile);
490
- }}
491
- aria-label={t('actions.edit')}
492
- >
493
- <Pencil className="h-4 w-4" />
494
- </Button>
495
- </TooltipTrigger>
496
- <TooltipContent>{t('actions.edit')}</TooltipContent>
497
- </Tooltip>
498
-
499
- <Tooltip>
500
- <TooltipTrigger asChild>
501
- <Button
502
- variant="ghost"
503
- size="icon"
504
- className={cn(
505
- 'h-8 w-8 cursor-pointer',
506
- profile.status === 'active'
507
- ? 'text-amber-600 hover:text-amber-600'
508
- : 'text-emerald-600 hover:text-emerald-600'
509
- )}
510
- onClick={(event) => {
511
- event.stopPropagation();
512
- void handleQuickStatusToggle(profile);
513
- }}
514
- aria-label={
515
- profile.status === 'active'
516
- ? t('status.inactive')
517
- : t('status.active')
518
- }
519
- disabled={togglingProfileId === profile.id}
520
- >
521
- {profile.status === 'active' ? (
522
- <PauseCircle className="h-4 w-4" />
523
- ) : (
524
- <PlayCircle className="h-4 w-4" />
525
- )}
526
- </Button>
527
- </TooltipTrigger>
528
- <TooltipContent>
529
- {profile.status === 'active'
530
- ? t('status.inactive')
531
- : t('status.active')}
532
- </TooltipContent>
533
- </Tooltip>
534
-
535
- <Tooltip>
536
- <TooltipTrigger asChild>
537
- <Button
538
- variant="ghost"
539
- size="icon"
540
- className="h-8 w-8 cursor-pointer text-destructive hover:text-destructive"
541
- onClick={(event) => {
542
- event.stopPropagation();
543
- setProfileToDelete(profile);
544
- setDeleteDialogOpen(true);
545
- }}
546
- aria-label={t('actions.delete')}
547
- >
548
- <Trash2 className="h-4 w-4" />
549
- </Button>
550
- </TooltipTrigger>
551
- <TooltipContent>{t('actions.delete')}</TooltipContent>
552
- </Tooltip>
553
- </div>
554
- </TableCell>
555
- </TableRow>
556
- ))}
557
- </TableBody>
558
- </Table>
559
- </div>
560
- )}
561
-
562
- <PaginationFooter
563
- currentPage={page}
564
- pageSize={pageSize}
565
- totalItems={paginate.total}
566
- onPageChange={setPage}
567
- onPageSizeChange={(nextPageSize) => {
568
- setPageSize(nextPageSize);
569
- setPage(1);
570
- }}
571
- pageSizeOptions={[6, 12, 24]}
572
- />
573
-
574
- <ProfileFormSheet
575
- open={sheetOpen}
576
- onOpenChange={setSheetOpen}
577
- profileToEdit={profileToEdit}
578
- onSaved={handleSaved}
579
- />
580
-
581
- <AlertDialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>
582
- <AlertDialogContent>
583
- <AlertDialogHeader>
584
- <AlertDialogTitle>{t('deleteDialog.title')}</AlertDialogTitle>
585
- <AlertDialogDescription>
586
- {t('deleteDialog.description', {
587
- name: profileToDelete?.name ?? '',
588
- })}
589
- </AlertDialogDescription>
590
- </AlertDialogHeader>
591
- <div className="flex justify-end gap-2">
592
- <AlertDialogCancel disabled={isDeleting}>
593
- {t('actions.cancel')}
594
- </AlertDialogCancel>
595
- <AlertDialogAction
596
- onClick={handleDeleteConfirm}
597
- disabled={isDeleting}
598
- className="bg-red-600 hover:bg-red-700"
599
- >
600
- {isDeleting ? t('actions.deleting') : t('actions.delete')}
601
- </AlertDialogAction>
602
- </div>
603
- </AlertDialogContent>
604
- </AlertDialog>
605
- </Page>
606
- );
607
- }
@@ -1,22 +0,0 @@
1
- columns:
2
- - type: pk
3
- - name: course_id
4
- type: fk
5
- references:
6
- table: course
7
- column: id
8
- onDelete: CASCADE
9
- - name: video_resolution_profile_id
10
- type: fk
11
- references:
12
- table: video_resolution_profile
13
- column: id
14
- onDelete: CASCADE
15
- - type: created_at
16
- - type: updated_at
17
-
18
- indices:
19
- - columns: [course_id, video_resolution_profile_id]
20
- isUnique: true
21
- - columns: [course_id]
22
- - columns: [video_resolution_profile_id]
@@ -1,18 +0,0 @@
1
- columns:
2
- - type: pk
3
- - name: name
4
- type: varchar
5
- length: 100
6
- - name: ffmpeg_params
7
- type: text
8
- - name: status
9
- type: enum
10
- values: [active, inactive]
11
- default: active
12
- - type: created_at
13
- - type: updated_at
14
-
15
- indices:
16
- - columns: [name]
17
- isUnique: true
18
- - columns: [status]
@@ -1,16 +0,0 @@
1
- import { IsEnum, IsNotEmpty, IsOptional, IsString, MaxLength } from 'class-validator';
2
-
3
- export class CreateVideoResolutionProfileDto {
4
- @IsString()
5
- @IsNotEmpty()
6
- @MaxLength(100)
7
- name: string;
8
-
9
- @IsString()
10
- @IsNotEmpty()
11
- ffmpeg_params: string;
12
-
13
- @IsOptional()
14
- @IsEnum(['active', 'inactive'])
15
- status?: 'active' | 'inactive';
16
- }
@@ -1,16 +0,0 @@
1
- import { IsEnum, IsOptional, IsString, MaxLength } from 'class-validator';
2
-
3
- export class UpdateVideoResolutionProfileDto {
4
- @IsOptional()
5
- @IsString()
6
- @MaxLength(100)
7
- name?: string;
8
-
9
- @IsOptional()
10
- @IsString()
11
- ffmpeg_params?: string;
12
-
13
- @IsOptional()
14
- @IsEnum(['active', 'inactive'])
15
- status?: 'active' | 'inactive';
16
- }