From 34634b0bd8349631080851b491f5c485c56e8741 Mon Sep 17 00:00:00 2001
From: esikkala <esko.ikkala@aalto.fi>
Date: Wed, 26 Jan 2022 10:49:34 +0200
Subject: [PATCH] Instance page config: add nested result classes

---
 .../components/facet_results/ApexCharts.js    |  3 +-
 .../ApexCharts/ApexChartsConfig.js            |  2 +-
 src/client/reducers/index.js                  | 35 +++++++++++++++++--
 src/server/sparql/Utils.js                    | 31 +++++++++++++---
 4 files changed, 62 insertions(+), 9 deletions(-)

diff --git a/src/client/components/facet_results/ApexCharts.js b/src/client/components/facet_results/ApexCharts.js
index a3f2670f..0a4ceeb6 100644
--- a/src/client/components/facet_results/ApexCharts.js
+++ b/src/client/components/facet_results/ApexCharts.js
@@ -152,7 +152,8 @@ class ApexChart extends React.Component {
     if (this.isSmallScreen()) {
       return 'auto'
     }
-    const doNotReduceTabHeight = this.props.component === 'ApexChartsDouble' && this.props.order === 'lower'
+    const doNotReduceTabHeight = (this.props.component === 'ApexChartsDouble' && this.props.order === 'lower') ||
+      this.props.resultClassConfig.pageType === 'instancePage'
     if (doNotReduceTabHeight) {
       const rootHeightReduction = 2 * defaultPadding + 1
       return `calc(${targetHeight} - ${rootHeightReduction}px)`
diff --git a/src/client/library_configs/ApexCharts/ApexChartsConfig.js b/src/client/library_configs/ApexCharts/ApexChartsConfig.js
index d2fa91af..15201c39 100644
--- a/src/client/library_configs/ApexCharts/ApexChartsConfig.js
+++ b/src/client/library_configs/ApexCharts/ApexChartsConfig.js
@@ -90,7 +90,7 @@ export const createMultipleLineChartData = ({
   const series = []
   for (const lineID in results) {
     series.push({
-      name: intl.get(`lineChart.${lineID}`),
+      name: intl.get(`lineChart.${lineID}`) || lineID,
       data: results[lineID]
     })
   }
diff --git a/src/client/reducers/index.js b/src/client/reducers/index.js
index 37f545f5..3da69684 100644
--- a/src/client/reducers/index.js
+++ b/src/client/reducers/index.js
@@ -68,9 +68,19 @@ for (const perspective of perspectiveConfig) {
   } else if (perspective.searchMode && perspective.searchMode === 'faceted-search') {
     const { resultClasses, properties, facets, maps } = perspective
     const { paginatedResultsConfig, instanceConfig } = resultClasses[perspectiveID]
+    let extraResultClasses = {}
     let instancePageResultClasses = {}
     if (instanceConfig && instanceConfig.instancePageResultClasses) {
       instancePageResultClasses = instanceConfig.instancePageResultClasses
+      // handle nested resultClasses
+      for (const resultClass in instancePageResultClasses) {
+        if (instanceConfig.instancePageResultClasses[resultClass].resultClasses) {
+          extraResultClasses = {
+            ...extraResultClasses,
+            ...instanceConfig.instancePageResultClasses[resultClass].resultClasses
+          }
+        }
+      }
     }
     const resultsInitialStateFull = {
       ...resultsInitialState,
@@ -86,7 +96,6 @@ for (const perspective of perspectiveConfig) {
       ...facetsInitialState,
       facets
     }
-    let extraResultClasses = {}
     for (const resultClass in resultClasses) {
       if (resultClasses[resultClass].resultClasses) {
         extraResultClasses = {
@@ -97,7 +106,11 @@ for (const perspective of perspectiveConfig) {
     }
     const resultsReducer = createResultsReducer(
       resultsInitialStateFull,
-      new Set(Object.keys({ ...resultClasses, ...instancePageResultClasses, ...extraResultClasses })))
+      new Set(Object.keys({
+        ...resultClasses,
+        ...instancePageResultClasses,
+        ...extraResultClasses
+      })))
     const facetsReducer = createFacetsReducer(facetsInitialStateFull, perspectiveID)
     const facetsConstrainSelfReducer = createFacetsConstrainSelfReducer(facetsInitialStateFull, perspectiveID)
     reducers[perspectiveID] = resultsReducer
@@ -118,15 +131,31 @@ for (const perspective of perspectiveConfigOnlyInfoPages) {
   const perspectiveID = perspective.id
   const { resultClasses, properties } = perspective
   const { instanceConfig } = resultClasses[perspectiveID]
+  let extraResultClasses = {}
   let instancePageResultClasses = {}
   if (instanceConfig && instanceConfig.instancePageResultClasses) {
     instancePageResultClasses = instanceConfig.instancePageResultClasses
+    // handle nested resultClasses
+    for (const resultClass in instancePageResultClasses) {
+      if (instanceConfig.instancePageResultClasses[resultClass].resultClasses) {
+        extraResultClasses = {
+          ...extraResultClasses,
+          ...instanceConfig.instancePageResultClasses[resultClass].resultClasses
+        }
+      }
+    }
   }
   const resultsInitialStateFull = {
     ...resultsInitialState,
     properties
   }
-  const resultsReducer = createResultsReducer(resultsInitialStateFull, new Set(Object.keys({ ...resultClasses, ...instancePageResultClasses })))
+  const resultsReducer = createResultsReducer(
+    resultsInitialStateFull,
+    new Set(Object.keys({
+      ...resultClasses,
+      ...instancePageResultClasses,
+      ...extraResultClasses
+    })))
   reducers[perspectiveID] = resultsReducer
 }
 
diff --git a/src/server/sparql/Utils.js b/src/server/sparql/Utils.js
index 203b93a5..1258e9b8 100644
--- a/src/server/sparql/Utils.js
+++ b/src/server/sparql/Utils.js
@@ -1,10 +1,10 @@
 import { readFile } from 'fs/promises'
 import { has } from 'lodash'
 
-// import { backendSearchConfig as oldBackendSearchConfig } from './veterans/BackendSearchConfig'
+// import { backendSearchConfig as oldBackendSearchConfig } from './lettersampo/BackendSearchConfig'
 
-// import { battlesPerspectiveConfig as oldPerspectiveConfig } from './sotasurmat/perspective_configs/BattlesPerspectiveConfig'
-// import { INITIAL_STATE } from '../../client/reducers/sotasurmat/battlesFacets'
+// import { placesConfig as oldPerspectiveConfig } from './lettersampo/perspective_configs/PlacesConfig'
+// import { INITIAL_STATE } from '../../client/reducers/lettersampo/placesFacets'
 
 export const createBackendSearchConfig = async () => {
   const portalConfigJSON = await readFile('src/configs/portalConfig.json')
@@ -24,6 +24,7 @@ export const createBackendSearchConfig = async () => {
       perspectiveConfig.endpoint.prefixes = prefixes
     }
     if (perspectiveConfig.searchMode === 'faceted-search') {
+      let extraResultClasses = {} // gather nested result classes here
       let hasInstancePageResultClasses = false
       // handle default resultClass which is same as perspectiveID
       const { paginatedResultsConfig, instanceConfig } = perspectiveConfig.resultClasses[perspectiveID]
@@ -44,12 +45,20 @@ export const createBackendSearchConfig = async () => {
           for (const instancePageResultClass in instanceConfig.instancePageResultClasses) {
             const instancePageResultClassConfig = instanceConfig.instancePageResultClasses[instancePageResultClass]
             processResultClassConfig(instancePageResultClassConfig, sparqlQueries, resultMappers)
+            if (instancePageResultClassConfig.resultClasses) {
+              for (const extraResultClass in instancePageResultClassConfig.resultClasses) {
+                processResultClassConfig(instancePageResultClassConfig.resultClasses[extraResultClass], sparqlQueries, resultMappers)
+              }
+              extraResultClasses = {
+                ...extraResultClasses,
+                ...instancePageResultClassConfig.resultClasses
+              }
+            }
           }
           hasInstancePageResultClasses = true
         }
       }
       // handle other resultClasses
-      let extraResultClasses = {}
       for (const resultClass in perspectiveConfig.resultClasses) {
         if (resultClass === perspectiveID) { continue }
         const resultClassConfig = perspectiveConfig.resultClasses[resultClass]
@@ -101,10 +110,24 @@ export const createBackendSearchConfig = async () => {
       instanceConfig.postprocess.func = resultMappers[instanceConfig.postprocess.func]
     }
     let hasInstancePageResultClasses = false
+    let extraResultClasses = {} // gather nested result classes here
     if (has(instanceConfig, 'instancePageResultClasses')) {
       for (const instancePageResultClass in instanceConfig.instancePageResultClasses) {
         const instancePageResultClassConfig = instanceConfig.instancePageResultClasses[instancePageResultClass]
         processResultClassConfig(instancePageResultClassConfig, sparqlQueries, resultMappers)
+        if (instancePageResultClassConfig.resultClasses) {
+          for (const extraResultClass in instancePageResultClassConfig.resultClasses) {
+            processResultClassConfig(instancePageResultClassConfig.resultClasses[extraResultClass], sparqlQueries, resultMappers)
+          }
+          extraResultClasses = {
+            ...extraResultClasses,
+            ...instancePageResultClassConfig.resultClasses
+          }
+        }
+      }
+      perspectiveConfig.resultClasses = {
+        ...perspectiveConfig.resultClasses,
+        ...extraResultClasses
       }
       hasInstancePageResultClasses = true
     }
-- 
GitLab