Skip to content

Commit 694edb1

Browse files
committed
feat: Add slots for video and file upload components and alerts
This change add plugin slots for the file and video upload components, and the alerts components on those pages.
1 parent 32e5fa6 commit 694edb1

File tree

9 files changed

+568
-523
lines changed

9 files changed

+568
-523
lines changed

src/course-outline/page-alerts/PageAlerts.jsx

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import CourseOutlinePageAlertsSlot from 'CourseAuthoring/plugin-slots/CourseOutlinePageAlertsSlot';
12
import React, { useState } from 'react';
23
import PropTypes from 'prop-types';
34
import { uniqBy } from 'lodash';
@@ -407,6 +408,7 @@ const PageAlerts = ({
407408
{errorFilesPasteAlert()}
408409
{conflictingFilesPasteAlert()}
409410
{newFilesPasteAlert()}
411+
<CourseOutlinePageAlertsSlot />
410412
</>
411413
);
412414
};
+17-176
Original file line numberDiff line numberDiff line change
@@ -1,174 +1,37 @@
1-
import React, { useEffect } from 'react';
1+
import { useIntl } from '@edx/frontend-platform/i18n';
2+
import { Container } from '@openedx/paragon';
3+
import CourseFilesSlot from 'CourseAuthoring/plugin-slots/CourseFilesSlot';
24
import PropTypes from 'prop-types';
5+
import React, { useEffect } from 'react';
36
import { useDispatch, useSelector } from 'react-redux';
4-
import { injectIntl, FormattedMessage, intlShape } from '@edx/frontend-platform/i18n';
5-
import { CheckboxFilter, Container } from '@openedx/paragon';
6-
import Placeholder from '../../editors/Placeholder';
77

88
import { RequestStatus } from '../../data/constants';
9-
import { useModels, useModel } from '../../generic/model-store';
10-
import {
11-
addAssetFile,
12-
deleteAssetFile,
13-
fetchAssets,
14-
updateAssetLock,
15-
fetchAssetDownload,
16-
getUsagePaths,
17-
resetErrors,
18-
updateAssetOrder,
19-
validateAssetFiles,
20-
} from './data/thunks';
21-
import messages from './messages';
22-
import FilesPageProvider from './FilesPageProvider';
9+
import Placeholder from '../../editors/Placeholder';
10+
import { useModel } from '../../generic/model-store';
2311
import getPageHeadTitle from '../../generic/utils';
24-
import {
25-
AccessColumn,
26-
ActiveColumn,
27-
EditFileErrors,
28-
FileTable,
29-
ThumbnailColumn,
30-
} from '../generic';
31-
import { getFileSizeToClosestByte } from '../../utils';
32-
import FileThumbnail from './FileThumbnail';
33-
import FileInfoModalSidebar from './FileInfoModalSidebar';
34-
import FileValidationModal from './FileValidationModal';
12+
import { EditFileErrors } from '../generic';
13+
import { fetchAssets, resetErrors } from './data/thunks';
14+
import FilesPageProvider from './FilesPageProvider';
15+
import messages from './messages';
3516

