@@ -25,11 +25,11 @@ import InfiniteScroll from 'react-infinite-scroller'
25
25
import { useApi } from '../api'
26
26
import { apiBase } from '../../config'
27
27
import { Item } from './Browser'
28
+ import { parseCifStructures } from 'crystcif-parse'
29
+ import Structure from '../visualization/Structure'
28
30
29
31
pdfjs . GlobalWorkerOptions . workerSrc = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${ pdfjs . version } /pdf.worker.js`
30
32
31
- const maxPreviewWidth = 900
32
-
33
33
const useFilePreviewStyles = makeStyles ( theme => ( {
34
34
scrollableContainer : {
35
35
width : '100%' ,
@@ -38,8 +38,8 @@ const useFilePreviewStyles = makeStyles(theme => ({
38
38
overflow : 'auto'
39
39
} ,
40
40
img : {
41
- maxWidth : maxPreviewWidth ,
42
- maxHeight : '100%'
41
+ maxHeight : '100%' ,
42
+ maxWidth : '100%'
43
43
}
44
44
} ) )
45
45
@@ -49,6 +49,7 @@ const viewerText = {
49
49
fileExtensions : [ 'txt' , 'yaml' , 'yml' , 'csv' , 'xml' ] ,
50
50
maxSizePreview : 1e10 , // Effectively infinite
51
51
maxSizeAutoPreview : 1e10 , // Effectively infinite
52
+ width : 700 ,
52
53
render : ( { uploadId, path} ) => {
53
54
return < FilePreviewText uploadId = { uploadId } path = { path } />
54
55
}
@@ -86,6 +87,7 @@ const viewerPDF = {
86
87
fileExtensions : [ 'pdf' ] ,
87
88
maxSizeAutoPreview : 10e6 ,
88
89
requiresUrlWithAuth : true ,
90
+ width : 700 ,
89
91
render : ( { url, setFailedToPreview} ) => {
90
92
return < FilePreviewPdf
91
93
file = { { url : url } }
@@ -104,7 +106,32 @@ const viewerHDF5 = {
104
106
return < Item itemKey = "h5web" > < Typography > H5Web</ Typography > </ Item >
105
107
}
106
108
}
107
- const viewers = [ viewerText , viewerImg , viewerJSON , viewerPDF , viewerHDF5 ]
109
+ const viewerCif = {
110
+ name : 'cif' ,
111
+ fileExtensions : [ 'cif' ] ,
112
+ maxSizeAutoPreview : 1e5 ,
113
+ requiresLoadedData : true ,
114
+ width : 500 ,
115
+ render : ( { data} ) => {
116
+ if ( typeof data . current === 'string' ) {
117
+ const cifData = parseCifStructures ( data . current )
118
+ const cifStructure = cifData [ Object . keys ( cifData ) [ 0 ] ]
119
+ const structureData = {
120
+ cell : cifStructure . get_cell ( ) ,
121
+ pbc : cifStructure . get_pbc ( ) ,
122
+ positions : cifStructure . get_positions ( ) ,
123
+ species : cifStructure . get_chemical_symbols ( )
124
+ }
125
+ data . current = structureData
126
+ }
127
+ return (
128
+ < div style = { { height : 500 , width : 500 } } >
129
+ < Structure data = { data . current } />
130
+ </ div >
131
+ )
132
+ }
133
+ }
134
+ const viewers = [ viewerText , viewerImg , viewerJSON , viewerPDF , viewerHDF5 , viewerCif ]
108
135
109
136
const FilePreview = React . memo ( ( { uploadId, path, size} ) => {
110
137
const classes = useFilePreviewStyles ( )
@@ -172,32 +199,35 @@ const FilePreview = React.memo(({uploadId, path, size}) => {
172
199
)
173
200
}
174
201
202
+ let content
175
203
const url = user ? fullUrlWithAuth : fullUrl
176
204
if ( ( selectedViewer . requiresUrlWithAuth && ! url ) || ( selectedViewer . requiresLoadedData && ! dataLoaded ) ) {
177
205
// Not ready to invoke the viewer yet
178
- return < Typography > Loading...</ Typography >
179
- }
180
-
181
- if ( ! failedToPreview ) {
206
+ content = < Typography > Loading...</ Typography >
207
+ } else if ( ! failedToPreview ) {
182
208
try {
183
- return selectedViewer . render ( { uploadId, path, url, data, setFailedToPreview, classes} )
209
+ content = selectedViewer . render ( { uploadId, path, url, data, setFailedToPreview, classes} )
184
210
} catch ( error ) {
185
- setFailedToPreview ( true )
211
+ // TODO
186
212
}
187
- }
188
- // Selected viewer failed
189
- if ( ! useFallbackViewer ) {
190
- return (
213
+ } else if ( ! useFallbackViewer ) {
214
+ // Selected viewer failed
215
+ content = (
191
216
< Box textAlign = "center" >
192
217
< Typography color = "error" > Failed to open with { selectedViewer . name } viewer. Bad file format?</ Typography >
193
218
< Button onClick = { ( ) => setUseFallbackViewer ( true ) } variant = "contained" size = "small" color = "primary" >
194
219
Open with text viewer
195
220
</ Button >
196
221
</ Box >
197
222
)
223
+ } else {
224
+ // Use the text viewer as last resort
225
+ content = viewerText . render ( { uploadId, path, url, data, setFailedToPreview, classes} )
198
226
}
199
- // Use the text viewer as last resort
200
- return viewerText . render ( { uploadId, path, url, data, setFailedToPreview, classes} )
227
+
228
+ return < div style = { { width : selectedViewer . width || 500 } } >
229
+ { content }
230
+ </ div >
201
231
} )
202
232
FilePreview . propTypes = {
203
233
uploadId : PropTypes . string . isRequired ,
@@ -209,7 +239,6 @@ export default FilePreview
209
239
const useFilePreviewTextStyles = makeStyles ( theme => ( {
210
240
containerDiv : {
211
241
padding : theme . spacing ( 1 ) ,
212
- width : maxPreviewWidth ,
213
242
height : '100%' ,
214
243
overflow : 'auto' ,
215
244
backgroundColor : theme . palette . primary . dark
@@ -287,7 +316,6 @@ FilePreviewText.propTypes = {
287
316
288
317
const useFilePreviewPdfStyles = makeStyles ( theme => ( {
289
318
containerDiv : {
290
- width : maxPreviewWidth ,
291
319
height : '100%' ,
292
320
overflowX : 'hidden' ,
293
321
overflowY : 'scroll' ,
0 commit comments