aboutsummaryrefslogblamecommitdiffstats
path: root/webui/src/list/List.js
blob: 880782c7c548b2a95940bba9eb789e845299683b (plain) (tree)
1
2
3
4
5
6
7
8
9
10


                                                             
                                                                               
                         
                             



                          
                   

                                     
  
 
                                    























































                                                 
                                                                     

























                                                        











                                                             
                                               



















                                                            
 
 
                                       
import { withStyles } from '@material-ui/core/styles'
import Table from '@material-ui/core/Table/Table'
import TableBody from '@material-ui/core/TableBody/TableBody'
import TablePagination from '@material-ui/core/TablePagination/TablePagination'
import React from 'react'
import BugRow from './BugRow'

const styles = theme => ({
  main: {
    maxWidth: 600,
    margin: 'auto',
    marginTop: theme.spacing.unit * 4
  }
})

class List extends React.Component {

  props: {
    bugs: Array,
    fetchMore: (any) => any,
    classes: any,
  }

  state = {
    page: 0,
    rowsPerPage: 10,
    lastQuery: {}
  }

  handleChangePage = (event, page) => {
    const {bugs, fetchMore} = this.props
    const {rowsPerPage} = this.state
    const pageInfo = bugs.pageInfo

    if (page === this.state.page + 1) {
      if (!pageInfo.hasNextPage) {
        return
      }

      const variables = {
        after: pageInfo.endCursor,
        first: rowsPerPage
      }

      fetchMore({
        variables,
        updateQuery: this.updateQuery,
      })

      this.setState({page, lastQuery: variables})
      return
    }

    if (page === this.state.page - 1) {
      if (!pageInfo.hasPreviousPage) {
        return
      }

      const variables = {
        before: pageInfo.startCursor,
        last: rowsPerPage
      }

      fetchMore({
        variables,
        updateQuery: this.updateQuery,
      })

      this.setState({page, lastQuery: variables})
      return
    }

    throw new Error('non neighbour page pagination is not supported')
  }

  handleChangeRowsPerPage = event => {
    const {fetchMore} = this.props
    const {lastQuery} = this.state
    const rowsPerPage = event.target.value

    const variables = lastQuery

    if (lastQuery.first) {
      variables.first = rowsPerPage
    } else if (lastQuery.last) {
      variables.last = rowsPerPage
    } else {
      variables.first = rowsPerPage
    }

    fetchMore({
      variables,
      updateQuery: this.updateQuery,
    })

    this.setState({rowsPerPage, lastQuery: variables})
  }

  updateQuery = (previousResult, {fetchMoreResult}) => {
    return fetchMoreResult ? fetchMoreResult : previousResult
  }

  render() {
    const {classes, bugs} = this.props
    const {page, rowsPerPage} = this.state

    return (
      <main className={classes.main}>
        <Table className={classes.table}>
          <TableBody>
            {bugs.edges.map(({cursor, node}) => (
              <BugRow bug={node} key={cursor}/>
            ))}
          </TableBody>
        </Table>
        <TablePagination
          component="div"
          count={bugs.totalCount}
          rowsPerPage={rowsPerPage}
          page={page}
          backIconButtonProps={{
            'aria-label': 'Previous Page'
          }}
          nextIconButtonProps={{
            'aria-label': 'Next Page'
          }}
          onChangePage={this.handleChangePage}
          onChangeRowsPerPage={this.handleChangeRowsPerPage}
        />
      </main>
    )
  }
}

export default withStyles(styles)(List)