@hed-hog/lms 0.0.365 → 0.0.370

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 (243) hide show
  1. package/dist/certificate/certificate.controller.d.ts +1 -1
  2. package/dist/certificate/certificate.controller.d.ts.map +1 -1
  3. package/dist/certificate/certificate.controller.js +4 -2
  4. package/dist/certificate/certificate.controller.js.map +1 -1
  5. package/dist/certificate/certificate.service.d.ts +50 -0
  6. package/dist/certificate/certificate.service.d.ts.map +1 -1
  7. package/dist/certificate/certificate.service.js +73 -0
  8. package/dist/certificate/certificate.service.js.map +1 -1
  9. package/dist/class-group/class-group.controller.d.ts +1 -0
  10. package/dist/class-group/class-group.controller.d.ts.map +1 -1
  11. package/dist/class-group/class-group.service.d.ts +1 -0
  12. package/dist/class-group/class-group.service.d.ts.map +1 -1
  13. package/dist/course/course-ai-usage.service.d.ts +58 -0
  14. package/dist/course/course-ai-usage.service.d.ts.map +1 -0
  15. package/dist/course/course-ai-usage.service.js +176 -0
  16. package/dist/course/course-ai-usage.service.js.map +1 -0
  17. package/dist/course/course-audio-transcription.service.d.ts +65 -1
  18. package/dist/course/course-audio-transcription.service.d.ts.map +1 -1
  19. package/dist/course/course-audio-transcription.service.js +381 -29
  20. package/dist/course/course-audio-transcription.service.js.map +1 -1
  21. package/dist/course/course-export-scorm12.service.d.ts +3 -0
  22. package/dist/course/course-export-scorm12.service.d.ts.map +1 -1
  23. package/dist/course/course-export-scorm12.service.js +141 -6
  24. package/dist/course/course-export-scorm12.service.js.map +1 -1
  25. package/dist/course/course-export.service.d.ts.map +1 -1
  26. package/dist/course/course-export.service.js +2 -1
  27. package/dist/course/course-export.service.js.map +1 -1
  28. package/dist/course/course-lesson.controller.d.ts +25 -3
  29. package/dist/course/course-lesson.controller.d.ts.map +1 -1
  30. package/dist/course/course-lesson.controller.js +71 -8
  31. package/dist/course/course-lesson.controller.js.map +1 -1
  32. package/dist/course/course-structure.controller.d.ts +30 -7
  33. package/dist/course/course-structure.controller.d.ts.map +1 -1
  34. package/dist/course/course-structure.controller.js +37 -4
  35. package/dist/course/course-structure.controller.js.map +1 -1
  36. package/dist/course/course-structure.service.d.ts +37 -5
  37. package/dist/course/course-structure.service.d.ts.map +1 -1
  38. package/dist/course/course-structure.service.js +165 -20
  39. package/dist/course/course-structure.service.js.map +1 -1
  40. package/dist/course/course-transcription-translation.service.d.ts +31 -0
  41. package/dist/course/course-transcription-translation.service.d.ts.map +1 -0
  42. package/dist/course/course-transcription-translation.service.js +227 -0
  43. package/dist/course/course-transcription-translation.service.js.map +1 -0
  44. package/dist/course/course-video-agent-pipeline.service.d.ts +70 -0
  45. package/dist/course/course-video-agent-pipeline.service.d.ts.map +1 -0
  46. package/dist/course/course-video-agent-pipeline.service.js +398 -0
  47. package/dist/course/course-video-agent-pipeline.service.js.map +1 -0
  48. package/dist/course/course-video-hls.service.d.ts +14 -0
  49. package/dist/course/course-video-hls.service.d.ts.map +1 -1
  50. package/dist/course/course-video-hls.service.js +25 -8
  51. package/dist/course/course-video-hls.service.js.map +1 -1
  52. package/dist/course/course.controller.d.ts +2 -0
  53. package/dist/course/course.controller.d.ts.map +1 -1
  54. package/dist/course/course.module.d.ts.map +1 -1
  55. package/dist/course/course.module.js +9 -0
  56. package/dist/course/course.module.js.map +1 -1
  57. package/dist/course/course.service.d.ts +2 -0
  58. package/dist/course/course.service.d.ts.map +1 -1
  59. package/dist/course/course.service.js +36 -2
  60. package/dist/course/course.service.js.map +1 -1
  61. package/dist/course/dto/create-course-bulk-job.dto.d.ts +2 -1
  62. package/dist/course/dto/create-course-bulk-job.dto.d.ts.map +1 -1
  63. package/dist/course/dto/create-course-bulk-job.dto.js +6 -1
  64. package/dist/course/dto/create-course-bulk-job.dto.js.map +1 -1
  65. package/dist/course/dto/create-course-export.dto.d.ts +1 -0
  66. package/dist/course/dto/create-course-export.dto.d.ts.map +1 -1
  67. package/dist/course/dto/create-course-export.dto.js +6 -0
  68. package/dist/course/dto/create-course-export.dto.js.map +1 -1
  69. package/dist/course/ffmpeg.util.d.ts +10 -0
  70. package/dist/course/ffmpeg.util.d.ts.map +1 -0
  71. package/dist/course/ffmpeg.util.js +79 -0
  72. package/dist/course/ffmpeg.util.js.map +1 -0
  73. package/dist/course/lms-bulk-upload-automation.service.d.ts +3 -1
  74. package/dist/course/lms-bulk-upload-automation.service.d.ts.map +1 -1
  75. package/dist/course/lms-bulk-upload-automation.service.js +33 -16
  76. package/dist/course/lms-bulk-upload-automation.service.js.map +1 -1
  77. package/dist/course/lms-bulk-upload.controller.d.ts +3 -0
  78. package/dist/course/lms-bulk-upload.controller.d.ts.map +1 -1
  79. package/dist/course/lms-bulk-upload.service.d.ts +3 -0
  80. package/dist/course/lms-bulk-upload.service.d.ts.map +1 -1
  81. package/dist/course/lms-bulk-upload.service.js +48 -29
  82. package/dist/course/lms-bulk-upload.service.js.map +1 -1
  83. package/dist/course/subtitle.util.d.ts +46 -0
  84. package/dist/course/subtitle.util.d.ts.map +1 -0
  85. package/dist/course/subtitle.util.js +206 -0
  86. package/dist/course/subtitle.util.js.map +1 -0
  87. package/dist/enterprise/training/training-admin.controller.d.ts +2 -0
  88. package/dist/enterprise/training/training-admin.controller.d.ts.map +1 -1
  89. package/dist/enterprise/training/training-admin.service.d.ts +2 -0
  90. package/dist/enterprise/training/training-admin.service.d.ts.map +1 -1
  91. package/dist/enterprise/training/training-student.service.d.ts +27 -0
  92. package/dist/enterprise/training/training-student.service.d.ts.map +1 -1
  93. package/dist/enterprise/training/training-student.service.js +197 -10
  94. package/dist/enterprise/training/training-student.service.js.map +1 -1
  95. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.d.ts +3 -1
  96. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.d.ts.map +1 -1
  97. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.js +19 -5
  98. package/dist/lesson-xp-map/lesson-xp-ai-calculation.service.js.map +1 -1
  99. package/dist/lesson-xp-map/lesson-xp-map.module.d.ts.map +1 -1
  100. package/dist/lesson-xp-map/lesson-xp-map.module.js +2 -1
  101. package/dist/lesson-xp-map/lesson-xp-map.module.js.map +1 -1
  102. package/dist/libraries/lms/tsconfig.tsbuildinfo +1 -1
  103. package/dist/lms.module.d.ts.map +1 -1
  104. package/dist/lms.module.js +14 -0
  105. package/dist/lms.module.js.map +1 -1
  106. package/dist/platforma/dto/heartbeat.dto.d.ts +9 -0
  107. package/dist/platforma/dto/heartbeat.dto.d.ts.map +1 -0
  108. package/dist/platforma/dto/heartbeat.dto.js +50 -0
  109. package/dist/platforma/dto/heartbeat.dto.js.map +1 -0
  110. package/dist/platforma/handlers/emit-certificate.handler.d.ts +27 -0
  111. package/dist/platforma/handlers/emit-certificate.handler.d.ts.map +1 -0
  112. package/dist/platforma/handlers/emit-certificate.handler.js +117 -0
  113. package/dist/platforma/handlers/emit-certificate.handler.js.map +1 -0
  114. package/dist/platforma/handlers/lesson-heartbeat.handler.d.ts +31 -0
  115. package/dist/platforma/handlers/lesson-heartbeat.handler.d.ts.map +1 -0
  116. package/dist/platforma/handlers/lesson-heartbeat.handler.js +281 -0
  117. package/dist/platforma/handlers/lesson-heartbeat.handler.js.map +1 -0
  118. package/dist/platforma/platforma-heartbeat.service.d.ts +10 -0
  119. package/dist/platforma/platforma-heartbeat.service.d.ts.map +1 -0
  120. package/dist/platforma/platforma-heartbeat.service.js +50 -0
  121. package/dist/platforma/platforma-heartbeat.service.js.map +1 -0
  122. package/dist/platforma/platforma-performance.service.d.ts +121 -0
  123. package/dist/platforma/platforma-performance.service.d.ts.map +1 -0
  124. package/dist/platforma/platforma-performance.service.js +500 -0
  125. package/dist/platforma/platforma-performance.service.js.map +1 -0
  126. package/dist/platforma/platforma-search.service.d.ts +21 -0
  127. package/dist/platforma/platforma-search.service.d.ts.map +1 -0
  128. package/dist/platforma/platforma-search.service.js +64 -0
  129. package/dist/platforma/platforma-search.service.js.map +1 -0
  130. package/dist/platforma/platforma-video.service.d.ts +8 -0
  131. package/dist/platforma/platforma-video.service.d.ts.map +1 -1
  132. package/dist/platforma/platforma-video.service.js +45 -2
  133. package/dist/platforma/platforma-video.service.js.map +1 -1
  134. package/dist/platforma/platforma.controller.d.ts +213 -1
  135. package/dist/platforma/platforma.controller.d.ts.map +1 -1
  136. package/dist/platforma/platforma.controller.js +159 -2
  137. package/dist/platforma/platforma.controller.js.map +1 -1
  138. package/dist/realtime/lms-realtime.controller.d.ts +2 -0
  139. package/dist/realtime/lms-realtime.controller.d.ts.map +1 -1
  140. package/dist/realtime/lms-realtime.controller.js +31 -0
  141. package/dist/realtime/lms-realtime.controller.js.map +1 -1
  142. package/dist/realtime/lms-realtime.service.d.ts +1 -1
  143. package/dist/realtime/lms-realtime.service.d.ts.map +1 -1
  144. package/dist/realtime/lms-realtime.service.js.map +1 -1
  145. package/dist/training/dto/create-training.dto.d.ts +9 -0
  146. package/dist/training/dto/create-training.dto.d.ts.map +1 -1
  147. package/dist/training/dto/create-training.dto.js +45 -1
  148. package/dist/training/dto/create-training.dto.js.map +1 -1
  149. package/dist/training/training.controller.d.ts +144 -0
  150. package/dist/training/training.controller.d.ts.map +1 -1
  151. package/dist/training/training.service.d.ts +149 -0
  152. package/dist/training/training.service.d.ts.map +1 -1
  153. package/dist/training/training.service.js +332 -167
  154. package/dist/training/training.service.js.map +1 -1
  155. package/hedhog/data/image_type.yaml +10 -0
  156. package/hedhog/data/route.yaml +251 -0
  157. package/hedhog/data/setting_group.yaml +97 -0
  158. package/hedhog/frontend/app/bulk-upload-sessions/page.tsx.ejs +139 -27
  159. package/hedhog/frontend/app/certificates/models/page.tsx.ejs +182 -29
  160. package/hedhog/frontend/app/classes/_components/classes-calendar-view.tsx.ejs +277 -0
  161. package/hedhog/frontend/app/classes/page.tsx.ejs +127 -20
  162. package/hedhog/frontend/app/courses/[id]/_components/CourseFlagsCard.tsx.ejs +69 -57
  163. package/hedhog/frontend/app/courses/[id]/_components/CourseIssuedCertificatesCard.tsx.ejs +168 -0
  164. package/hedhog/frontend/app/courses/[id]/structure/_components/course-ai-costs-tab.tsx.ejs +191 -0
  165. package/hedhog/frontend/app/courses/[id]/structure/_components/course-export-sheet.tsx.ejs +81 -1
  166. package/hedhog/frontend/app/courses/[id]/structure/_components/course-exports-tab.tsx.ejs +12 -0
  167. package/hedhog/frontend/app/courses/[id]/structure/_components/course-overview-tab.tsx.ejs +141 -30
  168. package/hedhog/frontend/app/courses/[id]/structure/_components/course-xp-overview-tab.tsx.ejs +13 -13
  169. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-course.tsx.ejs +69 -1
  170. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson-xp-tab.tsx.ejs +11 -23
  171. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson.tsx.ejs +267 -19
  172. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-bulk.tsx.ejs +114 -86
  173. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-course.tsx.ejs +239 -31
  174. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-lesson.tsx.ejs +344 -59
  175. package/hedhog/frontend/app/courses/[id]/structure/_components/lesson-video-preview.tsx.ejs +200 -0
  176. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row-lesson.tsx.ejs +1 -0
  177. package/hedhog/frontend/app/courses/[id]/structure/_components/types.ts.ejs +3 -0
  178. package/hedhog/frontend/app/courses/[id]/structure/_components/xp-premium-pills.tsx.ejs +1 -8
  179. package/hedhog/frontend/app/courses/[id]/structure/_data/adapters/course-structure.adapter.ts.ejs +19 -7
  180. package/hedhog/frontend/app/courses/[id]/structure/_data/types/api-course.types.ts.ejs +4 -0
  181. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-ai-costs.ts.ejs +40 -0
  182. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-content-overview.ts.ejs +2 -0
  183. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-exports.ts.ejs +25 -0
  184. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-structure-mutations.ts.ejs +148 -0
  185. package/hedhog/frontend/app/courses/[id]/structure/_data/use-transcription-segments.ts.ejs +157 -8
  186. package/hedhog/frontend/app/courses/_components/CourseRowActions.tsx.ejs +1 -22
  187. package/hedhog/frontend/app/courses/page.tsx.ejs +66 -13
  188. package/hedhog/frontend/app/enterprise/[id]/page.tsx.ejs +6 -0
  189. package/hedhog/frontend/app/enterprise/_components/enterprise-classes-calendar-tab.tsx.ejs +264 -0
  190. package/hedhog/frontend/app/enterprise/page.tsx.ejs +104 -47
  191. package/hedhog/frontend/app/exams/page.tsx.ejs +38 -4
  192. package/hedhog/frontend/app/instructors/page.tsx.ejs +87 -46
  193. package/hedhog/frontend/app/paths/page.tsx.ejs +650 -168
  194. package/hedhog/frontend/app/training/page.tsx.ejs +38 -4
  195. package/hedhog/frontend/messages/en.json +41 -12
  196. package/hedhog/frontend/messages/pt.json +44 -13
  197. package/hedhog/query/triggers.sql +33 -0
  198. package/hedhog/table/course_ai_usage.yaml +46 -0
  199. package/hedhog/table/course_enrollment.yaml +3 -0
  200. package/hedhog/table/course_lesson.yaml +3 -0
  201. package/hedhog/table/course_lesson_answer.yaml +37 -0
  202. package/hedhog/table/course_lesson_transcription_segment.yaml +8 -0
  203. package/hedhog/table/learning_path.yaml +6 -0
  204. package/hedhog/table/learning_path_module.yaml +22 -0
  205. package/hedhog/table/learning_path_step.yaml +9 -6
  206. package/hedhog/table/lesson_view_event.yaml +66 -0
  207. package/package.json +8 -7
  208. package/src/certificate/certificate.controller.ts +2 -0
  209. package/src/certificate/certificate.service.ts +99 -0
  210. package/src/course/course-ai-usage.service.ts +221 -0
  211. package/src/course/course-audio-transcription.service.ts +471 -43
  212. package/src/course/course-export-scorm12.service.ts +149 -5
  213. package/src/course/course-export.service.ts +1 -0
  214. package/src/course/course-lesson.controller.ts +59 -6
  215. package/src/course/course-structure.controller.ts +19 -1
  216. package/src/course/course-structure.service.ts +184 -10
  217. package/src/course/course-transcription-translation.service.ts +293 -0
  218. package/src/course/course-video-agent-pipeline.service.ts +471 -0
  219. package/src/course/course-video-hls.service.ts +30 -10
  220. package/src/course/course.module.ts +9 -0
  221. package/src/course/course.service.ts +46 -1
  222. package/src/course/dto/create-course-bulk-job.dto.ts +7 -3
  223. package/src/course/dto/create-course-export.dto.ts +6 -0
  224. package/src/course/ffmpeg.util.ts +65 -0
  225. package/src/course/lms-bulk-upload-automation.service.ts +33 -8
  226. package/src/course/lms-bulk-upload.service.ts +20 -1
  227. package/src/course/subtitle.util.ts +220 -0
  228. package/src/enterprise/training/training-student.service.ts +224 -4
  229. package/src/lesson-xp-map/lesson-xp-ai-calculation.service.ts +14 -0
  230. package/src/lesson-xp-map/lesson-xp-map.module.ts +2 -1
  231. package/src/lms.module.ts +14 -0
  232. package/src/platforma/dto/heartbeat.dto.ts +30 -0
  233. package/src/platforma/handlers/emit-certificate.handler.ts +117 -0
  234. package/src/platforma/handlers/lesson-heartbeat.handler.ts +343 -0
  235. package/src/platforma/platforma-heartbeat.service.ts +33 -0
  236. package/src/platforma/platforma-performance.service.ts +606 -0
  237. package/src/platforma/platforma-search.service.ts +48 -0
  238. package/src/platforma/platforma-video.service.ts +59 -3
  239. package/src/platforma/platforma.controller.ts +130 -0
  240. package/src/realtime/lms-realtime.controller.ts +27 -1
  241. package/src/realtime/lms-realtime.service.ts +2 -1
  242. package/src/training/dto/create-training.dto.ts +36 -0
  243. package/src/training/training.service.ts +360 -163
