@hed-hog/lms 0.0.305 → 0.0.309

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 (130) hide show
  1. package/dist/course/course-structure.controller.d.ts +60 -0
  2. package/dist/course/course-structure.controller.d.ts.map +1 -1
  3. package/dist/course/course-structure.controller.js +79 -0
  4. package/dist/course/course-structure.controller.js.map +1 -1
  5. package/dist/course/course-structure.service.d.ts +61 -1
  6. package/dist/course/course-structure.service.d.ts.map +1 -1
  7. package/dist/course/course-structure.service.js +326 -1
  8. package/dist/course/course-structure.service.js.map +1 -1
  9. package/dist/course/course.controller.d.ts +52 -4
  10. package/dist/course/course.controller.d.ts.map +1 -1
  11. package/dist/course/course.service.d.ts +52 -5
  12. package/dist/course/course.service.d.ts.map +1 -1
  13. package/dist/course/course.service.js +81 -60
  14. package/dist/course/course.service.js.map +1 -1
  15. package/dist/course/dto/create-course-structure-lesson.dto.d.ts.map +1 -1
  16. package/dist/course/dto/create-course-structure-lesson.dto.js +5 -1
  17. package/dist/course/dto/create-course-structure-lesson.dto.js.map +1 -1
  18. package/dist/course/dto/create-course.dto.d.ts +1 -1
  19. package/dist/course/dto/create-course.dto.d.ts.map +1 -1
  20. package/dist/course/dto/create-course.dto.js +4 -1
  21. package/dist/course/dto/create-course.dto.js.map +1 -1
  22. package/dist/course/dto/move-lesson.dto.d.ts +10 -0
  23. package/dist/course/dto/move-lesson.dto.d.ts.map +1 -0
  24. package/dist/{enterprise/dto/add-enterprise-lead.dto.js → course/dto/move-lesson.dto.js} +12 -6
  25. package/dist/course/dto/move-lesson.dto.js.map +1 -0
  26. package/dist/course/dto/paste-lessons.dto.d.ts +4 -0
  27. package/dist/course/dto/paste-lessons.dto.d.ts.map +1 -0
  28. package/dist/course/dto/paste-lessons.dto.js +24 -0
  29. package/dist/course/dto/paste-lessons.dto.js.map +1 -0
  30. package/dist/course/dto/reorder-lessons.dto.d.ts +5 -0
  31. package/dist/course/dto/reorder-lessons.dto.d.ts.map +1 -0
  32. package/dist/course/dto/reorder-lessons.dto.js +24 -0
  33. package/dist/course/dto/reorder-lessons.dto.js.map +1 -0
  34. package/dist/course/dto/reorder-sessions.dto.d.ts +5 -0
  35. package/dist/course/dto/reorder-sessions.dto.d.ts.map +1 -0
  36. package/dist/course/dto/reorder-sessions.dto.js +24 -0
  37. package/dist/course/dto/reorder-sessions.dto.js.map +1 -0
  38. package/dist/training/training.controller.js +1 -1
  39. package/dist/training/training.controller.js.map +1 -1
  40. package/hedhog/data/dashboard_component.yaml +152 -152
  41. package/hedhog/data/dashboard_item.yaml +166 -166
  42. package/hedhog/data/image_type.yaml +20 -0
  43. package/hedhog/data/menu.yaml +2 -2
  44. package/hedhog/data/route.yaml +60 -6
  45. package/hedhog/frontend/app/_components/class-form-sheet.tsx.ejs +146 -165
  46. package/hedhog/frontend/app/_components/course-avatar.tsx.ejs +70 -0
  47. package/hedhog/frontend/app/_components/course-form-sheet.tsx.ejs +372 -22
  48. package/hedhog/frontend/app/classes/[id]/page.tsx.ejs +437 -77
  49. package/hedhog/frontend/app/classes/page.tsx.ejs +311 -289
  50. package/hedhog/frontend/app/courses/[id]/_components/CourseCertificateCard.tsx.ejs +10 -7
  51. package/hedhog/frontend/app/courses/[id]/_components/CourseClassificationCard.tsx.ejs +23 -32
  52. package/hedhog/frontend/app/courses/[id]/_components/CourseContentCard.tsx.ejs +3 -9
  53. package/hedhog/frontend/app/courses/[id]/_components/CourseDangerZoneCard.tsx.ejs +26 -16
  54. package/hedhog/frontend/app/courses/[id]/_components/CourseFlagsCard.tsx.ejs +19 -5
  55. package/hedhog/frontend/app/courses/[id]/_components/CourseMainInfoCard.tsx.ejs +10 -14
  56. package/hedhog/frontend/app/courses/[id]/_components/CourseMediaCard.tsx.ejs +131 -107
  57. package/hedhog/frontend/app/courses/[id]/_components/CourseRelationsCard.tsx.ejs +10 -7
  58. package/hedhog/frontend/app/courses/[id]/_components/CourseSectionCard.tsx.ejs +38 -19
  59. package/hedhog/frontend/app/courses/[id]/_components/CourseSummaryCard.tsx.ejs +1 -1
  60. package/hedhog/frontend/app/courses/[id]/_components/course-edit-types.ts.ejs +1 -1
  61. package/hedhog/frontend/app/courses/[id]/page.tsx.ejs +336 -1057
  62. package/hedhog/frontend/app/courses/[id]/structure/_components/confirm-dialog.tsx.ejs +45 -0
  63. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree-dnd.tsx.ejs +362 -0
  64. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree-panel.tsx.ejs +111 -0
  65. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree-skeleton.tsx.ejs +64 -0
  66. package/hedhog/frontend/app/courses/[id]/structure/_components/course-tree.tsx.ejs +134 -0
  67. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-course.tsx.ejs +113 -0
  68. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-lesson.tsx.ejs +314 -0
  69. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-panel.tsx.ejs +62 -0
  70. package/hedhog/frontend/app/courses/[id]/structure/_components/detail-session.tsx.ejs +174 -0
  71. package/hedhog/frontend/app/courses/[id]/structure/_components/drag-handle.tsx.ejs +58 -0
  72. package/hedhog/frontend/app/courses/[id]/structure/_components/drag-overlay.tsx.ejs +52 -0
  73. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-bulk.tsx.ejs +276 -0
  74. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-course.tsx.ejs +1216 -0
  75. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-lesson.tsx.ejs +1827 -0
  76. package/hedhog/frontend/app/courses/[id]/structure/_components/editor-session.tsx.ejs +443 -0
  77. package/hedhog/frontend/app/courses/[id]/structure/_components/highlighted-text.tsx.ejs +41 -0
  78. package/hedhog/frontend/app/courses/[id]/structure/_components/mock-data.ts.ejs +184 -0
  79. package/hedhog/frontend/app/courses/[id]/structure/_components/multi-select-bar.tsx.ejs +264 -0
  80. package/hedhog/frontend/app/courses/[id]/structure/_components/search-filter.tsx.ejs +96 -0
  81. package/hedhog/frontend/app/courses/[id]/structure/_components/session-picker-dialog.tsx.ejs +74 -0
  82. package/hedhog/frontend/app/courses/[id]/structure/_components/shortcuts-help.tsx.ejs +136 -0
  83. package/hedhog/frontend/app/courses/[id]/structure/_components/sortable-tree-row.tsx.ejs +80 -0
  84. package/hedhog/frontend/app/courses/[id]/structure/_components/store.ts.ejs +948 -0
  85. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-context-menu.tsx.ejs +525 -0
  86. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-display-settings-popover.tsx.ejs +150 -0
  87. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-helpers.ts.ejs +182 -0
  88. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row-course.tsx.ejs +52 -0
  89. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row-lesson.tsx.ejs +271 -0
  90. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row-session.tsx.ejs +167 -0
  91. package/hedhog/frontend/app/courses/[id]/structure/_components/tree-row.tsx.ejs +108 -0
  92. package/hedhog/frontend/app/courses/[id]/structure/_components/types.ts.ejs +122 -0
  93. package/hedhog/frontend/app/courses/[id]/structure/_components/use-course-structure-shortcuts.ts.ejs +318 -0
  94. package/hedhog/frontend/app/courses/[id]/structure/_components/use-tree-display-settings.ts.ejs +97 -0
  95. package/hedhog/frontend/app/courses/[id]/structure/_data/adapters/course-structure.adapter.ts.ejs +347 -0
  96. package/hedhog/frontend/app/courses/[id]/structure/_data/course-structure-contract.ts.ejs +195 -0
  97. package/hedhog/frontend/app/courses/[id]/structure/_data/services/course-structure.service.ts.ejs +420 -0
  98. package/hedhog/frontend/app/courses/[id]/structure/_data/types/api-course.types.ts.ejs +254 -0
  99. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-structure-mutations.ts.ejs +987 -0
  100. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-structure-query.ts.ejs +86 -0
  101. package/hedhog/frontend/app/courses/[id]/structure/_data/use-course-structure.ts.ejs +160 -0
  102. package/hedhog/frontend/app/courses/[id]/structure/page.tsx.ejs +10 -3212
  103. package/hedhog/frontend/app/courses/page.tsx.ejs +45 -26
  104. package/hedhog/frontend/app/enterprise/[id]/page.tsx.ejs +317 -317
  105. package/hedhog/frontend/app/enterprise/_components/enterprise-class-create-sheet.tsx.ejs +1 -0
  106. package/hedhog/frontend/app/enterprise/_components/enterprise-mocks.ts.ejs +12 -1
  107. package/hedhog/frontend/app/enterprise/_components/enterprise-related-tab.tsx.ejs +44 -7
  108. package/hedhog/frontend/app/enterprise/_components/enterprise-types.ts.ejs +96 -96
  109. package/hedhog/frontend/app/page.tsx.ejs +5 -5
  110. package/hedhog/frontend/app/{training → paths}/page.tsx.ejs +29 -7
  111. package/hedhog/frontend/messages/en.json +88 -10
  112. package/hedhog/frontend/messages/pt.json +88 -10
  113. package/hedhog/table/course.yaml +16 -16
  114. package/hedhog/table/image_type.yaml +14 -0
  115. package/package.json +6 -6
  116. package/src/class-group/class-group.service.ts +413 -413
  117. package/src/class-group/dto/create-class-group.dto.ts +77 -77
  118. package/src/course/course-structure.controller.ts +63 -0
  119. package/src/course/course-structure.service.ts +390 -3
  120. package/src/course/course.service.ts +214 -182
  121. package/src/course/dto/create-course-structure-lesson.dto.ts +3 -2
  122. package/src/course/dto/create-course.dto.ts +19 -16
  123. package/src/course/dto/move-lesson.dto.ts +17 -0
  124. package/src/course/dto/paste-lessons.dto.ts +9 -0
  125. package/src/course/dto/reorder-lessons.dto.ts +10 -0
  126. package/src/course/dto/reorder-sessions.dto.ts +10 -0
  127. package/src/training/training.controller.ts +1 -1
  128. package/dist/enterprise/dto/add-enterprise-lead.dto.d.ts +0 -4
  129. package/dist/enterprise/dto/add-enterprise-lead.dto.d.ts.map +0 -1
  130. package/dist/enterprise/dto/add-enterprise-lead.dto.js.map +0 -1
