summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2019-03-08 17:19:36 +0100
committerJules Laplace <julescarbon@gmail.com>2019-03-08 17:19:36 +0100
commit1dcb61dab45b4891b1b737877d3d95e1211f33b3 (patch)
treea13ee4541e0a55dcbdfe5701b79ddd8da6ed8ca9 /client
parent6ddf79260f153aa52d2b444772c03cae502f4d35 (diff)
sortable dataset list
Diffstat (limited to 'client')
-rw-r--r--client/applet.js3
-rw-r--r--client/datasetList/datasetList.container.js87
-rw-r--r--client/datasetList/index.js5
-rw-r--r--client/index.js2
4 files changed, 96 insertions, 1 deletions
diff --git a/client/applet.js b/client/applet.js
index 25291401..27191693 100644
--- a/client/applet.js
+++ b/client/applet.js
@@ -3,6 +3,7 @@ import React, { Component } from 'react'
import { Container as FaceSearchContainer } from './faceSearch'
import { Container as FaceAnalysisContainer } from './faceAnalysis'
import { Container as NameSearchContainer } from './nameSearch'
+import { Container as DatasetListContainer } from './datasetList'
export default class Applet extends Component {
render() {
@@ -14,6 +15,8 @@ export default class Applet extends Component {
return <FaceSearchContainer {...this.props} />
case 'name_search':
return <NameSearchContainer {...this.props} />
+ case 'dataset_list':
+ return <DatasetListContainer {...this.props} />
default:
return <pre style={{ color: '#0f0' }}>{'Megapixels'}</pre>
}
diff --git a/client/datasetList/datasetList.container.js b/client/datasetList/datasetList.container.js
new file mode 100644
index 00000000..615c6278
--- /dev/null
+++ b/client/datasetList/datasetList.container.js
@@ -0,0 +1,87 @@
+import React, { Component } from 'react'
+import { bindActionCreators } from 'redux'
+import { connect } from 'react-redux'
+import { toArray } from '../util'
+
+// import DatasetListQuery from './datasetList.query'
+
+const parseTypes = {
+ string: s => s.toLowerCase(),
+ number: s => parseInt((s || '0').replace(',', '').trim()),
+}
+
+const sortTypes = {
+ string: (a,b) => a[0].localeCompare(b[0]),
+ number: (a,b) => a[0] - b[0],
+}
+
+const sortOptions = [
+ { field: 'title', title: 'Name', type: 'string' },
+ { field: 'year', title: 'Year', type: 'number' },
+ { field: 'purpose', title: 'Purpose', type: 'string' },
+ { field: 'images', title: 'Images', type: 'number', reversed: true },
+]
+
+class DatasetListContainer extends Component {
+ state = {
+ sort: sortOptions[0],
+ reversed: false,
+ }
+
+ constructor(){
+ super()
+ const parent = document.querySelector('.dataset-intro .dataset-list')
+ this.parent = parent
+ this.els = toArray(parent.children)
+ }
+
+ sortBy(order){
+ let { sort, reversed } = this.state
+ if (sort === order) reversed = !reversed
+ else reversed = !!order.reversed
+ const parseFn = parseTypes[order.type]
+ const sortFn = sortTypes[order.type]
+ let els = this.els
+ .map(el => [
+ parseFn(el.querySelector('.' + order.field).innerText),
+ el,
+ ])
+ .sort(sortFn)
+ .map(pair => pair[1])
+ if (reversed) els.reverse()
+ els.forEach(el => {
+ this.parent.removeChild(el)
+ this.parent.appendChild(el)
+ if (order.field !== 'title' && order.field !== sort.field) {
+ const viz = el.querySelector('.visible')
+ if (viz) {
+ viz.classList.remove('visible')
+ }
+ }
+ el.querySelector('.' + order.field).classList.add('visible')
+ })
+ this.setState({ sort: order, reversed })
+ }
+
+ render() {
+ const { payload } = this.props
+ // console.log(payload)
+ return (
+ <div className='dataset-list'>
+ <ul className='sort-options'>
+ {sortOptions.map(order =>
+ <li
+ key={order.field}
+ className={order.field === this.state.sort.field ? 'active' : ''}
+ onClick={() => this.sortBy(order)}>
+ {order.title}
+ </li>
+ )}
+ </ul>
+ </div>
+ )
+ }
+}
+
+
+export default DatasetListContainer
diff --git a/client/datasetList/index.js b/client/datasetList/index.js
new file mode 100644
index 00000000..5c32b960
--- /dev/null
+++ b/client/datasetList/index.js
@@ -0,0 +1,5 @@
+import Container from './datasetList.container'
+
+export {
+ Container,
+}
diff --git a/client/index.js b/client/index.js
index 9db88f14..1e4e2eb8 100644
--- a/client/index.js
+++ b/client/index.js
@@ -80,7 +80,7 @@ function runApplets() {
url = null
}
}
- if (!dataset && !url) {
+ if (('datasets' in payload) && !dataset && !url) {
const path = window.location.pathname.split('/').filter(s => !!s)
if (path.length) {
dataset = path.pop()