From 8d53b7eaad7ea1cb44e7955496ec0fd13ab8ef45 Mon Sep 17 00:00:00 2001
From: esikkala <esko.ikkala@aalto.fi>
Date: Thu, 9 May 2019 15:05:37 +0300
Subject: [PATCH] Show text facet in active filters

---
 .../components/facet_bar/ActiveFilters.js     | 48 ++++++++++---------
 src/client/components/facet_bar/ChipsArray.js | 15 ++++--
 src/client/components/facet_bar/FacetBar.js   | 16 +++++--
 src/client/epics/index.js                     |  2 +-
 src/client/reducers/manuscriptsFacets.js      |  1 -
 src/server/index.js                           |  2 +-
 src/server/sparql/FacetResults.js             |  7 ++-
 7 files changed, 57 insertions(+), 34 deletions(-)

diff --git a/src/client/components/facet_bar/ActiveFilters.js b/src/client/components/facet_bar/ActiveFilters.js
index d8bec99b..3a9f8475 100644
--- a/src/client/components/facet_bar/ActiveFilters.js
+++ b/src/client/components/facet_bar/ActiveFilters.js
@@ -3,29 +3,32 @@ import PropTypes from 'prop-types';
 import ChipsArray from './ChipsArray';
 
 const ActiveFilters = props => {
-  const { uriFilters, facets } = props;
+  const { uriFilters, textFilters, facets } = props;
+  const facetValues = [];
+  Object.keys(uriFilters).map(activeFacetID => {
+    Object.values(uriFilters[activeFacetID]).forEach(value => {
+      facetValues.push({
+        facetID: activeFacetID,
+        facetLabel: facets[activeFacetID].label,
+        filterType: 'uriFilter',
+        value: value // a react sortable tree object
+      });
+    });
+  });
+  Object.keys(textFilters).map(facetID => {
+    facetValues.push({
+      facetID: facetID,
+      facetLabel: facets[facetID].label,
+      filterType: 'textFilter',
+      value: textFilters[facetID]
+    });
+  });
   return (
-    <React.Fragment>
-      {Object.keys(uriFilters).map(facetID => {
-        const facetValues = [];
-        Object.values(uriFilters[facetID]).forEach(value => {
-          facetValues.push({
-            facetID: facetID,
-            facetLabel: facets[facetID].label,
-            filterType: 'uriFilter',
-            value: value // a react sortable tree object
-          });
-        });
-        return (
-          <ChipsArray
-            key={facetID}
-            data={facetValues}
-            facetClass={props.facetClass}
-            updateFacetOption={props.updateFacetOption}
-          />
-        );
-      })}
-    </React.Fragment>
+    <ChipsArray
+      data={facetValues}
+      facetClass={props.facetClass}
+      updateFacetOption={props.updateFacetOption}
+    />
   );
 };
 
@@ -34,6 +37,7 @@ ActiveFilters.propTypes = {
   facetClass: PropTypes.string.isRequired,
   uriFilters: PropTypes.object.isRequired,
   spatialFilters: PropTypes.object.isRequired,
+  textFilters: PropTypes.object.isRequired,
   updateFacetOption: PropTypes.func.isRequired
 };
 
