From eac0ca77cd6cd31e96ecde437c585b802f634ecf Mon Sep 17 00:00:00 2001
From: pkupczyk <piotr.kupczyk@id.ethz.ch>
Date: Tue, 5 Oct 2021 14:39:41 +0200
Subject: [PATCH] SSDM-11664 : NG UI & ELN : common table widget

---
 .../src/js/components/common/grid/Grid.jsx    |  21 ++--
 .../components/common/grid/GridController.js  | 110 ++++++++----------
 2 files changed, 61 insertions(+), 70 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 0cbc01becce..7f2cfb5bc86 100644
--- a/openbis_ng_ui/src/js/components/common/grid/Grid.jsx
+++ b/openbis_ng_ui/src/js/components/common/grid/Grid.jsx
@@ -67,15 +67,16 @@ class Grid extends React.PureComponent {
     this.controller.load()
   }
 
-  componentDidUpdate(prevProps) {
-    if (this.props.rows !== prevProps.rows) {
-      this.controller.updateRows(this.props.rows)
+  async componentDidUpdate(prevProps) {
+    if (
+      this.props.rows !== prevProps.rows ||
+      this.props.columns !== prevProps.columns
+    ) {
+      await this.controller.load()
     }
+
     if (this.props.selectedRowId !== prevProps.selectedRowId) {
-      this.controller.updateSelectedRowId(this.props.selectedRowId)
-    }
-    if (this.props.columns !== prevProps.columns) {
-      this.controller.updateColumns(this.props.columns)
+      await this.controller.updateSelectedRow(this.props.selectedRowId)
     }
   }
 
@@ -108,7 +109,7 @@ class Grid extends React.PureComponent {
       pageSize,
       columns,
       rows,
-      selectedRow,
+      selectedRowId,
       totalCount
     } = this.state
 
@@ -135,9 +136,7 @@ class Grid extends React.PureComponent {
                           key={row.id}
                           columns={columns}
                           row={row}
-                          selected={
-                            selectedRow ? selectedRow.id === row.id : false
-                          }
+                          selected={row.id === selectedRowId}
                           onClick={this.controller.handleRowSelect}
                         />
                       )
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 69927e4df50..eeef6f2a59c 100644
--- a/openbis_ng_ui/src/js/components/common/grid/GridController.js
+++ b/openbis_ng_ui/src/js/components/common/grid/GridController.js
@@ -20,7 +20,7 @@ export default class GridController {
       columns: [],
       rows: [],
       allRows: [],
-      selectedRow: null,
+      selectedRowId: null,
       sort: null,
       sortDirection: null,
       totalCount: 0
@@ -165,9 +165,8 @@ export default class GridController {
   }
 
   async load() {
-    const { columns, loadColumns, rows, loadRows } = this.context.getProps()
-    const { filters, page, pageSize, sort, sortDirection, selectedRow } =
-      this.context.getState()
+    const { columns, loadColumns, rows, loadRows, onLoad } =
+      this.context.getProps()
 
     if ((rows && loadRows) || (!rows && !loadRows)) {
       throw new Error(
@@ -185,6 +184,9 @@ export default class GridController {
       loading: true
     }))
 
+    const { filters, page, pageSize, sort, sortDirection } =
+      this.context.getState()
+
     let newRows,
       newAllRows,
       newColumns,
@@ -239,7 +241,9 @@ export default class GridController {
       totalCount: newTotalCount
     }))
 
-    await this._recalculateSelectedRow(selectedRow ? selectedRow.id : null)
+    if (onLoad) {
+      onLoad()
+    }
   }
 
   _loadSettings() {
@@ -335,68 +339,43 @@ export default class GridController {
     openbis.updatePersons([update])
   }
 
-  async updateColumns() {
-    this.load()
-  }
-
-  async updateRows() {
-    this.load()
-  }
-
-  async updateSelectedRowId(selectedRowId) {
-    const { selectedRow } = this.context.getState()
-
-    if (!selectedRow || selectedRow.id !== selectedRowId) {
-      await this._recalculateSelectedRow(selectedRowId)
-    }
-  }
-
-  async _recalculateSelectedRow(selectedRowId) {
-    const { selectedRow, rows } = this.context.getState()
+  async updateSelectedRow(newSelectedRowId) {
     const { onSelectedRowChange } = this.context.getProps()
+    const { selectedRowId } = this.context.getState()
 
-    let newSelectedRow = null
-
-    if (selectedRowId !== null && selectedRowId !== undefined) {
-      const foundRow = _.find(rows, row => row.id === selectedRowId)
-      newSelectedRow = {
-        id: selectedRowId,
-        data: foundRow,
-        visible: foundRow !== undefined
-      }
-    }
-
-    if (!_.isEqual(selectedRow, newSelectedRow)) {
-      await this.context.setState({
-        selectedRow: newSelectedRow
-      })
+    if (newSelectedRowId !== selectedRowId) {
+      await this.context.setState(() => ({
+        selectedRowId: newSelectedRowId
+      }))
       if (onSelectedRowChange) {
-        await onSelectedRowChange(newSelectedRow)
+        onSelectedRowChange(this.getSelectedRow())
       }
     }
   }
 
-  async showSelectedRow() {
-    const { selectedRow, allRows, page, pageSize } = this.context.getState()
+  showSelectedRow() {
+    setTimeout(async () => {
+      const { selectedRowId, allRows, page, pageSize } = this.context.getState()
 
-    if (!selectedRow) {
-      return
-    }
+      if (!selectedRowId) {
+        return
+      }
 
-    const index = _.findIndex(allRows, ['id', selectedRow.id])
+      const index = _.findIndex(allRows, ['id', selectedRowId])
 
-    if (index === -1) {
-      return
-    }
+      if (index === -1) {
+        return
+      }
 
-    const newPage = Math.floor(index / pageSize)
+      const newPage = Math.floor(index / pageSize)
 
-    if (newPage !== page) {
-      await this.context.setState({
-        page: newPage
-      })
-      await this.load()
-    }
+      if (newPage !== page) {
+        await this.context.setState({
+          page: newPage
+        })
+        await this.load()
+      }
+    }, 1)
   }
 
   async handleFilterChange(column, filter) {
@@ -514,8 +493,8 @@ export default class GridController {
     await this.load()
   }
 
-  handleRowSelect(row) {
-    this.updateSelectedRowId(row ? row.id : null)
+  async handleRowSelect(row) {
+    await this.updateSelectedRow(row ? row.id : null)
   }
 
   _filter(rows, columns, filters) {
@@ -583,8 +562,21 @@ export default class GridController {
   }
 
   getSelectedRow() {
-    const { selectedRow } = this.context.getState()
-    return selectedRow
+    const { selectedRowId, rows, allRows } = this.context.getState()
+
+    if (selectedRowId !== null && selectedRowId !== undefined) {
+      const selectedRow = _.find(allRows, row => row.id === selectedRowId)
+      if (selectedRow !== undefined) {
+        const visible =
+          _.findIndex(rows, row => row.id === selectedRowId) !== -1
+        return {
+          id: selectedRow.id,
+          visible
+        }
+      }
+    }
+
+    return null
   }
 
   getTotalCount() {
-- 
GitLab