From c9723b29209b9aba485caad4ea4b64d7da756923 Mon Sep 17 00:00:00 2001
From: rbisson <remi.bisson@inrae.fr>
Date: Fri, 13 Dec 2024 17:15:51 +0100
Subject: [PATCH] [AdvancedSearch] Corrected bug causing save search modal to
 refresh on input ; added toasts on history creation and creation error

---
 public/locales/en/search.json                 |  1 +
 public/locales/en/validation.json             |  2 +-
 public/locales/fr/search.json                 |  3 +-
 public/locales/fr/validation.json             |  2 +-
 src/actions/user.js                           |  2 +-
 src/context/InSylvaGatekeeperClient.js        |  2 +-
 .../search/AdvancedSearch/AdvancedSearch.js   | 73 ++++++++++---------
 7 files changed, 44 insertions(+), 41 deletions(-)

diff --git a/public/locales/en/search.json b/public/locales/en/search.json
index ebcd7b4..8453bd3 100644
--- a/public/locales/en/search.json
+++ b/public/locales/en/search.json
@@ -60,6 +60,7 @@
       "addSavedSearchName": "Search name",
       "addSavedSearchDescription": "Description (optional)",
       "addSavedSearchDescriptionPlaceholder": "Search description..."
+      "searchSaved": "Search saved"
     },
     "searchOptions": {
       "title": "Search option",
diff --git a/public/locales/en/validation.json b/public/locales/en/validation.json
index dea09f1..189255c 100644
--- a/public/locales/en/validation.json
+++ b/public/locales/en/validation.json
@@ -1,4 +1,4 @@
 {
   "requestSent": "Your request has been sent to the administrators.",
-  "error": "Error:"
+  "error": "Error"
 }
diff --git a/public/locales/fr/search.json b/public/locales/fr/search.json
index 57080e8..101410a 100644
--- a/public/locales/fr/search.json
+++ b/public/locales/fr/search.json
@@ -59,7 +59,8 @@
       "saveSearch": "Sauvegarder ma recherche",
       "addSavedSearchName": "Nom de la recherche",
       "addSavedSearchDescription": "Description (optionel)",
-      "addSavedSearchDescriptionPlaceholder": "Description de la recherche..."
+      "addSavedSearchDescriptionPlaceholder": "Description de la recherche...",
+      "searchSaved": "Recherche sauvegardée"
     },
     "searchOptions": {
       "title": "Option de recherche",
diff --git a/public/locales/fr/validation.json b/public/locales/fr/validation.json
index f762974..ef37775 100644
--- a/public/locales/fr/validation.json
+++ b/public/locales/fr/validation.json
@@ -1,4 +1,4 @@
 {
   "requestSent": "Votre requête à bien été envoyée.",
-  "error": "Erreur:"
+  "error": "Erreur"
 }
diff --git a/src/actions/user.js b/src/actions/user.js
index 6cfe2cf..d5cc589 100644
--- a/src/actions/user.js
+++ b/src/actions/user.js
@@ -133,7 +133,7 @@ export const addUserHistory = async (kcId, query, name, uiStructure, description
   igClient.token = sessionStorage.getItem('access_token');
   try {
     const jsonUIStructure = JSON.stringify(uiStructure);
-    await igClient.addUserHistory(kcId, query, name, jsonUIStructure, description);
+    return await igClient.addUserHistory(kcId, query, name, jsonUIStructure, description);
   } catch (error) {
     console.error(error);
   }
diff --git a/src/context/InSylvaGatekeeperClient.js b/src/context/InSylvaGatekeeperClient.js
index 7c78df2..26f1078 100644
--- a/src/context/InSylvaGatekeeperClient.js
+++ b/src/context/InSylvaGatekeeperClient.js
@@ -83,7 +83,7 @@ class InSylvaGatekeeperClient {
 
   async addUserHistory(kcId, query, name, uiStructure, description) {
     const path = `/user/add-history`;
-    await this.post('POST', `${path}`, {
+    return await this.post('POST', `${path}`, {
       kcId,
       query,
       name,
diff --git a/src/pages/search/AdvancedSearch/AdvancedSearch.js b/src/pages/search/AdvancedSearch/AdvancedSearch.js
index 44b14ae..53f5ad4 100644
--- a/src/pages/search/AdvancedSearch/AdvancedSearch.js
+++ b/src/pages/search/AdvancedSearch/AdvancedSearch.js
@@ -48,6 +48,7 @@ import styles from './styles.js';
 import moment from 'moment';
 import SearchModeSwitcher from '../SearchModeSwitcher';
 import { toast } from 'react-toastify';
+import ToastMessage from '../../../components/ToastMessage/ToastMessage';
 
 const updateSources = (
   searchFields,
@@ -129,25 +130,6 @@ const fieldValuesToString = (field) => {
   return strValues;
 };
 
-const addHistory = (
-  kcID,
-  search,
-  searchName,
-  searchFields,
-  searchDescription,
-  setUserHistory
-) => {
-  addUserHistory(
-    sessionStorage.getItem('kcId'),
-    search,
-    searchName,
-    searchFields,
-    searchDescription
-  ).then(() => {
-    fetchHistory(setUserHistory);
-  });
-};
-
 const fetchHistory = (setUserHistory) => {
   fetchUserHistory(sessionStorage.getItem('kcId')).then((result) => {
     if (result[0] && result[0].ui_structure) {
@@ -279,8 +261,6 @@ const SearchBar = ({
   const [isLoading, setIsLoading] = useState(false);
   const [userHistory, setUserHistory] = useState({});
   const [isSaveSearchModalOpen, setIsSaveSearchModalOpen] = useState(false);
-  const [searchDescription, setSearchDescription] = useState('');
-  const [searchName, setSearchName] = useState('');
   const [readOnlyQuery, setReadOnlyQuery] = useState(true);
 
   const closeSaveSearchModal = () => {
@@ -322,23 +302,44 @@ const SearchBar = ({
     }
   };
 
-  const onClickSaveSearch = () => {
-    if (!!searchName) {
-      addHistory(
-        sessionStorage.getItem('kcId'),
-        search,
-        searchName,
-        searchFields,
-        searchDescription,
-        setUserHistory
-      );
-      setSearchName('');
-      setSearchDescription('');
-      closeSaveSearchModal();
-    }
+  const addHistory = (
+    search,
+    searchName,
+    searchFields,
+    searchDescription,
+    setUserHistory
+  ) => {
+    addUserHistory(
+      sessionStorage.getItem('kcId'),
+      search,
+      searchName,
+      searchFields,
+      searchDescription
+    ).then((result) => {
+      if (result.error) {
+        toast.error(
+          <ToastMessage title={t('validation:error')} message={result.error} />
+        );
+      } else {
+        toast.success(t('search:advancedSearch.searchHistory.searchSaved'));
+      }
+      fetchHistory(setUserHistory);
+    });
   };
 
   const SaveSearchModal = () => {
+    const [searchName, setSearchName] = useState('');
+    const [searchDescription, setSearchDescription] = useState('');
+
+    const onClickSaveSearch = () => {
+      if (!!searchName) {
+        addHistory(search, searchName, searchFields, searchDescription, setUserHistory);
+        setSearchName('');
+        setSearchDescription('');
+        closeSaveSearchModal();
+      }
+    };
+
     return (
       <EuiOverlayMask>
         <EuiModal onClose={closeSaveSearchModal} initialFocus="[name=searchName]">
@@ -630,7 +631,7 @@ const PopoverValueContent = ({
   availableSources,
   setAvailableSources,
 }) => {
-  const { t } = useTranslation(['search', 'common']);
+  const { t } = useTranslation(['search', 'common', 'validation']);
   const [valueError, setValueError] = useState(undefined);
 
   const onValueSearchChange = (value, hasMatchingOptions) => {
-- 
GitLab