@openneuro/app 4.6.0-alpha.3 → 4.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.scss-lint.yml +0 -1
- package/Dockerfile +1 -1
- package/package.json +7 -6
- package/src/index.html +0 -1
- package/src/scripts/dataset/dataset-query.jsx +10 -7
- package/src/scripts/dataset/draft-container.tsx +7 -0
- package/src/scripts/dataset/files/file-display.jsx +21 -32
- package/src/scripts/dataset/files/viewers/__tests__/__snapshots__/file-viewer-json.spec.jsx.snap +52 -84
- package/src/scripts/dataset/files/viewers/file-viewer-json.jsx +8 -14
- package/src/scripts/dataset/files/viewers/file-viewer-nifti.jsx +19 -13
- package/src/scripts/dataset/snapshot-container.tsx +239 -226
- package/src/scripts/errors/404page.tsx +3 -0
- package/src/assets/papaya.js +0 -2101
- package/src/scripts/common/partials/papaya.jsx +0 -97
- package/src/scripts/dataset/routes/styles/draft-background.tsx +0 -7
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
|
+
import Helmet from 'react-helmet'
|
|
2
3
|
import { gql, useQuery } from '@apollo/client'
|
|
3
4
|
import { DatasetPageTabContainer } from './routes/styles/dataset-page-tab-container'
|
|
4
5
|
import DatasetQueryContext from '../datalad/dataset/dataset-query-context.js'
|
|
@@ -6,7 +7,7 @@ import { Link, useLocation } from 'react-router-dom'
|
|
|
6
7
|
import pluralize from 'pluralize'
|
|
7
8
|
import formatDistanceToNow from 'date-fns/formatDistanceToNow'
|
|
8
9
|
import parseISO from 'date-fns/parseISO'
|
|
9
|
-
|
|
10
|
+
import { pageTitle } from '../resources/strings.js'
|
|
10
11
|
import Validation from '../validation/validation.jsx'
|
|
11
12
|
import { config } from '../config'
|
|
12
13
|
import DatasetCitation from './fragments/dataset-citation.jsx'
|
|
@@ -87,261 +88,273 @@ const SnapshotContainer: React.FC<SnapshotContainerProps> = ({
|
|
|
87
88
|
const modality: string = summary?.modalities[0] || ''
|
|
88
89
|
|
|
89
90
|
return (
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
{
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
91
|
+
<>
|
|
92
|
+
<Helmet>
|
|
93
|
+
<title>
|
|
94
|
+
{description.Name} - {pageTitle}
|
|
95
|
+
</title>
|
|
96
|
+
</Helmet>
|
|
97
|
+
<div
|
|
98
|
+
className={`dataset dataset-draft dataset-page dataset-page-${modality?.toLowerCase()}`}>
|
|
99
|
+
{summary && (
|
|
100
|
+
<DatasetHeader
|
|
101
|
+
pageHeading={description.Name}
|
|
102
|
+
modality={summary?.modalities[0]}
|
|
103
|
+
/>
|
|
104
|
+
)}
|
|
105
|
+
{snapshot?.deprecated && (
|
|
106
|
+
<DatasetAlertVersion
|
|
107
|
+
datasetId={dataset.id}
|
|
108
|
+
tag={snapshot.tag}
|
|
109
|
+
reason={snapshot.deprecated.reason}
|
|
110
|
+
hasEdit={hasEdit}
|
|
111
|
+
/>
|
|
112
|
+
)}
|
|
113
|
+
<div className="container">
|
|
114
|
+
<div className="grid grid-between dataset-header-meta">
|
|
115
|
+
<div className="col col-8 col-lg">
|
|
116
|
+
{summary && (
|
|
117
|
+
<DatasetHeaderMeta
|
|
118
|
+
size={snapshot.size}
|
|
119
|
+
totalFiles={summary.totalFiles}
|
|
120
|
+
datasetId={datasetId}
|
|
121
|
+
/>
|
|
122
|
+
)}
|
|
123
|
+
</div>
|
|
124
|
+
<div className="col follow-bookmark">
|
|
125
|
+
<FollowDataset
|
|
126
|
+
profile={profile}
|
|
127
|
+
datasetId={dataset.id}
|
|
128
|
+
following={dataset.following}
|
|
129
|
+
followers={dataset.followers.length}
|
|
114
130
|
/>
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
followers={dataset.followers.length}
|
|
123
|
-
/>
|
|
124
|
-
<StarDataset
|
|
125
|
-
profile={profile}
|
|
126
|
-
datasetId={dataset.id}
|
|
127
|
-
starred={dataset.starred}
|
|
128
|
-
stars={dataset.stars.length}
|
|
129
|
-
/>
|
|
131
|
+
<StarDataset
|
|
132
|
+
profile={profile}
|
|
133
|
+
datasetId={dataset.id}
|
|
134
|
+
starred={dataset.starred}
|
|
135
|
+
stars={dataset.stars.length}
|
|
136
|
+
/>
|
|
137
|
+
</div>
|
|
130
138
|
</div>
|
|
131
139
|
</div>
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
140
|
+
<div className="container">
|
|
141
|
+
<div className="grid grid-between">
|
|
142
|
+
<div className="col col-lg col-8">
|
|
143
|
+
<div className="dataset-validation">
|
|
144
|
+
<ValidationBlock>
|
|
145
|
+
<Validation datasetId={dataset.id} issues={snapshot.issues} />
|
|
146
|
+
</ValidationBlock>
|
|
147
|
+
<BrainLifeButton
|
|
148
|
+
datasetId={datasetId}
|
|
149
|
+
onBrainlife={snapshot.onBrainlife}
|
|
150
|
+
snapshotVersion={snapshot.tag}
|
|
151
|
+
/>
|
|
152
|
+
<CloneDropdown
|
|
153
|
+
gitAccess={
|
|
154
|
+
<DatasetGitAccess
|
|
155
|
+
hasEdit={hasEdit}
|
|
156
|
+
configGithub={config.github}
|
|
157
|
+
configUrl={config.url}
|
|
158
|
+
worker={dataset.worker}
|
|
159
|
+
datasetId={datasetId}
|
|
160
|
+
gitHash={snapshot.hexsha}
|
|
161
|
+
/>
|
|
162
|
+
}
|
|
163
|
+
/>
|
|
164
|
+
</div>
|
|
165
|
+
<div className="dataset-tool-buttons">
|
|
166
|
+
<DatasetTools
|
|
167
|
+
hasEdit={hasEdit}
|
|
168
|
+
isPublic={dataset.public}
|
|
169
|
+
datasetId={datasetId}
|
|
170
|
+
snapshotId={snapshot.tag}
|
|
171
|
+
isAdmin={isAdmin}
|
|
172
|
+
isDatasetAdmin={isDatasetAdmin}
|
|
173
|
+
/>
|
|
174
|
+
</div>
|
|
175
|
+
<DatasetPageTabContainer>
|
|
176
|
+
<TabRoutesSnapshot dataset={dataset} snapshot={snapshot} />
|
|
177
|
+
</DatasetPageTabContainer>
|
|
178
|
+
</div>
|
|
179
|
+
<div className="col sidebar">
|
|
180
|
+
<MetaDataBlock
|
|
181
|
+
heading="Authors"
|
|
182
|
+
item={
|
|
183
|
+
description?.Authors?.length
|
|
184
|
+
? description.Authors.join(', ')
|
|
185
|
+
: 'N/A'
|
|
186
|
+
}
|
|
187
|
+
className="dmb-inline-list"
|
|
144
188
|
/>
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
<
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
configUrl={config.url}
|
|
151
|
-
worker={dataset.worker}
|
|
152
|
-
datasetId={datasetId}
|
|
153
|
-
gitHash={snapshot.hexsha}
|
|
189
|
+
<>
|
|
190
|
+
{summary && (
|
|
191
|
+
<ModalitiesMetaDataBlock
|
|
192
|
+
items={summary?.modalities}
|
|
193
|
+
className="dmb-modalities"
|
|
154
194
|
/>
|
|
195
|
+
)}
|
|
196
|
+
</>
|
|
197
|
+
|
|
198
|
+
<MetaDataBlock
|
|
199
|
+
heading="Versions"
|
|
200
|
+
item={
|
|
201
|
+
<div className="version-block">
|
|
202
|
+
<VersionList
|
|
203
|
+
hasEdit={hasEdit}
|
|
204
|
+
datasetId={datasetId}
|
|
205
|
+
items={dataset.snapshots}
|
|
206
|
+
className="version-dropdown"
|
|
207
|
+
activeDataset={activeDataset}
|
|
208
|
+
dateModified={dateModified}
|
|
209
|
+
selected={selectedVersion}
|
|
210
|
+
setSelected={setSelectedVersion}
|
|
211
|
+
/>
|
|
212
|
+
</div>
|
|
155
213
|
}
|
|
156
214
|
/>
|
|
157
|
-
</div>
|
|
158
|
-
<div className="dataset-tool-buttons">
|
|
159
|
-
<DatasetTools
|
|
160
|
-
hasEdit={hasEdit}
|
|
161
|
-
isPublic={dataset.public}
|
|
162
|
-
datasetId={datasetId}
|
|
163
|
-
snapshotId={snapshot.tag}
|
|
164
|
-
isAdmin={isAdmin}
|
|
165
|
-
isDatasetAdmin={isDatasetAdmin}
|
|
166
|
-
/>
|
|
167
|
-
</div>
|
|
168
|
-
<DatasetPageTabContainer>
|
|
169
|
-
<TabRoutesSnapshot dataset={dataset} snapshot={snapshot} />
|
|
170
|
-
</DatasetPageTabContainer>
|
|
171
|
-
</div>
|
|
172
|
-
<div className="col sidebar">
|
|
173
|
-
<MetaDataBlock
|
|
174
|
-
heading="Authors"
|
|
175
|
-
item={
|
|
176
|
-
description?.Authors?.length
|
|
177
|
-
? description.Authors.join(', ')
|
|
178
|
-
: 'N/A'
|
|
179
|
-
}
|
|
180
|
-
className="dmb-inline-list"
|
|
181
|
-
/>
|
|
182
|
-
<>
|
|
183
215
|
{summary && (
|
|
184
|
-
<
|
|
185
|
-
|
|
186
|
-
|
|
216
|
+
<MetaDataBlock
|
|
217
|
+
heading="Tasks"
|
|
218
|
+
item={summary.tasks.length ? summary.tasks.join(', ') : 'N/A'}
|
|
219
|
+
className="dmb-inline-list"
|
|
187
220
|
/>
|
|
188
221
|
)}
|
|
189
|
-
|
|
222
|
+
{summary?.modalities.includes('pet') ||
|
|
223
|
+
summary?.modalities.includes('Pet') ||
|
|
224
|
+
(summary?.modalities.includes('PET') && (
|
|
225
|
+
<>
|
|
226
|
+
<MetaDataBlock
|
|
227
|
+
heading={pluralize('Target', summary.pet?.BodyPart)}
|
|
228
|
+
item={summary.pet?.BodyPart}
|
|
229
|
+
/>
|
|
230
|
+
<MetaDataBlock
|
|
231
|
+
heading={pluralize(
|
|
232
|
+
'Scanner Manufacturer',
|
|
233
|
+
summary.pet?.ScannerManufacturer,
|
|
234
|
+
)}
|
|
235
|
+
item={
|
|
236
|
+
summary.pet?.ScannerManufacturer
|
|
237
|
+
? summary.pet?.ScannerManufacturer
|
|
238
|
+
: 'N/A'
|
|
239
|
+
}
|
|
240
|
+
/>
|
|
241
|
+
|
|
242
|
+
<MetaDataBlock
|
|
243
|
+
heading={pluralize(
|
|
244
|
+
'Scanner Model',
|
|
245
|
+
summary.pet?.ScannerManufacturersModelName,
|
|
246
|
+
)}
|
|
247
|
+
item={
|
|
248
|
+
summary.pet?.ScannerManufacturersModelName
|
|
249
|
+
? summary.pet?.ScannerManufacturersModelName
|
|
250
|
+
: 'N/A'
|
|
251
|
+
}
|
|
252
|
+
/>
|
|
253
|
+
<MetaDataBlock
|
|
254
|
+
heading={pluralize(
|
|
255
|
+
'Radionuclide',
|
|
256
|
+
summary.pet?.TracerRadionuclide,
|
|
257
|
+
)}
|
|
258
|
+
item={
|
|
259
|
+
summary.pet?.TracerRadionuclide
|
|
260
|
+
? summary.pet?.TracerRadionuclide
|
|
261
|
+
: 'N/A'
|
|
262
|
+
}
|
|
263
|
+
/>
|
|
264
|
+
<MetaDataBlock
|
|
265
|
+
heading={pluralize(
|
|
266
|
+
'Radiotracer',
|
|
267
|
+
summary.pet?.TracerName,
|
|
268
|
+
)}
|
|
269
|
+
item={
|
|
270
|
+
summary.pet?.TracerName
|
|
271
|
+
? summary.pet?.TracerName
|
|
272
|
+
: 'N/A'
|
|
273
|
+
}
|
|
274
|
+
/>
|
|
275
|
+
</>
|
|
276
|
+
))}
|
|
190
277
|
|
|
191
|
-
<MetaDataBlock
|
|
192
|
-
heading="Versions"
|
|
193
|
-
item={
|
|
194
|
-
<div className="version-block">
|
|
195
|
-
<VersionList
|
|
196
|
-
hasEdit={hasEdit}
|
|
197
|
-
datasetId={datasetId}
|
|
198
|
-
items={dataset.snapshots}
|
|
199
|
-
className="version-dropdown"
|
|
200
|
-
activeDataset={activeDataset}
|
|
201
|
-
dateModified={dateModified}
|
|
202
|
-
selected={selectedVersion}
|
|
203
|
-
setSelected={setSelectedVersion}
|
|
204
|
-
/>
|
|
205
|
-
</div>
|
|
206
|
-
}
|
|
207
|
-
/>
|
|
208
|
-
{summary && (
|
|
209
278
|
<MetaDataBlock
|
|
210
|
-
heading="
|
|
211
|
-
item={
|
|
212
|
-
|
|
279
|
+
heading="Uploaded by"
|
|
280
|
+
item={
|
|
281
|
+
<>
|
|
282
|
+
{dataset.uploader.name} on {dateAdded} -{' '}
|
|
283
|
+
{dateAddedDifference} ago
|
|
284
|
+
</>
|
|
285
|
+
}
|
|
213
286
|
/>
|
|
214
|
-
)}
|
|
215
|
-
{summary?.modalities.includes('pet') ||
|
|
216
|
-
summary?.modalities.includes('Pet') ||
|
|
217
|
-
(summary?.modalities.includes('PET') && (
|
|
218
|
-
<>
|
|
219
|
-
<MetaDataBlock
|
|
220
|
-
heading={pluralize('Target', summary.pet?.BodyPart)}
|
|
221
|
-
item={summary.pet?.BodyPart}
|
|
222
|
-
/>
|
|
223
|
-
<MetaDataBlock
|
|
224
|
-
heading={pluralize(
|
|
225
|
-
'Scanner Manufacturer',
|
|
226
|
-
summary.pet?.ScannerManufacturer,
|
|
227
|
-
)}
|
|
228
|
-
item={
|
|
229
|
-
summary.pet?.ScannerManufacturer
|
|
230
|
-
? summary.pet?.ScannerManufacturer
|
|
231
|
-
: 'N/A'
|
|
232
|
-
}
|
|
233
|
-
/>
|
|
234
287
|
|
|
288
|
+
{dataset.snapshots.length && (
|
|
289
|
+
<MetaDataBlock
|
|
290
|
+
heading="Last Updated"
|
|
291
|
+
item={
|
|
292
|
+
<>
|
|
293
|
+
{dateModified} - {dateUpdatedDifference} ago
|
|
294
|
+
</>
|
|
295
|
+
}
|
|
296
|
+
/>
|
|
297
|
+
)}
|
|
298
|
+
<MetaDataBlock heading="Sessions" item={numSessions} />
|
|
299
|
+
<>
|
|
300
|
+
{summary && (
|
|
235
301
|
<MetaDataBlock
|
|
236
|
-
heading=
|
|
237
|
-
|
|
238
|
-
summary.pet?.ScannerManufacturersModelName,
|
|
239
|
-
)}
|
|
240
|
-
item={
|
|
241
|
-
summary.pet?.ScannerManufacturersModelName
|
|
242
|
-
? summary.pet?.ScannerManufacturersModelName
|
|
243
|
-
: 'N/A'
|
|
244
|
-
}
|
|
245
|
-
/>
|
|
246
|
-
<MetaDataBlock
|
|
247
|
-
heading={pluralize(
|
|
248
|
-
'Radionuclide',
|
|
249
|
-
summary.pet?.TracerRadionuclide,
|
|
250
|
-
)}
|
|
251
|
-
item={
|
|
252
|
-
summary.pet?.TracerRadionuclide
|
|
253
|
-
? summary.pet?.TracerRadionuclide
|
|
254
|
-
: 'N/A'
|
|
255
|
-
}
|
|
256
|
-
/>
|
|
257
|
-
<MetaDataBlock
|
|
258
|
-
heading={pluralize('Radiotracer', summary.pet?.TracerName)}
|
|
259
|
-
item={
|
|
260
|
-
summary.pet?.TracerName ? summary.pet?.TracerName : 'N/A'
|
|
261
|
-
}
|
|
302
|
+
heading="Participants"
|
|
303
|
+
item={summary.subjects.length}
|
|
262
304
|
/>
|
|
263
|
-
|
|
264
|
-
|
|
305
|
+
)}
|
|
306
|
+
</>
|
|
265
307
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
}
|
|
274
|
-
/>
|
|
308
|
+
<MetaDataBlock
|
|
309
|
+
heading="Dataset DOI"
|
|
310
|
+
item={
|
|
311
|
+
<DOILink DOI={description.DatasetDOI} datasetId={datasetId} />
|
|
312
|
+
}
|
|
313
|
+
/>
|
|
314
|
+
<MetaDataBlock heading="License" item={description.License} />
|
|
275
315
|
|
|
276
|
-
{dataset.snapshots.length && (
|
|
277
316
|
<MetaDataBlock
|
|
278
|
-
heading="
|
|
317
|
+
heading="How To Cite"
|
|
279
318
|
item={
|
|
280
319
|
<>
|
|
281
|
-
|
|
320
|
+
<DatasetCitation snapshot={snapshot} />
|
|
321
|
+
<h5>
|
|
322
|
+
<Link to="/cite">More citation info</Link>
|
|
323
|
+
</h5>
|
|
282
324
|
</>
|
|
283
325
|
}
|
|
284
326
|
/>
|
|
285
|
-
)}
|
|
286
|
-
<MetaDataBlock heading="Sessions" item={numSessions} />
|
|
287
|
-
<>
|
|
288
|
-
{summary && (
|
|
289
|
-
<MetaDataBlock
|
|
290
|
-
heading="Participants"
|
|
291
|
-
item={summary.subjects.length}
|
|
292
|
-
/>
|
|
293
|
-
)}
|
|
294
|
-
</>
|
|
295
|
-
|
|
296
|
-
<MetaDataBlock
|
|
297
|
-
heading="Dataset DOI"
|
|
298
|
-
item={
|
|
299
|
-
<DOILink DOI={description.DatasetDOI} datasetId={datasetId} />
|
|
300
|
-
}
|
|
301
|
-
/>
|
|
302
|
-
<MetaDataBlock heading="License" item={description.License} />
|
|
303
327
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
heading="Acknowledgements"
|
|
318
|
-
item={description.Acknowledgements}
|
|
319
|
-
/>
|
|
320
|
-
<MetaDataBlock
|
|
321
|
-
heading="How to Acknowledge"
|
|
322
|
-
item={description.HowToAcknowledge}
|
|
323
|
-
/>
|
|
324
|
-
<MetaDataBlock
|
|
325
|
-
heading="Funding"
|
|
326
|
-
item={description.Funding}
|
|
327
|
-
className="dmb-list"
|
|
328
|
-
/>
|
|
328
|
+
<MetaDataBlock
|
|
329
|
+
heading="Acknowledgements"
|
|
330
|
+
item={description.Acknowledgements}
|
|
331
|
+
/>
|
|
332
|
+
<MetaDataBlock
|
|
333
|
+
heading="How to Acknowledge"
|
|
334
|
+
item={description.HowToAcknowledge}
|
|
335
|
+
/>
|
|
336
|
+
<MetaDataBlock
|
|
337
|
+
heading="Funding"
|
|
338
|
+
item={description.Funding}
|
|
339
|
+
className="dmb-list"
|
|
340
|
+
/>
|
|
329
341
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
342
|
+
<MetaDataBlock
|
|
343
|
+
heading="References and Links"
|
|
344
|
+
item={description.ReferencesAndLinks}
|
|
345
|
+
className="dmb-list"
|
|
346
|
+
/>
|
|
335
347
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
348
|
+
<MetaDataBlock
|
|
349
|
+
heading="Ethics Approvals"
|
|
350
|
+
item={description.EthicsApprovals}
|
|
351
|
+
className="dmb-list"
|
|
352
|
+
/>
|
|
353
|
+
</div>
|
|
341
354
|
</div>
|
|
342
355
|
</div>
|
|
343
356
|
</div>
|
|
344
|
-
|
|
357
|
+
</>
|
|
345
358
|
)
|
|
346
359
|
}
|
|
347
360
|
|
|
@@ -22,16 +22,19 @@ interface FourOFourPageProps {
|
|
|
22
22
|
redirectRoute?: string
|
|
23
23
|
redirectRouteName?: string
|
|
24
24
|
theme?: string
|
|
25
|
+
message?: string
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
const FourOFourPage: FC<FourOFourPageProps> = ({
|
|
28
29
|
redirectRoute = '/',
|
|
29
30
|
redirectRouteName = 'the home page',
|
|
30
31
|
theme = 'topLevel',
|
|
32
|
+
message = '',
|
|
31
33
|
}) => {
|
|
32
34
|
return (
|
|
33
35
|
<Container styleContext={theme}>
|
|
34
36
|
<h3>404: The page you are looking for does not exist.</h3>
|
|
37
|
+
{message && <p>{message}</p>}
|
|
35
38
|
<p>
|
|
36
39
|
Click <Link to={redirectRoute}>here</Link> to go to
|
|
37
40
|
{' ' + redirectRouteName}.
|