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' ;
24import PropTypes from 'prop-types' ;
5+ import React , { useEffect } from 'react' ;
36import { 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
88import { 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' ;
2311import 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
3617const 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 ) ;
5831
59- 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- } ;
32+ useEffect ( ( ) => {
33+ dispatch ( fetchAssets ( courseId ) ) ;
34+ } , [ courseId ] ) ;
13235
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- ] ;
36+ const handleErrorReset = ( error ) => dispatch ( resetErrors ( error ) ) ;
17137
17238 if ( loadingStatus === RequestStatus . DENIED ) {
17339 return (
@@ -189,30 +55,10 @@ const FilesPage = ({
18955 loadingStatus = { loadingStatus }
19056 />
19157 < div className = "h2" >
192- < FormattedMessage { ... messages . heading } />
58+ { intl . formatMessage ( messages . heading ) }
19359 </ div >
19460 { 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- </ >
61+ < CourseFilesSlot courseId = { courseId } />
21662 ) }
21763 </ Container >
21864 </ FilesPageProvider >
@@ -221,8 +67,6 @@ const FilesPage = ({
22167
22268FilesPage . propTypes = {
22369 courseId : PropTypes . string . isRequired ,
224- // injected
225- intl : intlShape . isRequired ,
22670} ;
22771
228- export default injectIntl ( FilesPage ) ;
72+ export default FilesPage ;
0 commit comments