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' ;
2
4
import PropTypes from 'prop-types' ;
5
+ import React , { useEffect } from 'react' ;
3
6
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' ;
7
7
8
8
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' ;
23
11
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' ;
35
16
36
17
const FilesPage = ( {
37
18
courseId,
38
- // injected
39
- intl,
40
19
} ) => {
41
20
const dispatch = useDispatch ( ) ;
21
+ const intl = useIntl ( ) ;
42
22
const courseDetails = useModel ( 'courseDetails' , courseId ) ;
43
23
document . title = getPageHeadTitle ( courseDetails ?. name , intl . formatMessage ( messages . heading ) ) ;
44
-
45
- useEffect ( ( ) => {
46
- dispatch ( fetchAssets ( courseId ) ) ;
47
- } , [ courseId ] ) ;
48
-
49
24
const {
50
- assetIds,
51
25
loadingStatus,
52
26
addingStatus : addAssetStatus ,
53
27
deletingStatus : deleteAssetStatus ,
54
28
updatingStatus : updateAssetStatus ,
55
- usageStatus : usagePathStatus ,
56
29
errors : errorMessages ,
57
30
} = useSelector ( state => state . assets ) ;
58
-
31
+ useEffect ( ( ) => {
32
+ dispatch ( fetchAssets ( courseId ) ) ;
33
+ } , [ courseId ] ) ;
59
34
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
-
172
35
if ( loadingStatus === RequestStatus . DENIED ) {
173
36
return (
174
37
< div data-testid = "under-construction-placeholder" className = "row justify-contnt-center m-6" >
@@ -189,30 +52,10 @@ const FilesPage = ({
189
52
loadingStatus = { loadingStatus }
190
53
/>
191
54
< div className = "h2" >
192
- < FormattedMessage { ... messages . heading } />
55
+ { intl . formatMessage ( messages . heading ) }
193
56
</ div >
194
57
{ 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 } />
216
59
) }
217
60
</ Container >
218
61
</ FilesPageProvider >
@@ -221,8 +64,6 @@ const FilesPage = ({
221
64
222
65
FilesPage . propTypes = {
223
66
courseId : PropTypes . string . isRequired ,
224
- // injected
225
- intl : intlShape . isRequired ,
226
67
} ;
227
68
228
- export default injectIntl ( FilesPage ) ;
69
+ export default FilesPage ;
0 commit comments