summaryrefslogtreecommitdiff
path: root/client/table/file.table.js
diff options
context:
space:
mode:
Diffstat (limited to 'client/table/file.table.js')
-rw-r--r--client/table/file.table.js66
1 files changed, 47 insertions, 19 deletions
diff --git a/client/table/file.table.js b/client/table/file.table.js
index ff6c0af6..c195b09d 100644
--- a/client/table/file.table.js
+++ b/client/table/file.table.js
@@ -1,18 +1,17 @@
import React, { Component } from 'react'
-import { bindActionCreators } from 'redux'
-import { connect } from 'react-redux'
import { ReactTabulator } from 'react-tabulator'
+import csv from 'parse-csv'
-import { toArray, toTuples, domainFromUrl } from '../util'
+import { domainFromUrl } from '../util'
import { Loader } from '../common'
-import csv from 'parse-csv'
-
class FileTable extends Component {
state = {
keys: [],
data: [],
+ filteredData: [],
columns: [],
+ q: '',
}
componentDidMount() {
@@ -26,7 +25,7 @@ class FileTable extends Component {
const data = csv.toJSON(text, { headers: { included: true } })
// console.log(data)
const columns = this.getColumns(keys, data, payload.fields)
- this.setState({ keys, data, columns })
+ this.setState({ keys, data, filteredData: data, columns })
} catch (e) {
console.error("error making json:", payload.url)
console.error(e)
@@ -35,10 +34,11 @@ class FileTable extends Component {
}
getColumns(keys, data, fields) {
- let titles = fields.length ? fields[0].split(', ') : keys
- let numberFields = []
+ let titles = fields.Headings ? fields.Headings.split(', ') : keys
+ // let numberFields = []
let columns = keys.map((field, i) => {
const title = titles[i] || field
+ let widthGrow = 1
if (field.match('url')) {
let textField = field.replace('url', 'label')
data.forEach(el => el[textField] = domainFromUrl(el[field]))
@@ -46,36 +46,64 @@ class FileTable extends Component {
title,
field: textField,
formatter: 'link',
- formatterParams: { target: "_blank", urlField: field, },
+ formatterParams: { target: "_blank", urlField: field },
sorter: 'string'
}
}
+ if (title === 'Embassy') {
+ widthGrow = 2
+ }
switch (field) {
case 'images':
case 'year':
return { title, field: field.toLowerCase(), sorter: 'number' }
default:
- return { title, field: field.toLowerCase(), sorter: 'string' }
+ return { title, field: field.toLowerCase(), sorter: 'string', widthGrow }
}
})
return columns
}
+ updateFilter(q) {
+ const { keys, data } = this.state
+ if (!q.length) {
+ this.setState({ q, filteredData: data })
+ } else {
+ let qRe = new RegExp('(' + q.replace(/\s+/g, ' ').trim().replace(' ', '|') + ')', 'gi')
+ let filteredData = data.filter(row => keys.some(key => row[key].match(qRe)))
+ this.setState({ q, filteredData })
+ }
+ }
+
render() {
const { payload } = this.props
+ const { q, columns, data, filteredData } = this.state
if (!this.state.data.length) {
return <Loader />
}
+ const fn = payload.url.split('/').pop()
return (
- <ReactTabulator
- columns={this.state.columns}
- data={this.state.data}
- options={{
- height: Math.min(37 * this.state.data.length + 29, 311),
- layout: 'fitColumns',
- placeholder: 'No Data Set',
- }}
- />
+ <div className='citationBrowser'>
+ <div className='citationHeader'>
+ <input
+ type="text"
+ value={q}
+ onChange={e => this.updateFilter(e.target.value)}
+ className='q'
+ placeholder='Enter text to search data'
+ />
+ <a className='download' href={payload.url} filename={fn}>Download CSV</a>
+ </div>
+ <ReactTabulator
+ columns={columns}
+ data={filteredData}
+ options={{
+ height: Math.min(37 * data.length + 29, 311),
+ layout: 'fitColumns',
+ placeholder: 'No Data Set',
+ }}
+ />
+ </div>
)
}
}