Skip to content

Commit 7870551

Browse files
committed
Added cif preview. #719
1 parent 11aa239 commit 7870551

File tree

6 files changed

+346
-72
lines changed

6 files changed

+346
-72
lines changed

.gitmodules

+3
Original file line numberDiff line numberDiff line change
@@ -226,3 +226,6 @@
226226
[submodule "dependencies/parsers/yambo"]
227227
path = dependencies/parsers/yambo
228228
url = https://github.com/nomad-coe/nomad-parser-yambo.git
229+
[submodule "gui/crystcif-parse"]
230+
path = gui/crystcif-parse
231+
url = https://github.com/stur86/crystcif-parse.git

gui/crystcif-parse

Submodule crystcif-parse added at 06ee0e9

gui/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"commit": "e98694e",
55
"private": true,
66
"workspaces": [
7-
"materia"
7+
"materia",
8+
"crystcif-parse"
89
],
910
"dependencies": {
1011
"@date-io/date-fns": "1.x",

gui/src/components/archive/FilePreview.js

+47-19
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ import InfiniteScroll from 'react-infinite-scroller'
2525
import { useApi } from '../api'
2626
import { apiBase } from '../../config'
2727
import { Item } from './Browser'
28+
import { parseCifStructures } from 'crystcif-parse'
29+
import Structure from '../visualization/Structure'
2830

2931
pdfjs.GlobalWorkerOptions.workerSrc = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`
3032

31-
const maxPreviewWidth = 900
32-
3333
const useFilePreviewStyles = makeStyles(theme => ({
3434
scrollableContainer: {
3535
width: '100%',
@@ -38,8 +38,8 @@ const useFilePreviewStyles = makeStyles(theme => ({
3838
overflow: 'auto'
3939
},
4040
img: {
41-
maxWidth: maxPreviewWidth,
42-
maxHeight: '100%'
41+
maxHeight: '100%',
42+
maxWidth: '100%'
4343
}
4444
}))
4545

@@ -49,6 +49,7 @@ const viewerText = {
4949
fileExtensions: ['txt', 'yaml', 'yml', 'csv', 'xml'],
5050
maxSizePreview: 1e10, // Effectively infinite
5151
maxSizeAutoPreview: 1e10, // Effectively infinite
52+
width: 700,
5253
render: ({uploadId, path}) => {
5354
return <FilePreviewText uploadId={uploadId} path={path}/>
5455
}
@@ -86,6 +87,7 @@ const viewerPDF = {
8687
fileExtensions: ['pdf'],
8788
maxSizeAutoPreview: 10e6,
8889
requiresUrlWithAuth: true,
90+
width: 700,
8991
render: ({url, setFailedToPreview}) => {
9092
return <FilePreviewPdf
9193
file={{url: url}}
@@ -104,7 +106,32 @@ const viewerHDF5 = {
104106
return <Item itemKey="h5web"><Typography>H5Web</Typography></Item>
105107
}
106108
}
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]
108135

109136
const FilePreview = React.memo(({uploadId, path, size}) => {
110137
const classes = useFilePreviewStyles()
@@ -172,32 +199,35 @@ const FilePreview = React.memo(({uploadId, path, size}) => {
172199
)
173200
}
174201

202+
let content
175203
const url = user ? fullUrlWithAuth : fullUrl
176204
if ((selectedViewer.requiresUrlWithAuth && !url) || (selectedViewer.requiresLoadedData && !dataLoaded)) {
177205
// 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) {
182208
try {
183-
return selectedViewer.render({uploadId, path, url, data, setFailedToPreview, classes})
209+
content = selectedViewer.render({uploadId, path, url, data, setFailedToPreview, classes})
184210
} catch (error) {
185-
setFailedToPreview(true)
211+
// TODO
186212
}
187-
}
188-
// Selected viewer failed
189-
if (!useFallbackViewer) {
190-
return (
213+
} else if (!useFallbackViewer) {
214+
// Selected viewer failed
215+
content = (
191216
<Box textAlign="center">
192217
<Typography color="error">Failed to open with {selectedViewer.name} viewer. Bad file format?</Typography>
193218
<Button onClick={() => setUseFallbackViewer(true)} variant="contained" size="small" color="primary">
194219
Open with text viewer
195220
</Button>
196221
</Box>
197222
)
223+
} else {
224+
// Use the text viewer as last resort
225+
content = viewerText.render({uploadId, path, url, data, setFailedToPreview, classes})
198226
}
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>
201231
})
202232
FilePreview.propTypes = {
203233
uploadId: PropTypes.string.isRequired,
@@ -209,7 +239,6 @@ export default FilePreview
209239
const useFilePreviewTextStyles = makeStyles(theme => ({
210240
containerDiv: {
211241
padding: theme.spacing(1),
212-
width: maxPreviewWidth,
213242
height: '100%',
214243
overflow: 'auto',
215244
backgroundColor: theme.palette.primary.dark
@@ -287,7 +316,6 @@ FilePreviewText.propTypes = {
287316

288317
const useFilePreviewPdfStyles = makeStyles(theme => ({
289318
containerDiv: {
290-
width: maxPreviewWidth,
291319
height: '100%',
292320
overflowX: 'hidden',
293321
overflowY: 'scroll',

gui/src/components/entry/properties/MaterialCard.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ const MaterialCard = React.memo(({index, properties, archive}) => {
127127
)}
128128
</Select>
129129
</FormControl>
130-
130+
console.log('###', structure)
131131
return <PropertyCard title="Material" action={select}>
132132
<PropertyGrid>
133133
<PropertyItem title="Composition" xs={6} height="auto">

0 commit comments

Comments
 (0)