diff --git a/src/client/components/facet_bar/ChipsArray.js b/src/client/components/facet_bar/ChipsArray.js
index b5af4d16..fee088b0 100644
--- a/src/client/components/facet_bar/ChipsArray.js
+++ b/src/client/components/facet_bar/ChipsArray.js
@@ -37,12 +37,21 @@ class ChipsArray extends React.Component {
       <div className={classes.root}>
         {data !== null && data.map(item => {
           let icon = null;
+          let key = null;
+          let valueLabel = null;
+          if (item.filterType === 'uriFilter') {
+            key = item.value.node.id;
+            valueLabel = item.value.node.prefLabel;
+          }
+          if (item.filterType === 'textFilter') {
+            key = item.value;
+            valueLabel = item.value;
+          }
           return (
             <Chip
-              key={item.value.node.id}
+              key={key}
               icon={icon}
-              label={this.generateLabel(item.facetLabel, item.value.node.prefLabel)}
-            
+              label={this.generateLabel(item.facetLabel, valueLabel)}
               className={classes.chip}
             />
           );
diff --git a/src/client/components/facet_bar/FacetBar.js b/src/client/components/facet_bar/FacetBar.js
index 0aec0b13..caa8ea87 100644
--- a/src/client/components/facet_bar/FacetBar.js
+++ b/src/client/components/facet_bar/FacetBar.js
@@ -143,26 +143,31 @@ class FacetBar extends React.Component {
     const { facets } = this.props.facetData;
     let uriFilters = {};
     let spatialFilters = {};
+    let textFilters = {};
     let activeUriFilters = false;
     let activeSpatialFilters = false;
+    let activeTextFilters = false;
     for (const [key, value] of Object.entries(facets)) {
-      if (value.uriFilter !== null) {
+      if (has(value, 'uriFilter') && value.uriFilter !== null) {
         activeUriFilters = true;
         uriFilters[key] = value.uriFilter;
-      } else if (has(value, 'spatialFilter') && value.spatialFilter !== null) {
+      }
+      if (has(value, 'spatialFilter') && value.spatialFilter !== null) {
         activeSpatialFilters = true;
         spatialFilters[key] = value.spatialFilter._bounds;
       }
+      if (has(value, 'textFilter') && value.textFilter !== null) {
+        activeTextFilters = true;
+        textFilters[key] = value.textFilter;
+      }
     }
-
-
     return (
       <div className={classes.root}>
         <Paper className={classes.facetContainer}>
           <div className={classes.textContainer}>
             <Typography variant="h6">Results: {resultCount} {resultClass}</Typography>
             <Divider className={classes.resultInfoDivider} />
-            {(activeUriFilters || activeSpatialFilters) &&
+            {(activeUriFilters || activeSpatialFilters || activeTextFilters) &&
               <React.Fragment>
                 <Typography variant="h6">Active filters:</Typography>
                 <div className={classes.textContainer}>
@@ -171,6 +176,7 @@ class FacetBar extends React.Component {
                     facetClass={facetClass}
                     uriFilters={uriFilters}
                     spatialFilters={spatialFilters}
+                    textFilters={textFilters}
                     updateFacetOption={this.props.updateFacetOption}
                   />
                 </div>
diff --git a/src/client/epics/index.js b/src/client/epics/index.js
index 246cac32..5d0bab46 100644
--- a/src/client/epics/index.js
+++ b/src/client/epics/index.js
@@ -223,7 +223,7 @@ export const stateToUrl = ({
   let activeSpatialFilters = false;
   let activeTextFilters = false;
   for (const [key, value] of Object.entries(facets)) {
-    if (value.uriFilter !== null) {
+    if (has(value, 'uriFilter') && value.uriFilter !== null) {
       activeUriFilters = true;
       uriFilters[key] = Object.keys(value.uriFilter);
     } else if (has(value, 'spatialFilter') && value.spatialFilter !== null) {
diff --git a/src/client/reducers/manuscriptsFacets.js b/src/client/reducers/manuscriptsFacets.js
index f8e2077e..ea6bfe85 100644
--- a/src/client/reducers/manuscriptsFacets.js
+++ b/src/client/reducers/manuscriptsFacets.js
@@ -31,7 +31,6 @@ export const INITIAL_STATE = {
       searchField: false,
       containerClass: 'one',
       filterType: 'textFilter',
-      uriFilter: null,
       textFilter: null,
     },
     source: {
diff --git a/src/server/index.js b/src/server/index.js
index c16b3623..4a76b693 100644
--- a/src/server/index.js
+++ b/src/server/index.js
@@ -54,7 +54,7 @@ app.get(`${apiPath}/:resultClass/all`, async (req, res, next) => {
       variant: req.query.variant || null,
     });
     res.json({
-      resultCount: data.count,
+      resultCount: data.length,
       results: data
     });
   } catch(error) {
diff --git a/src/server/sparql/FacetResults.js b/src/server/sparql/FacetResults.js
index 926ab42e..7a7f6d1c 100644
--- a/src/server/sparql/FacetResults.js
+++ b/src/server/sparql/FacetResults.js
@@ -61,6 +61,7 @@ export const getAllResults = ({
   facetClass,
   uriFilters,
   spatialFilters,
+  textFilters,
   variant
 }) => {
   let q = '';
@@ -79,13 +80,17 @@ export const getAllResults = ({
       filterTarget = 'manuscript__id';
       break;
   }
-  if (uriFilters == null && spatialFilters == null) {
+  const hasFilters = uriFilters !== null
+    || spatialFilters !== null
+    || textFilters !== null;
+  if (!hasFilters) {
     q = q.replace('<FILTER>', '# no filters');
   } else {
     q = q.replace('<FILTER>', generateFilter({
       facetClass: facetClass,
       uriFilters: uriFilters,
       spatialFilters: spatialFilters,
+      textFilters: textFilters,
       filterTarget: filterTarget,
       facetID: null
     }));
-- 
GitLab