From e371fa0d9628115c7945f73af2f401b6b624057e Mon Sep 17 00:00:00 2001
From: pkupczyk <piotr.kupczyk@id.ethz.ch>
Date: Tue, 1 Sep 2020 11:02:39 +0200
Subject: [PATCH] NG_UI : vocabulary form : SSDM-7579 - clicking on a selected
 item does not deselect it anymore (changed at both vocabulary form as well as
 type form)

---
 .../src/js/components/common/grid/Grid.jsx    | 11 +++++++---
 .../components/common/grid/GridContainer.jsx  | 11 +++++++---
 .../components/common/grid/GridController.js  | 20 ++++++++++---------
 .../src/js/components/common/grid/GridRow.jsx | 10 +++++-----
 .../types/form/TypeFormPreviewProperty.jsx    |  9 +--------
 .../types/form/TypeFormPreviewSection.jsx     |  8 +-------
 .../components/types/form/VocabularyForm.jsx  |  9 +++++----
 7 files changed, 39 insertions(+), 39 deletions(-)

diff --git a/openbis_ng_ui/src/js/components/common/grid/Grid.jsx b/openbis_ng_ui/src/js/components/common/grid/Grid.jsx
index 0ccc2299387..d8fe3c715f0 100644
--- a/openbis_ng_ui/src/js/components/common/grid/Grid.jsx
+++ b/openbis_ng_ui/src/js/components/common/grid/Grid.jsx
@@ -1,5 +1,6 @@
 import _ from 'lodash'
 import React from 'react'
+import autoBind from 'auto-bind'
 import { connect } from 'react-redux'
 import { withStyles } from '@material-ui/core/styles'
 import Table from '@material-ui/core/Table'