@@ -62,6 +62,7 @@ import { useRouter } from 'next/navigation';
62
62
  import { useEffect, useMemo, useRef, useState } from 'react';
63
63
  import { useForm, useWatch } from 'react-hook-form';
64
64
  import { toast } from 'sonner';
65
+ import { CourseAvatar } from '../_components/course-avatar';
65
66
  import {
66
67
  CourseCategoryOption,
67
68
  CourseFormSheet,
@@ -76,7 +77,7 @@ const API_COURSES_CACHE_KEY = 'lms:courses:api-cache';
76
77
 
77
78
  interface Curso {
78
79
  id: number;
79
- codigo: string;
80
+ slug: string;
80
81
  nomeInterno: string;
81
82
  tituloComercial: string;
82
83
  descricao: string;
@@ -90,11 +91,12 @@ interface Curso {
90
91
  listado: boolean;
91
92
  alunosInscritos: number;
92
93
  criadoEm: string;
94
+ logoFileId?: number | null;
93
95
  }
94
96
 
95
97
  type ApiCourse = {
96
98
  id: number;
97
- code: string;
99
+ name: string;
98
100
  slug: string;
99
101
  title: string;
100
102
  description: string;
@@ -110,6 +112,7 @@ type ApiCourse = {
110
112
  isListed: boolean;
111
113
  enrollmentCount: number;
112
114
  createdAt: string;
115
+ logoFileId?: number | null;
113
116
  };
114
117
 
115
118
  type ApiCourseList = {
@@ -199,8 +202,8 @@ function toPtStatus(status?: string | null): CourseSheetFormValues['status'] {
199
202
  function mapApiCourse(course: ApiCourse): Curso {
200
203
  return {
201
204
  id: course.id,
202
- codigo: course.code,
203
- nomeInterno: course.slug,
205
+ slug: course.slug,
206
+ nomeInterno: course.name ?? '',
204
207
  tituloComercial: course.title,
205
208
  descricao: course.description ?? '',
206
209
  primaryColor: course.primaryColor ?? null,
@@ -213,6 +216,7 @@ function mapApiCourse(course: ApiCourse): Curso {
213
216
  listado: course.isListed,
214
217
  alunosInscritos: course.enrollmentCount ?? 0,
215
218
  criadoEm: course.createdAt ?? '',
219
+ logoFileId: course.logoFileId ?? null,
216
220
  };
217
221
  }
218
222
 
@@ -592,6 +596,7 @@ export default function CursosPage() {
592
596
  setEditingCurso(curso);
593
597
  form.reset({
594
598
  nomeInterno: curso.nomeInterno,
599
+ slug: curso.slug,
595
600
  tituloComercial: curso.tituloComercial,
596
601
  descricao: curso.descricao,
597
602
  primaryColor: curso.primaryColor || '#1D4ED8',
@@ -599,6 +604,7 @@ export default function CursosPage() {
599
604
  nivel: curso.nivel,
600
605
  status: curso.status,
601
606
  categorias: curso.categorias,
607
+ logoFileId: curso.logoFileId ?? null,
602
608
  });
603
609
  setSheetOpen(true);
604
610
  }
@@ -607,7 +613,8 @@ export default function CursosPage() {
607
613
  setSaving(true);
608
614
  try {
609
615
  const payload = {
610
- slug: data.nomeInterno.trim(),
616
+ name: data.nomeInterno.trim(),
617
+ slug: data.slug.trim().toLowerCase(),
611
618
  title: data.tituloComercial,
612
619
  description: data.descricao,
613
620
  level: toApiLevel(data.nivel),
@@ -617,6 +624,7 @@ export default function CursosPage() {
617
624
  primaryContrastColor: getContrastColor(data.primaryColor),
618
625
  secondaryColor: data.secondaryColor,
619
626
  secondaryContrastColor: getContrastColor(data.secondaryColor),
627
+ logoFileId: data.logoFileId ?? null,
620
628
  };
621
629
 
622
630
  if (editingCurso) {
@@ -1071,13 +1079,16 @@ export default function CursosPage() {
1071
1079
 
1072
1080
  <CardContent className="flex h-full flex-col p-4">
1073
1081
  <div className="mb-3 flex items-start gap-3">
1074
- <div className="flex size-12 shrink-0 items-center justify-center rounded-xl border bg-muted/60">
1075
- <BookOpen className="size-6 text-foreground" />
1076
- </div>
1082
+ <CourseAvatar
1083
+ fileId={curso.logoFileId}
1084
+ title={curso.nomeInterno}
1085
+ className="size-12 rounded-xl"
1086
+ iconSize="size-6"
1087
+ />
1077
1088
  <div className="min-w-0 flex-1">
1078
1089
  <div className="mb-1.5 flex items-start justify-between gap-2">
1079
1090
  <h3 className="line-clamp-2 font-semibold leading-snug text-foreground">
1080
- {curso.tituloComercial}
1091
+ {curso.nomeInterno}
1081
1092
  </h3>
1082
1093
  <DropdownMenu>
1083
1094
  <DropdownMenuTrigger asChild>
@@ -1123,12 +1134,12 @@ export default function CursosPage() {
1123
1134
  </div>
1124
1135
  <p className="text-xs text-muted-foreground">
1125
1136
  <code className="rounded bg-muted px-1.5 py-0.5 font-mono text-[10px]">
1126
- {curso.codigo}
1137
+ {curso.slug}
1127
1138
  </code>
1128
1139
  <span className="mx-1.5 text-muted-foreground/50">
1129
1140
  |
1130
1141
  </span>
1131
- <span>{curso.nomeInterno}</span>
1142
+ <span>{curso.tituloComercial}</span>
1132
1143
  </p>
1133
1144
  </div>
1134
1145
  </div>
@@ -1236,25 +1247,33 @@ export default function CursosPage() {
1236
1247
  onCheckedChange={() => {}}
1237
1248
  onClick={(e) => toggleSelect(curso.id, e)}
1238
1249
  aria-label={t('table.selectCourse', {
1239
- title: curso.tituloComercial,
1250
+ title: curso.nomeInterno,
1240
1251
  })}
1241
1252
  className="border-2 bg-background shadow-sm"
1242
1253
  />
1243
1254
  </TableCell>
1244
1255
  <TableCell>
1245
- <div className="min-w-0">
1246
- <p className="truncate font-semibold text-foreground">
1247
- {curso.tituloComercial}
1248
- </p>
1249
- <p className="mt-1 truncate text-xs text-muted-foreground">
1250
- <code className="rounded bg-muted px-1.5 py-0.5 font-mono text-[10px]">
1251
- {curso.codigo}
1252
- </code>
1253
- <span className="mx-1.5 text-muted-foreground/50">
1254
- |
1255
- </span>
1256
- <span>{curso.nomeInterno}</span>
1257
- </p>
1256
+ <div className="flex min-w-0 items-center gap-3">
1257
+ <CourseAvatar
1258
+ fileId={curso.logoFileId}
1259
+ title={curso.nomeInterno}
1260
+ className="size-8 shrink-0 rounded-lg"
1261
+ iconSize="size-4"
1262
+ />
1263
+ <div className="min-w-0">
1264
+ <p className="truncate font-semibold text-foreground">
1265
+ {curso.nomeInterno}
1266
+ </p>
1267
+ <p className="mt-1 truncate text-xs text-muted-foreground">
1268
+ <code className="rounded bg-muted px-1.5 py-0.5 font-mono text-[10px]">
1269
+ {curso.slug}
1270
+ </code>
1271
+ <span className="mx-1.5 text-muted-foreground/50">
1272
+ |
1273
+ </span>
1274
+ <span>{curso.tituloComercial}</span>
1275
+ </p>
1276
+ </div>
1258
1277
  </div>
1259
1278
  </TableCell>
1260
1279
  <TableCell>
@@ -1383,8 +1402,8 @@ export default function CursosPage() {
1383
1402
  form={form}
1384
1403
  onSubmit={onSubmit}
1385
1404
  categories={categoryOptions}
1386
- courseCode={editingCurso?.codigo}
1387
1405
  onCreateCategory={() => router.push('/category?new=1')}
1406
+ initialLogoFileId={editingCurso?.logoFileId ?? null}
1388
1407
  t={t}
1389
1408
  />
1390
1409