aboutsummaryrefslogblamecommitdiffstats
path: root/webui/src/list/List.js
blob: d36be8a1464b4f30028c40b397fedd3b1a609eaf (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);