Skip to content
Snippets Groups Projects
ResultClassRoute.js 13.95 KiB
import React, { lazy } from 'react'
import intl from 'react-intl-universal'
import { Route } from 'react-router-dom'
import { has } from 'lodash'
// import LineChartSotasurmat from '../perspectives/sotasurmat/LineChartSotasurmat'
const ResultTable = lazy(() => import('./ResultTable'))
const InstancePageTable = lazy(() => import('../main_layout/InstancePageTable'))
const ReactVirtualizedList = lazy(() => import('./ReactVirtualizedList'))
const LeafletMap = lazy(() => import('./LeafletMap'))
const Deck = lazy(() => import('./Deck'))
const ApexCharts = lazy(() => import('./ApexCharts'))
const Network = lazy(() => import('./Network'))
const VideoPage = lazy(() => import('../main_layout/VideoPage'))
const WordCloud = lazy(() => import('../main_layout/WordCloud'))
const TemporalMap = lazy(() => import('./TemporalMap'))
// const BarChartRace = lazy(() => import('../../facet_results/BarChartRace'))
const ExportCSV = lazy(() => import('./ExportCSV'))
const Export = lazy(() => import('./Export'))

const getVisibleRows = perspectiveState => {
  const { properties, instanceTableData } = perspectiveState
  const visibleRows = []
  const instanceClass = instanceTableData.type ? instanceTableData.type.id : ''
  properties.forEach(row => {
    if ((has(row, 'onlyForClass') && row.onlyForClass === instanceClass) ||
       !has(row, 'onlyForClass')) {
      visibleRows.push(row)
    }
  })
  return visibleRows
}