@@ -448,7 +448,7 @@ const STATUS_MAP: Record<
448
448
  encerrada: { label: 'Encerrada', variant: 'outline' },
449
449
  };
450
450
 
451
- const PAGE_SIZES = [6, 12, 24];
451
+ const DEFAULT_PAGE_SIZES = [6, 12, 24, 48, 96] as const;
452
452
  const API_TRAINING_CACHE_KEY = 'lms:training:api-cache';
453
453
 
454
454
  // ── Animations ────────────────────────────────────────────────────────────────
@@ -564,10 +564,44 @@ export default function TrainingPage() {
564
564
 
565
565
  // Pagination
566
566
  const [currentPage, setCurrentPage] = useState(1);
567
+
568
+ const { data: generalSettings } = useQuery<{
569
+ data: Array<{ slug: string; value: string }>;
570
+ }>({
571
+ queryKey: ['setting-group-general'],
572
+ queryFn: async () => {
573
+ const response = await request<{
574
+ data: Array<{ slug: string; value: string }>;
575
+ }>({
576
+ url: '/setting/group/general',
577
+ method: 'GET',
578
+ });
579
+ return response.data;
580
+ },
581
+ staleTime: 5 * 60 * 1000,
582
+ });
583
+
584
+ const pageSizeOptions = useMemo(() => {
585
+ const setting = generalSettings?.data?.find(
586
+ (s) => s.slug === 'pagination-page-sizes'
587
+ );
588
+ if (!setting?.value) return DEFAULT_PAGE_SIZES;
589
+ try {
590
+ const parsed = JSON.parse(setting.value) as string[];
591
+ const sizes = parsed
592
+ .map(Number)
593
+ .filter((n) => !isNaN(n) && n > 0)
594
+ .sort((a, b) => a - b);
595
+ return sizes.length > 0 ? sizes : DEFAULT_PAGE_SIZES;
596
+ } catch {
597
+ return DEFAULT_PAGE_SIZES;
598
+ }
599
+ }, [generalSettings]);
600
+
567
601
  const [pageSize, setPageSize] = usePersistedPageSize({
568
602
  storageKey: 'pagination:global:pageSize',
569
603
  defaultValue: 12,
570
- allowedValues: PAGE_SIZES,
604
+ allowedValues: pageSizeOptions,
571
605
  });
572
606
 
573
607
  const sensors = useSensors(
@@ -1490,7 +1524,7 @@ export default function TrainingPage() {
1490
1524
  ],
1491
1525
  },
1492
1526
  ]}
