diff --git a/app/platform/[tenant]/course-content/[course_id]/__tests__/layout.test.tsx b/app/platform/[tenant]/course-content/[course_id]/__tests__/layout.test.tsx index 609cc49..ca1dae9 100644 --- a/app/platform/[tenant]/course-content/[course_id]/__tests__/layout.test.tsx +++ b/app/platform/[tenant]/course-content/[course_id]/__tests__/layout.test.tsx @@ -128,6 +128,13 @@ vi.mock('@/components/course-outline', () => ({ CourseOutline: () =>
CourseOutline
, })); +// Mock CourseOutlineSidebar — the collapsible-sidebar internals (rail, hint +// popover, media queries) are exercised in its own test; here we only need to +// confirm the layout mounts it. +vi.mock('@/components/course-outline-sidebar', () => ({ + CourseOutlineSidebar: () =>
CourseOutlineSidebar
, +})); + // Mock CourseOutlineDrawer vi.mock('@/components/course-outline-drawer', () => ({ CourseOutlineDrawer: () =>
CourseOutlineDrawer
, @@ -284,13 +291,13 @@ describe('CourseContentLayout', () => { expect(screen.getByTestId('course-outline-drawer')).toBeInTheDocument(); }); - it('renders CourseOutline in sidebar', () => { + it('renders CourseOutlineSidebar', () => { render(
children
, ); - expect(screen.getByTestId('course-outline')).toBeInTheDocument(); + expect(screen.getByTestId('course-outline-sidebar')).toBeInTheDocument(); }); it('renders course navigation tabs (Agent, Course, Progress, Dates, Discussion)', () => { diff --git a/app/platform/[tenant]/course-content/[course_id]/layout.tsx b/app/platform/[tenant]/course-content/[course_id]/layout.tsx index 6face2e..20944a8 100644 --- a/app/platform/[tenant]/course-content/[course_id]/layout.tsx +++ b/app/platform/[tenant]/course-content/[course_id]/layout.tsx @@ -14,7 +14,7 @@ import { AgentMode, EdxIframeContext } from '@/hooks/courses/edx-iframe-context' import { getUserId, getUserName } from '@/utils/helpers'; import { useTenantParam } from '@/hooks/use-tenant-param'; import { CourseOutlineContext } from '@/contexts/course-outline-context'; -import { CourseOutline } from '@/components/course-outline'; +import { CourseOutlineSidebar } from '@/components/course-outline-sidebar'; import { CourseOutlineDrawer } from '@/components/course-outline-drawer'; import { CourseAccessGuard } from '@/components/course-access-guard'; import { CourseLessonNavigator } from '@/components/course-lesson-navigator'; @@ -286,17 +286,8 @@ export default function CourseContentLayout({ }} >
- {/* Course sidebar */} -
-
-

{course?.display_name}

-
- - -
+ {/* Course sidebar (collapsible on tablet / small screens) */} + {/* Main content area */}
@@ -518,7 +509,7 @@ export default function CourseContentLayout({
+
+ + {/* Expanded outline — full sidebar */} +
+
+

{course?.display_name}

+ +
+ + +
+ + ); +}; diff --git a/e2e/journeys/33-analytics-audit.spec.ts b/e2e/journeys/33-analytics-audit.spec.ts index 47b793a..bccef8d 100644 --- a/e2e/journeys/33-analytics-audit.spec.ts +++ b/e2e/journeys/33-analytics-audit.spec.ts @@ -81,7 +81,7 @@ test.describe('Journey 33: Analytics Audit', () => { } logger.info('CP-2: checking user search and action filters'); - const userSearch = page.getByRole('button', { name: 'Search for User' }); + const userSearch = page.getByRole('combobox', { name: 'Search for User' }); const actionFilter = page.getByText('All Actions'); const hasUserSearch = await userSearch.isVisible({ timeout: 120_000 }).catch(() => false);