const ResultClassRoute = props => {
  const {
    rootUrl, perspective, perspectiveState, facetState, screenSize, portalConfig,
    layoutConfig, resultClass, facetClass, resultClassConfig, path
  } = props
  const { maps } = perspectiveState
  const layerControlExpanded = screenSize === 'md' ||
  screenSize === 'lg' ||
  screenSize === 'xl'
  let popupMaxHeight = 320
  let popupMinWidth = 280
  let popupMaxWidth = 280
  if (screenSize === 'xs' || screenSize === 'sm') {
    popupMaxHeight = 200
    popupMinWidth = 150
    popupMaxWidth = 150
  }
  const { component } = resultClassConfig
  let routeComponent
  switch (component) {
    case 'ResultTable':
      routeComponent = (
        <Route
          path={path}
          render={routeProps =>
            <ResultTable
              portalConfig={portalConfig}
              perspectiveConfig={perspective}
              data={perspectiveState}
              facetUpdateID={facetState.facetUpdateID}
              resultClass={resultClass}
              facetClass={facetClass}
              fetchPaginatedResults={props.fetchPaginatedResults}
              updatePage={props.updatePage}
              updateRowsPerPage={props.updateRowsPerPage}
              sortResults={props.sortResults}
              routeProps={routeProps}
              rootUrl={rootUrl}
              layoutConfig={layoutConfig}
            />}
        />
      )
      break
    case 'ReactVirtualizedList':
      routeComponent = (
        <Route
          path={path}
          render={routeProps =>
            <ReactVirtualizedList
              resultClass={resultClass}
              facetClass={facetClass}
              fetchResults={props.fetchResults}
              perspectiveState={perspectiveState}
              facetUpdateID={facetState.facetUpdateID}
              layoutConfig={layoutConfig}
            />}
        />
      )
      break
    case 'InstancePageTable': {
      const properties = resultClassConfig.properties
        ? resultClassConfig.properties
        : getVisibleRows(perspectiveState)
      let instanceTableProps = {
        portalConfig,
        perspectiveConfig: perspective,
        layoutConfig,
        resultClass,
        fetchResults: props.fetchResults,
        properties,
        screenSize
      }
      if (resultClassConfig.fetchResultsWhenMounted) {
        instanceTableProps = {
          ...instanceTableProps,
          fetchResultsWhenMounted: true,
          data: perspectiveState.results ? perspectiveState.results[0] : null,
          uri: perspectiveState.instanceTableData.id,
          resultUpdateID: perspectiveState.resultUpdateID
        }
      } else {
        instanceTableProps = {
          ...instanceTableProps,
          data: perspectiveState.instanceTableData
        }
      }
      routeComponent = (
        <Route
          path={path}
          render={routeProps => <InstancePageTable {...instanceTableProps} />}
        />
      )
      break
    }
    case 'LeafletMap': {
      const {
        facetID = null,
        mapMode = 'cluster',
        pageType = 'facetResults',
        showExternalLayers = false,
        customMapControl = false,
        showInstanceCountInClusters = true
      } = resultClassConfig
      const resultClassMap = maps[resultClass]
      let createPopUpContent = props.leafletConfig.createPopUpContentDefault
      if (resultClassConfig.instanceConfig && resultClassConfig.instanceConfig.createPopUpContent) {
        createPopUpContent = props.leafletConfig[resultClassConfig.instanceConfig.createPopUpContent]
      }
      let leafletProps = {
        portalConfig,
        perspectiveConfig: perspective,
        center: resultClassMap.center,
        zoom: resultClassMap.zoom,
        results: perspectiveState.results,
        leafletMapState: props.leafletMapState,
        pageType,
        resultClass,
        facetClass,
        mapMode,
        instance: perspectiveState.instanceTableData,
        createPopUpContent,
        popupMaxHeight,
        popupMinWidth,
        popupMaxWidth,
        fetchResults: props.fetchResults,
        fetchGeoJSONLayers: props.fetchGeoJSONLayers,
        clearGeoJSONLayers: props.clearGeoJSONLayers,
        fetchByURI: props.fetchByURI,
        fetching: perspectiveState.fetching,
        showInstanceCountInClusters,
        updateMapBounds: props.updateMapBounds,
        showError: props.showError,
        showExternalLayers,
        layerControlExpanded,
        customMapControl,
        layerConfigs: props.leafletConfig.layerConfigs,
        infoHeaderExpanded: perspectiveState.facetedSearchHeaderExpanded,
        layoutConfig: props.layoutConfig
      }
      if (pageType === 'facetResults') {
        leafletProps.facetUpdateID = facetState.facetUpdateID
        if (facetID) {
          leafletProps = {
            ...leafletProps,
            facet: facetState.facets[facetID],
            facetID,
            updateFacetOption: props.updateFacetOption
          }
        }
      }
      if (pageType === 'instancePage') {
        leafletProps.uri = perspectiveState.instanceTableData.id
      }
      routeComponent = (
        <Route
          path={path}
          render={() =>
            <LeafletMap {...leafletProps} />}
        />
      )
      break
    }
    case 'Deck': {
      const { layerType, showTooltips = false } = resultClassConfig
      const { instanceAnalysisData, instanceAnalysisDataUpdateID } = perspectiveState
      const resultClassMap = maps[resultClass]
      let deckProps = {
        portalConfig,
        perspectiveConfig: perspective,
        center: resultClassMap.center,
        zoom: resultClassMap.zoom,
        results: perspectiveState.results,
        facetUpdateID: facetState.facetUpdateID,
        resultClass,
        facetClass,
        fetchResults: props.fetchResults,
        fetching: perspectiveState.fetching,
        fetchInstanceAnalysis: props.fetchInstanceAnalysis,
        fetchingInstanceAnalysisData: perspectiveState.fetchingInstanceAnalysisData,
        layerType,
        updateMapBounds: props.updateMapBounds,
        showTooltips,
        layoutConfig: props.layoutConfig
      }
      if (instanceAnalysisData) {
        deckProps = {
          ...deckProps,
          instanceAnalysisData,
          instanceAnalysisDataUpdateID
        }
      }
      if (layerType === 'arcLayer') {
        const { arcWidthVariable, instanceVariable } = resultClassConfig
        deckProps = {
          ...deckProps,
          getArcWidth: d => d[arcWidthVariable],
          fromText: intl.get(`deckGlMap.${resultClass}.from`),
          toText: intl.get(`deckGlMap.${resultClass}.to`),
          countText: intl.get(`deckGlMap.${resultClass}.count`),
          legendTitle: intl.get(`deckGlMap.${resultClass}.legendTitle`),
          legendFromText: intl.get(`deckGlMap.${resultClass}.legendFrom`),
          legendToText: intl.get(`deckGlMap.${resultClass}.legendTo`),
          showMoreText: intl.get('deckGlMap.showMoreInformation'),
          listHeadingSingleInstance: intl.get(`deckGlMap.${resultClass}.listHeadingSingleInstance`),
          listHeadingMultipleInstances: intl.get(`deckGlMap.${resultClass}.listHeadingMultipleInstances`),
          instanceVariable
        }
      }
      routeComponent = (
        <Route
          path={path}
          render={() => <Deck {...deckProps} />}
        />
      )
      break
    }
    case 'ApexCharts': {
      const { pageType = 'facetResults' } = resultClassConfig
      const apexProps = {
        portalConfig,
        perspectiveConfig: perspective,
        resultClassConfig,
        apexChartsConfig: props.apexChartsConfig,
        pageType,
        screenSize,
        resultClass,
        facetClass,
        perspectiveState,
        results: perspectiveState.results,
        fetching: perspectiveState.fetching,
        resultUpdateID: perspectiveState.resultUpdateID,
        instanceAnalysisDataUpdateID: perspectiveState.instanceAnalysisDataUpdateID,
        facetUpdateID: facetState ? facetState.facetUpdateID : null,
        fetchData: props.fetchResults
      }
      routeComponent = (
        <Route
          path={path}
          render={() =>
            <ApexCharts {...apexProps} />}
        />
      )
      break
    }
    // case 'LineChartSotasurmat': {
    //   const lineChartProps = {
    //     data: perspectiveState,
    //     facetUpdateID: facetState.facetUpdateID,
    //     fetchResults: props.fetchResults,
    //     updatePage: props.updatePage,
    //     routeProps: props.routeProps,
    //     resultCount: perspectiveState.resultCount
    //   }
    //   routeComponent = (
    //     <Route
    //       path={path}
    //       render={() =>
    //         <LineChartSotasurmat {...lineChartProps} />}
    //     />
    //   )
    //   break
    // }
    case 'Network': {
      const { networkConfig } = props
      const {
        pageType = 'facetResults',
        limit,
        optimize,
        fitLayout = false,
        style = null,
        layout = null,
        preprocess = null
      } = resultClassConfig
      let networkProps = {
        portalConfig,
        perspectiveConfig: perspective,
        pageType,
        resultClass,
        facetClass,
        results: perspectiveState.results,
        resultUpdateID: perspectiveState.resultUpdateID,
        fetching: perspectiveState.fetching,
        fetchResults: props.fetchResults,
        layoutConfig: props.layoutConfig,
        limit,
        optimize,
        fitLayout,
        ...(style && { style }),
        ...(layout && { layout }),
        ...(preprocess && { preprocess: networkConfig[preprocess] })
      }
      if (pageType === 'facetResults') {
        networkProps = {
          ...networkProps,
          facetUpdateID: facetState.facetUpdateID
        }
      }
      if (pageType === 'instancePage') {
        networkProps.uri = perspectiveState.instanceTableData.id
      }
      routeComponent = (
        <Route
          path={path}
          render={() =>
            <Network {...networkProps} />}
        />
      )
      break
    }
    case 'VideoPage': {
      const videoPageProps = {
        portalConfig,
        perspectiveConfig: perspective,
        layoutConfig,
        screenSize,
        resultClass,
        perspectiveState,
        properties: getVisibleRows(perspectiveState),
        localID: props.localID,
        routeProps: props.routeProps,
        videoPlayerState: props.videoPlayerState,
        updateVideoPlayerTime: props.updateVideoPlayerTime
      }
      routeComponent = (
        <Route
          path={path}
          render={() =>
            <VideoPage {...videoPageProps} />}
        />
      )
      break
    }
    case 'TemporalMap': {
      const temporalMapProps = {
        portalConfig,
        perspectiveConfig: perspective,
        layoutConfig,
        screenSize,
        resultClass,
        facetClass,
        results: perspectiveState.results,
        fetchResults: props.fetchResults,
        animationValue: props.animationValue,
        animateMap: props.animateMap,
        facetUpdateID: facetState.facetUpdateID
      }
      routeComponent = (
        <Route
          path={path}
          render={() =>
            <TemporalMap {...temporalMapProps} />}
        />
      )
      break
    }
    case 'WordCloud': {
      const wordCloudProps = {
        data: perspectiveState.instanceTableData[resultClassConfig.wordCloudProperty]
      }
      routeComponent = (
        <Route
          path={path}
          render={() =>
            <WordCloud {...wordCloudProps} />}
        />
      )
      break
    }
    case 'Export': {
      const { pageType = 'facetResults' } = resultClassConfig
      const exportResultClass = resultClassConfig.resultClass
      routeComponent = (
        <Route
          path={path}
          render={routeProps =>
            <Export
              portalConfig={portalConfig}
              data={perspectiveState}
              resultClass={exportResultClass}
              facetClass={facetClass}
              pageType={pageType}
              fetchPaginatedResults={props.fetchPaginatedResults}
              updatePage={props.updatePage}
              layoutConfig={props.layoutConfig}
            />}
        />
      )
      break
    }
    case 'ExportCSV': {
      routeComponent = (
        <Route
          path={path}
          render={routeProps =>
            <ExportCSV
              resultClass={resultClass}
              facetClass={facetClass}
              facetUpdateID={facetState.facetUpdateID}
              facets={facetState.facets}
              layoutConfig={layoutConfig}
            />}
        />
      )
      break
    }
    default:
      routeComponent = <></>
      break
  }
  return routeComponent
}

export default ResultClassRoute