1493
- afterSearchButton={
1527
+ actions={
1494
1528
  <ViewModeToggle
1495
1529
  viewMode={viewMode}
1496
1530
  onViewModeChange={setViewMode}
@@ -1838,7 +1872,7 @@ export default function TrainingPage() {
1838
1872
  setPageSize(nextPageSize);
1839
1873
  setCurrentPage(1);
1840
1874
  }}
1841
- pageSizeOptions={PAGE_SIZES}
1875
+ pageSizeOptions={pageSizeOptions}
1842
1876
  />
1843
1877
  </div>
1844
1878
  )}
@@ -418,10 +418,17 @@
418
418
  "xp": "XP",
419
419
  "media": "Media",
420
420
  "resources": "Resources",
421
- "extra": "Extra",
421
+ "extra": "Certificate",
422
422
  "publish": "Publish",
423
423
  "videoProfiles": "Resolutions"
424
424
  },
425
+ "issuedCertificates": {
426
+ "title": "Issued certificates",
427
+ "description": "Certificates already issued to students of this course.",
428
+ "empty": "No certificates issued for this course yet.",
429
+ "issuedAt": "Issued on",
430
+ "openPdf": "Open PDF"
431
+ },
425
432
  "structureTab": {
426
433
  "summary": {
427
434
  "title": "Content summary",
@@ -555,6 +562,13 @@
555
562
  "withTranscription": "With transcription",
556
563
  "withXp": "With XP"
557
564
  },
565
+ "videoPipeline": {
566
+ "title": "Video pipeline",
567
+ "description": "Video lessons by stage: total → has video → processed",
568
+ "total": "Video lessons",
569
+ "withVideo": "With video",
570
+ "withProcessedVideo": "Video processed"
571
+ },
558
572
  "areas": {
559
573
  "title": "Macro areas",
560
574
  "description": "Areas mapped across lessons, ordered by XP weight"
@@ -588,7 +602,8 @@
588
602
  "session": "At least one session created",
589
603
  "lesson": "At least one lesson created",
590
604
  "publishedLessons": "At least one lesson published",
591
- "certificate": "Certificate template defined (when enabled)"
605
+ "certificate": "Certificate template defined (when enabled)",
606
+ "listed": "Course listed in catalog"
592
607
  }
593
608
  }
