Skip to content

Commit ee56ee5

Browse files
committed
feat: add metadata table layout
1 parent 16781fb commit ee56ee5

File tree

4 files changed

+163
-7
lines changed

4 files changed

+163
-7
lines changed

app/components/Metadata.tsx

Lines changed: 102 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,113 @@
11
import * as React from 'react'
2-
import { Meta } from '../models/dataset'
2+
import ExternalLink from './ExternalLink'
3+
import { Meta, Citation, License } from '../models/dataset'
34

45
interface MetadataProps {
56
meta: Meta
67
}
78

9+
const renderValue = (value: string | string[] | Citation[] | object) => {
10+
switch (typeof value) {
11+
case 'string':
12+
case 'number':
13+
return <span>{value}</span>
14+
case 'object':
15+
return <span>{JSON.stringify(value)}</span>
16+
default:
17+
return <span>{JSON.stringify(value)}</span>
18+
}
19+
}
20+
21+
const renderChips = (value: string[] | undefined) => (
22+
<div>
23+
{value && value.map((d) => (<span key={d} className='chip'>{d}</span>))}
24+
</div>
25+
)
26+
27+
const renderLicense = (license: License) => (
28+
<ExternalLink href={license.url}>
29+
{license.type}
30+
</ExternalLink>
31+
)
32+
33+
const renderURL = (url: string) => (
34+
<ExternalLink href={url}>{url}</ExternalLink>
35+
)
36+
37+
const renderTable = (keys: string[], data: Meta) => {
38+
return (
39+
<div className='metadata-viewer-table-wrap'>
40+
<table className='metadata-viewer-table'>
41+
<tbody>
42+
{keys.map((key) => {
43+
const value = data[key]
44+
let cellContent
45+
switch (key) {
46+
case 'theme':
47+
case 'keywords':
48+
cellContent = renderChips(value)
49+
break
50+
case 'license':
51+
cellContent = renderLicense(value)
52+
break
53+
case 'accessURL':
54+
case 'downloadURL':
55+
case 'readmeURL':
56+
cellContent = renderURL(value)
57+
break
58+
default:
59+
cellContent = renderValue(value)
60+
}
61+
62+
return (
63+
<tr key={key} className='metadata-viewer-row'>
64+
<td className='metadata-viewer-key'>{key}</td>
65+
<td>{cellContent}</td>
66+
</tr>
67+
)
68+
})}
69+
</tbody>
70+
</table>
71+
</div>
72+
)
73+
}
74+
875
const Metadata: React.FunctionComponent<MetadataProps> = (props: MetadataProps) => {
76+
const { meta } = props
77+
const standardFields = [
78+
'title',
79+
'theme',
80+
'keywords',
81+
'description',
82+
'license',
83+
'accessURL',
84+
'language',
85+
'citations',
86+
'contributors',
87+
'accrualPeriodicity',
88+
'downloadURL',
89+
'homePath',
90+
'identifier',
91+
'readmePath',
92+
'version'
93+
]
94+
95+
const ignoreFields = ['qri', 'path']
96+
97+
const standard = standardFields.filter((key) => !!meta[key])
98+
const extra = Object.keys(meta).filter((key) => {
99+
return !(~standardFields.findIndex((sKey) => (key === sKey)) || ~ignoreFields.findIndex((iKey) => (key === iKey)))
100+
})
101+
9102
return (
10-
<div className='content'>
11-
<pre>{JSON.stringify(props.meta, null, 2)}</pre>
103+
<div className='content metadata-viewer-wrap'>
104+
<h5 className='metadata-viewer-title'>Standard Metadata</h5>
105+
{renderTable(standard, meta)}
106+
107+
{(extra.length > 0) && <div>
108+
<h5 className='metadata-viewer-title'>Additional Metadata</h5>
109+
{renderTable(extra, meta)}
110+
</div>}
12111
</div>
13112
)
14113
}

app/models/dataset.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ export interface User {
1414
email: string
1515
}
1616

17+
export interface License {
18+
type: string
19+
url: string
20+
}
21+
1722
export interface Meta {
1823
accessURL?: string
1924
accrualPeriodicity?: string
@@ -25,14 +30,12 @@ export interface Meta {
2530
identifier?: string
2631
keywords?: string[]
2732
language?: string[]
28-
license?: {
29-
type: string
30-
url: string
31-
}
33+
license?: License
3234
readmeURL?: string
3335
title?: string
3436
theme?: string[]
3537
version?: string
38+
[key: string]: any
3639
}
3740

3841
export interface Commit {

app/scss/_metadata.scss

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
.metadata-viewer-wrap {
2+
padding: 20px;
3+
}
4+
5+
.metadata-viewer-title {
6+
margin-top: 30px;
7+
}
8+
9+
.metadata-viewer-table-wrap {
10+
width: 100%;
11+
margin-top: 10px;
12+
border-radius: 3px;
13+
border: 1px solid #eee;
14+
overflow: hidden;
15+
}
16+
17+
.metadata-viewer-table {
18+
width: 100%;
19+
}
20+
21+
.metadata-viewer-row {
22+
border-bottom: 1px solid #eee;
23+
}
24+
25+
.metadata-viewer-key {
26+
padding: 8px 8px;
27+
font-size: .8rem;
28+
font-weight: 600;
29+
width: 112px;
30+
text-align: right;
31+
}
32+
33+
.metadata-viewer-link {
34+
font-size: 17px;
35+
}
36+
37+
.metadata-viewer-info {
38+
color: $primary-light;
39+
}
40+
41+
.metadata-viewer-data {
42+
text-align: right;
43+
color: $primary-light;
44+
padding-right: 15px;
45+
}
46+
47+
.chip {
48+
background: #e4e4e4;
49+
border-radius: 4px;
50+
padding: 0px 8px;
51+
margin: 2px 2px;
52+
display: inline-block;
53+
}

app/scss/style.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
@import "flex";
3434
@import "toast";
3535
@import "body";
36+
@import "metadata";
3637

3738
@import '~handsontable/dist/handsontable.full.css';
3839
@import "dialog"

0 commit comments

Comments
 (0)