From 17bd6cd84e01fc37a07ee3847d80624bd3186601 Mon Sep 17 00:00:00 2001
From: esikkala <esko.ikkala@aalto.fi>
Date: Mon, 25 Mar 2019 09:02:52 +0200
Subject: [PATCH] URI filters to objects, new component for showing active
 filters

---
 src/client/components/facet_bar/ChipsArray.js | 67 +++++++++++++++++++
 src/client/components/facet_bar/Tree.js       | 12 +++-
 src/client/epics/index.js                     |  4 +-
 src/client/reducers/helpers.js                | 13 ++--
 src/client/reducers/manuscriptsFacets.js      |  6 +-
 src/client/reducers/organizationsFacets.js    |  2 +-
 src/client/reducers/peopleFacets.js           |  4 +-
 src/client/reducers/placesFacets.js           |  4 +-
 src/client/reducers/worksFacets.js            |  2 +-
 9 files changed, 98 insertions(+), 16 deletions(-)
 create mode 100644 src/client/components/facet_bar/ChipsArray.js

diff --git a/src/client/components/facet_bar/ChipsArray.js b/src/client/components/facet_bar/ChipsArray.js
new file mode 100644
index 00000000..ac344029
--- /dev/null
+++ b/src/client/components/facet_bar/ChipsArray.js
@@ -0,0 +1,67 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { withStyles } from '@material-ui/core/styles';
+import Chip from '@material-ui/core/Chip';
+import Paper from '@material-ui/core/Paper';
+//import TagFacesIcon from '@material-ui/icons/TagFaces';
+
+const styles = theme => ({
+  root: {
+    display: 'flex',
+    justifyContent: 'center',
+    flexWrap: 'wrap',
+    padding: theme.spacing.unit / 2,
+  },
+  chip: {
+    margin: theme.spacing.unit / 2,
+  },
+});
+
+class ChipsArray extends React.Component {
+
+  handleDelete = data => () => {
+    if (data.label === 'React') {
+      alert('Why would you want to delete React?! :)'); // eslint-disable-line no-alert
+      return;
+    }
+
+    this.setState(state => {
+      const chipData = [...state.chipData];
+      const chipToDelete = chipData.indexOf(data);
+      chipData.splice(chipToDelete, 1);
+      return { chipData };
+    });
+  };
+
+  render() {
+    const { classes, data } = this.props;
+    return (
+      <Paper className={classes.root}>
+        {data !== null && data.map(item => {
+          let icon = null;
+
+          // if (item.label === 'React') {
+          //   icon = <TagFacesIcon />;
+          // }
+
+          return (
+            <Chip
+              key={item.key}
+              icon={icon}
+              label={item.label}
+              onDelete={this.handleDelete(item)}
+              className={classes.chip}
+            />
+          );
+        })}
+      </Paper>
+    );
+  }
+}
+
+ChipsArray.propTypes = {
+  classes: PropTypes.object.isRequired,
+  data: PropTypes.object,
+};
+
+export default withStyles(styles)(ChipsArray);
diff --git a/src/client/components/facet_bar/Tree.js b/src/client/components/facet_bar/Tree.js
index 1ff0d472..0fc4feba 100644
--- a/src/client/components/facet_bar/Tree.js
+++ b/src/client/components/facet_bar/Tree.js
@@ -12,6 +12,7 @@ import IconButton from '@material-ui/core/IconButton';
 import NavigateNextIcon from '@material-ui/icons/NavigateNext';
 import NavigateBeforeIcon from '@material-ui/icons/NavigateBefore';
 import Typography from '@material-ui/core/Typography';