3617
const FilesPage = ({
3718
courseId,
38-
// injected
39-
intl,
4019
}) => {
4120
const dispatch = useDispatch();
21+
const intl = useIntl();
4222
const courseDetails = useModel('courseDetails', courseId);
4323
document.title = getPageHeadTitle(courseDetails?.name, intl.formatMessage(messages.heading));
44-
45-
useEffect(() => {
46-
dispatch(fetchAssets(courseId));
47-
}, [courseId]);
48-
4924
const {
50-
assetIds,
5125
loadingStatus,
5226
addingStatus: addAssetStatus,
5327
deletingStatus: deleteAssetStatus,
5428
updatingStatus: updateAssetStatus,
55-
usageStatus: usagePathStatus,
5629
errors: errorMessages,
5730
} = useSelector(state => state.assets);
58-
31+
useEffect(() => {
32+
dispatch(fetchAssets(courseId));
33+
}, [courseId]);
5934
const handleErrorReset = (error) => dispatch(resetErrors(error));
60-
const handleDeleteFile = (id) => dispatch(deleteAssetFile(courseId, id));
61-
const handleDownloadFile = (selectedRows) => dispatch(fetchAssetDownload({ selectedRows, courseId }));
62-
const handleAddFile = (files) => {
63-
handleErrorReset({ errorType: 'add' });
64-
dispatch(validateAssetFiles(courseId, files));
65-
};
66-
const handleFileOverwrite = (close, files) => {
67-
Object.values(files).forEach(file => dispatch(addAssetFile(courseId, file, true)));
68-
close();
69-
};
70-
const handleLockFile = (fileId, locked) => {
71-
handleErrorReset({ errorType: 'lock' });
72-
dispatch(updateAssetLock({ courseId, assetId: fileId, locked }));
73-
};
74-
const handleUsagePaths = (asset) => dispatch(getUsagePaths({ asset, courseId }));
75-
const handleFileOrder = ({ newFileIdOrder, sortType }) => {
76-
dispatch(updateAssetOrder(courseId, newFileIdOrder, sortType));
77-
};
78-
79-
const thumbnailPreview = (props) => FileThumbnail(props);
80-
const infoModalSidebar = (asset) => FileInfoModalSidebar({
81-
asset,
82-
handleLockedAsset: handleLockFile,
83-
});
84-
85-
const assets = useModels('assets', assetIds);
86-
const data = {
87-
fileIds: assetIds,
88-
loadingStatus,
89-
usagePathStatus,
90-
usageErrorMessages: errorMessages.usageMetrics,
91-
fileType: 'file',
92-
};
93-
const maxFileSize = 20 * 1048576;
94-
95-
const activeColumn = {
96-
id: 'activeStatus',
97-
Header: 'Active',
98-
accessor: 'activeStatus',
99-
Cell: ({ row }) => ActiveColumn({ row, pageLoadStatus: loadingStatus }),
100-
Filter: CheckboxFilter,
101-
filter: 'exactTextCase',
102-
filterChoices: [
103-
{ name: intl.formatMessage(messages.activeCheckboxLabel), value: 'active' },
104-
{ name: intl.formatMessage(messages.inactiveCheckboxLabel), value: 'inactive' },
105-
],
106-
};
107-
const accessColumn = {
108-
id: 'lockStatus',
109-
Header: 'Access',
110-
accessor: 'lockStatus',
111-
Cell: ({ row }) => AccessColumn({ row }),
112-
Filter: CheckboxFilter,
113-
filterChoices: [
114-
{ name: intl.formatMessage(messages.lockedCheckboxLabel), value: 'locked' },
115-
{ name: intl.formatMessage(messages.publicCheckboxLabel), value: 'public' },
116-
],
117-
};
118-
const thumbnailColumn = {
119-
id: 'thumbnail',
120-
Header: '',
121-
Cell: ({ row }) => ThumbnailColumn({ row, thumbnailPreview }),
122-
};
123-
const fileSizeColumn = {
124-
id: 'fileSize',
125-
Header: 'File size',
126-
accessor: 'fileSize',
127-
Cell: ({ row }) => {
128-
const { fileSize } = row.original;
129-
return getFileSizeToClosestByte(fileSize);
130-
},
131-
};
132-
133-
const tableColumns = [
134-
{ ...thumbnailColumn },
135-
{
136-
Header: 'File name',
137-
accessor: 'displayName',
138-
},
139-
{ ...fileSizeColumn },
140-
{
141-
Header: 'Type',
142-
accessor: 'wrapperType',
143-
Filter: CheckboxFilter,
144-
filter: 'includesValue',
145-
filterChoices: [
146-
{
147-
name: intl.formatMessage(messages.codeCheckboxLabel),
148-
value: 'code',
149-
},
150-
{
151-
name: intl.formatMessage(messages.imageCheckboxLabel),
152-
value: 'image',
153-
},
154-
{
155-
name: intl.formatMessage(messages.documentCheckboxLabel),
156-
value: 'document',
157-
},
158-
{
159-
name: intl.formatMessage(messages.audioCheckboxLabel),
160-
value: 'audio',
161-
},
162-
{
163-
name: intl.formatMessage(messages.otherCheckboxLabel),
164-
value: 'other',
165-
},
166-
],
167-
},
168-
{ ...activeColumn },
169-
{ ...accessColumn },
170-
];
171-
17235
if (loadingStatus === RequestStatus.DENIED) {
17336
return (
17437
<div data-testid="under-construction-placeholder" className="row justify-contnt-center m-6">
@@ -189,30 +52,10 @@ const FilesPage = ({
18952
loadingStatus={loadingStatus}
19053
/>
19154
<div className="h2">
192-
<FormattedMessage {...messages.heading} />
55+
{intl.formatMessage(messages.heading)}
19356
</div>
19457
{loadingStatus !== RequestStatus.FAILED && (
195-
<>
196-
<FileTable
197-
{...{
198-
courseId,
199-
data,
200-
handleAddFile,
201-
handleDeleteFile,
202-
handleDownloadFile,
203-
handleLockFile,
204-
handleUsagePaths,
205-
handleErrorReset,
206-
handleFileOrder,
207-
tableColumns,
208-
maxFileSize,
209-
thumbnailPreview,
210-
infoModalSidebar,
211-
files: assets,
212-
}}
213-
/>
214-
<FileValidationModal {...{ handleFileOverwrite }} />
215-
</>
58+
<CourseFilesSlot courseId={courseId} />
21659
)}
21760
</Container>
21861
</FilesPageProvider>
@@ -221,8 +64,6 @@ const FilesPage = ({
22164

22265
FilesPage.propTypes = {
22366
courseId: PropTypes.string.isRequired,
224-
// injected
225-
intl: intlShape.isRequired,
22667
};
22768

228-
export default injectIntl(FilesPage);
69+
export default FilesPage;

0 commit comments

Comments
 (0)