594
609
  },
@@ -695,7 +710,9 @@
695
710
  "published": "Published",
696
711
  "active": "Active",
697
712
  "draft": "Draft",
698
- "archived": "Archived"
713
+ "archived": "Archived",
714
+ "listed": "Listed",
715
+ "unlisted": "Unlisted"
699
716
  },
700
717
  "table": {
701
718
  "headers": {
@@ -927,14 +944,19 @@
927
944
  "bulkEditor": {
928
945
  "title": "Bulk edit",
929
946
  "clearSelection": "Clear selection",
947
+ "apply": "Apply",
948
+ "more": "more",
930
949
  "productionStatus": "Production status",
931
950
  "keepCurrent": "Keep current",
932
- "visibilityTitle": "Visibility",
951
+ "publishTitle": "Publication",
952
+ "publish": {
953
+ "on": "Publish",
954
+ "off": "Unpublish"
955
+ },
933
956
  "moveToSession": "Move to session",
934
957
  "selectSession": "Select session…",
935
- "apiNotice": "Bulk changes are not integrated with the API yet. Click save to preview.",
936
958
  "toast": {
937
- "preview": "Bulk edit: {changes} (mock)",
959
+ "moving": "{count} lessons being moved…",
938
960
  "none": "No change selected"
939
961
  },
940
962
  "types": {
@@ -949,11 +971,6 @@
949
971
  "editada": "Edited",
950
972
  "finalizada": "Finalized",
951
973
  "publicada": "Published"
952
- },
953
- "visibility": {
954
- "publico": "Public",
955
- "privado": "Private",
956
- "restrito": "Restricted"
957
974
  }
958
975
  },
959
976
  "multiSelectBar": {
@@ -1169,7 +1186,7 @@
1169
1186
  "update": "Update",
1170
1187
  "save": "Save lesson",
1171
1188
  "tabData": "Data",
1172
- "tabVideos": "Videos",
1189
+ "tabVideos": "Video",
1173
1190
  "tabAudios": "Audios",
1174
1191
  "tabTranscription": "Transcription",
1175
1192
  "tabResources": "Resources",
@@ -2084,6 +2101,7 @@
2084
2101
  "selectAtLeastOneItem": "Select at least one item for the training.",
2085
2102
  "selectAtLeastOneCourse": "Select at least one course for the training.",
2086
2103
  "selectCoursesFromSelectedArea": "Select only courses from the selected area.",
2104
+ "modulesTitleRequired": "All modules must have a title.",
2087
2105
  "openingFormacao": "Opening \"{nome}\"...",
2088
2106
  "openingDetails": "Opening training..."
2089
2107
  }
@@ -3049,6 +3067,17 @@
3049
3067
  "cancel": "Cancel",
3050
3068
  "delete": "Remove"
3051
3069
  }
3070
+ },
3071
+ "viewMode": {
3072
+ "list": "Show as list",
3073
+ "cards": "Show as cards"
3074
+ },
3075
+ "table": {
3076
+ "name": "Name",
3077
+ "slug": "Slug",
3078
+ "status": "Status",
3079
+ "updatedAt": "Updated at",
3080
+ "actions": "Actions"
3052
3081
  }
