@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
@@ -21,14 +21,16 @@ import {
21
21
  } from '@/components/ui/select';
22
22
  import {
23
23
  Sheet,
24
- SheetContent,
25
24
  SheetDescription,
26
25
  SheetFooter,
27
26
  SheetHeader,
28
27
  SheetTitle,
29
28
  } from '@/components/ui/sheet';
29
+ import { ResizableSheetContent } from '@/components/ui/resizable-sheet-content';
30
30
  import { Skeleton } from '@/components/ui/skeleton';
31
+ import { Switch } from '@/components/ui/switch';
31
32
  import { Textarea } from '@/components/ui/textarea';
33
+ import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
32
34
  import { useApp, useQuery } from '@hed-hog/next-app-provider';
33
35
  import {
34
36
  Award,
@@ -36,6 +38,7 @@ import {
36
38
  ExternalLink,
37
39
  FileEdit,
38
40
  FilePlus2,
41
+ Globe,
39
42
  Loader2,
40
43
  Shapes,
41
44
  UserRound,
@@ -43,7 +46,6 @@ import {
43
46
  import { useLocale, useTranslations } from 'next-intl';
44
47
  import { useRouter } from 'next/navigation';
45
48
  import { useEffect, useMemo, useState } from 'react';
46
- import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
47
49
  import { toast } from 'sonner';
48
50
 
49
51
  type IssuedCertificate = {
@@ -61,6 +63,7 @@ type IssuedCertificate = {
61
63
  finalScore: number | null;
62
64
  verificationCode: string;
63
65
  verificationUrl: string | null;
66
+ publicAccess: boolean;
64
67
  pdfUrl: string | null;
65
68
  sourceTitle: string;
66
69
  primaryColor: string | null;
@@ -111,6 +114,9 @@ export default function IssuedCertificatesPage() {
111
114
  });
112
115
  const [isTemplateSheetOpen, setIsTemplateSheetOpen] = useState(false);
113
116
  const [isCreatingTemplate, setIsCreatingTemplate] = useState(false);
117
+ const [isUpdatingPublicAccess, setIsUpdatingPublicAccess] = useState<
118
+ Record<number, boolean>
119
+ >({});
114
120
  const [templateName, setTemplateName] = useState('');
115
121
  const [templateDescription, setTemplateDescription] = useState('');
116
122
  const [templateStatus, setTemplateStatus] =
@@ -120,6 +126,7 @@ export default function IssuedCertificatesPage() {
120
126
  data: certificatesResponse,
121
127
  isLoading,
122
128
  isFetching,
129
+ refetch,
123
130
  } = useQuery<ApiIssuedCertificatesResponse>({
124
131
  queryKey: [
125
132
  'lms-issued-certificates',
@@ -255,6 +262,32 @@ export default function IssuedCertificatesPage() {
255
262
  }
256
263
  }
257
264
 
265
+ async function togglePublicAccess(certificate: IssuedCertificate) {
266
+ setIsUpdatingPublicAccess((prev) => ({ ...prev, [certificate.id]: true }));
267
+
268
+ try {
269
+ await request({
270
+ url: `/lms/certificates/issued/${certificate.id}/public-access`,
271
+ method: 'PATCH',
272
+ data: { publicAccess: !certificate.publicAccess },
273
+ });
274
+
275
+ toast.success(
276
+ !certificate.publicAccess
277
+ ? t('messages.publicAccessEnabled')
278
+ : t('messages.publicAccessDisabled')
279
+ );
280
+ await refetch();
281
+ } catch {
282
+ toast.error(t('messages.publicAccessError'));
283
+ } finally {
284
+ setIsUpdatingPublicAccess((prev) => ({
285
+ ...prev,
286
+ [certificate.id]: false,
287
+ }));
288
+ }
289
+ }
290
+
258
291
  function formatDate(value: string) {
259
292
  const parsed = new Date(value);
260
293
 
@@ -432,6 +465,14 @@ export default function IssuedCertificatesPage() {
432
465
  {formatTypeLabel(certificate.certificateType)}
433
466
  </Badge>
434
467
  <Badge variant="secondary">#{certificate.id}</Badge>
468
+ <Badge
469
+ variant={certificate.publicAccess ? 'default' : 'outline'}
470
+ >
471
+ <Globe className="mr-1 size-3.5" />
472
+ {certificate.publicAccess
473
+ ? t('cards.publicAccess.enabled')
474
+ : t('cards.publicAccess.disabled')}
475
+ </Badge>
435
476
  </div>
436
477
 
437
478
  <div className="space-y-1">
@@ -452,6 +493,24 @@ export default function IssuedCertificatesPage() {
452
493
  </p>
453
494
  </div>
454
495
 
496
+ <div className="flex items-center justify-between rounded-xl border bg-background p-3">
497
+ <div>
498
+ <p className="text-xs text-muted-foreground">
499
+ {t('cards.publicAccess.label')}
500
+ </p>
501
+ <p className="text-sm font-medium text-foreground">
502
+ {certificate.publicAccess
503
+ ? t('cards.publicAccess.enabled')
504
+ : t('cards.publicAccess.disabled')}
505
+ </p>
506
+ </div>
507
+ <Switch
508
+ checked={certificate.publicAccess}
509
+ disabled={Boolean(isUpdatingPublicAccess[certificate.id])}
510
+ onCheckedChange={() => togglePublicAccess(certificate)}
511
+ />
512
+ </div>
513
+
455
514
  <div className="grid grid-cols-2 gap-3">
456
515
  <div className="rounded-xl border bg-background p-3">
457
516
  <p className="mb-1 text-xs text-muted-foreground">
@@ -521,7 +580,7 @@ export default function IssuedCertificatesPage() {
521
580
  </Button>
522
581
  ) : null}
523
582
 
524
- {certificate.verificationUrl ? (
583
+ {certificate.verificationUrl && certificate.publicAccess ? (
525
584
  <Button
526
585
  type="button"
527
586
  variant="ghost"
@@ -557,7 +616,11 @@ export default function IssuedCertificatesPage() {
557
616
  ) : null}
558
617
 
559
618
  <Sheet open={isTemplateSheetOpen} onOpenChange={setIsTemplateSheetOpen}>
560
- <SheetContent
619
+ <ResizableSheetContent
620
+ sheetId="lms-certificates-issued-create-template-sheet"
621
+ defaultWidth={560}
622
+ minWidth={420}
623
+ maxWidth={920}
561
624
  side="right"
562
625
  className="flex w-full flex-col sm:max-w-lg overflow-y-auto"
563
626
  >
@@ -636,7 +699,7 @@ export default function IssuedCertificatesPage() {
636
699
  {t('sheet.submit')}
637
700
  </Button>
638
701
  </SheetFooter>
639
- </SheetContent>
702
+ </ResizableSheetContent>
640
703
  </Sheet>
641
704
  </Page>
642
705
  );
@@ -694,15 +694,26 @@ function buildAPI(canvas: any, fabricMod: any): CanvasAPI {
694
694
  let fObj: any = null;
695
695
 
696
696
  if (type === 'field') {
697
+ const isQrCode = key === 'qrCode';
697
698
  fObj = new fabricMod.Textbox(`{{${key}}}`, {
698
- left: cx - 120,
699
- top: cy - 18,
700
- width: 240,
701
- fontSize: 28,
699
+ left: cx - (isQrCode ? 90 : 120),
700
+ top: cy - (isQrCode ? 45 : 18),
701
+ width: isQrCode ? 180 : 240,
702
+ height: isQrCode ? 90 : undefined,
703
+ fontSize: isQrCode ? 20 : 28,
702
704
  fontFamily: 'Inter',
703
705
  fontWeight: '400',
704
706
  fill: '#1e293b',
707
+ textAlign: 'center',
705
708
  });
709
+ if (isQrCode) {
710
+ fObj.set({
711
+ text: '[QR Code]',
712
+ stroke: '#94a3b8',
713
+ strokeWidth: 1,
714
+ backgroundColor: '#f8fafc',
715
+ });
716
+ }
706
717
  fObj._tplKey = key;
707
718
  } else if (type === 'staticText') {
708
719
  fObj = new fabricMod.Textbox('Texto', {
@@ -732,18 +743,28 @@ function buildAPI(canvas: any, fabricMod: any): CanvasAPI {
732
743
  strokeWidth: 2,
733
744
  });
734
745
  } else if (type === 'image') {
746
+ const isCourseLogo = key === 'courseLogo';
747
+ const isCourseBanner = key === 'courseBanner';
748
+ const boxWidth = isCourseBanner ? 420 : isCourseLogo ? 220 : 150;
749
+ const boxHeight = isCourseBanner ? 140 : isCourseLogo ? 120 : 150;
735
750
  fObj = new fabricMod.Rect({
736
- left: cx - 75,
737
- top: cy - 75,
738
- width: 150,
739
- height: 150,
751
+ left: cx - boxWidth / 2,
752
+ top: cy - boxHeight / 2,
753
+ width: boxWidth,
754
+ height: boxHeight,
740
755
  fill: '#e2e8f0',
741
756
  stroke: '#cbd5e1',
742
757
  strokeWidth: 1,
758
+ strokeDashArray: isCourseLogo || isCourseBanner ? [8, 4] : undefined,
743
759
  rx: 4,
744
760
  ry: 4,
745
761
  });
746
762
  fObj._tplImageSrc = '';
763
+ fObj._tplImageFileId = null;
764
+ fObj._tplImageResizeMode = 'contain';
765
+ if (isCourseLogo || isCourseBanner) {
766
+ fObj._tplImagePlaceholder = true;
767
+ }
747
768
  }
748
769
 
749
770
  if (!fObj) return;
@@ -125,6 +125,20 @@ export default function LeftPanel() {
125
125
  <p className="mt-3 text-xs font-semibold uppercase tracking-wide text-muted-foreground">
126
126
  {t('leftPanel.sections.image')}
127
127
  </p>
128
+ <div className="grid grid-cols-1 gap-2">
129
+ <ElementCard
130
+ icon={<ImageIcon className="size-4" />}
131
+ label="Logo do Curso"
132
+ onClick={() => add('image', { key: 'courseLogo' })}
133
+ dragPayload={{ type: 'image', key: 'courseLogo' }}
134
+ />
135
+ <ElementCard
136
+ icon={<ImageIcon className="size-4" />}
137
+ label="Banner do Curso"
138
+ onClick={() => add('image', { key: 'courseBanner' })}
139
+ dragPayload={{ type: 'image', key: 'courseBanner' }}
140
+ />
141
+ </div>
128
142
  <ElementCard
129
143
  icon={<ImageIcon className="size-4" />}
130
144
  label={t('leftPanel.elements.image')}
@@ -14,6 +14,7 @@ import { Slider } from '@/components/ui/slider';
14
14
  import { Switch } from '@/components/ui/switch';
15
15
  import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
16
16
  import { Textarea } from '@/components/ui/textarea';
17
+ import { useApp } from '@hed-hog/next-app-provider';
17
18
  import {
18
19
  ChevronDown,
19
20
  ChevronUp,
@@ -493,16 +494,200 @@ function ImageProperties({
493
494
  obj: TemplateObject;
494
495
  setProp: (p: Record<string, unknown>) => void;
495
496
  }) {
497
+ const { request } = useApp();
498
+ const isCoursePlaceholder =
499
+ obj.key === 'courseLogo' || obj.key === 'courseBanner';
500
+ const [isUploading, setIsUploading] = useState(false);
501
+
502
+ const currentFileId =
503
+ typeof obj.image?.file_id === 'number' && Number.isFinite(obj.image.file_id)
504
+ ? obj.image.file_id
505
+ : null;
506
+ const resizeMode =
507
+ obj.image?.resizeMode === 'cover' ||
508
+ obj.image?.resizeMode === 'stretch' ||
509
+ obj.image?.resizeMode === 'center'
510
+ ? obj.image.resizeMode
511
+ : 'contain';
512
+ const previewUrl = currentFileId ? `/file/open/${currentFileId}` : null;
513
+
514
+ async function handleImageUpload(e: React.ChangeEvent<HTMLInputElement>) {
515
+ const file = e.target.files?.[0];
516
+ if (!file) return;
517
+
518
+ if (!String(file.type || '').startsWith('image/')) {
519
+ toast.error('Selecione um arquivo de imagem válido.');
520
+ return;
521
+ }
522
+
523
+ const formData = new FormData();
524
+ formData.append('file', file);
525
+
526
+ setIsUploading(true);
527
+
528
+ try {
529
+ const response = await request<{
530
+ id: number;
531
+ url: string;
532
+ }>({
533
+ url: '/lms/certificates/templates/background-image',
534
+ method: 'POST',
535
+ data: formData,
536
+ });
537
+
538
+ const newFileId = response?.data?.id;
539
+ if (typeof newFileId !== 'number' || !Number.isFinite(newFileId)) {
540
+ throw new Error('Invalid uploaded file id');
541
+ }
542
+
543
+ setProp({
544
+ _tplImageFileId: newFileId,
545
+ _tplImageSrc: response.data.url ?? `/file/open/${newFileId}`,
546
+ });
547
+
548
+ if (
549
+ typeof currentFileId === 'number' &&
550
+ Number.isFinite(currentFileId) &&
551
+ currentFileId !== newFileId
552
+ ) {
553
+ await request({
554
+ url: '/file',
555
+ method: 'DELETE',
556
+ data: { ids: [currentFileId] },
557
+ });
558
+ }
559
+
560
+ toast.success('Imagem personalizada atualizada.');
561
+ } catch {
562
+ toast.error('Não foi possível enviar a imagem.');
563
+ } finally {
564
+ setIsUploading(false);
565
+ e.target.value = '';
566
+ }
567
+ }
568
+
569
+ async function handleRemoveImage() {
570
+ if (!currentFileId) {
571
+ setProp({ _tplImageFileId: null, _tplImageSrc: '' });
572
+ toast.success('Imagem removida do certificado.');
573
+ return;
574
+ }
575
+
576
+ try {
577
+ await request({
578
+ url: '/file',
579
+ method: 'DELETE',
580
+ data: { ids: [currentFileId] },
581
+ });
582
+ setProp({ _tplImageFileId: null, _tplImageSrc: '' });
583
+ toast.success('Imagem removida do certificado.');
584
+ } catch {
585
+ toast.error('Não foi possível remover a imagem.');
586
+ }
587
+ }
588
+
496
589
  return (
497
- <div className="flex flex-col gap-1.5">
498
- <Label className="text-xs">Rotacao ({Math.round(obj.rotation)}deg)</Label>
499
- <Slider
500
- min={0}
501
- max={360}
502
- step={1}
503
- value={[Math.round(obj.rotation)]}
504
- onValueChange={([v]) => setProp({ angle: v })}
505
- />
590
+ <div className="flex flex-col gap-3">
591
+ <div className="flex flex-col gap-1.5">
592
+ <Label className="text-xs">
593
+ Rotacao ({Math.round(obj.rotation)}deg)
594
+ </Label>
595
+ <Slider
596
+ min={0}
597
+ max={360}
598
+ step={1}
599
+ value={[Math.round(obj.rotation)]}
600
+ onValueChange={([v]) => setProp({ angle: v })}
601
+ />
602
+ </div>
603
+
604
+ {!isCoursePlaceholder ? (
605
+ <div className="flex flex-col gap-1.5">
606
+ <Label className="text-xs">Imagem personalizada</Label>
607
+ <input
608
+ type="file"
609
+ accept="image/*"
610
+ onChange={handleImageUpload}
611
+ disabled={isUploading}
612
+ className="block w-full cursor-pointer rounded-md border border-border bg-background px-2 py-1.5 text-xs"
613
+ />
614
+ <div className="flex items-center gap-2">
615
+ <Button
616
+ type="button"
617
+ variant="outline"
618
+ size="sm"
619
+ className="h-7 text-xs"
620
+ onClick={handleRemoveImage}
621
+ disabled={isUploading || !currentFileId}
622
+ >
623
+ Remover imagem
624
+ </Button>
625
+ {currentFileId ? (
626
+ <span className="text-[11px] text-muted-foreground">
627
+ file_id: {currentFileId}
628
+ </span>
629
+ ) : (
630
+ <span className="text-[11px] text-muted-foreground">
631
+ Sem imagem vinculada
632
+ </span>
633
+ )}
634
+ </div>
635
+
636
+ <div className="flex flex-col gap-1.5">
637
+ <Label className="text-xs">Modo de redimensionamento</Label>
638
+ <Select
639
+ value={resizeMode}
640
+ onValueChange={(value) => setProp({ _tplImageResizeMode: value })}
641
+ >
642
+ <SelectTrigger className="w-full">
643
+ <SelectValue />
644
+ </SelectTrigger>
645
+ <SelectContent>
646
+ <SelectItem value="contain">
647
+ Manter proporção (Contain)
648
+ </SelectItem>
649
+ <SelectItem value="cover">
650
+ Manter proporção preenchendo (Crop)
651
+ </SelectItem>
652
+ <SelectItem value="stretch">
653
+ Esticar para preencher (Sem proporção)
654
+ </SelectItem>
655
+ <SelectItem value="center">
656
+ Tamanho original (Center)
657
+ </SelectItem>
658
+ </SelectContent>
659
+ </Select>
660
+ </div>
661
+
662
+ {previewUrl ? (
663
+ <div className="mt-1 overflow-hidden rounded-md border border-border bg-muted/20">
664
+ <img
665
+ src={previewUrl}
666
+ alt="Preview da imagem do certificado"
667
+ className={`h-32 w-full ${
668
+ resizeMode === 'cover'
669
+ ? 'object-cover'
670
+ : resizeMode === 'stretch'
671
+ ? 'object-fill'
672
+ : resizeMode === 'center'
673
+ ? 'object-none object-center'
674
+ : 'object-contain'
675
+ }`}
676
+ loading="lazy"
677
+ />
678
+ </div>
679
+ ) : null}
680
+
681
+ <p className="text-[11px] text-muted-foreground">
682
+ O template salva apenas o file_id desta imagem.
683
+ </p>
684
+ </div>
685
+ ) : (
686
+ <p className="text-[11px] text-muted-foreground">
687
+ Este item é um placeholder de posicionamento. O conteúdo real (logo ou
688
+ banner) será preenchido na emissão final do certificado.
689
+ </p>
690
+ )}
506
691
  </div>
507
692
  );
508
693
  }
@@ -37,12 +37,12 @@ import {
37
37
  } from '@/components/ui/select';
38
38
  import {
39
39
  Sheet,
40
- SheetContent,
41
40
  SheetDescription,
42
41
  SheetFooter,
43
42
  SheetHeader,
44
43
  SheetTitle,
45
44
  } from '@/components/ui/sheet';
45
+ import { ResizableSheetContent } from '@/components/ui/resizable-sheet-content';
46
46
  import { Skeleton } from '@/components/ui/skeleton';
47
47
  import { Textarea } from '@/components/ui/textarea';
48
48
  import { useApp, useQuery } from '@hed-hog/next-app-provider';
@@ -726,7 +726,11 @@ export default function ModelsPage() {
726
726
  </div>
727
727
 
728
728
  <Sheet open={isSheetOpen} onOpenChange={setIsSheetOpen}>
729
- <SheetContent
729
+ <ResizableSheetContent
730
+ sheetId="lms-certificates-models-create-template-sheet"
731
+ defaultWidth={560}
732
+ minWidth={420}
733
+ maxWidth={920}
730
734
  side="right"
731
735
  className="flex w-full flex-col sm:max-w-lg overflow-y-auto"
732
736
  >
@@ -809,7 +813,7 @@ export default function ModelsPage() {
809
813
  </Button>
810
814
  </SheetFooter>
811
815
  </form>
812
- </SheetContent>
816
+ </ResizableSheetContent>
813
817
  </Sheet>
814
818
 
815
819
  <Sheet
@@ -821,7 +825,13 @@ export default function ModelsPage() {
821
825
  }
822
826
  }}
823
827
  >
824
- <SheetContent className="overflow-y-auto sm:max-w-xl">
828
+ <ResizableSheetContent
829
+ sheetId="lms-certificates-models-edit-template-sheet"
830
+ defaultWidth={640}
831
+ minWidth={460}
832
+ maxWidth={1080}
833
+ className="overflow-y-auto sm:max-w-xl"
834
+ >
825
835
  <SheetHeader>
826
836
  <SheetTitle>{t('editSheet.title')}</SheetTitle>
827
837
  <SheetDescription>{t('editSheet.description')}</SheetDescription>
@@ -906,7 +916,7 @@ export default function ModelsPage() {
906
916
  </Button>
907
917
  </SheetFooter>
908
918
  </form>
909
- </SheetContent>
919
+ </ResizableSheetContent>
910
920
  </Sheet>
911
921
 
912
922
  <Dialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>
@@ -1,11 +1,11 @@
1
1
  'use client';
2
2
 
3
- import { PersonFormSheet } from '@/app/(app)/(libraries)/contact/person/_components/person-form-sheet';
3
+ import { PersonFormSheet } from '@/app/(app)/(libraries)/crm/person/_components/person-form-sheet';
4
4
  import type {
5
5
  Person as ContactPerson,
6
6
  ContactTypeOption,
7
7
  DocumentTypeOption,
8
- } from '@/app/(app)/(libraries)/contact/person/_components/person-types';
8
+ } from '@/app/(app)/(libraries)/crm/person/_components/person-types';
9
9
  import { LmsClassCalendar } from '@/app/(app)/(libraries)/lms/_components/lms-class-calendar';
10
10
  import { CopyButton } from '@/components/copy-button';
11
11
  import { Page, PageHeader } from '@/components/entity-list';
@@ -54,12 +54,12 @@ import {
54
54
  } from '@/components/ui/select';
55
55
  import {
56
56
  Sheet,
57
- SheetContent,
58
57
  SheetDescription,
59
58
  SheetFooter,
60
59
  SheetHeader,
61
60
  SheetTitle,
62
61
  } from '@/components/ui/sheet';
62
+ import { ResizableSheetContent } from '@/components/ui/resizable-sheet-content';
63
63
  import { Skeleton } from '@/components/ui/skeleton';
64
64
  import { Switch } from '@/components/ui/switch';
65
65
  import {
@@ -522,6 +522,7 @@ type ApiCourseDetail = {
522
522
  primaryColor?: string | null;
523
523
  secondaryColor?: string | null;
524
524
  logoFileId?: number | null;
525
+ operationsProjectId?: number | null;
525
526
  };
526
527
 
527
528
  type ApiCourseCategoryList = {
@@ -1620,6 +1621,9 @@ export default function TurmaDetalhePage() {
1620
1621
  nivel: toCourseFormLevel(courseDetail.level),
1621
1622
  status: toCourseFormStatus(courseDetail.status),
1622
1623
  categorias: courseDetail.categories ?? [],
1624
+ operationsProjectId: courseDetail.operationsProjectId
1625
+ ? String(courseDetail.operationsProjectId)
1626
+ : '',
1623
1627
  primaryColor: courseDetail.primaryColor ?? '#1D4ED8',
1624
1628
  secondaryColor: courseDetail.secondaryColor ?? '#111827',
1625
1629
  logoFileId: courseDetail.logoFileId ?? null,
@@ -1646,6 +1650,9 @@ export default function TurmaDetalhePage() {
1646
1650
  primaryContrastColor: getContrastColorCourse(data.primaryColor),
1647
1651
  secondaryColor: data.secondaryColor,
1648
1652
  secondaryContrastColor: getContrastColorCourse(data.secondaryColor),
1653
+ operationsProjectId: data.operationsProjectId
1654
+ ? Number(data.operationsProjectId)
1655
+ : null,
1649
1656
  logoFileId: data.logoFileId ?? null,
1650
1657
  },
1651
1658
  });
@@ -4805,7 +4812,11 @@ export default function TurmaDetalhePage() {
4805
4812
 
4806
4813
  {/* ── Sheet Aula ───────────────────────────────────────────────────────── */}
4807
4814
  <Sheet open={aulaSheetOpen} onOpenChange={setAulaSheetOpen}>
4808
- <SheetContent
4815
+ <ResizableSheetContent
4816
+ sheetId="lms-classes-detail-lesson-sheet"
4817
+ defaultWidth={560}
4818
+ minWidth={420}
4819
+ maxWidth={920}
4809
4820
  side="right"
4810
4821
  className="flex w-full flex-col sm:max-w-lg overflow-y-auto"
4811
4822
  >
@@ -5696,7 +5707,7 @@ export default function TurmaDetalhePage() {
5696
5707
  )}
5697
5708
  </TabsContent>
5698
5709
  </Tabs>
5699
- </SheetContent>
5710
+ </ResizableSheetContent>
5700
5711
  </Sheet>
5701
5712
 
5702
5713
  <CreateLmsPersonSheet