@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.
@@ -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
- <div
91
- className={`dataset dataset-draft dataset-page dataset-page-${modality?.toLowerCase()}`}>
92
- {summary && (
93
- <DatasetHeader
94
- pageHeading={description.Name}
95
- modality={summary?.modalities[0]}
96
- />
97
- )}
98
- {snapshot?.deprecated && (
99
- <DatasetAlertVersion
100
- datasetId={dataset.id}
101
- tag={snapshot.tag}
102
- reason={snapshot.deprecated.reason}
103
- hasEdit={hasEdit}
104
- />
105
- )}
106
- <div className="container">
107
- <div className="grid grid-between dataset-header-meta">
108
- <div className="col col-8 col-lg">
109
- {summary && (
110
- <DatasetHeaderMeta
111
- size={snapshot.size}
112
- totalFiles={summary.totalFiles}
113
- datasetId={datasetId}
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
- </div>
117
- <div className="col follow-bookmark">
118
- <FollowDataset
119
- profile={profile}
120
- datasetId={dataset.id}
121
- following={dataset.following}
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
- </div>
133
- <div className="container">
134
- <div className="grid grid-between">
135
- <div className="col col-lg col-8">
136
- <div className="dataset-validation">
137
- <ValidationBlock>
138
- <Validation datasetId={dataset.id} issues={snapshot.issues} />
139
- </ValidationBlock>
140
- <BrainLifeButton
141
- datasetId={datasetId}
142
- onBrainlife={snapshot.onBrainlife}
143
- snapshotVersion={snapshot.tag}
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
- <CloneDropdown
146
- gitAccess={
147
- <DatasetGitAccess
148
- hasEdit={hasEdit}
149
- configGithub={config.github}
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
- <ModalitiesMetaDataBlock
185
- items={summary?.modalities}
186
- className="dmb-modalities"
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="Tasks"
211
- item={summary.tasks.length ? summary.tasks.join(', ') : 'N/A'}
212
- className="dmb-inline-list"
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={pluralize(
237
- 'Scanner Model',
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
- <MetaDataBlock
267
- heading="Uploaded by"
268
- item={
269
- <>
270
- {dataset.uploader.name} on {dateAdded} - {dateAddedDifference}{' '}
271
- ago
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="Last Updated"
317
+ heading="How To Cite"
279
318
  item={
280
319
  <>
281
- {dateModified} - {dateUpdatedDifference} ago
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
- <MetaDataBlock
305
- heading="How To Cite"
306
- item={
307
- <>
308
- <DatasetCitation snapshot={snapshot} />
309
- <h5>
310
- <Link to="/cite">More citation info</Link>
311
- </h5>
312
- </>
313
- }
314
- />
315
-
316
- <MetaDataBlock
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
- <MetaDataBlock
331
- heading="References and Links"
332
- item={description.ReferencesAndLinks}
333
- className="dmb-list"
334
- />
342
+ <MetaDataBlock
343
+ heading="References and Links"
344
+ item={description.ReferencesAndLinks}
345
+ className="dmb-list"
346
+ />
335
347
 
336
- <MetaDataBlock
337
- heading="Ethics Approvals"
338
- item={description.EthicsApprovals}
339
- className="dmb-list"
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
- </div>
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}.