summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2019-04-01 17:21:21 +0200
committerJules Laplace <julescarbon@gmail.com>2019-04-01 17:21:21 +0200
commitbca367770c426a6f2086c53b2e821a7a35de4e4f (patch)
tree04b959658a504bb8021bf23682c83ba597789dea /client
parenteb77595e9933a65bd4827559968663289aca85df (diff)
build
Diffstat (limited to 'client')
-rw-r--r--client/table/citations.table.js84
-rw-r--r--client/table/tabulator.css9
2 files changed, 73 insertions, 20 deletions
diff --git a/client/table/citations.table.js b/client/table/citations.table.js
index f65998aa..4ee1a0c9 100644
--- a/client/table/citations.table.js
+++ b/client/table/citations.table.js
@@ -2,13 +2,15 @@ import React, { Component } from 'react'
import { bindActionCreators } from 'redux'
import { connect } from 'react-redux'
import { ReactTabulator } from 'react-tabulator'
+import MultiValueFormatter from "react-tabulator/lib/formatters/MultiValueFormatter"
+
import { Loader } from '../common'
import { toArray, toTuples } from '../util'
export const citationsColumns = [
{ title: 'Title', field: 'title', sorter: 'string' },
- { title: 'Institution', field: 'institution', sorter: 'string' },
- { title: 'Country', field: 'country', sorter: 'string', width: 140 },
+ { title: 'Institution', field: 'institution', sorter: 'string', },
+ { title: 'Country', field: 'country', sorter: 'string', width: 140, },
{ title: 'Year', field: 'year', sorter: 'number', width: 70 },
{ title: 'PDF', field: 'pdf_text', formatter: 'link',
formatterParams: { target: "_blank", urlField: 'pdf_link', },
@@ -16,13 +18,24 @@ export const citationsColumns = [
]
class CitationsTable extends Component {
- render() {
- const { payload } = this.props
- const { paper, citations } = payload.data
-
- if (!citations.length) return <Loader />
+ state = {
+ q: '',
+ formattedCitations: [],
+ filteredCitations: [],
+ }
- const formattedCitations = citations.map(citation => {
+ componentDidMount(){
+ this.updateCitations()
+ }
+ componentDidUpdate(oldProps){
+ if (this.props.payload.data.citations !== oldProps.payload.data.citations) {
+ this.updateCitations()
+ }
+ }
+ updateCitations(){
+ const { paper, citations } = this.props.payload.data
+ if (!citations.length) this.setState({ formattedCitations: [] })
+ const formattedCitations = citations.sort((a,b) => a.title.localeCompare(b.title)).map(citation => {
const pdf_link = (citation.pdf && citation.pdf.length)
? citation.pdf[0]
: (citation.doi && citation.doi.length)
@@ -37,25 +50,56 @@ class CitationsTable extends Component {
}
return {
title: citation.title,
- institution: citation.addresses[0].name,
- country: citation.addresses[0].country,
+ institution: citation.addresses.map(a => a.name).sort().join('; '),
+ country: Array.from(new Set(citation.addresses.map(a => a.country))).sort().join('; '),
year: citation.year,
pdf_link, pdf_text,
}
})
+ this.setState({
+ formattedCitations,
+ filteredCitations: formattedCitations,
+ })
+ }
- // console.log(formattedCitations)
+ updateFilter(q) {
+ const { formattedCitations } = this.state
+ if (!q.length) {
+ this.setState({ q, filteredCitations: formattedCitations })
+ } else {
+ let q_re = new RegExp('(' + q.replace(/\s+/g, ' ').trim().replace(' ', '|') + ')', 'gi')
+ let filteredCitations = formattedCitations.filter(citation => (
+ citation.title.match(q_re) ||
+ citation.institution.match(q_re) ||
+ citation.country.match(q_re)
+ ))
+ this.setState({ q, filteredCitations })
+ }
+ }
+ render() {
+ const { formattedCitations, filteredCitations } = this.state
+ if (!formattedCitations.length) return <Loader />
+ // console.log(formattedCitations)
return (
- <ReactTabulator
- columns={citationsColumns}
- data={formattedCitations}
- options={{
- height: 311,
- layout: 'fitColumns',
- placeholder: 'No Data Set',
- }}
- />
+ <div className='citationBrowser'>
+ <input
+ type="text"
+ value={this.state.q}
+ onChange={e => this.updateFilter(e.target.value)}
+ className='q'
+ placeholder='Filter by title/institution'
+ />
+ <ReactTabulator
+ columns={citationsColumns}
+ data={filteredCitations}
+ options={{
+ height: 311,
+ layout: 'fitColumns',
+ placeholder: formattedCitations.length ? '' : 'Nothing matches your query',
+ }}
+ />
+ </div>
)
}
}
diff --git a/client/table/tabulator.css b/client/table/tabulator.css
index 24005368..06bceb20 100644
--- a/client/table/tabulator.css
+++ b/client/table/tabulator.css
@@ -23,4 +23,13 @@
}
.tabulator .tabulator-tableHolder .tabulator-table {
background-color: #333;
+}
+.multi-value-formatter-content span {
+ border: 0;
+ padding: 0 5px 0 0;
+}
+
+.citationBrowser .q {
+ max-width: 400px;
+ margin-bottom: 4px;
} \ No newline at end of file