+import ChipsArray from './ChipsArray';
 
 const styles = () => ({
   facetSearchContainer: {
@@ -84,6 +85,10 @@ class Tree extends Component {
   }
 
   componentDidUpdate = prevProps => {
+    // if (this.props.facetID === 'productionPlace') {
+    //   console.log(this.props.facet.values)
+    // }
+
     if (prevProps.facet.values != this.props.facet.values) {
       this.setState({
         treeData: this.props.facet.values
@@ -127,7 +132,10 @@ class Tree extends Component {
       facetClass: this.props.facetClass,
       facetID: this.props.facetID,
       option: this.props.facet.filterType,
-      value: treeObj.node.id
+      value: {
+        id: treeObj.node.id,
+        label: treeObj.node.prefLabel
+      }
     });
   };
 
@@ -218,6 +226,7 @@ class Tree extends Component {
             : 0,
       });
 
+    //<ChipsArray data={this.props.facet.uriFilter} />}
     return (
       <React.Fragment>
         {isFetching ?
@@ -226,6 +235,7 @@ class Tree extends Component {
           </div>
           :
           <React.Fragment>
+
             {searchField && facet.filterType !== 'spatialFilter' &&
               <div className={classes.facetSearchContainer}>
                 <Input
diff --git a/src/client/epics/index.js b/src/client/epics/index.js
index 44096b2c..7bf03045 100644
--- a/src/client/epics/index.js
+++ b/src/client/epics/index.js
@@ -180,9 +180,9 @@ export const stateToUrl = ({
   let activeUriFilters = false;
   let activeSpatialFilters = false;
   for (const [key, value] of Object.entries(facets)) {
-    if (value.uriFilter.size != 0) {
+    if (value.uriFilter !== null) {
       activeUriFilters = true;
-      uriFilters[key] = Array.from(value.uriFilter);
+      uriFilters[key] = Object.keys(value.uriFilter);
     } else if (has(value, 'spatialFilter') && value.spatialFilter !== null) {
       activeSpatialFilters = true;
       spatialFilters[key] = boundsToValues(value.spatialFilter._bounds);
diff --git a/src/client/reducers/helpers.js b/src/client/reducers/helpers.js
index da831958..adce08d4 100644
--- a/src/client/reducers/helpers.js
+++ b/src/client/reducers/helpers.js
@@ -1,3 +1,5 @@
+import { has, isEmpty } from 'lodash';
+
 export const fetchResults = state => {
   return {
     ...state,
@@ -67,11 +69,14 @@ const updateFacetFilter = (state, action) => {
   const oldFacet = state.facets[facetID];
   let newFacet = {};
   if (oldFacet.filterType === 'uriFilter') {
-    let newUriFilter = oldFacet.uriFilter;
-    if (newUriFilter.has(value)) {
-      newUriFilter.delete(value);
+    let newUriFilter = oldFacet.uriFilter == null ? {} : oldFacet.uriFilter;
+    if (has(newUriFilter, value.id)) {
+      delete newUriFilter[value.id];
+      if (isEmpty(newUriFilter)) {
+        newUriFilter = null;
+      }
     } else {
-      newUriFilter.add(value);
+      newUriFilter[value.id] = value.label;
     }
     newFacet = {
       ...state.facets[facetID],
diff --git a/src/client/reducers/manuscriptsFacets.js b/src/client/reducers/manuscriptsFacets.js
index 8db825be..3b6715d2 100644
--- a/src/client/reducers/manuscriptsFacets.js
+++ b/src/client/reducers/manuscriptsFacets.js
@@ -30,7 +30,7 @@ export const INITIAL_STATE = {
       searchField: false,
       containerClass: 'three',
       filterType: 'uriFilter',
-      uriFilter: new Set()
+      uriFilter: null
     },
     productionPlace: {
       id: 'productionPlace',
@@ -47,7 +47,7 @@ export const INITIAL_STATE = {
       searchField: true,
       containerClass: 'ten',
       filterType: 'uriFilter',
-      uriFilter: new Set(),
+      uriFilter: null,
       spatialFilter: null
     },
     author: {
@@ -65,7 +65,7 @@ export const INITIAL_STATE = {
       searchField: true,
       containerClass: 'ten',
       filterType: 'uriFilter',
-      uriFilter: new Set()
+      uriFilter: null
     },
     // language: {
     //   id: 'language',
diff --git a/src/client/reducers/organizationsFacets.js b/src/client/reducers/organizationsFacets.js
index 9ec803ff..89c77548 100644
--- a/src/client/reducers/organizationsFacets.js
+++ b/src/client/reducers/organizationsFacets.js
@@ -30,7 +30,7 @@ export const INITIAL_STATE = {
       searchField: false,
       containerClass: 'five',
       filterType: 'uriFilter',
-      uriFilter: new Set()
+      uriFilter: null
     },
   }
 };
diff --git a/src/client/reducers/peopleFacets.js b/src/client/reducers/peopleFacets.js
index f583fbf6..4605a5ff 100644
--- a/src/client/reducers/peopleFacets.js
+++ b/src/client/reducers/peopleFacets.js
@@ -30,7 +30,7 @@ export const INITIAL_STATE = {
       searchField: false,
       containerClass: 'five',
       filterType: 'uriFilter',
-      uriFilter: new Set()
+      uriFilter: null
     },
     place: {
       id: 'place',
@@ -47,7 +47,7 @@ export const INITIAL_STATE = {
       searchField: true,
       containerClass: 'ten',
       filterType: 'uriFilter',
-      uriFilter: new Set()
+      uriFilter: null
     },
   }
 };
diff --git a/src/client/reducers/placesFacets.js b/src/client/reducers/placesFacets.js
index cdb32a13..6feefc3a 100644
--- a/src/client/reducers/placesFacets.js
+++ b/src/client/reducers/placesFacets.js
@@ -30,7 +30,7 @@ export const INITIAL_STATE = {
       searchField: false,
       containerClass: 'five',
       filterType: 'uriFilter',
-      uriFilter: new Set()
+      uriFilter: null
     },
     area: {
       id: 'area',
@@ -47,7 +47,7 @@ export const INITIAL_STATE = {
       searchField: true,
       containerClass: 'ten',
       filterType: 'uriFilter',
-      uriFilter: new Set(),
+      uriFilter: null,
       spatialFilter: null
     },
   }
diff --git a/src/client/reducers/worksFacets.js b/src/client/reducers/worksFacets.js
index 480a2425..7b4ecb07 100644
--- a/src/client/reducers/worksFacets.js
+++ b/src/client/reducers/worksFacets.js
@@ -30,7 +30,7 @@ export const INITIAL_STATE = {
       searchField: false,
       containerClass: 'five',
       filterType: 'uriFilter',
-      uriFilter: new Set()
+      uriFilter: null
     },
   },
 };
-- 
GitLab