Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/course-home/dates-tab/DatesTab.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ const DatesTab = () => {
activeTabSlug="dates"
courseId={courseId}
courseStatus={{ metadataQuery, tabDataQuery }}
metadataModel="courseHomeMeta"
>
<div role="heading" aria-level="1" className="h2 my-3">
{intl.formatMessage(messages.title)}
Expand Down
4 changes: 2 additions & 2 deletions src/course-home/outline-tab/OutlineTab.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -666,7 +666,7 @@ describe('Outline Tab', () => {
},
});
await executeThunk(thunks.fetchOutlineTab(courseId), store.dispatch);
await act(async () => render(<TourProvider><LoadedTabPage metadataModel="courseHomeMeta" courseId={courseId} activeTabSlug="outline">...</LoadedTabPage></TourProvider>, { store }));
await act(async () => render(<TourProvider><LoadedTabPage courseId={courseId} activeTabSlug="outline">...</LoadedTabPage></TourProvider>, { store }));
const instructorToolbar = await screen.getByTestId('instructor-toolbar');
expect(instructorToolbar).toBeInTheDocument();
expect(screen.getByText('This learner no longer has access to this course. Their access expired on', { exact: false })).toBeInTheDocument();
Expand All @@ -682,7 +682,7 @@ describe('Outline Tab', () => {
},
});
await executeThunk(thunks.fetchOutlineTab(courseId), store.dispatch);
await act(async () => render(<TourProvider><LoadedTabPage metadataModel="courseHomeMeta" courseId={courseId} activeTabSlug="outline">...</LoadedTabPage></TourProvider>, { store }));
await act(async () => render(<TourProvider><LoadedTabPage courseId={courseId} activeTabSlug="outline">...</LoadedTabPage></TourProvider>, { store }));
const instructorToolbar = await screen.getByTestId('instructor-toolbar');
expect(instructorToolbar).toBeInTheDocument();
expect(screen.queryByText('This learner no longer has access to this course. Their access expired on', { exact: false })).not.toBeInTheDocument();
Expand Down
8 changes: 4 additions & 4 deletions src/course-home/progress-tab/ProgressTab.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -1432,7 +1432,7 @@ describe('Progress Tab', () => {
},
});
await executeThunk(thunks.fetchProgressTab(courseId), store.dispatch);
await act(async () => render(<TourProvider><LoadedTabPage metadataModel="courseHomeMeta" courseId={courseId} activeTabSlug="progress">...</LoadedTabPage></TourProvider>, { store }));
await act(async () => render(<TourProvider><LoadedTabPage courseId={courseId} activeTabSlug="progress">...</LoadedTabPage></TourProvider>, { store }));
expect(screen.getByTestId('instructor-toolbar')).toBeInTheDocument();
expect(screen.getByText('This learner no longer has access to this course. Their access expired on', { exact: false })).toBeInTheDocument();
expect(screen.getByText('1/1/2020', { exact: false })).toBeInTheDocument();
Expand All @@ -1446,7 +1446,7 @@ describe('Progress Tab', () => {
},
});
await executeThunk(thunks.fetchProgressTab(courseId), store.dispatch);
await act(async () => render(<TourProvider><LoadedTabPage metadataModel="courseHomeMeta" courseId={courseId} activeTabSlug="progress">...</LoadedTabPage></TourProvider>, { store }));
await act(async () => render(<TourProvider><LoadedTabPage courseId={courseId} activeTabSlug="progress">...</LoadedTabPage></TourProvider>, { store }));
expect(screen.queryByText('This learner no longer has access to this course. Their access expired on', { exact: false })).not.toBeInTheDocument();
expect(screen.queryByText('1/1/2020', { exact: false })).not.toBeInTheDocument();
});
Expand All @@ -1461,7 +1461,7 @@ describe('Progress Tab', () => {
start: '2999-01-01T00:00:00Z',
});
await executeThunk(thunks.fetchProgressTab(courseId), store.dispatch);
await act(async () => render(<TourProvider><LoadedTabPage metadataModel="courseHomeMeta" courseId={courseId} activeTabSlug="progress">...</LoadedTabPage></TourProvider>, { store }));
await act(async () => render(<TourProvider><LoadedTabPage courseId={courseId} activeTabSlug="progress">...</LoadedTabPage></TourProvider>, { store }));
expect(screen.getByTestId('instructor-toolbar')).toBeInTheDocument();
expect(screen.getByText('This learner does not yet have access to this course. The course starts on', { exact: false })).toBeInTheDocument();
expect(screen.getByText('1/1/2999', { exact: false })).toBeInTheDocument();
Expand All @@ -1474,7 +1474,7 @@ describe('Progress Tab', () => {
start: '2999-01-01T00:00:00Z',
});
await executeThunk(thunks.fetchProgressTab(courseId), store.dispatch);
await act(async () => render(<TourProvider><LoadedTabPage metadataModel="courseHomeMeta" courseId={courseId} activeTabSlug="progress">...</LoadedTabPage></TourProvider>, { store }));
await act(async () => render(<TourProvider><LoadedTabPage courseId={courseId} activeTabSlug="progress">...</LoadedTabPage></TourProvider>, { store }));
expect(screen.queryByText('This learner does not yet have access to this course. The course starts on', { exact: false })).not.toBeInTheDocument();
expect(screen.queryByText('1/1/2999', { exact: false })).not.toBeInTheDocument();
});
Expand Down
1 change: 0 additions & 1 deletion src/courseware/CoursewareContainer.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,6 @@ class CoursewareContainer extends Component {
courseId={courseId}
unitId={routeUnitId}
courseStatus={courseStatus}
metadataModel="coursewareMeta"
>
<Course
courseId={courseId}
Expand Down
2 changes: 1 addition & 1 deletion src/product-tours/ProductTours.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ describe('Course Home Tours', () => {
await executeThunk(courseHomeThunks.fetchOutlineTab(courseId), store.dispatch);
render(
<TourProvider>
<LoadedTabPage metadataModel="courseHomeMeta" courseId={courseId} activeTabSlug="outline">
<LoadedTabPage courseId={courseId} activeTabSlug="outline">
<OutlineTab />
</LoadedTabPage>
</TourProvider>,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import { useSelector } from 'react-redux';
import { useParams } from 'react-router-dom';

import { sendTrackEvent } from '@edx/frontend-platform/analytics';
import { getAuthenticatedUser } from '@edx/frontend-platform/auth';
Expand All @@ -15,9 +15,7 @@ import messages from '../messages';

const LaunchCourseHomeTourButton = ({ srOnly }) => {
const intl = useIntl();
const {
courseId,
} = useSelector(state => state.courseHome);
const { courseId } = useParams();

const {
org,
Expand Down
3 changes: 1 addition & 2 deletions src/shared/streak-celebration/StreakCelebrationModal.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ const CloseText = ({ intl }) => (
);

const StreakModal = ({
courseId, metadataModel, streakLengthToCelebrate, isStreakCelebrationOpen,
courseId, streakLengthToCelebrate, isStreakCelebrationOpen,
closeStreakCelebration, streakDiscountCouponEnabled, verifiedMode, ...rest
}) => {
const intl = useIntl();
Expand Down Expand Up @@ -247,7 +247,6 @@ StreakModal.defaultProps = {

StreakModal.propTypes = {
courseId: PropTypes.string.isRequired,
metadataModel: PropTypes.string.isRequired,
streakLengthToCelebrate: PropTypes.number,
isStreakCelebrationOpen: PropTypes.bool,
closeStreakCelebration: PropTypes.func.isRequired,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ describe('Loaded Tab Page', () => {
closeStreakCelebration: jest.fn(),
courseId: courseMetadata.id,
isStreakCelebrationOpen: true,
metadataModel: 'coursewareMeta',
streakLengthToCelebrate: 3,
verifiedMode: camelCaseObject(courseHomeMetadata.verified_mode),
};
Expand Down
2 changes: 1 addition & 1 deletion src/tab-page/LoadedTabPage.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jest.mock('../product-tours/ProductTours', () => function () {
});

describe('Loaded Tab Page', () => {
const mockData = { activeTabSlug: 'courseware', metadataModel: 'coursewareMeta' };
const mockData = { activeTabSlug: 'courseware' };

beforeAll(async () => {
const store = await initializeTestStore({ excludeFetchSequence: true });
Expand Down
3 changes: 0 additions & 3 deletions src/tab-page/LoadedTabPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,13 @@ interface LoadedTabPageProps {
activeTabSlug: string;
children?: React.ReactNode;
courseId: string;
metadataModel: string;
unitId?: string | null;
}

const LoadedTabPage = ({
activeTabSlug,
children = null,
courseId,
metadataModel,
unitId = null,
}: LoadedTabPageProps) => {
const {
Expand Down Expand Up @@ -72,7 +70,6 @@ const LoadedTabPage = ({
)}
<StreakModal
courseId={courseId}
metadataModel={metadataModel}
streakLengthToCelebrate={streakLengthToCelebrate}
isStreakCelebrationOpen={!!isStreakCelebrationOpen}
closeStreakCelebration={closeStreakCelebration}
Expand Down
1 change: 0 additions & 1 deletion src/tab-page/TabContainer.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ const TabContainer = (props) => {
activeTabSlug={tab}
courseId={courseId}
courseStatus={courseStatus}
metadataModel={`${slice}Meta`}
>
{children}
</TabWithTimer>
Expand Down
14 changes: 14 additions & 0 deletions src/tab-page/TabPage.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ jest.mock('./LoadedTabPage', () => function () {
return <div data-testid="LoadedTabPage" />;
});

jest.mock('../product-tours/newUserCourseHomeTour/LaunchCourseHomeTourButton', () => function () {
return <div data-testid="sr-tour-button" />;
});

jest.mock('../generic/ToastContext', () => ({
...jest.requireActual('../generic/ToastContext'),
useToast: jest.fn(),
Expand Down Expand Up @@ -98,6 +102,16 @@ describe('Tab Page', () => {
expect(screen.getByTestId('LoadedTabPage')).toBeInTheDocument();
});

it('renders the screen-reader tour button on the outline tab', () => {
render(<TabPage {...mockData} activeTabSlug="outline" />, { wrapWithRouter: true });
expect(screen.getByTestId('sr-tour-button')).toBeInTheDocument();
});

it('does not render the tour button on other tabs', () => {
render(<TabPage {...mockData} activeTabSlug="dates" />, { wrapWithRouter: true });
expect(screen.queryByTestId('sr-tour-button')).not.toBeInTheDocument();
});

describe('React Query courseStatus', () => {
const metaWithAccess = { data: { courseAccess: { hasAccess: true } } };

Expand Down
13 changes: 7 additions & 6 deletions src/tab-page/TabPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ export interface TabPageProps {
activeTabSlug: string;
courseId?: string;
courseStatus: CourseStatus;
metadataModel: string;
unitId?: string;
children?: ReactNode;
}
Expand Down Expand Up @@ -71,7 +70,6 @@ const TabPage = ({
activeTabSlug,
courseId,
courseStatus,
metadataModel,
unitId,
children,
}: TabPageProps) => {
Expand Down Expand Up @@ -116,8 +114,12 @@ const TabPage = ({
</Toast>
);

const renderTourButton = () => {
if (metadataModel !== 'courseHomeMeta') { return null; }
// The outline page renders a visible "launch tour" button deep in the DOM; no other tab
// renders it. For screen-reader users we render a screen-reader-only copy above the header,
// where it won't be buried (a11y rationale:
// https://github.com/openedx/frontend-app-learning/pull/750#discussion_r755536879).
const renderSrOnlyTourButton = () => {
if (activeTabSlug !== 'outline') { return null; }
return (<LaunchCourseHomeTourButton srOnly />);
};

Expand All @@ -131,7 +133,6 @@ const TabPage = ({
<LoadedTabPage
activeTabSlug={activeTabSlug}
courseId={courseId}
metadataModel={metadataModel}
unitId={unitId}
>
{children}
Expand All @@ -148,7 +149,7 @@ const TabPage = ({
return (
<TourProvider>
{shouldRenderContent && renderToast()}
{shouldRenderContent && renderTourButton()}
{shouldRenderContent && renderSrOnlyTourButton()}
<HeaderSlot courseOrg={org} courseNumber={number} courseTitle={title} />
{isLoading && renderLoading()}
{shouldRenderContent && renderLoadedTabPage()}
Expand Down