summaryrefslogtreecommitdiff
path: root/client/datasetList/datasetList.container.js
blob: 615c6278e4918b77b8c24ddb249df7ca999e7ec5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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