@@ -47,6 +48,7 @@ function mapStateToProps(state) {
 class Grid extends React.PureComponent {
   constructor(props) {
     super(props)
+    autoBind(this)
 
     this.state = {}
 
@@ -76,6 +78,10 @@ class Grid extends React.PureComponent {
     }
   }
 
+  handleClickContainer(event) {
+    event.stopPropagation()
+  }
+
   render() {
     logger.log(logger.DEBUG, 'Grid.render')
 
@@ -83,7 +89,7 @@ class Grid extends React.PureComponent {
       return <React.Fragment />
     }
 
-    const { classes, onSelectedRowChange } = this.props
+    const { classes } = this.props
     const {
       filters,
       sort,
@@ -97,7 +103,7 @@ class Grid extends React.PureComponent {
     } = this.state
 
     return (
-      <div>
+      <div onClick={this.handleClickContainer}>
         <Table classes={{ root: classes.table }}>
           <GridHeader
             columns={columns}
@@ -115,7 +121,6 @@ class Grid extends React.PureComponent {
                   columns={columns}
                   row={row}
                   selected={selectedRow ? selectedRow.id === row.id : false}
-                  selectable={onSelectedRowChange}
                   onClick={this.controller.handleRowSelect}
                 />
               )
diff --git a/openbis_ng_ui/src/js/components/common/grid/GridContainer.jsx b/openbis_ng_ui/src/js/components/common/grid/GridContainer.jsx
index 656e105a1ec..ffd976d3d21 100644
--- a/openbis_ng_ui/src/js/components/common/grid/GridContainer.jsx
+++ b/openbis_ng_ui/src/js/components/common/grid/GridContainer.jsx
@@ -5,14 +5,19 @@ const styles = theme => ({
   container: {
     padding: theme.spacing(2),
     paddingTop: theme.spacing(1),
-    paddingBottom: 0
+    paddingBottom: 0,
+    height: '100%'
   }
 })
 
 class GridContainer extends React.Component {
   render() {
-    const { classes, children } = this.props
-    return <div className={classes.container}>{children}</div>
+    const { classes, onClick, children } = this.props
+    return (
+      <div className={classes.container} onClick={onClick}>
+        {children}
+      </div>
+    )
   }
 }
 
diff --git a/openbis_ng_ui/src/js/components/common/grid/GridController.js b/openbis_ng_ui/src/js/components/common/grid/GridController.js
index 038164d4baf..5eb50c94523 100644
--- a/openbis_ng_ui/src/js/components/common/grid/GridController.js
+++ b/openbis_ng_ui/src/js/components/common/grid/GridController.js
@@ -140,11 +140,19 @@ export default class GridController {
   }
 
   async updateAllRows(rows) {
-    await this._recalculateCurrentRows(rows)
+    const { allRows } = this.context.getState()
+
+    if (allRows !== rows) {
+      await this._recalculateCurrentRows(rows)
+    }
   }
 
   async updateSelectedRowId(selectedRowId) {
-    await this._recalculateSelectedRow(selectedRowId)
+    const { selectedRow } = this.context.getState()
+
+    if (!selectedRow || selectedRow.id !== selectedRowId) {
+      await this._recalculateSelectedRow(selectedRowId)
+    }
   }
 
   async _recalculateCurrentRows(rows) {
@@ -340,13 +348,7 @@ export default class GridController {
   }
 
   handleRowSelect(row) {
-    const { selectedRow } = this.context.getState()
-
-    if (selectedRow && selectedRow.id === row.id) {
-      this.updateSelectedRowId(null)
-    } else {
-      this.updateSelectedRowId(row.id)
-    }
+    this.updateSelectedRowId(row ? row.id : null)
   }
 
   _filter(rows, columns, filters) {
diff --git a/openbis_ng_ui/src/js/components/common/grid/GridRow.jsx b/openbis_ng_ui/src/js/components/common/grid/GridRow.jsx
index 865bd76121a..566834cefcd 100644
--- a/openbis_ng_ui/src/js/components/common/grid/GridRow.jsx
+++ b/openbis_ng_ui/src/js/components/common/grid/GridRow.jsx
@@ -5,12 +5,12 @@ import TableCell from '@material-ui/core/TableCell'
 import logger from '@src/js/common/logger.js'
 
 const styles = theme => ({
+  row: {
+    cursor: 'pointer'
+  },
   cell: {
     padding: `${theme.spacing(1)}px ${theme.spacing(2)}px`,
     borderColor: theme.palette.border.secondary
-  },
-  selectable: {
-    cursor: 'pointer'
   }
 })
 
@@ -30,7 +30,7 @@ class GridRow extends React.PureComponent {
   render() {
     logger.log(logger.DEBUG, 'GridRow.render')
 
-    const { columns, row, selected, selectable, classes } = this.props
+    const { columns, row, selected, classes } = this.props
 
     return (
       <TableRow
@@ -39,7 +39,7 @@ class GridRow extends React.PureComponent {
         hover={true}
         selected={selected}
         classes={{
-          root: selectable ? classes.selectable : null
+          root: classes.row
         }}
       >
         {columns.map(column => this.renderCell(column, row))}
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormPreviewProperty.jsx b/openbis_ng_ui/src/js/components/types/form/TypeFormPreviewProperty.jsx
index d533f76455b..8cb716309e6 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormPreviewProperty.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/TypeFormPreviewProperty.jsx
@@ -220,15 +220,8 @@ class TypeFormPreviewProperty extends React.PureComponent {
   }
 
   handleClick(event, newSelection) {
-    const { selection } = this.props
-
     event.stopPropagation()
-
-    if (_.isEqual(selection, newSelection)) {
-      this.props.onSelectionChange()
-    } else {
-      this.props.onSelectionChange(newSelection.type, newSelection.params)
-    }
+    this.props.onSelectionChange(newSelection.type, newSelection.params)
   }
 
   handleChange(event) {
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormPreviewSection.jsx b/openbis_ng_ui/src/js/components/types/form/TypeFormPreviewSection.jsx
index 170c848b494..e7fd2081b91 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormPreviewSection.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/TypeFormPreviewSection.jsx
@@ -44,8 +44,6 @@ class TypeFormPreviewSection extends React.PureComponent {
   }
 
   handleClick(event) {
-    const { selection } = this.props
-
     event.stopPropagation()
 
     const newSelection = {
@@ -56,11 +54,7 @@ class TypeFormPreviewSection extends React.PureComponent {
       }
     }
 
-    if (_.isEqual(selection, newSelection)) {
-      this.props.onSelectionChange()
-    } else {
-      this.props.onSelectionChange(newSelection.type, newSelection.params)
-    }
+    this.props.onSelectionChange(newSelection.type, newSelection.params)
   }
 
   render() {
diff --git a/openbis_ng_ui/src/js/components/types/form/VocabularyForm.jsx b/openbis_ng_ui/src/js/components/types/form/VocabularyForm.jsx
index e8150aebed0..3da7e258f68 100644
--- a/openbis_ng_ui/src/js/components/types/form/VocabularyForm.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/VocabularyForm.jsx
@@ -43,9 +43,6 @@ class VocabularyForm extends React.PureComponent {
     super(props)
     autoBind(this)
 
-    this.handleSelectedRowChange = this.handleSelectedRowChange.bind(this)
-    this.handleGridControllerRef = this.handleGridControllerRef.bind(this)
-
     this.state = {}
 
     if (this.props.controller) {
@@ -61,6 +58,10 @@ class VocabularyForm extends React.PureComponent {
     this.controller.load()
   }
 
+  handleClickContainer() {
+    this.controller.handleSelectionChange()
+  }
+
   handleSelectedRowChange(row) {
     const { controller } = this
     if (row) {
@@ -95,7 +96,7 @@ class VocabularyForm extends React.PureComponent {
     const { terms, selection } = this.state
 
     return (
-      <GridContainer>
+      <GridContainer onClick={this.handleClickContainer}>
         <Header>Terms</Header>
         <Grid
           id={ids.VOCABULARY_TERMS_GRID_ID}
-- 
GitLab