Skip to content

Commit 4102655

Browse files
committed
feat: set default value for isEditable prop in multiple components
1 parent b48a9a3 commit 4102655

20 files changed

Lines changed: 49 additions & 84 deletions

File tree

src/generic/WysiwygEditor.jsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const WysiwygEditor = ({
1414
editorType,
1515
onChange,
1616
minHeight,
17-
disabled,
17+
disabled = false,
1818
}) => {
1919
const { editorRef, refReady, setEditorRef } = prepareEditorRef();
2020
const { courseId } = useCourseAuthoringContext();
@@ -74,13 +74,11 @@ WysiwygEditor.defaultProps = {
7474
initialValue: '',
7575
editorType: SUPPORTED_TEXT_EDITORS.text,
7676
minHeight: 200,
77-
disabled: false,
7877
};
7978

8079
WysiwygEditor.propTypes = {
8180
initialValue: PropTypes.string,
8281
editorType: PropTypes.oneOf(Object.values(SUPPORTED_TEXT_EDITORS)),
8382
onChange: PropTypes.func.isRequired,
8483
minHeight: PropTypes.number,
85-
disabled: PropTypes.bool,
8684
};

src/generic/course-upload-image/index.jsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const CourseUploadImage = ({
2727
identifierFieldText,
2828
showImageBodyText,
2929
customInputPlaceholder,
30-
disabled,
30+
disabled = false,
3131
onChange,
3232
}) => {
3333
const { courseId } = useParams();
@@ -157,7 +157,6 @@ CourseUploadImage.defaultProps = {
157157
showImageBodyText: false,
158158
identifierFieldText: '',
159159
customInputPlaceholder: '',
160-
disabled: false,
161160
};
162161

163162
CourseUploadImage.propTypes = {
@@ -169,7 +168,6 @@ CourseUploadImage.propTypes = {
169168
showImageBodyText: PropTypes.bool,
170169
identifierFieldText: PropTypes.string,
171170
customInputPlaceholder: PropTypes.string,
172-
disabled: PropTypes.bool,
173171
onChange: PropTypes.func.isRequired,
174172
};
175173

src/schedule-and-details/ScheduleAndDetails.test.jsx

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import genericMessages from '@src/generic/help-sidebar/messages';
1111
import { DATE_FORMAT } from '@src/constants';
1212
import { getCourseSettingsApiUrl } from '@src/data/api';
1313
import { mockWaffleFlags } from '@src/data/apiHooks.mock';
14-
import { useUserPermissionsWithAuthzCourse } from '@src/authz/hooks';
14+
import { useCourseUserPermissions } from '@src/authz/hooks';
1515

1616
import { CourseAuthoringProvider } from '@src/CourseAuthoringContext';
1717
import { courseDetailsMock, courseSettingsMock } from './__mocks__';
@@ -25,14 +25,12 @@ import messages from './messages';
2525
import ScheduleAndDetails from '.';
2626

2727
jest.mock('@src/authz/hooks', () => ({
28-
useUserPermissionsWithAuthzCourse: jest.fn().mockReturnValue({
28+
useCourseUserPermissions: jest.fn().mockReturnValue({
2929
isLoading: false,
3030
isAuthzEnabled: true,
31-
permissions: {
32-
canViewScheduleAndDetails: true,
33-
canEditSchedule: true,
34-
canEditDetails: true,
35-
},
31+
canViewScheduleAndDetails: true,
32+
canEditSchedule: true,
33+
canEditDetails: true,
3634
}),
3735
}));
3836

@@ -193,14 +191,12 @@ describe('<ScheduleAndDetails /> permissions', () => {
193191
axiosMock.onGet(getCourseDetailsApiUrl(courseId)).reply(200, courseDetailsMock);
194192
axiosMock.onGet(getCourseSettingsApiUrl(courseId)).reply(200, courseSettingsMock);
195193
axiosMock.onPut(getCourseDetailsApiUrl(courseId)).reply(200);
196-
jest.mocked(useUserPermissionsWithAuthzCourse).mockReturnValue({
194+
jest.mocked(useCourseUserPermissions).mockReturnValue({
197195
isLoading: false,
198196
isAuthzEnabled: true,
199-
permissions: {
200-
canViewScheduleAndDetails: true,
201-
canEditSchedule: true,
202-
canEditDetails: true,
203-
},
197+
canViewScheduleAndDetails: true,
198+
canEditSchedule: true,
199+
canEditDetails: true,
204200
});
205201
});
206202

@@ -222,10 +218,12 @@ describe('<ScheduleAndDetails /> permissions', () => {
222218

223219
it('shows PermissionDeniedAlert when user lacks view permission', async () => {
224220
mockWaffleFlags({ enableAuthzCourseAuthoring: true });
225-
jest.mocked(useUserPermissionsWithAuthzCourse).mockReturnValue({
221+
jest.mocked(useCourseUserPermissions).mockReturnValue({
226222
isLoading: false,
227223
isAuthzEnabled: true,
228-
permissions: { canViewScheduleAndDetails: false, canEditSchedule: false, canEditDetails: false },
224+
canViewScheduleAndDetails: false,
225+
canEditSchedule: false,
226+
canEditDetails: false,
229227
});
230228
const { getByTestId } = renderComponent();
231229
await waitFor(() => {
@@ -235,10 +233,12 @@ describe('<ScheduleAndDetails /> permissions', () => {
235233

236234
it('disables schedule date inputs when user lacks edit_schedule permission', async () => {
237235
mockWaffleFlags({ enableAuthzCourseAuthoring: true });
238-
jest.mocked(useUserPermissionsWithAuthzCourse).mockReturnValue({
236+
jest.mocked(useCourseUserPermissions).mockReturnValue({
239237
isLoading: false,
240238
isAuthzEnabled: true,
241-
permissions: { canViewScheduleAndDetails: true, canEditSchedule: false, canEditDetails: true },
239+
canViewScheduleAndDetails: true,
240+
canEditSchedule: false,
241+
canEditDetails: true,
242242
});
243243
const { getAllByPlaceholderText } = renderComponent();
244244
await waitFor(() => {
@@ -249,10 +249,12 @@ describe('<ScheduleAndDetails /> permissions', () => {
249249

250250
it('disables pacing and details inputs when user lacks edit_details permission', async () => {
251251
mockWaffleFlags({ enableAuthzCourseAuthoring: true });
252-
jest.mocked(useUserPermissionsWithAuthzCourse).mockReturnValue({
252+
jest.mocked(useCourseUserPermissions).mockReturnValue({
253253
isLoading: false,
254254
isAuthzEnabled: true,
255-
permissions: { canViewScheduleAndDetails: true, canEditSchedule: true, canEditDetails: false },
255+
canViewScheduleAndDetails: true,
256+
canEditSchedule: true,
257+
canEditDetails: false,
256258
});
257259
const { getAllByRole } = renderComponent();
258260
await waitFor(() => {
@@ -263,10 +265,12 @@ describe('<ScheduleAndDetails /> permissions', () => {
263265

264266
it('save button cannot be triggered when user has no edit permissions', async () => {
265267
mockWaffleFlags({ enableAuthzCourseAuthoring: true });
266-
jest.mocked(useUserPermissionsWithAuthzCourse).mockReturnValue({
268+
jest.mocked(useCourseUserPermissions).mockReturnValue({
267269
isLoading: false,
268270
isAuthzEnabled: true,
269-
permissions: { canViewScheduleAndDetails: true, canEditSchedule: false, canEditDetails: false },
271+
canViewScheduleAndDetails: true,
272+
canEditSchedule: false,
273+
canEditDetails: false,
270274
});
271275
const { getAllByPlaceholderText, queryByText } = renderComponent();
272276
// Wait for page to load

src/schedule-and-details/details-section/index.jsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const DetailsSection = ({
1010
language,
1111
languageOptions,
1212
onChange,
13-
isEditable,
13+
isEditable = true,
1414
}) => {
1515
const intl = useIntl();
1616
const formattedLanguage = () => {
@@ -51,15 +51,13 @@ const DetailsSection = ({
5151

5252
DetailsSection.defaultProps = {
5353
language: '',
54-
isEditable: true,
5554
};
5655

5756
DetailsSection.propTypes = {
5857
language: PropTypes.string,
5958
languageOptions: PropTypes.arrayOf(
6059
PropTypes.arrayOf(PropTypes.string.isRequired).isRequired,
6160
).isRequired,
62-
isEditable: PropTypes.bool,
6361
onChange: PropTypes.func.isRequired,
6462
};
6563

src/schedule-and-details/index.jsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,15 +159,15 @@ const ScheduleAndDetails = () => {
159159
const { overview: initialOverview } = courseDetails || {};
160160
const { aboutSidebarHtml: initialAboutSidebarHtml } = courseDetails || {};
161161

162-
if (!isLoadingUserPermissions && !canViewScheduleAndDetails) {
163-
return <PermissionDeniedAlert />;
164-
}
165-
166162
if (isLoading) {
167163
// eslint-disable-next-line react/jsx-no-useless-fragment
168164
return <></>;
169165
}
170166

167+
if (!canViewScheduleAndDetails) {
168+
return <PermissionDeniedAlert />;
169+
}
170+
171171
if (loadingDetailsStatus === RequestStatus.DENIED || loadingSettingsStatus === RequestStatus.DENIED) {
172172
return (
173173
<div className="row justify-content-center m-6">
@@ -176,8 +176,8 @@ const ScheduleAndDetails = () => {
176176
);
177177
}
178178

179-
const isScheduleEditable = !isLoadingUserPermissions && canEditSchedule;
180-
const isDetailsEditable = !isLoadingUserPermissions && canEditDetails;
179+
const isScheduleEditable = canEditSchedule;
180+
const isDetailsEditable = canEditDetails;
181181

182182
const showCreditSection = creditEligibilityEnabled && isCreditCourse;
183183
const showRequirementsSection = aboutPageEditable || isPrerequisiteCoursesEnabled || isEntranceExamsEnabled;

src/schedule-and-details/instructors-section/index.jsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import InstructorContainer from './instructor-container';
99
import SectionSubHeader from '../../generic/section-sub-header';
1010
import messages from './messages';
1111

12-
const InstructorsSection = ({ instructors, isEditable, onChange }) => {
12+
const InstructorsSection = ({ instructors, isEditable = true, onChange }) => {
1313
const intl = useIntl();
1414
const newInstructor = {
1515
bio: '',
@@ -79,7 +79,6 @@ const InstructorsSection = ({ instructors, isEditable, onChange }) => {
7979

8080
InstructorsSection.defaultProps = {
8181
instructors: [],
82-
isEditable: true,
8382
};
8483

8584
InstructorsSection.propTypes = {
@@ -92,7 +91,6 @@ InstructorsSection.propTypes = {
9291
title: PropTypes.string,
9392
}),
9493
),
95-
isEditable: PropTypes.bool,
9694
onChange: PropTypes.func.isRequired,
9795
};
9896

src/schedule-and-details/instructors-section/instructor-container/index.jsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const InstructorContainer = ({
1717
idx,
1818
onDelete,
1919
onChange,
20-
isEditable,
20+
isEditable = true,
2121
}) => {
2222
const intl = useIntl();
2323
return (
@@ -114,7 +114,6 @@ const InstructorContainer = ({
114114

115115
InstructorContainer.defaultProps = {
116116
instructor: {},
117-
isEditable: true,
118117
};
119118

120119
InstructorContainer.propTypes = {
@@ -126,7 +125,6 @@ InstructorContainer.propTypes = {
126125
title: PropTypes.string,
127126
}),
128127
idx: PropTypes.number.isRequired,
129-
isEditable: PropTypes.bool,
130128
onDelete: PropTypes.func.isRequired,
131129
onChange: PropTypes.func.isRequired,
132130
};

src/schedule-and-details/introducing-section/extended-course-details/index.jsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const ExtendedCourseDetails = ({
1111
subtitle,
1212
duration,
1313
description,
14-
isEditable,
14+
isEditable = true,
1515
onChange,
1616
}) => {
1717
const intl = useIntl();
@@ -76,15 +76,13 @@ ExtendedCourseDetails.defaultProps = {
7676
subtitle: '',
7777
duration: '',
7878
description: '',
79-
isEditable: true,
8079
};
8180

8281
ExtendedCourseDetails.propTypes = {
8382
title: PropTypes.string,
8483
subtitle: PropTypes.string,
8584
duration: PropTypes.string,
8685
description: PropTypes.string,
87-
isEditable: PropTypes.bool,
8886
onChange: PropTypes.func.isRequired,
8987
};
9088

src/schedule-and-details/introducing-section/index.jsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const IntroducingSection = ({
3030
shortDescriptionEditable,
3131
enableExtendedCourseDetails,
3232
videoThumbnailImageAssetPath,
33-
isEditable,
33+
isEditable = true,
3434
onChange,
3535
}) => {
3636
const intl = useIntl();
@@ -184,7 +184,6 @@ IntroducingSection.defaultProps = {
184184
bannerImageAssetPath: '',
185185
videoThumbnailImageAssetPath: '',
186186
overview: '',
187-
isEditable: true,
188187
};
189188

190189
IntroducingSection.propTypes = {
@@ -204,7 +203,6 @@ IntroducingSection.propTypes = {
204203
shortDescriptionEditable: PropTypes.bool.isRequired,
205204
enableExtendedCourseDetails: PropTypes.bool.isRequired,
206205
videoThumbnailImageAssetPath: PropTypes.string,
207-
isEditable: PropTypes.bool,
208206
onChange: PropTypes.func.isRequired,
209207
};
210208

src/schedule-and-details/introducing-section/introduction-video/index.jsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { useIntl } from '@edx/frontend-platform/i18n';
55

66
import messages from './messages';
77

8-
const IntroductionVideo = ({ introVideo, isEditable, onChange }) => {
8+
const IntroductionVideo = ({ introVideo, isEditable = true, onChange }) => {
99
const intl = useIntl();
1010
const embedVideoUrl = introVideo
1111
? `//www.youtube.com/embed/${introVideo}`
@@ -55,12 +55,10 @@ const IntroductionVideo = ({ introVideo, isEditable, onChange }) => {
5555

5656
IntroductionVideo.defaultProps = {
5757
introVideo: '',
58-
isEditable: true,
5958
};
6059

6160
IntroductionVideo.propTypes = {
6261
introVideo: PropTypes.string,
63-
isEditable: PropTypes.bool,
6462
onChange: PropTypes.func.isRequired,
6563
};
6664

0 commit comments

Comments
 (0)