@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
@@ -15,6 +15,7 @@ import {
15
15
  FieldError,
16
16
  FieldLabel,
17
17
  } from '@/components/ui/field';
18
+ import { EntityPicker } from '@/components/ui/entity-picker';
18
19
  import { Input } from '@/components/ui/input';
19
20
  import {
20
21
  Popover,
@@ -30,14 +31,14 @@ import {
30
31
  } from '@/components/ui/select';
31
32
  import {
32
33
  Sheet,
33
- SheetContent,
34
34
  SheetDescription,
35
35
  SheetFooter,
36
36
  SheetHeader,
37
37
  SheetTitle,
38
38
  } from '@/components/ui/sheet';
39
+ import { ResizableSheetContent } from '@/components/ui/resizable-sheet-content';
39
40
  import { Textarea } from '@/components/ui/textarea';
40
- import { useApp } from '@hed-hog/next-app-provider';
41
+ import { useApp, useQuery } from '@hed-hog/next-app-provider';
41
42
  import {
42
43
  ChevronsUpDown,
43
44
  ImageIcon,
@@ -55,6 +56,15 @@ export type CourseCategoryOption = {
55
56
  label: string;
56
57
  };
57
58
 
59
+ type OperationsProjectOption = {
60
+ id: number;
61
+ code?: string | null;
62
+ name: string;
63
+ label?: string;
64
+ clientName?: string | null;
65
+ status?: string | null;
66
+ };
67
+
58
68
  // ---------------------------------------------------------------------------
59
69
  // Color extraction utilities
60
70
  // ---------------------------------------------------------------------------
@@ -217,11 +227,18 @@ export function getCourseSheetSchema(t: (key: string) => string) {
217
227
  slug: z
218
228
  .string()
219
229
  .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, t('form.validation.slugPattern')),
230
+ code: z
231
+ .string()
232
+ .regex(/^[A-Z0-9]{2,}$/, t('form.validation.editionCodePattern'))
233
+ .or(z.literal(''))
234
+ .optional(),
220
235
  tituloComercial: z.string().optional(),
221
236
  descricao: z.string().optional(),
222
237
  nivel: z.enum(['iniciante', 'intermediario', 'avancado']).optional(),
223
238
  status: z.enum(['ativo', 'rascunho', 'arquivado']).optional(),
239
+ offeringType: z.enum(['on_demand', 'agendado', 'hibrido']).optional(),
224
240
  categorias: z.array(z.string()).optional(),
241
+ operationsProjectId: z.string().optional(),
225
242
  primaryColor: z.string().optional(),
226
243
  secondaryColor: z.string().optional(),
227
244
  logoFileId: z.number().nullable().optional(),
@@ -231,11 +248,14 @@ export function getCourseSheetSchema(t: (key: string) => string) {
231
248
  export type CourseSheetFormValues = {
232
249
  nomeInterno: string;
233
250
  slug: string;
251
+ code: string;
234
252
  tituloComercial: string;
235
253
  descricao: string;
236
254
  nivel: 'iniciante' | 'intermediario' | 'avancado';
237
255
  status: 'ativo' | 'rascunho' | 'arquivado';
256
+ offeringType: 'on_demand' | 'agendado' | 'hibrido';
238
257
  categorias: string[];
258
+ operationsProjectId: string;
239
259
  primaryColor: string;
240
260
  secondaryColor: string;
241
261
  logoFileId?: number | null;
@@ -244,11 +264,14 @@ export type CourseSheetFormValues = {
244
264
  export const DEFAULT_COURSE_FORM_VALUES: CourseSheetFormValues = {
245
265
  nomeInterno: '',
246
266
  slug: '',
267
+ code: '',
247
268
  tituloComercial: '',
248
269
  descricao: '',
249
270
  nivel: 'iniciante',
250
271
  status: 'rascunho',
272
+ offeringType: 'on_demand',
251
273
  categorias: [],
274
+ operationsProjectId: '',
252
275
  primaryColor: '#1D4ED8',
253
276
  secondaryColor: '#111827',
254
277
  logoFileId: null,
@@ -312,6 +335,36 @@ export function CourseFormSheet({
312
335
  const [colorExtracting, setColorExtracting] = useState(false);
313
336
  const logoInputRef = useRef<HTMLInputElement>(null);
314
337
  const colorExtractionRef = useRef<{ cancelled: boolean } | null>(null);
338
+ const { data: operationsProjectsData } = useQuery<
339
+ { data: OperationsProjectOption[] } | OperationsProjectOption[]
340
+ >({
341
+ queryKey: ['lms-course-form-operations-projects'],
342
+ enabled: open,
343
+ queryFn: async () => {
344
+ try {
345
+ const response = await request<
346
+ { data: OperationsProjectOption[] } | OperationsProjectOption[]
347
+ >({
348
+ url: '/operations/projects/options?pageSize=200&sortField=name&sortOrder=asc',
349
+ method: 'GET',
350
+ });
351
+ return response.data;
352
+ } catch {
353
+ return { data: [] };
354
+ }
355
+ },
356
+ initialData: { data: [] },
357
+ });
358
+ const operationsProjectOptions = (
359
+ Array.isArray(operationsProjectsData)
360
+ ? operationsProjectsData
361
+ : (operationsProjectsData?.data ?? [])
362
+ ).map((project) => ({
363
+ value: String(project.id),
364
+ label: project.name,
365
+ description: project.code ?? project.clientName ?? null,
366
+ meta: project.status ?? null,
367
+ }));
315
368
 
316
369
  useEffect(() => {
317
370
  if (!initialLogoFileId) {
@@ -396,7 +449,11 @@ export function CourseFormSheet({
396
449
 
397
450
  return (
398
451
  <Sheet open={open} onOpenChange={onOpenChange}>
399
- <SheetContent
452
+ <ResizableSheetContent
453
+ sheetId="lms-course-form-sheet"
454
+ defaultWidth={560}
455
+ minWidth={420}
456
+ maxWidth={920}
400
457
  side="right"
401
458
  className="flex w-full flex-col sm:max-w-lg overflow-y-auto"
402
459
  >
@@ -413,61 +470,80 @@ export function CourseFormSheet({
413
470
 
414
471
  <form
415
472
  onSubmit={form.handleSubmit(onSubmit)}
416
- className="flex flex-1 flex-col gap-5 py-6 px-4"
473
+ className="flex flex-1 flex-col gap-4 py-4 px-4"
417
474
  >
418
- <Field>
419
- <FieldLabel htmlFor="nomeInterno">
420
- {t('form.fields.internalName.label')}{' '}
421
- <span className="text-destructive">*</span>
422
- </FieldLabel>
423
- <Input
424
- id="nomeInterno"
425
- placeholder={t('form.fields.internalName.placeholder')}
426
- {...form.register('nomeInterno')}
427
- />
428
- <FieldDescription>
429
- {t('form.fields.internalName.description')}
430
- </FieldDescription>
431
- <FieldError>
432
- {form.formState.errors.nomeInterno?.message}
433
- </FieldError>
434
- </Field>
475
+ {/* Internal name + Slug */}
476
+ <div className="grid grid-cols-2 gap-3">
477
+ <Field>
478
+ <FieldLabel htmlFor="nomeInterno">
479
+ {t('form.fields.internalName.label')}{' '}
480
+ <span className="text-destructive">*</span>
481
+ </FieldLabel>
482
+ <Input
483
+ id="nomeInterno"
484
+ placeholder={t('form.fields.internalName.placeholder')}
485
+ {...form.register('nomeInterno')}
486
+ />
487
+ <FieldError>
488
+ {form.formState.errors.nomeInterno?.message}
489
+ </FieldError>
490
+ </Field>
491
+
492
+ <Field>
493
+ <FieldLabel htmlFor="slug">
494
+ {t('form.fields.slug.label')}{' '}
495
+ <span className="text-destructive">*</span>
496
+ </FieldLabel>
497
+ <Input
498
+ id="slug"
499
+ placeholder={t('form.fields.slug.placeholder')}
500
+ {...form.register('slug', {
501
+ onChange: () => {
502
+ slugTouchedRef.current = true;
503
+ },
504
+ })}
505
+ />
506
+ <FieldError>{form.formState.errors.slug?.message}</FieldError>
507
+ </Field>
508
+ </div>
435
509
 
510
+ {/* Edition code */}
436
511
  <Field>
437
- <FieldLabel htmlFor="slug">
438
- {t('form.fields.slug.label')}{' '}
439
- <span className="text-destructive">*</span>
512
+ <FieldLabel htmlFor="code">
513
+ {t('form.fields.code.label')}
440
514
  </FieldLabel>
441
515
  <Input
442
- id="slug"
443
- placeholder={t('form.fields.slug.placeholder')}
444
- {...form.register('slug', {
445
- onChange: () => {
446
- slugTouchedRef.current = true;
516
+ id="code"
517
+ placeholder={t('form.fields.code.placeholder')}
518
+ className="font-mono"
519
+ {...form.register('code', {
520
+ onChange: (e) => {
521
+ const cleaned = e.target.value
522
+ .toUpperCase()
523
+ .replace(/[^A-Z0-9]/g, '');
524
+ form.setValue('code', cleaned, { shouldValidate: true });
447
525
  },
448
526
  })}
449
527
  />
450
- <FieldDescription>
451
- {t('form.fields.slug.description')}
452
- </FieldDescription>
453
- <FieldError>{form.formState.errors.slug?.message}</FieldError>
528
+ <FieldError>{form.formState.errors.code?.message}</FieldError>
454
529
  </Field>
455
530
 
531
+ {/* Logo */}
456
532
  <Field>
457
533
  <FieldLabel>{t('form.fields.logo.label')}</FieldLabel>
458
- <div className="flex items-start gap-4">
534
+ <div className="flex items-center gap-3">
459
535
  {logoPreviewUrl ? (
460
536
  <img
461
537
  src={logoPreviewUrl}
462
538
  alt={t('form.fields.logo.alt')}
463
- className="size-16 shrink-0 rounded-lg border object-cover"
539
+ className="size-12 shrink-0 rounded-lg border object-cover"
464
540
  />
465
541
  ) : (
466
- <div className="flex size-16 shrink-0 items-center justify-center rounded-lg border border-dashed bg-muted/40">
467
- <ImageIcon className="size-6 text-muted-foreground/50" />
542
+ <div className="flex size-12 shrink-0 items-center justify-center rounded-lg border border-dashed bg-muted/40">
543
+ <ImageIcon className="size-5 text-muted-foreground/50" />
468
544
  </div>
469
545
  )}
470
- <div className="flex flex-col gap-2">
546
+ <div className="flex items-center gap-2">
471
547
  <input
472
548
  ref={logoInputRef}
473
549
  type="file"
@@ -504,41 +580,103 @@ export function CourseFormSheet({
504
580
  {t('form.fields.logo.remove')}
505
581
  </Button>
506
582
  )}
583
+ {colorExtracting && (
584
+ <span className="flex items-center gap-1 text-xs text-muted-foreground">
585
+ <Loader2 className="size-3 animate-spin" />
586
+ Detectando cores...
587
+ </span>
588
+ )}
507
589
  </div>
508
590
  </div>
509
- <FieldDescription>
510
- {t('form.fields.logo.description')}
511
- </FieldDescription>
512
591
  </Field>
513
592
 
514
- <Field>
515
- <FieldLabel htmlFor="tituloComercial">
516
- {t('form.fields.commercialTitle.label')}
517
- </FieldLabel>
518
- <Input
519
- id="tituloComercial"
520
- placeholder={t('form.fields.commercialTitle.placeholder')}
521
- {...form.register('tituloComercial')}
522
- />
523
- <FieldError>
524
- {form.formState.errors.tituloComercial?.message}
525
- </FieldError>
526
- </Field>
593
+ {/* Commercial title + Offering type */}
594
+ <div className="grid grid-cols-2 gap-3">
595
+ <Field>
596
+ <FieldLabel htmlFor="tituloComercial">
597
+ {t('form.fields.commercialTitle.label')}
598
+ </FieldLabel>
599
+ <Input
600
+ id="tituloComercial"
601
+ placeholder={t('form.fields.commercialTitle.placeholder')}
602
+ {...form.register('tituloComercial')}
603
+ />
604
+ <FieldError>
605
+ {form.formState.errors.tituloComercial?.message}
606
+ </FieldError>
607
+ </Field>
608
+
609
+ <Field>
610
+ <FieldLabel>Tipo do curso</FieldLabel>
611
+ <Controller
612
+ name="offeringType"
613
+ control={form.control}
614
+ render={({ field }) => (
615
+ <Select onValueChange={field.onChange} value={field.value}>
616
+ <SelectTrigger>
617
+ <SelectValue placeholder="Selecione o tipo" />
618
+ </SelectTrigger>
619
+ <SelectContent>
620
+ <SelectItem value="on_demand">On Demand</SelectItem>
621
+ <SelectItem value="agendado">Agendado</SelectItem>
622
+ <SelectItem value="hibrido">Híbrido</SelectItem>
623
+ </SelectContent>
624
+ </Select>
625
+ )}
626
+ />
627
+ <FieldError>{form.formState.errors.offeringType?.message}</FieldError>
628
+ </Field>
629
+ </div>
527
630
 
631
+ {/* Description */}
528
632
  <Field>
529
633
  <FieldLabel htmlFor="descricao">
530
634
  {t('form.fields.description.label')}
531
635
  </FieldLabel>
532
636
  <Textarea
533
637
  id="descricao"
534
- rows={3}
638
+ rows={2}
535
639
  placeholder={t('form.fields.description.placeholder')}
536
640
  {...form.register('descricao')}
537
641
  />
538
642
  <FieldError>{form.formState.errors.descricao?.message}</FieldError>
539
643
  </Field>
540
644
 
541
- <div className="grid grid-cols-2 gap-4">
645
+ {/* Operations project */}
646
+ <Field>
647
+ <FieldLabel>Projeto vinculado</FieldLabel>
648
+ <Controller
649
+ name="operationsProjectId"
650
+ control={form.control}
651
+ render={({ field }) => (
652
+ <EntityPicker<{
653
+ value: string;
654
+ label: string;
655
+ description?: string | null;
656
+ meta?: string | null;
657
+ }>
658
+ value={field.value}
659
+ onChange={(value) => field.onChange(String(value ?? ''))}
660
+ options={operationsProjectOptions}
661
+ placeholder="Selecione um projeto do Operations"
662
+ searchPlaceholder="Buscar projeto..."
663
+ entityLabel="projeto"
664
+ emptyStateDescription="Nenhum projeto disponível"
665
+ getOptionValue={(option) => option.value}
666
+ getOptionLabel={(option) => option.label}
667
+ getOptionDescription={(option) =>
668
+ option.description || option.meta || undefined
669
+ }
670
+ />
671
+ )}
672
+ />
673
+ <FieldError>
674
+ {form.formState.errors.operationsProjectId?.message}
675
+ </FieldError>
676
+ </Field>
677
+
678
+ {/* Level + Status */}
679
+ <div className="grid grid-cols-2 gap-3">
542
680
  <Field>
543
681
  <FieldLabel>{t('form.fields.level.label')}</FieldLabel>
544
682
  <Controller
@@ -598,6 +736,7 @@ export function CourseFormSheet({
598
736
  </Field>
599
737
  </div>
600
738
 
739
+ {/* Categories */}
601
740
  <Field>
602
741
  <FieldLabel>{t('form.fields.categories.label')}</FieldLabel>
603
742
  <Controller
@@ -752,14 +891,8 @@ export function CourseFormSheet({
752
891
  <FieldError>{form.formState.errors.categorias?.message}</FieldError>
753
892
  </Field>
754
893
 
755
- {colorExtracting && (
756
- <div className="flex items-center gap-1.5 text-xs text-muted-foreground">
757
- <Loader2 className="size-3 animate-spin" />
758
- Detectando cores...
759
- </div>
760
- )}
761
-
762
- <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
894
+ {/* Primary + Secondary colors */}
895
+ <div className="grid grid-cols-2 gap-3">
763
896
  <Field>
764
897
  <FieldLabel htmlFor="primaryColor">
765
898
  {t('form.fields.primaryColor.label')}
@@ -772,7 +905,7 @@ export function CourseFormSheet({
772
905
  <Input
773
906
  id="primaryColor"
774
907
  type="color"
775
- className="h-10 w-16 p-1"
908
+ className="h-9 w-12 p-1"
776
909
  value={field.value}
777
910
  onChange={field.onChange}
778
911
  />
@@ -801,7 +934,7 @@ export function CourseFormSheet({
801
934
  <Input
802
935
  id="secondaryColor"
803
936
  type="color"
804
- className="h-10 w-16 p-1"
937
+ className="h-9 w-12 p-1"
805
938
  value={field.value}
806
939
  onChange={field.onChange}
807
940
  />
@@ -826,7 +959,7 @@ export function CourseFormSheet({
826
959
  </Button>
827
960
  </SheetFooter>
828
961
  </form>
829
- </SheetContent>
962
+ </ResizableSheetContent>
830
963
  </Sheet>
831
964
  );
832
965
  }
@@ -0,0 +1,228 @@
1
+ 'use client';
2
+
3
+ import { CourseAvatar } from '@/app/(app)/(libraries)/lms/_components/course-avatar';
4
+ import { Button } from '@/components/ui/button';
5
+ import {
6
+ EntityPicker,
7
+ type EntityPickerValue,
8
+ } from '@/components/ui/entity-picker';
9
+ import { useApp } from '@hed-hog/next-app-provider';
10
+ import { Pencil, Plus } from 'lucide-react';
11
+ import { useCallback } from 'react';
12
+ import type { FieldValues, Path, UseFormReturn } from 'react-hook-form';
13
+
14
+ type CoursePickerOption = {
15
+ id: number;
16
+ title: string;
17
+ code?: string;
18
+ logoFileId?: number | null;
19
+ offeringType?: 'scheduled' | 'on_demand' | 'blended' | string | null;
20
+ };
21
+
22
+ type CoursePickerListResponse = {
23
+ data: CoursePickerOption[];
24
+ lastPage?: number;
25
+ };
26
+
27
+ type CoursePickerProps<TFieldValues extends FieldValues> = {
28
+ form: UseFormReturn<TFieldValues>;
29
+ name: Path<TFieldValues>;
30
+ selectedCourseTitle?: string;
31
+ placeholder: string;
32
+ entityLabel: string;
33
+ searchPlaceholder?: string;
34
+ emptyStateDescription?: string;
35
+ loadingLabel?: string;
36
+ noResultsLabel?: string;
37
+ valueType?: 'number' | 'string';
38
+ disabled?: boolean;
39
+ allowClearSelection?: boolean;
40
+ showCreateButton?: boolean;
41
+ showEditButton?: boolean;
42
+ editButtonLabel?: string;
43
+ createButtonLabel?: string;
44
+ searchEndpoint?: string;
45
+ searchExtraParams?: Record<string, unknown>;
46
+ pageSize?: number;
47
+ refreshToken?: unknown;
48
+ isOptionDisabled?: (option: CoursePickerOption) => boolean;
49
+ onCreateClick?: () => void;
50
+ onEditClick?: (selected: CoursePickerOption | null) => void;
51
+ onSelectionChange?: (
52
+ value: EntityPickerValue,
53
+ option: CoursePickerOption | null
54
+ ) => void;
55
+ };
56
+
57
+ export function CoursePicker<TFieldValues extends FieldValues>({
58
+ form,
59
+ name,
60
+ selectedCourseTitle,
61
+ placeholder,
62
+ entityLabel,
63
+ searchPlaceholder,
64
+ emptyStateDescription,
65
+ loadingLabel,
66
+ noResultsLabel,
67
+ valueType = 'number',
68
+ disabled = false,
69
+ allowClearSelection = false,
70
+ showCreateButton = true,
71
+ showEditButton = false,
72
+ editButtonLabel = 'Editar curso',
73
+ createButtonLabel = 'Criar curso',
74
+ searchEndpoint = '/lms/courses',
75
+ searchExtraParams,
76
+ pageSize = 20,
77
+ refreshToken,
78
+ isOptionDisabled,
79
+ onCreateClick,
80
+ onEditClick,
81
+ onSelectionChange,
82
+ }: CoursePickerProps<TFieldValues>) {
83
+ const { request } = useApp();
84
+
85
+ const getOptionValue = useCallback(
86
+ (option: CoursePickerOption) => option.id,
87
+ []
88
+ );
89
+
90
+ const getOptionLabel = useCallback(
91
+ (option: CoursePickerOption) => option.title,
92
+ []
93
+ );
94
+
95
+ const selectedId = form.watch(name);
96
+ const hasSelectedCourse =
97
+ selectedId !== null &&
98
+ selectedId !== undefined &&
99
+ String(selectedId).trim().length > 0;
100
+
101
+ const getOfferingTypeLabel = useCallback(
102
+ (offeringType?: CoursePickerOption['offeringType']) => {
103
+ if (offeringType === 'scheduled') return 'Agendado';
104
+ if (offeringType === 'blended') return 'Hibrido';
105
+ if (offeringType === 'on_demand') return 'Sob Demanda';
106
+ return null;
107
+ },
108
+ []
109
+ );
110
+
111
+ return (
112
+ <div className="flex items-end gap-2">
113
+ <div className="min-w-0 flex-1">
114
+ <EntityPicker<CoursePickerOption, TFieldValues>
115
+ form={form}
116
+ name={name}
117
+ valueType={valueType}
118
+ placeholder={placeholder}
119
+ refreshToken={refreshToken}
120
+ entityLabel={entityLabel}
121
+ initialSelectedLabel={selectedCourseTitle ?? ''}
122
+ searchPlaceholder={searchPlaceholder ?? placeholder}
123
+ emptyStateDescription={
124
+ emptyStateDescription ?? 'Nenhum curso encontrado.'
125
+ }
126
+ loadingLabel={loadingLabel ?? 'Carregando cursos...'}
127
+ noResultsLabel={noResultsLabel ?? 'Nenhum curso encontrado.'}
128
+ disabled={disabled}
129
+ clearable={allowClearSelection}
130
+ showCreateButton={false}
131
+ renderOption={({ option, isDisabled }) => (
132
+ <div
133
+ className={`flex items-center gap-2 py-0.5 ${isDisabled ? 'opacity-60' : ''}`}
134
+ >
135
+ <CourseAvatar
136
+ fileId={option.logoFileId}
137
+ title={option.title}
138
+ className="size-8 shrink-0 rounded-lg"
139
+ iconSize="size-4"
140
+ />
141
+ <div className="min-w-0">
142
+ <p className="truncate text-sm">{option.title}</p>
143
+ <p className="truncate text-xs text-muted-foreground">
144
+ {option.code ?? '—'} · #{option.id}
145
+ {getOfferingTypeLabel(option.offeringType)
146
+ ? ` · ${getOfferingTypeLabel(option.offeringType)}`
147
+ : ''}
148
+ {isDisabled ? ' · indisponivel para turma' : ''}
149
+ </p>
150
+ </div>
151
+ </div>
152
+ )}
153
+ isOptionDisabled={isOptionDisabled}
154
+ renderSelectedValue={({ option, label }) => (
155
+ <div className="flex items-center gap-2">
156
+ <CourseAvatar
157
+ fileId={option?.logoFileId}
158
+ title={option?.title ?? label}
159
+ className="size-5 shrink-0 rounded"
160
+ iconSize="size-3"
161
+ />
162
+ <span className="truncate">{option?.title ?? label}</span>
163
+ </div>
164
+ )}
165
+ onChange={(value, option) => {
166
+ onSelectionChange?.(value, option);
167
+ }}
168
+ loadOptions={async ({ page, pageSize: remotePageSize, search }) => {
169
+ const response = await request<CoursePickerListResponse>({
170
+ url: searchEndpoint,
171
+ method: 'GET',
172
+ params: {
173
+ page,
174
+ pageSize: remotePageSize,
175
+ ...(search.trim() ? { search: search.trim() } : {}),
176
+ ...(searchExtraParams ?? {}),
177
+ },
178
+ });
179
+
180
+ return {
181
+ items: response.data?.data ?? [],
182
+ hasMore: page < (response.data?.lastPage ?? 1),
183
+ };
184
+ }}
185
+ pageSize={pageSize}
186
+ getOptionValue={getOptionValue}
187
+ getOptionLabel={getOptionLabel}
188
+ />
189
+ </div>
190
+
191
+ {showEditButton ? (
192
+ <Button
193
+ type="button"
194
+ variant="outline"
195
+ size="icon"
196
+ className="h-10 w-10 shrink-0"
197
+ disabled={disabled || !hasSelectedCourse}
198
+ onClick={() => {
199
+ const selectedOption: CoursePickerOption | null = hasSelectedCourse
200
+ ? {
201
+ id: Number(selectedId),
202
+ title: selectedCourseTitle ?? '',
203
+ }
204
+ : null;
205
+ onEditClick?.(selectedOption);
206
+ }}
207
+ aria-label={editButtonLabel}
208
+ >
209
+ <Pencil className="h-4 w-4" />
210
+ </Button>
211
+ ) : null}
212
+
213
+ {showCreateButton ? (
214
+ <Button
215
+ type="button"
216
+ variant="outline"
217
+ size="icon"
218
+ className="h-10 w-10 shrink-0"
219
+ disabled={disabled}
220
+ onClick={onCreateClick}
221
+ aria-label={createButtonLabel}
222
+ >
223
+ <Plus className="h-4 w-4" />
224
+ </Button>
225
+ ) : null}
226
+ </div>
227
+ );
228
+ }