3053
3082
  },
3054
3083
  "ClassesPage": {
@@ -427,10 +427,17 @@
427
427
  "xp": "XP",
428
428
  "media": "Mídia",
429
429
  "resources": "Recursos",
430
- "extra": "Extra",
430
+ "extra": "Certificado",
431
431
  "publish": "Publicação",
432
432
  "videoProfiles": "Resoluções"
433
433
  },
434
+ "issuedCertificates": {
435
+ "title": "Certificados emitidos",
436
+ "description": "Certificados já emitidos para os alunos deste curso.",
437
+ "empty": "Nenhum certificado emitido para este curso ainda.",
438
+ "issuedAt": "Emitido em",
439
+ "openPdf": "Abrir PDF"
440
+ },
434
441
  "structureTab": {
435
442
  "summary": {
436
443
  "title": "Resumo do conteúdo",
@@ -564,6 +571,13 @@
564
571
  "withTranscription": "Com transcrição",
565
572
  "withXp": "Com XP"
566
573
  },
574
+ "videoPipeline": {
575
+ "title": "Pipeline de vídeo",
576
+ "description": "Aulas de vídeo por estágio: total → com vídeo → processado",
577
+ "total": "Aulas de vídeo",
578
+ "withVideo": "Com vídeo",
579
+ "withProcessedVideo": "Vídeo processado"
580
+ },
567
581
  "areas": {
568
582
  "title": "Áreas macro",
569
583
  "description": "Áreas mapeadas nas aulas, ordenadas por peso de XP"
@@ -597,7 +611,8 @@
597
611
  "session": "Pelo menos uma sessão criada",
598
612
  "lesson": "Pelo menos uma aula criada",
599
613
  "publishedLessons": "Pelo menos uma aula publicada",
600
- "certificate": "Modelo de certificado definido (quando habilitado)"
614
+ "certificate": "Modelo de certificado definido (quando habilitado)",
615
+ "listed": "Curso listado no catálogo"
601
616
  }
602
617
  }
