Skip to content
Snippets Groups Projects
MapApp.js 6.75 KiB
Newer Older
import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { withStyles } from '@material-ui/core/styles';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import Typography from '@material-ui/core/Typography';
import IconButton from '@material-ui/core/IconButton';
import MenuIcon from '@material-ui/icons/Menu';
Esko Ikkala's avatar
Esko Ikkala committed
import Grid from '@material-ui/core/Grid';
import Immutable from 'immutable';
Esko Ikkala's avatar
Esko Ikkala committed
import VirtualizedTable from '../components/VirtualizedTable';
import LeafletMap from '../components/map/LeafletMap';

import {
  getVisibleResults,
  getVisibleValues
} from '../selectors';
Esko Ikkala's avatar
Esko Ikkala committed
  toggleDataset,
  fetchSuggestions,
  clearSuggestions,
  fetchResults,
Esko Ikkala's avatar
Esko Ikkala committed
  setMapReady,
  getGeoJSON,
  updateResultFormat,
esikkala's avatar
esikkala committed
  updateResultsFilter,
  sortResults,
} from '../actions';

const styles = theme => ({
  root: {
    flexGrow: 1,
    height: '100%',
  },
Esko Ikkala's avatar
Esko Ikkala committed
  flex: {
    flexGrow: 1,
Esko Ikkala's avatar
Esko Ikkala committed
    marginLeft: -12,
Esko Ikkala's avatar
Esko Ikkala committed
  appFrame: {
    height: '100%',
    zIndex: 1,
Esko Ikkala's avatar
Esko Ikkala committed
    overflow: 'hidden',
Esko Ikkala's avatar
Esko Ikkala committed
    position: 'relative',
Esko Ikkala's avatar
Esko Ikkala committed
    width: '100%',
Esko Ikkala's avatar
Esko Ikkala committed
  mainContainer: {
    marginTop: 64,
    height: 'calc(100% - 64px)'
  }
Esko Ikkala's avatar
Esko Ikkala committed
  const { classes, error, theme, drawerIsOpen, mapReady, analysisView } = props;
  // console.log(props.results)

  let resultsSection = '';
  if (props.results.length > 0) {
Esko Ikkala's avatar
Esko Ikkala committed
    resultsSection = (
      <VirtualizedTable
        list={Immutable.List(props.results)}
        resultValues={props.resultValues}
        search={props.search}
        sortResults={props.sortResults}
        updateResultsFilter={props.updateResultsFilter} />
    );
    //resultsView = <Pie data={props.results} query={props.search.query} />;
Esko Ikkala's avatar
Esko Ikkala committed
  const map = (
    <LeafletMap
      sliderValue={100}
      results={props.results}
      geoJSON={props.geoJSON}
      geoJSONKey={props.geoJSONKey}
      getGeoJSON={props.getGeoJSON}
    />
Esko Ikkala's avatar
Esko Ikkala committed
  let smallView = analysisView ? map : resultsSection;
  let mainView = analysisView ? resultsSection : map ;
Esko Ikkala's avatar
Esko Ikkala committed
  // const drawer = (
  //   <Drawer
  //     variant="persistent"
  //     anchor={anchor}
  //     open={drawerIsOpen}
  //     width={drawerWidth}
  //     classes={{
  //       paper: classes.drawerPaper,
  //     }}
  //   >
  //     <div className={classes.drawerSearch}>
  //       <IntegrationAutosuggest
  //         search={props.search}
  //         updateQuery={props.updateQuery}
  //         fetchSuggestions={props.fetchSuggestions}
  //         clearSuggestions={props.clearSuggestions}
  //         fetchResults={props.fetchResults}
  //         clearResults={props.clearResults}
  //         updateResultFormat={props.updateResultFormat}
  //       />
  //       <IconButton onClick={props.closeDrawer}>
  //         {theme.direction === 'rtl' ? <ChevronRightIcon /> : <ChevronLeftIcon />}
  //       </IconButton>
  //     </div>
  //     <ExpansionPanel>
  //       <ExpansionPanelSummary expandIcon={<ExpandMoreIcon />}>
  //         <Typography className={classes.heading}>Select data sources</Typography>
  //       </ExpansionPanelSummary>
  //       <ExpansionPanelDetails>
  //         <DatasetSelector
  //           datasets={props.search.datasets}
  //           toggleDataset={props.toggleDataset}
  //         />
  //       </ExpansionPanelDetails>
  //     </ExpansionPanel>
  //     <ExpansionPanel>
  //       <ExpansionPanelSummary expandIcon={<ExpandMoreIcon />}>
  //         <Typography className={classes.heading}>Saved searches</Typography>
  //       </ExpansionPanelSummary>
  //       <ExpansionPanelDetails>
  //         <Typography>
  //           Saved searches go here
  //         </Typography>
  //       </ExpansionPanelDetails>
  //     </ExpansionPanel>
  //     {smallView}
  //   </Drawer>
  // );
Esko Ikkala's avatar
Esko Ikkala committed
  // let before = null;
  // let after = null;

  // if (anchor === 'left') {
  //   before = drawer;
  // } else {
  //   after = drawer;
  // }

  // if (!mapReady) {
  //   props.setMapReady();
  //   setTimeout(() => {
  //     props.openDrawer();
  //   }, 300);
  // }
  return (
    <div className={classes.root}>
      <div className={classes.appFrame}>
Esko Ikkala's avatar
Esko Ikkala committed
        <AppBar position="absolute">
          <Toolbar>
            <IconButton className={classes.menuButton} color="inherit" aria-label="Menu">
Esko Ikkala's avatar
Esko Ikkala committed
            <Typography variant="title" color="inherit" className={classes.flex}>
              Hipla.fi
            </Typography>
          </Toolbar>
        </AppBar>
Esko Ikkala's avatar
Esko Ikkala committed
        <Grid container className={classes.mainContainer}>
          <Grid item xs={12} sm={4}>
            {smallView}
          </Grid>
          <Grid item xs={12} sm={8}>
            {mainView}
          </Grid>
        </Grid>
const mapStateToProps = (state) => {
  // console.log('mapping state to props ', getVisibleResults(state.search))
  return {
    search: state.search,
    results: getVisibleResults(state.search),
    resultValues: getVisibleValues(state.search),
    drawerIsOpen: state.options.drawerIsOpen,
    mapReady: state.options.mapReady,
Esko Ikkala's avatar
Esko Ikkala committed
    analysisView: state.options.analysisView,
    error: state.error,
    geoJSON: state.map.geoJSON,
    geoJSONKey: state.map.geoJSONKey,
    resultFormat: state.options.resultFormat
  };
};

const mapDispatchToProps = ({
  openDrawer,
  closeDrawer,
  updateQuery,
Esko Ikkala's avatar
Esko Ikkala committed
  toggleDataset,
  fetchSuggestions,
  clearSuggestions,
  fetchResults,
esikkala's avatar
esikkala committed
  sortResults,
Esko Ikkala's avatar
Esko Ikkala committed
  setMapReady,
  getGeoJSON,
  updateResultFormat,
  updateResultsFilter
});

MapApp.propTypes = {
  classes: PropTypes.object.isRequired,
  theme: PropTypes.object.isRequired,
  search: PropTypes.object.isRequired,
  error: PropTypes.object.isRequired,
  drawerIsOpen: PropTypes.bool.isRequired,
  mapReady: PropTypes.bool.isRequired,
Esko Ikkala's avatar
Esko Ikkala committed
  analysisView: PropTypes.bool.isRequired,
  openDrawer: PropTypes.func.isRequired,
  closeDrawer: PropTypes.func.isRequired,
  updateQuery: PropTypes.func.isRequired,
Esko Ikkala's avatar
Esko Ikkala committed
  toggleDataset: PropTypes.func.isRequired,
  fetchSuggestions: PropTypes.func.isRequired,
  clearSuggestions: PropTypes.func.isRequired,
  fetchResults: PropTypes.func.isRequired,
  clearResults: PropTypes.func.isRequired,
esikkala's avatar
esikkala committed
  sortResults: PropTypes.func.isRequired,
  setMapReady: PropTypes.func.isRequired,
Esko Ikkala's avatar
Esko Ikkala committed
  geoJSON: PropTypes.object.isRequired,
esikkala's avatar
esikkala committed
  geoJSONKey: PropTypes.number,
Esko Ikkala's avatar
Esko Ikkala committed
  getGeoJSON: PropTypes.func.isRequired,
  updateResultFormat: PropTypes.func.isRequired,
  resultFormat: PropTypes.string.isRequired,
  results: PropTypes.array,
  resultValues: PropTypes.object,
  updateResultsFilter: PropTypes.func.isRequired
};

MapApp = connect(
  mapStateToProps,
  mapDispatchToProps
)(withStyles(styles, {withTheme: true})(MapApp));

export default MapApp;