@hed-hog/lms 0.0.349 → 0.0.351

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 (496) hide show
  1. package/dist/achievement/achievement.controller.d.ts +62 -0
  2. package/dist/achievement/achievement.controller.d.ts.map +1 -0
  3. package/dist/achievement/achievement.controller.js +90 -0
  4. package/dist/achievement/achievement.controller.js.map +1 -0
  5. package/dist/achievement/achievement.mcp-tools.d.ts +19 -0
  6. package/dist/achievement/achievement.mcp-tools.d.ts.map +1 -0
  7. package/dist/achievement/achievement.mcp-tools.js +157 -0
  8. package/dist/achievement/achievement.mcp-tools.js.map +1 -0
  9. package/dist/achievement/achievement.module.d.ts +3 -0
  10. package/dist/achievement/achievement.module.d.ts.map +1 -0
  11. package/dist/achievement/achievement.module.js +26 -0
  12. package/dist/achievement/achievement.module.js.map +1 -0
  13. package/dist/achievement/achievement.service.d.ts +72 -0
  14. package/dist/achievement/achievement.service.d.ts.map +1 -0
  15. package/dist/achievement/achievement.service.js +200 -0
  16. package/dist/achievement/achievement.service.js.map +1 -0
  17. package/dist/achievement/dto/create-achievement.dto.d.ts +12 -0
  18. package/dist/achievement/dto/create-achievement.dto.d.ts.map +1 -0
  19. package/dist/achievement/dto/create-achievement.dto.js +60 -0
  20. package/dist/achievement/dto/create-achievement.dto.js.map +1 -0
  21. package/dist/achievement/dto/update-achievement.dto.d.ts +11 -0
  22. package/dist/achievement/dto/update-achievement.dto.d.ts.map +1 -0
  23. package/dist/achievement/dto/update-achievement.dto.js +57 -0
  24. package/dist/achievement/dto/update-achievement.dto.js.map +1 -0
  25. package/dist/bitcode-wallet/bitcode-wallet.controller.d.ts +114 -0
  26. package/dist/bitcode-wallet/bitcode-wallet.controller.d.ts.map +1 -0
  27. package/dist/bitcode-wallet/bitcode-wallet.controller.js +102 -0
  28. package/dist/bitcode-wallet/bitcode-wallet.controller.js.map +1 -0
  29. package/dist/bitcode-wallet/bitcode-wallet.mcp-tools.d.ts +25 -0
  30. package/dist/bitcode-wallet/bitcode-wallet.mcp-tools.d.ts.map +1 -0
  31. package/dist/bitcode-wallet/bitcode-wallet.mcp-tools.js +160 -0
  32. package/dist/bitcode-wallet/bitcode-wallet.mcp-tools.js.map +1 -0
  33. package/dist/bitcode-wallet/bitcode-wallet.module.d.ts +3 -0
  34. package/dist/bitcode-wallet/bitcode-wallet.module.d.ts.map +1 -0
  35. package/dist/bitcode-wallet/bitcode-wallet.module.js +26 -0
  36. package/dist/bitcode-wallet/bitcode-wallet.module.js.map +1 -0
  37. package/dist/bitcode-wallet/bitcode-wallet.service.d.ts +127 -0
  38. package/dist/bitcode-wallet/bitcode-wallet.service.d.ts.map +1 -0
  39. package/dist/bitcode-wallet/bitcode-wallet.service.js +264 -0
  40. package/dist/bitcode-wallet/bitcode-wallet.service.js.map +1 -0
  41. package/dist/bitcode-wallet/dto/create-bitcode-wallet-transaction.dto.d.ts +8 -0
  42. package/dist/bitcode-wallet/dto/create-bitcode-wallet-transaction.dto.d.ts.map +1 -0
  43. package/dist/bitcode-wallet/dto/create-bitcode-wallet-transaction.dto.js +33 -0
  44. package/dist/bitcode-wallet/dto/create-bitcode-wallet-transaction.dto.js.map +1 -0
  45. package/dist/bitcode-wallet/dto/create-bitcode-wallet.dto.d.ts +4 -0
  46. package/dist/bitcode-wallet/dto/create-bitcode-wallet.dto.d.ts.map +1 -0
  47. package/dist/bitcode-wallet/dto/create-bitcode-wallet.dto.js +22 -0
  48. package/dist/bitcode-wallet/dto/create-bitcode-wallet.dto.js.map +1 -0
  49. package/dist/bitcode-wallet/dto/update-bitcode-wallet-transaction.dto.d.ts +7 -0
  50. package/dist/bitcode-wallet/dto/update-bitcode-wallet-transaction.dto.d.ts.map +1 -0
  51. package/dist/bitcode-wallet/dto/update-bitcode-wallet-transaction.dto.js +35 -0
  52. package/dist/bitcode-wallet/dto/update-bitcode-wallet-transaction.dto.js.map +1 -0
  53. package/dist/bitcode-wallet/dto/update-bitcode-wallet.dto.d.ts +4 -0
  54. package/dist/bitcode-wallet/dto/update-bitcode-wallet.dto.d.ts.map +1 -0
  55. package/dist/bitcode-wallet/dto/update-bitcode-wallet.dto.js +23 -0
  56. package/dist/bitcode-wallet/dto/update-bitcode-wallet.dto.js.map +1 -0
  57. package/dist/certificate/certificate.controller.d.ts +24 -2
  58. package/dist/certificate/certificate.controller.d.ts.map +1 -1
  59. package/dist/certificate/certificate.controller.js +20 -6
  60. package/dist/certificate/certificate.controller.js.map +1 -1
  61. package/dist/certificate/certificate.mcp-tools.d.ts +24 -0
  62. package/dist/certificate/certificate.mcp-tools.d.ts.map +1 -0
  63. package/dist/certificate/certificate.mcp-tools.js +188 -0
  64. package/dist/certificate/certificate.mcp-tools.js.map +1 -0
  65. package/dist/certificate/certificate.module.d.ts.map +1 -1
  66. package/dist/certificate/certificate.module.js +2 -1
  67. package/dist/certificate/certificate.module.js.map +1 -1
  68. package/dist/certificate/certificate.service.d.ts +30 -4
  69. package/dist/certificate/certificate.service.d.ts.map +1 -1
  70. package/dist/certificate/certificate.service.js +157 -8
  71. package/dist/certificate/certificate.service.js.map +1 -1
  72. package/dist/certificate/dto/update-certificate-public-access.dto.d.ts +4 -0
  73. package/dist/certificate/dto/update-certificate-public-access.dto.d.ts.map +1 -0
  74. package/dist/certificate/dto/update-certificate-public-access.dto.js +21 -0
  75. package/dist/certificate/dto/update-certificate-public-access.dto.js.map +1 -0
  76. package/dist/class-group/class-group.mcp-tools.d.ts +87 -0
  77. package/dist/class-group/class-group.mcp-tools.d.ts.map +1 -0
  78. package/dist/class-group/class-group.mcp-tools.js +553 -0
  79. package/dist/class-group/class-group.mcp-tools.js.map +1 -0
  80. package/dist/class-group/class-group.module.d.ts.map +1 -1
  81. package/dist/class-group/class-group.module.js +2 -1
  82. package/dist/class-group/class-group.module.js.map +1 -1
  83. package/dist/class-group/class-group.service.d.ts +3 -1
  84. package/dist/class-group/class-group.service.d.ts.map +1 -1
  85. package/dist/class-group/class-group.service.js +45 -2
  86. package/dist/class-group/class-group.service.js.map +1 -1
  87. package/dist/course/course-operations-integration.service.d.ts +40 -0
  88. package/dist/course/course-operations-integration.service.d.ts.map +1 -0
  89. package/dist/course/course-operations-integration.service.js +372 -0
  90. package/dist/course/course-operations-integration.service.js.map +1 -0
  91. package/dist/course/course-structure.controller.d.ts +67 -14
  92. package/dist/course/course-structure.controller.d.ts.map +1 -1
  93. package/dist/course/course-structure.controller.js +45 -2
  94. package/dist/course/course-structure.controller.js.map +1 -1
  95. package/dist/course/course-structure.service.d.ts +58 -9
  96. package/dist/course/course-structure.service.d.ts.map +1 -1
  97. package/dist/course/course-structure.service.js +260 -62
  98. package/dist/course/course-structure.service.js.map +1 -1
  99. package/dist/course/course-video-conversion.service.d.ts +37 -0
  100. package/dist/course/course-video-conversion.service.d.ts.map +1 -0
  101. package/dist/course/course-video-conversion.service.js +308 -0
  102. package/dist/course/course-video-conversion.service.js.map +1 -0
  103. package/dist/course/course.controller.d.ts +29 -0
  104. package/dist/course/course.controller.d.ts.map +1 -1
  105. package/dist/course/course.controller.js +23 -0
  106. package/dist/course/course.controller.js.map +1 -1
  107. package/dist/course/course.mcp-tools.d.ts +90 -0
  108. package/dist/course/course.mcp-tools.d.ts.map +1 -0
  109. package/dist/course/course.mcp-tools.js +520 -0
  110. package/dist/course/course.mcp-tools.js.map +1 -0
  111. package/dist/course/course.module.d.ts.map +1 -1
  112. package/dist/course/course.module.js +23 -3
  113. package/dist/course/course.module.js.map +1 -1
  114. package/dist/course/course.service.d.ts +30 -1
  115. package/dist/course/course.service.d.ts.map +1 -1
  116. package/dist/course/course.service.js +159 -70
  117. package/dist/course/course.service.js.map +1 -1
  118. package/dist/course/dto/create-course-structure-lesson.dto.d.ts +5 -1
  119. package/dist/course/dto/create-course-structure-lesson.dto.d.ts.map +1 -1
  120. package/dist/course/dto/create-course-structure-lesson.dto.js +16 -2
  121. package/dist/course/dto/create-course-structure-lesson.dto.js.map +1 -1
  122. package/dist/course/dto/create-course.dto.d.ts +2 -0
  123. package/dist/course/dto/create-course.dto.d.ts.map +1 -1
  124. package/dist/course/dto/create-course.dto.js +16 -0
  125. package/dist/course/dto/create-course.dto.js.map +1 -1
  126. package/dist/course/dto/update-course-resources.dto.d.ts +11 -0
  127. package/dist/course/dto/update-course-resources.dto.d.ts.map +1 -0
  128. package/dist/course/dto/update-course-resources.dto.js +51 -0
  129. package/dist/course/dto/update-course-resources.dto.js.map +1 -0
  130. package/dist/course-lesson-discussion/course-lesson-discussion.controller.d.ts +23 -0
  131. package/dist/course-lesson-discussion/course-lesson-discussion.controller.d.ts.map +1 -0
  132. package/dist/course-lesson-discussion/course-lesson-discussion.controller.js +78 -0
  133. package/dist/course-lesson-discussion/course-lesson-discussion.controller.js.map +1 -0
  134. package/dist/course-lesson-discussion/course-lesson-discussion.mcp-tools.d.ts +22 -0
  135. package/dist/course-lesson-discussion/course-lesson-discussion.mcp-tools.d.ts.map +1 -0
  136. package/dist/course-lesson-discussion/course-lesson-discussion.mcp-tools.js +120 -0
  137. package/dist/course-lesson-discussion/course-lesson-discussion.mcp-tools.js.map +1 -0
  138. package/dist/course-lesson-discussion/course-lesson-discussion.module.d.ts +3 -0
  139. package/dist/course-lesson-discussion/course-lesson-discussion.module.d.ts.map +1 -0
  140. package/dist/course-lesson-discussion/course-lesson-discussion.module.js +26 -0
  141. package/dist/course-lesson-discussion/course-lesson-discussion.module.js.map +1 -0
  142. package/dist/course-lesson-discussion/course-lesson-discussion.service.d.ts +49 -0
  143. package/dist/course-lesson-discussion/course-lesson-discussion.service.d.ts.map +1 -0
  144. package/dist/course-lesson-discussion/course-lesson-discussion.service.js +272 -0
  145. package/dist/course-lesson-discussion/course-lesson-discussion.service.js.map +1 -0
  146. package/dist/course-lesson-discussion/dto/create-course-lesson-discussion-topic.dto.d.ts +6 -0
  147. package/dist/course-lesson-discussion/dto/create-course-lesson-discussion-topic.dto.d.ts.map +1 -0
  148. package/dist/course-lesson-discussion/dto/create-course-lesson-discussion-topic.dto.js +33 -0
  149. package/dist/course-lesson-discussion/dto/create-course-lesson-discussion-topic.dto.js.map +1 -0
  150. package/dist/course-lesson-note/course-lesson-note.controller.d.ts +53 -0
  151. package/dist/course-lesson-note/course-lesson-note.controller.d.ts.map +1 -0
  152. package/dist/course-lesson-note/course-lesson-note.controller.js +93 -0
  153. package/dist/course-lesson-note/course-lesson-note.controller.js.map +1 -0
  154. package/dist/course-lesson-note/course-lesson-note.mcp-tools.d.ts +27 -0
  155. package/dist/course-lesson-note/course-lesson-note.mcp-tools.d.ts.map +1 -0
  156. package/dist/course-lesson-note/course-lesson-note.mcp-tools.js +145 -0
  157. package/dist/course-lesson-note/course-lesson-note.mcp-tools.js.map +1 -0
  158. package/dist/course-lesson-note/course-lesson-note.module.d.ts +3 -0
  159. package/dist/course-lesson-note/course-lesson-note.module.d.ts.map +1 -0
  160. package/dist/course-lesson-note/course-lesson-note.module.js +26 -0
  161. package/dist/course-lesson-note/course-lesson-note.module.js.map +1 -0
  162. package/dist/course-lesson-note/course-lesson-note.service.d.ts +59 -0
  163. package/dist/course-lesson-note/course-lesson-note.service.d.ts.map +1 -0
  164. package/dist/course-lesson-note/course-lesson-note.service.js +195 -0
  165. package/dist/course-lesson-note/course-lesson-note.service.js.map +1 -0
  166. package/dist/course-lesson-note/dto/create-course-lesson-note.dto.d.ts +6 -0
  167. package/dist/course-lesson-note/dto/create-course-lesson-note.dto.d.ts.map +1 -0
  168. package/dist/course-lesson-note/dto/create-course-lesson-note.dto.js +33 -0
  169. package/dist/course-lesson-note/dto/create-course-lesson-note.dto.js.map +1 -0
  170. package/dist/course-lesson-note/dto/update-course-lesson-note.dto.d.ts +6 -0
  171. package/dist/course-lesson-note/dto/update-course-lesson-note.dto.d.ts.map +1 -0
  172. package/dist/course-lesson-note/dto/update-course-lesson-note.dto.js +35 -0
  173. package/dist/course-lesson-note/dto/update-course-lesson-note.dto.js.map +1 -0
  174. package/dist/dashboard/dashboard.mcp-tools.d.ts +10 -0
  175. package/dist/dashboard/dashboard.mcp-tools.d.ts.map +1 -0
  176. package/dist/dashboard/dashboard.mcp-tools.js +46 -0
  177. package/dist/dashboard/dashboard.mcp-tools.js.map +1 -0
  178. package/dist/dashboard/dashboard.module.d.ts.map +1 -1
  179. package/dist/dashboard/dashboard.module.js +2 -1
  180. package/dist/dashboard/dashboard.module.js.map +1 -1
  181. package/dist/enterprise/enterprise.controller.d.ts +3 -3
  182. package/dist/enterprise/enterprise.controller.d.ts.map +1 -1
  183. package/dist/enterprise/enterprise.controller.js +0 -1
  184. package/dist/enterprise/enterprise.controller.js.map +1 -1
  185. package/dist/enterprise/enterprise.mcp-tools.d.ts +82 -0
  186. package/dist/enterprise/enterprise.mcp-tools.d.ts.map +1 -0
  187. package/dist/enterprise/enterprise.mcp-tools.js +516 -0
  188. package/dist/enterprise/enterprise.mcp-tools.js.map +1 -0
  189. package/dist/enterprise/enterprise.module.d.ts.map +1 -1
  190. package/dist/enterprise/enterprise.module.js +2 -1
  191. package/dist/enterprise/enterprise.module.js.map +1 -1
  192. package/dist/enterprise/enterprise.service.d.ts +3 -3
  193. package/dist/enterprise/training/enterprise-training.module.d.ts.map +1 -1
  194. package/dist/enterprise/training/enterprise-training.module.js +11 -1
  195. package/dist/enterprise/training/enterprise-training.module.js.map +1 -1
  196. package/dist/enterprise/training/training-admin.mcp-tools.d.ts +79 -0
  197. package/dist/enterprise/training/training-admin.mcp-tools.d.ts.map +1 -0
  198. package/dist/enterprise/training/training-admin.mcp-tools.js +620 -0
  199. package/dist/enterprise/training/training-admin.mcp-tools.js.map +1 -0
  200. package/dist/enterprise/training/training-instructor.mcp-tools.d.ts +47 -0
  201. package/dist/enterprise/training/training-instructor.mcp-tools.d.ts.map +1 -0
  202. package/dist/enterprise/training/training-instructor.mcp-tools.js +275 -0
  203. package/dist/enterprise/training/training-instructor.mcp-tools.js.map +1 -0
  204. package/dist/enterprise/training/training-student.controller.d.ts +24 -0
  205. package/dist/enterprise/training/training-student.controller.d.ts.map +1 -1
  206. package/dist/enterprise/training/training-student.controller.js +22 -0
  207. package/dist/enterprise/training/training-student.controller.js.map +1 -1
  208. package/dist/enterprise/training/training-student.mcp-tools.d.ts +27 -0
  209. package/dist/enterprise/training/training-student.mcp-tools.d.ts.map +1 -0
  210. package/dist/enterprise/training/training-student.mcp-tools.js +186 -0
  211. package/dist/enterprise/training/training-student.mcp-tools.js.map +1 -0
  212. package/dist/enterprise/training/training-student.service.d.ts +32 -0
  213. package/dist/enterprise/training/training-student.service.d.ts.map +1 -1
  214. package/dist/enterprise/training/training-student.service.js +138 -0
  215. package/dist/enterprise/training/training-student.service.js.map +1 -1
  216. package/dist/evaluation/evaluation.mcp-tools.d.ts +25 -0
  217. package/dist/evaluation/evaluation.mcp-tools.d.ts.map +1 -0
  218. package/dist/evaluation/evaluation.mcp-tools.js +220 -0
  219. package/dist/evaluation/evaluation.mcp-tools.js.map +1 -0
  220. package/dist/evaluation/evaluation.module.d.ts.map +1 -1
  221. package/dist/evaluation/evaluation.module.js +2 -1
  222. package/dist/evaluation/evaluation.module.js.map +1 -1
  223. package/dist/evaluation/evaluation.service.d.ts.map +1 -1
  224. package/dist/evaluation/evaluation.service.js +9 -2
  225. package/dist/evaluation/evaluation.service.js.map +1 -1
  226. package/dist/exam/dto/create-exam-question.dto.d.ts +2 -0
  227. package/dist/exam/dto/create-exam-question.dto.d.ts.map +1 -1
  228. package/dist/exam/dto/create-exam-question.dto.js +10 -0
  229. package/dist/exam/dto/create-exam-question.dto.js.map +1 -1
  230. package/dist/exam/dto/create-exam.dto.d.ts +2 -0
  231. package/dist/exam/dto/create-exam.dto.d.ts.map +1 -1
  232. package/dist/exam/dto/create-exam.dto.js +10 -0
  233. package/dist/exam/dto/create-exam.dto.js.map +1 -1
  234. package/dist/exam/dto/create-question-subject.dto.d.ts +5 -0
  235. package/dist/exam/dto/create-question-subject.dto.d.ts.map +1 -0
  236. package/dist/exam/dto/create-question-subject.dto.js +28 -0
  237. package/dist/exam/dto/create-question-subject.dto.js.map +1 -0
  238. package/dist/exam/exam-attempt.controller.d.ts +4 -0
  239. package/dist/exam/exam-attempt.controller.d.ts.map +1 -1
  240. package/dist/exam/exam-attempt.service.d.ts +7 -1
  241. package/dist/exam/exam-attempt.service.d.ts.map +1 -1
  242. package/dist/exam/exam-attempt.service.js +47 -17
  243. package/dist/exam/exam-attempt.service.js.map +1 -1
  244. package/dist/exam/exam.controller.d.ts +34 -0
  245. package/dist/exam/exam.controller.d.ts.map +1 -1
  246. package/dist/exam/exam.controller.js +27 -0
  247. package/dist/exam/exam.controller.js.map +1 -1
  248. package/dist/exam/exam.mcp-tools.d.ts +62 -0
  249. package/dist/exam/exam.mcp-tools.d.ts.map +1 -0
  250. package/dist/exam/exam.mcp-tools.js +430 -0
  251. package/dist/exam/exam.mcp-tools.js.map +1 -0
  252. package/dist/exam/exam.module.d.ts.map +1 -1
  253. package/dist/exam/exam.module.js +2 -1
  254. package/dist/exam/exam.module.js.map +1 -1
  255. package/dist/exam/exam.service.d.ts +38 -0
  256. package/dist/exam/exam.service.d.ts.map +1 -1
  257. package/dist/exam/exam.service.js +114 -17
  258. package/dist/exam/exam.service.js.map +1 -1
  259. package/dist/index.d.ts +10 -0
  260. package/dist/index.d.ts.map +1 -1
  261. package/dist/index.js +10 -0
  262. package/dist/index.js.map +1 -1
  263. package/dist/instructor/instructor.mcp-tools.d.ts +41 -0
  264. package/dist/instructor/instructor.mcp-tools.d.ts.map +1 -0
  265. package/dist/instructor/instructor.mcp-tools.js +326 -0
  266. package/dist/instructor/instructor.mcp-tools.js.map +1 -0
  267. package/dist/instructor/instructor.module.d.ts.map +1 -1
  268. package/dist/instructor/instructor.module.js +2 -1
  269. package/dist/instructor/instructor.module.js.map +1 -1
  270. package/dist/lms.module.d.ts.map +1 -1
  271. package/dist/lms.module.js +18 -0
  272. package/dist/lms.module.js.map +1 -1
  273. package/dist/realtime/lms-realtime.controller.d.ts +7 -0
  274. package/dist/realtime/lms-realtime.controller.d.ts.map +1 -0
  275. package/dist/realtime/lms-realtime.controller.js +34 -0
  276. package/dist/realtime/lms-realtime.controller.js.map +1 -0
  277. package/dist/realtime/lms-realtime.module.d.ts +3 -0
  278. package/dist/realtime/lms-realtime.module.d.ts.map +1 -0
  279. package/dist/realtime/lms-realtime.module.js +25 -0
  280. package/dist/realtime/lms-realtime.module.js.map +1 -0
  281. package/dist/realtime/lms-realtime.service.d.ts +36 -0
  282. package/dist/realtime/lms-realtime.service.d.ts.map +1 -0
  283. package/dist/realtime/lms-realtime.service.js +59 -0
  284. package/dist/realtime/lms-realtime.service.js.map +1 -0
  285. package/dist/realtime/lms-realtime.subscriber.d.ts +10 -0
  286. package/dist/realtime/lms-realtime.subscriber.d.ts.map +1 -0
  287. package/dist/realtime/lms-realtime.subscriber.js +70 -0
  288. package/dist/realtime/lms-realtime.subscriber.js.map +1 -0
  289. package/dist/reports/reports.mcp-tools.d.ts +10 -0
  290. package/dist/reports/reports.mcp-tools.d.ts.map +1 -0
  291. package/dist/reports/reports.mcp-tools.js +50 -0
  292. package/dist/reports/reports.mcp-tools.js.map +1 -0
  293. package/dist/reports/reports.module.d.ts.map +1 -1
  294. package/dist/reports/reports.module.js +2 -1
  295. package/dist/reports/reports.module.js.map +1 -1
  296. package/dist/training/training.mcp-tools.d.ts +20 -0
  297. package/dist/training/training.mcp-tools.d.ts.map +1 -0
  298. package/dist/training/training.mcp-tools.js +181 -0
  299. package/dist/training/training.mcp-tools.js.map +1 -0
  300. package/dist/training/training.module.d.ts.map +1 -1
  301. package/dist/training/training.module.js +2 -1
  302. package/dist/training/training.module.js.map +1 -1
  303. package/dist/video-resolution-profile/dto/create-video-resolution-profile.dto.d.ts +6 -0
  304. package/dist/video-resolution-profile/dto/create-video-resolution-profile.dto.d.ts.map +1 -0
  305. package/dist/video-resolution-profile/dto/create-video-resolution-profile.dto.js +33 -0
  306. package/dist/video-resolution-profile/dto/create-video-resolution-profile.dto.js.map +1 -0
  307. package/dist/video-resolution-profile/dto/update-video-resolution-profile.dto.d.ts +6 -0
  308. package/dist/video-resolution-profile/dto/update-video-resolution-profile.dto.d.ts.map +1 -0
  309. package/dist/video-resolution-profile/dto/update-video-resolution-profile.dto.js +33 -0
  310. package/dist/video-resolution-profile/dto/update-video-resolution-profile.dto.js.map +1 -0
  311. package/dist/video-resolution-profile/video-resolution-profile.controller.d.ts +38 -0
  312. package/dist/video-resolution-profile/video-resolution-profile.controller.d.ts.map +1 -0
  313. package/dist/video-resolution-profile/video-resolution-profile.controller.js +89 -0
  314. package/dist/video-resolution-profile/video-resolution-profile.controller.js.map +1 -0
  315. package/dist/video-resolution-profile/video-resolution-profile.mcp-tools.d.ts +26 -0
  316. package/dist/video-resolution-profile/video-resolution-profile.mcp-tools.d.ts.map +1 -0
  317. package/dist/video-resolution-profile/video-resolution-profile.mcp-tools.js +160 -0
  318. package/dist/video-resolution-profile/video-resolution-profile.mcp-tools.js.map +1 -0
  319. package/dist/video-resolution-profile/video-resolution-profile.module.d.ts +3 -0
  320. package/dist/video-resolution-profile/video-resolution-profile.module.d.ts.map +1 -0
  321. package/dist/video-resolution-profile/video-resolution-profile.module.js +26 -0
  322. package/dist/video-resolution-profile/video-resolution-profile.module.js.map +1 -0
  323. package/dist/video-resolution-profile/video-resolution-profile.service.d.ts +45 -0
  324. package/dist/video-resolution-profile/video-resolution-profile.service.d.ts.map +1 -0
  325. package/dist/video-resolution-profile/video-resolution-profile.service.js +117 -0
  326. package/dist/video-resolution-profile/video-resolution-profile.service.js.map +1 -0
  327. package/hedhog/data/integration_event_catalog.yaml +69 -0
  328. package/hedhog/data/menu.yaml +51 -0
  329. package/hedhog/data/route.yaml +2484 -0
  330. package/hedhog/data/video_resolution_profile.yaml +7 -0
  331. package/hedhog/frontend/app/_components/class-form-sheet.tsx.ejs +432 -422
  332. package/hedhog/frontend/app/_components/course-form-sheet.tsx.ejs +200 -67
  333. package/hedhog/frontend/app/_components/course-picker.tsx.ejs +228 -0
  334. package/hedhog/frontend/app/_components/create-lms-instructor-sheet.tsx.ejs +7 -4
  335. package/hedhog/frontend/app/_components/create-lms-person-sheet.tsx.ejs +2 -2
  336. package/hedhog/frontend/app/_components/create-lms-student-person-sheet.tsx.ejs +2 -2
  337. package/hedhog/frontend/app/_lib/editor/templateSerializer.ts.ejs +34 -4
  338. package/hedhog/frontend/app/_lib/editor/types.ts.ejs +28 -3
  339. package/hedhog/frontend/app/_lib/hooks/use-lms-realtime-refresh.ts.ejs +58 -0
  340. package/hedhog/frontend/app/achievements/page.tsx.ejs +850 -0
  341. package/hedhog/frontend/app/bitcodes/page.tsx.ejs +1016 -0
  342. package/hedhog/frontend/app/certificates/issued/page.tsx.ejs +68 -5
  343. package/hedhog/frontend/app/certificates/models/CanvasStage.tsx.ejs +29 -8
  344. package/hedhog/frontend/app/certificates/models/LeftPanel.tsx.ejs +14 -0
  345. package/hedhog/frontend/app/certificates/models/RightPanel.tsx.ejs +194 -9
  346. package/hedhog/frontend/app/certificates/models/page.tsx.ejs +15 -5
  347. package/hedhog/frontend/app/classes/[id]/page.tsx.ejs +16 -5
  348. package/hedhog/frontend/app/classes/page.tsx.ejs +126 -2105
  349. package/hedhog/frontend/app/courses/[id]/_components/CourseCertificateCard.tsx.ejs +19 -9
  350. package/hedhog/frontend/app/courses/[id]/_components/CourseClassificationCard.tsx.ejs +24 -1
  351. package/hedhog/frontend/app/courses/[id]/_components/CourseContentCard.tsx.ejs +1 -1
  352. package/hedhog/frontend/app/courses/[id]/_components/CourseMainInfoCard.tsx.ejs +1 -1
  353. package/hedhog/frontend/app/courses/[id]/_components/CourseRelationsCard.tsx.ejs +51 -11
  354. package/hedhog/frontend/app/courses/[id]/_components/CourseSectionCard.tsx.ejs +11 -6
  355. package/hedhog/frontend/app/courses/[id]/_components/CourseSummaryCard.tsx.ejs +7 -4
  356. package/hedhog/frontend/app/courses/[id]/_components/course-edit-types.ts.ejs +2 -0
  357. package/hedhog/frontend/app/courses/[id]/page.tsx.ejs +24 -96
  358. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree-dnd.tsx.ejs +80 -66
  359. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-course.tsx.ejs +1286 -230
  360. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-lesson.tsx.ejs +1334 -153
  361. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-session.tsx.ejs +11 -11
  362. package/hedhog/frontend/app/courses/[id]/structure/_components/mock-data.ts.ejs +1 -1
  363. package/hedhog/frontend/app/courses/[id]/structure/_components/shortcuts-help.tsx.ejs +62 -52
  364. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-context-menu.tsx.ejs +106 -4
  365. package/hedhog/frontend/app/courses/[id]/structure/_components/types.ts.ejs +4 -1
  366. package/hedhog/frontend/app/courses/[id]/structure/_data/adapters/course-structure.adapter.ts.ejs +30 -7
  367. package/hedhog/frontend/app/courses/[id]/structure/_data/services/course-structure.service.ts.ejs +138 -6
  368. package/hedhog/frontend/app/courses/[id]/structure/_data/types/api-course.types.ts.ejs +16 -2
  369. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-structure-mutations.ts.ejs +1 -0
  370. package/hedhog/frontend/app/courses/page.tsx.ejs +282 -113
  371. package/hedhog/frontend/app/enterprise/[id]/page.tsx.ejs +1 -1
  372. package/hedhog/frontend/app/enterprise/_components/enterprise-admin-create-sheet.tsx.ejs +10 -3
  373. package/hedhog/frontend/app/enterprise/_components/enterprise-course-create-sheet.tsx.ejs +3 -0
  374. package/hedhog/frontend/app/enterprise/_components/enterprise-course-edit-sheet.tsx.ejs +7 -0
  375. package/hedhog/frontend/app/enterprise/_components/enterprise-detail-sheet.tsx.ejs +8 -4
  376. package/hedhog/frontend/app/enterprise/_components/enterprise-person-edit-sheet.tsx.ejs +2 -2
  377. package/hedhog/frontend/app/enterprise/_components/enterprise-sheet.tsx.ejs +10 -4
  378. package/hedhog/frontend/app/enterprise/_components/enterprise-student-create-sheet.tsx.ejs +10 -3
  379. package/hedhog/frontend/app/enterprise/_components/enterprise-user-create-sheet.tsx.ejs +10 -3
  380. package/hedhog/frontend/app/evaluations/_components/evaluation-topic-form-sheet.tsx.ejs +10 -3
  381. package/hedhog/frontend/app/exams/[id]/questions/page.tsx.ejs +186 -5
  382. package/hedhog/frontend/app/exams/page.tsx.ejs +89 -26
  383. package/hedhog/frontend/app/instructor-skills/page.tsx.ejs +10 -3
  384. package/hedhog/frontend/app/instructors/_components/instructor-form-sheet.tsx.ejs +190 -17
  385. package/hedhog/frontend/app/instructors/page.tsx.ejs +1 -0
  386. package/hedhog/frontend/app/layout.tsx.ejs +5 -1
  387. package/hedhog/frontend/app/paths/page.tsx.ejs +19 -29
  388. package/hedhog/frontend/app/reports/evaluations/page.tsx.ejs +10 -10
  389. package/hedhog/frontend/app/training/page.tsx.ejs +19 -29
  390. package/hedhog/frontend/app/video-resolution-profiles/page.tsx.ejs +607 -0
  391. package/hedhog/frontend/messages/en.json +563 -20
  392. package/hedhog/frontend/messages/pt.json +563 -20
  393. package/hedhog/query/triggers.sql +53 -0
  394. package/hedhog/table/achievement.yaml +46 -0
  395. package/hedhog/table/bitcode_wallet.yaml +18 -0
  396. package/hedhog/table/bitcode_wallet_transaction.yaml +22 -0
  397. package/hedhog/table/certificate.yaml +3 -0
  398. package/hedhog/table/course.yaml +8 -0
  399. package/hedhog/table/course_file.yaml +23 -0
  400. package/hedhog/table/course_lesson.yaml +5 -0
  401. package/hedhog/table/course_lesson_discussion_like.yaml +21 -0
  402. package/hedhog/table/course_lesson_discussion_topic.yaml +35 -0
  403. package/hedhog/table/course_lesson_file.yaml +8 -0
  404. package/hedhog/table/course_lesson_note.yaml +34 -0
  405. package/hedhog/table/course_video_resolution_profile.yaml +22 -0
  406. package/hedhog/table/exam.yaml +5 -0
  407. package/hedhog/table/learning_path_enrollment.yaml +6 -0
  408. package/hedhog/table/question.yaml +10 -0
  409. package/hedhog/table/question_subject.yaml +17 -0
  410. package/hedhog/table/student_activity_streak.yaml +25 -0
  411. package/hedhog/table/video_resolution_profile.yaml +18 -0
  412. package/package.json +8 -7
  413. package/src/achievement/achievement.controller.ts +60 -0
  414. package/src/achievement/achievement.mcp-tools.ts +108 -0
  415. package/src/achievement/achievement.module.ts +13 -0
  416. package/src/achievement/achievement.service.ts +252 -0
  417. package/src/achievement/dto/create-achievement.dto.ts +50 -0
  418. package/src/achievement/dto/update-achievement.dto.ts +47 -0
  419. package/src/bitcode-wallet/bitcode-wallet.controller.ts +69 -0
  420. package/src/bitcode-wallet/bitcode-wallet.mcp-tools.ts +107 -0
  421. package/src/bitcode-wallet/bitcode-wallet.module.ts +13 -0
  422. package/src/bitcode-wallet/bitcode-wallet.service.ts +361 -0
  423. package/src/bitcode-wallet/dto/create-bitcode-wallet-transaction.dto.ts +27 -0
  424. package/src/bitcode-wallet/dto/create-bitcode-wallet.dto.ts +7 -0
  425. package/src/bitcode-wallet/dto/update-bitcode-wallet-transaction.dto.ts +28 -0
  426. package/src/bitcode-wallet/dto/update-bitcode-wallet.dto.ts +8 -0
  427. package/src/certificate/certificate.controller.ts +17 -3
  428. package/src/certificate/certificate.mcp-tools.ts +131 -0
  429. package/src/certificate/certificate.module.ts +2 -1
  430. package/src/certificate/certificate.service.ts +193 -7
  431. package/src/certificate/dto/update-certificate-public-access.dto.ts +6 -0
  432. package/src/class-group/class-group.mcp-tools.ts +435 -0
  433. package/src/class-group/class-group.module.ts +2 -1
  434. package/src/class-group/class-group.service.ts +51 -1
  435. package/src/course/course-operations-integration.service.ts +520 -0
  436. package/src/course/course-structure.controller.ts +46 -10
  437. package/src/course/course-structure.service.ts +236 -27
  438. package/src/course/course-video-conversion.service.ts +415 -0
  439. package/src/course/course.controller.ts +18 -0
  440. package/src/course/course.mcp-tools.ts +409 -0
  441. package/src/course/course.module.ts +23 -3
  442. package/src/course/course.service.ts +178 -29
  443. package/src/course/dto/create-course-structure-lesson.dto.ts +13 -2
  444. package/src/course/dto/create-course.dto.ts +16 -0
  445. package/src/course/dto/update-course-resources.dto.ts +39 -0
  446. package/src/course-lesson-discussion/course-lesson-discussion.controller.ts +55 -0
  447. package/src/course-lesson-discussion/course-lesson-discussion.mcp-tools.ts +75 -0
  448. package/src/course-lesson-discussion/course-lesson-discussion.module.ts +13 -0
  449. package/src/course-lesson-discussion/course-lesson-discussion.service.ts +354 -0
  450. package/src/course-lesson-discussion/dto/create-course-lesson-discussion-topic.dto.ts +16 -0
  451. package/src/course-lesson-note/course-lesson-note.controller.ts +68 -0
  452. package/src/course-lesson-note/course-lesson-note.mcp-tools.ts +96 -0
  453. package/src/course-lesson-note/course-lesson-note.module.ts +13 -0
  454. package/src/course-lesson-note/course-lesson-note.service.ts +248 -0
  455. package/src/course-lesson-note/dto/create-course-lesson-note.dto.ts +16 -0
  456. package/src/course-lesson-note/dto/update-course-lesson-note.dto.ts +18 -0
  457. package/src/dashboard/dashboard.mcp-tools.ts +23 -0
  458. package/src/dashboard/dashboard.module.ts +2 -1
  459. package/src/enterprise/enterprise.controller.ts +0 -1
  460. package/src/enterprise/enterprise.mcp-tools.ts +403 -0
  461. package/src/enterprise/enterprise.module.ts +2 -1
  462. package/src/enterprise/training/enterprise-training.module.ts +11 -1
  463. package/src/enterprise/training/training-admin.mcp-tools.ts +479 -0
  464. package/src/enterprise/training/training-instructor.mcp-tools.ts +210 -0
  465. package/src/enterprise/training/training-student.controller.ts +17 -1
  466. package/src/enterprise/training/training-student.mcp-tools.ts +136 -0
  467. package/src/enterprise/training/training-student.service.ts +167 -1
  468. package/src/evaluation/evaluation.mcp-tools.ts +155 -0
  469. package/src/evaluation/evaluation.module.ts +2 -1
  470. package/src/evaluation/evaluation.service.ts +9 -2
  471. package/src/exam/dto/create-exam-question.dto.ts +8 -0
  472. package/src/exam/dto/create-exam.dto.ts +8 -0
  473. package/src/exam/dto/create-question-subject.dto.ts +12 -0
  474. package/src/exam/exam-attempt.service.ts +46 -14
  475. package/src/exam/exam.controller.ts +19 -0
  476. package/src/exam/exam.mcp-tools.ts +337 -0
  477. package/src/exam/exam.module.ts +2 -1
  478. package/src/exam/exam.service.ts +121 -0
  479. package/src/index.ts +10 -0
  480. package/src/instructor/instructor.mcp-tools.ts +243 -0
  481. package/src/instructor/instructor.module.ts +2 -1
  482. package/src/lms.module.ts +18 -1
  483. package/src/realtime/lms-realtime.controller.ts +12 -0
  484. package/src/realtime/lms-realtime.module.ts +12 -0
  485. package/src/realtime/lms-realtime.service.ts +98 -0
  486. package/src/realtime/lms-realtime.subscriber.ts +61 -0
  487. package/src/reports/reports.mcp-tools.ts +27 -0
  488. package/src/reports/reports.module.ts +2 -1
  489. package/src/training/training.mcp-tools.ts +128 -0
  490. package/src/training/training.module.ts +2 -1
  491. package/src/video-resolution-profile/dto/create-video-resolution-profile.dto.ts +16 -0
  492. package/src/video-resolution-profile/dto/update-video-resolution-profile.dto.ts +16 -0
  493. package/src/video-resolution-profile/video-resolution-profile.controller.ts +62 -0
  494. package/src/video-resolution-profile/video-resolution-profile.mcp-tools.ts +128 -0
  495. package/src/video-resolution-profile/video-resolution-profile.module.ts +13 -0
  496. package/src/video-resolution-profile/video-resolution-profile.service.ts +117 -0