603
618
  },
@@ -704,7 +719,9 @@
704
719
  "published": "Publicado",
705
720
  "active": "Ativo",
706
721
  "draft": "Rascunho",
707
- "archived": "Arquivado"
722
+ "archived": "Arquivado",
723
+ "listed": "Listado",
724
+ "unlisted": "Não listado"
708
725
  },
709
726
  "table": {
710
727
  "headers": {
@@ -936,14 +953,19 @@
936
953
  "bulkEditor": {
937
954
  "title": "Edição em massa",
938
955
  "clearSelection": "Limpar seleção",
956
+ "apply": "Aplicar",
957
+ "more": "mais",
939
958
  "productionStatus": "Status de produção",
940
959
  "keepCurrent": "Manter atual",
941
- "visibilityTitle": "Visibilidade",
960
+ "publishTitle": "Publicação",
961
+ "publish": {
962
+ "on": "Publicar",
963
+ "off": "Despublicar"
964
+ },
942
965
  "moveToSession": "Mover para sessão",
943
966
  "selectSession": "Selecionar sessão…",
944
- "apiNotice": "As alterações em massa ainda não estão integradas com a API. Clique em salvar para ver a pré-visualização.",
945
967
  "toast": {
946
- "preview": "Edição em massa: {changes} (mock)",
968
+ "moving": "{count} aulas sendo movidas…",
947
969
  "none": "Nenhuma alteração selecionada"
948
970
  },
949
971
  "types": {
@@ -958,11 +980,6 @@
958
980
  "editada": "Editada",
959
981
  "finalizada": "Finalizada",
960
982
  "publicada": "Publicada"
961
- },
962
- "visibility": {
963
- "publico": "Público",
964
- "privado": "Privado",
965
- "restrito": "Restrito"
966
983
  }
967
984
  },
968
985
  "multiSelectBar": {
@@ -1178,7 +1195,7 @@
1178
1195
  "update": "Atualizar",
1179
1196
  "save": "Salvar aula",
1180
1197
  "tabData": "Dados",
1181
- "tabVideos": "Vídeos",
1198
+ "tabVideos": "Vídeo",
1182
1199
  "tabAudios": "Áudios",
1183
1200
  "tabTranscription": "Transcrição",
1184
1201
  "tabResources": "Recursos",
@@ -2108,6 +2125,7 @@
2108
2125
  "selectAtLeastOneItem": "Selecione pelo menos um item para a formação.",
2109
2126
  "selectAtLeastOneCourse": "Selecione pelo menos um curso para a formação.",
2110
2127
  "selectCoursesFromSelectedArea": "Selecione apenas cursos da área escolhida.",
2128
+ "modulesTitleRequired": "Todos os módulos precisam de um título.",
2111
2129
  "openingFormacao": "Abrindo \"{nome}\"...",
2112
2130
  "openingDetails": "Abrindo formação..."
2113
2131
  }
@@ -3071,6 +3089,17 @@
3071
3089
  "cancel": "Cancelar",
3072
3090
  "delete": "Remover"
3073
3091
  }
3092
+ },
3093
+ "viewMode": {
3094
+ "list": "Visualizar em lista",
3095
+ "cards": "Visualizar em cards"
3096
+ },
3097
+ "table": {
3098
+ "name": "Nome",
3099
+ "slug": "Slug",
3100
+ "status": "Status",
3101
+ "updatedAt": "Atualizado em",
3102
+ "actions": "Ações"
3074
3103
  }
3075
3104
  },
3076
3105
  "ClassesPage": {
@@ -3152,7 +3181,8 @@
3152
3181
  },
3153
3182
  "viewMode": {
3154
3183
  "list": "Visualizar em lista",
3155
- "cards": "Visualizar em cards"
3184
+ "cards": "Visualizar em cards",
3185
+ "calendar": "Visualizar em calendário"
3156
3186
  },
