Add course management improvements: tree view, module descriptions, lesson toggles
- SortableModules: add description textarea in edit form, show description in row - CourseDetailPage: fetch lessons per module, add CourseTree overview section - ModulePage: fetch sibling modules, pass as otherModules to SortableLessons Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -10,13 +10,20 @@ interface Props {
|
||||
export default async function ModulePage({ params }: Props) {
|
||||
const { courseId, moduleId } = await params;
|
||||
|
||||
const module = await prisma.module.findUnique({
|
||||
where: { id: moduleId },
|
||||
include: {
|
||||
course: { select: { title: true } },
|
||||
lessons: { orderBy: { order: "asc" } },
|
||||
},
|
||||
});
|
||||
const [module, allModules] = await Promise.all([
|
||||
prisma.module.findUnique({
|
||||
where: { id: moduleId },
|
||||
include: {
|
||||
course: { select: { title: true } },
|
||||
lessons: { orderBy: { order: "asc" } },
|
||||
},
|
||||
}),
|
||||
prisma.module.findMany({
|
||||
where: { courseId, NOT: { id: moduleId } },
|
||||
select: { id: true, title: true },
|
||||
orderBy: { order: "asc" },
|
||||
}),
|
||||
]);
|
||||
|
||||
if (!module || module.courseId !== courseId) notFound();
|
||||
|
||||
@@ -41,7 +48,12 @@ export default async function ModulePage({ params }: Props) {
|
||||
<p className="text-xs font-bold uppercase tracking-widest mb-5" style={{ color: "var(--muted-foreground)" }}>
|
||||
Уроки модуля
|
||||
</p>
|
||||
<SortableLessons courseId={courseId} moduleId={moduleId} lessons={module.lessons} />
|
||||
<SortableLessons
|
||||
courseId={courseId}
|
||||
moduleId={moduleId}
|
||||
lessons={module.lessons}
|
||||
otherModules={allModules}
|
||||
/>
|
||||
</section>
|
||||
</div>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user