@@ -27,8 +27,18 @@ import {
27
27
  DropdownMenuSeparator,
28
28
  DropdownMenuTrigger,
29
29
  } from '@/components/ui/dropdown-menu';
30
+ import { Input } from '@/components/ui/input';
30
31
  import { KpiCardsGrid } from '@/components/ui/kpi-cards-grid';
32
+ import { Label } from '@/components/ui/label';
31
33
  import { Separator } from '@/components/ui/separator';
34
+ import {
35
+ Sheet,
36
+ SheetDescription,
37
+ SheetFooter,
38
+ SheetHeader,
39
+ SheetTitle,
40
+ } from '@/components/ui/sheet';
41
+ import { ResizableSheetContent } from '@/components/ui/resizable-sheet-content';
32
42
  import { Skeleton } from '@/components/ui/skeleton';
33
43
  import {
34
44
  Table,
@@ -38,6 +48,7 @@ import {
38
48
  TableHeader,
39
49
  TableRow,
40
50
  } from '@/components/ui/table';
51
+ import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
41
52
  import { usePersistedViewMode } from '@/hooks/use-persisted-view-mode';
42
53
  import { useApp, useQuery } from '@hed-hog/next-app-provider';
43
54
  import { zodResolver } from '@hookform/resolvers/zod';
@@ -48,8 +59,10 @@ import {
48
59
  Award,
49
60
  BookOpen,
50
61
  Eye,
62
+ Layers,
51
63
  Loader2,
52
64
  MoreHorizontal,
65
+ Paperclip,
53
66
  Pencil,
54
67
  Plus,
55
68
  Star,
@@ -59,8 +72,7 @@ import {
59
72
  } from 'lucide-react';
60
73
  import { useTranslations } from 'next-intl';
61
74
  import { useRouter } from 'next/navigation';
62
- import { useEffect, useMemo, useRef, useState } from 'react';
63
- import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
75
+ import { useEffect, useMemo, useState } from 'react';
64
76
  import { useForm, useWatch } from 'react-hook-form';
65
77
  import { toast } from 'sonner';
66
78
  import { CourseAvatar } from '../_components/course-avatar';
@@ -79,6 +91,7 @@ const API_COURSES_CACHE_KEY = 'lms:courses:api-cache';
79
91
  interface Curso {
80
92
  id: number;
81
93
  slug: string;
94
+ code?: string | null;
82
95
  nomeInterno: string;
83
96
  tituloComercial: string;
84
97
  descricao: string;
@@ -86,19 +99,25 @@ interface Curso {
86
99
  secondaryColor?: string | null;
87
100
  nivel: 'iniciante' | 'intermediario' | 'avancado';
88
101
  status: 'ativo' | 'rascunho' | 'arquivado';
102
+ tipoCurso: 'on_demand' | 'agendado' | 'hibrido';
89
103
  categorias: string[];
90
104
  destaque: boolean;
91
105
  certificado: boolean;
92
106
  listado: boolean;
93
107
  alunosInscritos: number;
108
+ quantidadeSessoes: number;
109
+ quantidadeAulas: number;
110
+ quantidadeRecursos: number;
94
111
  criadoEm: string;
95
112
  logoFileId?: number | null;
113
+ operationsProjectId?: number | null;
96
114
  }
97
115
 
98
116
  type ApiCourse = {
99
117
  id: number;
100
118
  name: string;
101
119
  slug: string;
120
+ code?: string | null;
102
121
  title: string;
103
122
  description: string;
104
123
  primaryColor?: string | null;
@@ -107,13 +126,18 @@ type ApiCourse = {
107
126
  secondaryContrastColor?: string | null;
108
127
  level: 'beginner' | 'intermediate' | 'advanced';
109
128
  status: 'draft' | 'published' | 'archived';
129
+ offeringType?: 'on_demand' | 'scheduled' | 'blended' | null;
110
130
  categories: string[];
111
131
  isFeatured: boolean;
112
132
  hasCertificate: boolean;
113
133
  isListed: boolean;
114
134
  enrollmentCount: number;
135
+ moduleCount: number;
136
+ lessonCount: number;
137
+ resourceCount: number;
115
138
  createdAt: string;
116
139
  logoFileId?: number | null;
140
+ operationsProjectId?: number | null;
117
141
  };
118
142
 
119
143
  type ApiCourseList = {
@@ -180,6 +204,12 @@ function toPtLevel(level?: string | null): CourseSheetFormValues['nivel'] {
180
204
  return 'iniciante';
181
205
  }
182
206
 
207
+ function toPtOfferingType(type?: string | null): Curso['tipoCurso'] {
208
+ if (type === 'scheduled') return 'agendado';
209
+ if (type === 'blended') return 'hibrido';
210
+ return 'on_demand';
211
+ }
212
+
183
213
  function toPtStatus(status?: string | null): CourseSheetFormValues['status'] {
184
214
  const normalizedStatus = normalizeEnumValue(status);
185
215
 
@@ -204,6 +234,7 @@ function mapApiCourse(course: ApiCourse): Curso {
204
234
  return {
205
235
  id: course.id,
206
236
  slug: course.slug,
237
+ code: course.code ?? null,
207
238
  nomeInterno: course.name ?? '',
208
239
  tituloComercial: course.title,
209
240
  descricao: course.description ?? '',
@@ -211,13 +242,18 @@ function mapApiCourse(course: ApiCourse): Curso {
211
242
  secondaryColor: course.secondaryColor ?? null,
212
243
  nivel: toPtLevel(course.level),
213
244
  status: toPtStatus(course.status),
245
+ tipoCurso: toPtOfferingType(course.offeringType),
214
246
  categorias: course.categories ?? [],
215
247
  destaque: course.isFeatured,
216
248
  certificado: course.hasCertificate,
217
249
  listado: course.isListed,
218
250
  alunosInscritos: course.enrollmentCount ?? 0,
251
+ quantidadeSessoes: course.moduleCount ?? 0,
252
+ quantidadeAulas: course.lessonCount ?? 0,
253
+ quantidadeRecursos: course.resourceCount ?? 0,
219
254
  criadoEm: course.createdAt ?? '',
220
255
  logoFileId: course.logoFileId ?? null,
256
+ operationsProjectId: course.operationsProjectId ?? null,
221
257
  };
222
258
  }
223
259
 
@@ -233,6 +269,12 @@ function toApiStatus(status: CourseSheetFormValues['status']) {
233
269
  return 'archived';
234
270
  }
235
271
 
272
+ function toApiOfferingType(type: CourseSheetFormValues['offeringType']) {
273
+ if (type === 'agendado') return 'scheduled';
274
+ if (type === 'hibrido') return 'blended';
275
+ return 'on_demand';
276
+ }
277
+
236
278
  function getContrastColor(hex: string) {
237
279
  const cleaned = hex.replace('#', '');
238
280
  if (cleaned.length !== 6) return '#FFFFFF';
@@ -259,6 +301,20 @@ const STATUS_VARIANT: Record<string, 'default' | 'secondary' | 'outline'> = {
259
301
  arquivado: 'outline',
260
302
  };
261
303
 
304
+ const OFFERING_TYPE_LABEL: Record<string, string> = {
305
+ on_demand: 'On Demand',
306
+ agendado: 'Agendado',
307
+ hibrido: 'Híbrido',
308
+ };
309
+
310
+ const OFFERING_TYPE_COLOR: Record<string, string> = {
311
+ on_demand: 'bg-violet-50 text-violet-700 border-violet-200',
312
+ agendado: 'bg-blue-50 text-blue-700 border-blue-200',
313
+ hibrido: 'bg-teal-50 text-teal-700 border-teal-200',
314
+ };
315
+
316
+ const PAGE_SIZES = [6, 12, 24] as const;
317
+
262
318
  // ── Seed Data ─────────────────────────────────────────────────────────────────
263
319
 
264
320
  // ── Animations ────────────────────────────────────────────────────────────────
@@ -283,7 +339,12 @@ export default function CursosPage() {
283
339
  // UI
284
340
  const [sheetOpen, setSheetOpen] = useState(false);
285
341
  const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
342
+ const [createCategorySheetOpen, setCreateCategorySheetOpen] = useState(false);
286
343
  const [saving, setSaving] = useState(false);
344
+ const [creatingCategory, setCreatingCategory] = useState(false);
345
+ const [newCategoryName, setNewCategoryName] = useState('');
346
+ const [newCategorySlug, setNewCategorySlug] = useState('');
347
+ const [newCategorySlugTouched, setNewCategorySlugTouched] = useState(false);
287
348
 
288
349
  // Data
289
350
  const [editingCurso, setEditingCurso] = useState<Curso | null>(null);
@@ -311,14 +372,9 @@ export default function CursosPage() {
311
372
  const [pageSize, setPageSize] = usePersistedPageSize({
312
373
  storageKey: 'pagination:global:pageSize',
313
374
  defaultValue: 12,
314
- allowedValues: [6, 12, 24],
375
+ allowedValues: PAGE_SIZES,
315
376
  });
316
377
 
317
- // Double-click tracking
318
- const clickTimers = useRef<Map<number, ReturnType<typeof setTimeout>>>(
319
- new Map()
320
- );
321
-
322
378
  const form = useForm<CourseSheetFormValues>({
323
379
  resolver: zodResolver(getCourseSheetSchema(t)),
324
380
  defaultValues: DEFAULT_COURSE_FORM_VALUES,
@@ -490,6 +546,7 @@ export default function CursosPage() {
490
546
  status:
491
547
  (watchedFormValues.status as Curso['status'] | undefined) ??
492
548
  editingCurso.status,
549
+ tipoCurso: watchedFormValues.offeringType ?? editingCurso.tipoCurso,
493
550
  categorias: watchedFormValues.categorias ?? editingCurso.categorias,
494
551
  } satisfies Curso;
495
552
  }, [editingCurso, sheetOpen, watchedFormValues]);
@@ -557,22 +614,6 @@ export default function CursosPage() {
557
614
  setDeleteDialogOpen(true);
558
615
  }
559
616
 
560
- // ── Double-click to navigate ──────────────────────────────────────────────
561
-
562
- function handleCardClick(curso: Curso) {
563
- const existing = clickTimers.current.get(curso.id);
564
- if (existing) {
565
- clearTimeout(existing);
566
- clickTimers.current.delete(curso.id);
567
- router.push(`/lms/courses/${curso.id}`);
568
- } else {
569
- const t = setTimeout(() => {
570
- clickTimers.current.delete(curso.id);
571
- }, 300);
572
- clickTimers.current.set(curso.id, t);
573
- }
574
- }
575
-
576
617
  // ── Selection ─────────────────────────────────────────────────────────────
577
618
 
578
619
  function toggleSelect(id: number, e: React.MouseEvent) {
@@ -602,13 +643,18 @@ export default function CursosPage() {
602
643
  form.reset({
603
644
  nomeInterno: curso.nomeInterno,
604
645
  slug: curso.slug,
646
+ code: curso.code || '',
605
647
  tituloComercial: curso.tituloComercial,
606
648
  descricao: curso.descricao,
607
649
  primaryColor: curso.primaryColor || '#1D4ED8',
608
650
  secondaryColor: curso.secondaryColor || '#111827',
609
651
  nivel: curso.nivel,
610
652
  status: curso.status,
653
+ offeringType: curso.tipoCurso,
611
654
  categorias: curso.categorias,
655
+ operationsProjectId: curso.operationsProjectId
656
+ ? String(curso.operationsProjectId)
657
+ : '',
612
658
  logoFileId: curso.logoFileId ?? null,
613
659
  });
614
660
  setSheetOpen(true);
@@ -620,15 +666,20 @@ export default function CursosPage() {
620
666
  const payload = {
621
667
  name: data.nomeInterno.trim(),
622
668
  slug: data.slug.trim().toLowerCase(),
669
+ code: data.code?.trim() || undefined,
623
670
  title: data.tituloComercial,
624
671
  description: data.descricao,
625
672
  level: toApiLevel(data.nivel),
626
673
  status: toApiStatus(data.status),
674
+ offeringType: toApiOfferingType(data.offeringType),
627
675
  categorySlugs: data.categorias,
628
676
  primaryColor: data.primaryColor,
629
677
  primaryContrastColor: getContrastColor(data.primaryColor),
630
678
  secondaryColor: data.secondaryColor,
631
679
  secondaryContrastColor: getContrastColor(data.secondaryColor),
680
+ operationsProjectId: data.operationsProjectId
681
+ ? Number(data.operationsProjectId)
682
+ : null,
632
683
  logoFileId: data.logoFileId ?? null,
633
684
  };
634
685
 
@@ -729,7 +780,7 @@ export default function CursosPage() {
729
780
  },
730
781
  ];
731
782
 
732
- const { locales } = useApp();
783
+ const { locales, currentLocaleCode } = useApp();
733
784
 
734
785
  const handleNewCourse = (): void => {
735
786
  const nextLocaleData: Record<string, { name: string }> = {};
@@ -742,6 +793,76 @@ export default function CursosPage() {
742
793
  openCreateSheet();
743
794
  };
744
795
 
796
+ useEffect(() => {
797
+ if (newCategorySlugTouched) return;
798
+
799
+ const generatedSlug = newCategoryName
800
+ .trim()
801
+ .toLowerCase()
802
+ .normalize('NFD')
803
+ .replace(/[\u0300-\u036f]/g, '')
804
+ .replace(/[^a-z0-9]+/g, '-')
805
+ .replace(/^-+|-+$/g, '');
806
+
807
+ setNewCategorySlug(generatedSlug);
808
+ }, [newCategoryName, newCategorySlugTouched]);
809
+
810
+ function openCreateCategorySheet() {
811
+ setNewCategoryName('');
812
+ setNewCategorySlug('');
813
+ setNewCategorySlugTouched(false);
814
+ setCreateCategorySheetOpen(true);
815
+ }
816
+
817
+ async function handleCreateCategory() {
818
+ const trimmedName = newCategoryName.trim();
819
+ const trimmedSlug = newCategorySlug.trim().toLowerCase();
820
+
821
+ if (!trimmedName || !trimmedSlug) {
822
+ toast.error('Informe nome e slug da categoria.');
823
+ return;
824
+ }
825
+
826
+ const localeCode = currentLocaleCode || locales[0]?.code || 'pt-BR';
827
+
828
+ setCreatingCategory(true);
829
+ try {
830
+ const response = await request<{ slug?: string }>({
831
+ url: '/category',
832
+ method: 'POST',
833
+ data: {
834
+ locale: {
835
+ [localeCode]: {
836
+ name: trimmedName,
837
+ },
838
+ },
839
+ slug: trimmedSlug,
840
+ category_id: null,
841
+ color: '#000000',
842
+ icon: '',
843
+ status: 'active',
844
+ },
845
+ });
846
+
847
+ const createdSlug = response.data?.slug || trimmedSlug;
848
+ const existingCategories = form.getValues('categorias') ?? [];
849
+ if (!existingCategories.includes(createdSlug)) {
850
+ form.setValue('categorias', [...existingCategories, createdSlug], {
851
+ shouldDirty: true,
852
+ shouldTouch: true,
853
+ });
854
+ }
855
+
856
+ await refetchCategoryOptions();
857
+ setCreateCategorySheetOpen(false);
858
+ toast.success('Categoria criada com sucesso.');
859
+ } catch {
860
+ toast.error('Nao foi possivel criar a categoria.');
861
+ } finally {
862
+ setCreatingCategory(false);
863
+ }
864
+ }
865
+
745
866
  // ── Render ────────────────────────────────────────────────────────────────
746
867
 
747
868
  return (
@@ -957,17 +1078,21 @@ export default function CursosPage() {
957
1078
  <div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
958
1079
  {Array.from({ length: 6 }).map((_, i) => (
959
1080
  <Card key={i} className="overflow-hidden">
960
- <CardContent className="p-5">
961
- <div className="mb-3 flex items-start justify-between">
962
- <Skeleton className="h-5 w-20 rounded-full" />
963
- <Skeleton className="size-8 rounded-md" />
1081
+ <CardContent className="p-3">
1082
+ <div className="flex items-start gap-2.5">
1083
+ <Skeleton className="size-10 shrink-0 rounded-lg" />
1084
+ <div className="flex-1 space-y-2">
1085
+ <Skeleton className="h-4 w-3/4" />
1086
+ <div className="flex gap-1.5">
1087
+ <Skeleton className="h-4 w-16 rounded-full" />
1088
+ <Skeleton className="h-4 w-14 rounded-full" />
1089
+ </div>
1090
+ </div>
964
1091
  </div>
965
- <Skeleton className="mb-1.5 h-5 w-3/4" />
966
- <Skeleton className="mb-4 h-4 w-full" />
967
- <Skeleton className="mb-4 h-4 w-2/3" />
968
- <div className="flex gap-2">
969
- <Skeleton className="h-6 w-16 rounded-full" />
970
- <Skeleton className="h-6 w-20 rounded-full" />
1092
+ <div className="mt-3 flex gap-4 border-t border-border/50 pt-2.5">
1093
+ <Skeleton className="h-3.5 w-12" />
1094
+ <Skeleton className="h-3.5 w-14" />
1095
+ <Skeleton className="h-3.5 w-10" />
971
1096
  </div>
972
1097
  </CardContent>
973
1098
  </Card>
@@ -1045,7 +1170,6 @@ export default function CursosPage() {
1045
1170
  animate="show"
1046
1171
  >
1047
1172
  {paginatedCursos.map((curso) => {
1048
- const nivelColor = NIVEL_COLOR[curso.nivel];
1049
1173
  const statusVariant = STATUS_VARIANT[curso.status];
1050
1174
  const isSelected = selectedIds.has(curso.id);
1051
1175
 
@@ -1057,7 +1181,9 @@ export default function CursosPage() {
1057
1181
  >
1058
1182
  <Card
1059
1183
  className={`group relative flex h-full cursor-pointer flex-col overflow-hidden border-border/70 shadow-sm transition-all duration-200 hover:border-border hover:shadow-md ${isSelected ? 'ring-2 ring-primary ring-offset-2' : ''}`}
1060
- onClick={() => handleCardClick(curso)}
1184
+ onDoubleClick={() =>
1185
+ router.push(`/lms/courses/${curso.id}`)
1186
+ }
1061
1187
  title={t('cards.tooltip')}
1062
1188
  >
1063
1189
  <div
@@ -1082,17 +1208,17 @@ export default function CursosPage() {
1082
1208
  />
1083
1209
  </div>
1084
1210
 
1085
- <CardContent className="flex h-full flex-col p-4">
1086
- <div className="mb-3 flex items-start gap-3">
1211
+ <CardContent className="flex flex-col p-3">
1212
+ <div className="flex items-start gap-2.5">
1087
1213
  <CourseAvatar
1088
1214
  fileId={curso.logoFileId}
1089
1215
  title={curso.nomeInterno}
1090
- className="size-12 rounded-xl"
1091
- iconSize="size-6"
1216
+ className="size-10 shrink-0 rounded-lg"
1217
+ iconSize="size-5"
1092
1218
  />
1093
1219
  <div className="min-w-0 flex-1">
1094
- <div className="mb-1.5 flex items-start justify-between gap-2">
1095
- <h3 className="line-clamp-2 font-semibold leading-snug text-foreground">
1220
+ <div className="flex items-start justify-between gap-1">
1221
+ <h3 className="line-clamp-1 text-sm font-semibold leading-snug text-foreground">
1096
1222
  {curso.nomeInterno}
1097
1223
  </h3>
1098
1224
  <DropdownMenu>
@@ -1100,11 +1226,11 @@ export default function CursosPage() {
1100
1226
  <Button
1101
1227
  variant="ghost"
1102
1228
  size="icon"
1103
- className="size-8 shrink-0 -mr-2 -mt-1"
1229
+ className="-mr-1.5 -mt-0.5 size-7 shrink-0"
1104
1230
  onClick={(e) => e.stopPropagation()}
1105
1231
  aria-label={t('table.actions.label')}
1106
1232
  >
1107
- <MoreHorizontal className="size-4" />
1233
+ <MoreHorizontal className="size-3.5" />
1108
1234
  </Button>
1109
1235
  </DropdownMenuTrigger>
1110
1236
  <DropdownMenuContent
@@ -1137,76 +1263,39 @@ export default function CursosPage() {
1137
1263
  </DropdownMenuContent>
1138
1264
  </DropdownMenu>
1139
1265
  </div>
1140
- <p className="text-xs text-muted-foreground">
1141
- <code className="rounded bg-muted px-1.5 py-0.5 font-mono text-[10px]">
1142
- {curso.slug}
1143
- </code>
1144
- <span className="mx-1.5 text-muted-foreground/50">
1145
- |
1266
+
1267
+ <div className="mt-1.5 flex flex-wrap items-center gap-1">
1268
+ <span
1269
+ className={`inline-flex items-center rounded-full border px-2 py-0.5 text-[10px] font-medium ${OFFERING_TYPE_COLOR[curso.tipoCurso]}`}
1270
+ >
1271
+ {OFFERING_TYPE_LABEL[curso.tipoCurso]}
1146
1272
  </span>
1147
- <span>{curso.tituloComercial}</span>
1148
- </p>
1273
+ <Badge
1274
+ variant={statusVariant}
1275
+ className="rounded-full px-2 py-0.5 text-[10px]"
1276
+ >
1277
+ {getStatusLabel(curso)}
1278
+ </Badge>
1279
+ </div>
1149
1280
  </div>
1150
1281
  </div>
1151
1282
 
1152
- <div className="mb-3 flex flex-wrap items-center gap-1.5">
1153
- <span
1154
- className={`inline-flex items-center rounded-full border px-2.5 py-0.5 text-[11px] font-medium ${nivelColor}`}
1155
- >
1156
- {getLevelLabel(curso)}
1283
+ <div className="mt-3 flex items-center gap-3 border-t border-border/50 pt-2.5 text-xs text-muted-foreground">
1284
+ <span className="flex items-center gap-1">
1285
+ <Layers className="size-3.5 shrink-0" />
1286
+ <span className="font-medium text-foreground">{curso.quantidadeSessoes}</span>
1287
+ {' '}sess.
1288
+ </span>
1289
+ <span className="flex items-center gap-1">
1290
+ <BookOpen className="size-3.5 shrink-0" />
1291
+ <span className="font-medium text-foreground">{curso.quantidadeAulas}</span>
1292
+ {' '}aulas
1293
+ </span>
1294
+ <span className="flex items-center gap-1">
1295
+ <Paperclip className="size-3.5 shrink-0" />
1296
+ <span className="font-medium text-foreground">{curso.quantidadeRecursos}</span>
1297
+ {' '}rec.
1157
1298
  </span>
1158
- <Badge
1159
- variant={statusVariant}
1160
- className="text-[11px]"
1161
- >
1162
- {getStatusLabel(curso)}
1163
- </Badge>
1164
- {curso.destaque && (
1165
- <span className="inline-flex items-center gap-1 rounded-full border border-amber-200 bg-amber-50 px-2.5 py-0.5 text-[11px] font-medium text-amber-700">
1166
- <Star className="size-3 fill-amber-400 text-amber-400" />{' '}
1167
- {t('form.flags.featured.label')}
1168
- </span>
1169
- )}
1170
- </div>
1171
-
1172
- <p className="mb-4 line-clamp-2 text-sm leading-relaxed text-muted-foreground">
1173
- {curso.descricao}
1174
- </p>
1175
-
1176
- <div className="mb-4 flex flex-wrap gap-1.5">
1177
- {curso.categorias.slice(0, 3).map((cat) => (
1178
- <span
1179
- key={cat}
1180
- className="rounded-md bg-muted/80 px-2 py-0.5 text-[11px] font-medium text-muted-foreground"
1181
- >
1182
- {categoryLabelBySlug[cat] || cat}
1183
- </span>
1184
- ))}
1185
- {curso.categorias.length > 3 && (
1186
- <span className="rounded-md bg-muted/60 px-2 py-0.5 text-[11px] text-muted-foreground">
1187
- +{curso.categorias.length - 3}
1188
- </span>
1189
- )}
1190
- </div>
1191
-
1192
- <div className="mt-auto flex items-center justify-between rounded-lg bg-muted/40 px-3 py-2.5">
1193
- <div className="flex items-center gap-1.5">
1194
- <Users className="size-4 text-muted-foreground" />
1195
- <span className="text-sm font-medium">
1196
- {curso.alunosInscritos.toLocaleString('pt-BR')}
1197
- </span>
1198
- <span className="text-xs text-muted-foreground">
1199
- {t('cards.studentsLabel')}
1200
- </span>
1201
- </div>
1202
- {curso.certificado && (
1203
- <div className="flex items-center gap-1.5">
1204
- <Award className="size-4 text-foreground" />
1205
- <span className="text-xs font-medium">
1206
- {t('form.flags.certificate.label')}
1207
- </span>
1208
- </div>
1209
- )}
1210
1299
  </div>
1211
1300
  </CardContent>
1212
1301
  </Card>
@@ -1243,7 +1332,9 @@ export default function CursosPage() {
1243
1332
  key={curso.id}
1244
1333
  className="cursor-pointer"
1245
1334
  data-state={isSelected ? 'selected' : undefined}
1246
- onClick={() => handleCardClick(curso)}
1335
+ onDoubleClick={() =>
1336
+ router.push(`/lms/courses/${curso.id}`)
1337
+ }
1247
1338
  title={t('cards.tooltip')}
1248
1339
  >
1249
1340
  <TableCell onClick={(e) => e.stopPropagation()}>
@@ -1388,7 +1479,7 @@ export default function CursosPage() {
1388
1479
  setPageSize(nextPageSize);
1389
1480
  setCurrentPage(1);
1390
1481
  }}
1391
- pageSizeOptions={[6, 12, 24]}
1482
+ pageSizeOptions={PAGE_SIZES}
1392
1483
  selectedCount={selectedIds.size}
1393
1484
  />
1394
1485
  </div>
@@ -1407,11 +1498,89 @@ export default function CursosPage() {
1407
1498
  form={form}
1408
1499
  onSubmit={onSubmit}
1409
1500
  categories={categoryOptions}
1410
- onCreateCategory={() => router.push('/category?new=1')}
1501
+ onCreateCategory={openCreateCategorySheet}
1411
1502
  initialLogoFileId={editingCurso?.logoFileId ?? null}
1412
1503
  t={t}
1413
1504
  />
1414
1505
 
1506
+ <Sheet
1507
+ open={createCategorySheetOpen}
1508
+ onOpenChange={(open) => {
1509
+ setCreateCategorySheetOpen(open);
1510
+ if (!open) {
1511
+ setNewCategoryName('');
1512
+ setNewCategorySlug('');
1513
+ setNewCategorySlugTouched(false);
1514
+ }
1515
+ }}
1516
+ >
1517
+ <ResizableSheetContent
1518
+ sheetId="lms-courses-create-category-sheet"
1519
+ defaultWidth={520}
1520
+ minWidth={400}
1521
+ maxWidth={860}
1522
+ side="right"
1523
+ className="w-full sm:max-w-md"
1524
+ >
1525
+ <SheetHeader>
1526
+ <SheetTitle>{t('form.fields.categories.createAction')}</SheetTitle>
1527
+ <SheetDescription>
1528
+ Crie uma categoria sem sair do cadastro de curso.
1529
+ </SheetDescription>
1530
+ </SheetHeader>
1531
+
1532
+ <div className="space-y-4 px-4">
1533
+ <div className="space-y-2">
1534
+ <Label htmlFor="new-category-name">Nome</Label>
1535
+ <Input
1536
+ id="new-category-name"
1537
+ value={newCategoryName}
1538
+ onChange={(event) => setNewCategoryName(event.target.value)}
1539
+ placeholder="Ex.: Desenvolvimento Web"
1540
+ />
1541
+ </div>
1542
+
1543
+ <div className="space-y-2">
1544
+ <Label htmlFor="new-category-slug">Slug</Label>
1545
+ <Input
1546
+ id="new-category-slug"
1547
+ value={newCategorySlug}
1548
+ onChange={(event) => {
1549
+ setNewCategorySlugTouched(true);
1550
+ setNewCategorySlug(event.target.value);
1551
+ }}
1552
+ placeholder="desenvolvimento-web"
1553
+ />
1554
+ </div>
1555
+ </div>
1556
+
1557
+ <SheetFooter>
1558
+ <Button
1559
+ type="button"
1560
+ variant="outline"
1561
+ onClick={() => setCreateCategorySheetOpen(false)}
1562
+ disabled={creatingCategory}
1563
+ >
1564
+ {t('deleteDialog.actions.cancel')}
1565
+ </Button>
1566
+ <Button
1567
+ type="button"
1568
+ onClick={handleCreateCategory}
1569
+ disabled={creatingCategory}
1570
+ >
1571
+ {creatingCategory ? (
1572
+ <>
1573
+ <Loader2 className="mr-2 size-4 animate-spin" />
1574
+ Criando...
1575
+ </>
1576
+ ) : (
1577
+ t('form.fields.categories.createAction')
1578
+ )}
1579
+ </Button>
1580
+ </SheetFooter>
1581
+ </ResizableSheetContent>
1582
+ </Sheet>
1583
+
1415
1584
  {/* ── Delete dialog ────────────────────���────────────────────────────── */}
1416
1585
  <Dialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>
1417
1586
  <DialogContent className="max-w-3xl">
@@ -101,7 +101,7 @@ function CrmTab({
101
101
  <Button
102
102
  variant="outline"
103
103
  size="sm"
104
- onClick={() => router.push('/contact/accounts')}
104
+ onClick={() => router.push('/crm/accounts')}
105
105
  className="shrink-0"
106
106
  >
107
107
  <ExternalLink className="mr-2 h-4 w-4" />