From 1dcb61dab45b4891b1b737877d3d95e1211f33b3 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Fri, 8 Mar 2019 17:19:36 +0100 Subject: sortable dataset list --- client/applet.js | 3 + client/datasetList/datasetList.container.js | 87 +++++++++++++++++++++++++++++ client/datasetList/index.js | 5 ++ client/index.js | 2 +- 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 client/datasetList/datasetList.container.js create mode 100644 client/datasetList/index.js (limited to 'client') 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 case 'name_search': return + case 'dataset_list': + return default: return
{'Megapixels'}
} 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 ( +
+
    + {sortOptions.map(order => +
  • this.sortBy(order)}> + {order.title} +
  • + )} +
+
+ ) + } +} + + +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() -- cgit v1.2.3-70-g09d2