From 1d680fc6f2ecc0ff67dd6020b4bc0c70ee85f26d Mon Sep 17 00:00:00 2001
From: pkupczyk <piotr.kupczyk@id.ethz.ch>
Date: Fri, 26 Jun 2020 18:48:16 +0200
Subject: [PATCH] NG_UI : SSDM-7583 : ObjectType form - simple 'You have
 unsaved changes.' implementation (a flag is set when sth is changed)

---
 .../src/js/components/types/form/TypeForm.jsx          |  2 ++
 .../src/js/components/types/form/TypeFormButtons.jsx   | 10 +++++++++-
 .../types/form/TypeFormControllerAddProperty.js        |  3 ++-
 .../types/form/TypeFormControllerAddSection.js         |  3 ++-
 .../components/types/form/TypeFormControllerChange.js  |  9 ++++++---
 .../js/components/types/form/TypeFormControllerLoad.js |  3 ++-
 .../types/form/TypeFormControllerOrderChange.js        |  9 ++++++---
 .../components/types/form/TypeFormControllerRemove.js  |  6 ++++--
 8 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/openbis_ng_ui/src/js/components/types/form/TypeForm.jsx b/openbis_ng_ui/src/js/components/types/form/TypeForm.jsx
index 27dd562c81d..94b78d55be2 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeForm.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/TypeForm.jsx
@@ -97,6 +97,7 @@ class TypeForm extends React.PureComponent {
       selection,
       removePropertyDialogOpen,
       removeSectionDialogOpen,
+      changed,
       mode
     } = this.state
 
@@ -157,6 +158,7 @@ class TypeForm extends React.PureComponent {
             onSave={controller.handleSave}
             onCancel={controller.handleCancel}
             selection={selection}
+            changed={changed}
             mode={mode}
           />
           <TypeFormDialogRemoveSection
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormButtons.jsx b/openbis_ng_ui/src/js/components/types/form/TypeFormButtons.jsx
index 494160cad8b..1eda5fae7a0 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormButtons.jsx
+++ b/openbis_ng_ui/src/js/components/types/form/TypeFormButtons.jsx
@@ -4,6 +4,8 @@ import Container from '@src/js/components/common/form/Container.jsx'
 import Button from '@src/js/components/common/form/Button.jsx'
 import logger from '@src/js/common/logger.js'
 
+import TypeFormMessage from './TypeFormMessage.jsx'
+
 const styles = theme => ({
   container: {
     display: 'flex'
@@ -76,7 +78,8 @@ class TypeFormButtons extends React.PureComponent {
       onAddProperty,
       onRemove,
       onSave,
-      onCancel
+      onCancel,
+      changed
     } = this.props
 
     return (
@@ -104,6 +107,11 @@ class TypeFormButtons extends React.PureComponent {
           />
         </div>
         <div className={classes.rightContainer}>
+          {changed && (
+            <TypeFormMessage type='warning'>
+              You have unsaved changes.
+            </TypeFormMessage>
+          )}
           <Button
             name='save'
             label='Save'
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerAddProperty.js b/openbis_ng_ui/src/js/components/types/form/TypeFormControllerAddProperty.js
index f6092c673d8..9446254461b 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerAddProperty.js
+++ b/openbis_ng_ui/src/js/components/types/form/TypeFormControllerAddProperty.js
@@ -100,7 +100,8 @@ export default class TypeFormControllerAddProperty {
       sections: newSections,
       properties: newProperties,
       propertiesCounter,
-      selection: newSelection
+      selection: newSelection,
+      changed: true
     }))
   }
 
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerAddSection.js b/openbis_ng_ui/src/js/components/types/form/TypeFormControllerAddSection.js
index 8fc87eb53cf..94158583b21 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerAddSection.js
+++ b/openbis_ng_ui/src/js/components/types/form/TypeFormControllerAddSection.js
@@ -41,7 +41,8 @@ export default class TypeFormControllerAddSection {
       ...state,
       sections: newSections,
       sectionsCounter,
-      selection: newSelection
+      selection: newSelection,
+      changed: true
     }))
   }
 
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerChange.js b/openbis_ng_ui/src/js/components/types/form/TypeFormControllerChange.js
index 82bbf40270b..ab83b4f4ef1 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerChange.js
+++ b/openbis_ng_ui/src/js/components/types/form/TypeFormControllerChange.js
@@ -31,7 +31,8 @@ export default class TypeFormControllerChange {
           ...state.type[field],
           value
         }
-      }
+      },
+      changed: true
     }))
   }
 
@@ -52,7 +53,8 @@ export default class TypeFormControllerChange {
 
     this.context.setState(state => ({
       ...state,
-      sections: newSections
+      sections: newSections,
+      changed: true
     }))
   }
 
@@ -79,7 +81,8 @@ export default class TypeFormControllerChange {
 
     this.context.setState(state => ({
       ...state,
-      properties: newProperties
+      properties: newProperties,
+      changed: true
     }))
   }
 
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerLoad.js b/openbis_ng_ui/src/js/components/types/form/TypeFormControllerLoad.js
index 9e03e95ca8d..f6f53dfd628 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerLoad.js
+++ b/openbis_ng_ui/src/js/components/types/form/TypeFormControllerLoad.js
@@ -13,7 +13,8 @@ export default class TypeFormControllerLoad {
     await this.context.setState({
       mode: 'view',
       loading: true,
-      validate: false
+      validate: false,
+      changed: false
     })
 
     const typePromise = new TypeFormControllerLoadType(
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerOrderChange.js b/openbis_ng_ui/src/js/components/types/form/TypeFormControllerOrderChange.js
index f8fdda74d41..533eff58350 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerOrderChange.js
+++ b/openbis_ng_ui/src/js/components/types/form/TypeFormControllerOrderChange.js
@@ -27,7 +27,8 @@ export default class TypeFormControllerOrderChange {
     newSections.splice(toIndex, 0, section)
     this.context.setState(state => ({
       ...state,
-      sections: newSections
+      sections: newSections,
+      changed: true
     }))
   }
 
@@ -49,7 +50,8 @@ export default class TypeFormControllerOrderChange {
 
       this.context.setState(state => ({
         ...state,
-        sections: newSections
+        sections: newSections,
+        changed: true
       }))
     } else {
       let { sections } = this.context.getState()
@@ -89,7 +91,8 @@ export default class TypeFormControllerOrderChange {
       this.context.setState(state => ({
         ...state,
         sections: newSections,
-        properties: newProperties
+        properties: newProperties,
+        changed: true
       }))
     }
   }
diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerRemove.js b/openbis_ng_ui/src/js/components/types/form/TypeFormControllerRemove.js
index c0a75b7d0a0..337fe56321b 100644
--- a/openbis_ng_ui/src/js/components/types/form/TypeFormControllerRemove.js
+++ b/openbis_ng_ui/src/js/components/types/form/TypeFormControllerRemove.js
@@ -57,7 +57,8 @@ export default class TypeFormControllerRemove {
       ...state,
       sections: newSections,
       properties: newProperties,
-      selection: null
+      selection: null,
+      changed: true
     }))
   }
 
@@ -100,7 +101,8 @@ export default class TypeFormControllerRemove {
       ...state,
       sections: newSections,
       properties: newProperties,
-      selection: null
+      selection: null,
+      changed: true
     }))
   }
 
-- 
GitLab