3157
3187
  "pagination": {
3158
3188
  "class": "turma",
@@ -4569,6 +4599,7 @@
4569
4599
  "users": "Usuários",
4570
4600
  "courses": "Cursos",
4571
4601
  "classes": "Turmas",
4602
+ "classesCalendar": "Calendário de Turmas",
4572
4603
  "billing": "Faturamento",
4573
4604
  "students": "Alunos",
4574
4605
  "administrators": "Administradores",
@@ -51,3 +51,36 @@ AFTER INSERT OR UPDATE OR DELETE
51
51
  ON bitcode_wallet_transaction
52
52
  FOR EACH ROW
53
53
  EXECUTE FUNCTION sync_bitcode_wallet_balance();
54
+
55
+ -- Keeps course_lesson.has_transcription in sync so the course tree can show
56
+ -- the transcription indicator without loading each lesson's segments.
57
+ CREATE OR REPLACE FUNCTION fn_course_lesson_sync_has_transcription()
58
+ RETURNS TRIGGER
59
+ LANGUAGE plpgsql
60
+ AS $$
61
+ BEGIN
62
+ IF TG_OP = 'INSERT' THEN
63
+ UPDATE course_lesson
64
+ SET has_transcription = true
65
+ WHERE id = NEW.course_lesson_id
66
+ AND has_transcription = false;
67
+ ELSIF TG_OP = 'DELETE' THEN
68
+ UPDATE course_lesson
69
+ SET has_transcription = EXISTS (
70
+ SELECT 1 FROM course_lesson_transcription_segment
71
+ WHERE course_lesson_id = OLD.course_lesson_id
72
+ )
73
+ WHERE id = OLD.course_lesson_id;
74
+ END IF;
75
+ RETURN NULL;
76
+ END;
77
+ $$;
78
+
79
+ DROP TRIGGER IF EXISTS trg_course_lesson_segment_has_transcription
80
+ ON course_lesson_transcription_segment;
81
+
82
+ CREATE TRIGGER trg_course_lesson_segment_has_transcription
83
+ AFTER INSERT OR DELETE
84
+ ON course_lesson_transcription_segment
85
+ FOR EACH ROW
86
+ EXECUTE FUNCTION fn_course_lesson_sync_has_transcription();
@@ -0,0 +1,46 @@
1
+ columns:
2
+ - type: pk
3
+ - name: course_id
4
+ type: fk
5
+ references:
6
+ table: course
7
+ column: id
8
+ onDelete: CASCADE
9
+ - name: course_lesson_id
10
+ type: fk
11
+ isNullable: true
12
+ references:
13
+ table: course_lesson
14
+ column: id
15
+ onDelete: SET NULL
16
+ - name: job_type
17
+ type: enum
18
+ values: [transcription, translation, xp_calculation]
19
+ - name: provider
20
+ type: varchar
21
+ length: 50
22
+ - name: model
23
+ type: varchar
24
+ length: 100
25
+ - name: input_tokens
26
+ type: int
27
+ isNullable: true
28
+ - name: output_tokens
29
+ type: int
30
+ isNullable: true
31
+ - name: audio_seconds
32
+ type: decimal
33
+ precision: 12
34
+ scale: 3
35
+ isNullable: true
36
+ - name: cost_usd
37
+ type: decimal
38
+ precision: 12
39
+ scale: 6
40
+ default: 0
41
+ - type: created_at
42
+
43
+ indices:
44
+ - columns: [course_id]
45
+ - columns: [course_id, job_type]
46
+ - columns: [course_lesson_id]
@@ -34,6 +34,9 @@ columns:
34
34
  - name: final_score
35
35
  type: int
36
36
  isNullable: true
37
+ - name: certificate_issued_at
38
+ type: datetime
39
+ isNullable: true
37
40
  - type: created_at
38
41
  - type: updated_at
39
42
 
@@ -29,6 +29,9 @@ columns:
29
29
  - name: published
30
30
  type: boolean
31
31
  default: false
32
+ - name: has_transcription
33
+ type: boolean
34
+ default: false
32
35
  - type: created_at
33
36
  - type: updated_at
34
37
 
@@ -0,0 +1,37 @@
1
+ columns:
2
+ - type: pk
3
+ - name: user_id
4
+ type: int
5
+ - name: course_lesson_id
6
+ type: fk
7
+ references:
8
+ table: course_lesson
9
+ column: id
10
+ onDelete: CASCADE
11
+ - name: question_id
12
+ type: fk
13
+ references:
14
+ table: question
15
+ column: id
16
+ onDelete: CASCADE
17
+ - name: exam_option_id
18
+ type: fk
19
+ isNullable: true
20
+ references:
21
+ table: exam_option
22
+ column: id
23
+ onDelete: SET NULL
24
+ - name: answer_text
25
+ type: text
26
+ isNullable: true
27
+ - name: is_correct
28
+ type: boolean
29
+ isNullable: true
30
+ - type: created_at
31
+ - type: updated_at
32
+
33
+ indices:
34
+ - columns: [user_id, course_lesson_id, question_id]
35
+ isUnique: true
36
+ - columns: [course_lesson_id]
37
+ - columns: [question_id]
@@ -6,6 +6,13 @@ columns:
6
6
  table: course_lesson
7
7
  column: id
8
8
  onDelete: CASCADE
9
+ - name: locale_id
10
+ type: fk
11
+ isNullable: true
12
+ references:
13
+ table: locale
14
+ column: id
15
+ onDelete: SET NULL
9
16
  - name: start_seconds
10
17
  type: NUMERIC(10,3)
11
18
  default: 0
@@ -19,4 +26,5 @@ columns:
19
26
 
20
27
  indices:
21
28
  - columns: [course_lesson_id]
29
+ - columns: [course_lesson_id, locale_id]
22
30
  - columns: [course_lesson_id, start_seconds]
@@ -44,6 +44,12 @@ columns:
44
44
  type: varchar
45
45
  length: 9
46
46
  isNullable: true
47
+ - name: certificate_template_id
48
+ type: int
49
+ isNullable: true
50
+ references:
51
+ table: certificate_template
52
+ column: id
47
53
  - type: created_at
48
54
  - type: updated_at
49
55
 
@@ -0,0 +1,22 @@
1
+ columns:
2
+ - type: pk
3
+ - name: learning_path_id
4
+ type: fk
5
+ references:
6
+ table: learning_path
7
+ column: id
8
+ onDelete: CASCADE
9
+ - name: title
10
+ type: varchar
11
+ length: 255
12
+ - name: description
13
+ type: text
14
+ isNullable: true
15
+ - type: order
16
+ - type: created_at
17
+ - type: updated_at
18
+
19
+ indices:
20
+ - columns: [learning_path_id]
21
+ - columns: [learning_path_id, order]
22
+ isUnique: true
@@ -6,6 +6,12 @@ columns:
6
6
  table: learning_path
7
7
  column: id
8
8
  onDelete: CASCADE
9
+ - name: learning_path_module_id
10
+ type: fk
11
+ references:
12
+ table: learning_path_module
13
+ column: id
14
+ onDelete: CASCADE
9
15
  - name: step_type
10
16
  type: enum
11
17
  values: [course, exam]
@@ -31,13 +37,10 @@ columns:
31
37
  - type: updated_at
32
38
 
33
39
  indices:
34
- - columns: [learning_path_id, order]
35
- isUnique: true
36
- - columns: [learning_path_id, course_id]
37
- isUnique: true
38
- - columns: [learning_path_id, exam_id]
39
- isUnique: true
40
40
  - columns: [learning_path_id]
41
+ - columns: [learning_path_module_id]
42
+ - columns: [learning_path_module_id, order]
43
+ isUnique: true
41
44
  - columns: [step_type]
42
45
  - columns: [course_id]
43
46
  - columns: [exam_id]
@@ -0,0 +1,66 @@
1
+ columns:
2
+ - type: pk
3
+ - name: user_id
4
+ type: int
5
+ isNullable: true
6
+ - name: course_lesson_id
7
+ type: fk
8
+ isNullable: true
9
+ references:
10
+ table: course_lesson
11
+ column: id
12
+ onDelete: SET NULL
13
+ - name: course_enrollment_id
14
+ type: fk
15
+ isNullable: true
16
+ references:
17
+ table: course_enrollment
18
+ column: id
19
+ onDelete: SET NULL
20
+ - name: session_id
21
+ type: varchar
22
+ length: 36
23
+ isNullable: true
24
+ - name: video_position_seconds
25
+ type: int
26
+ default: 0
27
+ - name: ip
28
+ type: varchar
29
+ length: 45
30
+ isNullable: true
31
+ - name: country
32
+ type: varchar
33
+ length: 2
34
+ isNullable: true
35
+ - name: city
36
+ type: varchar
37
+ length: 100
38
+ isNullable: true
39
+ - name: browser
40
+ type: varchar
41
+ length: 50
42
+ isNullable: true
43
+ - name: os
44
+ type: varchar
45
+ length: 50
46
+ isNullable: true
47
+ - name: device_type
48
+ type: varchar
49
+ length: 20
50
+ isNullable: true
51
+ - name: screen_width
52
+ type: int
53
+ isNullable: true
54
+ - name: screen_height
55
+ type: int
56
+ isNullable: true
57
+ - name: is_touch
58
+ type: boolean
59
+ default: false
60
+ - type: created_at
61
+
62
+ indices:
63
+ - columns: [user_id, created_at]
64
+ - columns: [course_lesson_id, created_at]
65
+ - columns: [created_at]
66
+ - columns: [course_enrollment_id]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hed-hog/lms",
3
- "version": "0.0.365",
3
+ "version": "0.0.370",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "dependencies": {
@@ -17,13 +17,14 @@
17
17
  "@hed-hog/api-locale": "0.0.14",
18
18
  "@hed-hog/api-pagination": "0.0.7",
19
19
  "@hed-hog/api-types": "0.0.1",
20
- "@hed-hog/category": "0.0.365",
21
- "@hed-hog/crm": "0.0.365",
22
20
  "@hed-hog/api": "0.0.8",
23
- "@hed-hog/finance": "0.0.365",
24
- "@hed-hog/commerce": "0.0.365",
25
- "@hed-hog/queue": "0.0.365",
26
- "@hed-hog/core": "0.0.365"
21
+ "@hed-hog/category": "0.0.370",
22
+ "@hed-hog/crm": "0.0.370",
23
+ "@hed-hog/commerce": "0.0.370",
24
+ "@hed-hog/finance": "0.0.370",
25
+ "@hed-hog/core": "0.0.370",
26
+ "@hed-hog/queue": "0.0.370",
27
+ "@hed-hog/agent": "0.0.370"
27
28
  },
28
29
  "exports": {
29
30
  ".": {
@@ -78,12 +78,14 @@ export class LmsCertificateController {
78
78
  @Query('pageSize') pageSize?: string,
79
79
  @Query('search') search?: string,
80
80
  @Query('type') type?: string,
81
+ @Query('courseId') courseId?: string,
81
82
  ) {
82
83
  return this.certificateService.listIssued({
83
84
  page: page ? Number(page) : 1,
84
85
  pageSize: pageSize ? Number(pageSize) : 12,
85
86
  search,
86
87
  type,
88
+ courseId: courseId ? Number(courseId) : undefined,
87
89
  });
88
90
  }
89
91