From 5167b1242439bf397aa6ce219c71845dbc603828 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Wed, 27 Nov 2024 14:31:09 +0100
Subject: [PATCH 01/61] save avant merge

---
 .../DetailApplicationModalCard.vue            |  6 +-
 src/components/common/CollapsibleTree.vue     | 24 +++----
 src/composable/applications/applications.js   |  1 -
 src/model/ApplicationResult.js                |  5 +-
 src/model/User.js                             | 14 ++--
 src/services/TagService.js                    |  5 +-
 .../AdditionalFileInfosView.vue               |  6 +-
 src/views/application/ApplicationInfoView.vue | 66 +++++++++----------
 src/views/application/ApplicationsView.vue    | 51 +++++++++++---
 .../AuthorizationsRightsRequestInfoView.vue   |  6 +-
 .../DataTypeAuthorizationsView.vue            | 13 ++--
 src/views/data/DataTableView.vue              |  2 +-
 12 files changed, 110 insertions(+), 89 deletions(-)

diff --git a/src/components/application/DetailApplicationModalCard.vue b/src/components/application/DetailApplicationModalCard.vue
index feb50e86e..2efe4923b 100644
--- a/src/components/application/DetailApplicationModalCard.vue
+++ b/src/components/application/DetailApplicationModalCard.vue
@@ -73,11 +73,9 @@ export default {
     });
     const validated = computed({
       get() {
-        let charteTimeStamp = User.STORED_AUTHENTICATED_USER()?.chartes?.[props.application.id]
+        let charteTimeStamp = User.STORED_AUTHENTICATED_USER()?.chartes?.[props.application.id];
         if (charteTimeStamp) {
-          return (
-            new Date().getTime() > charteTimeStamp
-          );
+          return new Date().getTime() > charteTimeStamp;
         }
         return false;
       },
diff --git a/src/components/common/CollapsibleTree.vue b/src/components/common/CollapsibleTree.vue
index 988510538..cf8a9ff4e 100644
--- a/src/components/common/CollapsibleTree.vue
+++ b/src/components/common/CollapsibleTree.vue
@@ -227,28 +227,28 @@ export default {
   computed: {
     length() {
       return length;
-    }
+    },
   },
   components: { TagsInfos, LoadingAnimate, FontAwesomeIcon, AvailiblityChart },
   props: {
     applicationName: String,
     canUpload: {
       type: Boolean,
-      default: true
+      default: true,
     },
     option: Object,
     level: {
       type: Number,
-      default: 0
+      default: 0,
     },
     showEmpty: {
       value: {
         type: Boolean,
-        default: false
-      }
+        default: false,
+      },
     },
     tags: {
-      type: Object
+      type: Object,
     },
     referenceSynthesis: Array,
     onClickLabelCb: Function,
@@ -257,20 +257,20 @@ export default {
     buttons: Array,
     withRadios: {
       type: Boolean,
-      default: false
+      default: false,
     },
     radioName: Object,
     repository: Object,
     repositoryRedirect: Function,
     lineCount: {
       type: Number,
-      default: 0
+      default: 0,
     },
     isLoading: Boolean,
     isUploading: Boolean,
     applicationTitle: {
-      type: String
-    }
+      type: String,
+    },
   },
   setup(props) {
     let innerOptionChecked = null;
@@ -299,9 +299,9 @@ export default {
       displayChildren,
       refFile,
       innerOptionChecked,
-      updateCountLineFile
+      updateCountLineFile,
     };
-  }
+  },
 };
 </script>
 
diff --git a/src/composable/applications/applications.js b/src/composable/applications/applications.js
index d6fa4ab7e..2e411b5af 100644
--- a/src/composable/applications/applications.js
+++ b/src/composable/applications/applications.js
@@ -18,7 +18,6 @@ function addApplication(result) {
       .map((a, i) => (a.name === application.name ? i : -1))
       .find((i) => i >= 0);
     let localApplication = applications.value;
-    console.log("localApplication", localApplication);
     if (id >= 0) {
       localApplication[id] = application;
     } else {
diff --git a/src/model/ApplicationResult.js b/src/model/ApplicationResult.js
index 73777bae5..5ca75a9c6 100644
--- a/src/model/ApplicationResult.js
+++ b/src/model/ApplicationResult.js
@@ -89,9 +89,8 @@ export class ApplicationResult {
     this.dependantNodesByDataName = application.dependantNodesByDataName;
     this.orderedReferences = application.orderedReferences;
     this.referenceSynthesis = application.referenceSynthesis;
-    let charteTimeStamp = User.STORED_AUTHENTICATED_USER()?.chartes?.[application.id]
-    this.hasSignedLastCharte =
-      new Date().getTime() > charteTimeStamp;
+    let charteTimeStamp = User.STORED_AUTHENTICATED_USER()?.chartes?.[application.id];
+    this.hasSignedLastCharte = new Date().getTime() > charteTimeStamp;
     this.hasSignedCharte = charteTimeStamp;
   }
 }
diff --git a/src/model/User.js b/src/model/User.js
index 7bf13dcf3..f4d9e545b 100644
--- a/src/model/User.js
+++ b/src/model/User.js
@@ -1,10 +1,10 @@
 export class User {
   static states = { idle: false, active: true, pending: false, closed: false };
   static INSTANCE = new User();
-  static STORED_AUTHENTICATED_USER = function() {
-    let authenticatedUser = localStorage.getItem('authenticatedUser');
-    return authenticatedUser?JSON.parse(authenticatedUser):{};
-  }
+  static STORED_AUTHENTICATED_USER = function () {
+    let authenticatedUser = localStorage.getItem("authenticatedUser");
+    return authenticatedUser ? JSON.parse(authenticatedUser) : {};
+  };
 
   id = "";
   login = "";
@@ -26,9 +26,9 @@ export class User {
   lang = navigator.language.slice(0, 2) || "fr";
 
   constructor(userData) {
-    if (!userData ) {
-      let user = localStorage.getItem('authenticatedUser');
-      user =  user?JSON.parse(user):{};
+    if (!userData) {
+      let user = localStorage.getItem("authenticatedUser");
+      user = user ? JSON.parse(user) : {};
       if (!user) {
         return;
       }
diff --git a/src/services/TagService.js b/src/services/TagService.js
index deaaa608b..e3294b3eb 100644
--- a/src/services/TagService.js
+++ b/src/services/TagService.js
@@ -45,10 +45,7 @@ export class TagService extends Fetcher {
             ) {
               return true;
             } else {
-              return selectedTags.some(
-                (selectedTag) =>
-                  selectedTag.tagName === tag.tagName
-              );
+              return selectedTags.some((selectedTag) => selectedTag.tagName === tag.tagName);
             }
           }
         });
diff --git a/src/views/additionalfiles/AdditionalFileInfosView.vue b/src/views/additionalfiles/AdditionalFileInfosView.vue
index ecb4ee050..84b185620 100644
--- a/src/views/additionalfiles/AdditionalFileInfosView.vue
+++ b/src/views/additionalfiles/AdditionalFileInfosView.vue
@@ -477,8 +477,7 @@ export default class AdditionalFileInfosView extends Vue {
         this.validFile = true;
         this.forApplication = additionalFile.forApplication;
         this.currentUser = additionalFiles.users.find(
-          (user) =>
-            user.id == (additionalFile.user || User.STORED_AUTHENTICATED_USER()?.id)
+          (user) => user.id == (additionalFile.user || User.STORED_AUTHENTICATED_USER()?.id)
         );
         this.comment = additionalFile.comment;
         this.fields = Object.keys(this.format || {} || []).reduce((acc, field) => {
@@ -507,8 +506,7 @@ export default class AdditionalFileInfosView extends Vue {
         this.canManage =
           this.isApplicationAdmin ||
           (authorizations.users &&
-            authorizations.users[0].login ===
-              User.STORED_AUTHENTICATED_USER()?.login);
+            authorizations.users[0].login === User.STORED_AUTHENTICATED_USER()?.login);
       } else {
         this.fileNames = additionalFiles.fileNames;
         let initialValue = new Authorizations(
diff --git a/src/views/application/ApplicationInfoView.vue b/src/views/application/ApplicationInfoView.vue
index 1e194a7a0..4d93a3baf 100644
--- a/src/views/application/ApplicationInfoView.vue
+++ b/src/views/application/ApplicationInfoView.vue
@@ -21,8 +21,8 @@ export default {
   emits: ["setValidatedCharte"],
   props: {
     applicationName: {
-      type: String
-    }
+      type: String,
+    },
   },
   setup(props, ctx) {
     const isCardModalActive = useBoolean().refBoolean;
@@ -30,7 +30,7 @@ export default {
     const redirection = ref(() => {
       app.$router.push(`/applications/${props.applicationName}`);
     });
-    const showCharte = function(objectShowCharte) {
+    const showCharte = function (objectShowCharte) {
       if (!objectShowCharte) {
         return;
       } else {
@@ -43,25 +43,23 @@ export default {
       get() {
         let chartestimeStamp = User.STORED_AUTHENTICATED_USER()?.chartes?.[props.application.id];
         if (chartestimeStamp) {
-          return (
-            new Date().getTime() > chartestimeStamp
-          );
+          return new Date().getTime() > chartestimeStamp;
         }
         return false;
       },
       set(bool) {
         bool &&
-        services.loginService.modifAcount({
-          login: User.STORED_AUTHENTICATED_USER()?.login,
-          email: User.STORED_AUTHENTICATED_USER()?.email,
-          charte: props.application.id
-        });
+          services.loginService.modifAcount({
+            login: User.STORED_AUTHENTICATED_USER()?.login,
+            email: User.STORED_AUTHENTICATED_USER()?.email,
+            charte: props.application.id,
+          });
         bool &&
-        ctx.emit("setValidatedCharte", {
-          applicationId: application.id,
-          validated: bool
-        });
-      }
+          ctx.emit("setValidatedCharte", {
+            applicationId: application.id,
+            validated: bool,
+          });
+      },
     });
     const { reactiveObject: application, doChangeObject: changeApplication } = useObject(
       new ApplicationResult()
@@ -89,7 +87,7 @@ export default {
       showAdditionalFilesManagementRights,
       requestRights,
       authorizationsManagementForApplicationUsers,
-      showRequestRights
+      showRequestRights,
     } = useRedirections(application);
 
     onMounted(async () => {
@@ -99,7 +97,7 @@ export default {
           "Accueil",
           () => app.$router.push(`/applications/${props.applicationName}`),
           () => app.$router.push(`/applications`)
-        )
+        ),
       ]);
     });
 
@@ -111,7 +109,7 @@ export default {
               "DATATYPE",
               "CONFIGURATION",
               "REFERENCETYPE",
-              "ADDITIONALFILE"
+              "ADDITIONALFILE",
             ])
           )
         );
@@ -120,12 +118,12 @@ export default {
           localRefName: services.internationalisationService.localeReferenceNames(
             props.applicationName,
             application
-          )
+          ),
         });
       } catch (e) {
         services.alertService.toastError(
           i18n.t("alert.server-error-appli-no-exist", {
-            name: props.applicationName
+            name: props.applicationName,
           })
         );
       }
@@ -175,9 +173,9 @@ export default {
       canManagerUser,
       canManagerApplication,
       url,
-      redirection
+      redirection,
     };
-  }
+  },
 };
 </script>
 
@@ -267,7 +265,7 @@ export default {
                     icon-left="drafting-compass"
                     type="is-primary"
                     @click="showCharte(displayReferencesManagement(application))"
-                  >{{ $t("applications.references") }}
+                    >{{ $t("applications.references") }}
                   </b-button>
                 </div>
                 <div
@@ -279,7 +277,7 @@ export default {
                     icon-left="poll"
                     type="is-primary"
                     @click="showCharte(displayDataSetManagement(application))"
-                  >{{ $t("applications.dataset") }}
+                    >{{ $t("applications.dataset") }}
                   </b-button>
                 </div>
               </div>
@@ -289,7 +287,7 @@ export default {
                   outlined
                   type="is-warning"
                   @click="showDataRights(application)"
-                >{{ $t("applications.functions.datas-rights") }}
+                  >{{ $t("applications.functions.datas-rights") }}
                 </b-button>
               </div>
             </b-tab-item>
@@ -302,8 +300,8 @@ export default {
             >
               <template #header>
                 <span class="rubriqueTitle">{{
-                    $t("applications.functions.additional-files-manage")
-                  }}</span>
+                  $t("applications.functions.additional-files-manage")
+                }}</span>
               </template>
               <div class="buttonWarper">
                 <b-button
@@ -329,8 +327,8 @@ export default {
             >
               <template #header>
                 <span class="rubriqueTitle">{{
-                    $t("applications.functions.application-manage")
-                  }}</span>
+                  $t("applications.functions.application-manage")
+                }}</span>
               </template>
               <div class="buttonWarper columns">
                 <b-button
@@ -401,8 +399,8 @@ export default {
             <b-tab-item aria-description="authorization">
               <template #header>
                 <span class="rubriqueTitle">{{
-                    $t("applications.functions.right-requests-manage")
-                  }}</span>
+                  $t("applications.functions.right-requests-manage")
+                }}</span>
               </template>
               <div class="buttonWarper">
                 <b-button
@@ -436,7 +434,7 @@ export default {
               icon-left="drafting-compass"
               type="is-primary"
               @click="showCharte(displayReferencesManagement(application))"
-            >{{ $t("applications.references") }}
+              >{{ $t("applications.references") }}
             </b-button>
           </div>
           <div
@@ -448,7 +446,7 @@ export default {
               icon-left="poll"
               type="is-primary"
               @click="showCharte(displayDataSetManagement(application))"
-            >{{ $t("applications.dataset") }}
+              >{{ $t("applications.dataset") }}
             </b-button>
           </div>
           <div
diff --git a/src/views/application/ApplicationsView.vue b/src/views/application/ApplicationsView.vue
index c89943fa9..76f0430a6 100644
--- a/src/views/application/ApplicationsView.vue
+++ b/src/views/application/ApplicationsView.vue
@@ -40,7 +40,6 @@
                     false-value="false"
                     field="name"
                     true-value="true"
-                    @input="alphabeticalSort = ''"
                     >{{ $t("applications.trierRecent") }}
                   </b-checkbox>
                 </b-field>
@@ -171,25 +170,61 @@ export default {
     const selected = useBoolean().refBoolean;
     const alphabeticalSort = useText().refText;
     const selectedApplications = computed(() => {
-      let sa = applications && applications.value;
+      let applicationsListOrderOrFilter = applications.value;
       if (filterName.value.length > 2)
-        sa = sa.filter(
+        applicationsListOrderOrFilter = applicationsListOrderOrFilter.filter(
           (a) => a.localName.toString().toLowerCase().indexOf(filterName.value.toLowerCase()) >= 0
         );
-      if (checkboxDate.value === "true") sa = sa.sort((a, b) => b.creationDate - a.creationDate);
-      else sa = sa.sort((a, b) => b.creationDate - a.creationDate).reverse();
+      applicationsListOrderOrFilter = sortedApplicationsListForDate(applicationsListOrderOrFilter);
       if (alphabeticalSort.value === "Az") {
-        sa = sa.sort((a, b) => a.localName.localeCompare(b.localName));
+        applicationsListOrderOrFilter = applicationsListOrderOrFilter.sort((a, b) =>
+          a.localName.localeCompare(b.localName)
+        );
       } else if (alphabeticalSort.value === "Za") {
-        sa = sa.sort((a, b) => a.localName.localeCompare(b.localName)).reverse();
+        applicationsListOrderOrFilter = applicationsListOrderOrFilter
+          .sort((a, b) => a.localName.localeCompare(b.localName))
+          .reverse();
       }
-      return sa;
+      return applicationsListOrderOrFilter;
     });
 
     onMounted(async () => {
       loadApplications(["DATATYPE", "REFERENCETYPE", "CONFIGURATION", "ADDITIONALFILE"]);
     });
 
+    function sortedApplicationsListForDate(localApplications) {
+      let apps = applications.value || applications;
+      localApplications = apps.sort((a, b) => {
+        const localA = new Date(
+          a.updateDate[0],
+          a.updateDate[1] - 1,
+          a.updateDate[2],
+          a.updateDate[3],
+          a.updateDate[4],
+          a.updateDate[5],
+          a.updateDate[6] / 1000000
+        );
+        const localB = new Date(
+          b.updateDate[0],
+          b.updateDate[1] - 1,
+          b.updateDate[2],
+          b.updateDate[3],
+          b.updateDate[4],
+          b.updateDate[5],
+          b.updateDate[6] / 1000000
+        );
+        return checkboxDate.value
+          ? localB.getTime() - localA.getTime()
+          : localA.getTime() - localB.getTime();
+      });
+      console.log(
+        "applicationsListOrderOrFilter in computed",
+        checkboxDate.value,
+        localApplications
+      );
+      return localApplications;
+    }
+
     const ownApplications = computed(() => {
       return applications.value.filter((application) => application.isApplicationUser());
     });
diff --git a/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue b/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
index 3a8141401..b7717db6f 100644
--- a/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
+++ b/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
@@ -534,10 +534,8 @@ export default {
       let usersId;
       let authenticatedUserId = User.STORED_AUTHENTICATED_USER().id;
       if (
-        (currentUser.value.id &&
-          currentUser.value.id !== authenticatedUserId) ||
-        (currentUser.value[0] &&
-          currentUser.value[0].id !== authenticatedUserId)
+        (currentUser.value.id && currentUser.value.id !== authenticatedUserId) ||
+        (currentUser.value[0] && currentUser.value[0].id !== authenticatedUserId)
       ) {
         usersId = currentUser.value.id
           ? [currentUser.value.id, authenticatedUserId]
diff --git a/src/views/authorizations/DataTypeAuthorizationsView.vue b/src/views/authorizations/DataTypeAuthorizationsView.vue
index 11da1e277..a92819727 100644
--- a/src/views/authorizations/DataTypeAuthorizationsView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationsView.vue
@@ -86,8 +86,7 @@
               {{ $t("dataTypeAuthorizations.table-auth-users-all-user") }}
             </b-radio>
           </div>
-          <div class="column is-offset-4 is-2"
-               v-if="isApplicationManager">
+          <div class="column is-offset-4 is-2" v-if="isApplicationManager">
             <b-button
               icon-left="plus"
               outlined
@@ -229,7 +228,7 @@
                     >
                       <b-checkbox
                         v-model="checkbox[auth.name + '_' + props.row.name]"
-                        :disabled="(isApplicationManager || isUserManager)"
+                        :disabled="isApplicationManager || isUserManager"
                         @input="updateListUsersInAuthorization(auth, props.row.name, $event)"
                       >
                         {{ auth.name }}
@@ -454,8 +453,9 @@
                       <b-checkbox
                         v-model="checkbox[props.row.name + '_' + user.label]"
                         :disabled="
-                          ((props?.row?.users || []).map((use) => use.login).length === 1 &&
-                          checkbox[props.row.name + '_' + user.label] === true) && (isApplicationManager || isUserManager)
+                          (props?.row?.users || []).map((use) => use.login).length === 1 &&
+                          checkbox[props.row.name + '_' + user.label] === true &&
+                          (isApplicationManager || isUserManager)
                         "
                         @input="updateListUsersInAuthorization(props.row, user.label, $event)"
                       >
@@ -591,8 +591,7 @@ export default {
     const { shallowRefArray: authorizations, doChangeArray: changeAuthorizations } = useArray();
     const { refBoolean: isApplicationManager, doChangeBoolean: changeIsApplicationManager } =
       useBoolean(false);
-    const { refBoolean: isUserManager, doChangeBoolean: changeIsUserManager } =
-      useBoolean(false);
+    const { refBoolean: isUserManager, doChangeBoolean: changeIsUserManager } = useBoolean(false);
     const { refBoolean: isDragging } = useBoolean(false);
     const { refBoolean: isCardModalActive } = useBoolean(false);
     const { refBoolean: hasAuthorizationsByUsers } = useBoolean(false);
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index cfe0c6242..21775ac48 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -593,7 +593,7 @@ export default {
     const ONE = Component.MULTIPLICITY_ONE;
 
     async function showModal() {
-      console.log()("coucu");
+      console.log("coucou");
     }
 
     return {
-- 
GitLab


From e10b1db25a16e1d57a7e03a573082ac91da377a2 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Wed, 27 Nov 2024 16:38:55 +0100
Subject: [PATCH 02/61] =?UTF-8?q?r=C3=A9paration=20filtre=20et=20ordre=20d?=
 =?UTF-8?q?e=20la=20liste=20des=20applications?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/locales/en.json                        |  1 +
 src/locales/fr.json                        |  1 +
 src/views/application/ApplicationsView.vue | 77 ++++++++++++----------
 3 files changed, 44 insertions(+), 35 deletions(-)

diff --git a/src/locales/en.json b/src/locales/en.json
index bcab112ce..fa5ab6d88 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -154,6 +154,7 @@
     "trier": "Sort by",
     "trierA_z": "Name A - z",
     "trierRecent": "Recent date",
+    "trierAncien": "Old date",
     "trierZ_a": "Name Z - a",
     "version": "The current version of the application <b class=\"has-text-primary\">{applicationName}</b> is <b class=\"has-text-primary\">{version}.</b>"
   },
diff --git a/src/locales/fr.json b/src/locales/fr.json
index 572e46eb4..437e417a6 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -153,6 +153,7 @@
     "trier": "Trier",
     "trierA_z": "Nom A - z",
     "trierRecent": "Date récente",
+    "trierAncien": "Date ancienne",
     "trierZ_a": "Nom Z - a",
     "version": "La version actuelle de l'application <b class=\"has-text-primary\">{applicationName}</b> est la version <b class=\"has-text-primary\">{version}.</b>"
   },
diff --git a/src/views/application/ApplicationsView.vue b/src/views/application/ApplicationsView.vue
index 76f0430a6..06916e892 100644
--- a/src/views/application/ApplicationsView.vue
+++ b/src/views/application/ApplicationsView.vue
@@ -34,31 +34,39 @@
             <div class="card-content">
               <div class="content">
                 <b-field class="columns">
-                  <b-checkbox
-                    v-model="checkboxDate"
-                    class="column"
-                    false-value="false"
-                    field="name"
-                    true-value="true"
-                    >{{ $t("applications.trierRecent") }}
-                  </b-checkbox>
+                  <b-radio
+                    v-model="alphabeticalOrDateSort"
+                    name="DateSort"
+                    native-value="0_9"
+                    @input="sortedApplicationsListForDate(applications, $event)"
+                  >
+                    {{ $t("applications.trierRecent") }}
+                  </b-radio>
+                  <b-radio
+                    v-model="alphabeticalOrDateSort"
+                    name="DateSort"
+                    native-value="9_0"
+                    @input="sortedApplicationsListForDate(applications, $event)"
+                  >
+                    {{ $t("applications.trierAncien") }}
+                  </b-radio>
                 </b-field>
               </div>
               <div class="content">
                 <b-field class="columns">
                   <b-radio
-                    v-model="alphabeticalSort"
-                    name="alphabeticalSort"
+                    v-model="alphabeticalOrDateSort"
+                    name="alphabeticalOrDateSort"
                     native-value="Az"
-                    @input="checkboxDate = false"
+                    @input="sortedApplicationsListForName(applications, $event)"
                   >
                     {{ $t("applications.trierA_z") }}
                   </b-radio>
                   <b-radio
-                    v-model="alphabeticalSort"
-                    name="alphabeticalSort"
+                    v-model="alphabeticalOrDateSort"
+                    name="alphabeticalOrDateSort"
                     native-value="Za"
-                    @input="checkboxDate = false"
+                    @input="sortedApplicationsListForName(applications, $event)"
                   >
                     {{ $t("applications.trierZ_a") }}
                   </b-radio>
@@ -168,23 +176,13 @@ export default {
     // filtre variable
     const filterName = useText().refText;
     const selected = useBoolean().refBoolean;
-    const alphabeticalSort = useText().refText;
+    const alphabeticalOrDateSort = useText().refText;
     const selectedApplications = computed(() => {
       let applicationsListOrderOrFilter = applications.value;
       if (filterName.value.length > 2)
         applicationsListOrderOrFilter = applicationsListOrderOrFilter.filter(
           (a) => a.localName.toString().toLowerCase().indexOf(filterName.value.toLowerCase()) >= 0
         );
-      applicationsListOrderOrFilter = sortedApplicationsListForDate(applicationsListOrderOrFilter);
-      if (alphabeticalSort.value === "Az") {
-        applicationsListOrderOrFilter = applicationsListOrderOrFilter.sort((a, b) =>
-          a.localName.localeCompare(b.localName)
-        );
-      } else if (alphabeticalSort.value === "Za") {
-        applicationsListOrderOrFilter = applicationsListOrderOrFilter
-          .sort((a, b) => a.localName.localeCompare(b.localName))
-          .reverse();
-      }
       return applicationsListOrderOrFilter;
     });
 
@@ -192,9 +190,8 @@ export default {
       loadApplications(["DATATYPE", "REFERENCETYPE", "CONFIGURATION", "ADDITIONALFILE"]);
     });
 
-    function sortedApplicationsListForDate(localApplications) {
-      let apps = applications.value || applications;
-      localApplications = apps.sort((a, b) => {
+    function sortedApplicationsListForDate(localApplications, event) {
+      localApplications = applications.value.sort((a, b) => {
         const localA = new Date(
           a.updateDate[0],
           a.updateDate[1] - 1,
@@ -213,15 +210,23 @@ export default {
           b.updateDate[5],
           b.updateDate[6] / 1000000
         );
-        return checkboxDate.value
+        return event === "0_9"
           ? localB.getTime() - localA.getTime()
           : localA.getTime() - localB.getTime();
       });
-      console.log(
-        "applicationsListOrderOrFilter in computed",
-        checkboxDate.value,
-        localApplications
-      );
+      return localApplications;
+    }
+
+    function sortedApplicationsListForName(localApplications, event) {
+      if (event === "Az") {
+        localApplications = localApplications.sort((a, b) =>
+          a.localName.localeCompare(b.localName)
+        );
+      } else if (event === "Za") {
+        localApplications = localApplications
+          .sort((a, b) => a.localName.localeCompare(b.localName))
+          .reverse();
+      }
       return localApplications;
     }
 
@@ -264,9 +269,11 @@ export default {
       loading,
       selectedName,
       checkboxDate,
-      alphabeticalSort,
+      alphabeticalOrDateSort,
       isCardModalActive,
       canCreateApplication,
+      sortedApplicationsListForDate,
+      sortedApplicationsListForName
     };
   },
 };
-- 
GitLab


From a85e1845ff5270f61cb02918de7f7a608a34820b Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Wed, 27 Nov 2024 18:18:43 +0100
Subject: [PATCH 03/61] Modification display Modification dataspatternlink

---
 .../common/provider/FiltersDataCollapse.vue    | 12 ++++++------
 src/components/datas/DatasLink.vue             | 11 +++++++----
 src/components/datas/DatasManyLink.vue         |  2 +-
 src/components/datas/DatasPatternLink.vue      | 13 +++++++------
 src/composable/data/dataLoader.js              | 18 +++++++++---------
 src/locales/en.json                            |  4 ++++
 src/locales/fr.json                            |  4 ++++
 src/model/authorization/Authorizations.js      |  4 ++--
 src/views/data/DataTableView.vue               |  2 +-
 src/views/data/DataVersioningView.vue          |  2 +-
 10 files changed, 42 insertions(+), 30 deletions(-)

diff --git a/src/components/common/provider/FiltersDataCollapse.vue b/src/components/common/provider/FiltersDataCollapse.vue
index 69353aaf9..d680ebabb 100644
--- a/src/components/common/provider/FiltersDataCollapse.vue
+++ b/src/components/common/provider/FiltersDataCollapse.vue
@@ -446,19 +446,19 @@ export default {
           if (listReferenceValueForAllReferences.value[columnsId].rows[i].naturalKey === value) {
             if (
               listReferenceValueForAllReferences.value[columnsId].rows[i].values[
-                "__display_default"
+                "display_default"
               ]
             ) {
               return listReferenceValueForAllReferences.value[columnsId].rows[i].values[
-                "__display_default"
+                "display_default"
               ];
             } else if (
               listReferenceValueForAllReferences.value[columnsId].rows[i].values[
-                "__display___display_" + services.internationalisationService.getLocale()
+                "display_" + services.internationalisationService.getLocale()
               ]
             ) {
               return listReferenceValueForAllReferences.value[columnsId].rows[i].values[
-                "__display___display_" + services.internationalisationService.getLocale()
+                "display_" + services.internationalisationService.getLocale()
               ];
             } else {
               return listReferenceValueForAllReferences.value[columnsId].rows[i].naturalKey;
@@ -477,10 +477,10 @@ export default {
         for (let i = 0; i < listReferenceValueForAllReferences.value[columnsId].rows.length; i++) {
           if (
             listReferenceValueForAllReferences.value[columnsId].rows[i].values[
-              "__display_default"
+              "display_default"
             ] === value ||
             listReferenceValueForAllReferences.value[columnsId].rows[i].values[
-              "__display___display_" + services.internationalisationService.getLocale()
+              "display_" + services.internationalisationService.getLocale()
             ] === value
           ) {
             return listReferenceValueForAllReferences.value[columnsId].rows[i].naturalKey;
diff --git a/src/components/datas/DatasLink.vue b/src/components/datas/DatasLink.vue
index f8a9beb89..924168666 100644
--- a/src/components/datas/DatasLink.vue
+++ b/src/components/datas/DatasLink.vue
@@ -39,11 +39,14 @@
                 :label="column.label"
               >
                 <span>
+                  <div v-if="typeof props.row[column.field]== 'boolean' ">
+                   {{  props.row[column.field] ?$t("boolean.true") : $t("boolean.false")}}
+                  </div>
                   <DatasDynamicLink
-                    v-if="!props.row[column.field].length && props.row[column.field].length !== 0"
+                    v-else-if="!props.row[column.field]?.length && props.row[column.field].length !== 0"
                     :application="application"
                     :column-id="column.id"
-                    :info="!props.row[column.field].length && props.row[column.field].length !== 0"
+                    :info="!props.row[column.field]?.length && props.row[column.field].length !== 0"
                     :info-values="props.row[column.field]"
                     :loaded-references-by-key="{}"
                     :reference-type="dynamicColumnReferences(props.row.colonne)"
@@ -77,7 +80,7 @@
                     :value="props.row.valeur"
                   ></DatasLink>
                   <p v-else-if="column.field === 'colonne'">
-                    {{ getColumnNameView(props.row[column.field], application, referenceType) }}
+                    {{ getColumnNameView(props.row[column.field], application, referenceType, column) }}
                   </p>
                   <p v-else>{{ props.row[column.field] }}</p>
                 </span>
@@ -161,7 +164,7 @@ export default {
       await getOrLoadReference();
       let refValues = reference.value.refValues;
       const data = Object.entries(refValues.refValue)
-        .filter((entry) => !entry[0].includes("display"))
+        .filter((entry) => !entry[0].startsWith("display_"))
         .map((entry) => ({ colonne: entry[0], valeur: entry[1] }))
         .reduce((acc, entry) => {
           acc.push(entry);
diff --git a/src/components/datas/DatasManyLink.vue b/src/components/datas/DatasManyLink.vue
index c095c63f4..9c052dcc4 100644
--- a/src/components/datas/DatasManyLink.vue
+++ b/src/components/datas/DatasManyLink.vue
@@ -150,7 +150,7 @@ export default {
         }
       }
       const data = Object.entries(refValues.refValue)
-        .filter((entry) => !entry[0].includes("display"))
+        .filter((entry) => !entry[0].startsWith("display_"))
         .map((entry) => ({ colonne: entry[0], valeur: entry[1] }))
         .reduce((acc, entry) => {
           acc.push(entry);
diff --git a/src/components/datas/DatasPatternLink.vue b/src/components/datas/DatasPatternLink.vue
index 6e45423ff..08271be52 100644
--- a/src/components/datas/DatasPatternLink.vue
+++ b/src/components/datas/DatasPatternLink.vue
@@ -49,7 +49,7 @@
                   :column-id="column.component.id"
                   :column-title="column.component.title"
                   :component="column.component"
-                  :display-value="'' + column.value"
+                  :display-value="''+column.value"
                   :loaded-references-by-key="{}"
                   :pattern-checker-date="
                     patternCheckerDateRef(
@@ -84,12 +84,12 @@ export default {
     value: Array,
     infoValues: {},
     loadedReferencesByKey: {
-      type: Object,
+      type: Object
     },
     dataId: String,
     info: Boolean,
     columnId: String,
-    patternCheckerDateRef: Function,
+    patternCheckerDateRef: Function
   },
   beforeCreate() {
     this.$options.components.DatasLink = require("./DatasLink.vue").default;
@@ -102,13 +102,15 @@ export default {
     function showBtnTablePatternColumn(tableDynamicColumn) {
       let showModal = Object.entries(tableDynamicColumn)
         .filter((a) => a[1])
-        .map(function (a) {
+        .map(function(a) {
           let obj = {};
           obj[a[0]] = a[1];
           return obj;
         });
       return showModal.length !== 0;
     }
+
+
     const columnName = computed(() => props.columnTitle.match(".*::(.*)")[1]);
 
     async function showModal() {
@@ -117,7 +119,6 @@ export default {
       isLoading.value = false;
       return props.value;
     }
-
     return {
       columnName,
       isLoading,
@@ -125,7 +126,7 @@ export default {
       showBtnTablePatternColumn,
       showModal,
     };
-  },
+  }
 };
 </script>
 .modal-high-z-index { z-index: 9999 !important; position: absolute; }
diff --git a/src/composable/data/dataLoader.js b/src/composable/data/dataLoader.js
index 1ac66ebdc..46cf14601 100644
--- a/src/composable/data/dataLoader.js
+++ b/src/composable/data/dataLoader.js
@@ -45,39 +45,39 @@ export function dataLoader(services) {
     if (!referenceLocal?.values) {
       return "";
     }
-    if (referenceLocal.values["__display_" + services.internationalisationService.getLocale()]) {
-      return referenceLocal.values["__display_" + services.internationalisationService.getLocale()];
+    if (referenceLocal.values["display_" + services.internationalisationService.getLocale()]) {
+      return referenceLocal.values["display_" + services.internationalisationService.getLocale()];
     }
     if (
       referenceLocal.values[
-        "__display___display_" + services.internationalisationService.getLocale()
+        "display_" + services.internationalisationService.getLocale()
       ]
     ) {
       return referenceLocal.values[
-        "__display___display_" + services.internationalisationService.getLocale()
+        "display_" + services.internationalisationService.getLocale()
       ];
     }
     if (
       application &&
       referenceLocal.values[
-        "__display_" + application.configuration.applicationDescription.defaultLanguage
+        "display_" + application.configuration.applicationDescription.defaultLanguage
       ]
     ) {
       return referenceLocal.values[
-        "__display_" + application.configuration.applicationDescription.defaultLanguage
+        "display_" + application.configuration.applicationDescription.defaultLanguage
       ];
     }
     if (
       application &&
       referenceLocal.values[
-        "__display___display_" + application.configuration.applicationDescription.defaultLanguage
+        "display_" + application.configuration.applicationDescription.defaultLanguage
       ]
     ) {
       return referenceLocal.values[
-        "__display___display_" + application.configuration.applicationDescription.defaultLanguage
+        "display_" + application.configuration.applicationDescription.defaultLanguage
       ];
     } else {
-      return referenceLocal.values["__display_default"];
+      return referenceLocal.values["display_default"];
     }
   };
 
diff --git a/src/locales/en.json b/src/locales/en.json
index bcab112ce..b8cbdd8f6 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -1,4 +1,8 @@
 {
+  "boolean":{
+    "true": "TRUE",
+    "false": "FALSE"
+  },
   "additionalFiles": {
     "additionalFile": "Additional file",
     "alert": {
diff --git a/src/locales/fr.json b/src/locales/fr.json
index 572e46eb4..858b8b4cc 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -1,4 +1,8 @@
 {
+  "boolean":{
+    "true": "Vrai",
+    "false": "Faux"
+  },
   "additionalFiles": {
     "additionalFile": "FichierAdditionel",
     "alert": {
diff --git a/src/model/authorization/Authorizations.js b/src/model/authorization/Authorizations.js
index 400879ff3..fedae85fc 100644
--- a/src/model/authorization/Authorizations.js
+++ b/src/model/authorization/Authorizations.js
@@ -517,8 +517,8 @@ export class Authorizations {
       Authorizations.internationalizationService.getUserPrefLocale();
       let lang = localStorage.getItem(LOCAL_STORAGE_LANG);
       let localName; // = refValues.referenceValues.find((r) => r.naturalKey == key);
-      if (localName?.values?.["__display_" + lang]) {
-        localName = localName?.values?.["__display_" + lang];
+      if (localName?.values?.["display_" + lang]) {
+        localName = localName?.values?.["display_" + lang];
       } else {
         localName = key;
       }
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index cfe0c6242..90d47f152 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -133,7 +133,7 @@
               v-else-if="column.id !== '#'"
               :application="application"
               :column-id="getRefColumnId(props.row, column)"
-              :column-title="getColumnNameView(column.id, application, dataId)"
+              :column-title="getColumnNameView(column.id, application, dataId, column)"
               :component="props.row"
               :display-value="'' + column.getDisplayValue(props.row, column)"
               :loaded-references-by-key="{}"
diff --git a/src/views/data/DataVersioningView.vue b/src/views/data/DataVersioningView.vue
index 3d0fc6c49..9087f62c4 100644
--- a/src/views/data/DataVersioningView.vue
+++ b/src/views/data/DataVersioningView.vue
@@ -874,7 +874,7 @@ export default {
         let localName = refValues.rows.find(
           (r) => r.hierarchicalKey === newCurrentPath || r.naturalKey === key.split("K").pop()
         );
-        // TODO passé par la constante de l'application pour "__display_" plus tard (en attente de réparation de philippe
+        // TODO passé par la constante de l'application pour "display_" plus tard (en attente de réparation de philippe
         let naturalKey = localName.naturalKey;
         localName = getValueDisplay(localName, application);
         if (!localName) {
-- 
GitLab


From c5205bf356e5f41fa6be44bb9124c7273a4540cb Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Thu, 28 Nov 2024 11:16:07 +0100
Subject: [PATCH 04/61] Ajout configFile a applicationResult

---
 src/model/ApplicationResult.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/model/ApplicationResult.js b/src/model/ApplicationResult.js
index 73777bae5..069e6b4ba 100644
--- a/src/model/ApplicationResult.js
+++ b/src/model/ApplicationResult.js
@@ -6,6 +6,7 @@ export class ApplicationResult {
   localDescription;
   creationDate;
   updateDate;
+  configFile;
   name;
   title;
   comment;
-- 
GitLab


From 7b851f5e6000e5c9f644f9ae00824715ef0e1c7b Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Thu, 28 Nov 2024 14:09:06 +0100
Subject: [PATCH 05/61] suppression de variable non utile dans
 applicationCreationView.vue

---
 src/views/application/ApplicationCreationView.vue | 12 ------------
 1 file changed, 12 deletions(-)

diff --git a/src/views/application/ApplicationCreationView.vue b/src/views/application/ApplicationCreationView.vue
index a873691c2..b93c1499d 100644
--- a/src/views/application/ApplicationCreationView.vue
+++ b/src/views/application/ApplicationCreationView.vue
@@ -207,7 +207,6 @@ export default {
     let disabled = useBoolean().refBoolean;
     let counter = useNumber(1).refNumber;
     let isLoading = computed(() => counter.value === 0);
-    let regExp = /^[a-zA-Z]+$/;
 
     async function saveApplication(status) {
       counter.value = 0;
@@ -258,10 +257,6 @@ export default {
       await saveApplication("validate");
     }
 
-    function validNameApplication(name) {
-      return regExp.test(name);
-    }
-
     function showHelp() {
       let routeData = app.$router.resolve("/help");
       window.open(routeData.href, "_blank");
@@ -279,12 +274,6 @@ export default {
     function parseResultChunck(chunk, caller) {
       const response = chunk.result;
       if ("validate" === caller && response.name) {
-        console.log(
-          testStringWithRegexArray(
-            response.configuration.applicationDescription.name.toLowerCase(),
-            currentUser.authorizations
-          )
-        );
         if (
           response.configuration.applicationDescription.name.length < 44 &&
           (currentUser.authorizations.includes(
@@ -402,7 +391,6 @@ export default {
 
     return {
       createApplication,
-      validNameApplication,
       changeConfiguration,
       showHelp,
       testApplication,
-- 
GitLab


From 7a5434626b4777663912a2d8f23a09cf34291998 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Thu, 28 Nov 2024 16:48:38 +0100
Subject: [PATCH 06/61] =?UTF-8?q?r=C3=A9paration=20des=20display=20pour=20?=
 =?UTF-8?q?many=20et=20dataLink?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/components/datas/DatasLink.vue     |  2 +-
 src/components/datas/DatasManyLink.vue | 43 ++++++++++++++++----------
 src/composable/data/dataLoader.js      | 26 +++-------------
 src/model/application/Component.js     | 10 ------
 src/views/data/DataTableView.vue       |  3 +-
 5 files changed, 34 insertions(+), 50 deletions(-)

diff --git a/src/components/datas/DatasLink.vue b/src/components/datas/DatasLink.vue
index 924168666..7381d00ce 100644
--- a/src/components/datas/DatasLink.vue
+++ b/src/components/datas/DatasLink.vue
@@ -24,7 +24,7 @@
               reference
                 ? reference.localName !== value
                   ? getValueDisplay(reference.rows[0], application)
-                  : reference.localName
+                  : displayValue
                 : value
             }}
           </p>
diff --git a/src/components/datas/DatasManyLink.vue b/src/components/datas/DatasManyLink.vue
index 9c052dcc4..d46d4873f 100644
--- a/src/components/datas/DatasManyLink.vue
+++ b/src/components/datas/DatasManyLink.vue
@@ -8,8 +8,8 @@
           :application="application"
           :column-id="val.columnName"
           :display-value="
-            displaysForRow?.[referenceType]?.[val] && typeof val !== 'number'
-              ? displaysForRow?.[referenceType]?.[val]
+            displayValuesByReferenceAndValue[referenceType + '_' + val] && typeof val !== 'number'
+              ? displayValuesByReferenceAndValue[referenceType + '_' + val]
               : val.toString()
           "
           :loaded-references-by-key="{}"
@@ -62,8 +62,8 @@
 import services from "@/composable/services";
 import DatasLink from "@/components/datas/DatasLink.vue";
 import DatasDynamicLink from "@/components/datas/DatasDynamicLink.vue";
-import { datePatternLang } from "../../composable/application/DatePattern";
-import { computed } from "vue";
+import { datePatternLang } from "@/composable/application/DatePattern";
+import { computed, inject, onMounted, ref } from "vue";
 
 export default {
   name: "DatasManyLink",
@@ -99,7 +99,28 @@ export default {
     let refValues = { active: false };
     let isCardModalActive = false;
     let modalArrayObj = {};
+    const displayValuesByReferenceAndValue = ref({});
     const dataService = services.dataService;
+    const { getValueDisplay, getOrLoadDataByNaturalKey } = inject("reference:dataLoader");
+
+    onMounted(async () => {
+      const newValues = {};
+      for (let value of props.infoValues) {
+        if (
+          !Object.keys(displayValuesByReferenceAndValue).includes(props.referenceType + "_" + value)
+        ) {
+          let ref = await getOrLoadDataByNaturalKey(props.application, props.referenceType, value);
+          newValues[props.referenceType + "_" + value] = getValueDisplay(
+            ref.values,
+            props.application
+          );
+        }
+      }
+      displayValuesByReferenceAndValue.value = {
+        ...displayValuesByReferenceAndValue.value,
+        ...newValues,
+      };
+    });
 
     const applicationName = computed(() => {
       return props.application.name;
@@ -180,17 +201,6 @@ export default {
       return localRefValues;
     }
 
-    function showBtnTablDynamicColumn(tablDynamicColumn) {
-      let showModal = Object.entries(tablDynamicColumn)
-        .filter((a) => a[1])
-        .map(function (a) {
-          let obj = {};
-          obj[a[0]] = a[1];
-          return obj;
-        });
-      return showModal.length !== 0;
-    }
-
     function showModal() {
       isCardModalActive = true;
       modalArrayObj = Object.entries(this.infoValues)
@@ -217,7 +227,7 @@ export default {
       datePatternLang,
       dynamicColumnReferences,
       openReferenceDetail,
-      showBtnTablDynamicColumn,
+      displayValuesByReferenceAndValue,
       showModal,
       refValues,
       dataService,
@@ -225,6 +235,7 @@ export default {
       modalArrayObj,
       applicationName,
       columnTitle,
+      getValueDisplay,
     };
   },
 };
diff --git a/src/composable/data/dataLoader.js b/src/composable/data/dataLoader.js
index 46cf14601..1ab096794 100644
--- a/src/composable/data/dataLoader.js
+++ b/src/composable/data/dataLoader.js
@@ -8,9 +8,10 @@ export function dataLoader(services) {
     if (reference) {
       return reference;
     }
-    if (typeof key === "string")
-      reference = await dataService.getDataByNaturalKey(applicationName, referenceName, key);
-    if (!reference) {
+    try {
+      if (typeof key === "string")
+        reference = await dataService.getDataByNaturalKey(applicationName, referenceName, key);
+    } catch (e) {
       return null;
     }
     reference = {
@@ -48,25 +49,6 @@ export function dataLoader(services) {
     if (referenceLocal.values["display_" + services.internationalisationService.getLocale()]) {
       return referenceLocal.values["display_" + services.internationalisationService.getLocale()];
     }
-    if (
-      referenceLocal.values[
-        "display_" + services.internationalisationService.getLocale()
-      ]
-    ) {
-      return referenceLocal.values[
-        "display_" + services.internationalisationService.getLocale()
-      ];
-    }
-    if (
-      application &&
-      referenceLocal.values[
-        "display_" + application.configuration.applicationDescription.defaultLanguage
-      ]
-    ) {
-      return referenceLocal.values[
-        "display_" + application.configuration.applicationDescription.defaultLanguage
-      ];
-    }
     if (
       application &&
       referenceLocal.values[
diff --git a/src/model/application/Component.js b/src/model/application/Component.js
index 22838f577..9843901ba 100644
--- a/src/model/application/Component.js
+++ b/src/model/application/Component.js
@@ -54,16 +54,6 @@ export class Component {
     return row.values[this.id];
   }
 
-  getDisplayValue = function (row) {
-    let columnValue = this.getColumnValue(row);
-    let displaysForRow = row.displaysForRow?.[this.refLinkedTo]?.[row.values[this.id]];
-    if (displaysForRow && typeof columnValue !== "number") {
-      return displaysForRow;
-    } else {
-      return "" + columnValue;
-    }
-  };
-
   order() {
     let order = (this.tags || []).find(
       (tag) => tag.tagDefinition === "ORDER_TAG" || tag.type === "ORDER_TAG"
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index ded9b3355..8d71eba45 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -135,7 +135,7 @@
               :column-id="getRefColumnId(props.row, column)"
               :column-title="getColumnNameView(column.id, application, dataId, column)"
               :component="props.row"
-              :display-value="'' + column.getDisplayValue(props.row, column)"
+              :display-value="'' + loader.getValueDisplay(props.row, application)"
               :loaded-references-by-key="{}"
               :pattern-checker-date="patternCheckerDateRef(application, column.title, dataId)"
               :reference-type="column.refLinkedTo"
@@ -634,6 +634,7 @@ export default {
       patternCheckerDateRef,
       totalRows,
       tableHeight,
+      loader,
     };
   },
 };
-- 
GitLab


From d0cc1462193b440b88ae7c159aa63d540adde080 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Fri, 29 Nov 2024 11:32:04 +0100
Subject: [PATCH 07/61] Correction de l'affichage de l'ordre des nodes dans le
 front

---
 src/views/data/DatasManagementView.vue | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/views/data/DatasManagementView.vue b/src/views/data/DatasManagementView.vue
index e71611387..89e18d6b3 100644
--- a/src/views/data/DatasManagementView.vue
+++ b/src/views/data/DatasManagementView.vue
@@ -148,7 +148,9 @@ export default {
         tags &&
         Object.keys(tags || {}).length !== 0 &&
         !(Object.keys(tags || {}).length === 1 && Object.keys(tags).includes(Tag.NO_TAG_NAME));
-      changeDatasToBeShown(services.tagService.toBeShown(tags, datas.value));
+      let sortedData = application.configuration.hierarchicalNodes.map(node=>node.nodeName)
+        .map(nodeName=>datas.value.find(data=>data.id===nodeName)).filter(node=>node);
+      changeDatasToBeShown(services.tagService.toBeShown(tags, sortedData));
     };
 
     function changeAllValueTags(allTags) {
-- 
GitLab


From 6c36b92cb644e491831a641f622d4539cf83100f Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Fri, 29 Nov 2024 16:03:19 +0100
Subject: [PATCH 08/61] Ajout d'un tri sur les own applications

---
 src/App.vue                                 |  4 ++
 src/composable/applications/applications.js | 20 +++++++--
 src/locales/en.json                         |  1 +
 src/locales/fr.json                         |  1 +
 src/views/application/ApplicationsView.vue  | 45 +++++++++------------
 5 files changed, 42 insertions(+), 29 deletions(-)

diff --git a/src/App.vue b/src/App.vue
index 6f5f29edb..6046831c9 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -13,6 +13,10 @@ export default {
   setup() {
     provide("application:progress", loadApplications().progress);
     provide("application:applications", loadApplications().applications);
+    provide("application:ownApplications", loadApplications().ownApplications);
+    provide("application:hasOwnApplications", loadApplications().hasOwnApplications);
+    provide("application:showOwnApplications", loadApplications().showOwnApplications);
+    provide("application:otherApplications", loadApplications().otherApplications);
     provide("application:loadApplications", loadApplications().loadApplications);
   },
 };
diff --git a/src/composable/applications/applications.js b/src/composable/applications/applications.js
index d6fa4ab7e..39c42f255 100644
--- a/src/composable/applications/applications.js
+++ b/src/composable/applications/applications.js
@@ -2,8 +2,13 @@ import services from "@/composable/services";
 import useArray from "@/composable/components/array";
 import { Application } from "@/model/application/Application";
 import useNumber from "@/composable/components/number";
+import useBoolean from "@/composable/components/boolean";
 
 const { shallowRefArray: applications } = useArray();
+const { shallowRefArray: ownApplications } = useArray();
+const { refBoolean: hasOwnApplications } = useBoolean();
+const { refNumber: showOwnApplications } = useNumber();
+const { shallowRefArray: otherApplications } = useArray();
 const { refNumber: progress } = useNumber(0);
 
 function addApplication(result) {
@@ -18,25 +23,32 @@ function addApplication(result) {
       .map((a, i) => (a.name === application.name ? i : -1))
       .find((i) => i >= 0);
     let localApplication = applications.value;
-    console.log("localApplication", localApplication);
     if (id >= 0) {
       localApplication[id] = application;
     } else {
       localApplication.push(application);
     }
-    application.value = localApplication;
+    ownApplications.value = localApplication.filter(app => app.isApplicationUser());
+    otherApplications.value = localApplication.filter(app => !app.isApplicationUser());
+    hasOwnApplications.value = ownApplications.value.length > 0;
+    showOwnApplications.value = hasOwnApplications.value ? 0 : 1;
+    applications.value = localApplication;
   }
 }
 
-function loadApplications(filter) {
-  services.applicationService.getApplications(addApplication, filter);
+async function loadApplications(filter) {
+  await services.applicationService.getApplications(addApplication, filter);
 }
 
 function useApplication() {
   return {
     progress,
     applications,
+    ownApplications,
+    otherApplications,
     loadApplications,
+    hasOwnApplications,
+    showOwnApplications
   };
 }
 
diff --git a/src/locales/en.json b/src/locales/en.json
index b8cbdd8f6..c04176e1c 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -970,6 +970,7 @@
     "application-creation": "Application creation",
     "application-update": "Application update {name}",
     "applications-page": "My applications",
+    "applications-page-nothing": "No application",
     "applications-page-other": "Other applications",
     "authorization-application-creator-management": "Management of application creation rights",
     "authorization-application-management": "Managing management rights for the application: {name}",
diff --git a/src/locales/fr.json b/src/locales/fr.json
index 858b8b4cc..97953b6c1 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -979,6 +979,7 @@
     "application-creation": "Créer une application",
     "application-update": "Mise à jour de l'application {name}",
     "applications-page": "Mes applications",
+    "applications-page-nothing": "Aucune application",
     "applications-page-other": "Autres applications",
     "authorization-application-creator-management": "Gestion des droits de création des applications",
     "authorization-application-management": "Gestion des droits de gestion pour l'application : {name}",
diff --git a/src/views/application/ApplicationsView.vue b/src/views/application/ApplicationsView.vue
index c89943fa9..4b8cbfe3d 100644
--- a/src/views/application/ApplicationsView.vue
+++ b/src/views/application/ApplicationsView.vue
@@ -5,6 +5,14 @@
         showOwnApplications ? $t("titles.applications-page") : $t("titles.applications-page-other")
       }}
     </h1>
+    <b-tabs v-model="showOwnApplications" position="is-centered"
+            v-if="ownApplications.length+otherApplications.length">
+      <b-tab-item :disabled="ownApplications.length==0"
+                  :label=" $t('titles.applications-page')" />
+      <b-tab-item :disabled="otherApplications.length==0"
+                  :label=" $t('titles.applications-page-other')" />
+    </b-tabs>
+    <h3 class="subtitle">{{ $t("titles.applications-page-nothing") }}</h3>
 
     <div class="columns columnPrincipale">
       <div class="column is-3-widescreen is-12-desktop">
@@ -41,7 +49,7 @@
                     field="name"
                     true-value="true"
                     @input="alphabeticalSort = ''"
-                    >{{ $t("applications.trierRecent") }}
+                  >{{ $t("applications.trierRecent") }}
                   </b-checkbox>
                 </b-field>
               </div>
@@ -139,7 +147,7 @@ import LoadingAnimate from "@/components/common/LoadingAnimate.vue";
 import services from "@/composable/services";
 import useBoolean from "@/composable/components/boolean";
 import useText from "@/composable/components/text";
-import { computed, onMounted, inject, ref } from "vue";
+import { computed, onMounted, inject } from "vue";
 import { useRedirections } from "@/composable/applications/useFunction";
 import ApplicationCard from "@/components/application/ApplicationCard.vue";
 import useNumber from "@/composable/components/number";
@@ -151,6 +159,10 @@ export default {
     const { createApplication, updateApplication, displayAdditionalFilesManagement } =
       useRedirections();
     const applications = inject("application:applications");
+    const ownApplications = inject("application:ownApplications");
+    const showOwnApplications = inject("application:showOwnApplications");
+    const hasOwnApplications = inject("application:hasOwnApplications");
+    const otherApplications = inject("application:otherApplications");
     const progress = inject("application:progress");
     const loadApplications = inject("application:loadApplications");
     const checkboxDate = useBoolean().refBoolean;
@@ -171,7 +183,9 @@ export default {
     const selected = useBoolean().refBoolean;
     const alphabeticalSort = useText().refText;
     const selectedApplications = computed(() => {
-      let sa = applications && applications.value;
+      let sa = showOwnApplications.value == 0 ?
+        ownApplications?.value :
+        otherApplications?.value;
       if (filterName.value.length > 2)
         sa = sa.filter(
           (a) => a.localName.toString().toLowerCase().indexOf(filterName.value.toLowerCase()) >= 0
@@ -189,28 +203,9 @@ export default {
     onMounted(async () => {
       loadApplications(["DATATYPE", "REFERENCETYPE", "CONFIGURATION", "ADDITIONALFILE"]);
     });
-
-    const ownApplications = computed(() => {
-      return applications.value.filter((application) => application.isApplicationUser());
-    });
-
-    const otherApplications = computed(() => {
-      return applications.value.filter((application) => !application.isApplicationUser());
-    });
-    const hasOwnApplications = computed(() => {
-      return ownApplications?.value.length;
-    });
-
-    const hasOtherApplications = computed(() => {
-      return otherApplications?.value.length;
-    });
-
-    const showOwnApplications = ref(hasOwnApplications);
-
     return {
-      hasOwnApplications,
-      hasOtherApplications,
       ownApplications,
+      hasOwnApplications,
       otherApplications,
       showOwnApplications,
       applications,
@@ -231,9 +226,9 @@ export default {
       checkboxDate,
       alphabeticalSort,
       isCardModalActive,
-      canCreateApplication,
+      canCreateApplication
     };
-  },
+  }
 };
 </script>
 
-- 
GitLab


From eb1887e144dcd2c1a2b15b97d53e52f218a68f34 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Fri, 29 Nov 2024 17:58:48 +0100
Subject: [PATCH 09/61] =?UTF-8?q?Gestion=20du=20conflit=20de=20tentative?=
 =?UTF-8?q?=20de=20cr=C3=A9ation=20d'une=20application=20existante?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/composable/applications/useFunction.js     |  8 ++++++--
 src/locales/en.json                            |  1 +
 src/locales/fr.json                            |  1 +
 src/router/index.js                            |  3 ++-
 .../application/ApplicationCreationView.vue    | 18 ++++++++++++++++--
 src/views/application/ApplicationsView.vue     |  2 +-
 6 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/src/composable/applications/useFunction.js b/src/composable/applications/useFunction.js
index 1324417bb..f29f7a08c 100644
--- a/src/composable/applications/useFunction.js
+++ b/src/composable/applications/useFunction.js
@@ -11,8 +11,12 @@ export function useRedirections(application = { authorizations: [] }) {
   /*
     limited to applicationCreator
      */
-  function createApplication() {
-    return canCreateApplication() && app.$router.push("/applicationCreation");
+  function createApplication(applicationNames) {
+    console.log(applicationNames);
+    return canCreateApplication() && app.$router.push({
+      path: '/applicationCreation',
+      query: { applicationNames: applicationNames }
+    });;
   }
 
   /*
diff --git a/src/locales/en.json b/src/locales/en.json
index c04176e1c..a14e964de 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -108,6 +108,7 @@
     "revoke-authorization": "Authorization revoked",
     "server-error": "A server error occured",
     "server-error-appli-exist": "This application's {name} exist for the version : {version}",
+    "server-error-appli-exist-on-creation": "The application name {applicationName} you're using already exists. Depending on your situation and your privileges, please choose another application name or update the existing one.",
     "server-error-appli-no-exist": "You do not have rights for this application's <code>{name}</code> or does not exist.",
     "user-email-updated": "Your email has been updated successfully. ",
     "user-pwd-updated": "Your password has been updated successfully. ",
diff --git a/src/locales/fr.json b/src/locales/fr.json
index 97953b6c1..543750dcf 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -108,6 +108,7 @@
     "revoke-authorization": "Autorisation révoquée",
     "server-error": "Une erreur serveur est survenue",
     "server-error-appli-exist": "L'application {name} existe déjà en version : {version}",
+    "server-error-appli-exist-on-creation": "Le nom  {applicationName} de l'application que vous utilisez existe déjà. Selon votre situation et vos droits, veuillez choisir un autre nom d'application ou bien mettre à jour l'application existante",
     "server-error-appli-no-exist": "Vous n'avez pas les droits pour l'application <code>{name}</code> ou n'existe pas.",
     "user-email-updated": "Votre email vient d'être mis à jour avec succès. ",
     "user-pwd-updated": "Votre mot de passe vient d'être mis à jour avec succès. ",
diff --git a/src/router/index.js b/src/router/index.js
index f24d808d5..9175d8eae 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -87,7 +87,8 @@ const routes = [
     path: "/applicationCreation",
     name: "Application creation",
     component: ApplicationCreationView,
-    props: true,
+    props: (route) =>
+      ({ applicationNames: route.query.applicationNames })
   },
   {
     path: "/authorizationsManagementForApplicationCreator",
diff --git a/src/views/application/ApplicationCreationView.vue b/src/views/application/ApplicationCreationView.vue
index a873691c2..62bbf1136 100644
--- a/src/views/application/ApplicationCreationView.vue
+++ b/src/views/application/ApplicationCreationView.vue
@@ -108,6 +108,7 @@
                     {{ $t("validation.obligatoire") }}
                   </span>
                 </template>
+
                 <b-input
                   v-model="applicationConfig.name"
                   :placeholder="$t('applications.name-placeholder')"
@@ -181,6 +182,9 @@ import { computed, watch } from "vue";
 export default {
   name: "ApplicationCreationView",
   props: {
+    applicationNames: {
+      type: Array,
+    },
     applicationName: {
       type: String,
       default: "",
@@ -236,7 +240,9 @@ export default {
             );
             break;
           case "validate":
-            method = (chunk) => parseChunck(chunk, "validate", canBeShowAndReturnErrorsMessage);
+            method = (chunk) =>
+              parseChunck(chunk, "validate", canBeShowAndReturnErrorsMessage
+              );
             await services.applicationService.validateConfiguration(method, applicationConfig);
             break;
         }
@@ -315,7 +321,15 @@ export default {
                 version: props.applicationVersion,
               })
             );
-          } else {
+          } else if(props.applicationNames?.includes(applicationConfig.name)) {
+            disabled.value = true;
+            services.alertService.toastError(
+              i18n.t("alert.server-error-appli-exist-on-creation", {
+                applicationName: applicationConfig.name,
+              })
+            );
+
+          }else{
             services.alertService.toastSuccess(i18n.t("alert.application-validate-success"));
           }
         } else {
diff --git a/src/views/application/ApplicationsView.vue b/src/views/application/ApplicationsView.vue
index 4b8cbfe3d..124ae3c98 100644
--- a/src/views/application/ApplicationsView.vue
+++ b/src/views/application/ApplicationsView.vue
@@ -23,7 +23,7 @@
               role="button"
               style="margin-bottom: 50px"
               tabindex="0"
-              @click="createApplication"
+              @click="createApplication((applications || []).map(a=>a.name))"
             >
               <a class="card-header-icon createApplication">
                 <b-icon icon="plus"></b-icon>
-- 
GitLab


From efbb6c68506c8027f537114869474896f5da6950 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Mon, 2 Dec 2024 15:15:17 +0100
Subject: [PATCH 10/61] =?UTF-8?q?suppression=20des=20console.log=20oubli?=
 =?UTF-8?q?=C3=A9=20lors=20des=20commits=20pr=C3=A9c=C3=A9dent?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/components/common/provider/FieldsForm.vue                  | 1 -
 src/composable/applications/useFunction.js                     | 1 -
 src/views/application/ApplicationCreationView.vue              | 1 -
 .../authorizations/AuthorizationsRightsRequestInfoView.vue     | 3 ---
 src/views/authorizations/DataTypeAuthorizationInfoView.vue     | 1 -
 5 files changed, 7 deletions(-)

diff --git a/src/components/common/provider/FieldsForm.vue b/src/components/common/provider/FieldsForm.vue
index 88cacaf1f..45a904c04 100644
--- a/src/components/common/provider/FieldsForm.vue
+++ b/src/components/common/provider/FieldsForm.vue
@@ -146,7 +146,6 @@ export default {
         }
       }
       referencesScopes.value = newReferencesScopes;
-      console.log(props.fields);
     });
 
     function onSubmit(event) {
diff --git a/src/composable/applications/useFunction.js b/src/composable/applications/useFunction.js
index f29f7a08c..7233c55ac 100644
--- a/src/composable/applications/useFunction.js
+++ b/src/composable/applications/useFunction.js
@@ -12,7 +12,6 @@ export function useRedirections(application = { authorizations: [] }) {
     limited to applicationCreator
      */
   function createApplication(applicationNames) {
-    console.log(applicationNames);
     return canCreateApplication() && app.$router.push({
       path: '/applicationCreation',
       query: { applicationNames: applicationNames }
diff --git a/src/views/application/ApplicationCreationView.vue b/src/views/application/ApplicationCreationView.vue
index 35603560d..f2b6647cc 100644
--- a/src/views/application/ApplicationCreationView.vue
+++ b/src/views/application/ApplicationCreationView.vue
@@ -221,7 +221,6 @@ export default {
         switch (status) {
           case "create":
             method = (chunk) => {
-              console.log(chunk);
               return parseChunck(chunk, "create", canBeShowAndReturnErrorsMessage);
             };
             await services.applicationService.createApplication(
diff --git a/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue b/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
index b7717db6f..3f4e85884 100644
--- a/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
+++ b/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
@@ -148,7 +148,6 @@ export default {
     const { shallowRefArray: subMenuPaths, doChangeArray: changeSubMenuPaths } = useArray();
     const isLoading = ref(false);
     const authenticatedUser = services.loginService.getAuthenticatedUser();
-    console.log(authenticatedUser);
     const canCreateApplication = false;
     const datatypes = ref({ withScope: {}, withoutScope: {} });
     const references = ref({ withScope: {}, withoutScope: {} });
@@ -315,7 +314,6 @@ export default {
       changeApplication(
         services.internationalisationService.mergeInternationalization(getApplication)
       );
-      console.log("application in get application", application);
       changeConfiguration(application.configuration);
       datas.value = Object.keys(application.data).reduce((acc, data) => {
         acc[data] = {
@@ -556,7 +554,6 @@ export default {
     };
 
     async function createRequest(isSetted) {
-      console.log("createRequest isSetted", isSetted);
       if (!valid) {
         return;
       }
diff --git a/src/views/authorizations/DataTypeAuthorizationInfoView.vue b/src/views/authorizations/DataTypeAuthorizationInfoView.vue
index 056313fe0..70de801f9 100644
--- a/src/views/authorizations/DataTypeAuthorizationInfoView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationInfoView.vue
@@ -450,7 +450,6 @@ export default {
     function createOrUpdateAuthorization() {
       try {
         const authorizations = buildAuthorization();
-        console.log("createOrUpdateAuthorization authorizations:", authorizations);
         services.authorizationService.createAuthorization(props.applicationName, authorizations);
         app.$router.push(`/applications/${props.applicationName}/authorizations`);
       } catch (e) {
-- 
GitLab


From 51d650f146000c9376d332b3c75c0854ae67ce56 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Mon, 2 Dec 2024 14:03:22 +0100
Subject: [PATCH 11/61] un oublie

---
 src/views/authorizations/AuthorizationsRightsRequestInfoView.vue | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue b/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
index 3f4e85884..1f0d378c7 100644
--- a/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
+++ b/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
@@ -147,7 +147,6 @@ export default {
     );
     const { shallowRefArray: subMenuPaths, doChangeArray: changeSubMenuPaths } = useArray();
     const isLoading = ref(false);
-    const authenticatedUser = services.loginService.getAuthenticatedUser();
     const canCreateApplication = false;
     const datatypes = ref({ withScope: {}, withoutScope: {} });
     const references = ref({ withScope: {}, withoutScope: {} });
-- 
GitLab


From 92611ed742615c83d215852451cee2649c051cd8 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Mon, 2 Dec 2024 15:48:49 +0100
Subject: [PATCH 12/61] =?UTF-8?q?r=C3=A9paration=20display=20mais=20pas=20?=
 =?UTF-8?q?abs=20des=20displays=20dans=20"displaysForRow"=20par=20naturalK?=
 =?UTF-8?q?ey?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/model/application/Component.js | 16 +++++++++++++---
 src/views/data/DataTableView.vue   |  2 +-
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/model/application/Component.js b/src/model/application/Component.js
index 9843901ba..a8ceea7a7 100644
--- a/src/model/application/Component.js
+++ b/src/model/application/Component.js
@@ -54,6 +54,16 @@ export class Component {
     return row.values[this.id];
   }
 
+  getDisplayValue = function (row) {
+    let columnValue = this.getColumnValue(row);
+    let displaysForRow = row.displaysForRow?.[this.refLinkedTo]?.[row.values[this.id]];
+    if (displaysForRow && typeof columnValue !== "number") {
+      return displaysForRow;
+    } else {
+      return "" + columnValue;
+    }
+  };
+
   order() {
     let order = (this.tags || []).find(
       (tag) => tag.tagDefinition === "ORDER_TAG" || tag.type === "ORDER_TAG"
@@ -97,8 +107,8 @@ export class Component {
           getInternationalizedColumn(
             referenceName,
             component.patternColumnComponents[patternColumnComponent].exportHeader ||
-              component.patternColumnComponents[patternColumnComponent].exportHeaderName ||
-              component.patternColumnComponents[patternColumnComponent].componentKey,
+            component.patternColumnComponents[patternColumnComponent].exportHeaderName ||
+            component.patternColumnComponents[patternColumnComponent].componentKey,
             application
           );
       }
@@ -291,7 +301,7 @@ class PatternComponent extends Component {
         column: col.id,
         columnName,
         value: value[col.id],
-        id: col.id,
+        id: col.id
       };
       returnValue[col.id] = value[col.id];
       return returnValue;
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index 8d71eba45..bfb0bfc92 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -135,7 +135,7 @@
               :column-id="getRefColumnId(props.row, column)"
               :column-title="getColumnNameView(column.id, application, dataId, column)"
               :component="props.row"
-              :display-value="'' + loader.getValueDisplay(props.row, application)"
+              :display-value="'' + column.getDisplayValue(props.row, column)"
               :loaded-references-by-key="{}"
               :pattern-checker-date="patternCheckerDateRef(application, column.title, dataId)"
               :reference-type="column.refLinkedTo"
-- 
GitLab


From 14c9773dcba57c64830700fdc06705aaf65258fc Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Tue, 3 Dec 2024 09:52:37 +0100
Subject: [PATCH 13/61] invertion du disabled dans la gestion des attributions
 des droits

---
 src/views/authorizations/DataTypeAuthorizationsView.vue | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/views/authorizations/DataTypeAuthorizationsView.vue b/src/views/authorizations/DataTypeAuthorizationsView.vue
index a92819727..a10f9d2dc 100644
--- a/src/views/authorizations/DataTypeAuthorizationsView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationsView.vue
@@ -228,7 +228,7 @@
                     >
                       <b-checkbox
                         v-model="checkbox[auth.name + '_' + props.row.name]"
-                        :disabled="isApplicationManager || isUserManager"
+                        :disabled="!isApplicationManager || !isUserManager"
                         @input="updateListUsersInAuthorization(auth, props.row.name, $event)"
                       >
                         {{ auth.name }}
@@ -455,7 +455,7 @@
                         :disabled="
                           (props?.row?.users || []).map((use) => use.login).length === 1 &&
                           checkbox[props.row.name + '_' + user.label] === true &&
-                          (isApplicationManager || isUserManager)
+                          (!isApplicationManager || !isUserManager)
                         "
                         @input="updateListUsersInAuthorization(props.row, user.label, $event)"
                       >
-- 
GitLab


From 4bf3ef5181acb5458a38b03dadef48941d97e475 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Tue, 3 Dec 2024 10:20:20 +0100
Subject: [PATCH 14/61] mis en retrait des icons de facon global

---
 src/style/_common.scss                                 | 10 ++++++++--
 .../authorizations/DataTypeAuthorizationsView.vue      |  2 +-
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/style/_common.scss b/src/style/_common.scss
index c6fa395d0..440ab3494 100644
--- a/src/style/_common.scss
+++ b/src/style/_common.scss
@@ -59,10 +59,16 @@ a {
 .icon.is-medium {
   font-size: $size-icon-medium;
 }
-.control.has-icons-right .icon.is-right {
-  top: -2px;
+.control.has-icons-right {
+  .icon {
+    z-index: 0;
+  }
+  .icon.is-right {
+    top: -2px;
+  }
 }
 .control.has-icons-left .icon {
+  z-index: 0;
   .is-small {
     top: -5px;
   }
diff --git a/src/views/authorizations/DataTypeAuthorizationsView.vue b/src/views/authorizations/DataTypeAuthorizationsView.vue
index a10f9d2dc..4c19b1ffa 100644
--- a/src/views/authorizations/DataTypeAuthorizationsView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationsView.vue
@@ -455,7 +455,7 @@
                         :disabled="
                           (props?.row?.users || []).map((use) => use.login).length === 1 &&
                           checkbox[props.row.name + '_' + user.label] === true &&
-                          (!isApplicationManager || !isUserManager)
+                          (isApplicationManager || isUserManager)
                         "
                         @input="updateListUsersInAuthorization(props.row, user.label, $event)"
                       >
-- 
GitLab


From 58e84f2ae7565571f53df360a97c430fd0bf80c3 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Tue, 3 Dec 2024 13:40:58 +0100
Subject: [PATCH 15/61] eslint

---
 .../common/provider/FiltersDataCollapse.vue   |  4 +-
 src/components/datas/DatasLink.vue            | 12 +++--
 src/components/datas/DatasPatternLink.vue     | 11 ++---
 src/composable/applications/applications.js   |  6 +--
 src/composable/applications/useFunction.js    | 11 +++--
 src/model/application/Component.js            |  6 +--
 src/router/index.js                           |  3 +-
 .../application/ApplicationCreationView.vue   |  9 ++--
 src/views/application/ApplicationsView.vue    | 46 ++++++++++---------
 src/views/data/DatasManagementView.vue        |  6 ++-
 10 files changed, 60 insertions(+), 54 deletions(-)

diff --git a/src/components/common/provider/FiltersDataCollapse.vue b/src/components/common/provider/FiltersDataCollapse.vue
index d680ebabb..69dab5017 100644
--- a/src/components/common/provider/FiltersDataCollapse.vue
+++ b/src/components/common/provider/FiltersDataCollapse.vue
@@ -445,9 +445,7 @@ export default {
         for (let i = 0; i < listReferenceValueForAllReferences.value[columnsId].rows.length; i++) {
           if (listReferenceValueForAllReferences.value[columnsId].rows[i].naturalKey === value) {
             if (
-              listReferenceValueForAllReferences.value[columnsId].rows[i].values[
-                "display_default"
-              ]
+              listReferenceValueForAllReferences.value[columnsId].rows[i].values["display_default"]
             ) {
               return listReferenceValueForAllReferences.value[columnsId].rows[i].values[
                 "display_default"
diff --git a/src/components/datas/DatasLink.vue b/src/components/datas/DatasLink.vue
index 7381d00ce..ed9f35f68 100644
--- a/src/components/datas/DatasLink.vue
+++ b/src/components/datas/DatasLink.vue
@@ -39,11 +39,13 @@
                 :label="column.label"
               >
                 <span>
-                  <div v-if="typeof props.row[column.field]== 'boolean' ">
-                   {{  props.row[column.field] ?$t("boolean.true") : $t("boolean.false")}}
+                  <div v-if="typeof props.row[column.field] == 'boolean'">
+                    {{ props.row[column.field] ? $t("boolean.true") : $t("boolean.false") }}
                   </div>
                   <DatasDynamicLink
-                    v-else-if="!props.row[column.field]?.length && props.row[column.field].length !== 0"
+                    v-else-if="
+                      !props.row[column.field]?.length && props.row[column.field].length !== 0
+                    "
                     :application="application"
                     :column-id="column.id"
                     :info="!props.row[column.field]?.length && props.row[column.field].length !== 0"
@@ -80,7 +82,9 @@
                     :value="props.row.valeur"
                   ></DatasLink>
                   <p v-else-if="column.field === 'colonne'">
-                    {{ getColumnNameView(props.row[column.field], application, referenceType, column) }}
+                    {{
+                      getColumnNameView(props.row[column.field], application, referenceType, column)
+                    }}
                   </p>
                   <p v-else>{{ props.row[column.field] }}</p>
                 </span>
diff --git a/src/components/datas/DatasPatternLink.vue b/src/components/datas/DatasPatternLink.vue
index 08271be52..5bd614905 100644
--- a/src/components/datas/DatasPatternLink.vue
+++ b/src/components/datas/DatasPatternLink.vue
@@ -49,7 +49,7 @@
                   :column-id="column.component.id"
                   :column-title="column.component.title"
                   :component="column.component"
-                  :display-value="''+column.value"
+                  :display-value="'' + column.value"
                   :loaded-references-by-key="{}"
                   :pattern-checker-date="
                     patternCheckerDateRef(
@@ -84,12 +84,12 @@ export default {
     value: Array,
     infoValues: {},
     loadedReferencesByKey: {
-      type: Object
+      type: Object,
     },
     dataId: String,
     info: Boolean,
     columnId: String,
-    patternCheckerDateRef: Function
+    patternCheckerDateRef: Function,
   },
   beforeCreate() {
     this.$options.components.DatasLink = require("./DatasLink.vue").default;
@@ -102,7 +102,7 @@ export default {
     function showBtnTablePatternColumn(tableDynamicColumn) {
       let showModal = Object.entries(tableDynamicColumn)
         .filter((a) => a[1])
-        .map(function(a) {
+        .map(function (a) {
           let obj = {};
           obj[a[0]] = a[1];
           return obj;
@@ -110,7 +110,6 @@ export default {
       return showModal.length !== 0;
     }
 
-
     const columnName = computed(() => props.columnTitle.match(".*::(.*)")[1]);
 
     async function showModal() {
@@ -126,7 +125,7 @@ export default {
       showBtnTablePatternColumn,
       showModal,
     };
-  }
+  },
 };
 </script>
 .modal-high-z-index { z-index: 9999 !important; position: absolute; }
diff --git a/src/composable/applications/applications.js b/src/composable/applications/applications.js
index 39c42f255..cf364dc7e 100644
--- a/src/composable/applications/applications.js
+++ b/src/composable/applications/applications.js
@@ -28,8 +28,8 @@ function addApplication(result) {
     } else {
       localApplication.push(application);
     }
-    ownApplications.value = localApplication.filter(app => app.isApplicationUser());
-    otherApplications.value = localApplication.filter(app => !app.isApplicationUser());
+    ownApplications.value = localApplication.filter((app) => app.isApplicationUser());
+    otherApplications.value = localApplication.filter((app) => !app.isApplicationUser());
     hasOwnApplications.value = ownApplications.value.length > 0;
     showOwnApplications.value = hasOwnApplications.value ? 0 : 1;
     applications.value = localApplication;
@@ -48,7 +48,7 @@ function useApplication() {
     otherApplications,
     loadApplications,
     hasOwnApplications,
-    showOwnApplications
+    showOwnApplications,
   };
 }
 
diff --git a/src/composable/applications/useFunction.js b/src/composable/applications/useFunction.js
index 7233c55ac..abbc38d5b 100644
--- a/src/composable/applications/useFunction.js
+++ b/src/composable/applications/useFunction.js
@@ -12,10 +12,13 @@ export function useRedirections(application = { authorizations: [] }) {
     limited to applicationCreator
      */
   function createApplication(applicationNames) {
-    return canCreateApplication() && app.$router.push({
-      path: '/applicationCreation',
-      query: { applicationNames: applicationNames }
-    });;
+    return (
+      canCreateApplication() &&
+      app.$router.push({
+        path: "/applicationCreation",
+        query: { applicationNames: applicationNames },
+      })
+    );
   }
 
   /*
diff --git a/src/model/application/Component.js b/src/model/application/Component.js
index a8ceea7a7..22838f577 100644
--- a/src/model/application/Component.js
+++ b/src/model/application/Component.js
@@ -107,8 +107,8 @@ export class Component {
           getInternationalizedColumn(
             referenceName,
             component.patternColumnComponents[patternColumnComponent].exportHeader ||
-            component.patternColumnComponents[patternColumnComponent].exportHeaderName ||
-            component.patternColumnComponents[patternColumnComponent].componentKey,
+              component.patternColumnComponents[patternColumnComponent].exportHeaderName ||
+              component.patternColumnComponents[patternColumnComponent].componentKey,
             application
           );
       }
@@ -301,7 +301,7 @@ class PatternComponent extends Component {
         column: col.id,
         columnName,
         value: value[col.id],
-        id: col.id
+        id: col.id,
       };
       returnValue[col.id] = value[col.id];
       return returnValue;
diff --git a/src/router/index.js b/src/router/index.js
index 9175d8eae..1777d574e 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -87,8 +87,7 @@ const routes = [
     path: "/applicationCreation",
     name: "Application creation",
     component: ApplicationCreationView,
-    props: (route) =>
-      ({ applicationNames: route.query.applicationNames })
+    props: (route) => ({ applicationNames: route.query.applicationNames }),
   },
   {
     path: "/authorizationsManagementForApplicationCreator",
diff --git a/src/views/application/ApplicationCreationView.vue b/src/views/application/ApplicationCreationView.vue
index f2b6647cc..17c862d74 100644
--- a/src/views/application/ApplicationCreationView.vue
+++ b/src/views/application/ApplicationCreationView.vue
@@ -238,9 +238,7 @@ export default {
             );
             break;
           case "validate":
-            method = (chunk) =>
-              parseChunck(chunk, "validate", canBeShowAndReturnErrorsMessage
-              );
+            method = (chunk) => parseChunck(chunk, "validate", canBeShowAndReturnErrorsMessage);
             await services.applicationService.validateConfiguration(method, applicationConfig);
             break;
         }
@@ -309,15 +307,14 @@ export default {
                 version: props.applicationVersion,
               })
             );
-          } else if(props.applicationNames?.includes(applicationConfig.name)) {
+          } else if (props.applicationNames?.includes(applicationConfig.name)) {
             disabled.value = true;
             services.alertService.toastError(
               i18n.t("alert.server-error-appli-exist-on-creation", {
                 applicationName: applicationConfig.name,
               })
             );
-
-          }else{
+          } else {
             services.alertService.toastSuccess(i18n.t("alert.application-validate-success"));
           }
         } else {
diff --git a/src/views/application/ApplicationsView.vue b/src/views/application/ApplicationsView.vue
index a9f576bce..a9e9221ae 100644
--- a/src/views/application/ApplicationsView.vue
+++ b/src/views/application/ApplicationsView.vue
@@ -1,18 +1,25 @@
 <template>
   <PageView>
+    <b-tabs
+      v-if="ownApplications.length + otherApplications.length"
+      v-model="showOwnApplications"
+      position="is-centered"
+    >
+      <b-tab-item
+        :disabled="ownApplications.length === 0"
+        :label="$t('titles.applications-page')"
+      />
+      <b-tab-item
+        :disabled="otherApplications.length === 0"
+        :label="$t('titles.applications-page-other')"
+      />
+    </b-tabs>
+
     <h1 class="title main-title">
       {{
-        showOwnApplications ? $t("titles.applications-page") : $t("titles.applications-page-other")
+        showOwnApplications ? $t("titles.applications-page-other") : $t("titles.applications-page")
       }}
     </h1>
-    <b-tabs v-model="showOwnApplications" position="is-centered"
-            v-if="ownApplications.length+otherApplications.length">
-      <b-tab-item :disabled="ownApplications.length==0"
-                  :label=" $t('titles.applications-page')" />
-      <b-tab-item :disabled="otherApplications.length==0"
-                  :label=" $t('titles.applications-page-other')" />
-    </b-tabs>
-    <h3 class="subtitle">{{ $t("titles.applications-page-nothing") }}</h3>
 
     <div class="columns columnPrincipale">
       <div class="column is-3-widescreen is-12-desktop">
@@ -23,7 +30,7 @@
               role="button"
               style="margin-bottom: 50px"
               tabindex="0"
-              @click="createApplication((applications || []).map(a=>a.name))"
+              @click="createApplication((applications || []).map((a) => a.name))"
             >
               <a class="card-header-icon createApplication">
                 <b-icon icon="plus"></b-icon>
@@ -190,9 +197,8 @@ export default {
     const selected = useBoolean().refBoolean;
     const alphabeticalOrDateSort = useText().refText;
     const selectedApplications = computed(() => {
-      let applicationsListOrderOrFilter = showOwnApplications.value === 0 ?
-        ownApplications?.value :
-        otherApplications?.value;
+      let applicationsListOrderOrFilter =
+        showOwnApplications.value === 0 ? ownApplications?.value : otherApplications?.value;
       if (filterName.value.length > 2)
         applicationsListOrderOrFilter = applicationsListOrderOrFilter.filter(
           (a) => a.localName.toString().toLowerCase().indexOf(filterName.value.toLowerCase()) >= 0
@@ -205,9 +211,8 @@ export default {
     });
 
     function sortedApplicationsListForDate(localApplications, event) {
-      localApplications = showOwnApplications.value === 0 ?
-        ownApplications?.value :
-        otherApplications?.value;
+      localApplications =
+        showOwnApplications.value === 0 ? ownApplications?.value : otherApplications?.value;
       localApplications.sort((a, b) => {
         const localA = new Date(
           a.updateDate[0],
@@ -235,10 +240,9 @@ export default {
     }
 
     function sortedApplicationsListForName(localApplications, event) {
-      localApplications = showOwnApplications.value === 0 ?
-        ownApplications?.value :
-        otherApplications?.value;
-      localApplications
+      localApplications =
+        showOwnApplications.value === 0 ? ownApplications?.value : otherApplications?.value;
+      localApplications;
       if (event === "Az") {
         localApplications = localApplications.sort((a, b) =>
           a.localName.localeCompare(b.localName)
@@ -276,7 +280,7 @@ export default {
       isCardModalActive,
       canCreateApplication,
       sortedApplicationsListForDate,
-      sortedApplicationsListForName
+      sortedApplicationsListForName,
     };
   },
 };
diff --git a/src/views/data/DatasManagementView.vue b/src/views/data/DatasManagementView.vue
index 89e18d6b3..59b9ff1a0 100644
--- a/src/views/data/DatasManagementView.vue
+++ b/src/views/data/DatasManagementView.vue
@@ -148,8 +148,10 @@ export default {
         tags &&
         Object.keys(tags || {}).length !== 0 &&
         !(Object.keys(tags || {}).length === 1 && Object.keys(tags).includes(Tag.NO_TAG_NAME));
-      let sortedData = application.configuration.hierarchicalNodes.map(node=>node.nodeName)
-        .map(nodeName=>datas.value.find(data=>data.id===nodeName)).filter(node=>node);
+      let sortedData = application.configuration.hierarchicalNodes
+        .map((node) => node.nodeName)
+        .map((nodeName) => datas.value.find((data) => data.id === nodeName))
+        .filter((node) => node);
       changeDatasToBeShown(services.tagService.toBeShown(tags, sortedData));
     };
 
-- 
GitLab


From d50d884299f5e40061cfabcbd2c5aa0e9577ee20 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Tue, 3 Dec 2024 15:15:16 +0100
Subject: [PATCH 16/61] Suppression de docker-compose et docker file - docker
 compose  -f docker/local/compose.yml up pour lancer le front en local

---
 Dockerfile          |  5 -----
 README.md           |  5 +++++
 docker-compose.yaml | 10 ----------
 3 files changed, 5 insertions(+), 15 deletions(-)
 delete mode 100644 Dockerfile
 delete mode 100644 docker-compose.yaml

diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 3fb3b77ee..000000000
--- a/Dockerfile
+++ /dev/null
@@ -1,5 +0,0 @@
-FROM node:19-alpine
-WORKDIR /app
-COPY package*.json ./
-RUN    npm install --save-dev @vue/cli-service --legacy-peer-deps &npm ci  --legacy-peer-deps && export NODE_OPTIONS=--openssl-legacy-provider
-CMD ["npm", "run", "serve"]
\ No newline at end of file
diff --git a/README.md b/README.md
index 198495c1b..5c55db030 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,9 @@
 
+# local deployment
+    ``` sh
+docker compose  -f docker/local/compose.yml up
+   ```
+
 # ui
 
 ## Project setup
diff --git a/docker-compose.yaml b/docker-compose.yaml
deleted file mode 100644
index e5bf94113..000000000
--- a/docker-compose.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-services:
-  web:
-    build:
-      context: .
-      dockerfile: Dockerfile
-    ports:
-      - "8080:8080"
-    volumes:
-      - .:/app
-    command: npm run serve
\ No newline at end of file
-- 
GitLab


From f63e712ba44297cfbd6fb929be60e1a03adc0ec3 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Thu, 5 Dec 2024 09:40:23 +0100
Subject: [PATCH 17/61] =?UTF-8?q?Correction=20des=20en-t=C3=AAte=20de=20co?=
 =?UTF-8?q?lonnes=20dans=20les=20panneaux=20de=20references?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../common/provider/FiltersDataCollapse.vue   | 12 +++----
 src/components/datas/DatasLink.vue            |  2 +-
 src/components/datas/DatasManyLink.vue        |  2 +-
 src/composable/data/dataLoader.js             | 33 +++++++++++--------
 src/model/authorization/Authorizations.js     |  4 +--
 src/views/data/DataVersioningView.vue         |  2 +-
 6 files changed, 30 insertions(+), 25 deletions(-)

diff --git a/src/components/common/provider/FiltersDataCollapse.vue b/src/components/common/provider/FiltersDataCollapse.vue
index 69dab5017..ce569ee4e 100644
--- a/src/components/common/provider/FiltersDataCollapse.vue
+++ b/src/components/common/provider/FiltersDataCollapse.vue
@@ -445,18 +445,18 @@ export default {
         for (let i = 0; i < listReferenceValueForAllReferences.value[columnsId].rows.length; i++) {
           if (listReferenceValueForAllReferences.value[columnsId].rows[i].naturalKey === value) {
             if (
-              listReferenceValueForAllReferences.value[columnsId].rows[i].values["display_default"]
+              listReferenceValueForAllReferences.value[columnsId].rows[i].values["__display_default"]
             ) {
               return listReferenceValueForAllReferences.value[columnsId].rows[i].values[
-                "display_default"
+                "__display_default"
               ];
             } else if (
               listReferenceValueForAllReferences.value[columnsId].rows[i].values[
-                "display_" + services.internationalisationService.getLocale()
+                "__display_" + services.internationalisationService.getLocale()
               ]
             ) {
               return listReferenceValueForAllReferences.value[columnsId].rows[i].values[
-                "display_" + services.internationalisationService.getLocale()
+                "__display_" + services.internationalisationService.getLocale()
               ];
             } else {
               return listReferenceValueForAllReferences.value[columnsId].rows[i].naturalKey;
@@ -475,10 +475,10 @@ export default {
         for (let i = 0; i < listReferenceValueForAllReferences.value[columnsId].rows.length; i++) {
           if (
             listReferenceValueForAllReferences.value[columnsId].rows[i].values[
-              "display_default"
+              "__display_default"
             ] === value ||
             listReferenceValueForAllReferences.value[columnsId].rows[i].values[
-              "display_" + services.internationalisationService.getLocale()
+              "__display_" + services.internationalisationService.getLocale()
             ] === value
           ) {
             return listReferenceValueForAllReferences.value[columnsId].rows[i].naturalKey;
diff --git a/src/components/datas/DatasLink.vue b/src/components/datas/DatasLink.vue
index ed9f35f68..eb2e7cfa4 100644
--- a/src/components/datas/DatasLink.vue
+++ b/src/components/datas/DatasLink.vue
@@ -168,7 +168,7 @@ export default {
       await getOrLoadReference();
       let refValues = reference.value.refValues;
       const data = Object.entries(refValues.refValue)
-        .filter((entry) => !entry[0].startsWith("display_"))
+        .filter((entry) => !entry[0].startsWith("__display_"))
         .map((entry) => ({ colonne: entry[0], valeur: entry[1] }))
         .reduce((acc, entry) => {
           acc.push(entry);
diff --git a/src/components/datas/DatasManyLink.vue b/src/components/datas/DatasManyLink.vue
index d46d4873f..8e398e391 100644
--- a/src/components/datas/DatasManyLink.vue
+++ b/src/components/datas/DatasManyLink.vue
@@ -171,7 +171,7 @@ export default {
         }
       }
       const data = Object.entries(refValues.refValue)
-        .filter((entry) => !entry[0].startsWith("display_"))
+        .filter((entry) => !entry[0].startsWith("__display_"))
         .map((entry) => ({ colonne: entry[0], valeur: entry[1] }))
         .reduce((acc, entry) => {
           acc.push(entry);
diff --git a/src/composable/data/dataLoader.js b/src/composable/data/dataLoader.js
index 1ab096794..5585ca762 100644
--- a/src/composable/data/dataLoader.js
+++ b/src/composable/data/dataLoader.js
@@ -2,7 +2,7 @@ export function dataLoader(services) {
   const dataService = services.dataService;
   const references = {};
 
-  const getOrLoadDataByNaturalKey = async function (application, referenceName, key) {
+  const getOrLoadDataByNaturalKey = async function(application, referenceName, key) {
     let applicationName = application.configuration.applicationDescription.name;
     let reference = references?.[referenceName]?.[key];
     if (reference) {
@@ -23,14 +23,14 @@ export function dataLoader(services) {
       referenceName,
       values: reference.rows?.[0],
       localName:
-        reference.rows.length !== 0 ? getValueDisplay(reference.rows?.[0], application) : key,
+        reference.rows.length !== 0 ? getValueDisplay(reference.rows?.[0], application) : key
     };
     references[referenceName] = references[referenceName] || {};
     references[referenceName][key] = reference;
     return reference;
   };
 
-  const getDisplayValueForLink = function (rowValue, column, listDisplayRowsValue, application) {
+  const getDisplayValueForLink = function(rowValue, column, listDisplayRowsValue, application) {
     if (
       listDisplayRowsValue[column.componentKey] &&
       Object.keys(listDisplayRowsValue[column.componentKey]).includes(rowValue)
@@ -42,28 +42,28 @@ export function dataLoader(services) {
     return rowValue;
   };
 
-  const getValueDisplay = function (referenceLocal, application) {
+  const getValueDisplay = function(referenceLocal, application) {
     if (!referenceLocal?.values) {
       return "";
     }
-    if (referenceLocal.values["display_" + services.internationalisationService.getLocale()]) {
-      return referenceLocal.values["display_" + services.internationalisationService.getLocale()];
+    if (referenceLocal.values["__display_" + services.internationalisationService.getLocale()]) {
+      return referenceLocal.values["__display_" + services.internationalisationService.getLocale()];
     }
     if (
       application &&
       referenceLocal.values[
-        "display_" + application.configuration.applicationDescription.defaultLanguage
-      ]
+      "__display_" + application.configuration.applicationDescription.defaultLanguage
+        ]
     ) {
       return referenceLocal.values[
-        "display_" + application.configuration.applicationDescription.defaultLanguage
-      ];
+      "__display_" + application.configuration.applicationDescription.defaultLanguage
+        ];
     } else {
-      return referenceLocal.values["display_default"];
+      return referenceLocal.values["__display_default"];
     }
   };
 
-  const getColumnNameView = function (columnId, application, dataId, column) {
+  const getColumnNameView = function(columnId, application, dataId, column) {
     let columnName;
     if (!column) {
       columnName = "this is an error " + columnId;
@@ -71,9 +71,14 @@ export function dataLoader(services) {
       columnName = column.originalName || "not found";
     } else if (application.data[dataId].componentDescriptions[columnId]) {
       let importHeader = application.data[dataId].componentDescriptions[columnId].importHeader;
-      let exportHeader = column
+      let exportHeader = column?.exportHeader
         ? column.exportHeader
         : application.data[dataId].componentDescriptions[columnId].exportHeaderName;
+      exportHeader = services.internationalisationService.localeReferenceColumnsNames(
+        dataId,
+        exportHeader,
+        application
+      ) || exportHeader;
       if (exportHeader !== columnId) {
         columnName = exportHeader || columnId;
       } else if (importHeader !== undefined && importHeader !== columnId) {
@@ -111,7 +116,7 @@ export function dataLoader(services) {
     getOrLoadDataByNaturalKey,
     getValueDisplay,
     getColumnNameView,
-    getDisplayValueForLink,
+    getDisplayValueForLink
   };
   //const getOrLoadData = function()
 }
diff --git a/src/model/authorization/Authorizations.js b/src/model/authorization/Authorizations.js
index fedae85fc..400879ff3 100644
--- a/src/model/authorization/Authorizations.js
+++ b/src/model/authorization/Authorizations.js
@@ -517,8 +517,8 @@ export class Authorizations {
       Authorizations.internationalizationService.getUserPrefLocale();
       let lang = localStorage.getItem(LOCAL_STORAGE_LANG);
       let localName; // = refValues.referenceValues.find((r) => r.naturalKey == key);
-      if (localName?.values?.["display_" + lang]) {
-        localName = localName?.values?.["display_" + lang];
+      if (localName?.values?.["__display_" + lang]) {
+        localName = localName?.values?.["__display_" + lang];
       } else {
         localName = key;
       }
diff --git a/src/views/data/DataVersioningView.vue b/src/views/data/DataVersioningView.vue
index 9087f62c4..3d0fc6c49 100644
--- a/src/views/data/DataVersioningView.vue
+++ b/src/views/data/DataVersioningView.vue
@@ -874,7 +874,7 @@ export default {
         let localName = refValues.rows.find(
           (r) => r.hierarchicalKey === newCurrentPath || r.naturalKey === key.split("K").pop()
         );
-        // TODO passé par la constante de l'application pour "display_" plus tard (en attente de réparation de philippe
+        // TODO passé par la constante de l'application pour "__display_" plus tard (en attente de réparation de philippe
         let naturalKey = localName.naturalKey;
         localName = getValueDisplay(localName, application);
         if (!localName) {
-- 
GitLab


From b5fa5dee3aca77353d6426b0d931e19783b4d6d5 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Tue, 10 Dec 2024 15:07:32 +0100
Subject: [PATCH 18/61] Ajout du traitement de application inconnue dans
 l'interface DataTableView

---
 src/locales/en.json              |  1 +
 src/locales/fr.json              |  1 +
 src/services/AlertService.js     | 45 +++++++++++++++---------
 src/views/data/DataTableView.vue | 60 ++++++++++++++++++++------------
 4 files changed, 68 insertions(+), 39 deletions(-)

diff --git a/src/locales/en.json b/src/locales/en.json
index 92b890637..c62749129 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -124,6 +124,7 @@
     "app_version": "Current version of {name} is: {version}",
     "app_update_version": "Version of {name} proposed is: {version}",
     "change": "Update",
+    "no-right-for-application": "you have no rights to view this data",
     "charte_message": "I have read and accept the conditions of use of the data.",
     "charte_header": "To access the {localName} application, you must accept the conditions of use.",
     "chose-config": "Chose a configuration",
diff --git a/src/locales/fr.json b/src/locales/fr.json
index 3839c2506..dd11f9508 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -124,6 +124,7 @@
     "app_version": "Version actuelle de {name} est : {version}",
     "app_update_version": "Version de {name} proposée est : {version}",
     "change": "Mise à jour",
+    "no-right-for-application" : "vous n'avez pas de droits vous premettant de consulter ces données",
     "charte_message": "J'ai lu et j'accepte les conditions d'utilisation des données.",
     "charte_header": "Pour accéder à l'application {localName}, vous devez accepter les conditions d'utilisation.",
     "chose-config": "Choisir une configuration",
diff --git a/src/services/AlertService.js b/src/services/AlertService.js
index 42f0a3a96..d5f38b285 100644
--- a/src/services/AlertService.js
+++ b/src/services/AlertService.js
@@ -17,7 +17,7 @@ export class AlertService {
       message: message,
       type: BuefyTypes.SUCCESS,
       duration: TOAST_INFO_DURATION,
-      position: TOAST_POSITION,
+      position: TOAST_POSITION
     });
   }
 
@@ -27,20 +27,31 @@ export class AlertService {
       message: message,
       type: BuefyTypes.WARNING,
       duration: TOAST_ERROR_DURATION,
-      position: TOAST_POSITION,
+      position: TOAST_POSITION
     });
   }
 
-  toastError(message, error) {
+  toastError(message, error, state) {
     if (error && error.content) {
       error.content.then((t) => {
         if (typeof t === "string") {
-          ToastProgrammatic.open({
-            message: i18n.t("exceptionMessage." + t),
-            type: BuefyTypes.DANGER,
-            duration: TOAST_ERROR_DURATION,
-            position: TOAST_POSITION,
-          });
+          let regExpMatchArray = t.match("application inconnue (.*)");
+          if (regExpMatchArray) {
+            ToastProgrammatic.open({
+              message: i18n.t("applications.no-right-for-application"),
+              type: BuefyTypes.DANGER,
+              duration: TOAST_ERROR_DURATION,
+              position: TOAST_POSITION
+            });
+            t="NO-RIGHTS"
+          } else {
+            ToastProgrammatic.open({
+              message: i18n.t("exceptionMessage." + t),
+              type: BuefyTypes.DANGER,
+              duration: TOAST_ERROR_DURATION,
+              position: TOAST_POSITION
+            });
+          }
         } else {
           const parseMessage = /(^[^[]*) \[(.*)\]$/.exec(t.message);
           const message = parseMessage?.[1] || t.message;
@@ -52,29 +63,31 @@ export class AlertService {
             message: i18n.t("exceptionMessage." + message, params),
             type: BuefyTypes.DANGER,
             duration: TOAST_ERROR_DURATION,
-            position: TOAST_POSITION,
+            position: TOAST_POSITION
           });
         }
+        state.value = t;
       });
     } else {
       ToastProgrammatic.open({
         message: message,
         type: BuefyTypes.DANGER,
         duration: TOAST_ERROR_DURATION,
-        position: TOAST_POSITION,
+        position: TOAST_POSITION
       });
     }
   }
 
-  toastServerError(error) {
+  toastServerError(error,state) {
     if (error && error.content != null) {
-      error.content.then((value) => this.toastError(value.message, error));
+      error.content.then((value) => this.toastError(value.message, error, state));
     } else {
-      this.toastError(i18n.t("alert.server-error"), error);
+      this.toastError(i18n.t("alert.server-error"), error, state);
     }
   }
 
-  dialog(title, message, confirmText, type = "warning", cancelMsg, onConfirmCb = () => {}) {
+  dialog(title, message, confirmText, type = "warning", cancelMsg, onConfirmCb = () => {
+  }) {
     DialogProgrammatic.confirm({
       title: title,
       message: message,
@@ -84,7 +97,7 @@ export class AlertService {
       cancelText: cancelMsg,
       onConfirm: () => {
         onConfirmCb();
-      },
+      }
     });
   }
 }
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index bfb0bfc92..85a22082d 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -17,18 +17,18 @@
         @change:allTags="changeAllValueTags($event)"
       />
     </div>
-    <FiltersDataCollapse
-      :application="application"
-      :application-name="applicationName"
-      :columns-to-be-shown="dataColumnsToBeShown"
-      :data-id="dataId"
-      :is-ref-link-to="referenceTypeForReferencingColumns"
-      @view-search="recalculate($event)"
-      @download-search="recalculate($event, true)"
-      @clear-search="clear($event)"
+    <FiltersDataCollapse v-if="state!='NO-RIGHTS'"
+                         :application="application"
+                         :application-name="applicationName"
+                         :columns-to-be-shown="dataColumnsToBeShown"
+                         :data-id="dataId"
+                         :is-ref-link-to="referenceTypeForReferencingColumns"
+                         @view-search="recalculate($event)"
+                         @download-search="recalculate($event, true)"
+                         @clear-search="clear($event)"
     />
     <LoadingAnimate v-if="isLoading" :size="'is-large'"></LoadingAnimate>
-    <div v-if="!onlyMetadata && data && dataColumnsToBeShown && !isLoading">
+    <div v-if="!onlyMetadata && data && dataColumnsToBeShown && !isLoading && state!='NO-RIGHTS'">
       <b-table
         id="filtreTable"
         :current-page="currentPage"
@@ -161,15 +161,27 @@
         </b-table-column>
       </b-table>
     </div>
+    <div v-else>
+      <b-message type="is-danger" :closable="false" size="is-medium" has-icon>
+        {{ $t("applications.no-right-for-application") }}
+      </b-message>
+      <b-button
+        class="mt-3 "
+        type="is-primary"
+        @click="$router.push('../authorizationsRequest/new')"
+      >
+        {{ $t("dataTypeAuthorizations.request") }}
+      </b-button>
+    </div>
 
-    <div class="buttons" style="margin-top: 16px">
+    <div class="buttons" style="margin-top: 16px" v-if="state!='NO-RIGHTS'">
       <!--        <b-button @click="loadExampleData">Afficher un exemple</b-button>-->
       <b-button
         style="margin-bottom: 15px; float: right"
         type="is-primary"
         icon-left="download"
         @click.prevent="downloadResultSearch"
-        >{{ $t("dataTable.donwload-view-result") }}
+      >{{ $t("dataTable.donwload-view-result") }}
       </b-button>
     </div>
   </PageView>
@@ -208,7 +220,7 @@ export default {
   name: "DataTableView",
   props: {
     applicationName: String,
-    dataId: String,
+    dataId: String
   },
   components: {
     DatasPatternLink,
@@ -220,10 +232,11 @@ export default {
     TagsCollapse,
     DatasLink,
     DatasManyLink,
-    DatasDynamicLink,
+    DatasDynamicLink
   },
   setup(props) {
     const onlyMetadata = ref(true);
+    const state = ref(""); // can or not load data
     const { reactiveObject: params } = useObject(new DownloadDatasetQuery(0, 10));
     const loader = dataLoader(services);
     provide("reference:dataLoader", loader);
@@ -270,7 +283,7 @@ export default {
     });
 
     const hasTags = useBoolean(false).refBoolean;
-    const changeTags = function (tagsToChange) {
+    const changeTags = function(tagsToChange) {
       _changeTags({ ...tagsToChange });
       hasTags.value =
         tags.value &&
@@ -327,7 +340,7 @@ export default {
               `/applications/${props.applicationName}/${dataIsType}/${props.dataId}`
             ),
           () => app.$router.push(`/applications/${props.applicationName}/${dataIsType}`)
-        ),
+        )
       ]);
       changeColumns(services.tagService.toBeShown(tags.value, columns.value));
       changeTags(buildTagsColumns(application, columns.value, tags.value));
@@ -339,7 +352,7 @@ export default {
         changeApplication(
           await services.applicationService.getApplication(props.applicationName, [
             "CONFIGURATION",
-            "REFERENCETYPE",
+            "REFERENCETYPE"
           ])
         );
         changeApplication({
@@ -347,14 +360,14 @@ export default {
           localRefName: services.internationalisationService.localeReferenceNames(
             props.dataId,
             application
-          ),
+          )
         });
         const data = await services.dataService.getData(
           props.applicationName,
           props.dataId,
           {
             offset: params.offset,
-            limit: params.limit,
+            limit: params.limit
           },
           onlyMetadata.value
         );
@@ -370,7 +383,7 @@ export default {
           }
         }
       } catch (error) {
-        services.alertService.toastServerError();
+        services.alertService.toastServerError(error, state);
       }
       changeIsLoading(false);
     }
@@ -447,7 +460,7 @@ export default {
           .reduce((accumulator, component) => {
             accumulator.push(component);
             return accumulator;
-          }, []),
+          }, [])
       ];
       changeColumns(localColumns);
       if (rows.value) {
@@ -597,6 +610,7 @@ export default {
     }
 
     return {
+      state,
       showModal,
       realVariables,
       onlyMetadata,
@@ -634,9 +648,9 @@ export default {
       patternCheckerDateRef,
       totalRows,
       tableHeight,
-      loader,
+      loader
     };
-  },
+  }
 };
 </script>
 <style lang="scss" scoped>
-- 
GitLab


From d0fb66fa50d773c542df7e4234b83473df3660df Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Tue, 10 Dec 2024 17:16:30 +0100
Subject: [PATCH 19/61] =?UTF-8?q?r=C3=A9paration=20du=20bug=20et=20ajout?=
 =?UTF-8?q?=20des=20commentaires=20manquant?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 public/Logos_OA.svg                           |  70 +++++++++++
 public/Logos_OpernADOM.svg                    | 100 ++++++++++++++++
 src/components/common/CollapsibleTree.vue     |   2 +-
 src/components/common/SubMenu.vue             |   5 +
 src/composable/data/dataLoader.js             |   2 +-
 src/locales/en.json                           |   2 +-
 src/locales/fr.json                           |   2 +-
 src/views/application/ApplicationInfoView.vue |   3 +-
 src/views/data/DataVersioningView.vue         | 110 +++++++++++-------
 src/views/data/DatasManagementView.vue        |  69 +++++++++--
 10 files changed, 307 insertions(+), 58 deletions(-)
 create mode 100644 public/Logos_OA.svg
 create mode 100644 public/Logos_OpernADOM.svg

diff --git a/public/Logos_OA.svg b/public/Logos_OA.svg
new file mode 100644
index 000000000..7d9591663
--- /dev/null
+++ b/public/Logos_OA.svg
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="_x31_4"
+   viewBox="0 0 833.61 598.36"
+   version="1.1"
+   sodipodi:docname="2024_11_20_Logos_OpernADOM_SDE_3.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata13">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1867"
+     inkscape:window-height="1043"
+     id="namedview11"
+     showgrid="false"
+     inkscape:zoom="0.42115116"
+     inkscape:cx="769.64922"
+     inkscape:cy="491.52489"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="_x31_4"
+     inkscape:document-rotation="0" />
+  <defs
+     id="defs4">
+    <style
+       id="style2">
+      .cls-1 {
+        fill: #00a3a6;
+      }
+
+      .cls-2 {
+        fill: #275663;
+      }
+    </style>
+  </defs>
+  <path
+     class="cls-2"
+     d="m 267.0022,52.127747 c -143.15531,0 -259.2012909,119.663923 -259.2012909,267.282303 0,147.61841 116.0459809,267.28233 259.2012909,267.28233 143.15528,0 259.20126,-119.66392 259.20126,-267.28233 0,-147.61838 -116.04598,-267.282303 -259.20126,-267.282303 z m 0,433.881553 c -89.21009,0 -161.56229,-74.56091 -161.56229,-166.59925 0,-92.03831 72.30663,-166.59925 161.56229,-166.59925 89.25562,0 161.56226,74.56094 161.56226,166.59925 0,92.03834 -72.30664,166.59925 -161.56226,166.59925 z"
+     id="path6"
+     style="stroke-width:4.62666" />
+  <path
+     class="cls-1"
+     d="M 531.44308,59.879822 H 640.74592 L 832.0145,581.75923 H 707.94962 L 667.35403,464.91425 H 504.10598 L 464.23936,581.75923 H 340.12892 L 531.39751,59.879822 Z m 115.95486,321.969728 -61.32622,-184.4995 -62.78421,184.4995 h 124.06487 z"
+     id="path8"
+     style="stroke-width:4.62666" />
+</svg>
diff --git a/public/Logos_OpernADOM.svg b/public/Logos_OpernADOM.svg
new file mode 100644
index 000000000..cf4ef6cd2
--- /dev/null
+++ b/public/Logos_OpernADOM.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="_x30_1"
+   viewBox="0 0 833.61 598.36"
+   version="1.1"
+   sodipodi:docname="2024_11_20_Logos_OpernADOM_SDE_1_interligne_petit.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata25">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="2507"
+     inkscape:window-height="1403"
+     id="namedview23"
+     showgrid="false"
+     inkscape:zoom="0.59559768"
+     inkscape:cx="681.94681"
+     inkscape:cy="469.55204"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="_x30_1" />
+  <defs
+     id="defs4">
+    <style
+       id="style2">
+      .cls-1 {
+        fill: #00a3a6;
+      }
+
+      .cls-2 {
+        fill: #275663;
+      }
+    </style>
+  </defs>
+  <path
+     class="cls-2"
+     d="m 128.21142,277.73013 c -17.38039,0 -33.131366,-3.58826 -47.408117,-10.76479 C 66.52657,259.78883 54.344772,250.41044 44.257941,238.74859 34.171108,227.08673 26.334423,213.79388 20.747872,198.78842 c -5.586551,-15.00543 -8.379834,-30.41863 -8.379834,-46.40269 0,-15.98408 2.870874,-31.72349 8.690198,-46.72893 C 26.877558,90.651336 35.024621,77.440036 45.421816,66.02284 55.81901,54.605656 68.155977,45.471909 82.432726,38.703146 96.709472,31.934386 112.30527,28.50922 129.2201,28.50922 c 16.91484,0 33.13135,3.588259 47.4081,10.764777 14.27674,7.176518 26.45855,16.63647 36.54538,28.379871 10.08681,11.743401 17.92353,25.117818 23.35489,40.123262 5.50895,15.00545 8.22463,30.25556 8.22463,45.66876 0,15.41319 -2.94844,31.72346 -8.69017,46.72892 -5.81932,15.00545 -13.8888,28.21676 -24.20842,39.63396 -10.31959,11.41717 -22.57896,20.55093 -36.85571,27.4828 -14.27674,6.93185 -29.87255,10.35701 -46.70979,10.35701 z M 67.302477,153.20124 c 0,9.45996 1.319044,18.59369 3.957146,27.4828 2.638087,8.88908 6.517641,16.79957 11.716238,23.73143 5.121004,6.93187 11.561056,12.47735 19.242579,16.63649 7.68149,4.15911 16.44929,6.19789 26.30335,6.19789 9.85404,0 19.32017,-2.20188 27.00167,-6.60566 7.68151,-4.40377 14.04396,-10.11237 19.08738,-17.12579 5.04343,-7.0134 8.84539,-15.00543 11.40588,-23.89453 2.48291,-8.8891 3.80197,-17.9413 3.80197,-27.15662 0,-9.21529 -1.31906,-18.59369 -3.95714,-27.4828 -2.63811,-8.88907 -6.59524,-16.71801 -11.87142,-23.48677 -5.27621,-6.768774 -11.71627,-12.232704 -19.24259,-16.228724 -7.60391,-3.996013 -16.2941,-6.034797 -26.14817,-6.034797 -9.85405,0 -19.24257,2.120339 -26.84648,6.442557 -7.603925,4.24066 -13.966386,9.86771 -19.087392,16.799584 -5.198597,6.93185 -9.000562,14.84235 -11.561057,23.73144 -2.560512,8.88909 -3.801964,17.9413 -3.801964,27.15659 z"
+     id="path6"
+     style="stroke-width:7.95465" />
+  <path
+     class="cls-2"
+     d="M 229.77806,277.73013 V 28.590775 h 101.17866 c 11.32831,0 21.7255,2.446543 31.19159,7.339627 9.46611,4.893069 17.61317,11.335628 24.36358,19.327659 6.75043,7.992033 12.10422,16.962689 16.06134,26.99349 3.87956,10.030815 5.81933,20.224749 5.81933,30.500219 0,11.00942 -1.86219,21.52955 -5.50895,31.56036 -3.64678,10.03082 -8.7678,19.08302 -15.36305,26.99349 -6.59522,7.99203 -14.5095,14.27149 -23.89801,18.91991 -9.38852,4.64845 -19.70812,7.01342 -31.0364,7.01342 h -48.10644 v 80.32808 H 229.70047 Z M 284.5573,147.24799 h 44.77002 c 6.44004,0 12.0266,-2.93586 16.68204,-8.80755 4.65549,-5.8717 6.98323,-14.35303 6.98323,-25.60712 0,-5.87169 -0.69834,-10.84633 -2.17256,-15.086994 -1.47423,-4.24068 -3.41401,-7.74739 -5.81932,-10.52013 -2.48292,-2.772751 -5.27619,-4.811535 -8.37984,-6.11636 -3.10364,-1.304812 -6.20728,-1.957232 -9.3885,-1.957232 h -42.75266 v 68.095386 z"
+     id="path8"
+     style="stroke-width:7.95465" />
+  <path
+     class="cls-1"
+     d="m 557.28971,268.25896 c -17.92352,6.90347 -35.14873,10.0341 -51.59804,9.47219 -16.44928,-0.5619 -31.50194,-4.17419 -45.15793,-10.75656 -13.65604,-6.58236 -25.52747,-15.73347 -35.5367,-27.37303 -10.00923,-11.63957 -17.76834,-24.96486 -23.12213,-39.8956 -5.74174,-16.05456 -8.61259,-32.10914 -8.53499,-48.32426 0.0776,-16.21509 3.10361,-31.46695 9.07814,-45.91605 5.9745,-14.449114 14.97505,-27.533591 27.00168,-39.173147 12.02659,-11.639556 27.15684,-21.031492 45.39072,-28.015225 18.2339,-6.983734 35.45909,-10.114374 51.8308,-9.311645 16.3717,0.802729 31.34678,4.575547 44.84761,11.318467 13.57843,6.823196 25.29465,16.134842 35.3039,27.934949 10.00925,11.880385 17.69076,25.366207 23.12212,40.537791 1.39665,3.93337 2.63809,7.86674 3.72437,11.71983 1.08628,3.85309 1.8622,7.3851 2.32772,10.35521 l -158.20806,60.68625 c 6.44005,14.44911 15.75098,23.76077 27.85516,27.93494 12.1818,4.17419 24.2084,3.93337 36.15743,-0.72244 9.54369,-3.61228 17.84593,-9.55248 24.98428,-17.7403 7.1384,-8.18783 10.70758,-16.93757 10.78519,-26.24921 l 61.21928,-5.21774 c -2.17254,20.71037 -10.16441,39.89559 -23.89802,57.63588 -13.73362,17.74029 -32.97618,31.38668 -57.7277,40.85888 z m -3.41402,-153.24084 c -6.44004,-13.56612 -15.28542,-22.797494 -26.6137,-27.694144 -11.3283,-4.896631 -23.27732,-4.976908 -35.76945,-0.16053 -12.49217,4.81635 -21.8031,13.084464 -27.15687,24.563484 -5.35379,11.47902 -6.20728,24.40294 -2.63808,38.6915 l 92.1781,-35.32003 z"
+     id="path10"
+     style="stroke-width:7.89205" />
+  <path
+     class="cls-2"
+     d="M 678.71963,135.25994 V 277.73013 H 623.94038 V 28.590775 h 42.75266 L 777.18264,174.89388 V 28.590775 h 54.77925 V 277.73013 h -44.0717 z"
+     id="path12"
+     style="stroke-width:7.95465" />
+  <path
+     class="cls-2"
+     d="m 88.114312,313.18482 h 49.425478 l 86.43637,249.13937 H 164.15352 L 147.00588,500.01896 H 78.260255 L 61.423011,562.32419 H 1.6003364 L 88.036726,313.18482 Z m 50.511758,145.32451 -25.83782,-82.04064 -26.458523,82.04064 z"
+     id="path14"
+     style="stroke-width:7.95465" />
+  <path
+     class="cls-2"
+     d="M 201.08683,562.32419 V 313.18482 h 88.45375 c 19.55293,0 36.70054,3.26206 51.44283,9.86774 14.6647,6.52408 27.00169,15.41319 36.93333,26.66728 9.93165,11.25406 17.38039,24.38386 22.34622,39.47085 5.04341,15.087 7.52632,31.1526 7.52632,48.2784 0,18.91989 -2.79328,36.12724 -8.37981,51.37734 -5.58658,15.33166 -13.50085,28.46143 -23.89804,39.30774 -10.31961,10.84633 -22.81176,19.32768 -37.39888,25.28093 -14.58712,5.95322 -30.80363,8.97065 -48.57197,8.97065 H 201.08683 Z M 355.80329,437.38753 c 0,-11.74341 -1.47422,-22.50816 -4.50027,-32.13123 -2.94845,-9.62305 -7.29355,-17.9413 -13.03529,-24.95472 -5.74173,-7.01339 -12.72493,-12.39579 -21.10475,-16.14715 -8.37984,-3.75137 -17.76834,-5.62704 -28.24314,-5.62704 h -36.07982 v 158.5358 h 36.07982 c 10.70757,0 20.25127,-2.03877 28.63111,-6.0348 8.30221,-3.99602 15.28542,-9.54151 20.87197,-16.71802 5.58655,-7.17652 9.85405,-15.49477 12.8801,-25.19938 3.02605,-9.70459 4.50027,-20.22472 4.50027,-31.72346 z"
+     id="path16"
+     style="stroke-width:7.95465" />
+  <path
+     class="cls-2"
+     d="m 500.66573,562.32419 c -17.38039,0 -33.13137,-3.58825 -47.40814,-10.76477 -14.27672,-7.17652 -26.45851,-16.55494 -36.54534,-28.21678 -10.08683,-11.66183 -17.92353,-24.9547 -23.51008,-39.96015 -5.58656,-15.00545 -8.37983,-30.41865 -8.37983,-46.40272 0,-15.98407 2.87086,-31.72347 8.69019,-46.72892 5.81933,-15.00545 13.96638,-28.21677 24.36358,-39.63394 10.3972,-11.4172 22.73417,-20.55095 37.01092,-27.31972 14.27674,-6.76875 29.87253,-10.19391 46.78737,-10.19391 16.91484,0 33.13136,3.58825 47.40811,10.76477 14.27675,7.17652 26.45853,16.63648 36.54536,28.37987 10.08684,11.7434 17.92353,25.11781 23.35491,40.12327 5.50896,15.00545 8.22465,30.25554 8.22465,45.66875 0,15.41321 -2.94848,31.72347 -8.6902,46.72892 -5.81935,15.00546 -13.88879,28.21677 -24.2084,39.63395 -10.3196,11.41718 -22.57899,20.55095 -36.85573,27.48281 -14.27675,6.93187 -29.87253,10.35702 -46.70978,10.35702 z m -60.90894,-124.5289 c 0,9.45995 1.31903,18.59369 3.95711,27.4828 2.63811,8.88909 6.51767,16.79957 11.71627,23.73145 5.121,6.93185 11.56105,12.47734 19.24255,16.63648 7.68152,4.15909 16.44931,6.19788 26.30337,6.19788 9.85406,0 19.32015,-2.20189 27.00166,-6.60566 7.68151,-4.40377 14.04399,-10.11236 19.08742,-17.12576 5.04338,-7.01343 8.84535,-15.00546 11.40584,-23.89456 2.48292,-8.8891 3.80198,-17.94128 3.80198,-27.15659 0,-9.2153 -1.31906,-18.59372 -3.95716,-27.4828 -2.63808,-8.88909 -6.59522,-16.71804 -11.87142,-23.48678 -5.2762,-6.76878 -11.71624,-12.23272 -19.24256,-16.22874 -7.60395,-3.99601 -16.29412,-6.0348 -26.14817,-6.0348 -9.85406,0 -19.24258,2.12034 -26.84652,6.44256 -7.60389,4.24069 -13.96635,9.86771 -19.08737,16.79957 -5.19858,6.93188 -9.00054,14.84236 -11.56107,23.73146 -2.56049,8.88908 -3.80193,17.94129 -3.80193,27.1566 z"
+     id="path18"
+     style="stroke-width:7.95465" />
+  <path
+     class="cls-2"
+     d="M 766.64769,562.32419 V 396.36722 L 716.36873,517.06319 H 687.66004 L 637.38107,396.36722 v 165.95697 h -43.063 V 313.18482 h 58.27083 l 60.28824,130.15596 60.59857,-130.15596 h 57.96048 v 249.13937 h -64.6333 z"
+     id="path20"
+     style="stroke-width:7.95465" />
+</svg>
diff --git a/src/components/common/CollapsibleTree.vue b/src/components/common/CollapsibleTree.vue
index cf8a9ff4e..3335cef8f 100644
--- a/src/components/common/CollapsibleTree.vue
+++ b/src/components/common/CollapsibleTree.vue
@@ -20,7 +20,7 @@
               @click="(event) => onClickLabelCb && onClickLabelCb(event, option.label)"
               @keyup.enter="(event) => onClickLabelCb && onClickLabelCb(event, option.label)"
             >
-              <!-- TODO Lucile : btn ouvertur sidePanel à redéfinir ce qu'on met dedant puis refaire-->
+              <!-- TODO Lucile : btn ouverture sidePanel à redéfinir ce qu'on met dedant puis refaire-->
               <b-tooltip
                 v-if="false"
                 :label="$t('dataTypesManagement.tooltip_show_secondary_menu')"
diff --git a/src/components/common/SubMenu.vue b/src/components/common/SubMenu.vue
index 91c7e9832..b76d5cf9b 100644
--- a/src/components/common/SubMenu.vue
+++ b/src/components/common/SubMenu.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="SubMenu">
     <FontAwesomeIcon
+      v-if="!isAccueil"
       class="clickable mr-4 SubMenu-back-button"
       icon="arrow-left"
       @click="goBack()"
@@ -47,6 +48,10 @@ export default {
     paths: {
       type: Array,
     },
+    isAccueil: {
+      type: Boolean,
+      default: false,
+    },
   },
   methods: {
     goBack() {
diff --git a/src/composable/data/dataLoader.js b/src/composable/data/dataLoader.js
index 5585ca762..c1bb2daea 100644
--- a/src/composable/data/dataLoader.js
+++ b/src/composable/data/dataLoader.js
@@ -116,7 +116,7 @@ export function dataLoader(services) {
     getOrLoadDataByNaturalKey,
     getValueDisplay,
     getColumnNameView,
-    getDisplayValueForLink
+    getDisplayValueForLink,
   };
   //const getOrLoadData = function()
 }
diff --git a/src/locales/en.json b/src/locales/en.json
index 92b890637..db1169ce6 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -980,7 +980,7 @@
     "data-type-new-authorization": "New authorization",
     "data-type-request-authorization": "Request authorizations",
     "data-types-page": "{applicationName} data types",
-    "data-types-repository": "Management of data sets {applicationName}",
+    "data-types-repository": "Management of data sets {dataName}",
     "login-page": "Welcome to",
     "profile": "Profile",
     "references-authorizations": "References authorizations",
diff --git a/src/locales/fr.json b/src/locales/fr.json
index 3839c2506..146b565f0 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -989,7 +989,7 @@
     "data-type-new-authorization": "Nouvelle autorisation",
     "data-type-request-authorization": "Demande d'autorisations",
     "data-types-page": "Type de données de {applicationName}",
-    "data-types-repository": "Gestion des jeux de données de {applicationName}",
+    "data-types-repository": "Gestion des jeux de données de {dataName}",
     "login-page": "Bienvenue sur",
     "profile": "Profil",
     "references-authorizations": "Autorisations des référentiels",
diff --git a/src/views/application/ApplicationInfoView.vue b/src/views/application/ApplicationInfoView.vue
index 4d93a3baf..7d4338221 100644
--- a/src/views/application/ApplicationInfoView.vue
+++ b/src/views/application/ApplicationInfoView.vue
@@ -96,7 +96,7 @@ export default {
         new SubMenuPath(
           "Accueil",
           () => app.$router.push(`/applications/${props.applicationName}`),
-          () => app.$router.push(`/applications`)
+          () => {}
         ),
       ]);
     });
@@ -184,6 +184,7 @@ export default {
     <SubMenu
       :aria-label="$t('menu.aria-sub-menu')"
       :paths="subMenuPaths"
+      :is-accueil="true"
       :root="application.localName || applicationName"
       role="navigation"
     />
diff --git a/src/views/data/DataVersioningView.vue b/src/views/data/DataVersioningView.vue
index 3d0fc6c49..9d37697c2 100644
--- a/src/views/data/DataVersioningView.vue
+++ b/src/views/data/DataVersioningView.vue
@@ -1,16 +1,30 @@
 <template>
   <div>
-    <PageView class="with-submenu" :application="application">
+    <PageView :application="application" class="with-submenu">
       <SubMenu
         :aria-label="$t('menu.aria-sub-menu')"
         :paths="subMenuPaths"
         :root="application.localName || application.title"
         role="navigation"
       />
-      <h1 class="title main-title">
+      <b-tooltip
+        v-if="data.localDescription"
+        :label="data.localDescription"
+        class="title main-title"
+        position="is-top"
+      >
+        <h1 class="title main-title">
+          {{
+            $t("titles.data-types-repository", {
+              dataName: data.localName || dataId
+            })
+          }}
+        </h1>
+      </b-tooltip>
+      <h1 v-else class="title main-title">
         {{
           $t("titles.data-types-repository", {
-            applicationName: application.localName || dataId,
+            dataName: data.localName || dataId
           })
         }}
       </h1>
@@ -31,21 +45,21 @@
             <template #trigger="{ active }">
               <b-taginput
                 v-model="requiredAuthorizationsLabels[referenceScopesByData.id]"
-                :icon-right="active ? 'angle-up' : 'angle-down'"
-                open-on-focus
-                rounded
-                type="is-dark"
-                :closable="false"
                 :aria-placeholder="
                   $t('dataTypesRepository.placeholder-select-scope-depot', {
                     scope: referenceScopesByData.i18n[locale] || referenceScopesByData.id,
                   })
                 "
+                :closable="false"
+                :icon-right="active ? 'angle-up' : 'angle-down'"
                 :placeholder="
                   $t('dataTypesRepository.placeholder-select-scope-depot', {
                     scope: referenceScopesByData.i18n[locale] || referenceScopesByData.id,
                   })
                 "
+                open-on-focus
+                rounded
+                type="is-dark"
               >
               </b-taginput>
             </template>
@@ -84,11 +98,11 @@
                         label-position="on-border"
                       >
                         <InputDate
-                          :input-type="determinateInputType()"
                           :format="patternDateTimeScope"
-                          name="startDate"
-                          :is-simple-value="true"
                           :from="startDate"
+                          :input-type="determinateInputType()"
+                          :is-simple-value="true"
+                          name="startDate"
                           @update:dateValue="updateDate($event)"
                         >
                         </InputDate>
@@ -102,11 +116,11 @@
                         label-position="on-border"
                       >
                         <InputDate
-                          :input-type="determinateInputType()"
                           :format="patternDateTimeScope"
-                          name="endDate"
-                          :is-simple-value="true"
                           :from="endDate"
+                          :input-type="determinateInputType()"
+                          :is-simple-value="true"
+                          name="endDate"
                           @update:dateValue="updateDate($event)"
                         >
                         </InputDate>
@@ -122,8 +136,8 @@
                         <span class="file-cta">
                           <b-icon class="file-icon" icon="upload"></b-icon>
                           <span class="file-label">{{
-                            $t("dataTypesRepository.choose-file")
-                          }}</span>
+                              $t("dataTypesRepository.choose-file")
+                            }}</span>
                         </span>
                         <span v-if="file" class="file-name">
                           {{ file.name }}
@@ -147,7 +161,7 @@
                 <div class="column is-10"></div>
                 <div class="column is-2" style="float: right">
                   <b-button expanded style="float: right" type="is-dark" @click="upload"
-                    >{{ $t("dataTypesRepository.submit") }}
+                  >{{ $t("dataTypesRepository.submit") }}
                   </b-button>
                 </div>
               </footer>
@@ -343,7 +357,7 @@ export default {
     },
     services() {
       return services;
-    },
+    }
   },
   components: {
     CollapseMenuOneSelect,
@@ -351,15 +365,15 @@ export default {
     InputDate,
     LoadingAnimate,
     PageView,
-    SubMenu,
+    SubMenu
   },
   props: {
     applicationName: {
-      type: String,
+      type: String
     },
     dataId: {
-      type: String,
-    },
+      type: String
+    }
   },
   setup(props, ctx) {
     const loader = dataLoader(services);
@@ -371,7 +385,7 @@ export default {
     const {
       shallowRefArray: errorsList,
       doChangeArray: changeErrorsList,
-      doAddToArray: addErrorsList,
+      doAddToArray: addErrorsList
     } = useArray();
     const { reactiveObject: application, doChangeObject: changeApplication } = useObject(
       new ApplicationResult()
@@ -386,16 +400,17 @@ export default {
     const { refBoolean: submissionListVisible } = useBoolean();
     const {
       reactiveObject: requiredAuthorizationsObject,
-      doChangeObject: changeRequiredAuthorizationsObject,
+      doChangeObject: changeRequiredAuthorizationsObject
     } = useObject();
     const {
       reactiveObject: requiredAuthorizationsLabels,
-      doChangeObject: changeRequiredAuthorizationsLabels,
+      doChangeObject: changeRequiredAuthorizationsLabels
     } = useObject();
     let getSubmissionReferenceScopePath =
       services.internationalisationService.getSubmissionReferenceScopePath;
     let getDataTypeDisplay = services.internationalisationService.getDataTypeDisplay;
     let datasets = ref({});
+    let data = ref({});
     let file = ref(null);
     let startDate = ref(null);
     let endDate = ref(null);
@@ -414,13 +429,13 @@ export default {
       y: { pattern: "\\d", type: "date" },
       M: { pattern: "\\d", type: "date" },
       Z: { pattern: "[+-]\\d{4}", type: "date" },
-      G: { pattern: "[AB]D", type: "date" },
+      G: { pattern: "[AB]D", type: "date" }
     });
     onMounted(async () => {
       await init();
       changeSubMenuPaths([
         new SubMenuPath(
-          props.dataId.toLowerCase(),
+          data.value.localName.toLowerCase() || props.dataId.toLowerCase(),
           () => {},
           () => app.$router.push(`/applications/${props.applicationName}/dataTypes`)
         ),
@@ -517,11 +532,11 @@ export default {
           await services.applicationService.getApplication(props.applicationName, [
             "CONFIGURATION",
             "DATATYPE",
-            "REFERENCETYPE",
+            "REFERENCETYPE"
           ])
         );
         const loadingComponent = app.$buefy.loading.open({
-          container: document.getElementById("element"),
+          container: document.getElementById("element")
         });
         changeVersioning(application.configuration.dataDescription[props.dataId].submission);
         componentNameTimeScope = versioning?.submissionScope?.timescope?.component;
@@ -530,7 +545,7 @@ export default {
           localDatatypeName: services.internationalisationService.localeDataTypeIdName(
             application,
             application.dataTypes[props.dataId]
-          ),
+          )
         });
         changeConfiguration(application.configuration.dataDescription[props.dataId]);
         changeAuthorizations(configuration.submission.submissionScope);
@@ -541,9 +556,10 @@ export default {
             requiredAuthorizations: {},
             from: "",
             to: "",
-            comment: "",
+            comment: ""
           })
         );
+        getI18nData(application);
         let refForAuth = {};
         let reference = "";
         for (let auth in authorizations.value) {
@@ -598,6 +614,15 @@ export default {
       }
     }
 
+    function getI18nData(application) {
+      let dataLocal = {
+        localName: application.configuration.i18n.data[props.dataId].i18n.title[locale],
+        localDescription:
+          application.configuration.i18n.data[props.dataId].i18n.description[locale]
+      };
+      data.value = dataLocal;
+    }
+
     function nameSelectedTagList(nameTagList) {
       return i18n.t("dataTypesManagement.selected_filter", { key: nameTagList });
     }
@@ -697,7 +722,7 @@ export default {
       changeErrorsMessages([]);
       dataset.params.published = pusblished;
       let requiredAuthorizations = dataset.params.binaryFiledataset.requiredAuthorizations;
-      requiredAuthorizations = Object.keys(requiredAuthorizations).reduce(function (acc, key) {
+      requiredAuthorizations = Object.keys(requiredAuthorizations).reduce(function(acc, key) {
         acc[key] = acc[key] ? acc[key].sql : "";
         return acc;
       }, requiredAuthorizations);
@@ -755,11 +780,11 @@ export default {
       selected.requiredAuthorizations[event.type] = [event.naturalKey];
       changeRequiredAuthorizationsObject({
         ...requiredAuthorizationsObject,
-        [event.type]: [event.id],
+        [event.type]: [event.id]
       });
       changeRequiredAuthorizationsLabels({
         ...requiredAuthorizationsLabels,
-        [event.type]: [event.localName],
+        [event.type]: [event.localName]
       });
       if (currentDataset.value) {
         datasets.value = currentDataset.value;
@@ -798,7 +823,7 @@ export default {
         }
         getDatasetMap({
           binaryFileList: datasetsList.map((d) => new BinaryFile(d)),
-          uuid: uuid,
+          uuid: uuid
         });
       }
     }
@@ -831,7 +856,7 @@ export default {
           (isPublished
             ? "<b>La version contient des données publiées.</b><br />La supprimer entraînera la suppression de ces données.<br /><br />?"
             : "") + "Etes vous sûr de vouloir supprimer cette version?",
-        onConfirm: () => deleteFile(dataset.id),
+        onConfirm: () => deleteFile(dataset.id)
       });
     }
 
@@ -891,7 +916,7 @@ export default {
           localName,
           isLeaf: false,
           currentPath: newCurrentPath,
-          completeLocalName,
+          completeLocalName
         };
         authPartition.rows.push(referenceValue);
         returnValues[naturalKey] = authPartition;
@@ -903,7 +928,7 @@ export default {
           returnValues[returnValuesKey] = {
             ...auth,
             isLeaf: true,
-            rows: referenceValueLeaf,
+            rows: referenceValueLeaf
           };
         } else {
           let r = await partitionReferencesValues(
@@ -914,12 +939,13 @@ export default {
           returnValues[returnValuesKey] = {
             ...auth,
             isLeaf: false,
-            rows: r,
+            rows: r
           };
         }
       }
       return returnValues;
     }
+
     function internationalizeRequiredAuthorization(data, datasets) {
       const value =
         datasets?.datasets?.[0]?.params?.binaryFiledataset?.requiredAuthorizations?.[data]?.sql;
@@ -963,9 +989,10 @@ export default {
       comment,
       currentDataset,
       internationalizeRequiredAuthorization,
-      submissionListVisible,
+      data,
+      submissionListVisible
     };
-  },
+  }
 };
 </script>
 
@@ -992,6 +1019,7 @@ table.datasetsPanel td {
   border-collapse: collapse;
   text-align: center;
 }
+
 .subtitle {
   font-style: italic;
 }
diff --git a/src/views/data/DatasManagementView.vue b/src/views/data/DatasManagementView.vue
index 59b9ff1a0..c704af262 100644
--- a/src/views/data/DatasManagementView.vue
+++ b/src/views/data/DatasManagementView.vue
@@ -6,8 +6,13 @@
       :root="application.localName || application.title"
       role="navigation"
     />
-    <h1 class="title main-title">
-      <b-tooltip :label="application.localDescription">
+    <b-tooltip
+      v-if="application.localDescription"
+      :label="application.localDescription"
+      class="title main-title"
+      position="is-top"
+    >
+      <h1 class="title main-title">
         {{
           type[type.length - 1] === "dataTypes"
             ? $t("titles.data-types-page", {
@@ -17,17 +22,27 @@
                 applicationName: application.localName || application.title,
               })
         }}
-      </b-tooltip>
-      <b-tooltip :label="$t('dataTypesManagement.consult-authorization')" position="is-bottom">
-        <b-button
-          icon-left="key"
-          type="is-warning"
-          @click="consultAuthorization"
-          outlined
-          rounded
-        />
-      </b-tooltip>
+      </h1>
+    </b-tooltip>
+    <h1 v-else class="title main-title">
+      {{
+        type[type.length - 1] === "dataTypes"
+          ? $t("titles.data-types-page", {
+              applicationName: application.localName || application.title,
+            })
+          : $t("titles.references-page", {
+              applicationName: application.localName || application.title,
+            })
+      }}
     </h1>
+    <div
+      class="btn_auth_tooltip"
+      v-if="canCreateApplication || canManagerApplication || canManagerUser"
+    >
+      <b-tooltip :label="$t('dataTypesManagement.consult-authorization')" position="is-top">
+        <b-button icon-left="key" outlined rounded type="is-warning" @click="consultAuthorization" />
+      </b-tooltip>
+    </div>
     <div v-if="errorsMessages.length !== 0" style="margin: 10px">
       <ShowErrors
         :errors-messages="errorsMessages"
@@ -140,6 +155,11 @@ export default {
     const { reactiveObject: application, doChangeObject: changeApplication } = useObject(
       new ApplicationResult()
     );
+    const { refBoolean: canCreateApplication, doChangeBoolean: changeCanCreateApplication } =
+      useBoolean(false);
+    const { refBoolean: canManagerApplication, doChangeBoolean: changeCanManagerApplication } =
+      useBoolean(false);
+    const { refBoolean: canManagerUser, doChangeBoolean: changeCanManagerUser } = useBoolean(false);
     const type = window.location.href.split("/");
     const hasTags = useBoolean(false).refBoolean;
     const changeTags = function (tagsToChange) {
@@ -182,6 +202,23 @@ export default {
       ]);
       changeTags(buildTags(application, datas.value));
       changeDatas(services.tagService.toBeShown(tags, datas.value));
+      try {
+        changeCanCreateApplication(
+          application?.currentApplicationUserRolesResult?.isApplicationCreator
+            ? application?.currentApplicationUserRolesResult?.isApplicationCreator
+            : application?.currentApplicationUserRolesResult?.isOpenAdomAdmin
+        );
+        changeCanManagerApplication(
+          application?.currentApplicationUserRolesResult?.applicationRoles.includes(
+            "applicationManager"
+          )
+        );
+        changeCanManagerUser(
+          application?.currentApplicationUserRolesResult?.applicationRoles.includes("userManager")
+        );
+      } catch (error) {
+        console.log("missing admin application rights", error);
+      }
     });
 
     function addAuthorizationToData(reference) {
@@ -377,6 +414,9 @@ export default {
     }
 
     return {
+      canCreateApplication,
+      canManagerApplication,
+      canManagerUser,
       openRefDetails,
       uploadReferenceCsv,
       changeTagSelected,
@@ -409,4 +449,9 @@ export default {
   margin-bottom: 10px;
   border: 1px solid white;
 }
+.btn_auth_tooltip {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
 </style>
-- 
GitLab


From d12e4c317bff8b9a0877fa5ecbc99e9ddd16dd11 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Wed, 11 Dec 2024 11:32:00 +0100
Subject: [PATCH 20/61] =?UTF-8?q?Modification=20du=20panneau=20de=20data?=
 =?UTF-8?q?=20-=20exemple=20de=20100=20lignes=20seulemen=20si=20le=20nombr?=
 =?UTF-8?q?e=20de=20donn=C3=A9es=20est=20<100=20-=20suppression=20des=20bo?=
 =?UTF-8?q?utons=20de=20mise=20=C3=A0=20jour=20de=20la=20liste=20-=20bouto?=
 =?UTF-8?q?n=20tout=20charger=20ou=20charger=20le=20filtre=20-=20ajout=20d?=
 =?UTF-8?q?'une=20info=20sur=20le=20nombre=20de=20lignes=20t=C3=A9l=C3=A9c?=
 =?UTF-8?q?hargeables=20-gestion=20de=20l'evenement=20pas=20de=20droits?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../common/provider/FiltersDataCollapse.vue   |   7 +-
 src/locales/en.json                           |   3 +-
 src/locales/fr.json                           |  17 +-
 src/services/AlertService.js                  |   2 +-
 src/services/rest/DataService.js              |   4 +-
 src/views/data/DataTableView.vue              | 309 +++++++++---------
 src/views/data/DatasManagementView.vue        |  45 +--
 7 files changed, 194 insertions(+), 193 deletions(-)

diff --git a/src/components/common/provider/FiltersDataCollapse.vue b/src/components/common/provider/FiltersDataCollapse.vue
index ce569ee4e..d53e35739 100644
--- a/src/components/common/provider/FiltersDataCollapse.vue
+++ b/src/components/common/provider/FiltersDataCollapse.vue
@@ -142,10 +142,11 @@
     <div class="card-footer">
       <div class="card-footer-item">
         <b-button expanded icon-left="redo" outlined type="is-danger" @click="clear()"
+                  disabled="!filters.length"
           >{{ $t("dataTypesManagement.réinitialiser") }}
           {{ $t("dataTypesManagement.filtre") }}
         </b-button>
-      </div>
+      </div><!--
       <div class="card-footer-item">
         <b-button
           expanded
@@ -156,7 +157,7 @@
         >
           {{ $t("dataTable.consult-result-filter") }}
         </b-button>
-      </div>
+      </div>-->
       <div class="card-footer-item">
         <b-button
           expanded
@@ -164,7 +165,7 @@
           type="is-primary"
           @click="$emit('download-search', { filters })"
         >
-          {{ $t("dataTable.donwload-result-filter") }}
+          {{ filters.length?$t("dataTable.donwload-result-filter"): $t("dataTable.donwload-result") }}
         </b-button>
       </div>
     </div>
diff --git a/src/locales/en.json b/src/locales/en.json
index c62749129..30a689d10 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -124,6 +124,7 @@
     "app_version": "Current version of {name} is: {version}",
     "app_update_version": "Version of {name} proposed is: {version}",
     "change": "Update",
+    "register-rows": "No records | Only one record | About {totalRows} records available",
     "no-right-for-application": "you have no rights to view this data",
     "charte_message": "I have read and accept the conditions of use of the data.",
     "charte_header": "To access the {localName} application, you must accept the conditions of use.",
@@ -301,7 +302,7 @@
   "dataTable": {
     "consult-result-filter": "View filter result",
     "donwload-result-filter": "Download filter result",
-    "donwload-view-result": "Download the visible result"
+    "donwload-result": "Download all data"
   },
   "dataTypesRepository": {
     "card-title-upload-file": "Drop a version on this dataset",
diff --git a/src/locales/fr.json b/src/locales/fr.json
index dd11f9508..b9ae2ed74 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -1,5 +1,5 @@
 {
-  "boolean":{
+  "boolean": {
     "true": "Vrai",
     "false": "Faux"
   },
@@ -124,7 +124,8 @@
     "app_version": "Version actuelle de {name} est : {version}",
     "app_update_version": "Version de {name} proposée est : {version}",
     "change": "Mise à jour",
-    "no-right-for-application" : "vous n'avez pas de droits vous premettant de consulter ces données",
+    "register-rows": "Aucun enregistrement  | Un seul enregistrement | Environ {totalRows} enregistrements disponibles",
+    "no-right-for-application": "vous n'avez pas de droits vous premettant de consulter ces données",
     "charte_message": "J'ai lu et j'accepte les conditions d'utilisation des données.",
     "charte_header": "Pour accéder à l'application {localName}, vous devez accepter les conditions d'utilisation.",
     "chose-config": "Choisir une configuration",
@@ -257,7 +258,7 @@
     "users-placeholder": "Sélectionner les utilisateurs à autoriser",
     "validate": "confirmer",
     "warnning-chil-not-null": "Des limitations sont en cours sur des enfants, elles seront remplacées.",
-    "name-data" : "Nom",
+    "name-data": "Nom",
     "notification-missing-info": "Il manque soit le nom soit le commentaire de l'autorisation. Merci de renseigner ces informations afin de pouvoir enregistrer l'autorisation.",
     "list-users": "Liste des utilisateurs : ({numberUsers})",
     "list-auths": "Liste des autorisations : ({numberAuths})",
@@ -302,7 +303,7 @@
   "dataTable": {
     "consult-result-filter": "Visualiser le résultat du filtre",
     "donwload-result-filter": "Télécharger le résultat du filtre",
-    "donwload-view-result": "Télécharger le résultat visible"
+    "donwload-result": "Télécharger toutes les données"
   },
   "dataTypesRepository": {
     "card-title-upload-file": "Déposer une version pour ce jeu de données",
@@ -330,7 +331,7 @@
     "table-file-data-version": "N° version",
     "tooltip-jeux de données": "Sélectionnez un jeu de données pour connaître la liste des fichiers versionnés correspondants (révisions).",
     "version-number": "Nombre de versions",
-    "scope-depot" : "Portée du dépôt",
+    "scope-depot": "Portée du dépôt",
     "placeholder-select-scope-depot": "Choisissez la portée de : {scope}"
   },
   "errors-OA-v1": {
@@ -535,11 +536,11 @@
     }
   },
   "errors-yaml": {
-    "badNameWithRight" : {
+    "badNameWithRight": {
       "title": "Erreur d'autorisation",
       "message": "Vous n'avez pas le droit de créer une application avec le nom <code>{name}</code>.<br/> Contacter l'administrateur pour demander les droits."
     },
-    "invalidLengthName" : {
+    "invalidLengthName": {
       "title": "Erreur dans le fichier de configuration",
       "message": "La longueur maximum de caractère pour le nom de l'application est de 47 caractères"
     },
@@ -827,7 +828,7 @@
     "sqlConvertException": "Une erreur dans une requête sql est survenue ligne {locationLineNumber} colonne {locationColumnNumber}<br/>{message}",
     "sqlConvertExceptionForClass": "Une erreur sql d'évaluation de valeur est survenue. {message}",
     "missingPrimaryKeyComponent": "Aucune colonne désignée comme clé naturelle pour le référentiel <code>{param0}</code>",
-    "separatorUsingInValue": "Vous ne devez pas utiliser le séparateur csv <code>{param1}</code> dans la valeur <code>{param0}</code>" ,
+    "separatorUsingInValue": "Vous ne devez pas utiliser le séparateur csv <code>{param1}</code> dans la valeur <code>{param0}</code>",
     "tooLonglabel": "Les identificateurs pas être plus long que 256 caractères",
     "nullLabel": "Les identifiants ne peuvent pas être laissés vides",
     "inappropriateLabel": "L'identificateur <code>{param0}</code> doit commencer par une minuscule et ne doit contenir que des minuscules, des chiffres ou l'espace souligné",
diff --git a/src/services/AlertService.js b/src/services/AlertService.js
index d5f38b285..1660e2ff1 100644
--- a/src/services/AlertService.js
+++ b/src/services/AlertService.js
@@ -66,7 +66,7 @@ export class AlertService {
             position: TOAST_POSITION
           });
         }
-        state.value = t;
+        if(state)state.value = t;
       });
     } else {
       ToastProgrammatic.open({
diff --git a/src/services/rest/DataService.js b/src/services/rest/DataService.js
index ccee857f2..c1dc23c34 100644
--- a/src/services/rest/DataService.js
+++ b/src/services/rest/DataService.js
@@ -11,7 +11,7 @@ export class DataService extends Fetcher {
     return this.getChunck(method, url);
   }
 
-  async getData(applicationName, dataName, params, onlyMetadata) {
+  async getData(applicationName, dataName, params, loadExample) {
     const locale = services.internationalisationService.getLocale();
     params = params || {};
     params.outPut = params.outPut || {};
@@ -19,7 +19,7 @@ export class DataService extends Fetcher {
     if (params) {
       return this.get(`applications/${applicationName}/data/${dataName}/json`, {
         downloadDatasetQuery: JSON.stringify(params),
-        onlyMetadata: !!onlyMetadata,
+        loadExample: !!loadExample,
       });
     } else {
       return this.get(`applications/${applicationName}/data/${dataName}/json`);
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index 85a22082d..07b604af7 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -17,151 +17,147 @@
         @change:allTags="changeAllValueTags($event)"
       />
     </div>
-    <FiltersDataCollapse v-if="state!='NO-RIGHTS'"
-                         :application="application"
-                         :application-name="applicationName"
-                         :columns-to-be-shown="dataColumnsToBeShown"
-                         :data-id="dataId"
-                         :is-ref-link-to="referenceTypeForReferencingColumns"
-                         @view-search="recalculate($event)"
-                         @download-search="recalculate($event, true)"
-                         @clear-search="clear($event)"
-    />
-    <LoadingAnimate v-if="isLoading" :size="'is-large'"></LoadingAnimate>
-    <div v-if="!onlyMetadata && data && dataColumnsToBeShown && !isLoading && state!='NO-RIGHTS'">
-      <b-table
-        id="filtreTable"
-        :current-page="currentPage"
-        :data="rows"
-        :is-focusable="true"
-        :is-hoverable="true"
-        :per-page="params.limit"
-        :sticky-header="true"
-        pagination-position="both"
-        :height="tableHeight"
-        paginated
-        striped
-        style="padding-bottom: 20px; position: relative; z-index: 2"
-      >
-        <template #pagination>
-          <b-pagination
-            v-model="currentPage"
-            :aria-current-label="$t('menu.aria-curent-page')"
-            :aria-label="$t('menu.aria-pagination')"
-            :aria-next-label="$t('menu.aria-next-page')"
-            :aria-previous-label="$t('menu.aria-previous-page')"
-            :current-page.sync="currentPage"
-            :per-page="params.limit"
-            :rounded="true"
-            :total="
-              totalRows ? totalRows : lineCountSynthesis(application.referenceSynthesis, dataId)
-            "
-            order="is-centered"
-            range-after="3"
-            range-before="3"
-            role="navigation"
-            @change="changePage"
-            style="margin: 0; padding-top: 20px; padding-bottom: 20px"
-          />
-        </template>
-        <b-table-column
-          v-for="column in dataColumnsToBeShown"
-          :key="column.id"
-          :field="column.id"
+    <div v-if="state!=='NO-RIGHTS'">
+      <FiltersDataCollapse
+        :application="application"
+        :application-name="applicationName"
+        :columns-to-be-shown="dataColumnsToBeShown"
+        :data-id="dataId"
+        :is-ref-link-to="referenceTypeForReferencingColumns"
+        @view-search="recalculate($event)"
+        @download-search="recalculate($event, true)"
+        @clear-search="clear($event)"
+      />
+      <LoadingAnimate v-if="isLoading" :size="'is-large'"></LoadingAnimate>
+      <div v-if="data && dataColumnsToBeShown && !isLoading && totalRows<101">
+        <b-table
+          id="filtreTable"
+          :current-page="currentPage"
+          :data="rows"
+          :is-focusable="true"
+          :is-hoverable="true"
+          :per-page="params.limit"
+          :sticky-header="true"
+          :height="tableHeight"
+          striped
           style="padding-bottom: 20px; position: relative; z-index: 2"
-          sortable
         >
-          <template v-slot:header>
-            <div v-if="column.tags" class="column" style="padding: 0">
-              <TagsInfos
-                :info-parent="column"
-                :tags-column="Object.keys(tags).length !== 0 ? tags : {}"
-              >
-              </TagsInfos>
-              <DatasPatternLink
-                v-if="'PatternComponent' === column.type"
-                :info="column.type === 'PatternComponent'"
-                :application="application"
-                :value="column.getColumnQualifiersMap(application, dataId, rows[0])"
-                :column-id="column.id"
-                :column-title="column.id"
-                :info-values="column.getColumnQualifiersMap(application, dataId, rows[0])"
-                :loaded-references-by-key="{}"
-                :pattern-checker-date-ref="patternCheckerDateRef"
-                :data-id="dataId"
-              ></DatasPatternLink>
-              <div v-else>
+          <b-table-column
+            v-for="column in dataColumnsToBeShown"
+            :key="column.id"
+            :field="column.id"
+            style="padding-bottom: 20px; position: relative; z-index: 2"
+            sortable
+          >
+            <template v-slot:header>
+              <div v-if="column.tags" class="column" style="padding: 0">
+                <TagsInfos
+                  :info-parent="column"
+                  :tags-column="Object.keys(tags).length !== 0 ? tags : {}"
+                >
+                </TagsInfos>
+                <DatasPatternLink
+                  v-if="'PatternComponent' === column.type"
+                  :info="column.type === 'PatternComponent'"
+                  :application="application"
+                  :value="column.getColumnQualifiersMap(application, dataId, rows[0])"
+                  :column-id="column.id"
+                  :column-title="column.id"
+                  :info-values="column.getColumnQualifiersMap(application, dataId, rows[0])"
+                  :loaded-references-by-key="{}"
+                  :pattern-checker-date-ref="patternCheckerDateRef"
+                  :data-id="dataId"
+                ></DatasPatternLink>
+                <div v-else>
+                  {{ column.getHeader(application, dataId) }}
+                </div>
+              </div>
+              <div v-else class="column">
                 {{ column.getHeader(application, dataId) }}
+                <DatasDynamicLink
+                  v-if="'PatternComponent' === column.type"
+                  :application="application"
+                  :column-id="column.id"
+                  :info="column.type === 'PatternComponent'"
+                  :info-values="column.getColumnQualifiersMap(props)"
+                  :loaded-references-by-key="{}"
+                  :reference-type="column.referenceType"
+                ></DatasDynamicLink>
               </div>
-            </div>
-            <div v-else class="column">
-              {{ column.getHeader(application, dataId) }}
+            </template>
+            <template v-slot="props">
               <DatasDynamicLink
-                v-if="'PatternComponent' === column.type"
+                v-if="column.type === 'DynamicComponent'"
                 :application="application"
                 :column-id="column.id"
-                :info="column.type === 'PatternComponent'"
-                :info-values="column.getColumnQualifiersMap(props)"
+                :info="column.type === 'DynamicComponent'"
+                :info-values="props.row.values[column.id]"
                 :loaded-references-by-key="{}"
                 :reference-type="column.referenceType"
               ></DatasDynamicLink>
-            </div>
-          </template>
-          <template v-slot="props">
-            <DatasDynamicLink
-              v-if="column.type === 'DynamicComponent'"
-              :application="application"
-              :column-id="column.id"
-              :info="column.type === 'DynamicComponent'"
-              :info-values="props.row.values[column.id]"
-              :loaded-references-by-key="{}"
-              :reference-type="column.referenceType"
-            ></DatasDynamicLink>
-            <DatasManyLink
-              v-else-if="column.multiplicity === MANY"
-              :application="application"
-              :column="column"
-              :column-id="column.id"
-              :component="props.row"
-              :info-values="props.row.values[column.id]"
-              :displays-for-row="props.row.displaysForRow"
-              :loaded-references-by-key="{}"
-              :multiplicity="multiplicity(column.id, props.row.values[column.id])"
-              :reference-type="addRefLinkedTo(column.id, column.linkedTo)"
-            ></DatasManyLink>
-            <DatasLink
-              v-else-if="column.id !== '#'"
-              :application="application"
-              :column-id="getRefColumnId(props.row, column)"
-              :column-title="getColumnNameView(column.id, application, dataId, column)"
-              :component="props.row"
-              :display-value="'' + column.getDisplayValue(props.row, column)"
-              :loaded-references-by-key="{}"
-              :pattern-checker-date="patternCheckerDateRef(application, column.title, dataId)"
-              :reference-type="column.refLinkedTo"
-              :value="'' + column.getColumnValue(props.row)"
-            ></DatasLink>
-            <div v-else class="columns">
-              <a @click="askDeletionConfirmation(rows[tableValues.indexOf(props.row)]?.naturalKey)">
-                <b-icon class="clickable" icon="times-circle" size="is-small" type="is-danger">
-                </b-icon>
-              </a>
-              <b-collapse :open="false" class="column">
-                <template #trigger>
-                  <b-button
-                    :label="'' + (tableValues.indexOf(props.row) + 1 + params.offset)"
-                    aria-controls="contentIdForA11y1"
-                    type="is-small"
-                  />
-                </template>
-                {{ rows[tableValues.indexOf(props.row)]?.naturalKey }}
-              </b-collapse>
-            </div>
-          </template>
-        </b-table-column>
-      </b-table>
+              <DatasManyLink
+                v-else-if="column.multiplicity === MANY"
+                :application="application"
+                :column="column"
+                :column-id="column.id"
+                :component="props.row"
+                :info-values="props.row.values[column.id]"
+                :displays-for-row="props.row.displaysForRow"
+                :loaded-references-by-key="{}"
+                :multiplicity="multiplicity(column.id, props.row.values[column.id])"
+                :reference-type="addRefLinkedTo(column.id, column.linkedTo)"
+              ></DatasManyLink>
+              <DatasLink
+                v-else-if="column.id !== '#'"
+                :application="application"
+                :column-id="getRefColumnId(props.row, column)"
+                :column-title="getColumnNameView(column.id, application, dataId, column)"
+                :component="props.row"
+                :display-value="'' + column.getDisplayValue(props.row, column)"
+                :loaded-references-by-key="{}"
+                :pattern-checker-date="patternCheckerDateRef(application, column.title, dataId)"
+                :reference-type="column.refLinkedTo"
+                :value="'' + column.getColumnValue(props.row)"
+              ></DatasLink>
+              <div v-else class="columns">
+                <a @click="askDeletionConfirmation(rows[tableValues.indexOf(props.row)]?.naturalKey)">
+                  <b-icon class="clickable" icon="times-circle" size="is-small" type="is-danger">
+                  </b-icon>
+                </a>
+                <b-collapse :open="false" class="column">
+                  <template #trigger>
+                    <b-button
+                      :label="'' + (tableValues.indexOf(props.row) + 1 + params.offset)"
+                      aria-controls="contentIdForA11y1"
+                      type="is-small"
+                    />
+                  </template>
+                  {{ rows[tableValues.indexOf(props.row)]?.naturalKey }}
+                </b-collapse>
+              </div>
+            </template>
+          </b-table-column>
+        </b-table>
+      </div>
+      <div v-else>
+        <b-message type="is-primary" :closable="false" size="is-medium" has-icon>
+          {{ $tc("applications.register-rows", totalRows, { totalRows: totalRows }) }}
+        </b-message>
+      </div>
+
+      <div class="buttons" style="margin-top: 16px">
+        <!--        <b-button @click="loadExampleData">Afficher un exemple</b-button>-->
+        <b-button
+          style="margin-bottom: 15px; float: right"
+          type="is-primary"
+          icon-left="download"
+          @click.prevent="downloadResultSearch"
+        >{{ $t("dataTable.donwload-result") }}
+        </b-button>
+      </div>
     </div>
-    <div v-else>
+
+    <div v-else-if="state==='NO-RIGHTS'">
       <b-message type="is-danger" :closable="false" size="is-medium" has-icon>
         {{ $t("applications.no-right-for-application") }}
       </b-message>
@@ -173,16 +169,11 @@
         {{ $t("dataTypeAuthorizations.request") }}
       </b-button>
     </div>
+    <div v-else>
+      <b-message type="is-primary" :closable="false" size="is-medium" has-icon>
+        {{ $tc("applications.register-rows", totalRows, { totalRows: totalRows }) }}
+      </b-message>
 
-    <div class="buttons" style="margin-top: 16px" v-if="state!='NO-RIGHTS'">
-      <!--        <b-button @click="loadExampleData">Afficher un exemple</b-button>-->
-      <b-button
-        style="margin-bottom: 15px; float: right"
-        type="is-primary"
-        icon-left="download"
-        @click.prevent="downloadResultSearch"
-      >{{ $t("dataTable.donwload-view-result") }}
-      </b-button>
     </div>
   </PageView>
 </template>
@@ -235,7 +226,7 @@ export default {
     DatasDynamicLink
   },
   setup(props) {
-    const onlyMetadata = ref(true);
+    const loadExample = ref(true);
     const state = ref(""); // can or not load data
     const { reactiveObject: params } = useObject(new DownloadDatasetQuery(0, 10));
     const loader = dataLoader(services);
@@ -323,7 +314,7 @@ export default {
 
     onMounted(async () => {
       await init();
-      await setInitialVariables([]);
+      //await setInitialVariables([]);
       let dataIsType = application.dataTypes[props.dataId] ? "dataTypes" : "references";
       changeSubMenuPaths([
         new SubMenuPath(
@@ -362,6 +353,7 @@ export default {
             application
           )
         });
+        totalRows.value = application.referenceSynthesis.find(synthesis => synthesis.referenceType === props.dataId)?.lineCount || 0;
         const data = await services.dataService.getData(
           props.applicationName,
           props.dataId,
@@ -369,12 +361,12 @@ export default {
             offset: params.offset,
             limit: params.limit
           },
-          onlyMetadata.value
+          loadExample.value
         );
         if (data) {
-          let dataValues = data.rows;
-          totalRows.value = data.totalRows;
-          changeRows(dataValues);
+          //let dataValues = data.rows;
+          //totalRows.value = data.totalRows;
+          //changeRows(dataValues);
           if (Object.keys(data?.referenceTypeForReferencingColumns).length > 0) {
             for (let key in data.referenceTypeForReferencingColumns) {
               referenceTypeForReferencingColumns.value[key] =
@@ -382,6 +374,7 @@ export default {
             }
           }
         }
+        await updateData({"filters":[]}, data, false, totalRows);
       } catch (error) {
         services.alertService.toastServerError(error, state);
       }
@@ -487,7 +480,7 @@ export default {
     }
 
     async function recalculate(event, shouldDownload) {
-      onlyMetadata.value = false;
+      loadExample.value = false;
       changeIsLoading(true);
       changeCurrentPage(1);
       let limit = params.limit;
@@ -498,13 +491,17 @@ export default {
         props.dataId,
         params.valueOf()
       );
+      await updateData(event, tableValue, shouldDownload, limit);
+    }
+
+    async function updateData(event, tableValue, shouldDownload, limit) {
       changeRows(tableValue.rows);
       let variables = tableValue.variables;
-      totalRows.value = tableValue.totalRows;
-      pushFilters(event.filters.filter((v) => v !== undefined));
+      //totalRows.value = tableValue.totalRows;
+      pushFilters(event?event.filters.filter((v) => v !== undefined):{});
       await setInitialVariables(variables);
       changeIsLoading(false);
-      this.$forceUpdate();
+      this?.$forceUpdate && this.$forceUpdate();
       params.limit = limit;
       if (shouldDownload) {
         downloadResultSearch();
@@ -551,7 +548,7 @@ export default {
       if (filters.value.length === 0) {
         params.offset = (value - 1) * params.limit;
         datas = await services.dataService.getData(props.applicationName, props.dataId, params);
-        totalRows.value = data.totalRows;
+        //totalRows.value = data.totalRows;
         if (datas) {
           changeRows(datas.rows);
         }
@@ -586,7 +583,7 @@ export default {
     }
 
     async function downloadResultSearch() {
-      onlyMetadata.value = false;
+      loadExample.value = false;
       let limit = params.limit;
       params.limit = null;
       let zipFileUrl = await services.dataService.getDataZip(
@@ -613,7 +610,7 @@ export default {
       state,
       showModal,
       realVariables,
-      onlyMetadata,
+      loadExample,
       addRefLinkedTo,
       recalculate,
       askDeletionConfirmation,
diff --git a/src/views/data/DatasManagementView.vue b/src/views/data/DatasManagementView.vue
index 59b9ff1a0..226bc6055 100644
--- a/src/views/data/DatasManagementView.vue
+++ b/src/views/data/DatasManagementView.vue
@@ -11,11 +11,11 @@
         {{
           type[type.length - 1] === "dataTypes"
             ? $t("titles.data-types-page", {
-                applicationName: application.localName || application.title,
-              })
+              applicationName: application.localName || application.title
+            })
             : $t("titles.references-page", {
-                applicationName: application.localName || application.title,
-              })
+              applicationName: application.localName || application.title
+            })
         }}
       </b-tooltip>
       <b-tooltip :label="$t('dataTypesManagement.consult-authorization')" position="is-bottom">
@@ -97,7 +97,7 @@ import useArray from "@/composable/components/array";
 import useBoolean from "@/composable/components/boolean";
 import useNumber from "@/composable/components/number";
 import useObject from "@/composable/components/object";
-import { onMounted } from "vue";
+import {  onMounted } from "vue";
 import services from "@/composable/services";
 import { buildTags } from "@/composable/application/tags";
 import { lineCountSynthesis } from "@/composable/application/synthesis";
@@ -114,12 +114,12 @@ export default {
     TagsCollapse,
     DetailsPanel,
     PageView,
-    SubMenu,
+    SubMenu
   },
   props: {
     applicationName: {
-      type: String,
-    },
+      type: String
+    }
   },
   setup(props) {
     const { shallowRefArray: datas, doChangeArray: changeDatas } = useArray();
@@ -142,7 +142,7 @@ export default {
     );
     const type = window.location.href.split("/");
     const hasTags = useBoolean(false).refBoolean;
-    const changeTags = function (tagsToChange) {
+    const changeTags = function(tagsToChange) {
       _changeTags({ ...tagsToChange });
       hasTags.value =
         tags &&
@@ -178,7 +178,7 @@ export default {
             : i18n.t("referencesManagement.references").toLowerCase(),
           () => app.$router.push(`/applications/${props.applicationName}/${type[type.length - 1]}`),
           () => app.$router.push(`/applications/${props.applicationName}`)
-        ),
+        )
       ]);
       changeTags(buildTags(application, datas.value));
       changeDatas(services.tagService.toBeShown(tags, datas.value));
@@ -202,7 +202,7 @@ export default {
         canDownload: canDownload,
         canDelete: canDelete,
         isAdmin: isAdmin,
-        canShow: any,
+        canShow: any
       };
     }
 
@@ -214,7 +214,7 @@ export default {
             await services.applicationService.getApplication(props.applicationName, [
               "CONFIGURATION",
               "DATATYPE",
-              "REFERENCETYPE",
+              "REFERENCETYPE"
             ])
           );
           if (!application?.id) {
@@ -234,7 +234,7 @@ export default {
           changeApplication(
             await services.applicationService.getApplication(props.applicationName, [
               "CONFIGURATION",
-              "REFERENCETYPE",
+              "REFERENCETYPE"
             ])
           );
           if (!application?.id) {
@@ -260,16 +260,16 @@ export default {
           (label) => consultReference(label),
           "is-dark",
           null,
-          !reference.canRead
-        ),
+          !reference.canRead ||   !(application.referenceSynthesis.find(synthesis => synthesis.referenceType === reference.id)?.lineCount || 0 )> 0
+        )/*,
         new Button(
           i18n.t("referencesManagement.download"),
           "download",
           (label) => downloadReference(label),
           null,
           null,
-          !reference.canDownload
-        ),
+          !reference.canDownload || !lineCount.value
+        )*/
       ];
     }
 
@@ -286,7 +286,7 @@ export default {
           `/applications/${props.applicationName}/${type[type.length - 1]}/${ref.id}`
         );
       }
-    }
+    }/*
 
     async function downloadReference(label) {
       const reference = findReferenceByLabel(label);
@@ -300,7 +300,7 @@ export default {
         hiddenElement.click();
         return false;
       }
-    }
+    }*/
 
     async function uploadReferenceCsv(label, refFile) {
       changeIsLineCountLoading(true);
@@ -317,7 +317,7 @@ export default {
         let referenceSynthesis = result.referenceSynthesis;
         changeApplication({
           ...application,
-          referenceSynthesis,
+          referenceSynthesis
         });
         services.alertService.toastSuccess(i18n.t("alert.reference-updated"));
         showInfoEmpty.value[referenceType] = { value: true };
@@ -360,6 +360,7 @@ export default {
         )
         .find((t) => t);
     }
+
     function withVersioning(dataId) {
       return !!(
         application.configuration.dataDescription[dataId]?.submission &&
@@ -399,9 +400,9 @@ export default {
       isLineCountLoading,
       hasTags,
       type,
-      consultAuthorization,
+      consultAuthorization
     };
-  },
+  }
 };
 </script>
 <style lang="scss" scoped>
-- 
GitLab


From 2ccde0abb8a90630e9fed215a0eee4b3bfd023cc Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Wed, 11 Dec 2024 14:04:14 +0100
Subject: [PATCH 21/61] rebranchement des demandes de droits

---
 src/components/common/TitleAndDescription.vue |  35 ++++++
 src/views/data/DataVersioningView.vue         | 102 +++++++-----------
 2 files changed, 75 insertions(+), 62 deletions(-)
 create mode 100644 src/components/common/TitleAndDescription.vue

diff --git a/src/components/common/TitleAndDescription.vue b/src/components/common/TitleAndDescription.vue
new file mode 100644
index 000000000..60658e20e
--- /dev/null
+++ b/src/components/common/TitleAndDescription.vue
@@ -0,0 +1,35 @@
+<script>
+export default {
+  name: "TitleAndDescription",
+  props: {
+    application: Object,
+    localName: String,
+    localDescription: String,
+    localTitle: String,
+  },
+};
+</script>
+
+<template>
+  <h1 class="title main-title">
+    <slot name="label" v-bind:option="application">
+      {{ localTitle || localName }}
+    </slot>
+    <slot name="description" v-bind:option="application" v-if="localDescription">
+      <sup style="font-size: 1.5em">
+        <b-tooltip
+          :label="$t('applications.description', { localDescription: localDescription })"
+          position="is-top"
+        >
+          <b-icon icon="info-circle" type="is-dark"></b-icon>
+        </b-tooltip>
+      </sup>
+    </slot>
+  </h1>
+</template>
+
+<style scoped lang="scss">
+.icon {
+  vertical-align: text-top;
+}
+</style>
diff --git a/src/views/data/DataVersioningView.vue b/src/views/data/DataVersioningView.vue
index 9d37697c2..6b422e95a 100644
--- a/src/views/data/DataVersioningView.vue
+++ b/src/views/data/DataVersioningView.vue
@@ -7,27 +7,16 @@
         :root="application.localName || application.title"
         role="navigation"
       />
-      <b-tooltip
-        v-if="data.localDescription"
-        :label="data.localDescription"
-        class="title main-title"
-        position="is-top"
-      >
-        <h1 class="title main-title">
-          {{
-            $t("titles.data-types-repository", {
-              dataName: data.localName || dataId
-            })
-          }}
-        </h1>
-      </b-tooltip>
-      <h1 v-else class="title main-title">
-        {{
-          $t("titles.data-types-repository", {
-            dataName: data.localName || dataId
+      <TitleAndDescription
+        :application="application"
+        :localDescription="application.localDatatypeDescription"
+        :localName="application.localDatatypeName"
+        :local-title="
+          $t('titles.data-types-repository', {
+            dataName: application.localDatatypeName || dataId,
           })
-        }}
-      </h1>
+        "
+      />
       <div class="columns">
         <b-field
           v-for="(referenceScopesByData, index) in referenceScopes[dataId]"
@@ -136,8 +125,8 @@
                         <span class="file-cta">
                           <b-icon class="file-icon" icon="upload"></b-icon>
                           <span class="file-label">{{
-                              $t("dataTypesRepository.choose-file")
-                            }}</span>
+                            $t("dataTypesRepository.choose-file")
+                          }}</span>
                         </span>
                         <span v-if="file" class="file-name">
                           {{ file.name }}
@@ -161,7 +150,7 @@
                 <div class="column is-10"></div>
                 <div class="column is-2" style="float: right">
                   <b-button expanded style="float: right" type="is-dark" @click="upload"
-                  >{{ $t("dataTypesRepository.submit") }}
+                    >{{ $t("dataTypesRepository.submit") }}
                   </b-button>
                 </div>
               </footer>
@@ -347,6 +336,7 @@ import ShowErrors from "@/components/application/ShowErrors.vue";
 import { dataLoader } from "@/composable/data/dataLoader";
 import { ReferenceScope } from "@/model/authorization/ReferenceScope";
 import CollapseMenuOneSelect from "@/components/common/CollapseMenuOneSelect.vue";
+import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
 export default {
   name: "DataVersioningView",
@@ -357,23 +347,24 @@ export default {
     },
     services() {
       return services;
-    }
+    },
   },
   components: {
+    TitleAndDescription,
     CollapseMenuOneSelect,
     ShowErrors,
     InputDate,
     LoadingAnimate,
     PageView,
-    SubMenu
+    SubMenu,
   },
   props: {
     applicationName: {
-      type: String
+      type: String,
     },
     dataId: {
-      type: String
-    }
+      type: String,
+    },
   },
   setup(props, ctx) {
     const loader = dataLoader(services);
@@ -385,7 +376,7 @@ export default {
     const {
       shallowRefArray: errorsList,
       doChangeArray: changeErrorsList,
-      doAddToArray: addErrorsList
+      doAddToArray: addErrorsList,
     } = useArray();
     const { reactiveObject: application, doChangeObject: changeApplication } = useObject(
       new ApplicationResult()
@@ -400,17 +391,16 @@ export default {
     const { refBoolean: submissionListVisible } = useBoolean();
     const {
       reactiveObject: requiredAuthorizationsObject,
-      doChangeObject: changeRequiredAuthorizationsObject
+      doChangeObject: changeRequiredAuthorizationsObject,
     } = useObject();
     const {
       reactiveObject: requiredAuthorizationsLabels,
-      doChangeObject: changeRequiredAuthorizationsLabels
+      doChangeObject: changeRequiredAuthorizationsLabels,
     } = useObject();
     let getSubmissionReferenceScopePath =
       services.internationalisationService.getSubmissionReferenceScopePath;
     let getDataTypeDisplay = services.internationalisationService.getDataTypeDisplay;
     let datasets = ref({});
-    let data = ref({});
     let file = ref(null);
     let startDate = ref(null);
     let endDate = ref(null);
@@ -429,13 +419,13 @@ export default {
       y: { pattern: "\\d", type: "date" },
       M: { pattern: "\\d", type: "date" },
       Z: { pattern: "[+-]\\d{4}", type: "date" },
-      G: { pattern: "[AB]D", type: "date" }
+      G: { pattern: "[AB]D", type: "date" },
     });
     onMounted(async () => {
       await init();
       changeSubMenuPaths([
         new SubMenuPath(
-          data.value.localName.toLowerCase() || props.dataId.toLowerCase(),
+          application.localDatatypeName.toLowerCase() || props.dataId.toLowerCase(),
           () => {},
           () => app.$router.push(`/applications/${props.applicationName}/dataTypes`)
         ),
@@ -532,20 +522,19 @@ export default {
           await services.applicationService.getApplication(props.applicationName, [
             "CONFIGURATION",
             "DATATYPE",
-            "REFERENCETYPE"
+            "REFERENCETYPE",
           ])
         );
         const loadingComponent = app.$buefy.loading.open({
-          container: document.getElementById("element")
+          container: document.getElementById("element"),
         });
         changeVersioning(application.configuration.dataDescription[props.dataId].submission);
         componentNameTimeScope = versioning?.submissionScope?.timescope?.component;
         changeApplication({
           ...services.internationalisationService.mergeInternationalization(application),
-          localDatatypeName: services.internationalisationService.localeDataTypeIdName(
-            application,
-            application.dataTypes[props.dataId]
-          )
+          localDatatypeName: application.configuration.i18n.data[props.dataId].i18n.title[locale],
+          localDatatypeDescription:
+            application.configuration.i18n.data[props.dataId].i18n.description[locale],
         });
         changeConfiguration(application.configuration.dataDescription[props.dataId]);
         changeAuthorizations(configuration.submission.submissionScope);
@@ -556,10 +545,9 @@ export default {
             requiredAuthorizations: {},
             from: "",
             to: "",
-            comment: ""
+            comment: "",
           })
         );
-        getI18nData(application);
         let refForAuth = {};
         let reference = "";
         for (let auth in authorizations.value) {
@@ -614,15 +602,6 @@ export default {
       }
     }
 
-    function getI18nData(application) {
-      let dataLocal = {
-        localName: application.configuration.i18n.data[props.dataId].i18n.title[locale],
-        localDescription:
-          application.configuration.i18n.data[props.dataId].i18n.description[locale]
-      };
-      data.value = dataLocal;
-    }
-
     function nameSelectedTagList(nameTagList) {
       return i18n.t("dataTypesManagement.selected_filter", { key: nameTagList });
     }
@@ -722,7 +701,7 @@ export default {
       changeErrorsMessages([]);
       dataset.params.published = pusblished;
       let requiredAuthorizations = dataset.params.binaryFiledataset.requiredAuthorizations;
-      requiredAuthorizations = Object.keys(requiredAuthorizations).reduce(function(acc, key) {
+      requiredAuthorizations = Object.keys(requiredAuthorizations).reduce(function (acc, key) {
         acc[key] = acc[key] ? acc[key].sql : "";
         return acc;
       }, requiredAuthorizations);
@@ -780,11 +759,11 @@ export default {
       selected.requiredAuthorizations[event.type] = [event.naturalKey];
       changeRequiredAuthorizationsObject({
         ...requiredAuthorizationsObject,
-        [event.type]: [event.id]
+        [event.type]: [event.id],
       });
       changeRequiredAuthorizationsLabels({
         ...requiredAuthorizationsLabels,
-        [event.type]: [event.localName]
+        [event.type]: [event.localName],
       });
       if (currentDataset.value) {
         datasets.value = currentDataset.value;
@@ -823,7 +802,7 @@ export default {
         }
         getDatasetMap({
           binaryFileList: datasetsList.map((d) => new BinaryFile(d)),
-          uuid: uuid
+          uuid: uuid,
         });
       }
     }
@@ -856,7 +835,7 @@ export default {
           (isPublished
             ? "<b>La version contient des données publiées.</b><br />La supprimer entraînera la suppression de ces données.<br /><br />?"
             : "") + "Etes vous sûr de vouloir supprimer cette version?",
-        onConfirm: () => deleteFile(dataset.id)
+        onConfirm: () => deleteFile(dataset.id),
       });
     }
 
@@ -916,7 +895,7 @@ export default {
           localName,
           isLeaf: false,
           currentPath: newCurrentPath,
-          completeLocalName
+          completeLocalName,
         };
         authPartition.rows.push(referenceValue);
         returnValues[naturalKey] = authPartition;
@@ -928,7 +907,7 @@ export default {
           returnValues[returnValuesKey] = {
             ...auth,
             isLeaf: true,
-            rows: referenceValueLeaf
+            rows: referenceValueLeaf,
           };
         } else {
           let r = await partitionReferencesValues(
@@ -939,7 +918,7 @@ export default {
           returnValues[returnValuesKey] = {
             ...auth,
             isLeaf: false,
-            rows: r
+            rows: r,
           };
         }
       }
@@ -989,10 +968,9 @@ export default {
       comment,
       currentDataset,
       internationalizeRequiredAuthorization,
-      data,
-      submissionListVisible
+      submissionListVisible,
     };
-  }
+  },
 };
 </script>
 
-- 
GitLab


From 9d2650681d8aebf311cabdb0ebff129b1a857b9c Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Wed, 11 Dec 2024 14:04:56 +0100
Subject: [PATCH 22/61] =?UTF-8?q?cr=C3=A9ation=20d'un=20component=20pour?=
 =?UTF-8?q?=20le=20title=20avec=20ajout=20de=20leur=20description?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 package-lock.json                             | 270 +++++++++++++++---
 .../common/provider/FiltersDataCollapse.vue   |   4 +-
 src/composable/data/dataLoader.js             |  29 +-
 .../AuthorizationsRightsRequestInfoView.vue   |  20 +-
 .../DataTypeAuthorizationInfoView.vue         |  16 +-
 .../DataTypeAuthorizationsView.vue            |  17 +-
 src/views/data/DataTableView.vue              |  37 +--
 src/views/data/DatasManagementView.vue        |  55 ++--
 8 files changed, 326 insertions(+), 122 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 97df31138..e6422ec90 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -76,6 +76,7 @@
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
       "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+      "dev": true,
       "dependencies": {
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.24"
@@ -101,6 +102,7 @@
       "version": "7.26.2",
       "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz",
       "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==",
+      "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -109,6 +111,7 @@
       "version": "7.26.0",
       "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
       "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
+      "dev": true,
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
         "@babel/code-frame": "^7.26.0",
@@ -195,6 +198,7 @@
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
       "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
+      "dev": true,
       "dependencies": {
         "@babel/compat-data": "^7.25.9",
         "@babel/helper-validator-option": "^7.25.9",
@@ -275,6 +279,7 @@
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
       "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+      "dev": true,
       "dependencies": {
         "@babel/traverse": "^7.25.9",
         "@babel/types": "^7.25.9"
@@ -287,6 +292,7 @@
       "version": "7.26.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
       "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+      "dev": true,
       "dependencies": {
         "@babel/helper-module-imports": "^7.25.9",
         "@babel/helper-validator-identifier": "^7.25.9",
@@ -396,6 +402,7 @@
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
       "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+      "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -418,6 +425,7 @@
       "version": "7.26.0",
       "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
       "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
+      "dev": true,
       "dependencies": {
         "@babel/template": "^7.25.9",
         "@babel/types": "^7.26.0"
@@ -1719,6 +1727,7 @@
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
       "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+      "dev": true,
       "optional": true,
       "engines": {
         "node": ">=0.1.90"
@@ -1728,6 +1737,7 @@
       "version": "3.0.6",
       "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.6.tgz",
       "integrity": "sha512-fi0eVdCOtKu5Ed6+E8mYxUF6ZTFJDZvHogCBelM0xVXmrDEkyM22gRArQzq1YcHPm1V47Vf/iAD+WgVdUlJCGg==",
+      "dev": true,
       "dependencies": {
         "aws-sign2": "~0.7.0",
         "aws4": "^1.8.0",
@@ -1784,6 +1794,7 @@
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
       "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
+      "dev": true,
       "dependencies": {
         "debug": "^3.1.0",
         "lodash.once": "^4.1.1"
@@ -1793,6 +1804,7 @@
       "version": "3.2.7",
       "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
       "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dev": true,
       "dependencies": {
         "ms": "^2.1.1"
       }
@@ -2578,6 +2590,7 @@
       "version": "8.56.12",
       "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz",
       "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==",
+      "dev": true,
       "dependencies": {
         "@types/estree": "*",
         "@types/json-schema": "*"
@@ -2587,6 +2600,7 @@
       "version": "3.7.7",
       "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
       "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+      "dev": true,
       "dependencies": {
         "@types/eslint": "*",
         "@types/estree": "*"
@@ -2595,7 +2609,8 @@
     "node_modules/@types/estree": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
-      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="
+      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+      "dev": true
     },
     "node_modules/@types/express": {
       "version": "4.17.21",
@@ -2737,12 +2752,14 @@
     "node_modules/@types/sinonjs__fake-timers": {
       "version": "8.1.1",
       "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
-      "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g=="
+      "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
+      "dev": true
     },
     "node_modules/@types/sizzle": {
       "version": "2.3.9",
       "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz",
-      "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w=="
+      "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==",
+      "dev": true
     },
     "node_modules/@types/sockjs": {
       "version": "0.3.36",
@@ -2813,6 +2830,7 @@
       "version": "2.10.3",
       "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
       "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
+      "dev": true,
       "optional": true,
       "dependencies": {
         "@types/node": "*"
@@ -3486,6 +3504,7 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
       "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/helper-numbers": "1.13.2",
         "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
@@ -3494,22 +3513,26 @@
     "node_modules/@webassemblyjs/floating-point-hex-parser": {
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
-      "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="
+      "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+      "dev": true
     },
     "node_modules/@webassemblyjs/helper-api-error": {
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
-      "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="
+      "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+      "dev": true
     },
     "node_modules/@webassemblyjs/helper-buffer": {
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
-      "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="
+      "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+      "dev": true
     },
     "node_modules/@webassemblyjs/helper-numbers": {
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
       "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/floating-point-hex-parser": "1.13.2",
         "@webassemblyjs/helper-api-error": "1.13.2",
@@ -3519,12 +3542,14 @@
     "node_modules/@webassemblyjs/helper-wasm-bytecode": {
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
-      "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="
+      "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+      "dev": true
     },
     "node_modules/@webassemblyjs/helper-wasm-section": {
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
       "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
         "@webassemblyjs/helper-buffer": "1.14.1",
@@ -3536,6 +3561,7 @@
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
       "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+      "dev": true,
       "dependencies": {
         "@xtuc/ieee754": "^1.2.0"
       }
@@ -3544,6 +3570,7 @@
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
       "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+      "dev": true,
       "dependencies": {
         "@xtuc/long": "4.2.2"
       }
@@ -3551,12 +3578,14 @@
     "node_modules/@webassemblyjs/utf8": {
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
-      "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="
+      "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+      "dev": true
     },
     "node_modules/@webassemblyjs/wasm-edit": {
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
       "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
         "@webassemblyjs/helper-buffer": "1.14.1",
@@ -3572,6 +3601,7 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
       "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
         "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
@@ -3584,6 +3614,7 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
       "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
         "@webassemblyjs/helper-buffer": "1.14.1",
@@ -3595,6 +3626,7 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
       "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
         "@webassemblyjs/helper-api-error": "1.13.2",
@@ -3608,6 +3640,7 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
       "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
         "@xtuc/long": "4.2.2"
@@ -3616,12 +3649,14 @@
     "node_modules/@xtuc/ieee754": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
-      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+      "dev": true
     },
     "node_modules/@xtuc/long": {
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
-      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+      "dev": true
     },
     "node_modules/accepts": {
       "version": "1.3.8",
@@ -3688,6 +3723,7 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
       "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "dev": true,
       "dependencies": {
         "clean-stack": "^2.0.0",
         "indent-string": "^4.0.0"
@@ -3700,6 +3736,7 @@
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
       "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -3751,6 +3788,7 @@
       "version": "3.5.2",
       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
       "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "dev": true,
       "peerDependencies": {
         "ajv": "^6.9.1"
       }
@@ -3769,6 +3807,7 @@
       "version": "4.1.3",
       "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
       "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -3777,6 +3816,7 @@
       "version": "4.3.2",
       "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
       "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+      "dev": true,
       "dependencies": {
         "type-fest": "^0.21.3"
       },
@@ -3842,6 +3882,7 @@
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
       "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -3937,6 +3978,7 @@
       "version": "0.2.6",
       "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
       "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+      "dev": true,
       "dependencies": {
         "safer-buffer": "~2.1.0"
       }
@@ -3945,6 +3987,7 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
       "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+      "dev": true,
       "engines": {
         "node": ">=0.8"
       }
@@ -3953,6 +3996,7 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
       "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -3960,12 +4004,14 @@
     "node_modules/async": {
       "version": "3.2.6",
       "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
-      "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="
+      "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+      "dev": true
     },
     "node_modules/asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "dev": true
     },
     "node_modules/at-least-node": {
       "version": "1.0.0",
@@ -4030,6 +4076,7 @@
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
       "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+      "dev": true,
       "engines": {
         "node": "*"
       }
@@ -4037,7 +4084,8 @@
     "node_modules/aws4": {
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
-      "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="
+      "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
+      "dev": true
     },
     "node_modules/babel-loader": {
       "version": "8.4.1",
@@ -4129,6 +4177,7 @@
       "version": "1.5.1",
       "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
       "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -4153,6 +4202,7 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
       "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+      "dev": true,
       "dependencies": {
         "tweetnacl": "^0.14.3"
       }
@@ -4190,12 +4240,14 @@
     "node_modules/blob-util": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
-      "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ=="
+      "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
+      "dev": true
     },
     "node_modules/bluebird": {
       "version": "3.7.2",
       "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
-      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+      "dev": true
     },
     "node_modules/body-parser": {
       "version": "1.20.3",
@@ -4271,6 +4323,7 @@
       "version": "4.24.2",
       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
       "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
+      "dev": true,
       "funding": [
         {
           "type": "opencollective",
@@ -4317,6 +4370,7 @@
       "version": "5.7.1",
       "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
       "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -4340,6 +4394,7 @@
       "version": "0.2.13",
       "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
       "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+      "dev": true,
       "engines": {
         "node": "*"
       }
@@ -4375,6 +4430,7 @@
       "version": "2.4.0",
       "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
       "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
+      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -4440,6 +4496,7 @@
       "version": "1.0.30001680",
       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz",
       "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==",
+      "dev": true,
       "funding": [
         {
           "type": "opencollective",
@@ -4467,7 +4524,8 @@
     "node_modules/caseless": {
       "version": "0.12.0",
       "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
+      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+      "dev": true
     },
     "node_modules/chalk": {
       "version": "3.0.0",
@@ -4525,6 +4583,7 @@
       "version": "2.24.0",
       "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
       "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
+      "dev": true,
       "engines": {
         "node": ">= 0.8.0"
       }
@@ -4547,6 +4606,7 @@
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
       "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+      "dev": true,
       "engines": {
         "node": ">=6.0"
       }
@@ -4555,6 +4615,7 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz",
       "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -4580,6 +4641,7 @@
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
       "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -4588,6 +4650,7 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
       "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+      "dev": true,
       "dependencies": {
         "restore-cursor": "^3.1.0"
       },
@@ -4654,6 +4717,7 @@
       "version": "0.6.5",
       "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
       "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
+      "dev": true,
       "dependencies": {
         "string-width": "^4.2.0"
       },
@@ -4668,6 +4732,7 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
       "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+      "dev": true,
       "dependencies": {
         "slice-ansi": "^3.0.0",
         "string-width": "^4.2.0"
@@ -4757,6 +4822,7 @@
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dev": true,
       "dependencies": {
         "delayed-stream": "~1.0.0"
       },
@@ -4768,6 +4834,7 @@
       "version": "6.2.1",
       "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
       "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+      "dev": true,
       "engines": {
         "node": ">= 6"
       }
@@ -4776,6 +4843,7 @@
       "version": "1.8.2",
       "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
       "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+      "dev": true,
       "engines": {
         "node": ">=4.0.0"
       }
@@ -4875,7 +4943,8 @@
     "node_modules/convert-source-map": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
-      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
+      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+      "dev": true
     },
     "node_modules/cookie": {
       "version": "0.7.1",
@@ -5293,6 +5362,7 @@
       "version": "13.16.0",
       "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.16.0.tgz",
       "integrity": "sha512-g6XcwqnvzXrqiBQR/5gN+QsyRmKRhls1y5E42fyOvsmU7JuY+wM6uHJWj4ZPttjabzbnRvxcik2WemR8+xT6FA==",
+      "dev": true,
       "hasInstallScript": true,
       "dependencies": {
         "@cypress/request": "^3.0.6",
@@ -5370,6 +5440,7 @@
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
       "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
@@ -5385,6 +5456,7 @@
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
       "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -5396,6 +5468,7 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
       "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+      "dev": true,
       "dependencies": {
         "cross-spawn": "^7.0.0",
         "get-stream": "^5.0.0",
@@ -5418,6 +5491,7 @@
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
       "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+      "dev": true,
       "dependencies": {
         "pump": "^3.0.0"
       },
@@ -5432,6 +5506,7 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
       "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+      "dev": true,
       "engines": {
         "node": ">=8"
       },
@@ -5443,6 +5518,7 @@
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
       "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "dev": true,
       "dependencies": {
         "path-key": "^3.0.0"
       },
@@ -5454,6 +5530,7 @@
       "version": "7.6.3",
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
       "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+      "dev": true,
       "bin": {
         "semver": "bin/semver.js"
       },
@@ -5465,6 +5542,7 @@
       "version": "8.1.1",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
       "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "dev": true,
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -5479,6 +5557,7 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
       "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+      "dev": true,
       "dependencies": {
         "assert-plus": "^1.0.0"
       },
@@ -5537,7 +5616,8 @@
     "node_modules/dayjs": {
       "version": "1.11.13",
       "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
-      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
+      "dev": true
     },
     "node_modules/de-indent": {
       "version": "1.0.2",
@@ -5712,6 +5792,7 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
       "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "dev": true,
       "engines": {
         "node": ">=0.4.0"
       }
@@ -5908,6 +5989,7 @@
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
       "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+      "dev": true,
       "dependencies": {
         "jsbn": "~0.1.0",
         "safer-buffer": "^2.1.0"
@@ -5921,12 +6003,14 @@
     "node_modules/electron-to-chromium": {
       "version": "1.5.63",
       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.63.tgz",
-      "integrity": "sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA=="
+      "integrity": "sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA==",
+      "dev": true
     },
     "node_modules/emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true
     },
     "node_modules/emojis-list": {
       "version": "3.0.0",
@@ -5948,6 +6032,7 @@
       "version": "1.4.4",
       "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
       "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dev": true,
       "dependencies": {
         "once": "^1.4.0"
       }
@@ -5956,6 +6041,7 @@
       "version": "5.17.1",
       "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
       "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
+      "dev": true,
       "dependencies": {
         "graceful-fs": "^4.2.4",
         "tapable": "^2.2.0"
@@ -5968,6 +6054,7 @@
       "version": "2.4.1",
       "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
       "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
+      "dev": true,
       "dependencies": {
         "ansi-colors": "^4.1.1",
         "strip-ansi": "^6.0.1"
@@ -6092,7 +6179,8 @@
     "node_modules/es-module-lexer": {
       "version": "1.5.4",
       "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
-      "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw=="
+      "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
+      "dev": true
     },
     "node_modules/es-object-atoms": {
       "version": "1.0.0",
@@ -6138,6 +6226,7 @@
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
       "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -6272,6 +6361,7 @@
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
       "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "dev": true,
       "dependencies": {
         "esrecurse": "^4.3.0",
         "estraverse": "^4.1.1"
@@ -6599,6 +6689,7 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
       "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
       "dependencies": {
         "estraverse": "^5.2.0"
       },
@@ -6610,6 +6701,7 @@
       "version": "5.3.0",
       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
       "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "dev": true,
       "engines": {
         "node": ">=4.0"
       }
@@ -6618,6 +6710,7 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
       "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "dev": true,
       "engines": {
         "node": ">=4.0"
       }
@@ -6657,7 +6750,8 @@
     "node_modules/eventemitter2": {
       "version": "6.4.7",
       "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
-      "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg=="
+      "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
+      "dev": true
     },
     "node_modules/eventemitter3": {
       "version": "4.0.7",
@@ -6668,6 +6762,7 @@
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
       "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "dev": true,
       "engines": {
         "node": ">=0.8.x"
       }
@@ -6761,6 +6856,7 @@
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
       "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
+      "dev": true,
       "dependencies": {
         "pify": "^2.2.0"
       },
@@ -6825,12 +6921,14 @@
     "node_modules/extend": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true
     },
     "node_modules/extract-zip": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
       "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+      "dev": true,
       "dependencies": {
         "debug": "^4.1.1",
         "get-stream": "^5.1.0",
@@ -6850,6 +6948,7 @@
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
       "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+      "dev": true,
       "dependencies": {
         "pump": "^3.0.0"
       },
@@ -6864,6 +6963,7 @@
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
       "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+      "dev": true,
       "engines": [
         "node >=0.6.0"
       ]
@@ -6910,7 +7010,8 @@
     "node_modules/fast-json-stable-stringify": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
     },
     "node_modules/fast-levenshtein": {
       "version": "2.0.6",
@@ -6947,6 +7048,7 @@
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
       "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+      "dev": true,
       "dependencies": {
         "pend": "~1.2.0"
       }
@@ -6955,6 +7057,7 @@
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
       "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+      "dev": true,
       "dependencies": {
         "escape-string-regexp": "^1.0.5"
       },
@@ -6969,6 +7072,7 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
       "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "dev": true,
       "engines": {
         "node": ">=0.8.0"
       }
@@ -7117,6 +7221,7 @@
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
       "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+      "dev": true,
       "engines": {
         "node": "*"
       }
@@ -7125,6 +7230,7 @@
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
       "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+      "dev": true,
       "dependencies": {
         "asynckit": "^0.4.0",
         "combined-stream": "^1.0.8",
@@ -7243,6 +7349,7 @@
       "version": "1.0.0-beta.2",
       "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
       "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -7306,6 +7413,7 @@
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
       "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
+      "dev": true,
       "dependencies": {
         "async": "^3.2.0"
       }
@@ -7314,6 +7422,7 @@
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
       "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+      "dev": true,
       "dependencies": {
         "assert-plus": "^1.0.0"
       }
@@ -7353,12 +7462,14 @@
     "node_modules/glob-to-regexp": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
-      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+      "dev": true
     },
     "node_modules/global-dirs": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
       "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
+      "dev": true,
       "dependencies": {
         "ini": "2.0.0"
       },
@@ -7946,6 +8057,7 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz",
       "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==",
+      "dev": true,
       "dependencies": {
         "assert-plus": "^1.0.0",
         "jsprim": "^2.0.2",
@@ -7959,6 +8071,7 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
       "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+      "dev": true,
       "engines": {
         "node": ">=8.12.0"
       }
@@ -8001,6 +8114,7 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
       "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -8059,6 +8173,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
       "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -8082,6 +8197,7 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
       "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+      "dev": true,
       "engines": {
         "node": ">=10"
       }
@@ -8272,6 +8388,7 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -8291,6 +8408,7 @@
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
       "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+      "dev": true,
       "dependencies": {
         "global-dirs": "^3.0.0",
         "is-path-inside": "^3.0.2"
@@ -8348,6 +8466,7 @@
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
       "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -8457,12 +8576,14 @@
     "node_modules/is-typedarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+      "dev": true
     },
     "node_modules/is-unicode-supported": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
       "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+      "dev": true,
       "engines": {
         "node": ">=10"
       },
@@ -8522,7 +8643,8 @@
     "node_modules/isstream": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
+      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+      "dev": true
     },
     "node_modules/javascript-stringify": {
       "version": "2.1.0",
@@ -8534,6 +8656,7 @@
       "version": "27.5.1",
       "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
       "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+      "dev": true,
       "dependencies": {
         "@types/node": "*",
         "merge-stream": "^2.0.0",
@@ -8547,6 +8670,7 @@
       "version": "8.1.1",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
       "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "dev": true,
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -8599,7 +8723,8 @@
     "node_modules/jsbn": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
+      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+      "dev": true
     },
     "node_modules/jsesc": {
       "version": "3.0.2",
@@ -8627,17 +8752,20 @@
     "node_modules/json-parse-even-better-errors": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+      "dev": true
     },
     "node_modules/json-schema": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
-      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+      "dev": true
     },
     "node_modules/json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
     },
     "node_modules/json-stable-stringify-without-jsonify": {
       "version": "1.0.1",
@@ -8648,12 +8776,14 @@
     "node_modules/json-stringify-safe": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
+      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+      "dev": true
     },
     "node_modules/json5": {
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
       "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "dev": true,
       "bin": {
         "json5": "lib/cli.js"
       },
@@ -8727,6 +8857,7 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
       "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
+      "dev": true,
       "engines": [
         "node >=0.6.0"
       ],
@@ -8785,6 +8916,7 @@
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
       "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
+      "dev": true,
       "engines": {
         "node": "> 0.8"
       }
@@ -8821,6 +8953,7 @@
       "version": "3.14.0",
       "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
       "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
+      "dev": true,
       "dependencies": {
         "cli-truncate": "^2.1.0",
         "colorette": "^2.0.16",
@@ -8847,6 +8980,7 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
       "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+      "dev": true,
       "engines": {
         "node": ">=6.11.5"
       }
@@ -8944,7 +9078,8 @@
     "node_modules/lodash.once": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
-      "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+      "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+      "dev": true
     },
     "node_modules/lodash.truncate": {
       "version": "4.4.2",
@@ -8962,6 +9097,7 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
       "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+      "dev": true,
       "dependencies": {
         "chalk": "^4.1.0",
         "is-unicode-supported": "^0.1.0"
@@ -8977,6 +9113,7 @@
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
       "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
@@ -8992,6 +9129,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
       "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+      "dev": true,
       "dependencies": {
         "ansi-escapes": "^4.3.0",
         "cli-cursor": "^3.1.0",
@@ -9009,6 +9147,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
       "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "astral-regex": "^2.0.0",
@@ -9025,6 +9164,7 @@
       "version": "6.2.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
       "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
@@ -9046,6 +9186,7 @@
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
       "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dev": true,
       "dependencies": {
         "yallist": "^3.0.2"
       }
@@ -9454,7 +9595,8 @@
     "node_modules/node-releases": {
       "version": "2.0.18",
       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
-      "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g=="
+      "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
+      "dev": true
     },
     "node_modules/normalize-package-data": {
       "version": "2.5.0",
@@ -9733,7 +9875,8 @@
     "node_modules/ospath": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
-      "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA=="
+      "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
+      "dev": true
     },
     "node_modules/p-finally": {
       "version": "1.0.0",
@@ -9776,6 +9919,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
       "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "dev": true,
       "dependencies": {
         "aggregate-error": "^3.0.0"
       },
@@ -9925,12 +10069,14 @@
     "node_modules/pend": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="
+      "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+      "dev": true
     },
     "node_modules/performance-now": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
+      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+      "dev": true
     },
     "node_modules/picocolors": {
       "version": "1.1.1",
@@ -9952,6 +10098,7 @@
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
       "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -10685,6 +10832,7 @@
       "version": "5.6.0",
       "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
       "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+      "dev": true,
       "engines": {
         "node": ">=6"
       },
@@ -10705,6 +10853,7 @@
       "version": "0.11.10",
       "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
       "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+      "dev": true,
       "engines": {
         "node": ">= 0.6.0"
       }
@@ -10971,7 +11120,8 @@
     "node_modules/proxy-from-env": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
-      "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A=="
+      "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
+      "dev": true
     },
     "node_modules/pseudomap": {
       "version": "1.0.2",
@@ -10983,6 +11133,7 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
       "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
+      "dev": true,
       "dependencies": {
         "end-of-stream": "^1.1.0",
         "once": "^1.3.1"
@@ -10992,6 +11143,7 @@
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
       "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -11034,6 +11186,7 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
       "dependencies": {
         "safe-buffer": "^5.1.0"
       }
@@ -11317,6 +11470,7 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
       "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
+      "dev": true,
       "dependencies": {
         "throttleit": "^1.0.0"
       }
@@ -11373,6 +11527,7 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
       "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+      "dev": true,
       "dependencies": {
         "onetime": "^5.1.0",
         "signal-exit": "^3.0.2"
@@ -11402,7 +11557,8 @@
     "node_modules/rfdc": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
-      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="
+      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+      "dev": true
     },
     "node_modules/rimraf": {
       "version": "3.0.2",
@@ -11446,6 +11602,7 @@
       "version": "7.8.1",
       "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
       "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+      "dev": true,
       "dependencies": {
         "tslib": "^2.1.0"
       }
@@ -11656,6 +11813,7 @@
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
       "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+      "dev": true,
       "dependencies": {
         "randombytes": "^2.1.0"
       }
@@ -11866,6 +12024,7 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
       "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "astral-regex": "^2.0.0",
@@ -12014,6 +12173,7 @@
       "version": "1.18.0",
       "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
       "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
+      "dev": true,
       "dependencies": {
         "asn1": "~0.2.3",
         "assert-plus": "^1.0.0",
@@ -12079,6 +12239,7 @@
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -12342,6 +12503,7 @@
       "version": "5.3.10",
       "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
       "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
+      "dev": true,
       "dependencies": {
         "@jridgewell/trace-mapping": "^0.3.20",
         "jest-worker": "^27.4.5",
@@ -12375,6 +12537,7 @@
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
       "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dev": true,
       "dependencies": {
         "@types/json-schema": "^7.0.8",
         "ajv": "^6.12.5",
@@ -12479,6 +12642,7 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz",
       "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==",
+      "dev": true,
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
@@ -12486,7 +12650,8 @@
     "node_modules/through": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
+      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+      "dev": true
     },
     "node_modules/thunky": {
       "version": "1.1.0",
@@ -12497,6 +12662,7 @@
       "version": "6.1.61",
       "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.61.tgz",
       "integrity": "sha512-rv8LUyez4Ygkopqn+M6OLItAOT9FF3REpPQDkdMx5ix8w4qkuE7Vo2o/vw1nxKQYmJDV8JpAMJQr1b+lTKf0FA==",
+      "dev": true,
       "dependencies": {
         "tldts-core": "^6.1.61"
       },
@@ -12507,12 +12673,14 @@
     "node_modules/tldts-core": {
       "version": "6.1.61",
       "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.61.tgz",
-      "integrity": "sha512-In7VffkDWUPgwa+c9picLUxvb0RltVwTkSgMNFgvlGSWveCzGBemBqTsgJCL4EDFWZ6WH0fKTsot6yNhzy3ZzQ=="
+      "integrity": "sha512-In7VffkDWUPgwa+c9picLUxvb0RltVwTkSgMNFgvlGSWveCzGBemBqTsgJCL4EDFWZ6WH0fKTsot6yNhzy3ZzQ==",
+      "dev": true
     },
     "node_modules/tmp": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
       "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+      "dev": true,
       "engines": {
         "node": ">=14.14"
       }
@@ -12549,6 +12717,7 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz",
       "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==",
+      "dev": true,
       "dependencies": {
         "tldts": "^6.1.32"
       },
@@ -12566,6 +12735,7 @@
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
       "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+      "dev": true,
       "bin": {
         "tree-kill": "cli.js"
       }
@@ -12579,6 +12749,7 @@
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
       "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+      "dev": true,
       "dependencies": {
         "safe-buffer": "^5.0.1"
       },
@@ -12589,7 +12760,8 @@
     "node_modules/tweetnacl": {
       "version": "0.14.5",
       "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
+      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+      "dev": true
     },
     "node_modules/type-check": {
       "version": "0.4.0",
@@ -12607,6 +12779,7 @@
       "version": "0.21.3",
       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
       "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+      "dev": true,
       "engines": {
         "node": ">=10"
       },
@@ -12774,6 +12947,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
       "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -12782,6 +12956,7 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
       "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
+      "dev": true,
       "funding": [
         {
           "type": "opencollective",
@@ -12811,6 +12986,7 @@
       "version": "4.4.1",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
       "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
       "dependencies": {
         "punycode": "^2.1.0"
       }
@@ -12886,6 +13062,7 @@
       "version": "1.10.0",
       "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
       "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+      "dev": true,
       "engines": [
         "node >=0.6.0"
       ],
@@ -13241,6 +13418,7 @@
       "version": "2.4.2",
       "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
       "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
+      "dev": true,
       "dependencies": {
         "glob-to-regexp": "^0.4.1",
         "graceful-fs": "^4.1.2"
@@ -13276,6 +13454,7 @@
       "version": "5.96.1",
       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz",
       "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==",
+      "dev": true,
       "dependencies": {
         "@types/eslint-scope": "^3.7.7",
         "@types/estree": "^1.0.6",
@@ -13635,6 +13814,7 @@
       "version": "3.2.3",
       "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
       "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+      "dev": true,
       "engines": {
         "node": ">=10.13.0"
       }
@@ -13649,6 +13829,7 @@
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
       "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dev": true,
       "dependencies": {
         "@types/json-schema": "^7.0.8",
         "ajv": "^6.12.5",
@@ -13764,6 +13945,7 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
       "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
@@ -13814,7 +13996,8 @@
     "node_modules/yallist": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "dev": true
     },
     "node_modules/yaml": {
       "version": "1.10.2",
@@ -13876,6 +14059,7 @@
       "version": "2.10.0",
       "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
       "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+      "dev": true,
       "dependencies": {
         "buffer-crc32": "~0.2.3",
         "fd-slicer": "~1.1.0"
diff --git a/src/components/common/provider/FiltersDataCollapse.vue b/src/components/common/provider/FiltersDataCollapse.vue
index ce569ee4e..4090c6dd4 100644
--- a/src/components/common/provider/FiltersDataCollapse.vue
+++ b/src/components/common/provider/FiltersDataCollapse.vue
@@ -445,7 +445,9 @@ export default {
         for (let i = 0; i < listReferenceValueForAllReferences.value[columnsId].rows.length; i++) {
           if (listReferenceValueForAllReferences.value[columnsId].rows[i].naturalKey === value) {
             if (
-              listReferenceValueForAllReferences.value[columnsId].rows[i].values["__display_default"]
+              listReferenceValueForAllReferences.value[columnsId].rows[i].values[
+                "__display_default"
+              ]
             ) {
               return listReferenceValueForAllReferences.value[columnsId].rows[i].values[
                 "__display_default"
diff --git a/src/composable/data/dataLoader.js b/src/composable/data/dataLoader.js
index c1bb2daea..ef8b34642 100644
--- a/src/composable/data/dataLoader.js
+++ b/src/composable/data/dataLoader.js
@@ -2,7 +2,7 @@ export function dataLoader(services) {
   const dataService = services.dataService;
   const references = {};
 
-  const getOrLoadDataByNaturalKey = async function(application, referenceName, key) {
+  const getOrLoadDataByNaturalKey = async function (application, referenceName, key) {
     let applicationName = application.configuration.applicationDescription.name;
     let reference = references?.[referenceName]?.[key];
     if (reference) {
@@ -23,14 +23,14 @@ export function dataLoader(services) {
       referenceName,
       values: reference.rows?.[0],
       localName:
-        reference.rows.length !== 0 ? getValueDisplay(reference.rows?.[0], application) : key
+        reference.rows.length !== 0 ? getValueDisplay(reference.rows?.[0], application) : key,
     };
     references[referenceName] = references[referenceName] || {};
     references[referenceName][key] = reference;
     return reference;
   };
 
-  const getDisplayValueForLink = function(rowValue, column, listDisplayRowsValue, application) {
+  const getDisplayValueForLink = function (rowValue, column, listDisplayRowsValue, application) {
     if (
       listDisplayRowsValue[column.componentKey] &&
       Object.keys(listDisplayRowsValue[column.componentKey]).includes(rowValue)
@@ -42,7 +42,7 @@ export function dataLoader(services) {
     return rowValue;
   };
 
-  const getValueDisplay = function(referenceLocal, application) {
+  const getValueDisplay = function (referenceLocal, application) {
     if (!referenceLocal?.values) {
       return "";
     }
@@ -52,18 +52,18 @@ export function dataLoader(services) {
     if (
       application &&
       referenceLocal.values[
-      "__display_" + application.configuration.applicationDescription.defaultLanguage
-        ]
+        "__display_" + application.configuration.applicationDescription.defaultLanguage
+      ]
     ) {
       return referenceLocal.values[
-      "__display_" + application.configuration.applicationDescription.defaultLanguage
-        ];
+        "__display_" + application.configuration.applicationDescription.defaultLanguage
+      ];
     } else {
       return referenceLocal.values["__display_default"];
     }
   };
 
-  const getColumnNameView = function(columnId, application, dataId, column) {
+  const getColumnNameView = function (columnId, application, dataId, column) {
     let columnName;
     if (!column) {
       columnName = "this is an error " + columnId;
@@ -74,11 +74,12 @@ export function dataLoader(services) {
       let exportHeader = column?.exportHeader
         ? column.exportHeader
         : application.data[dataId].componentDescriptions[columnId].exportHeaderName;
-      exportHeader = services.internationalisationService.localeReferenceColumnsNames(
-        dataId,
-        exportHeader,
-        application
-      ) || exportHeader;
+      exportHeader =
+        services.internationalisationService.localeReferenceColumnsNames(
+          dataId,
+          exportHeader,
+          application
+        ) || exportHeader;
       if (exportHeader !== columnId) {
         columnName = exportHeader || columnId;
       } else if (importHeader !== undefined && importHeader !== columnId) {
diff --git a/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue b/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
index 1f0d378c7..d20124ccf 100644
--- a/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
+++ b/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
@@ -6,14 +6,16 @@
       :root="application?.localName || application?.title"
       role="navigation"
     />
-
-    <h1 class="title main-title">
-      <span>{{
-        $t("dataTypeAuthorizations.title", {
-          label: currentUser[0] ? currentUser[0].label : currentUser.label,
+    <TitleAndDescription
+      :application="application"
+      :localDescription="currentAuthorization.description"
+      :localName="application.localName || application.title"
+      :local-title="
+        $t('dataTypeAuthorizations.title', {
+          label: currentUser[0] ? currentUser[0].label : currentUser.login,
         })
-      }}</span>
-    </h1>
+      "
+    />
     <LoadingAnimate v-if="isLoading" :size="'is-medium'"></LoadingAnimate>
     <ValidationObserver v-else ref="observer" v-slot="{ handleSubmit }">
       <FieldsForm
@@ -120,10 +122,12 @@ import app, { i18n } from "@/main";
 import useArray from "@/composable/components/array";
 import { getListColumnName } from "@/composable/authorization/grantableInfos";
 import { User } from "@/model/User";
+import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
 export default {
   name: "AuthorizationsRightsRequestInfoView",
   components: {
+    TitleAndDescription,
     LoadingAnimate,
     AuthorizationTableForDatatype,
     PageView,
@@ -341,7 +345,7 @@ export default {
         );
         initApplication(getApplication);
         dependencies.value = buildDependencies(configuration.hierarchicalNodes);
-        changeFormat(configuration.rightsRequest.format || {});
+        changeFormat(configuration.rightsRequest.formFields || {});
         changeFields(
           (Object.keys(format) || []).reduce((acc, field) => {
             acc[field] = "";
diff --git a/src/views/authorizations/DataTypeAuthorizationInfoView.vue b/src/views/authorizations/DataTypeAuthorizationInfoView.vue
index 70de801f9..02889d270 100644
--- a/src/views/authorizations/DataTypeAuthorizationInfoView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationInfoView.vue
@@ -6,10 +6,16 @@
       :root="application.localName || application.title"
       role="navigation"
     />
-
-    <h1 class="title main-title">
-      <span v-if="authorizationId === 'new'">{{ $t("titles.data-type-new-authorization") }}</span>
-    </h1>
+    <TitleAndDescription
+      :application="application"
+      :localDescription="currentAuthorization.description"
+      :localName="application.localName || application.title"
+      :local-title="
+        authorizationId === 'new'
+          ? $t('titles.data-type-new-authorization')
+          : currentAuthorization.name
+      "
+    />
     <ValidationObserver ref="observer">
       <div class="columns">
         <ValidationProvider
@@ -108,11 +114,13 @@ import app, { i18n } from "@/main";
 import services from "@/composable/services";
 import { dataLoader } from "@/composable/data/dataLoader";
 import AuthorizationTableForDatatype from "@/components/common/AuthorizationTableForDatatype.vue";
+import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
 export default {
   name: "DataTypeAuthorizationInfoView",
   emits: ["update:infoAuth"],
   components: {
+    TitleAndDescription,
     AuthorizationTableForDatatype,
     PageView,
     SubMenu,
diff --git a/src/views/authorizations/DataTypeAuthorizationsView.vue b/src/views/authorizations/DataTypeAuthorizationsView.vue
index 4c19b1ffa..de80ee779 100644
--- a/src/views/authorizations/DataTypeAuthorizationsView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationsView.vue
@@ -6,14 +6,17 @@
       :root="application.localName || application.name"
       role="navigation"
     />
-    <h1 class="title main-title">
-      {{
-        $t("titles.data-type-authorizations", {
+    <TitleAndDescription
+      :application="application"
+      :localDescription="application.localRefDescription"
+      :localName="application.localName || application.name"
+      :local-title="
+        $t('titles.data-type-authorizations', {
           dataType: application.localName || application.name,
-          type: "autorisation",
+          type: 'autorisation',
         })
-      }}
-    </h1>
+      "
+    />
 
     <div class="rows">
       <div class="row">
@@ -543,6 +546,7 @@ import useBoolean from "@/composable/components/boolean";
 import { LOCAL_STORAGE_LANG } from "@/services/Fetcher";
 import DetailAuthorizationModalCard from "@/components/common/authorization/DetailAuthorizationModalCard.vue";
 import SummaryTableOfAuthorizationByData from "@/components/common/authorization/SummaryTableOfAuthorizationByData.vue";
+import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
 export default {
   name: "DataTypeAuthorizationsView",
@@ -552,6 +556,7 @@ export default {
     },
   },
   components: {
+    TitleAndDescription,
     SummaryTableOfAuthorizationByData,
     LoadingAnimate,
     PageView,
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index bfb0bfc92..2ddf11641 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -6,9 +6,12 @@
       :root="application.localName"
       role="navigation"
     />
-    <h1 class="title main-title">
-      {{ $t("titles.references-data", { refName: application.localRefName }) }}
-    </h1>
+    <TitleAndDescription
+      :application="application"
+      :localDescription="application.localRefDescription"
+      :localName="application.localRefName"
+      :local-title="$t('titles.references-data', { refName: application.localRefName })"
+    />
     <div id="tagsCollapse" class="column">
       <TagsCollapse
         v-if="hasTags"
@@ -33,13 +36,13 @@
         id="filtreTable"
         :current-page="currentPage"
         :data="rows"
+        :height="tableHeight"
         :is-focusable="true"
         :is-hoverable="true"
         :per-page="params.limit"
         :sticky-header="true"
-        pagination-position="both"
-        :height="tableHeight"
         paginated
+        pagination-position="both"
         striped
         style="padding-bottom: 20px; position: relative; z-index: 2"
       >
@@ -60,16 +63,16 @@
             range-after="3"
             range-before="3"
             role="navigation"
-            @change="changePage"
             style="margin: 0; padding-top: 20px; padding-bottom: 20px"
+            @change="changePage"
           />
         </template>
         <b-table-column
           v-for="column in dataColumnsToBeShown"
           :key="column.id"
           :field="column.id"
-          style="padding-bottom: 20px; position: relative; z-index: 2"
           sortable
+          style="padding-bottom: 20px; position: relative; z-index: 2"
         >
           <template v-slot:header>
             <div v-if="column.tags" class="column" style="padding: 0">
@@ -80,15 +83,15 @@
               </TagsInfos>
               <DatasPatternLink
                 v-if="'PatternComponent' === column.type"
-                :info="column.type === 'PatternComponent'"
                 :application="application"
-                :value="column.getColumnQualifiersMap(application, dataId, rows[0])"
                 :column-id="column.id"
                 :column-title="column.id"
+                :data-id="dataId"
+                :info="column.type === 'PatternComponent'"
                 :info-values="column.getColumnQualifiersMap(application, dataId, rows[0])"
                 :loaded-references-by-key="{}"
                 :pattern-checker-date-ref="patternCheckerDateRef"
-                :data-id="dataId"
+                :value="column.getColumnQualifiersMap(application, dataId, rows[0])"
               ></DatasPatternLink>
               <div v-else>
                 {{ column.getHeader(application, dataId) }}
@@ -123,8 +126,8 @@
               :column="column"
               :column-id="column.id"
               :component="props.row"
-              :info-values="props.row.values[column.id]"
               :displays-for-row="props.row.displaysForRow"
+              :info-values="props.row.values[column.id]"
               :loaded-references-by-key="{}"
               :multiplicity="multiplicity(column.id, props.row.values[column.id])"
               :reference-type="addRefLinkedTo(column.id, column.linkedTo)"
@@ -165,9 +168,9 @@
     <div class="buttons" style="margin-top: 16px">
       <!--        <b-button @click="loadExampleData">Afficher un exemple</b-button>-->
       <b-button
+        icon-left="download"
         style="margin-bottom: 15px; float: right"
         type="is-primary"
-        icon-left="download"
         @click.prevent="downloadResultSearch"
         >{{ $t("dataTable.donwload-view-result") }}
       </b-button>
@@ -203,6 +206,7 @@ import { dataLoader } from "@/composable/data/dataLoader";
 import { patternCheckerDateRef } from "@/composable/application/DatePattern";
 import DatasPatternLink from "@/components/datas/DatasPatternLink.vue";
 import { Tag } from "@/model/application/Tag";
+import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
 export default {
   name: "DataTableView",
@@ -211,6 +215,7 @@ export default {
     dataId: String,
   },
   components: {
+    TitleAndDescription,
     DatasPatternLink,
     TagsInfos,
     FiltersDataCollapse,
@@ -225,6 +230,7 @@ export default {
   setup(props) {
     const onlyMetadata = ref(true);
     const { reactiveObject: params } = useObject(new DownloadDatasetQuery(0, 10));
+    const locale = services.internationalisationService.getLocale();
     const loader = dataLoader(services);
     provide("reference:dataLoader", loader);
     const { getColumnNameView } = loader;
@@ -344,10 +350,9 @@ export default {
         );
         changeApplication({
           ...services.internationalisationService.mergeInternationalization(application),
-          localRefName: services.internationalisationService.localeReferenceNames(
-            props.dataId,
-            application
-          ),
+          localRefName: application.configuration.i18n.data[props.dataId].i18n.title[locale],
+          localRefDescription:
+            application.configuration.i18n.data[props.dataId].i18n.description[locale],
         });
         const data = await services.dataService.getData(
           props.applicationName,
diff --git a/src/views/data/DatasManagementView.vue b/src/views/data/DatasManagementView.vue
index c704af262..d4d4fea21 100644
--- a/src/views/data/DatasManagementView.vue
+++ b/src/views/data/DatasManagementView.vue
@@ -1,46 +1,37 @@
 <template>
-  <PageView class="with-submenu" :application="application">
+  <PageView :application="application" class="with-submenu">
     <SubMenu
       :aria-label="$t('menu.aria-sub-menu')"
       :paths="subMenuPaths"
       :root="application.localName || application.title"
       role="navigation"
     />
-    <b-tooltip
-      v-if="application.localDescription"
-      :label="application.localDescription"
-      class="title main-title"
-      position="is-top"
-    >
-      <h1 class="title main-title">
-        {{
-          type[type.length - 1] === "dataTypes"
-            ? $t("titles.data-types-page", {
-                applicationName: application.localName || application.title,
-              })
-            : $t("titles.references-page", {
-                applicationName: application.localName || application.title,
-              })
-        }}
-      </h1>
-    </b-tooltip>
-    <h1 v-else class="title main-title">
-      {{
-        type[type.length - 1] === "dataTypes"
-          ? $t("titles.data-types-page", {
+    <TitleAndDescription
+      :application="application"
+      :local-title="
+        type[type.length - 1] === 'dataTypes'
+          ? $t('titles.data-types-page', {
               applicationName: application.localName || application.title,
             })
-          : $t("titles.references-page", {
+          : $t('titles.references-page', {
               applicationName: application.localName || application.title,
             })
-      }}
-    </h1>
+      "
+      :localDescription="application.localDescription"
+      :localName="application.localName"
+    />
     <div
-      class="btn_auth_tooltip"
       v-if="canCreateApplication || canManagerApplication || canManagerUser"
+      class="btn_auth_tooltip"
     >
       <b-tooltip :label="$t('dataTypesManagement.consult-authorization')" position="is-top">
-        <b-button icon-left="key" outlined rounded type="is-warning" @click="consultAuthorization" />
+        <b-button
+          icon-left="key"
+          outlined
+          rounded
+          type="is-warning"
+          @click="consultAuthorization"
+        />
       </b-tooltip>
     </div>
     <div v-if="errorsMessages.length !== 0" style="margin: 10px">
@@ -75,10 +66,10 @@
         :on-upload-cb="
           withVersioning(data.id) ? null : (label, file) => uploadReferenceCsv(label, file)
         "
-        :repository="data.submission"
-        :repository-redirect="(label) => showVersioning(label)"
         :option="data"
         :reference-synthesis="application.referenceSynthesis"
+        :repository="data.submission"
+        :repository-redirect="(label) => showVersioning(label)"
         :show-empty="showInfoEmpty[data.id]"
         :tags="tags"
         class="liste"
@@ -119,10 +110,12 @@ import { lineCountSynthesis } from "@/composable/application/synthesis";
 import LoadingAnimate from "@/components/common/LoadingAnimate.vue";
 import ShowErrors from "@/components/application/ShowErrors.vue";
 import { Tag } from "@/model/application/Tag";
+import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
 export default {
   name: "DatasManagementView",
   components: {
+    TitleAndDescription,
     ShowErrors,
     LoadingAnimate,
     CollapsibleTree,
@@ -397,6 +390,7 @@ export default {
         )
         .find((t) => t);
     }
+
     function withVersioning(dataId) {
       return !!(
         application.configuration.dataDescription[dataId]?.submission &&
@@ -449,6 +443,7 @@ export default {
   margin-bottom: 10px;
   border: 1px solid white;
 }
+
 .btn_auth_tooltip {
   display: flex;
   justify-content: center;
-- 
GitLab


From 056c361c83a6bb877034c1095a687b0275b91b8b Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Wed, 11 Dec 2024 14:26:30 +0100
Subject: [PATCH 23/61] =?UTF-8?q?dernier=20title=20oubli=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../RequestAuthorizationManagementView.vue      | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/views/authorizations/RequestAuthorizationManagementView.vue b/src/views/authorizations/RequestAuthorizationManagementView.vue
index 2f31c6a07..74f7e5772 100644
--- a/src/views/authorizations/RequestAuthorizationManagementView.vue
+++ b/src/views/authorizations/RequestAuthorizationManagementView.vue
@@ -6,13 +6,15 @@
       :root="application.localName || application.title"
       role="navigation"
     />
-    <h1 class="title main-title">
-      {{
-        $t("titles.requestAuthorization", {
+    <TitleAndDescription
+      :application="application"
+      :localName="application.localName || application.title"
+      :local-title="
+        $t('titles.requestAuthorization', {
           applicationName: application.localName || application.title,
         })
-      }}
-    </h1>
+      "
+    />
     <div>
       <b-table
         :data="listRightsRequests"
@@ -98,10 +100,12 @@ import app, { i18n } from "@/main";
 import useObject from "@/composable/components/object";
 import { onMounted, ref, watch } from "vue";
 import useArray from "@/composable/components/array";
+import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
 export default {
   name: "RequestAuthorizationManagementView",
   components: {
+    TitleAndDescription,
     PageView,
     SubMenu,
   },
@@ -221,9 +225,8 @@ export default {
         changeListAllUsers(localeListAllUsers.users.filter((user) => user.label !== "_public_"));
         if (localRightsRequests.rightsRequests) {
           changeListRightsRequests(localRightsRequests.rightsRequests);
-        } else {
-          changeRightsRequests(localRightsRequests);
         }
+        changeRightsRequests(localRightsRequests);
       } catch (error) {
         services.alertService.toastServerError(error);
       }
-- 
GitLab


From 2baccc5f40057feaff19028e382400dd39b1a250 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Wed, 11 Dec 2024 14:28:35 +0100
Subject: [PATCH 24/61] verticalisation

---
 package-lock.json                             | 270 +++++++++++++++---
 .../common/provider/FiltersDataCollapse.vue   |   2 +-
 src/components/datas/DatasPatternLink.vue     |  30 +-
 src/locales/en.json                           |   2 +
 src/locales/fr.json                           |   2 +
 src/model/application/Component.js            |  77 +++--
 src/views/data/DataTableView.vue              |  41 ++-
 7 files changed, 343 insertions(+), 81 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 97df31138..e6422ec90 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -76,6 +76,7 @@
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
       "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+      "dev": true,
       "dependencies": {
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.24"
@@ -101,6 +102,7 @@
       "version": "7.26.2",
       "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz",
       "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==",
+      "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -109,6 +111,7 @@
       "version": "7.26.0",
       "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
       "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
+      "dev": true,
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
         "@babel/code-frame": "^7.26.0",
@@ -195,6 +198,7 @@
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
       "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
+      "dev": true,
       "dependencies": {
         "@babel/compat-data": "^7.25.9",
         "@babel/helper-validator-option": "^7.25.9",
@@ -275,6 +279,7 @@
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
       "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+      "dev": true,
       "dependencies": {
         "@babel/traverse": "^7.25.9",
         "@babel/types": "^7.25.9"
@@ -287,6 +292,7 @@
       "version": "7.26.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
       "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+      "dev": true,
       "dependencies": {
         "@babel/helper-module-imports": "^7.25.9",
         "@babel/helper-validator-identifier": "^7.25.9",
@@ -396,6 +402,7 @@
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
       "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+      "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -418,6 +425,7 @@
       "version": "7.26.0",
       "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
       "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
+      "dev": true,
       "dependencies": {
         "@babel/template": "^7.25.9",
         "@babel/types": "^7.26.0"
@@ -1719,6 +1727,7 @@
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
       "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+      "dev": true,
       "optional": true,
       "engines": {
         "node": ">=0.1.90"
@@ -1728,6 +1737,7 @@
       "version": "3.0.6",
       "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.6.tgz",
       "integrity": "sha512-fi0eVdCOtKu5Ed6+E8mYxUF6ZTFJDZvHogCBelM0xVXmrDEkyM22gRArQzq1YcHPm1V47Vf/iAD+WgVdUlJCGg==",
+      "dev": true,
       "dependencies": {
         "aws-sign2": "~0.7.0",
         "aws4": "^1.8.0",
@@ -1784,6 +1794,7 @@
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
       "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
+      "dev": true,
       "dependencies": {
         "debug": "^3.1.0",
         "lodash.once": "^4.1.1"
@@ -1793,6 +1804,7 @@
       "version": "3.2.7",
       "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
       "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dev": true,
       "dependencies": {
         "ms": "^2.1.1"
       }
@@ -2578,6 +2590,7 @@
       "version": "8.56.12",
       "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz",
       "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==",
+      "dev": true,
       "dependencies": {
         "@types/estree": "*",
         "@types/json-schema": "*"
@@ -2587,6 +2600,7 @@
       "version": "3.7.7",
       "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
       "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+      "dev": true,
       "dependencies": {
         "@types/eslint": "*",
         "@types/estree": "*"
@@ -2595,7 +2609,8 @@
     "node_modules/@types/estree": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
-      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="
+      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+      "dev": true
     },
     "node_modules/@types/express": {
       "version": "4.17.21",
@@ -2737,12 +2752,14 @@
     "node_modules/@types/sinonjs__fake-timers": {
       "version": "8.1.1",
       "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
-      "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g=="
+      "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
+      "dev": true
     },
     "node_modules/@types/sizzle": {
       "version": "2.3.9",
       "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz",
-      "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w=="
+      "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==",
+      "dev": true
     },
     "node_modules/@types/sockjs": {
       "version": "0.3.36",
@@ -2813,6 +2830,7 @@
       "version": "2.10.3",
       "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
       "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
+      "dev": true,
       "optional": true,
       "dependencies": {
         "@types/node": "*"
@@ -3486,6 +3504,7 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
       "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/helper-numbers": "1.13.2",
         "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
@@ -3494,22 +3513,26 @@
     "node_modules/@webassemblyjs/floating-point-hex-parser": {
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
-      "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="
+      "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+      "dev": true
     },
     "node_modules/@webassemblyjs/helper-api-error": {
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
-      "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="
+      "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+      "dev": true
     },
     "node_modules/@webassemblyjs/helper-buffer": {
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
-      "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="
+      "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+      "dev": true
     },
     "node_modules/@webassemblyjs/helper-numbers": {
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
       "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/floating-point-hex-parser": "1.13.2",
         "@webassemblyjs/helper-api-error": "1.13.2",
@@ -3519,12 +3542,14 @@
     "node_modules/@webassemblyjs/helper-wasm-bytecode": {
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
-      "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="
+      "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+      "dev": true
     },
     "node_modules/@webassemblyjs/helper-wasm-section": {
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
       "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
         "@webassemblyjs/helper-buffer": "1.14.1",
@@ -3536,6 +3561,7 @@
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
       "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+      "dev": true,
       "dependencies": {
         "@xtuc/ieee754": "^1.2.0"
       }
@@ -3544,6 +3570,7 @@
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
       "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+      "dev": true,
       "dependencies": {
         "@xtuc/long": "4.2.2"
       }
@@ -3551,12 +3578,14 @@
     "node_modules/@webassemblyjs/utf8": {
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
-      "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="
+      "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+      "dev": true
     },
     "node_modules/@webassemblyjs/wasm-edit": {
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
       "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
         "@webassemblyjs/helper-buffer": "1.14.1",
@@ -3572,6 +3601,7 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
       "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
         "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
@@ -3584,6 +3614,7 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
       "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
         "@webassemblyjs/helper-buffer": "1.14.1",
@@ -3595,6 +3626,7 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
       "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
         "@webassemblyjs/helper-api-error": "1.13.2",
@@ -3608,6 +3640,7 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
       "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+      "dev": true,
       "dependencies": {
         "@webassemblyjs/ast": "1.14.1",
         "@xtuc/long": "4.2.2"
@@ -3616,12 +3649,14 @@
     "node_modules/@xtuc/ieee754": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
-      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+      "dev": true
     },
     "node_modules/@xtuc/long": {
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
-      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+      "dev": true
     },
     "node_modules/accepts": {
       "version": "1.3.8",
@@ -3688,6 +3723,7 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
       "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "dev": true,
       "dependencies": {
         "clean-stack": "^2.0.0",
         "indent-string": "^4.0.0"
@@ -3700,6 +3736,7 @@
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
       "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -3751,6 +3788,7 @@
       "version": "3.5.2",
       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
       "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "dev": true,
       "peerDependencies": {
         "ajv": "^6.9.1"
       }
@@ -3769,6 +3807,7 @@
       "version": "4.1.3",
       "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
       "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -3777,6 +3816,7 @@
       "version": "4.3.2",
       "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
       "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+      "dev": true,
       "dependencies": {
         "type-fest": "^0.21.3"
       },
@@ -3842,6 +3882,7 @@
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
       "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -3937,6 +3978,7 @@
       "version": "0.2.6",
       "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
       "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+      "dev": true,
       "dependencies": {
         "safer-buffer": "~2.1.0"
       }
@@ -3945,6 +3987,7 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
       "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+      "dev": true,
       "engines": {
         "node": ">=0.8"
       }
@@ -3953,6 +3996,7 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
       "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -3960,12 +4004,14 @@
     "node_modules/async": {
       "version": "3.2.6",
       "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
-      "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="
+      "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+      "dev": true
     },
     "node_modules/asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "dev": true
     },
     "node_modules/at-least-node": {
       "version": "1.0.0",
@@ -4030,6 +4076,7 @@
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
       "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+      "dev": true,
       "engines": {
         "node": "*"
       }
@@ -4037,7 +4084,8 @@
     "node_modules/aws4": {
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
-      "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="
+      "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
+      "dev": true
     },
     "node_modules/babel-loader": {
       "version": "8.4.1",
@@ -4129,6 +4177,7 @@
       "version": "1.5.1",
       "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
       "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -4153,6 +4202,7 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
       "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+      "dev": true,
       "dependencies": {
         "tweetnacl": "^0.14.3"
       }
@@ -4190,12 +4240,14 @@
     "node_modules/blob-util": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
-      "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ=="
+      "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
+      "dev": true
     },
     "node_modules/bluebird": {
       "version": "3.7.2",
       "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
-      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+      "dev": true
     },
     "node_modules/body-parser": {
       "version": "1.20.3",
@@ -4271,6 +4323,7 @@
       "version": "4.24.2",
       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
       "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
+      "dev": true,
       "funding": [
         {
           "type": "opencollective",
@@ -4317,6 +4370,7 @@
       "version": "5.7.1",
       "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
       "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -4340,6 +4394,7 @@
       "version": "0.2.13",
       "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
       "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+      "dev": true,
       "engines": {
         "node": "*"
       }
@@ -4375,6 +4430,7 @@
       "version": "2.4.0",
       "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
       "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
+      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -4440,6 +4496,7 @@
       "version": "1.0.30001680",
       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz",
       "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==",
+      "dev": true,
       "funding": [
         {
           "type": "opencollective",
@@ -4467,7 +4524,8 @@
     "node_modules/caseless": {
       "version": "0.12.0",
       "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
+      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+      "dev": true
     },
     "node_modules/chalk": {
       "version": "3.0.0",
@@ -4525,6 +4583,7 @@
       "version": "2.24.0",
       "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
       "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
+      "dev": true,
       "engines": {
         "node": ">= 0.8.0"
       }
@@ -4547,6 +4606,7 @@
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
       "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+      "dev": true,
       "engines": {
         "node": ">=6.0"
       }
@@ -4555,6 +4615,7 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz",
       "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -4580,6 +4641,7 @@
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
       "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -4588,6 +4650,7 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
       "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+      "dev": true,
       "dependencies": {
         "restore-cursor": "^3.1.0"
       },
@@ -4654,6 +4717,7 @@
       "version": "0.6.5",
       "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
       "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
+      "dev": true,
       "dependencies": {
         "string-width": "^4.2.0"
       },
@@ -4668,6 +4732,7 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
       "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+      "dev": true,
       "dependencies": {
         "slice-ansi": "^3.0.0",
         "string-width": "^4.2.0"
@@ -4757,6 +4822,7 @@
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dev": true,
       "dependencies": {
         "delayed-stream": "~1.0.0"
       },
@@ -4768,6 +4834,7 @@
       "version": "6.2.1",
       "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
       "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+      "dev": true,
       "engines": {
         "node": ">= 6"
       }
@@ -4776,6 +4843,7 @@
       "version": "1.8.2",
       "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
       "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+      "dev": true,
       "engines": {
         "node": ">=4.0.0"
       }
@@ -4875,7 +4943,8 @@
     "node_modules/convert-source-map": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
-      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
+      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+      "dev": true
     },
     "node_modules/cookie": {
       "version": "0.7.1",
@@ -5293,6 +5362,7 @@
       "version": "13.16.0",
       "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.16.0.tgz",
       "integrity": "sha512-g6XcwqnvzXrqiBQR/5gN+QsyRmKRhls1y5E42fyOvsmU7JuY+wM6uHJWj4ZPttjabzbnRvxcik2WemR8+xT6FA==",
+      "dev": true,
       "hasInstallScript": true,
       "dependencies": {
         "@cypress/request": "^3.0.6",
@@ -5370,6 +5440,7 @@
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
       "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
@@ -5385,6 +5456,7 @@
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
       "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -5396,6 +5468,7 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
       "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+      "dev": true,
       "dependencies": {
         "cross-spawn": "^7.0.0",
         "get-stream": "^5.0.0",
@@ -5418,6 +5491,7 @@
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
       "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+      "dev": true,
       "dependencies": {
         "pump": "^3.0.0"
       },
@@ -5432,6 +5506,7 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
       "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+      "dev": true,
       "engines": {
         "node": ">=8"
       },
@@ -5443,6 +5518,7 @@
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
       "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "dev": true,
       "dependencies": {
         "path-key": "^3.0.0"
       },
@@ -5454,6 +5530,7 @@
       "version": "7.6.3",
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
       "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+      "dev": true,
       "bin": {
         "semver": "bin/semver.js"
       },
@@ -5465,6 +5542,7 @@
       "version": "8.1.1",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
       "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "dev": true,
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -5479,6 +5557,7 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
       "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+      "dev": true,
       "dependencies": {
         "assert-plus": "^1.0.0"
       },
@@ -5537,7 +5616,8 @@
     "node_modules/dayjs": {
       "version": "1.11.13",
       "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
-      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
+      "dev": true
     },
     "node_modules/de-indent": {
       "version": "1.0.2",
@@ -5712,6 +5792,7 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
       "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "dev": true,
       "engines": {
         "node": ">=0.4.0"
       }
@@ -5908,6 +5989,7 @@
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
       "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+      "dev": true,
       "dependencies": {
         "jsbn": "~0.1.0",
         "safer-buffer": "^2.1.0"
@@ -5921,12 +6003,14 @@
     "node_modules/electron-to-chromium": {
       "version": "1.5.63",
       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.63.tgz",
-      "integrity": "sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA=="
+      "integrity": "sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA==",
+      "dev": true
     },
     "node_modules/emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true
     },
     "node_modules/emojis-list": {
       "version": "3.0.0",
@@ -5948,6 +6032,7 @@
       "version": "1.4.4",
       "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
       "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dev": true,
       "dependencies": {
         "once": "^1.4.0"
       }
@@ -5956,6 +6041,7 @@
       "version": "5.17.1",
       "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
       "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
+      "dev": true,
       "dependencies": {
         "graceful-fs": "^4.2.4",
         "tapable": "^2.2.0"
@@ -5968,6 +6054,7 @@
       "version": "2.4.1",
       "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
       "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
+      "dev": true,
       "dependencies": {
         "ansi-colors": "^4.1.1",
         "strip-ansi": "^6.0.1"
@@ -6092,7 +6179,8 @@
     "node_modules/es-module-lexer": {
       "version": "1.5.4",
       "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
-      "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw=="
+      "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
+      "dev": true
     },
     "node_modules/es-object-atoms": {
       "version": "1.0.0",
@@ -6138,6 +6226,7 @@
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
       "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -6272,6 +6361,7 @@
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
       "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "dev": true,
       "dependencies": {
         "esrecurse": "^4.3.0",
         "estraverse": "^4.1.1"
@@ -6599,6 +6689,7 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
       "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
       "dependencies": {
         "estraverse": "^5.2.0"
       },
@@ -6610,6 +6701,7 @@
       "version": "5.3.0",
       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
       "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "dev": true,
       "engines": {
         "node": ">=4.0"
       }
@@ -6618,6 +6710,7 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
       "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "dev": true,
       "engines": {
         "node": ">=4.0"
       }
@@ -6657,7 +6750,8 @@
     "node_modules/eventemitter2": {
       "version": "6.4.7",
       "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
-      "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg=="
+      "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
+      "dev": true
     },
     "node_modules/eventemitter3": {
       "version": "4.0.7",
@@ -6668,6 +6762,7 @@
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
       "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "dev": true,
       "engines": {
         "node": ">=0.8.x"
       }
@@ -6761,6 +6856,7 @@
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
       "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
+      "dev": true,
       "dependencies": {
         "pify": "^2.2.0"
       },
@@ -6825,12 +6921,14 @@
     "node_modules/extend": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true
     },
     "node_modules/extract-zip": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
       "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+      "dev": true,
       "dependencies": {
         "debug": "^4.1.1",
         "get-stream": "^5.1.0",
@@ -6850,6 +6948,7 @@
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
       "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+      "dev": true,
       "dependencies": {
         "pump": "^3.0.0"
       },
@@ -6864,6 +6963,7 @@
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
       "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+      "dev": true,
       "engines": [
         "node >=0.6.0"
       ]
@@ -6910,7 +7010,8 @@
     "node_modules/fast-json-stable-stringify": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
     },
     "node_modules/fast-levenshtein": {
       "version": "2.0.6",
@@ -6947,6 +7048,7 @@
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
       "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+      "dev": true,
       "dependencies": {
         "pend": "~1.2.0"
       }
@@ -6955,6 +7057,7 @@
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
       "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+      "dev": true,
       "dependencies": {
         "escape-string-regexp": "^1.0.5"
       },
@@ -6969,6 +7072,7 @@
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
       "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "dev": true,
       "engines": {
         "node": ">=0.8.0"
       }
@@ -7117,6 +7221,7 @@
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
       "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+      "dev": true,
       "engines": {
         "node": "*"
       }
@@ -7125,6 +7230,7 @@
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
       "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+      "dev": true,
       "dependencies": {
         "asynckit": "^0.4.0",
         "combined-stream": "^1.0.8",
@@ -7243,6 +7349,7 @@
       "version": "1.0.0-beta.2",
       "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
       "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -7306,6 +7413,7 @@
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
       "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
+      "dev": true,
       "dependencies": {
         "async": "^3.2.0"
       }
@@ -7314,6 +7422,7 @@
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
       "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+      "dev": true,
       "dependencies": {
         "assert-plus": "^1.0.0"
       }
@@ -7353,12 +7462,14 @@
     "node_modules/glob-to-regexp": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
-      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+      "dev": true
     },
     "node_modules/global-dirs": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
       "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
+      "dev": true,
       "dependencies": {
         "ini": "2.0.0"
       },
@@ -7946,6 +8057,7 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz",
       "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==",
+      "dev": true,
       "dependencies": {
         "assert-plus": "^1.0.0",
         "jsprim": "^2.0.2",
@@ -7959,6 +8071,7 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
       "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+      "dev": true,
       "engines": {
         "node": ">=8.12.0"
       }
@@ -8001,6 +8114,7 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
       "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -8059,6 +8173,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
       "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -8082,6 +8197,7 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
       "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+      "dev": true,
       "engines": {
         "node": ">=10"
       }
@@ -8272,6 +8388,7 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -8291,6 +8408,7 @@
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
       "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+      "dev": true,
       "dependencies": {
         "global-dirs": "^3.0.0",
         "is-path-inside": "^3.0.2"
@@ -8348,6 +8466,7 @@
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
       "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -8457,12 +8576,14 @@
     "node_modules/is-typedarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+      "dev": true
     },
     "node_modules/is-unicode-supported": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
       "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+      "dev": true,
       "engines": {
         "node": ">=10"
       },
@@ -8522,7 +8643,8 @@
     "node_modules/isstream": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
+      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+      "dev": true
     },
     "node_modules/javascript-stringify": {
       "version": "2.1.0",
@@ -8534,6 +8656,7 @@
       "version": "27.5.1",
       "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
       "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+      "dev": true,
       "dependencies": {
         "@types/node": "*",
         "merge-stream": "^2.0.0",
@@ -8547,6 +8670,7 @@
       "version": "8.1.1",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
       "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "dev": true,
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -8599,7 +8723,8 @@
     "node_modules/jsbn": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
+      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+      "dev": true
     },
     "node_modules/jsesc": {
       "version": "3.0.2",
@@ -8627,17 +8752,20 @@
     "node_modules/json-parse-even-better-errors": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+      "dev": true
     },
     "node_modules/json-schema": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
-      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+      "dev": true
     },
     "node_modules/json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
     },
     "node_modules/json-stable-stringify-without-jsonify": {
       "version": "1.0.1",
@@ -8648,12 +8776,14 @@
     "node_modules/json-stringify-safe": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
+      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+      "dev": true
     },
     "node_modules/json5": {
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
       "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "dev": true,
       "bin": {
         "json5": "lib/cli.js"
       },
@@ -8727,6 +8857,7 @@
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
       "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
+      "dev": true,
       "engines": [
         "node >=0.6.0"
       ],
@@ -8785,6 +8916,7 @@
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
       "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
+      "dev": true,
       "engines": {
         "node": "> 0.8"
       }
@@ -8821,6 +8953,7 @@
       "version": "3.14.0",
       "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
       "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
+      "dev": true,
       "dependencies": {
         "cli-truncate": "^2.1.0",
         "colorette": "^2.0.16",
@@ -8847,6 +8980,7 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
       "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+      "dev": true,
       "engines": {
         "node": ">=6.11.5"
       }
@@ -8944,7 +9078,8 @@
     "node_modules/lodash.once": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
-      "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+      "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+      "dev": true
     },
     "node_modules/lodash.truncate": {
       "version": "4.4.2",
@@ -8962,6 +9097,7 @@
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
       "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+      "dev": true,
       "dependencies": {
         "chalk": "^4.1.0",
         "is-unicode-supported": "^0.1.0"
@@ -8977,6 +9113,7 @@
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
       "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
@@ -8992,6 +9129,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
       "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+      "dev": true,
       "dependencies": {
         "ansi-escapes": "^4.3.0",
         "cli-cursor": "^3.1.0",
@@ -9009,6 +9147,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
       "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "astral-regex": "^2.0.0",
@@ -9025,6 +9164,7 @@
       "version": "6.2.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
       "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
@@ -9046,6 +9186,7 @@
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
       "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dev": true,
       "dependencies": {
         "yallist": "^3.0.2"
       }
@@ -9454,7 +9595,8 @@
     "node_modules/node-releases": {
       "version": "2.0.18",
       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
-      "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g=="
+      "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
+      "dev": true
     },
     "node_modules/normalize-package-data": {
       "version": "2.5.0",
@@ -9733,7 +9875,8 @@
     "node_modules/ospath": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
-      "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA=="
+      "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
+      "dev": true
     },
     "node_modules/p-finally": {
       "version": "1.0.0",
@@ -9776,6 +9919,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
       "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "dev": true,
       "dependencies": {
         "aggregate-error": "^3.0.0"
       },
@@ -9925,12 +10069,14 @@
     "node_modules/pend": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="
+      "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+      "dev": true
     },
     "node_modules/performance-now": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
+      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+      "dev": true
     },
     "node_modules/picocolors": {
       "version": "1.1.1",
@@ -9952,6 +10098,7 @@
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
       "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -10685,6 +10832,7 @@
       "version": "5.6.0",
       "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
       "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+      "dev": true,
       "engines": {
         "node": ">=6"
       },
@@ -10705,6 +10853,7 @@
       "version": "0.11.10",
       "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
       "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+      "dev": true,
       "engines": {
         "node": ">= 0.6.0"
       }
@@ -10971,7 +11120,8 @@
     "node_modules/proxy-from-env": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
-      "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A=="
+      "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
+      "dev": true
     },
     "node_modules/pseudomap": {
       "version": "1.0.2",
@@ -10983,6 +11133,7 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
       "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
+      "dev": true,
       "dependencies": {
         "end-of-stream": "^1.1.0",
         "once": "^1.3.1"
@@ -10992,6 +11143,7 @@
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
       "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -11034,6 +11186,7 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
       "dependencies": {
         "safe-buffer": "^5.1.0"
       }
@@ -11317,6 +11470,7 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
       "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
+      "dev": true,
       "dependencies": {
         "throttleit": "^1.0.0"
       }
@@ -11373,6 +11527,7 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
       "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+      "dev": true,
       "dependencies": {
         "onetime": "^5.1.0",
         "signal-exit": "^3.0.2"
@@ -11402,7 +11557,8 @@
     "node_modules/rfdc": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
-      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="
+      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+      "dev": true
     },
     "node_modules/rimraf": {
       "version": "3.0.2",
@@ -11446,6 +11602,7 @@
       "version": "7.8.1",
       "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
       "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+      "dev": true,
       "dependencies": {
         "tslib": "^2.1.0"
       }
@@ -11656,6 +11813,7 @@
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
       "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+      "dev": true,
       "dependencies": {
         "randombytes": "^2.1.0"
       }
@@ -11866,6 +12024,7 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
       "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "astral-regex": "^2.0.0",
@@ -12014,6 +12173,7 @@
       "version": "1.18.0",
       "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
       "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
+      "dev": true,
       "dependencies": {
         "asn1": "~0.2.3",
         "assert-plus": "^1.0.0",
@@ -12079,6 +12239,7 @@
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -12342,6 +12503,7 @@
       "version": "5.3.10",
       "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
       "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
+      "dev": true,
       "dependencies": {
         "@jridgewell/trace-mapping": "^0.3.20",
         "jest-worker": "^27.4.5",
@@ -12375,6 +12537,7 @@
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
       "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dev": true,
       "dependencies": {
         "@types/json-schema": "^7.0.8",
         "ajv": "^6.12.5",
@@ -12479,6 +12642,7 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz",
       "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==",
+      "dev": true,
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
@@ -12486,7 +12650,8 @@
     "node_modules/through": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
+      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+      "dev": true
     },
     "node_modules/thunky": {
       "version": "1.1.0",
@@ -12497,6 +12662,7 @@
       "version": "6.1.61",
       "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.61.tgz",
       "integrity": "sha512-rv8LUyez4Ygkopqn+M6OLItAOT9FF3REpPQDkdMx5ix8w4qkuE7Vo2o/vw1nxKQYmJDV8JpAMJQr1b+lTKf0FA==",
+      "dev": true,
       "dependencies": {
         "tldts-core": "^6.1.61"
       },
@@ -12507,12 +12673,14 @@
     "node_modules/tldts-core": {
       "version": "6.1.61",
       "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.61.tgz",
-      "integrity": "sha512-In7VffkDWUPgwa+c9picLUxvb0RltVwTkSgMNFgvlGSWveCzGBemBqTsgJCL4EDFWZ6WH0fKTsot6yNhzy3ZzQ=="
+      "integrity": "sha512-In7VffkDWUPgwa+c9picLUxvb0RltVwTkSgMNFgvlGSWveCzGBemBqTsgJCL4EDFWZ6WH0fKTsot6yNhzy3ZzQ==",
+      "dev": true
     },
     "node_modules/tmp": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
       "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+      "dev": true,
       "engines": {
         "node": ">=14.14"
       }
@@ -12549,6 +12717,7 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz",
       "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==",
+      "dev": true,
       "dependencies": {
         "tldts": "^6.1.32"
       },
@@ -12566,6 +12735,7 @@
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
       "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+      "dev": true,
       "bin": {
         "tree-kill": "cli.js"
       }
@@ -12579,6 +12749,7 @@
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
       "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+      "dev": true,
       "dependencies": {
         "safe-buffer": "^5.0.1"
       },
@@ -12589,7 +12760,8 @@
     "node_modules/tweetnacl": {
       "version": "0.14.5",
       "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
+      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+      "dev": true
     },
     "node_modules/type-check": {
       "version": "0.4.0",
@@ -12607,6 +12779,7 @@
       "version": "0.21.3",
       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
       "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+      "dev": true,
       "engines": {
         "node": ">=10"
       },
@@ -12774,6 +12947,7 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
       "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -12782,6 +12956,7 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
       "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
+      "dev": true,
       "funding": [
         {
           "type": "opencollective",
@@ -12811,6 +12986,7 @@
       "version": "4.4.1",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
       "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
       "dependencies": {
         "punycode": "^2.1.0"
       }
@@ -12886,6 +13062,7 @@
       "version": "1.10.0",
       "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
       "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+      "dev": true,
       "engines": [
         "node >=0.6.0"
       ],
@@ -13241,6 +13418,7 @@
       "version": "2.4.2",
       "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
       "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
+      "dev": true,
       "dependencies": {
         "glob-to-regexp": "^0.4.1",
         "graceful-fs": "^4.1.2"
@@ -13276,6 +13454,7 @@
       "version": "5.96.1",
       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz",
       "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==",
+      "dev": true,
       "dependencies": {
         "@types/eslint-scope": "^3.7.7",
         "@types/estree": "^1.0.6",
@@ -13635,6 +13814,7 @@
       "version": "3.2.3",
       "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
       "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+      "dev": true,
       "engines": {
         "node": ">=10.13.0"
       }
@@ -13649,6 +13829,7 @@
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
       "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dev": true,
       "dependencies": {
         "@types/json-schema": "^7.0.8",
         "ajv": "^6.12.5",
@@ -13764,6 +13945,7 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
       "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
@@ -13814,7 +13996,8 @@
     "node_modules/yallist": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "dev": true
     },
     "node_modules/yaml": {
       "version": "1.10.2",
@@ -13876,6 +14059,7 @@
       "version": "2.10.0",
       "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
       "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+      "dev": true,
       "dependencies": {
         "buffer-crc32": "~0.2.3",
         "fd-slicer": "~1.1.0"
diff --git a/src/components/common/provider/FiltersDataCollapse.vue b/src/components/common/provider/FiltersDataCollapse.vue
index d53e35739..bd7ae13f1 100644
--- a/src/components/common/provider/FiltersDataCollapse.vue
+++ b/src/components/common/provider/FiltersDataCollapse.vue
@@ -94,7 +94,7 @@
           <b-field v-else-if="columns.id !== '#'">
             <template #label>
               <label class="titleInput" style="padding: 0 0.625em 0 0.625rem">{{
-                columns.getHeader(application, dataId)
+                  columns.getHeader(application, dataId)
               }}</label>
             </template>
             <b-taginput
diff --git a/src/components/datas/DatasPatternLink.vue b/src/components/datas/DatasPatternLink.vue
index 5bd614905..ec16cc41f 100644
--- a/src/components/datas/DatasPatternLink.vue
+++ b/src/components/datas/DatasPatternLink.vue
@@ -1,5 +1,5 @@
 <template>
-  <div>
+  <div v-if="withQualifier">
     <span v-if="info && showBtnTablePatternColumn(infoValues)">
       <b-button
         size="is-small"
@@ -23,7 +23,7 @@
         <div class="card-header">
           <div class="title card-header-title">
             <p field="name" style="font-size: 1.5rem">
-              {{ columnTitle.match(".*::(.*)")[1] }}
+              {{ columnTitle.match(".*::(.*)")?columnTitle.match(".*::(.*)")[1] : columnTitle}}
             </p>
           </div>
         </div>
@@ -68,9 +68,13 @@
       </div>
     </b-modal>
   </div>
+  <div v-else>
+    {{ patternLinkHeader}}
+  </div>
 </template>
 
 <script>
+import services from "@/composable/services";
 import useBoolean from "@/composable/components/boolean";
 import DatasLink from "@/components/datas/DatasLink.vue";
 import { computed } from "vue";
@@ -79,17 +83,18 @@ export default {
   name: "DatasPatternLink",
   components: { /*LoadingAnimate, DatasManyLink, */ DatasLink },
   props: {
+    withQualifier: Boolean,
     application: Object,
     columnTitle: String,
     value: Array,
     infoValues: {},
     loadedReferencesByKey: {
-      type: Object,
+      type: Object
     },
     dataId: String,
     info: Boolean,
     columnId: String,
-    patternCheckerDateRef: Function,
+    patternCheckerDateRef: Function
   },
   beforeCreate() {
     this.$options.components.DatasLink = require("./DatasLink.vue").default;
@@ -102,15 +107,22 @@ export default {
     function showBtnTablePatternColumn(tableDynamicColumn) {
       let showModal = Object.entries(tableDynamicColumn)
         .filter((a) => a[1])
-        .map(function (a) {
+        .map(function(a) {
           let obj = {};
           obj[a[0]] = a[1];
           return obj;
         });
       return showModal.length !== 0;
     }
+    const patternLinkHeader = computed(()=>{
+      return services.internationalisationService.localeReferenceColumnsNames(props.dataId, props.columnTitle, props.application)
+    })
 
-    const columnName = computed(() => props.columnTitle.match(".*::(.*)")[1]);
+    const columnName = computed(() => {
+        let pattern = props.columnTitle.match(".*::(.*)");
+        return pattern ? pattern[1] : props.columnTitle;
+      }
+    );
 
     async function showModal() {
       isLoading.value = true;
@@ -118,14 +130,16 @@ export default {
       isLoading.value = false;
       return props.value;
     }
+
     return {
+      patternLinkHeader,
       columnName,
       isLoading,
       isCardModalActive,
       showBtnTablePatternColumn,
-      showModal,
+      showModal
     };
-  },
+  }
 };
 </script>
 .modal-high-z-index { z-index: 9999 !important; position: absolute; }
diff --git a/src/locales/en.json b/src/locales/en.json
index 30a689d10..0bf86a033 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -273,6 +273,8 @@
     "filter-auth-by-name": "Filter by authorization name"
   },
   "dataTypesManagement": {
+    "horizontalized": "Horizontalized data",
+    "verticalized": "Verticalized data",
     "ASC": "ASC",
     "DESC": "DESC",
     "accepted": "Accepted",
diff --git a/src/locales/fr.json b/src/locales/fr.json
index b9ae2ed74..f1369770e 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -274,6 +274,8 @@
     "filter-auth-by-name": "Filtre par nom d'autorisation"
   },
   "dataTypesManagement": {
+    "horizontalized": "Données horizontalisées",
+    "verticalized": "Données verticalisées",
     "ASC": "ASC",
     "DESC": "DESC",
     "accepted": "Accepté",
diff --git a/src/model/application/Component.js b/src/model/application/Component.js
index 22838f577..6ee43b0de 100644
--- a/src/model/application/Component.js
+++ b/src/model/application/Component.js
@@ -54,7 +54,7 @@ export class Component {
     return row.values[this.id];
   }
 
-  getDisplayValue = function (row) {
+  getDisplayValue = function(row) {
     let columnValue = this.getColumnValue(row);
     let displaysForRow = row.displaysForRow?.[this.refLinkedTo]?.[row.values[this.id]];
     if (displaysForRow && typeof columnValue !== "number") {
@@ -107,8 +107,8 @@ export class Component {
           getInternationalizedColumn(
             referenceName,
             component.patternColumnComponents[patternColumnComponent].exportHeader ||
-              component.patternColumnComponents[patternColumnComponent].exportHeaderName ||
-              component.patternColumnComponents[patternColumnComponent].componentKey,
+            component.patternColumnComponents[patternColumnComponent].exportHeaderName ||
+            component.patternColumnComponents[patternColumnComponent].componentKey,
             application
           );
       }
@@ -214,6 +214,7 @@ class PatternComponent extends Component {
   patternQualifierComponents;
   originalName;
   rowId;
+  horizontalDisplay = true;
 
   constructor(
     type,
@@ -259,9 +260,12 @@ class PatternComponent extends Component {
   }
 
   getColumnValue(row) {
-    let pattern = this.id.match("(.*?)::(.*)");
-    return row.values[pattern[1]]?.find((column) => column.__ORIGINAL_COLUMN_NAME__ == pattern[2])
-      ?.__VALUE__;
+    if (this.horizontalDisplay)
+      if (this.horizontalDisplay) {
+        let pattern = this.id.match("(.*?)::(.*)");
+        return row.values[pattern[1]]?.find((column) => column.__ORIGINAL_COLUMN_NAME__ == pattern[2]);
+      }
+    return row.values[this.componentKey]?.[0]?.__VALUE__;
   }
 
   componentsForValue(value, row) {
@@ -290,22 +294,37 @@ class PatternComponent extends Component {
   }
 
   getColumnQualifiersMap(application, dataId, row) {
-    let pattern = this.id.match("(.*)::(.*)");
-    let value = row.values[pattern[1]].find(
-      (component) => pattern[2] == component.__ORIGINAL_COLUMN_NAME__
-    );
-    let qualifiers = this.patternQualifierComponents.map((col) => {
-      let columnName = col.getHeader(application, dataId, col.id);
-      let returnValue = {
-        component: col,
-        column: col.id,
-        columnName,
-        value: value[col.id],
-        id: col.id,
-      };
-      returnValue[col.id] = value[col.id];
-      return returnValue;
-    }, []);
+    let qualifiers;
+    if (dataId) {
+      let pattern = this.id.match("(.*)::(.*)");
+      let value;
+      if (pattern) {
+        value = row.values[pattern[1]].find(
+          (component) => pattern[2] == component.__ORIGINAL_COLUMN_NAME__
+        );
+      }else{
+        value = row?.values?.[dataId]?.[0]
+      }
+      qualifiers = this.patternQualifierComponents.map((col) => {
+        let columnName;
+        if(this.horizontalDisplay){
+          columnName = col.getHeader(application, dataId, col.id);
+        }else {
+          columnName = dataId;
+        }
+        let returnValue = {
+          component: col,
+          column: col.id,
+          columnName,
+          value: value[col.id],
+          id: col.id
+        };
+        returnValue[col.id] = value[col.id];
+        return returnValue;
+      }, []);
+    } else {
+      qualifiers = this.patternQualifierComponents;
+    }
 
     return qualifiers;
   }
@@ -337,7 +356,19 @@ class PatternQualifierComponent extends Component {
     } else if (this.id.match(".*::.*")) {
       return this._getInternationalizedColumn(dataId, this.id, application);
     }
-    return "PatternQualifierComponent non trouvé";
+    return this._getInternationalizedColumn(dataId, this.id, application);
+  }
+
+
+  getColumnValue(row) {
+    let pattern = this.id.match("(.*)::(.*)::(.*)");
+    if (pattern) {
+      return row.values[pattern[1]]?.find(
+        (column) => column.__ORIGINAL_COLUMN_NAME__ == pattern[3]
+      )?.[pattern[2]];
+    }
+    let value = row.values?.[this.parentComponentKey]?.[0]?.[this.id];
+    return row.displaysForRow?.[this.refLinkedTo]?.[value] || value;
   }
 }
 
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index 07b604af7..bfc7a7e3d 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -30,6 +30,10 @@
       />
       <LoadingAnimate v-if="isLoading" :size="'is-large'"></LoadingAnimate>
       <div v-if="data && dataColumnsToBeShown && !isLoading && totalRows<101">
+        <b-switch v-if="canHorizontalize" v-model="horizontalDisplay" @input="changeDisplay"
+        >
+        {{horizontalDisplay?$t('dataTypesManagement.horizontalized'):$t('dataTypesManagement.verticalized')}}
+        </b-switch>
         <b-table
           id="filtreTable"
           :current-page="currentPage"
@@ -58,16 +62,21 @@
                 </TagsInfos>
                 <DatasPatternLink
                   v-if="'PatternComponent' === column.type"
+                :with-qualifier="horizontalDisplay"
                   :info="column.type === 'PatternComponent'"
                   :application="application"
-                  :value="column.getColumnQualifiersMap(application, dataId, rows[0])"
+                :value="column.getColumnQualifiersMap(application, column.horizontalDisplay?dataId:column.componentKey, rows[0])"
                   :column-id="column.id"
                   :column-title="column.id"
-                  :info-values="column.getColumnQualifiersMap(application, dataId, rows[0])"
+                :info-values="column.getColumnQualifiersMap(application, column.horizontalDisplay?dataId:column.componentKey, rows[0])"
                   :loaded-references-by-key="{}"
                   :pattern-checker-date-ref="patternCheckerDateRef"
                   :data-id="dataId"
                 ></DatasPatternLink>
+              <div
+                v-else-if="'patternQualifierComponent' === column.type">
+                {{ column.getHeader(application, dataId) }}
+              </div>
                 <div v-else>
                   {{ column.getHeader(application, dataId) }}
                 </div>
@@ -236,6 +245,8 @@ export default {
     const { shallowRefArray: errorsMessages } = useArray();
     const { refNumber: currentPage, doChangeNumber: changeCurrentPage } = useNumber(1);
     const { refBoolean: isLoading, doChangeBoolean: changeIsLoading } = useBoolean();
+    const { refBoolean: horizontalDisplay, doChangeBoolean: changeHorizontalDisplay } = useBoolean();
+    const canHorizontalize = ref(false);
     const { reactiveObject: application, doChangeObject: changeApplication } = useObject(
       new ApplicationResult()
     );
@@ -358,11 +369,14 @@ export default {
           props.applicationName,
           props.dataId,
           {
+            horizontalDisplay: horizontalDisplay.value,
             offset: params.offset,
             limit: params.limit
           },
           loadExample.value
         );
+        canHorizontalize.value = data.patternDefinitionCount == 1
+        changeHorizontalDisplay(data.patternDefinitionCount > 1);
         if (data) {
           //let dataValues = data.rows;
           //totalRows.value = data.totalRows;
@@ -374,7 +388,7 @@ export default {
             }
           }
         }
-        await updateData({"filters":[]}, data, false, totalRows);
+        await updateData({ "filters": [] }, data, false, totalRows);
       } catch (error) {
         services.alertService.toastServerError(error, state);
       }
@@ -384,12 +398,18 @@ export default {
     const realVariables = computed(() => {
       return columns.value.reduce((acc, column) => {
         if (column.type === "PatternComponent") {
+          if (horizontalDisplay.value) {
           let row = rows.value[0];
           row.values[column.id]
             .map((value) => column.componentsForValue(value, row))
             .forEach((col) => {
               col.forEach((col2) => acc.push(col2));
             });
+          } else {
+            column.horizontalDisplay=false;
+            acc.push(column)
+            column.getColumnQualifiersMap(application, null, rows.value[0]).forEach(qualifier => acc.push(qualifier));
+          }
         } else if (column.type !== "PatternAdjacentComponent") {
           acc.push(column);
         }
@@ -485,7 +505,7 @@ export default {
       changeCurrentPage(1);
       let limit = params.limit;
       params.limit = null;
-      params.componentFilters = event.filters.filter((v) => v !== undefined);
+      params.componentFilters = event?.filters ? event.filters.filter((v) => v !== undefined) : params.componentFilters;
       let tableValue = await services.dataService.getData(
         props.applicationName,
         props.dataId,
@@ -498,7 +518,7 @@ export default {
       changeRows(tableValue.rows);
       let variables = tableValue.variables;
       //totalRows.value = tableValue.totalRows;
-      pushFilters(event?event.filters.filter((v) => v !== undefined):{});
+      pushFilters(event ? event.filters.filter((v) => v !== undefined) : {});
       await setInitialVariables(variables);
       changeIsLoading(false);
       this?.$forceUpdate && this.$forceUpdate();
@@ -606,7 +626,14 @@ export default {
       console.log("coucou");
     }
 
+    async function changeDisplay(event) {
+      params.horizontalDisplay = horizontalDisplay.value;
+      recalculate();
+      console.log("changeDisplay", event, horizontalDisplay.value);
+    }
+
     return {
+      changeDisplay,
       state,
       showModal,
       realVariables,
@@ -645,7 +672,9 @@ export default {
       patternCheckerDateRef,
       totalRows,
       tableHeight,
-      loader
+      loader,
+      canHorizontalize,
+      horizontalDisplay
     };
   }
 };
-- 
GitLab


From d7551412865b5b595b9c41ea1d323052a78592f6 Mon Sep 17 00:00:00 2001
From: VARLOTEAUX Lucile <lucile.varloteaux@inrae.fr>
Date: Wed, 11 Dec 2024 14:36:05 +0100
Subject: [PATCH 25/61] =?UTF-8?q?Merge=20branch=20'318-Lors-du-d=C3=A9p?=
 =?UTF-8?q?=C3=B4t-de-donn=C3=A9es-donner-l'indication-du-type-de-donn?=
 =?UTF-8?q?=C3=A9es-et-pas-du-SI'=20into=20'develop'?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Resolve "Lors du dépôt de données donner l'indication du type de données et pas du SI"

See merge request anaee-dev/openadom/frontend!192
---
 public/Logos_OA.svg                           |  70 ++++++++++++
 public/Logos_OpernADOM.svg                    | 100 ++++++++++++++++++
 src/components/common/CollapsibleTree.vue     |   2 +-
 src/components/common/SubMenu.vue             |   5 +
 src/components/common/TitleAndDescription.vue |  35 ++++++
 .../common/provider/FiltersDataCollapse.vue   |   4 +-
 src/composable/data/dataLoader.js             |  31 +++---
 src/locales/en.json                           |   2 +-
 src/locales/fr.json                           |   2 +-
 src/views/application/ApplicationInfoView.vue |   3 +-
 .../AuthorizationsRightsRequestInfoView.vue   |  20 ++--
 .../DataTypeAuthorizationInfoView.vue         |  16 ++-
 .../DataTypeAuthorizationsView.vue            |  17 +--
 .../RequestAuthorizationManagementView.vue    |  17 +--
 src/views/data/DataTableView.vue              |  19 ++--
 src/views/data/DataVersioningView.vue         |  52 +++++----
 src/views/data/DatasManagementView.vue        |  73 ++++++++++---
 17 files changed, 376 insertions(+), 92 deletions(-)
 create mode 100644 public/Logos_OA.svg
 create mode 100644 public/Logos_OpernADOM.svg
 create mode 100644 src/components/common/TitleAndDescription.vue

diff --git a/public/Logos_OA.svg b/public/Logos_OA.svg
new file mode 100644
index 000000000..7d9591663
--- /dev/null
+++ b/public/Logos_OA.svg
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="_x31_4"
+   viewBox="0 0 833.61 598.36"
+   version="1.1"
+   sodipodi:docname="2024_11_20_Logos_OpernADOM_SDE_3.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata13">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1867"
+     inkscape:window-height="1043"
+     id="namedview11"
+     showgrid="false"
+     inkscape:zoom="0.42115116"
+     inkscape:cx="769.64922"
+     inkscape:cy="491.52489"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="_x31_4"
+     inkscape:document-rotation="0" />
+  <defs
+     id="defs4">
+    <style
+       id="style2">
+      .cls-1 {
+        fill: #00a3a6;
+      }
+
+      .cls-2 {
+        fill: #275663;
+      }
+    </style>
+  </defs>
+  <path
+     class="cls-2"
+     d="m 267.0022,52.127747 c -143.15531,0 -259.2012909,119.663923 -259.2012909,267.282303 0,147.61841 116.0459809,267.28233 259.2012909,267.28233 143.15528,0 259.20126,-119.66392 259.20126,-267.28233 0,-147.61838 -116.04598,-267.282303 -259.20126,-267.282303 z m 0,433.881553 c -89.21009,0 -161.56229,-74.56091 -161.56229,-166.59925 0,-92.03831 72.30663,-166.59925 161.56229,-166.59925 89.25562,0 161.56226,74.56094 161.56226,166.59925 0,92.03834 -72.30664,166.59925 -161.56226,166.59925 z"
+     id="path6"
+     style="stroke-width:4.62666" />
+  <path
+     class="cls-1"
+     d="M 531.44308,59.879822 H 640.74592 L 832.0145,581.75923 H 707.94962 L 667.35403,464.91425 H 504.10598 L 464.23936,581.75923 H 340.12892 L 531.39751,59.879822 Z m 115.95486,321.969728 -61.32622,-184.4995 -62.78421,184.4995 h 124.06487 z"
+     id="path8"
+     style="stroke-width:4.62666" />
+</svg>
diff --git a/public/Logos_OpernADOM.svg b/public/Logos_OpernADOM.svg
new file mode 100644
index 000000000..cf4ef6cd2
--- /dev/null
+++ b/public/Logos_OpernADOM.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="_x30_1"
+   viewBox="0 0 833.61 598.36"
+   version="1.1"
+   sodipodi:docname="2024_11_20_Logos_OpernADOM_SDE_1_interligne_petit.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata25">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="2507"
+     inkscape:window-height="1403"
+     id="namedview23"
+     showgrid="false"
+     inkscape:zoom="0.59559768"
+     inkscape:cx="681.94681"
+     inkscape:cy="469.55204"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="_x30_1" />
+  <defs
+     id="defs4">
+    <style
+       id="style2">
+      .cls-1 {
+        fill: #00a3a6;
+      }
+
+      .cls-2 {
+        fill: #275663;
+      }
+    </style>
+  </defs>
+  <path
+     class="cls-2"
+     d="m 128.21142,277.73013 c -17.38039,0 -33.131366,-3.58826 -47.408117,-10.76479 C 66.52657,259.78883 54.344772,250.41044 44.257941,238.74859 34.171108,227.08673 26.334423,213.79388 20.747872,198.78842 c -5.586551,-15.00543 -8.379834,-30.41863 -8.379834,-46.40269 0,-15.98408 2.870874,-31.72349 8.690198,-46.72893 C 26.877558,90.651336 35.024621,77.440036 45.421816,66.02284 55.81901,54.605656 68.155977,45.471909 82.432726,38.703146 96.709472,31.934386 112.30527,28.50922 129.2201,28.50922 c 16.91484,0 33.13135,3.588259 47.4081,10.764777 14.27674,7.176518 26.45855,16.63647 36.54538,28.379871 10.08681,11.743401 17.92353,25.117818 23.35489,40.123262 5.50895,15.00545 8.22463,30.25556 8.22463,45.66876 0,15.41319 -2.94844,31.72346 -8.69017,46.72892 -5.81932,15.00545 -13.8888,28.21676 -24.20842,39.63396 -10.31959,11.41717 -22.57896,20.55093 -36.85571,27.4828 -14.27674,6.93185 -29.87255,10.35701 -46.70979,10.35701 z M 67.302477,153.20124 c 0,9.45996 1.319044,18.59369 3.957146,27.4828 2.638087,8.88908 6.517641,16.79957 11.716238,23.73143 5.121004,6.93187 11.561056,12.47735 19.242579,16.63649 7.68149,4.15911 16.44929,6.19789 26.30335,6.19789 9.85404,0 19.32017,-2.20188 27.00167,-6.60566 7.68151,-4.40377 14.04396,-10.11237 19.08738,-17.12579 5.04343,-7.0134 8.84539,-15.00543 11.40588,-23.89453 2.48291,-8.8891 3.80197,-17.9413 3.80197,-27.15662 0,-9.21529 -1.31906,-18.59369 -3.95714,-27.4828 -2.63811,-8.88907 -6.59524,-16.71801 -11.87142,-23.48677 -5.27621,-6.768774 -11.71627,-12.232704 -19.24259,-16.228724 -7.60391,-3.996013 -16.2941,-6.034797 -26.14817,-6.034797 -9.85405,0 -19.24257,2.120339 -26.84648,6.442557 -7.603925,4.24066 -13.966386,9.86771 -19.087392,16.799584 -5.198597,6.93185 -9.000562,14.84235 -11.561057,23.73144 -2.560512,8.88909 -3.801964,17.9413 -3.801964,27.15659 z"
+     id="path6"
+     style="stroke-width:7.95465" />
+  <path
+     class="cls-2"
+     d="M 229.77806,277.73013 V 28.590775 h 101.17866 c 11.32831,0 21.7255,2.446543 31.19159,7.339627 9.46611,4.893069 17.61317,11.335628 24.36358,19.327659 6.75043,7.992033 12.10422,16.962689 16.06134,26.99349 3.87956,10.030815 5.81933,20.224749 5.81933,30.500219 0,11.00942 -1.86219,21.52955 -5.50895,31.56036 -3.64678,10.03082 -8.7678,19.08302 -15.36305,26.99349 -6.59522,7.99203 -14.5095,14.27149 -23.89801,18.91991 -9.38852,4.64845 -19.70812,7.01342 -31.0364,7.01342 h -48.10644 v 80.32808 H 229.70047 Z M 284.5573,147.24799 h 44.77002 c 6.44004,0 12.0266,-2.93586 16.68204,-8.80755 4.65549,-5.8717 6.98323,-14.35303 6.98323,-25.60712 0,-5.87169 -0.69834,-10.84633 -2.17256,-15.086994 -1.47423,-4.24068 -3.41401,-7.74739 -5.81932,-10.52013 -2.48292,-2.772751 -5.27619,-4.811535 -8.37984,-6.11636 -3.10364,-1.304812 -6.20728,-1.957232 -9.3885,-1.957232 h -42.75266 v 68.095386 z"
+     id="path8"
+     style="stroke-width:7.95465" />
+  <path
+     class="cls-1"
+     d="m 557.28971,268.25896 c -17.92352,6.90347 -35.14873,10.0341 -51.59804,9.47219 -16.44928,-0.5619 -31.50194,-4.17419 -45.15793,-10.75656 -13.65604,-6.58236 -25.52747,-15.73347 -35.5367,-27.37303 -10.00923,-11.63957 -17.76834,-24.96486 -23.12213,-39.8956 -5.74174,-16.05456 -8.61259,-32.10914 -8.53499,-48.32426 0.0776,-16.21509 3.10361,-31.46695 9.07814,-45.91605 5.9745,-14.449114 14.97505,-27.533591 27.00168,-39.173147 12.02659,-11.639556 27.15684,-21.031492 45.39072,-28.015225 18.2339,-6.983734 35.45909,-10.114374 51.8308,-9.311645 16.3717,0.802729 31.34678,4.575547 44.84761,11.318467 13.57843,6.823196 25.29465,16.134842 35.3039,27.934949 10.00925,11.880385 17.69076,25.366207 23.12212,40.537791 1.39665,3.93337 2.63809,7.86674 3.72437,11.71983 1.08628,3.85309 1.8622,7.3851 2.32772,10.35521 l -158.20806,60.68625 c 6.44005,14.44911 15.75098,23.76077 27.85516,27.93494 12.1818,4.17419 24.2084,3.93337 36.15743,-0.72244 9.54369,-3.61228 17.84593,-9.55248 24.98428,-17.7403 7.1384,-8.18783 10.70758,-16.93757 10.78519,-26.24921 l 61.21928,-5.21774 c -2.17254,20.71037 -10.16441,39.89559 -23.89802,57.63588 -13.73362,17.74029 -32.97618,31.38668 -57.7277,40.85888 z m -3.41402,-153.24084 c -6.44004,-13.56612 -15.28542,-22.797494 -26.6137,-27.694144 -11.3283,-4.896631 -23.27732,-4.976908 -35.76945,-0.16053 -12.49217,4.81635 -21.8031,13.084464 -27.15687,24.563484 -5.35379,11.47902 -6.20728,24.40294 -2.63808,38.6915 l 92.1781,-35.32003 z"
+     id="path10"
+     style="stroke-width:7.89205" />
+  <path
+     class="cls-2"
+     d="M 678.71963,135.25994 V 277.73013 H 623.94038 V 28.590775 h 42.75266 L 777.18264,174.89388 V 28.590775 h 54.77925 V 277.73013 h -44.0717 z"
+     id="path12"
+     style="stroke-width:7.95465" />
+  <path
+     class="cls-2"
+     d="m 88.114312,313.18482 h 49.425478 l 86.43637,249.13937 H 164.15352 L 147.00588,500.01896 H 78.260255 L 61.423011,562.32419 H 1.6003364 L 88.036726,313.18482 Z m 50.511758,145.32451 -25.83782,-82.04064 -26.458523,82.04064 z"
+     id="path14"
+     style="stroke-width:7.95465" />
+  <path
+     class="cls-2"
+     d="M 201.08683,562.32419 V 313.18482 h 88.45375 c 19.55293,0 36.70054,3.26206 51.44283,9.86774 14.6647,6.52408 27.00169,15.41319 36.93333,26.66728 9.93165,11.25406 17.38039,24.38386 22.34622,39.47085 5.04341,15.087 7.52632,31.1526 7.52632,48.2784 0,18.91989 -2.79328,36.12724 -8.37981,51.37734 -5.58658,15.33166 -13.50085,28.46143 -23.89804,39.30774 -10.31961,10.84633 -22.81176,19.32768 -37.39888,25.28093 -14.58712,5.95322 -30.80363,8.97065 -48.57197,8.97065 H 201.08683 Z M 355.80329,437.38753 c 0,-11.74341 -1.47422,-22.50816 -4.50027,-32.13123 -2.94845,-9.62305 -7.29355,-17.9413 -13.03529,-24.95472 -5.74173,-7.01339 -12.72493,-12.39579 -21.10475,-16.14715 -8.37984,-3.75137 -17.76834,-5.62704 -28.24314,-5.62704 h -36.07982 v 158.5358 h 36.07982 c 10.70757,0 20.25127,-2.03877 28.63111,-6.0348 8.30221,-3.99602 15.28542,-9.54151 20.87197,-16.71802 5.58655,-7.17652 9.85405,-15.49477 12.8801,-25.19938 3.02605,-9.70459 4.50027,-20.22472 4.50027,-31.72346 z"
+     id="path16"
+     style="stroke-width:7.95465" />
+  <path
+     class="cls-2"
+     d="m 500.66573,562.32419 c -17.38039,0 -33.13137,-3.58825 -47.40814,-10.76477 -14.27672,-7.17652 -26.45851,-16.55494 -36.54534,-28.21678 -10.08683,-11.66183 -17.92353,-24.9547 -23.51008,-39.96015 -5.58656,-15.00545 -8.37983,-30.41865 -8.37983,-46.40272 0,-15.98407 2.87086,-31.72347 8.69019,-46.72892 5.81933,-15.00545 13.96638,-28.21677 24.36358,-39.63394 10.3972,-11.4172 22.73417,-20.55095 37.01092,-27.31972 14.27674,-6.76875 29.87253,-10.19391 46.78737,-10.19391 16.91484,0 33.13136,3.58825 47.40811,10.76477 14.27675,7.17652 26.45853,16.63648 36.54536,28.37987 10.08684,11.7434 17.92353,25.11781 23.35491,40.12327 5.50896,15.00545 8.22465,30.25554 8.22465,45.66875 0,15.41321 -2.94848,31.72347 -8.6902,46.72892 -5.81935,15.00546 -13.88879,28.21677 -24.2084,39.63395 -10.3196,11.41718 -22.57899,20.55095 -36.85573,27.48281 -14.27675,6.93187 -29.87253,10.35702 -46.70978,10.35702 z m -60.90894,-124.5289 c 0,9.45995 1.31903,18.59369 3.95711,27.4828 2.63811,8.88909 6.51767,16.79957 11.71627,23.73145 5.121,6.93185 11.56105,12.47734 19.24255,16.63648 7.68152,4.15909 16.44931,6.19788 26.30337,6.19788 9.85406,0 19.32015,-2.20189 27.00166,-6.60566 7.68151,-4.40377 14.04399,-10.11236 19.08742,-17.12576 5.04338,-7.01343 8.84535,-15.00546 11.40584,-23.89456 2.48292,-8.8891 3.80198,-17.94128 3.80198,-27.15659 0,-9.2153 -1.31906,-18.59372 -3.95716,-27.4828 -2.63808,-8.88909 -6.59522,-16.71804 -11.87142,-23.48678 -5.2762,-6.76878 -11.71624,-12.23272 -19.24256,-16.22874 -7.60395,-3.99601 -16.29412,-6.0348 -26.14817,-6.0348 -9.85406,0 -19.24258,2.12034 -26.84652,6.44256 -7.60389,4.24069 -13.96635,9.86771 -19.08737,16.79957 -5.19858,6.93188 -9.00054,14.84236 -11.56107,23.73146 -2.56049,8.88908 -3.80193,17.94129 -3.80193,27.1566 z"
+     id="path18"
+     style="stroke-width:7.95465" />
+  <path
+     class="cls-2"
+     d="M 766.64769,562.32419 V 396.36722 L 716.36873,517.06319 H 687.66004 L 637.38107,396.36722 v 165.95697 h -43.063 V 313.18482 h 58.27083 l 60.28824,130.15596 60.59857,-130.15596 h 57.96048 v 249.13937 h -64.6333 z"
+     id="path20"
+     style="stroke-width:7.95465" />
+</svg>
diff --git a/src/components/common/CollapsibleTree.vue b/src/components/common/CollapsibleTree.vue
index cf8a9ff4e..3335cef8f 100644
--- a/src/components/common/CollapsibleTree.vue
+++ b/src/components/common/CollapsibleTree.vue
@@ -20,7 +20,7 @@
               @click="(event) => onClickLabelCb && onClickLabelCb(event, option.label)"
               @keyup.enter="(event) => onClickLabelCb && onClickLabelCb(event, option.label)"
             >
-              <!-- TODO Lucile : btn ouvertur sidePanel à redéfinir ce qu'on met dedant puis refaire-->
+              <!-- TODO Lucile : btn ouverture sidePanel à redéfinir ce qu'on met dedant puis refaire-->
               <b-tooltip
                 v-if="false"
                 :label="$t('dataTypesManagement.tooltip_show_secondary_menu')"
diff --git a/src/components/common/SubMenu.vue b/src/components/common/SubMenu.vue
index 91c7e9832..b76d5cf9b 100644
--- a/src/components/common/SubMenu.vue
+++ b/src/components/common/SubMenu.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="SubMenu">
     <FontAwesomeIcon
+      v-if="!isAccueil"
       class="clickable mr-4 SubMenu-back-button"
       icon="arrow-left"
       @click="goBack()"
@@ -47,6 +48,10 @@ export default {
     paths: {
       type: Array,
     },
+    isAccueil: {
+      type: Boolean,
+      default: false,
+    },
   },
   methods: {
     goBack() {
diff --git a/src/components/common/TitleAndDescription.vue b/src/components/common/TitleAndDescription.vue
new file mode 100644
index 000000000..60658e20e
--- /dev/null
+++ b/src/components/common/TitleAndDescription.vue
@@ -0,0 +1,35 @@
+<script>
+export default {
+  name: "TitleAndDescription",
+  props: {
+    application: Object,
+    localName: String,
+    localDescription: String,
+    localTitle: String,
+  },
+};
+</script>
+
+<template>
+  <h1 class="title main-title">
+    <slot name="label" v-bind:option="application">
+      {{ localTitle || localName }}
+    </slot>
+    <slot name="description" v-bind:option="application" v-if="localDescription">
+      <sup style="font-size: 1.5em">
+        <b-tooltip
+          :label="$t('applications.description', { localDescription: localDescription })"
+          position="is-top"
+        >
+          <b-icon icon="info-circle" type="is-dark"></b-icon>
+        </b-tooltip>
+      </sup>
+    </slot>
+  </h1>
+</template>
+
+<style scoped lang="scss">
+.icon {
+  vertical-align: text-top;
+}
+</style>
diff --git a/src/components/common/provider/FiltersDataCollapse.vue b/src/components/common/provider/FiltersDataCollapse.vue
index bd7ae13f1..7940a7780 100644
--- a/src/components/common/provider/FiltersDataCollapse.vue
+++ b/src/components/common/provider/FiltersDataCollapse.vue
@@ -446,7 +446,9 @@ export default {
         for (let i = 0; i < listReferenceValueForAllReferences.value[columnsId].rows.length; i++) {
           if (listReferenceValueForAllReferences.value[columnsId].rows[i].naturalKey === value) {
             if (
-              listReferenceValueForAllReferences.value[columnsId].rows[i].values["__display_default"]
+              listReferenceValueForAllReferences.value[columnsId].rows[i].values[
+                "__display_default"
+              ]
             ) {
               return listReferenceValueForAllReferences.value[columnsId].rows[i].values[
                 "__display_default"
diff --git a/src/composable/data/dataLoader.js b/src/composable/data/dataLoader.js
index 5585ca762..ef8b34642 100644
--- a/src/composable/data/dataLoader.js
+++ b/src/composable/data/dataLoader.js
@@ -2,7 +2,7 @@ export function dataLoader(services) {
   const dataService = services.dataService;
   const references = {};
 
-  const getOrLoadDataByNaturalKey = async function(application, referenceName, key) {
+  const getOrLoadDataByNaturalKey = async function (application, referenceName, key) {
     let applicationName = application.configuration.applicationDescription.name;
     let reference = references?.[referenceName]?.[key];
     if (reference) {
@@ -23,14 +23,14 @@ export function dataLoader(services) {
       referenceName,
       values: reference.rows?.[0],
       localName:
-        reference.rows.length !== 0 ? getValueDisplay(reference.rows?.[0], application) : key
+        reference.rows.length !== 0 ? getValueDisplay(reference.rows?.[0], application) : key,
     };
     references[referenceName] = references[referenceName] || {};
     references[referenceName][key] = reference;
     return reference;
   };
 
-  const getDisplayValueForLink = function(rowValue, column, listDisplayRowsValue, application) {
+  const getDisplayValueForLink = function (rowValue, column, listDisplayRowsValue, application) {
     if (
       listDisplayRowsValue[column.componentKey] &&
       Object.keys(listDisplayRowsValue[column.componentKey]).includes(rowValue)
@@ -42,7 +42,7 @@ export function dataLoader(services) {
     return rowValue;
   };
 
-  const getValueDisplay = function(referenceLocal, application) {
+  const getValueDisplay = function (referenceLocal, application) {
     if (!referenceLocal?.values) {
       return "";
     }
@@ -52,18 +52,18 @@ export function dataLoader(services) {
     if (
       application &&
       referenceLocal.values[
-      "__display_" + application.configuration.applicationDescription.defaultLanguage
-        ]
+        "__display_" + application.configuration.applicationDescription.defaultLanguage
+      ]
     ) {
       return referenceLocal.values[
-      "__display_" + application.configuration.applicationDescription.defaultLanguage
-        ];
+        "__display_" + application.configuration.applicationDescription.defaultLanguage
+      ];
     } else {
       return referenceLocal.values["__display_default"];
     }
   };
 
-  const getColumnNameView = function(columnId, application, dataId, column) {
+  const getColumnNameView = function (columnId, application, dataId, column) {
     let columnName;
     if (!column) {
       columnName = "this is an error " + columnId;
@@ -74,11 +74,12 @@ export function dataLoader(services) {
       let exportHeader = column?.exportHeader
         ? column.exportHeader
         : application.data[dataId].componentDescriptions[columnId].exportHeaderName;
-      exportHeader = services.internationalisationService.localeReferenceColumnsNames(
-        dataId,
-        exportHeader,
-        application
-      ) || exportHeader;
+      exportHeader =
+        services.internationalisationService.localeReferenceColumnsNames(
+          dataId,
+          exportHeader,
+          application
+        ) || exportHeader;
       if (exportHeader !== columnId) {
         columnName = exportHeader || columnId;
       } else if (importHeader !== undefined && importHeader !== columnId) {
@@ -116,7 +117,7 @@ export function dataLoader(services) {
     getOrLoadDataByNaturalKey,
     getValueDisplay,
     getColumnNameView,
-    getDisplayValueForLink
+    getDisplayValueForLink,
   };
   //const getOrLoadData = function()
 }
diff --git a/src/locales/en.json b/src/locales/en.json
index 0bf86a033..2e92589b4 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -984,7 +984,7 @@
     "data-type-new-authorization": "New authorization",
     "data-type-request-authorization": "Request authorizations",
     "data-types-page": "{applicationName} data types",
-    "data-types-repository": "Management of data sets {applicationName}",
+    "data-types-repository": "Management of data sets {dataName}",
     "login-page": "Welcome to",
     "profile": "Profile",
     "references-authorizations": "References authorizations",
diff --git a/src/locales/fr.json b/src/locales/fr.json
index f1369770e..57c2d1603 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -993,7 +993,7 @@
     "data-type-new-authorization": "Nouvelle autorisation",
     "data-type-request-authorization": "Demande d'autorisations",
     "data-types-page": "Type de données de {applicationName}",
-    "data-types-repository": "Gestion des jeux de données de {applicationName}",
+    "data-types-repository": "Gestion des jeux de données de {dataName}",
     "login-page": "Bienvenue sur",
     "profile": "Profil",
     "references-authorizations": "Autorisations des référentiels",
diff --git a/src/views/application/ApplicationInfoView.vue b/src/views/application/ApplicationInfoView.vue
index 4d93a3baf..7d4338221 100644
--- a/src/views/application/ApplicationInfoView.vue
+++ b/src/views/application/ApplicationInfoView.vue
@@ -96,7 +96,7 @@ export default {
         new SubMenuPath(
           "Accueil",
           () => app.$router.push(`/applications/${props.applicationName}`),
-          () => app.$router.push(`/applications`)
+          () => {}
         ),
       ]);
     });
@@ -184,6 +184,7 @@ export default {
     <SubMenu
       :aria-label="$t('menu.aria-sub-menu')"
       :paths="subMenuPaths"
+      :is-accueil="true"
       :root="application.localName || applicationName"
       role="navigation"
     />
diff --git a/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue b/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
index 1f0d378c7..d20124ccf 100644
--- a/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
+++ b/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
@@ -6,14 +6,16 @@
       :root="application?.localName || application?.title"
       role="navigation"
     />
-
-    <h1 class="title main-title">
-      <span>{{
-        $t("dataTypeAuthorizations.title", {
-          label: currentUser[0] ? currentUser[0].label : currentUser.label,
+    <TitleAndDescription
+      :application="application"
+      :localDescription="currentAuthorization.description"
+      :localName="application.localName || application.title"
+      :local-title="
+        $t('dataTypeAuthorizations.title', {
+          label: currentUser[0] ? currentUser[0].label : currentUser.login,
         })
-      }}</span>
-    </h1>
+      "
+    />
     <LoadingAnimate v-if="isLoading" :size="'is-medium'"></LoadingAnimate>
     <ValidationObserver v-else ref="observer" v-slot="{ handleSubmit }">
       <FieldsForm
@@ -120,10 +122,12 @@ import app, { i18n } from "@/main";
 import useArray from "@/composable/components/array";
 import { getListColumnName } from "@/composable/authorization/grantableInfos";
 import { User } from "@/model/User";
+import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
 export default {
   name: "AuthorizationsRightsRequestInfoView",
   components: {
+    TitleAndDescription,
     LoadingAnimate,
     AuthorizationTableForDatatype,
     PageView,
@@ -341,7 +345,7 @@ export default {
         );
         initApplication(getApplication);
         dependencies.value = buildDependencies(configuration.hierarchicalNodes);
-        changeFormat(configuration.rightsRequest.format || {});
+        changeFormat(configuration.rightsRequest.formFields || {});
         changeFields(
           (Object.keys(format) || []).reduce((acc, field) => {
             acc[field] = "";
diff --git a/src/views/authorizations/DataTypeAuthorizationInfoView.vue b/src/views/authorizations/DataTypeAuthorizationInfoView.vue
index 70de801f9..02889d270 100644
--- a/src/views/authorizations/DataTypeAuthorizationInfoView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationInfoView.vue
@@ -6,10 +6,16 @@
       :root="application.localName || application.title"
       role="navigation"
     />
-
-    <h1 class="title main-title">
-      <span v-if="authorizationId === 'new'">{{ $t("titles.data-type-new-authorization") }}</span>
-    </h1>
+    <TitleAndDescription
+      :application="application"
+      :localDescription="currentAuthorization.description"
+      :localName="application.localName || application.title"
+      :local-title="
+        authorizationId === 'new'
+          ? $t('titles.data-type-new-authorization')
+          : currentAuthorization.name
+      "
+    />
     <ValidationObserver ref="observer">
       <div class="columns">
         <ValidationProvider
@@ -108,11 +114,13 @@ import app, { i18n } from "@/main";
 import services from "@/composable/services";
 import { dataLoader } from "@/composable/data/dataLoader";
 import AuthorizationTableForDatatype from "@/components/common/AuthorizationTableForDatatype.vue";
+import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
 export default {
   name: "DataTypeAuthorizationInfoView",
   emits: ["update:infoAuth"],
   components: {
+    TitleAndDescription,
     AuthorizationTableForDatatype,
     PageView,
     SubMenu,
diff --git a/src/views/authorizations/DataTypeAuthorizationsView.vue b/src/views/authorizations/DataTypeAuthorizationsView.vue
index 4c19b1ffa..de80ee779 100644
--- a/src/views/authorizations/DataTypeAuthorizationsView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationsView.vue
@@ -6,14 +6,17 @@
       :root="application.localName || application.name"
       role="navigation"
     />
-    <h1 class="title main-title">
-      {{
-        $t("titles.data-type-authorizations", {
+    <TitleAndDescription
+      :application="application"
+      :localDescription="application.localRefDescription"
+      :localName="application.localName || application.name"
+      :local-title="
+        $t('titles.data-type-authorizations', {
           dataType: application.localName || application.name,
-          type: "autorisation",
+          type: 'autorisation',
         })
-      }}
-    </h1>
+      "
+    />
 
     <div class="rows">
       <div class="row">
@@ -543,6 +546,7 @@ import useBoolean from "@/composable/components/boolean";
 import { LOCAL_STORAGE_LANG } from "@/services/Fetcher";
 import DetailAuthorizationModalCard from "@/components/common/authorization/DetailAuthorizationModalCard.vue";
 import SummaryTableOfAuthorizationByData from "@/components/common/authorization/SummaryTableOfAuthorizationByData.vue";
+import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
 export default {
   name: "DataTypeAuthorizationsView",
@@ -552,6 +556,7 @@ export default {
     },
   },
   components: {
+    TitleAndDescription,
     SummaryTableOfAuthorizationByData,
     LoadingAnimate,
     PageView,
diff --git a/src/views/authorizations/RequestAuthorizationManagementView.vue b/src/views/authorizations/RequestAuthorizationManagementView.vue
index 2f31c6a07..74f7e5772 100644
--- a/src/views/authorizations/RequestAuthorizationManagementView.vue
+++ b/src/views/authorizations/RequestAuthorizationManagementView.vue
@@ -6,13 +6,15 @@
       :root="application.localName || application.title"
       role="navigation"
     />
-    <h1 class="title main-title">
-      {{
-        $t("titles.requestAuthorization", {
+    <TitleAndDescription
+      :application="application"
+      :localName="application.localName || application.title"
+      :local-title="
+        $t('titles.requestAuthorization', {
           applicationName: application.localName || application.title,
         })
-      }}
-    </h1>
+      "
+    />
     <div>
       <b-table
         :data="listRightsRequests"
@@ -98,10 +100,12 @@ import app, { i18n } from "@/main";
 import useObject from "@/composable/components/object";
 import { onMounted, ref, watch } from "vue";
 import useArray from "@/composable/components/array";
+import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
 export default {
   name: "RequestAuthorizationManagementView",
   components: {
+    TitleAndDescription,
     PageView,
     SubMenu,
   },
@@ -221,9 +225,8 @@ export default {
         changeListAllUsers(localeListAllUsers.users.filter((user) => user.label !== "_public_"));
         if (localRightsRequests.rightsRequests) {
           changeListRightsRequests(localRightsRequests.rightsRequests);
-        } else {
-          changeRightsRequests(localRightsRequests);
         }
+        changeRightsRequests(localRightsRequests);
       } catch (error) {
         services.alertService.toastServerError(error);
       }
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index bfc7a7e3d..561b11629 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -6,9 +6,12 @@
       :root="application.localName"
       role="navigation"
     />
-    <h1 class="title main-title">
-      {{ $t("titles.references-data", { refName: application.localRefName }) }}
-    </h1>
+    <TitleAndDescription
+      :application="application"
+      :localDescription="application.localRefDescription"
+      :localName="application.localRefName"
+      :local-title="$t('titles.references-data', { refName: application.localRefName })"
+    />
     <div id="tagsCollapse" class="column">
       <TagsCollapse
         v-if="hasTags"
@@ -215,6 +218,7 @@ import { dataLoader } from "@/composable/data/dataLoader";
 import { patternCheckerDateRef } from "@/composable/application/DatePattern";
 import DatasPatternLink from "@/components/datas/DatasPatternLink.vue";
 import { Tag } from "@/model/application/Tag";
+import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
 export default {
   name: "DataTableView",
@@ -223,6 +227,7 @@ export default {
     dataId: String
   },
   components: {
+    TitleAndDescription,
     DatasPatternLink,
     TagsInfos,
     FiltersDataCollapse,
@@ -238,6 +243,7 @@ export default {
     const loadExample = ref(true);
     const state = ref(""); // can or not load data
     const { reactiveObject: params } = useObject(new DownloadDatasetQuery(0, 10));
+    const locale = services.internationalisationService.getLocale();
     const loader = dataLoader(services);
     provide("reference:dataLoader", loader);
     const { getColumnNameView } = loader;
@@ -359,10 +365,9 @@ export default {
         );
         changeApplication({
           ...services.internationalisationService.mergeInternationalization(application),
-          localRefName: services.internationalisationService.localeReferenceNames(
-            props.dataId,
-            application
-          )
+          localRefName: application.configuration.i18n.data[props.dataId].i18n.title[locale],
+          localRefDescription:
+            application.configuration.i18n.data[props.dataId].i18n.description[locale],
         });
         totalRows.value = application.referenceSynthesis.find(synthesis => synthesis.referenceType === props.dataId)?.lineCount || 0;
         const data = await services.dataService.getData(
diff --git a/src/views/data/DataVersioningView.vue b/src/views/data/DataVersioningView.vue
index 3d0fc6c49..6b422e95a 100644
--- a/src/views/data/DataVersioningView.vue
+++ b/src/views/data/DataVersioningView.vue
@@ -1,19 +1,22 @@
 <template>
   <div>
-    <PageView class="with-submenu" :application="application">
+    <PageView :application="application" class="with-submenu">
       <SubMenu
         :aria-label="$t('menu.aria-sub-menu')"
         :paths="subMenuPaths"
         :root="application.localName || application.title"
         role="navigation"
       />
-      <h1 class="title main-title">
-        {{
-          $t("titles.data-types-repository", {
-            applicationName: application.localName || dataId,
+      <TitleAndDescription
+        :application="application"
+        :localDescription="application.localDatatypeDescription"
+        :localName="application.localDatatypeName"
+        :local-title="
+          $t('titles.data-types-repository', {
+            dataName: application.localDatatypeName || dataId,
           })
-        }}
-      </h1>
+        "
+      />
       <div class="columns">
         <b-field
           v-for="(referenceScopesByData, index) in referenceScopes[dataId]"
@@ -31,21 +34,21 @@
             <template #trigger="{ active }">
               <b-taginput
                 v-model="requiredAuthorizationsLabels[referenceScopesByData.id]"
-                :icon-right="active ? 'angle-up' : 'angle-down'"
-                open-on-focus
-                rounded
-                type="is-dark"
-                :closable="false"
                 :aria-placeholder="
                   $t('dataTypesRepository.placeholder-select-scope-depot', {
                     scope: referenceScopesByData.i18n[locale] || referenceScopesByData.id,
                   })
                 "
+                :closable="false"
+                :icon-right="active ? 'angle-up' : 'angle-down'"
                 :placeholder="
                   $t('dataTypesRepository.placeholder-select-scope-depot', {
                     scope: referenceScopesByData.i18n[locale] || referenceScopesByData.id,
                   })
                 "
+                open-on-focus
+                rounded
+                type="is-dark"
               >
               </b-taginput>
             </template>
@@ -84,11 +87,11 @@
                         label-position="on-border"
                       >
                         <InputDate
-                          :input-type="determinateInputType()"
                           :format="patternDateTimeScope"
-                          name="startDate"
-                          :is-simple-value="true"
                           :from="startDate"
+                          :input-type="determinateInputType()"
+                          :is-simple-value="true"
+                          name="startDate"
                           @update:dateValue="updateDate($event)"
                         >
                         </InputDate>
@@ -102,11 +105,11 @@
                         label-position="on-border"
                       >
                         <InputDate
-                          :input-type="determinateInputType()"
                           :format="patternDateTimeScope"
-                          name="endDate"
-                          :is-simple-value="true"
                           :from="endDate"
+                          :input-type="determinateInputType()"
+                          :is-simple-value="true"
+                          name="endDate"
                           @update:dateValue="updateDate($event)"
                         >
                         </InputDate>
@@ -333,6 +336,7 @@ import ShowErrors from "@/components/application/ShowErrors.vue";
 import { dataLoader } from "@/composable/data/dataLoader";
 import { ReferenceScope } from "@/model/authorization/ReferenceScope";
 import CollapseMenuOneSelect from "@/components/common/CollapseMenuOneSelect.vue";
+import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
 export default {
   name: "DataVersioningView",
@@ -346,6 +350,7 @@ export default {
     },
   },
   components: {
+    TitleAndDescription,
     CollapseMenuOneSelect,
     ShowErrors,
     InputDate,
@@ -420,7 +425,7 @@ export default {
       await init();
       changeSubMenuPaths([
         new SubMenuPath(
-          props.dataId.toLowerCase(),
+          application.localDatatypeName.toLowerCase() || props.dataId.toLowerCase(),
           () => {},
           () => app.$router.push(`/applications/${props.applicationName}/dataTypes`)
         ),
@@ -527,10 +532,9 @@ export default {
         componentNameTimeScope = versioning?.submissionScope?.timescope?.component;
         changeApplication({
           ...services.internationalisationService.mergeInternationalization(application),
-          localDatatypeName: services.internationalisationService.localeDataTypeIdName(
-            application,
-            application.dataTypes[props.dataId]
-          ),
+          localDatatypeName: application.configuration.i18n.data[props.dataId].i18n.title[locale],
+          localDatatypeDescription:
+            application.configuration.i18n.data[props.dataId].i18n.description[locale],
         });
         changeConfiguration(application.configuration.dataDescription[props.dataId]);
         changeAuthorizations(configuration.submission.submissionScope);
@@ -920,6 +924,7 @@ export default {
       }
       return returnValues;
     }
+
     function internationalizeRequiredAuthorization(data, datasets) {
       const value =
         datasets?.datasets?.[0]?.params?.binaryFiledataset?.requiredAuthorizations?.[data]?.sql;
@@ -992,6 +997,7 @@ table.datasetsPanel td {
   border-collapse: collapse;
   text-align: center;
 }
+
 .subtitle {
   font-style: italic;
 }
diff --git a/src/views/data/DatasManagementView.vue b/src/views/data/DatasManagementView.vue
index 226bc6055..7a701667c 100644
--- a/src/views/data/DatasManagementView.vue
+++ b/src/views/data/DatasManagementView.vue
@@ -1,33 +1,39 @@
 <template>
-  <PageView class="with-submenu" :application="application">
+  <PageView :application="application" class="with-submenu">
     <SubMenu
       :aria-label="$t('menu.aria-sub-menu')"
       :paths="subMenuPaths"
       :root="application.localName || application.title"
       role="navigation"
     />
-    <h1 class="title main-title">
-      <b-tooltip :label="application.localDescription">
-        {{
-          type[type.length - 1] === "dataTypes"
-            ? $t("titles.data-types-page", {
-              applicationName: application.localName || application.title
+    <TitleAndDescription
+      :application="application"
+      :local-title="
+        type[type.length - 1] === 'dataTypes'
+          ? $t('titles.data-types-page', {
+              applicationName: application.localName || application.title,
             })
-            : $t("titles.references-page", {
-              applicationName: application.localName || application.title
+          : $t('titles.references-page', {
+              applicationName: application.localName || application.title,
             })
-        }}
-      </b-tooltip>
-      <b-tooltip :label="$t('dataTypesManagement.consult-authorization')" position="is-bottom">
+      "
+      :localDescription="application.localDescription"
+      :localName="application.localName"
+    />
+    <div
+      v-if="canCreateApplication || canManagerApplication || canManagerUser"
+      class="btn_auth_tooltip"
+    >
+      <b-tooltip :label="$t('dataTypesManagement.consult-authorization')" position="is-top">
         <b-button
           icon-left="key"
-          type="is-warning"
-          @click="consultAuthorization"
           outlined
           rounded
+          type="is-warning"
+          @click="consultAuthorization"
         />
       </b-tooltip>
-    </h1>
+    </div>
     <div v-if="errorsMessages.length !== 0" style="margin: 10px">
       <ShowErrors
         :errors-messages="errorsMessages"
@@ -60,10 +66,10 @@
         :on-upload-cb="
           withVersioning(data.id) ? null : (label, file) => uploadReferenceCsv(label, file)
         "
-        :repository="data.submission"
-        :repository-redirect="(label) => showVersioning(label)"
         :option="data"
         :reference-synthesis="application.referenceSynthesis"
+        :repository="data.submission"
+        :repository-redirect="(label) => showVersioning(label)"
         :show-empty="showInfoEmpty[data.id]"
         :tags="tags"
         class="liste"
@@ -104,10 +110,12 @@ import { lineCountSynthesis } from "@/composable/application/synthesis";
 import LoadingAnimate from "@/components/common/LoadingAnimate.vue";
 import ShowErrors from "@/components/application/ShowErrors.vue";
 import { Tag } from "@/model/application/Tag";
+import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
 export default {
   name: "DatasManagementView",
   components: {
+    TitleAndDescription,
     ShowErrors,
     LoadingAnimate,
     CollapsibleTree,
@@ -140,6 +148,11 @@ export default {
     const { reactiveObject: application, doChangeObject: changeApplication } = useObject(
       new ApplicationResult()
     );
+    const { refBoolean: canCreateApplication, doChangeBoolean: changeCanCreateApplication } =
+      useBoolean(false);
+    const { refBoolean: canManagerApplication, doChangeBoolean: changeCanManagerApplication } =
+      useBoolean(false);
+    const { refBoolean: canManagerUser, doChangeBoolean: changeCanManagerUser } = useBoolean(false);
     const type = window.location.href.split("/");
     const hasTags = useBoolean(false).refBoolean;
     const changeTags = function(tagsToChange) {
@@ -182,6 +195,23 @@ export default {
       ]);
       changeTags(buildTags(application, datas.value));
       changeDatas(services.tagService.toBeShown(tags, datas.value));
+      try {
+        changeCanCreateApplication(
+          application?.currentApplicationUserRolesResult?.isApplicationCreator
+            ? application?.currentApplicationUserRolesResult?.isApplicationCreator
+            : application?.currentApplicationUserRolesResult?.isOpenAdomAdmin
+        );
+        changeCanManagerApplication(
+          application?.currentApplicationUserRolesResult?.applicationRoles.includes(
+            "applicationManager"
+          )
+        );
+        changeCanManagerUser(
+          application?.currentApplicationUserRolesResult?.applicationRoles.includes("userManager")
+        );
+      } catch (error) {
+        console.log("missing admin application rights", error);
+      }
     });
 
     function addAuthorizationToData(reference) {
@@ -378,6 +408,9 @@ export default {
     }
 
     return {
+      canCreateApplication,
+      canManagerApplication,
+      canManagerUser,
       openRefDetails,
       uploadReferenceCsv,
       changeTagSelected,
@@ -410,4 +443,10 @@ export default {
   margin-bottom: 10px;
   border: 1px solid white;
 }
+
+.btn_auth_tooltip {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
 </style>
-- 
GitLab


From 8f6e0a12d4fc214da24dd2e94c4c1222c178edd1 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Thu, 12 Dec 2024 14:47:18 +0100
Subject: [PATCH 26/61] Traitement de l'authorization reader on application

---
 src/services/AlertService.js | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/services/AlertService.js b/src/services/AlertService.js
index 1660e2ff1..57eeb448b 100644
--- a/src/services/AlertService.js
+++ b/src/services/AlertService.js
@@ -43,7 +43,7 @@ export class AlertService {
               duration: TOAST_ERROR_DURATION,
               position: TOAST_POSITION
             });
-            t="NO-RIGHTS"
+            t = "NO-RIGHTS";
           } else {
             ToastProgrammatic.open({
               message: i18n.t("exceptionMessage." + t),
@@ -52,6 +52,8 @@ export class AlertService {
               position: TOAST_POSITION
             });
           }
+        } else if ("NO_RIGHT_FOR_APPLICATION_MANAGEMENT" === t.message) {
+          t = "NO-RIGHTS";
         } else {
           const parseMessage = /(^[^[]*) \[(.*)\]$/.exec(t.message);
           const message = parseMessage?.[1] || t.message;
@@ -66,7 +68,7 @@ export class AlertService {
             position: TOAST_POSITION
           });
         }
-        if(state)state.value = t;
+        if (state) state.value = t;
       });
     } else {
       ToastProgrammatic.open({
@@ -78,7 +80,7 @@ export class AlertService {
     }
   }
 
-  toastServerError(error,state) {
+  toastServerError(error, state) {
     if (error && error.content != null) {
       error.content.then((value) => this.toastError(value.message, error, state));
     } else {
-- 
GitLab


From dffe97d379c1b3ef87da8dffbffb9e75a1cbc9d8 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Thu, 12 Dec 2024 16:15:09 +0100
Subject: [PATCH 27/61] =?UTF-8?q?Ajout=20d'une=20valuer=20par=20d=C3=A9ful?=
 =?UTF-8?q?t=20sur=20object.js?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/composable/components/object.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/composable/components/object.js b/src/composable/components/object.js
index 5b96af4c4..8fb917962 100644
--- a/src/composable/components/object.js
+++ b/src/composable/components/object.js
@@ -6,7 +6,7 @@ function useObject(obj = {}) {
   }
   let _keys = Object.keys(obj);
   const reactiveObject = reactive(obj);
-  const doChangeObject = function (newObject) {
+  const doChangeObject = function (newObject = {}) {
     _keys.forEach((key) => delete reactiveObject[key]);
     Object.assign(reactiveObject, newObject);
     _keys = Object.keys(newObject);
-- 
GitLab


From b037019e7b7de88ad60fd0a4baffdb3b77710b4c Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Thu, 12 Dec 2024 16:18:49 +0100
Subject: [PATCH 28/61] =?UTF-8?q?R=C3=A9duction=20du=20nombre=20d'appels?=
 =?UTF-8?q?=20=C3=A0=20la=20base=20=20en=20utilisant=20le=20cache?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/views/data/DataVersioningView.vue | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/views/data/DataVersioningView.vue b/src/views/data/DataVersioningView.vue
index 6b422e95a..22304b816 100644
--- a/src/views/data/DataVersioningView.vue
+++ b/src/views/data/DataVersioningView.vue
@@ -569,10 +569,13 @@ export default {
                 }
               }
               if (reference !== "") {
-                refForAuth[reference] = await services.dataService.getData(
+
+                let ref = await services.dataService.getData(
                   props.applicationName,
                   reference
                 );
+                loadedReferences[reference] = ref;
+                refForAuth[reference] = ref;
                 changeReferenceScopes(refForAuth[reference].referenceScopes);
               }
             }
-- 
GitLab


From deb1b393657ad04e467a15fb6a07d1e3f67ffc12 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Sat, 14 Dec 2024 09:51:17 +0100
Subject: [PATCH 29/61] =?UTF-8?q?Remont=C3=A9=20des=20droits=20sur=20les?=
 =?UTF-8?q?=20donn=C3=A9es?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../application/ApplicationCard.vue           |  9 ++-
 .../DetailApplicationModalCard.vue            | 43 +++++++------
 src/locales/en.json                           |  2 +-
 src/locales/fr.json                           |  2 +-
 src/model/ApplicationResult.js                | 38 +++++++++---
 src/model/application/Application.js          | 60 ++++++++++++++++++-
 src/views/application/ApplicationInfoView.vue | 12 ++++
 src/views/application/ApplicationsView.vue    | 11 +++-
 src/views/data/DataTableView.vue              |  2 +-
 src/views/data/DatasManagementView.vue        |  6 +-
 10 files changed, 147 insertions(+), 38 deletions(-)

diff --git a/src/components/application/ApplicationCard.vue b/src/components/application/ApplicationCard.vue
index 1550b13d6..1d0a6cc23 100644
--- a/src/components/application/ApplicationCard.vue
+++ b/src/components/application/ApplicationCard.vue
@@ -16,6 +16,10 @@ export default {
       type: Object,
       required: true,
     },
+    applicationRoles: {
+      type: Array,
+      default: ()=>[],
+    },
     index: {
       required: true,
       type: Number,
@@ -90,6 +94,7 @@ export default {
         :url="url"
         :redirection="redirection"
         :close-cb="redirection"
+        :application-roles= "applicationRoles"
       >
       </DetailApplicationModalCard>
     </b-modal>
@@ -122,7 +127,7 @@ export default {
           <div class="card-footer-item">
             <b-button
               v-if="application.references.length !== 0"
-              :disabled="!application.isApplicationUser()"
+              :disabled="!(application.canReadReference || application.canWriteReference)"
               icon-left="drafting-compass"
               @click="showCharte(displayReferencesManagement(application))"
             >
@@ -132,7 +137,7 @@ export default {
           <div class="card-footer-item">
             <b-button
               v-if="application.dataTypes.length !== 0"
-              :disabled="!application.isApplicationUser()"
+              :disabled="!(application.canReadDatatype || application.canWriteDatatype)"
               icon-left="poll"
               @click="showCharte(displayDataSetManagement(application))"
             >
diff --git a/src/components/application/DetailApplicationModalCard.vue b/src/components/application/DetailApplicationModalCard.vue
index 2efe4923b..a82772646 100644
--- a/src/components/application/DetailApplicationModalCard.vue
+++ b/src/components/application/DetailApplicationModalCard.vue
@@ -36,40 +36,45 @@ import { User } from "@/model/User";
 
 export default {
   name: "DetailApplicationModalCard",
+  applicationRoles: {
+    type: Object,
+    default: () => {
+    }
+  },
   components: { CharteValidator, ModalCard },
   emits: ["setValidatedCharte"],
   props: {
     open: {
       type: Boolean,
       required: true,
-      default: false,
+      default: false
     },
     application: {
       type: Object,
-      required: true,
+      required: true
     },
     closeCb: {
       type: Function,
       required: false,
       default: () => {
         this.charteHREF.value = null;
-      },
+      }
     },
     url: {
       required: true,
-      type: String,
+      type: String
     },
     redirection: {
       required: true,
-      type: Function,
-    },
+      type: Function
+    }
   },
   setup(props, ctx) {
     const charteHREF = useText().refText;
     const getUrl = computed({
       get() {
         return charteHREF.value ? charteHREF.value : props.url;
-      },
+      }
     });
     const validated = computed({
       get() {
@@ -82,18 +87,18 @@ export default {
       set(bool) {
         let storedAuthenticatedUser = User.STORED_AUTHENTICATED_USER();
         bool &&
-          services.loginService.modifAcount({
-            login: storedAuthenticatedUser?.login,
-            email: storedAuthenticatedUser?.email,
-            charte: props.application.id,
-          });
+        services.loginService.modifAcount({
+          login: storedAuthenticatedUser?.login,
+          email: storedAuthenticatedUser?.email,
+          charte: props.application.id
+        });
         bool &&
-          ctx.emit("setValidatedCharte", {
-            applicationId: props.application.id,
-            validated: bool,
-          });
+        ctx.emit("setValidatedCharte", {
+          applicationId: props.application.id,
+          validated: bool
+        });
         return bool && props.redirection();
-      },
+      }
     });
     const { tmpCharte } = useRedirections(props.application);
 
@@ -101,9 +106,9 @@ export default {
       charteHREF,
       getUrl,
       tmpCharte,
-      validated,
+      validated
     };
-  },
+  }
 };
 </script>
 
diff --git a/src/locales/en.json b/src/locales/en.json
index cfb44a738..1b7fff3d8 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -125,7 +125,7 @@
     "app_update_version": "Version of {name} proposed is: {version}",
     "change": "Update",
     "register-rows": "No records | Only one record | About {totalRows} records available",
-    "no-right-for-application": "you have no rights to view this data",
+    "no-right-for-application": "Your rights are insufficient to view this data",
     "charte_message": "I have read and accept the conditions of use of the data.",
     "charte_header": "To access the {localName} application, you must accept the conditions of use.",
     "chose-config": "Chose a configuration",
diff --git a/src/locales/fr.json b/src/locales/fr.json
index 7c1a02d54..281d90b6f 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -125,7 +125,7 @@
     "app_update_version": "Version de {name} proposée est : {version}",
     "change": "Mise à jour",
     "register-rows": "Aucun enregistrement  | Un seul enregistrement | Environ {totalRows} enregistrements disponibles",
-    "no-right-for-application": "vous n'avez pas de droits vous premettant de consulter ces données",
+    "no-right-for-application": "Vos droits sont insuffisants pour consulter ces données",
     "charte_message": "J'ai lu et j'accepte les conditions d'utilisation des données.",
     "charte_header": "Pour accéder à l'application {localName}, vous devez accepter les conditions d'utilisation.",
     "chose-config": "Choisir une configuration",
diff --git a/src/model/ApplicationResult.js b/src/model/ApplicationResult.js
index 2acd89713..5a3f9a88d 100644
--- a/src/model/ApplicationResult.js
+++ b/src/model/ApplicationResult.js
@@ -20,9 +20,9 @@ export class ApplicationResult {
         id: "",
         title: "",
         key: false,
-        linkedTo: "",
-      },
-    },
+        linkedTo: ""
+      }
+    }
   };
   dataTypes = {
     idRef: {
@@ -33,22 +33,36 @@ export class ApplicationResult {
         id: "",
         title: "",
         key: false,
-        linkedTo: "",
-      },
-    },
+        linkedTo: ""
+      }
+    }
   };
   data = {};
   additionalFile = {};
   configuration = {};
-  configFile;
   currentApplicationUserRolesResult = {};
   hasSignedCharte = false;
   hasSignedLastCharte = false;
-  authorizations = {};
-  dependantNodesByDataName = {};
   internationalization = {};
+  dependantNodesByDataName = {};
   orderedReferences = {};
   referenceSynthesis = {};
+  canReadReference ;
+  canWriteReference ;
+  canReadDatatype ;
+  canWriteDatatype ;
+  authorizations = {
+    idRef: {
+      ACTIVE_APPLICATION_USER: false,
+      ANY: false,
+      APPLICATION_USER: false,
+      DELETE: false,
+      DOWNLOAD: false,
+      PUBLICATION: false,
+      READ: false,
+      UPLOAD: false
+    }
+  };
 
   isApplicationUser() {
     return (
@@ -93,5 +107,11 @@ export class ApplicationResult {
     let charteTimeStamp = User.STORED_AUTHENTICATED_USER()?.chartes?.[application.id];
     this.hasSignedLastCharte = new Date().getTime() > charteTimeStamp;
     this.hasSignedCharte = charteTimeStamp;
+    this.authorizations = application.authorizations;
+
+    this.canReadReference = application.canReadReference;
+    this.canWriteReference = application.canWriteReference;
+    this.canReadDatatype = application.canReadDatatype;
+    this.canWriteDatatype = application.canWriteDatatype;
   }
 }
diff --git a/src/model/application/Application.js b/src/model/application/Application.js
index a76c75d08..296a07652 100644
--- a/src/model/application/Application.js
+++ b/src/model/application/Application.js
@@ -1,6 +1,6 @@
 export class Application {
   id;
-  localName = "toto";
+  localName;
   creationDate;
   updateDate;
   name;
@@ -15,15 +15,64 @@ export class Application {
   currentApplicationUserRolesResult = {};
   hasSignedCharte = false;
   hasSignedLastCharte = false;
+  dataSyntheses = {};
+  canWriteReference = false;
+  canReadReference = false;
+  canWriteDatatype = false;
+  canReadDatatype = false;
 
   static of(result) {
     const application = new Application(result.application);
     application.currentApplicationUserRolesResult = result.currentApplicationUserRolesResult;
     application.hasSignedCharte = result.hasSignedCharte;
     application.hasSignedLastCharte = result.hasSignedLastCharte;
+    application.dataSyntheses = (result.dataSyntheses || [])
+      .reduce((acc, synthesis) => {
+        acc[synthesis.referenceType] = synthesis.lineCount;
+        return acc;
+      }, {});
+
+    application.canWriteReference = application.hasReferenceToWrite();
+    application.canReadReference = application.hasReferenceToRead();
+    application.canWriteDatatype = application.hasDatatypeToWrite();
+    application.canReadDatatype = application.hasDatatypeToRead();
     return application;
   }
 
+  hasReferenceToRead() {
+    let applicationRoles = this.currentApplicationUserRolesResult.applicationRoles;
+    let datasyntheses = this.dataSyntheses;
+    return this.references
+      .map(reference => {
+        let reader = applicationRoles?.includes("reader") && datasyntheses[reference] > 0;
+        let writer = applicationRoles?.includes("writer");
+        return reader || writer;
+      })
+      .reduce((acc, reader) => (acc || reader), false);
+  }
+
+  hasReferenceToWrite() {
+    let applicationRoles = this.currentApplicationUserRolesResult.applicationRoles;
+    return applicationRoles?.includes("writer");
+  }
+
+  hasDatatypeToRead() {
+    let applicationRoles = this.currentApplicationUserRolesResult.applicationRoles;
+    let datasyntheses = this.dataSyntheses;
+    return this.dataTypes
+      .map(reference => {
+        let reader = applicationRoles?.includes("reader") && datasyntheses[reference] > 0;
+        let writer = applicationRoles?.includes("writer");
+        return reader || writer;
+      })
+      .reduce((acc, reader) => (acc || reader), false);
+  }
+
+  hasDatatypeToWrite() {
+    let applicationRoles = this.currentApplicationUserRolesResult.applicationRoles;
+    return applicationRoles?.includes("writer");
+  }
+
   isApplicationUser() {
     return (
       this.currentApplicationUserRolesResult?.applicationRoles?.includes("applicationManager") ||
@@ -56,6 +105,15 @@ export class Application {
     this.additionalFile = application.additionalFiles;
     this.configuration = application.configuration;
     this.configFile = application.configFile;
+    this.canReadReference = application.canReadReference;
+    this.canWriteReference = application.canWriteReference;
+    this.canReadDatatype = application.canReadDatatype;
+    this.canWriteDatatype = application.canWriteDatatype;
+    this.localName = application.localName;
+    this.currentApplicationUserRolesResult = application.currentApplicationUserRolesResult || {};
+    this.hasSignedCharte = application.hasSignedCharte || false;
+    this.hasSignedLastCharte = application.hasSignedLastCharte || false;
+    this.dataSyntheses = application.dataSyntheses || {};
 
     const configuration = application.configuration;
     for (const dataName in configuration?.dataDescription || {}) {
diff --git a/src/views/application/ApplicationInfoView.vue b/src/views/application/ApplicationInfoView.vue
index 7d4338221..70bb81bca 100644
--- a/src/views/application/ApplicationInfoView.vue
+++ b/src/views/application/ApplicationInfoView.vue
@@ -89,6 +89,14 @@ export default {
       authorizationsManagementForApplicationUsers,
       showRequestRights,
     } = useRedirections(application);
+    const canReadReferences = computed(()=>
+      Object.keys(application.references)
+        .filter(reference => application?.authorizations?.[reference]?.READ)
+    );
+    const canReadDataTypes = computed(()=>
+      Object.keys(application.dataTypes)
+        .filter(dataType => application?.authorizations?.[dataType]?.READ)
+    );
 
     onMounted(async () => {
       await init();
@@ -147,6 +155,8 @@ export default {
     }
 
     return {
+      canReadReferences,
+      canReadDataTypes,
       createApplication,
       updateApplication,
       downloadApplicationUploadBundle,
@@ -431,6 +441,7 @@ export default {
             class="buttonWarper"
           >
             <b-button
+              :disabled = !canReadReferences.length
               class="column"
               icon-left="drafting-compass"
               type="is-primary"
@@ -443,6 +454,7 @@ export default {
             class="buttonWarper"
           >
             <b-button
+              :disabled = !canReadDataTypes.length
               class="column"
               icon-left="poll"
               type="is-primary"
diff --git a/src/views/application/ApplicationsView.vue b/src/views/application/ApplicationsView.vue
index a9e9221ae..8d4580c3c 100644
--- a/src/views/application/ApplicationsView.vue
+++ b/src/views/application/ApplicationsView.vue
@@ -126,6 +126,7 @@
         <div class="columns">
           <ApplicationCard
             v-for="(application, index) in selectedApplications"
+            :application-roles="application?.currentApplicationUserRolesResult?.applicationRoles || []"
             :key="application.name"
             :application="application"
             :current="current"
@@ -165,9 +166,15 @@ import { computed, onMounted, inject } from "vue";
 import { useRedirections } from "@/composable/applications/useFunction";
 import ApplicationCard from "@/components/application/ApplicationCard.vue";
 import useNumber from "@/composable/components/number";
+import { Application } from "@/model/application/Application";
 
 export default {
   name: "ApplicationsView",
+  computed: {
+    Application() {
+      return Application;
+    }
+  },
   components: { ApplicationCard, LoadingAnimate, PageView },
   setup() {
     const { createApplication, updateApplication, displayAdditionalFilesManagement } =
@@ -280,9 +287,9 @@ export default {
       isCardModalActive,
       canCreateApplication,
       sortedApplicationsListForDate,
-      sortedApplicationsListForName,
+      sortedApplicationsListForName
     };
-  },
+  }
 };
 </script>
 
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index 518940406..8de5a8fc1 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -32,7 +32,7 @@
         @clear-search="clear($event)"
       />
       <LoadingAnimate v-if="isLoading" :size="'is-large'"></LoadingAnimate>
-      <div v-if="data && dataColumnsToBeShown && !isLoading && totalRows<101">
+      <div v-if="data && dataColumnsToBeShown && !isLoading && totalRows>0">
         <b-table
           id="filtreTable"
           :current-page="currentPage"
diff --git a/src/views/data/DatasManagementView.vue b/src/views/data/DatasManagementView.vue
index 7a701667c..5a14fdfad 100644
--- a/src/views/data/DatasManagementView.vue
+++ b/src/views/data/DatasManagementView.vue
@@ -345,10 +345,12 @@ export default {
           refFile
         );
         let referenceSynthesis = result.referenceSynthesis;
-        changeApplication({
+        let updatedApplication = {
           ...application,
           referenceSynthesis
-        });
+        };
+        updatedApplication =new ApplicationResult(updatedApplication)
+        changeApplication(updatedApplication);
         services.alertService.toastSuccess(i18n.t("alert.reference-updated"));
         showInfoEmpty.value[referenceType] = { value: true };
       } catch (errors) {
-- 
GitLab


From ada3e41ce08f54b7dcb1533c838b3d614126ebb7 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Mon, 16 Dec 2024 01:56:06 +0100
Subject: [PATCH 30/61] modification de la demande de droits

---
 .../RequestAuthorizationManagementView.vue    | 50 +++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/src/views/authorizations/RequestAuthorizationManagementView.vue b/src/views/authorizations/RequestAuthorizationManagementView.vue
index 74f7e5772..46a0d4851 100644
--- a/src/views/authorizations/RequestAuthorizationManagementView.vue
+++ b/src/views/authorizations/RequestAuthorizationManagementView.vue
@@ -54,6 +54,46 @@
             </p>
           </template>
         </b-table-column>
+        <b-table-column :searchable="true" field="comment" label="Commentaire" sortable>
+          <template #searchable="props">
+            <b-input
+              v-model="props.filters[props.column.field]"
+              :placeholder="$t('dataTypeAuthorizations.search')"
+              icon="search"
+            />
+          </template>
+          <template v-slot="props">
+            <a @click="manageRequest(props.row.id)" class="is-flex is-align-content-center">
+              <b-icon icon="pen-square" size="is-small" ></b-icon>
+              <span class="with-padding">{{ props.row.comment }}</span>
+            </a>
+          </template>
+        </b-table-column>
+        <b-table-column :searchable="true" field="createDate" label="Date de création" sortable>
+          <template #searchable="props">
+            <b-input
+              v-model="props.filters[props.column.field]"
+              :placeholder="$t('dataTypeAuthorizations.search')"
+              icon="search"
+            />
+          </template>
+          <template v-slot="props">
+            {{ formatDate(props.row.createDate) }}
+          </template>
+        </b-table-column>
+        <b-table-column :searchable="true" field="updateDate" label="Date de création" sortable>
+          <template #searchable="props">
+            <b-input
+              v-model="props.filters[props.column.field]"
+              :placeholder="$t('dataTypeAuthorizations.search')"
+              icon="search"
+            />
+          </template>
+          <template v-slot="props">
+            {{ formatDate(props.row.updateDate) }}
+          </template>
+        </b-table-column>
+<!--
         <b-table-column :searchable="true" field="number request" label="N° de la demande" sortable>
           <template #searchable="props">
             <b-input
@@ -68,6 +108,7 @@
             </a>
           </template>
         </b-table-column>
+-->
         <b-table-column :searchable="true" field="setted" label="Statut" sortable>
           <template #searchable>
             <b-select
@@ -102,6 +143,7 @@ import { onMounted, ref, watch } from "vue";
 import useArray from "@/composable/components/array";
 import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
+
 export default {
   name: "RequestAuthorizationManagementView",
   components: {
@@ -250,8 +292,13 @@ export default {
     function manageRequest(id) {
       app.$router.push(`/applications/${props.applicationName}/authorizationsRequest/${id}`);
     }
+    function formatDate(date) {
+      if (!date) return '';
+      return moment(date).format('DD/MM/YYYY');
+    }
 
     return {
+      formatDate,
       manageRequest,
       isVisibleRequest,
       getUserEmail,
@@ -292,4 +339,7 @@ td {
 .listAuthorization:nth-child(odd) {
   background-color: #f5f5f5;
 }
+.with-padding{
+  padding-left: 1em;
+}
 </style>
-- 
GitLab


From 90a12c86117d42803644f81a8fca5e13cc115dc2 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Mon, 16 Dec 2024 01:56:59 +0100
Subject: [PATCH 31/61] Modification du visuel des bouton (disabled)

---
 src/components/common/CollapsibleTree.vue     | 24 +++++++++----------
 src/views/application/ApplicationInfoView.vue |  4 ++--
 .../AuthorizationsRightsRequestInfoView.vue   | 18 +++++++-------
 .../DataTypeAuthorizationsView.vue            |  3 ++-
 src/views/data/DataTableView.vue              |  7 +++---
 src/views/data/DatasManagementView.vue        | 11 ++++++---
 6 files changed, 36 insertions(+), 31 deletions(-)

diff --git a/src/components/common/CollapsibleTree.vue b/src/components/common/CollapsibleTree.vue
index 3335cef8f..492a4dc3f 100644
--- a/src/components/common/CollapsibleTree.vue
+++ b/src/components/common/CollapsibleTree.vue
@@ -79,7 +79,7 @@
         >
           <slot
             name="synthesisDetail"
-            v-bind:lineCount="updateCountLineFile"
+            v-bind:lineCount="lineCount"
             v-bind:onClickLabelSynthesisDetailCb="onClickLabelSynthesisDetailCb"
             v-bind:option="option"
             v-bind:refFile="refFile"
@@ -115,14 +115,14 @@
                 />
               </span>
             </div>
-            <div v-if="refFile">
-              <span class="file-name">
-                {{ refFile.name }}
+            <div v-else-if="lineCount">
+              <span :class="lineCount ? 'file-name' : 'file-name has-text-danger'">
+                {{ $tc("validation.count-line", lineCount, {count : lineCount}) }}
               </span>
             </div>
-            <div v-else>
-              <span :class="updateCountLineFile ? 'file-name' : 'file-name has-text-danger'">
-                {{ $tc("validation.count-line", updateCountLineFile) }}
+            <div v-else-if="refFile">
+              <span class="file-name">
+                {{ refFile.name }}
               </span>
             </div>
           </slot>
@@ -196,7 +196,8 @@
         v-for="child in option.children"
         :key="child.id"
         :application-title="applicationTitle"
-        :buttons="buttons"
+        :buttons="buildButton?buildButton(child):buttons"
+        :build-button="buildButton"
         :class="displayChildren ? '' : 'hide'"
         :level="level + 1"
         :line-count="lineCountSynthesis(referenceSynthesis, child)"
@@ -217,7 +218,7 @@ import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
 import AvailiblityChart from "../charts/AvailiblityChart.vue";
 import LoadingAnimate from "@/components/common/LoadingAnimate.vue";
 import { lineCountSynthesis } from "@/composable/application/synthesis";
-import { computed, watch } from "vue";
+import {  watch } from "vue";
 import useBoolean from "@/composable/components/boolean";
 import TagsInfos from "@/components/common/TagsInfos.vue";
 import { length } from "vee-validate/dist/rules";
@@ -231,6 +232,7 @@ export default {
   },
   components: { TagsInfos, LoadingAnimate, FontAwesomeIcon, AvailiblityChart },
   props: {
+    buildButton:Function,
     applicationName: String,
     canUpload: {
       type: Boolean,
@@ -272,10 +274,9 @@ export default {
       type: String,
     },
   },
-  setup(props) {
+  setup() {
     let innerOptionChecked = null;
     let refFile = null;
-    let updateCountLineFile = computed(() => props.lineCount);
     const { refBoolean: displayChildren, doChangeBoolean: changeDisplayChildren } = useBoolean();
     watch(
       () => innerOptionChecked,
@@ -299,7 +300,6 @@ export default {
       displayChildren,
       refFile,
       innerOptionChecked,
-      updateCountLineFile,
     };
   },
 };
diff --git a/src/views/application/ApplicationInfoView.vue b/src/views/application/ApplicationInfoView.vue
index 70bb81bca..e43d73eef 100644
--- a/src/views/application/ApplicationInfoView.vue
+++ b/src/views/application/ApplicationInfoView.vue
@@ -142,12 +142,12 @@ export default {
             : application?.currentApplicationUserRolesResult?.isOpenAdomAdmin
         );
         changeCanManagerApplication(
-          application?.currentApplicationUserRolesResult?.applicationRoles.includes(
+          application?.currentApplicationUserRolesResult?.applicationRoles?.includes(
             "applicationManager"
           )
         );
         changeCanManagerUser(
-          application?.currentApplicationUserRolesResult?.applicationRoles.includes("userManager")
+          application?.currentApplicationUserRolesResult?.applicationRoles?.includes("userManager")
         );
       } catch (error) {
         console.log("missing admin application rights", error);
diff --git a/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue b/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
index d20124ccf..bda8904e1 100644
--- a/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
+++ b/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
@@ -380,7 +380,7 @@ export default {
           currentUser.value = [
             request.users.find(
               (user) =>
-                user.id ===
+                user?.id ===
                 ((request &&
                   request.rightsRequests &&
                   request.rightsRequests[0] &&
@@ -533,16 +533,16 @@ export default {
         }
       }
       let usersId;
-      let authenticatedUserId = User.STORED_AUTHENTICATED_USER().id;
+      let authenticatedUserId = User.STORED_AUTHENTICATED_USER()?.id;
       if (
-        (currentUser.value.id && currentUser.value.id !== authenticatedUserId) ||
-        (currentUser.value[0] && currentUser.value[0].id !== authenticatedUserId)
+        (currentUser.value?.id && currentUser.value?.id !== authenticatedUserId) ||
+        (currentUser.value[0] && currentUser.value[0]?.id !== authenticatedUserId)
       ) {
-        usersId = currentUser.value.id
-          ? [currentUser.value.id, authenticatedUserId]
-          : [currentUser.value[0].id, authenticatedUserId];
+        usersId = currentUser.value?.id
+          ? [currentUser.value?.id, authenticatedUserId]
+          : [currentUser.value[0]?.id, authenticatedUserId];
       } else {
-        usersId = [currentUser.value.id ? currentUser.value.id : currentUser.value[0].id];
+        usersId = [currentUser.value?.id ? currentUser.value?.id : currentUser.value[0]?.id];
       }
       return {
         uuid: props.authorizationId === "new" ? null : props.authorizationId,
@@ -635,7 +635,7 @@ export default {
             currentUser.value.label ? currentUser.value.label : currentUser.value[0].label
           }`,
           description: description.value,
-          usersId: [currentUser.value[0].id, User.STORED_AUTHENTICATED_USER()?.id],
+          usersId: [currentUser.value[0]?.id, User.STORED_AUTHENTICATED_USER()?.id],
           authorizationForAll,
           authorizationsWithRestriction,
         };
diff --git a/src/views/authorizations/DataTypeAuthorizationsView.vue b/src/views/authorizations/DataTypeAuthorizationsView.vue
index de80ee779..306678c55 100644
--- a/src/views/authorizations/DataTypeAuthorizationsView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationsView.vue
@@ -341,7 +341,7 @@
                   <a class="card-header-icon" style="padding-left: 0; padding-right: 0">
                     <b-button
                       class="show-check-details"
-                      disabled
+                      :disabled="!isApplicationManager"
                       icon-left="times-circle"
                       size="is-small"
                       style="
@@ -355,6 +355,7 @@
                     >
                     </b-button>
                     <b-button
+                      :disabled = "!isUserManager"
                       class="show-check-details"
                       icon-left="pen-square"
                       onmouseout="style.color='';"
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index 561b11629..0df5a9298 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -32,9 +32,8 @@
         @clear-search="clear($event)"
       />
       <LoadingAnimate v-if="isLoading" :size="'is-large'"></LoadingAnimate>
-      <div v-if="data && dataColumnsToBeShown && !isLoading && totalRows<101">
-        <b-switch v-if="canHorizontalize" v-model="horizontalDisplay" @input="changeDisplay"
-        >
+      <div v-if="data && dataColumnsToBeShown && !isLoading && totalRows>0">
+        <b-switch v-if="canHorizontalize" v-model="horizontalDisplay" @input="changeDisplay" >
         {{horizontalDisplay?$t('dataTypesManagement.horizontalized'):$t('dataTypesManagement.verticalized')}}
         </b-switch>
         <b-table
@@ -380,7 +379,7 @@ export default {
           },
           loadExample.value
         );
-        canHorizontalize.value = data.patternDefinitionCount == 1
+        canHorizontalize.value = data.patternDefinitionCount>= 1
         changeHorizontalDisplay(data.patternDefinitionCount > 1);
         if (data) {
           //let dataValues = data.rows;
diff --git a/src/views/data/DatasManagementView.vue b/src/views/data/DatasManagementView.vue
index 5a14fdfad..90bc516bc 100644
--- a/src/views/data/DatasManagementView.vue
+++ b/src/views/data/DatasManagementView.vue
@@ -58,6 +58,7 @@
         :application-name="applicationName"
         :application-title="$t('titles.references-page', { applicationName: applicationName })"
         :buttons="buttons(data)"
+        :build-button="buttons"
         :is-loading="isLineCountLoading"
         :is-uploading="isUploading"
         :level="0"
@@ -103,7 +104,7 @@ import useArray from "@/composable/components/array";
 import useBoolean from "@/composable/components/boolean";
 import useNumber from "@/composable/components/number";
 import useObject from "@/composable/components/object";
-import {  onMounted } from "vue";
+import { onMounted, nextTick } from "vue";
 import services from "@/composable/services";
 import { buildTags } from "@/composable/application/tags";
 import { lineCountSynthesis } from "@/composable/application/synthesis";
@@ -290,7 +291,10 @@ export default {
           (label) => consultReference(label),
           "is-dark",
           null,
-          !reference.canRead ||   !(application.referenceSynthesis.find(synthesis => synthesis.referenceType === reference.id)?.lineCount || 0 )> 0
+          !(
+            reference.canRead &&
+            (application.referenceSynthesis.find(synthesis => synthesis.referenceType === reference.id)?.lineCount || 0) > 0
+          )
         )/*,
         new Button(
           i18n.t("referencesManagement.download"),
@@ -349,10 +353,11 @@ export default {
           ...application,
           referenceSynthesis
         };
-        updatedApplication =new ApplicationResult(updatedApplication)
+        updatedApplication = new ApplicationResult(updatedApplication);
         changeApplication(updatedApplication);
         services.alertService.toastSuccess(i18n.t("alert.reference-updated"));
         showInfoEmpty.value[referenceType] = { value: true };
+        await nextTick();
       } catch (errors) {
         await checkMessageErrors(errors);
       }
-- 
GitLab


From c24bc54b1b7abbe4d708ca81d41622999c7e1d49 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Mon, 16 Dec 2024 01:56:06 +0100
Subject: [PATCH 32/61] modification de la demande de droits

---
 .../RequestAuthorizationManagementView.vue    | 50 +++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/src/views/authorizations/RequestAuthorizationManagementView.vue b/src/views/authorizations/RequestAuthorizationManagementView.vue
index 74f7e5772..46a0d4851 100644
--- a/src/views/authorizations/RequestAuthorizationManagementView.vue
+++ b/src/views/authorizations/RequestAuthorizationManagementView.vue
@@ -54,6 +54,46 @@
             </p>
           </template>
         </b-table-column>
+        <b-table-column :searchable="true" field="comment" label="Commentaire" sortable>
+          <template #searchable="props">
+            <b-input
+              v-model="props.filters[props.column.field]"
+              :placeholder="$t('dataTypeAuthorizations.search')"
+              icon="search"
+            />
+          </template>
+          <template v-slot="props">
+            <a @click="manageRequest(props.row.id)" class="is-flex is-align-content-center">
+              <b-icon icon="pen-square" size="is-small" ></b-icon>
+              <span class="with-padding">{{ props.row.comment }}</span>
+            </a>
+          </template>
+        </b-table-column>
+        <b-table-column :searchable="true" field="createDate" label="Date de création" sortable>
+          <template #searchable="props">
+            <b-input
+              v-model="props.filters[props.column.field]"
+              :placeholder="$t('dataTypeAuthorizations.search')"
+              icon="search"
+            />
+          </template>
+          <template v-slot="props">
+            {{ formatDate(props.row.createDate) }}
+          </template>
+        </b-table-column>
+        <b-table-column :searchable="true" field="updateDate" label="Date de création" sortable>
+          <template #searchable="props">
+            <b-input
+              v-model="props.filters[props.column.field]"
+              :placeholder="$t('dataTypeAuthorizations.search')"
+              icon="search"
+            />
+          </template>
+          <template v-slot="props">
+            {{ formatDate(props.row.updateDate) }}
+          </template>
+        </b-table-column>
+<!--
         <b-table-column :searchable="true" field="number request" label="N° de la demande" sortable>
           <template #searchable="props">
             <b-input
@@ -68,6 +108,7 @@
             </a>
           </template>
         </b-table-column>
+-->
         <b-table-column :searchable="true" field="setted" label="Statut" sortable>
           <template #searchable>
             <b-select
@@ -102,6 +143,7 @@ import { onMounted, ref, watch } from "vue";
 import useArray from "@/composable/components/array";
 import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
+
 export default {
   name: "RequestAuthorizationManagementView",
   components: {
@@ -250,8 +292,13 @@ export default {
     function manageRequest(id) {
       app.$router.push(`/applications/${props.applicationName}/authorizationsRequest/${id}`);
     }
+    function formatDate(date) {
+      if (!date) return '';
+      return moment(date).format('DD/MM/YYYY');
+    }
 
     return {
+      formatDate,
       manageRequest,
       isVisibleRequest,
       getUserEmail,
@@ -292,4 +339,7 @@ td {
 .listAuthorization:nth-child(odd) {
   background-color: #f5f5f5;
 }
+.with-padding{
+  padding-left: 1em;
+}
 </style>
-- 
GitLab


From 687beb232d3d3829cfd8a119ea518c736f21cb7e Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Mon, 16 Dec 2024 01:56:59 +0100
Subject: [PATCH 33/61] Modification du visuel des bouton (disabled)

---
 src/components/common/CollapsibleTree.vue     | 24 +++++++++----------
 src/views/application/ApplicationInfoView.vue |  4 ++--
 .../AuthorizationsRightsRequestInfoView.vue   | 18 +++++++-------
 .../DataTypeAuthorizationsView.vue            |  3 ++-
 src/views/data/DataTableView.vue              |  3 +--
 src/views/data/DatasManagementView.vue        | 11 ++++++---
 6 files changed, 34 insertions(+), 29 deletions(-)

diff --git a/src/components/common/CollapsibleTree.vue b/src/components/common/CollapsibleTree.vue
index 3335cef8f..492a4dc3f 100644
--- a/src/components/common/CollapsibleTree.vue
+++ b/src/components/common/CollapsibleTree.vue
@@ -79,7 +79,7 @@
         >
           <slot
             name="synthesisDetail"
-            v-bind:lineCount="updateCountLineFile"
+            v-bind:lineCount="lineCount"
             v-bind:onClickLabelSynthesisDetailCb="onClickLabelSynthesisDetailCb"
             v-bind:option="option"
             v-bind:refFile="refFile"
@@ -115,14 +115,14 @@
                 />
               </span>
             </div>
-            <div v-if="refFile">
-              <span class="file-name">
-                {{ refFile.name }}
+            <div v-else-if="lineCount">
+              <span :class="lineCount ? 'file-name' : 'file-name has-text-danger'">
+                {{ $tc("validation.count-line", lineCount, {count : lineCount}) }}
               </span>
             </div>
-            <div v-else>
-              <span :class="updateCountLineFile ? 'file-name' : 'file-name has-text-danger'">
-                {{ $tc("validation.count-line", updateCountLineFile) }}
+            <div v-else-if="refFile">
+              <span class="file-name">
+                {{ refFile.name }}
               </span>
             </div>
           </slot>
@@ -196,7 +196,8 @@
         v-for="child in option.children"
         :key="child.id"
         :application-title="applicationTitle"
-        :buttons="buttons"
+        :buttons="buildButton?buildButton(child):buttons"
+        :build-button="buildButton"
         :class="displayChildren ? '' : 'hide'"
         :level="level + 1"
         :line-count="lineCountSynthesis(referenceSynthesis, child)"
@@ -217,7 +218,7 @@ import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
 import AvailiblityChart from "../charts/AvailiblityChart.vue";
 import LoadingAnimate from "@/components/common/LoadingAnimate.vue";
 import { lineCountSynthesis } from "@/composable/application/synthesis";
-import { computed, watch } from "vue";
+import {  watch } from "vue";
 import useBoolean from "@/composable/components/boolean";
 import TagsInfos from "@/components/common/TagsInfos.vue";
 import { length } from "vee-validate/dist/rules";
@@ -231,6 +232,7 @@ export default {
   },
   components: { TagsInfos, LoadingAnimate, FontAwesomeIcon, AvailiblityChart },
   props: {
+    buildButton:Function,
     applicationName: String,
     canUpload: {
       type: Boolean,
@@ -272,10 +274,9 @@ export default {
       type: String,
     },
   },
-  setup(props) {
+  setup() {
     let innerOptionChecked = null;
     let refFile = null;
-    let updateCountLineFile = computed(() => props.lineCount);
     const { refBoolean: displayChildren, doChangeBoolean: changeDisplayChildren } = useBoolean();
     watch(
       () => innerOptionChecked,
@@ -299,7 +300,6 @@ export default {
       displayChildren,
       refFile,
       innerOptionChecked,
-      updateCountLineFile,
     };
   },
 };
diff --git a/src/views/application/ApplicationInfoView.vue b/src/views/application/ApplicationInfoView.vue
index 70bb81bca..e43d73eef 100644
--- a/src/views/application/ApplicationInfoView.vue
+++ b/src/views/application/ApplicationInfoView.vue
@@ -142,12 +142,12 @@ export default {
             : application?.currentApplicationUserRolesResult?.isOpenAdomAdmin
         );
         changeCanManagerApplication(
-          application?.currentApplicationUserRolesResult?.applicationRoles.includes(
+          application?.currentApplicationUserRolesResult?.applicationRoles?.includes(
             "applicationManager"
           )
         );
         changeCanManagerUser(
-          application?.currentApplicationUserRolesResult?.applicationRoles.includes("userManager")
+          application?.currentApplicationUserRolesResult?.applicationRoles?.includes("userManager")
         );
       } catch (error) {
         console.log("missing admin application rights", error);
diff --git a/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue b/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
index d20124ccf..bda8904e1 100644
--- a/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
+++ b/src/views/authorizations/AuthorizationsRightsRequestInfoView.vue
@@ -380,7 +380,7 @@ export default {
           currentUser.value = [
             request.users.find(
               (user) =>
-                user.id ===
+                user?.id ===
                 ((request &&
                   request.rightsRequests &&
                   request.rightsRequests[0] &&
@@ -533,16 +533,16 @@ export default {
         }
       }
       let usersId;
-      let authenticatedUserId = User.STORED_AUTHENTICATED_USER().id;
+      let authenticatedUserId = User.STORED_AUTHENTICATED_USER()?.id;
       if (
-        (currentUser.value.id && currentUser.value.id !== authenticatedUserId) ||
-        (currentUser.value[0] && currentUser.value[0].id !== authenticatedUserId)
+        (currentUser.value?.id && currentUser.value?.id !== authenticatedUserId) ||
+        (currentUser.value[0] && currentUser.value[0]?.id !== authenticatedUserId)
       ) {
-        usersId = currentUser.value.id
-          ? [currentUser.value.id, authenticatedUserId]
-          : [currentUser.value[0].id, authenticatedUserId];
+        usersId = currentUser.value?.id
+          ? [currentUser.value?.id, authenticatedUserId]
+          : [currentUser.value[0]?.id, authenticatedUserId];
       } else {
-        usersId = [currentUser.value.id ? currentUser.value.id : currentUser.value[0].id];
+        usersId = [currentUser.value?.id ? currentUser.value?.id : currentUser.value[0]?.id];
       }
       return {
         uuid: props.authorizationId === "new" ? null : props.authorizationId,
@@ -635,7 +635,7 @@ export default {
             currentUser.value.label ? currentUser.value.label : currentUser.value[0].label
           }`,
           description: description.value,
-          usersId: [currentUser.value[0].id, User.STORED_AUTHENTICATED_USER()?.id],
+          usersId: [currentUser.value[0]?.id, User.STORED_AUTHENTICATED_USER()?.id],
           authorizationForAll,
           authorizationsWithRestriction,
         };
diff --git a/src/views/authorizations/DataTypeAuthorizationsView.vue b/src/views/authorizations/DataTypeAuthorizationsView.vue
index de80ee779..306678c55 100644
--- a/src/views/authorizations/DataTypeAuthorizationsView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationsView.vue
@@ -341,7 +341,7 @@
                   <a class="card-header-icon" style="padding-left: 0; padding-right: 0">
                     <b-button
                       class="show-check-details"
-                      disabled
+                      :disabled="!isApplicationManager"
                       icon-left="times-circle"
                       size="is-small"
                       style="
@@ -355,6 +355,7 @@
                     >
                     </b-button>
                     <b-button
+                      :disabled = "!isUserManager"
                       class="show-check-details"
                       icon-left="pen-square"
                       onmouseout="style.color='';"
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index 8de5a8fc1..084b4606c 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -63,10 +63,8 @@
                   v-if="'PatternComponent' === column.type"
                   :info="column.type === 'PatternComponent'"
                   :application="application"
-                  :value="column.getColumnQualifiersMap(application, dataId, rows[0])"
                   :column-id="column.id"
                   :column-title="column.id"
-                  :info-values="column.getColumnQualifiersMap(application, dataId, rows[0])"
                   :loaded-references-by-key="{}"
                   :pattern-checker-date-ref="patternCheckerDateRef"
                   :data-id="dataId"
@@ -368,6 +366,7 @@ export default {
           },
           loadExample.value
         );
+
         if (data) {
           //let dataValues = data.rows;
           //totalRows.value = data.totalRows;
diff --git a/src/views/data/DatasManagementView.vue b/src/views/data/DatasManagementView.vue
index 5a14fdfad..90bc516bc 100644
--- a/src/views/data/DatasManagementView.vue
+++ b/src/views/data/DatasManagementView.vue
@@ -58,6 +58,7 @@
         :application-name="applicationName"
         :application-title="$t('titles.references-page', { applicationName: applicationName })"
         :buttons="buttons(data)"
+        :build-button="buttons"
         :is-loading="isLineCountLoading"
         :is-uploading="isUploading"
         :level="0"
@@ -103,7 +104,7 @@ import useArray from "@/composable/components/array";
 import useBoolean from "@/composable/components/boolean";
 import useNumber from "@/composable/components/number";
 import useObject from "@/composable/components/object";
-import {  onMounted } from "vue";
+import { onMounted, nextTick } from "vue";
 import services from "@/composable/services";
 import { buildTags } from "@/composable/application/tags";
 import { lineCountSynthesis } from "@/composable/application/synthesis";
@@ -290,7 +291,10 @@ export default {
           (label) => consultReference(label),
           "is-dark",
           null,
-          !reference.canRead ||   !(application.referenceSynthesis.find(synthesis => synthesis.referenceType === reference.id)?.lineCount || 0 )> 0
+          !(
+            reference.canRead &&
+            (application.referenceSynthesis.find(synthesis => synthesis.referenceType === reference.id)?.lineCount || 0) > 0
+          )
         )/*,
         new Button(
           i18n.t("referencesManagement.download"),
@@ -349,10 +353,11 @@ export default {
           ...application,
           referenceSynthesis
         };
-        updatedApplication =new ApplicationResult(updatedApplication)
+        updatedApplication = new ApplicationResult(updatedApplication);
         changeApplication(updatedApplication);
         services.alertService.toastSuccess(i18n.t("alert.reference-updated"));
         showInfoEmpty.value[referenceType] = { value: true };
+        await nextTick();
       } catch (errors) {
         await checkMessageErrors(errors);
       }
-- 
GitLab


From b4d486cf772edcbf1f31295caa453cf22c9fe0f1 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Mon, 16 Dec 2024 17:22:20 +0100
Subject: [PATCH 34/61] Correction de patternLink

---
 src/components/datas/DatasLink.vue        |  4 +-
 src/components/datas/DatasPatternLink.vue |  3 +-
 src/model/application/Component.js        | 12 +++++-
 src/views/data/DataTableView.vue          | 50 +++++++++++++----------
 4 files changed, 43 insertions(+), 26 deletions(-)

diff --git a/src/components/datas/DatasLink.vue b/src/components/datas/DatasLink.vue
index eb2e7cfa4..2b6b34628 100644
--- a/src/components/datas/DatasLink.vue
+++ b/src/components/datas/DatasLink.vue
@@ -144,11 +144,11 @@ export default {
     watch(() => props.value, getOrLoadReference);
 
     async function getOrLoadReference() {
-      if (props.referenceType && props.value) {
+      if (props.referenceType && (props.value || props.columnId)) {
         const result = await getOrLoadDataByNaturalKey(
           props.application,
           props.referenceType,
-          props.value
+          props.columnId || props.value
         );
         let referenceTypeForReferencingColumns = result.referenceTypeForReferencingColumns;
         if (result.rows.length !== 0) {
diff --git a/src/components/datas/DatasPatternLink.vue b/src/components/datas/DatasPatternLink.vue
index a810aa223..141dbacee 100644
--- a/src/components/datas/DatasPatternLink.vue
+++ b/src/components/datas/DatasPatternLink.vue
@@ -7,7 +7,7 @@
         style="height: 15px; width: fit-content; border: none; display: inline"
         @click="showModal()"
       >
-        <span style="font-size: large; font-weight: bold; line-height: 0%">withqualifier{{ columnName }}</span>
+        <span style="font-size: large; font-weight: bold; line-height: 0%">{{ columnName }}</span>
         <b-icon icon="eye" size="is-small" style="height: inherit" type="is-dark"></b-icon>
         <LoadingAnimate v-if="isLoading" :size="'is-small'"></LoadingAnimate>
       </b-button>
@@ -115,6 +115,7 @@ export default {
       return showModal.length !== 0;
     }
     const patternLinkHeader = computed(()=>{
+      console.log('dataid', props.dataId, 'columntitle', props.columnTitle, 'application', props.application);
       //application.configuration.i18n.data.t_swc_swc.components.swc_variable.exportHeader.title.fr
       return services.internationalisationService.localeReferenceColumnsNames(props.dataId, props.columnTitle, props.application)
     })
diff --git a/src/model/application/Component.js b/src/model/application/Component.js
index 6ee43b0de..639864028 100644
--- a/src/model/application/Component.js
+++ b/src/model/application/Component.js
@@ -259,11 +259,21 @@ class PatternComponent extends Component {
     return this.originalName;
   }
 
+  getDisplayValue = function(row) {
+    let columnValue = this.getColumnValue(row);
+    let displaysForRow = row.displaysForRow?.[this.refLinkedTo]?.[row.values[this.id]];
+    if (displaysForRow && typeof columnValue !== "number") {
+      return displaysForRow;
+    } else {
+      return "" + columnValue;
+    }
+  };
+
   getColumnValue(row) {
     if (this.horizontalDisplay)
       if (this.horizontalDisplay) {
         let pattern = this.id.match("(.*?)::(.*)");
-        return row.values[pattern[1]]?.find((column) => column.__ORIGINAL_COLUMN_NAME__ == pattern[2]);
+        return row.values[pattern[1]]?.find((column) => column.__ORIGINAL_COLUMN_NAME__ == pattern[2]).__VALUE__;
       }
     return row.values[this.componentKey]?.[0]?.__VALUE__;
   }
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index a34b94ef9..bfd3f2a65 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -33,8 +33,8 @@
       />
       <LoadingAnimate v-if="isLoading" :size="'is-large'"></LoadingAnimate>
       <div v-if="data && dataColumnsToBeShown && !isLoading && totalRows>0">
-        <b-switch v-if="canHorizontalize" v-model="horizontalDisplay" @input="changeDisplay" >
-        {{horizontalDisplay?$t('dataTypesManagement.horizontalized'):$t('dataTypesManagement.verticalized')}}
+        <b-switch v-if="canHorizontalize" v-model="horizontalDisplay" @input="changeDisplay">
+          {{ horizontalDisplay ? $t("dataTypesManagement.horizontalized") : $t("dataTypesManagement.verticalized") }}
         </b-switch>
         <b-table
           id="filtreTable"
@@ -64,20 +64,21 @@
                 </TagsInfos>
                 <DatasPatternLink
                   v-if="'PatternComponent' === column.type"
+                  :with-qualifier="horizontalDisplay"
                   :info="column.type === 'PatternComponent'"
                   :application="application"
-                :value="column.getColumnQualifiersMap(application, column.horizontalDisplay?dataId:column.componentKey, rows[0])"
+                  :value="column.getColumnQualifiersMap(application, column.horizontalDisplay?dataId:column.componentKey, rows[0])"
                   :column-id="column.id"
                   :column-title="column.id"
-                :info-values="column.getColumnQualifiersMap(application, column.horizontalDisplay?dataId:column.componentKey, rows[0])"
+                  :info-values="column.getColumnQualifiersMap(application, column.horizontalDisplay?dataId:column.componentKey, rows[0])"
                   :loaded-references-by-key="{}"
                   :pattern-checker-date-ref="patternCheckerDateRef"
                   :data-id="dataId"
                 ></DatasPatternLink>
-              <div
-                v-else-if="'patternQualifierComponent' === column.type">
-                {{ column.getHeader(application, dataId) }}
-              </div>
+                <div
+                  v-else-if="'patternQualifierComponent' === column.type">
+                  {{ column.getHeader(application, dataId) }}
+                </div>
                 <div v-else>
                   {{ column.getHeader(application, dataId) }}
                 </div>
@@ -319,10 +320,15 @@ export default {
         let refLinkedTo = column.refLinkedTo;
         let refLinkedToColumn = column.refLinkedToColumn;
         let refsLinkedToElementElementElement =
-          row?.refsLinkedTo?.[refLinkedTo]?.[refLinkedToColumn]?.[0];
-        /*if (!refsLinkedToElementElementElement) {
-          console.log("refsLinkedToElementElementElement", column);
-        }*/
+          row?.refsLinkedTo?.[refLinkedTo];
+        if (refsLinkedToElementElementElement?.[refLinkedToColumn]) {
+          refsLinkedToElementElementElement = refsLinkedToElementElementElement?.[refLinkedToColumn]?.[0];
+        } else {
+            console.log("refsLinkedToElementElementElement", column);
+          refLinkedToColumn = Object.keys(refsLinkedToElementElementElement || {})
+            .find(key=>key.match('.*::(.*)::.*'))
+          refsLinkedToElementElementElement=refsLinkedToElementElementElement?.[refLinkedToColumn].hierarchicalKey.sql
+        }
         return refsLinkedToElementElementElement;
       }
     }
@@ -365,7 +371,7 @@ export default {
           ...services.internationalisationService.mergeInternationalization(application),
           localRefName: application.configuration.i18n.data[props.dataId].i18n.title[locale],
           localRefDescription:
-            application.configuration.i18n.data[props.dataId].i18n.description[locale],
+            application.configuration.i18n.data[props.dataId].i18n.description[locale]
         });
         totalRows.value = application.referenceSynthesis.find(synthesis => synthesis.referenceType === props.dataId)?.lineCount || 0;
         const data = await services.dataService.getData(
@@ -379,7 +385,7 @@ export default {
           loadExample.value
         );
 
-        canHorizontalize.value = data.patternDefinitionCount>= 1
+        canHorizontalize.value = data.patternDefinitionCount >= 1;
         changeHorizontalDisplay(data.patternDefinitionCount > 1);
         if (data) {
           //let dataValues = data.rows;
@@ -403,15 +409,15 @@ export default {
       return columns.value.reduce((acc, column) => {
         if (column.type === "PatternComponent") {
           if (horizontalDisplay.value) {
-          let row = rows.value[0];
-          row.values[column.id]
-            .map((value) => column.componentsForValue(value, row))
-            .forEach((col) => {
-              col.forEach((col2) => acc.push(col2));
-            });
+            let row = rows.value[0];
+            row.values[column.id]
+              .map((value) => column.componentsForValue(value, row))
+              .forEach((col) => {
+                col.forEach((col2) => acc.push(col2));
+              });
           } else {
-            column.horizontalDisplay=false;
-            acc.push(column)
+            column.horizontalDisplay = false;
+            acc.push(column);
             column.getColumnQualifiersMap(application, null, rows.value[0]).forEach(qualifier => acc.push(qualifier));
           }
         } else if (column.type !== "PatternAdjacentComponent") {
-- 
GitLab


From a2d7b75851404fe7b833efd55640f422db46cc54 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Mon, 16 Dec 2024 21:22:43 +0100
Subject: [PATCH 35/61] correction des filtres

---
 .../application/ApplicationCard.vue           |   4 +-
 .../DetailApplicationModalCard.vue            |  41 +++---
 src/components/common/CollapsibleTree.vue     |   8 +-
 .../common/provider/FiltersDataCollapse.vue   |  46 +++++--
 src/components/datas/DatasPatternLink.vue     |  40 ++++--
 src/model/ApplicationResult.js                |  24 ++--
 src/model/application/Application.js          |  17 ++-
 src/model/application/Component.js            |  23 ++--
 src/services/AlertService.js                  |  17 ++-
 src/views/application/ApplicationInfoView.vue |  18 +--
 src/views/application/ApplicationsView.vue    |  10 +-
 .../DataTypeAuthorizationsView.vue            |   2 +-
 .../RequestAuthorizationManagementView.vue    |  11 +-
 src/views/data/DataTableView.vue              | 129 ++++++++++++------
 src/views/data/DataVersioningView.vue         |   6 +-
 src/views/data/DatasManagementView.vue        |  38 +++---
 16 files changed, 263 insertions(+), 171 deletions(-)

diff --git a/src/components/application/ApplicationCard.vue b/src/components/application/ApplicationCard.vue
index 1d0a6cc23..32e2c3039 100644
--- a/src/components/application/ApplicationCard.vue
+++ b/src/components/application/ApplicationCard.vue
@@ -18,7 +18,7 @@ export default {
     },
     applicationRoles: {
       type: Array,
-      default: ()=>[],
+      default: () => [],
     },
     index: {
       required: true,
@@ -94,7 +94,7 @@ export default {
         :url="url"
         :redirection="redirection"
         :close-cb="redirection"
-        :application-roles= "applicationRoles"
+        :application-roles="applicationRoles"
       >
       </DetailApplicationModalCard>
     </b-modal>
diff --git a/src/components/application/DetailApplicationModalCard.vue b/src/components/application/DetailApplicationModalCard.vue
index a82772646..192ed3bfd 100644
--- a/src/components/application/DetailApplicationModalCard.vue
+++ b/src/components/application/DetailApplicationModalCard.vue
@@ -38,8 +38,7 @@ export default {
   name: "DetailApplicationModalCard",
   applicationRoles: {
     type: Object,
-    default: () => {
-    }
+    default: () => {},
   },
   components: { CharteValidator, ModalCard },
   emits: ["setValidatedCharte"],
@@ -47,34 +46,34 @@ export default {
     open: {
       type: Boolean,
       required: true,
-      default: false
+      default: false,
     },
     application: {
       type: Object,
-      required: true
+      required: true,
     },
     closeCb: {
       type: Function,
       required: false,
       default: () => {
         this.charteHREF.value = null;
-      }
+      },
     },
     url: {
       required: true,
-      type: String
+      type: String,
     },
     redirection: {
       required: true,
-      type: Function
-    }
+      type: Function,
+    },
   },
   setup(props, ctx) {
     const charteHREF = useText().refText;
     const getUrl = computed({
       get() {
         return charteHREF.value ? charteHREF.value : props.url;
-      }
+      },
     });
     const validated = computed({
       get() {
@@ -87,18 +86,18 @@ export default {
       set(bool) {
         let storedAuthenticatedUser = User.STORED_AUTHENTICATED_USER();
         bool &&
-        services.loginService.modifAcount({
-          login: storedAuthenticatedUser?.login,
-          email: storedAuthenticatedUser?.email,
-          charte: props.application.id
-        });
+          services.loginService.modifAcount({
+            login: storedAuthenticatedUser?.login,
+            email: storedAuthenticatedUser?.email,
+            charte: props.application.id,
+          });
         bool &&
-        ctx.emit("setValidatedCharte", {
-          applicationId: props.application.id,
-          validated: bool
-        });
+          ctx.emit("setValidatedCharte", {
+            applicationId: props.application.id,
+            validated: bool,
+          });
         return bool && props.redirection();
-      }
+      },
     });
     const { tmpCharte } = useRedirections(props.application);
 
@@ -106,9 +105,9 @@ export default {
       charteHREF,
       getUrl,
       tmpCharte,
-      validated
+      validated,
     };
-  }
+  },
 };
 </script>
 
diff --git a/src/components/common/CollapsibleTree.vue b/src/components/common/CollapsibleTree.vue
index 492a4dc3f..07463959d 100644
--- a/src/components/common/CollapsibleTree.vue
+++ b/src/components/common/CollapsibleTree.vue
@@ -117,7 +117,7 @@
             </div>
             <div v-else-if="lineCount">
               <span :class="lineCount ? 'file-name' : 'file-name has-text-danger'">
-                {{ $tc("validation.count-line", lineCount, {count : lineCount}) }}
+                {{ $tc("validation.count-line", lineCount, { count: lineCount }) }}
               </span>
             </div>
             <div v-else-if="refFile">
@@ -196,7 +196,7 @@
         v-for="child in option.children"
         :key="child.id"
         :application-title="applicationTitle"
-        :buttons="buildButton?buildButton(child):buttons"
+        :buttons="buildButton ? buildButton(child) : buttons"
         :build-button="buildButton"
         :class="displayChildren ? '' : 'hide'"
         :level="level + 1"
@@ -218,7 +218,7 @@ import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
 import AvailiblityChart from "../charts/AvailiblityChart.vue";
 import LoadingAnimate from "@/components/common/LoadingAnimate.vue";
 import { lineCountSynthesis } from "@/composable/application/synthesis";
-import {  watch } from "vue";
+import { watch } from "vue";
 import useBoolean from "@/composable/components/boolean";
 import TagsInfos from "@/components/common/TagsInfos.vue";
 import { length } from "vee-validate/dist/rules";
@@ -232,7 +232,7 @@ export default {
   },
   components: { TagsInfos, LoadingAnimate, FontAwesomeIcon, AvailiblityChart },
   props: {
-    buildButton:Function,
+    buildButton: Function,
     applicationName: String,
     canUpload: {
       type: Boolean,
diff --git a/src/components/common/provider/FiltersDataCollapse.vue b/src/components/common/provider/FiltersDataCollapse.vue
index 7940a7780..17962f966 100644
--- a/src/components/common/provider/FiltersDataCollapse.vue
+++ b/src/components/common/provider/FiltersDataCollapse.vue
@@ -45,7 +45,17 @@
               type="search"
               @select="
                 (option) =>
-                  updateValue(columns.id, { componentKey: columns.id, filters: [] }, option)
+                  updateValue(
+                    columns.id,
+                    {
+                      componentKey: columns.parentComponentKey
+                        ? columns.parentComponentKey + '.' + columns.id
+                        : columns.id,
+                      filters: [],
+                      columns: columns,
+                    },
+                    option
+                  )
               "
               @typing="getNewListReferenceValuesWhenFiltered"
             >
@@ -94,7 +104,7 @@
           <b-field v-else-if="columns.id !== '#'">
             <template #label>
               <label class="titleInput" style="padding: 0 0.625em 0 0.625rem">{{
-                  columns.getHeader(application, dataId)
+                columns.getHeader(application, dataId)
               }}</label>
             </template>
             <b-taginput
@@ -108,14 +118,22 @@
               @blur="
                 updateValue(
                   columns.id,
-                  { componentKey: columns.id, filters: filters[columns.componentKey] },
+                  {
+                    componentKey: columns.id,
+                    filters: filters[columns.componentKey],
+                    columns: columns,
+                  },
                   null
                 )
               "
               @keyup.native.enter="
                 updateValue(
                   columns.id,
-                  { componentKey: columns.id, filters: filters[columns.componentKey] },
+                  {
+                    componentKey: columns.id,
+                    filters: filters[columns.componentKey],
+                    columns: columns,
+                  },
                   null
                 )
               "
@@ -141,12 +159,18 @@
     </div>
     <div class="card-footer">
       <div class="card-footer-item">
-        <b-button expanded icon-left="redo" outlined type="is-danger" @click="clear()"
-                  disabled="!filters.length"
+        <b-button
+          expanded
+          icon-left="redo"
+          outlined
+          type="is-danger"
+          @click="clear()"
+          disabled="!filters.length"
           >{{ $t("dataTypesManagement.réinitialiser") }}
           {{ $t("dataTypesManagement.filtre") }}
         </b-button>
-      </div><!--
+      </div>
+      <!--
       <div class="card-footer-item">
         <b-button
           expanded
@@ -165,7 +189,11 @@
           type="is-primary"
           @click="$emit('download-search', { filters })"
         >
-          {{ filters.length?$t("dataTable.donwload-result-filter"): $t("dataTable.donwload-result") }}
+          {{
+            filters.length
+              ? $t("dataTable.donwload-result-filter")
+              : $t("dataTable.donwload-result")
+          }}
         </b-button>
       </div>
     </div>
@@ -195,7 +223,7 @@ export default {
       type: String,
     },
     isRefLinkTo: {
-      type: Array,
+      type: Object,
       defaults: [],
     },
     columnsToBeShown: {
diff --git a/src/components/datas/DatasPatternLink.vue b/src/components/datas/DatasPatternLink.vue
index 141dbacee..09b141f5a 100644
--- a/src/components/datas/DatasPatternLink.vue
+++ b/src/components/datas/DatasPatternLink.vue
@@ -23,7 +23,7 @@
         <div class="card-header">
           <div class="title card-header-title">
             <p field="name" style="font-size: 1.5rem">
-              {{ columnTitle.match(".*::(.*)")?columnTitle.match(".*::(.*)")[1] : columnTitle}}
+              {{ columnTitle.match(".*::(.*)") ? columnTitle.match(".*::(.*)")[1] : columnTitle }}
             </p>
           </div>
         </div>
@@ -69,7 +69,7 @@
     </b-modal>
   </div>
   <div v-else>
-    {{ patternLinkHeader}}
+    {{ patternLinkHeader }}
   </div>
 </template>
 
@@ -89,12 +89,12 @@ export default {
     value: Array,
     infoValues: {},
     loadedReferencesByKey: {
-      type: Object
+      type: Object,
     },
     dataId: String,
     info: Boolean,
     columnId: String,
-    patternCheckerDateRef: Function
+    patternCheckerDateRef: Function,
   },
   beforeCreate() {
     this.$options.components.DatasLink = require("./DatasLink.vue").default;
@@ -107,24 +107,34 @@ export default {
     function showBtnTablePatternColumn(tableDynamicColumn) {
       let showModal = Object.entries(tableDynamicColumn)
         .filter((a) => a[1])
-        .map(function(a) {
+        .map(function (a) {
           let obj = {};
           obj[a[0]] = a[1];
           return obj;
         });
       return showModal.length !== 0;
     }
-    const patternLinkHeader = computed(()=>{
-      console.log('dataid', props.dataId, 'columntitle', props.columnTitle, 'application', props.application);
+    const patternLinkHeader = computed(() => {
+      console.log(
+        "dataid",
+        props.dataId,
+        "columntitle",
+        props.columnTitle,
+        "application",
+        props.application
+      );
       //application.configuration.i18n.data.t_swc_swc.components.swc_variable.exportHeader.title.fr
-      return services.internationalisationService.localeReferenceColumnsNames(props.dataId, props.columnTitle, props.application)
-    })
+      return services.internationalisationService.localeReferenceColumnsNames(
+        props.dataId,
+        props.columnTitle,
+        props.application
+      );
+    });
 
     const columnName = computed(() => {
-        let pattern = props.columnTitle.match(".*::(.*)");
-        return pattern ? pattern[1] : props.columnTitle;
-      }
-    );
+      let pattern = props.columnTitle.match(".*::(.*)");
+      return pattern ? pattern[1] : props.columnTitle;
+    });
 
     async function showModal() {
       isLoading.value = true;
@@ -139,9 +149,9 @@ export default {
       isLoading,
       isCardModalActive,
       showBtnTablePatternColumn,
-      showModal
+      showModal,
     };
-  }
+  },
 };
 </script>
 .modal-high-z-index { z-index: 9999 !important; position: absolute; }
diff --git a/src/model/ApplicationResult.js b/src/model/ApplicationResult.js
index 5a3f9a88d..9575401ce 100644
--- a/src/model/ApplicationResult.js
+++ b/src/model/ApplicationResult.js
@@ -20,9 +20,9 @@ export class ApplicationResult {
         id: "",
         title: "",
         key: false,
-        linkedTo: ""
-      }
-    }
+        linkedTo: "",
+      },
+    },
   };
   dataTypes = {
     idRef: {
@@ -33,9 +33,9 @@ export class ApplicationResult {
         id: "",
         title: "",
         key: false,
-        linkedTo: ""
-      }
-    }
+        linkedTo: "",
+      },
+    },
   };
   data = {};
   additionalFile = {};
@@ -47,10 +47,10 @@ export class ApplicationResult {
   dependantNodesByDataName = {};
   orderedReferences = {};
   referenceSynthesis = {};
-  canReadReference ;
-  canWriteReference ;
-  canReadDatatype ;
-  canWriteDatatype ;
+  canReadReference;
+  canWriteReference;
+  canReadDatatype;
+  canWriteDatatype;
   authorizations = {
     idRef: {
       ACTIVE_APPLICATION_USER: false,
@@ -60,8 +60,8 @@ export class ApplicationResult {
       DOWNLOAD: false,
       PUBLICATION: false,
       READ: false,
-      UPLOAD: false
-    }
+      UPLOAD: false,
+    },
   };
 
   isApplicationUser() {
diff --git a/src/model/application/Application.js b/src/model/application/Application.js
index 296a07652..0962ebb9b 100644
--- a/src/model/application/Application.js
+++ b/src/model/application/Application.js
@@ -26,11 +26,10 @@ export class Application {
     application.currentApplicationUserRolesResult = result.currentApplicationUserRolesResult;
     application.hasSignedCharte = result.hasSignedCharte;
     application.hasSignedLastCharte = result.hasSignedLastCharte;
-    application.dataSyntheses = (result.dataSyntheses || [])
-      .reduce((acc, synthesis) => {
-        acc[synthesis.referenceType] = synthesis.lineCount;
-        return acc;
-      }, {});
+    application.dataSyntheses = (result.dataSyntheses || []).reduce((acc, synthesis) => {
+      acc[synthesis.referenceType] = synthesis.lineCount;
+      return acc;
+    }, {});
 
     application.canWriteReference = application.hasReferenceToWrite();
     application.canReadReference = application.hasReferenceToRead();
@@ -43,12 +42,12 @@ export class Application {
     let applicationRoles = this.currentApplicationUserRolesResult.applicationRoles;
     let datasyntheses = this.dataSyntheses;
     return this.references
-      .map(reference => {
+      .map((reference) => {
         let reader = applicationRoles?.includes("reader") && datasyntheses[reference] > 0;
         let writer = applicationRoles?.includes("writer");
         return reader || writer;
       })
-      .reduce((acc, reader) => (acc || reader), false);
+      .reduce((acc, reader) => acc || reader, false);
   }
 
   hasReferenceToWrite() {
@@ -60,12 +59,12 @@ export class Application {
     let applicationRoles = this.currentApplicationUserRolesResult.applicationRoles;
     let datasyntheses = this.dataSyntheses;
     return this.dataTypes
-      .map(reference => {
+      .map((reference) => {
         let reader = applicationRoles?.includes("reader") && datasyntheses[reference] > 0;
         let writer = applicationRoles?.includes("writer");
         return reader || writer;
       })
-      .reduce((acc, reader) => (acc || reader), false);
+      .reduce((acc, reader) => acc || reader, false);
   }
 
   hasDatatypeToWrite() {
diff --git a/src/model/application/Component.js b/src/model/application/Component.js
index 639864028..6f16dcb11 100644
--- a/src/model/application/Component.js
+++ b/src/model/application/Component.js
@@ -54,7 +54,7 @@ export class Component {
     return row.values[this.id];
   }
 
-  getDisplayValue = function(row) {
+  getDisplayValue = function (row) {
     let columnValue = this.getColumnValue(row);
     let displaysForRow = row.displaysForRow?.[this.refLinkedTo]?.[row.values[this.id]];
     if (displaysForRow && typeof columnValue !== "number") {
@@ -107,8 +107,8 @@ export class Component {
           getInternationalizedColumn(
             referenceName,
             component.patternColumnComponents[patternColumnComponent].exportHeader ||
-            component.patternColumnComponents[patternColumnComponent].exportHeaderName ||
-            component.patternColumnComponents[patternColumnComponent].componentKey,
+              component.patternColumnComponents[patternColumnComponent].exportHeaderName ||
+              component.patternColumnComponents[patternColumnComponent].componentKey,
             application
           );
       }
@@ -259,7 +259,7 @@ class PatternComponent extends Component {
     return this.originalName;
   }
 
-  getDisplayValue = function(row) {
+  getDisplayValue = function (row) {
     let columnValue = this.getColumnValue(row);
     let displaysForRow = row.displaysForRow?.[this.refLinkedTo]?.[row.values[this.id]];
     if (displaysForRow && typeof columnValue !== "number") {
@@ -273,7 +273,9 @@ class PatternComponent extends Component {
     if (this.horizontalDisplay)
       if (this.horizontalDisplay) {
         let pattern = this.id.match("(.*?)::(.*)");
-        return row.values[pattern[1]]?.find((column) => column.__ORIGINAL_COLUMN_NAME__ == pattern[2]).__VALUE__;
+        return row.values[pattern[1]]?.find(
+          (column) => column.__ORIGINAL_COLUMN_NAME__ == pattern[2]
+        ).__VALUE__;
       }
     return row.values[this.componentKey]?.[0]?.__VALUE__;
   }
@@ -312,14 +314,14 @@ class PatternComponent extends Component {
         value = row.values[pattern[1]].find(
           (component) => pattern[2] == component.__ORIGINAL_COLUMN_NAME__
         );
-      }else{
-        value = row?.values?.[dataId]?.[0]
+      } else {
+        value = row?.values?.[dataId]?.[0];
       }
       qualifiers = this.patternQualifierComponents.map((col) => {
         let columnName;
-        if(this.horizontalDisplay){
+        if (this.horizontalDisplay) {
           columnName = col.getHeader(application, dataId, col.id);
-        }else {
+        } else {
           columnName = dataId;
         }
         let returnValue = {
@@ -327,7 +329,7 @@ class PatternComponent extends Component {
           column: col.id,
           columnName,
           value: value[col.id],
-          id: col.id
+          id: col.id,
         };
         returnValue[col.id] = value[col.id];
         return returnValue;
@@ -369,7 +371,6 @@ class PatternQualifierComponent extends Component {
     return this._getInternationalizedColumn(dataId, this.id, application);
   }
 
-
   getColumnValue(row) {
     let pattern = this.id.match("(.*)::(.*)::(.*)");
     if (pattern) {
diff --git a/src/services/AlertService.js b/src/services/AlertService.js
index 57eeb448b..561269594 100644
--- a/src/services/AlertService.js
+++ b/src/services/AlertService.js
@@ -17,7 +17,7 @@ export class AlertService {
       message: message,
       type: BuefyTypes.SUCCESS,
       duration: TOAST_INFO_DURATION,
-      position: TOAST_POSITION
+      position: TOAST_POSITION,
     });
   }
 
@@ -27,7 +27,7 @@ export class AlertService {
       message: message,
       type: BuefyTypes.WARNING,
       duration: TOAST_ERROR_DURATION,
-      position: TOAST_POSITION
+      position: TOAST_POSITION,
     });
   }
 
@@ -41,7 +41,7 @@ export class AlertService {
               message: i18n.t("applications.no-right-for-application"),
               type: BuefyTypes.DANGER,
               duration: TOAST_ERROR_DURATION,
-              position: TOAST_POSITION
+              position: TOAST_POSITION,
             });
             t = "NO-RIGHTS";
           } else {
@@ -49,7 +49,7 @@ export class AlertService {
               message: i18n.t("exceptionMessage." + t),
               type: BuefyTypes.DANGER,
               duration: TOAST_ERROR_DURATION,
-              position: TOAST_POSITION
+              position: TOAST_POSITION,
             });
           }
         } else if ("NO_RIGHT_FOR_APPLICATION_MANAGEMENT" === t.message) {
@@ -65,7 +65,7 @@ export class AlertService {
             message: i18n.t("exceptionMessage." + message, params),
             type: BuefyTypes.DANGER,
             duration: TOAST_ERROR_DURATION,
-            position: TOAST_POSITION
+            position: TOAST_POSITION,
           });
         }
         if (state) state.value = t;
@@ -75,7 +75,7 @@ export class AlertService {
         message: message,
         type: BuefyTypes.DANGER,
         duration: TOAST_ERROR_DURATION,
-        position: TOAST_POSITION
+        position: TOAST_POSITION,
       });
     }
   }
@@ -88,8 +88,7 @@ export class AlertService {
     }
   }
 
-  dialog(title, message, confirmText, type = "warning", cancelMsg, onConfirmCb = () => {
-  }) {
+  dialog(title, message, confirmText, type = "warning", cancelMsg, onConfirmCb = () => {}) {
     DialogProgrammatic.confirm({
       title: title,
       message: message,
@@ -99,7 +98,7 @@ export class AlertService {
       cancelText: cancelMsg,
       onConfirm: () => {
         onConfirmCb();
-      }
+      },
     });
   }
 }
diff --git a/src/views/application/ApplicationInfoView.vue b/src/views/application/ApplicationInfoView.vue
index e43d73eef..8b82789c4 100644
--- a/src/views/application/ApplicationInfoView.vue
+++ b/src/views/application/ApplicationInfoView.vue
@@ -89,13 +89,15 @@ export default {
       authorizationsManagementForApplicationUsers,
       showRequestRights,
     } = useRedirections(application);
-    const canReadReferences = computed(()=>
-      Object.keys(application.references)
-        .filter(reference => application?.authorizations?.[reference]?.READ)
+    const canReadReferences = computed(() =>
+      Object.keys(application.references).filter(
+        (reference) => application?.authorizations?.[reference]?.READ
+      )
     );
-    const canReadDataTypes = computed(()=>
-      Object.keys(application.dataTypes)
-        .filter(dataType => application?.authorizations?.[dataType]?.READ)
+    const canReadDataTypes = computed(() =>
+      Object.keys(application.dataTypes).filter(
+        (dataType) => application?.authorizations?.[dataType]?.READ
+      )
     );
 
     onMounted(async () => {
@@ -441,7 +443,7 @@ export default {
             class="buttonWarper"
           >
             <b-button
-              :disabled = !canReadReferences.length
+              :disabled="!canReadReferences.length"
               class="column"
               icon-left="drafting-compass"
               type="is-primary"
@@ -454,7 +456,7 @@ export default {
             class="buttonWarper"
           >
             <b-button
-              :disabled = !canReadDataTypes.length
+              :disabled="!canReadDataTypes.length"
               class="column"
               icon-left="poll"
               type="is-primary"
diff --git a/src/views/application/ApplicationsView.vue b/src/views/application/ApplicationsView.vue
index 8d4580c3c..72ecabb95 100644
--- a/src/views/application/ApplicationsView.vue
+++ b/src/views/application/ApplicationsView.vue
@@ -126,7 +126,9 @@
         <div class="columns">
           <ApplicationCard
             v-for="(application, index) in selectedApplications"
-            :application-roles="application?.currentApplicationUserRolesResult?.applicationRoles || []"
+            :application-roles="
+              application?.currentApplicationUserRolesResult?.applicationRoles || []
+            "
             :key="application.name"
             :application="application"
             :current="current"
@@ -173,7 +175,7 @@ export default {
   computed: {
     Application() {
       return Application;
-    }
+    },
   },
   components: { ApplicationCard, LoadingAnimate, PageView },
   setup() {
@@ -287,9 +289,9 @@ export default {
       isCardModalActive,
       canCreateApplication,
       sortedApplicationsListForDate,
-      sortedApplicationsListForName
+      sortedApplicationsListForName,
     };
-  }
+  },
 };
 </script>
 
diff --git a/src/views/authorizations/DataTypeAuthorizationsView.vue b/src/views/authorizations/DataTypeAuthorizationsView.vue
index 306678c55..ea6054af7 100644
--- a/src/views/authorizations/DataTypeAuthorizationsView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationsView.vue
@@ -355,7 +355,7 @@
                     >
                     </b-button>
                     <b-button
-                      :disabled = "!isUserManager"
+                      :disabled="!isUserManager"
                       class="show-check-details"
                       icon-left="pen-square"
                       onmouseout="style.color='';"
diff --git a/src/views/authorizations/RequestAuthorizationManagementView.vue b/src/views/authorizations/RequestAuthorizationManagementView.vue
index 46a0d4851..1c4d89505 100644
--- a/src/views/authorizations/RequestAuthorizationManagementView.vue
+++ b/src/views/authorizations/RequestAuthorizationManagementView.vue
@@ -64,7 +64,7 @@
           </template>
           <template v-slot="props">
             <a @click="manageRequest(props.row.id)" class="is-flex is-align-content-center">
-              <b-icon icon="pen-square" size="is-small" ></b-icon>
+              <b-icon icon="pen-square" size="is-small"></b-icon>
               <span class="with-padding">{{ props.row.comment }}</span>
             </a>
           </template>
@@ -93,7 +93,7 @@
             {{ formatDate(props.row.updateDate) }}
           </template>
         </b-table-column>
-<!--
+        <!--
         <b-table-column :searchable="true" field="number request" label="N° de la demande" sortable>
           <template #searchable="props">
             <b-input
@@ -143,7 +143,6 @@ import { onMounted, ref, watch } from "vue";
 import useArray from "@/composable/components/array";
 import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
 
-
 export default {
   name: "RequestAuthorizationManagementView",
   components: {
@@ -293,8 +292,8 @@ export default {
       app.$router.push(`/applications/${props.applicationName}/authorizationsRequest/${id}`);
     }
     function formatDate(date) {
-      if (!date) return '';
-      return moment(date).format('DD/MM/YYYY');
+      if (!date) return "";
+      return moment(date).format("DD/MM/YYYY");
     }
 
     return {
@@ -339,7 +338,7 @@ td {
 .listAuthorization:nth-child(odd) {
   background-color: #f5f5f5;
 }
-.with-padding{
+.with-padding {
   padding-left: 1em;
 }
 </style>
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index bfd3f2a65..9d3f83848 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -12,7 +12,7 @@
       :localName="application.localRefName"
       :local-title="$t('titles.references-data', { refName: application.localRefName })"
     />
-    <div id="tagsCollapse" class="column">
+    <div id="tagsCollapsereal" class="column">
       <TagsCollapse
         v-if="hasTags"
         :tags="tags"
@@ -20,11 +20,11 @@
         @change:allTags="changeAllValueTags($event)"
       />
     </div>
-    <div v-if="state!=='NO-RIGHTS'">
+    <div v-if="state !== 'NO-RIGHTS'">
       <FiltersDataCollapse
         :application="application"
         :application-name="applicationName"
-        :columns-to-be-shown="dataColumnsToBeShown"
+        :columns-to-be-shown="dataColumnsForFilters"
         :data-id="dataId"
         :is-ref-link-to="referenceTypeForReferencingColumns"
         @view-search="recalculate($event)"
@@ -32,9 +32,13 @@
         @clear-search="clear($event)"
       />
       <LoadingAnimate v-if="isLoading" :size="'is-large'"></LoadingAnimate>
-      <div v-if="data && dataColumnsToBeShown && !isLoading && totalRows>0">
+      <div v-if="data && dataColumnsToBeShown && !isLoading && totalRows > 0">
         <b-switch v-if="canHorizontalize" v-model="horizontalDisplay" @input="changeDisplay">
-          {{ horizontalDisplay ? $t("dataTypesManagement.horizontalized") : $t("dataTypesManagement.verticalized") }}
+          {{
+            horizontalDisplay
+              ? $t("dataTypesManagement.horizontalized")
+              : $t("dataTypesManagement.verticalized")
+          }}
         </b-switch>
         <b-table
           id="filtreTable"
@@ -67,16 +71,27 @@
                   :with-qualifier="horizontalDisplay"
                   :info="column.type === 'PatternComponent'"
                   :application="application"
-                  :value="column.getColumnQualifiersMap(application, column.horizontalDisplay?dataId:column.componentKey, rows[0])"
+                  :value="
+                    column.getColumnQualifiersMap(
+                      application,
+                      column.horizontalDisplay ? dataId : column.componentKey,
+                      rows[0]
+                    )
+                  "
                   :column-id="column.id"
                   :column-title="column.id"
-                  :info-values="column.getColumnQualifiersMap(application, column.horizontalDisplay?dataId:column.componentKey, rows[0])"
+                  :info-values="
+                    column.getColumnQualifiersMap(
+                      application,
+                      column.horizontalDisplay ? dataId : column.componentKey,
+                      rows[0]
+                    )
+                  "
                   :loaded-references-by-key="{}"
                   :pattern-checker-date-ref="patternCheckerDateRef"
                   :data-id="dataId"
                 ></DatasPatternLink>
-                <div
-                  v-else-if="'patternQualifierComponent' === column.type">
+                <div v-else-if="'patternQualifierComponent' === column.type">
                   {{ column.getHeader(application, dataId) }}
                 </div>
                 <div v-else>
@@ -131,7 +146,9 @@
                 :value="'' + column.getColumnValue(props.row)"
               ></DatasLink>
               <div v-else class="columns">
-                <a @click="askDeletionConfirmation(rows[tableValues.indexOf(props.row)]?.naturalKey)">
+                <a
+                  @click="askDeletionConfirmation(rows[tableValues.indexOf(props.row)]?.naturalKey)"
+                >
                   <b-icon class="clickable" icon="times-circle" size="is-small" type="is-danger">
                   </b-icon>
                 </a>
@@ -163,17 +180,17 @@
           type="is-primary"
           icon-left="download"
           @click.prevent="downloadResultSearch"
-        >{{ $t("dataTable.donwload-result") }}
+          >{{ $t("dataTable.donwload-result") }}
         </b-button>
       </div>
     </div>
 
-    <div v-else-if="state==='NO-RIGHTS'">
+    <div v-else-if="state === 'NO-RIGHTS'">
       <b-message type="is-danger" :closable="false" size="is-medium" has-icon>
         {{ $t("applications.no-right-for-application") }}
       </b-message>
       <b-button
-        class="mt-3 "
+        class="mt-3"
         type="is-primary"
         @click="$router.push('../authorizationsRequest/new')"
       >
@@ -184,7 +201,6 @@
       <b-message type="is-primary" :closable="false" size="is-medium" has-icon>
         {{ $tc("applications.register-rows", totalRows, { totalRows: totalRows }) }}
       </b-message>
-
     </div>
   </PageView>
 </template>
@@ -223,7 +239,7 @@ export default {
   name: "DataTableView",
   props: {
     applicationName: String,
-    dataId: String
+    dataId: String,
   },
   components: {
     TitleAndDescription,
@@ -236,7 +252,7 @@ export default {
     TagsCollapse,
     DatasLink,
     DatasManyLink,
-    DatasDynamicLink
+    DatasDynamicLink,
   },
   setup(props) {
     const loadExample = ref(true);
@@ -250,7 +266,8 @@ export default {
     const { shallowRefArray: errorsMessages } = useArray();
     const { refNumber: currentPage, doChangeNumber: changeCurrentPage } = useNumber(1);
     const { refBoolean: isLoading, doChangeBoolean: changeIsLoading } = useBoolean();
-    const { refBoolean: horizontalDisplay, doChangeBoolean: changeHorizontalDisplay } = useBoolean();
+    const { refBoolean: horizontalDisplay, doChangeBoolean: changeHorizontalDisplay } =
+      useBoolean();
     const canHorizontalize = ref(false);
     const { reactiveObject: application, doChangeObject: changeApplication } = useObject(
       new ApplicationResult()
@@ -262,7 +279,7 @@ export default {
     const { shallowRefArray: tableValues, doChangeArray: changeTableValues } = useArray();
     const { shallowRefArray: tags, doChangeArray: _changeTags } = useArray();
     const { shallowRefArray: filters, doAddToArray: pushFilters } = useArray();
-    const { shallowRefArray: referenceTypeForReferencingColumns } = useArray();
+    const { reactiveObject: referenceTypeForReferencingColumns } = useObject();
     const { reactiveObject: referencesDynamic, doChangeObject: changeReferencesDynamic } =
       useObject();
     const tableHeight = computed(() => {
@@ -288,9 +305,36 @@ export default {
         return services.tagService.toBeShown(tags.value, realVariables.value);
       }
     });
+    const dataColumnsForFilters = computed(() => {
+      let colomnsForFilters = columns.value.reduce((acc, column) => {
+        if (column.type === "PatternComponent") {
+          column.horizontalDisplay = false;
+          acc.push(column);
+          column
+            .getColumnQualifiersMap(application, null, rows.value[0])
+            .forEach((qualifier) => acc.push(qualifier));
+        } else if (column.type !== "PatternAdjacentComponent") {
+          acc.push(column);
+        }
+        return acc;
+      }, []);
+      let navigateurName = navigator.userAgent;
+      if (navigateurName.indexOf("Firefox") >= 1) {
+        return services.tagService.toBeShownDataColumns(tags.value, colomnsForFilters);
+      } else if (navigateurName.indexOf("Safari") >= 1 && navigateurName.indexOf("Chrome") >= 1) {
+        return services.tagService.toBeShown(tags.value, colomnsForFilters);
+      } else {
+        console.log(
+          "Votre navigateur n'est pas testé l'ordonnance des filtres est par défault",
+          navigateurName
+        );
+
+        return services.tagService.toBeShown(tags.value, colomnsForFilters);
+      }
+    });
 
     const hasTags = useBoolean(false).refBoolean;
-    const changeTags = function(tagsToChange) {
+    const changeTags = function (tagsToChange) {
       _changeTags({ ...tagsToChange });
       hasTags.value =
         tags.value &&
@@ -319,15 +363,16 @@ export default {
       if (column.referenceType === "ReferenceChecker") {
         let refLinkedTo = column.refLinkedTo;
         let refLinkedToColumn = column.refLinkedToColumn;
-        let refsLinkedToElementElementElement =
-          row?.refsLinkedTo?.[refLinkedTo];
+        let refsLinkedToElementElementElement = row?.refsLinkedTo?.[refLinkedTo];
         if (refsLinkedToElementElementElement?.[refLinkedToColumn]) {
-          refsLinkedToElementElementElement = refsLinkedToElementElementElement?.[refLinkedToColumn]?.[0];
+          refsLinkedToElementElementElement =
+            refsLinkedToElementElementElement?.[refLinkedToColumn]?.[0];
         } else {
-            console.log("refsLinkedToElementElementElement", column);
-          refLinkedToColumn = Object.keys(refsLinkedToElementElementElement || {})
-            .find(key=>key.match('.*::(.*)::.*'))
-          refsLinkedToElementElementElement=refsLinkedToElementElementElement?.[refLinkedToColumn].hierarchicalKey.sql
+          refLinkedToColumn = Object.keys(refsLinkedToElementElementElement || {}).find((key) =>
+            key.match(".*::(.*)::.*")
+          );
+          refsLinkedToElementElementElement =
+            refsLinkedToElementElementElement?.[refLinkedToColumn].hierarchicalKey.sql;
         }
         return refsLinkedToElementElementElement;
       }
@@ -352,7 +397,7 @@ export default {
               `/applications/${props.applicationName}/${dataIsType}/${props.dataId}`
             ),
           () => app.$router.push(`/applications/${props.applicationName}/${dataIsType}`)
-        )
+        ),
       ]);
       changeColumns(services.tagService.toBeShown(tags.value, columns.value));
       changeTags(buildTagsColumns(application, columns.value, tags.value));
@@ -364,23 +409,26 @@ export default {
         changeApplication(
           await services.applicationService.getApplication(props.applicationName, [
             "CONFIGURATION",
-            "REFERENCETYPE"
+            "REFERENCETYPE",
           ])
         );
         changeApplication({
           ...services.internationalisationService.mergeInternationalization(application),
           localRefName: application.configuration.i18n.data[props.dataId].i18n.title[locale],
           localRefDescription:
-            application.configuration.i18n.data[props.dataId].i18n.description[locale]
+            application.configuration.i18n.data[props.dataId].i18n.description[locale],
         });
-        totalRows.value = application.referenceSynthesis.find(synthesis => synthesis.referenceType === props.dataId)?.lineCount || 0;
+        totalRows.value =
+          application.referenceSynthesis.find(
+            (synthesis) => synthesis.referenceType === props.dataId
+          )?.lineCount || 0;
         const data = await services.dataService.getData(
           props.applicationName,
           props.dataId,
           {
             horizontalDisplay: horizontalDisplay.value,
             offset: params.offset,
-            limit: params.limit
+            limit: params.limit,
           },
           loadExample.value
         );
@@ -393,12 +441,12 @@ export default {
           //changeRows(dataValues);
           if (Object.keys(data?.referenceTypeForReferencingColumns).length > 0) {
             for (let key in data.referenceTypeForReferencingColumns) {
-              referenceTypeForReferencingColumns.value[key] =
+              referenceTypeForReferencingColumns[key] =
                 data.referenceTypeForReferencingColumns[key];
             }
           }
         }
-        await updateData({ "filters": [] }, data, false, totalRows);
+        await updateData({ filters: [] }, data, false, totalRows);
       } catch (error) {
         services.alertService.toastServerError(error, state);
       }
@@ -418,7 +466,9 @@ export default {
           } else {
             column.horizontalDisplay = false;
             acc.push(column);
-            column.getColumnQualifiersMap(application, null, rows.value[0]).forEach(qualifier => acc.push(qualifier));
+            column
+              .getColumnQualifiersMap(application, null, rows.value[0])
+              .forEach((qualifier) => acc.push(qualifier));
           }
         } else if (column.type !== "PatternAdjacentComponent") {
           acc.push(column);
@@ -483,7 +533,7 @@ export default {
           .reduce((accumulator, component) => {
             accumulator.push(component);
             return accumulator;
-          }, [])
+          }, []),
       ];
       changeColumns(localColumns);
       if (rows.value) {
@@ -515,7 +565,9 @@ export default {
       changeCurrentPage(1);
       let limit = params.limit;
       params.limit = null;
-      params.componentFilters = event?.filters ? event.filters.filter((v) => v !== undefined) : params.componentFilters;
+      params.componentFilters = event?.filters
+        ? event.filters.filter((v) => v !== undefined)
+        : params.componentFilters;
       let tableValue = await services.dataService.getData(
         props.applicationName,
         props.dataId,
@@ -672,6 +724,7 @@ export default {
       application,
       data,
       dataColumnsToBeShown,
+      dataColumnsForFilters,
       filters,
       MANY,
       ONE,
@@ -684,9 +737,9 @@ export default {
       tableHeight,
       loader,
       canHorizontalize,
-      horizontalDisplay
+      horizontalDisplay,
     };
-  }
+  },
 };
 </script>
 <style lang="scss" scoped>
diff --git a/src/views/data/DataVersioningView.vue b/src/views/data/DataVersioningView.vue
index 22304b816..72242e60f 100644
--- a/src/views/data/DataVersioningView.vue
+++ b/src/views/data/DataVersioningView.vue
@@ -569,11 +569,7 @@ export default {
                 }
               }
               if (reference !== "") {
-
-                let ref = await services.dataService.getData(
-                  props.applicationName,
-                  reference
-                );
+                let ref = await services.dataService.getData(props.applicationName, reference);
                 loadedReferences[reference] = ref;
                 refForAuth[reference] = ref;
                 changeReferenceScopes(refForAuth[reference].referenceScopes);
diff --git a/src/views/data/DatasManagementView.vue b/src/views/data/DatasManagementView.vue
index 2689dd612..59c67ea74 100644
--- a/src/views/data/DatasManagementView.vue
+++ b/src/views/data/DatasManagementView.vue
@@ -123,12 +123,12 @@ export default {
     TagsCollapse,
     DetailsPanel,
     PageView,
-    SubMenu
+    SubMenu,
   },
   props: {
     applicationName: {
-      type: String
-    }
+      type: String,
+    },
   },
   setup(props) {
     const { shallowRefArray: datas, doChangeArray: changeDatas } = useArray();
@@ -156,7 +156,7 @@ export default {
     const { refBoolean: canManagerUser, doChangeBoolean: changeCanManagerUser } = useBoolean(false);
     const type = window.location.href.split("/");
     const hasTags = useBoolean(false).refBoolean;
-    const changeTags = function(tagsToChange) {
+    const changeTags = function (tagsToChange) {
       _changeTags({ ...tagsToChange });
       hasTags.value =
         tags &&
@@ -166,8 +166,10 @@ export default {
         .map((node) => node.nodeName)
         .map((nodeName) => datas.value.find((data) => data.id === nodeName))
         .filter((node) => node)
-        .sort((a,b)=>
-          application.orderedReferences.indexOf(a.id)-application.orderedReferences.indexOf(b.id)
+        .sort(
+          (a, b) =>
+            application.orderedReferences.indexOf(a.id) -
+            application.orderedReferences.indexOf(b.id)
         );
       changeDatasToBeShown(services.tagService.toBeShown(tags, sortedData));
     };
@@ -195,7 +197,7 @@ export default {
             : i18n.t("referencesManagement.references").toLowerCase(),
           () => app.$router.push(`/applications/${props.applicationName}/${type[type.length - 1]}`),
           () => app.$router.push(`/applications/${props.applicationName}`)
-        )
+        ),
       ]);
       changeTags(buildTags(application, datas.value));
       changeDatas(services.tagService.toBeShown(tags, datas.value));
@@ -236,7 +238,7 @@ export default {
         canDownload: canDownload,
         canDelete: canDelete,
         isAdmin: isAdmin,
-        canShow: any
+        canShow: any,
       };
     }
 
@@ -248,7 +250,7 @@ export default {
             await services.applicationService.getApplication(props.applicationName, [
               "CONFIGURATION",
               "DATATYPE",
-              "REFERENCETYPE"
+              "REFERENCETYPE",
             ])
           );
           if (!application?.id) {
@@ -268,7 +270,7 @@ export default {
           changeApplication(
             await services.applicationService.getApplication(props.applicationName, [
               "CONFIGURATION",
-              "REFERENCETYPE"
+              "REFERENCETYPE",
             ])
           );
           if (!application?.id) {
@@ -296,9 +298,11 @@ export default {
           null,
           !(
             reference.canRead &&
-            (application.referenceSynthesis.find(synthesis => synthesis.referenceType === reference.id)?.lineCount || 0) > 0
+            (application.referenceSynthesis.find(
+              (synthesis) => synthesis.referenceType === reference.id
+            )?.lineCount || 0) > 0
           )
-        )/*,
+        ) /*,
         new Button(
           i18n.t("referencesManagement.download"),
           "download",
@@ -306,7 +310,7 @@ export default {
           null,
           null,
           !reference.canDownload || !lineCount.value
-        )*/
+        )*/,
       ];
     }
 
@@ -323,7 +327,7 @@ export default {
           `/applications/${props.applicationName}/${type[type.length - 1]}/${ref.id}`
         );
       }
-    }/*
+    } /*
 
     async function downloadReference(label) {
       const reference = findReferenceByLabel(label);
@@ -354,7 +358,7 @@ export default {
         let referenceSynthesis = result.referenceSynthesis;
         let updatedApplication = {
           ...application,
-          referenceSynthesis
+          referenceSynthesis,
         };
         updatedApplication = new ApplicationResult(updatedApplication);
         changeApplication(updatedApplication);
@@ -443,9 +447,9 @@ export default {
       isLineCountLoading,
       hasTags,
       type,
-      consultAuthorization
+      consultAuthorization,
     };
-  }
+  },
 };
 </script>
 <style lang="scss" scoped>
-- 
GitLab


From d0392d54b4626ab3132dec02efe78d74d269f434 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Fri, 10 Jan 2025 11:32:11 +0100
Subject: [PATCH 36/61] Correction des filtres pour le cas de pattern component

---
 src/components/common/provider/FiltersDataCollapse.vue | 2 +-
 src/model/application/Component.js                     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/components/common/provider/FiltersDataCollapse.vue b/src/components/common/provider/FiltersDataCollapse.vue
index 17962f966..10b5f9a97 100644
--- a/src/components/common/provider/FiltersDataCollapse.vue
+++ b/src/components/common/provider/FiltersDataCollapse.vue
@@ -49,7 +49,7 @@
                     columns.id,
                     {
                       componentKey: columns.parentComponentKey
-                        ? columns.parentComponentKey + '.' + columns.id
+                        ? columns.parentComponentKey + '::' + columns.id
                         : columns.id,
                       filters: [],
                       columns: columns,
diff --git a/src/model/application/Component.js b/src/model/application/Component.js
index 6f16dcb11..5dc2c9c20 100644
--- a/src/model/application/Component.js
+++ b/src/model/application/Component.js
@@ -256,7 +256,7 @@ class PatternComponent extends Component {
   }
 
   getHeader() {
-    return this.originalName;
+    return this.originalName || this.exportHeader;
   }
 
   getDisplayValue = function (row) {
-- 
GitLab


From 46e0c7c1d0c81c8a278916185a36c717e200ee28 Mon Sep 17 00:00:00 2001
From: Rachid Yahiaoui <rachid.yahiaoui@inra.fr>
Date: Tue, 14 Jan 2025 19:47:08 +0100
Subject: [PATCH 37/61] Rename the variable 'REMOVE_VOLUMES' to
 'REMOVE_DB_AND_VOLUMES'

---
 .gitlab-ci.yml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0b5a9c746..fedb0c083 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -132,7 +132,7 @@ deployment:
         ENV: 'development'
         OA_FRONTEND_VERSION: '$CI_COMMIT_REF_SLUG' # develop branch
         INIT_DB_USER: true
-        REMOVE_VOLUMES: true
+        REMOVE_DB_AND_VOLUMES: true
       when: on_success
     - if: '$CI_COMMIT_REF_SLUG == "main"'  # Preprod Env
       variables:
@@ -140,7 +140,7 @@ deployment:
         ENV: 'preprod'
         OA_FRONTEND_VERSION: '$CI_COMMIT_REF_SLUG' # main branch
         INIT_DB_USER: true
-        REMOVE_VOLUMES: true 
+        REMOVE_DB_AND_VOLUMES: true 
       when: on_success
     - if: '$CI_COMMIT_TAG'  # Production Env
       variables:
@@ -148,7 +148,7 @@ deployment:
         ENV: "production"
         OA_FRONTEND_VERSION: '$CI_COMMIT_TAG'
         INIT_DB_USER: false
-        REMOVE_VOLUMES: false
+        REMOVE_DB_AND_VOLUMES: false
       when: on_success
     - if: '$CI_MERGE_REQUEST_IID != null' # Do nothing with merge request
       when: never
@@ -158,7 +158,7 @@ deployment:
         ENV: "development"
         OA_FRONTEND_VERSION: '$CI_COMMIT_REF_SLUG'
         INIT_DB_USER: true
-        REMOVE_VOLUMES: true
+        REMOVE_DB_AND_VOLUMES: true
   trigger:
     project: '$TRIGGER_PROJECT_NAME'
     branch: main
-- 
GitLab


From 1e69a06b7597c3bb806bcbd1c799cb6dae4b1878 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Thu, 16 Jan 2025 13:24:16 +0100
Subject: [PATCH 38/61] traduction message missingMandatoryColumns #328

---
 src/locales/en.json           | 3 +++
 src/locales/fr.json           | 3 +++
 src/services/ErrorsService.js | 1 +
 3 files changed, 7 insertions(+)

diff --git a/src/locales/en.json b/src/locales/en.json
index 0905b9461..ad4c4992a 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -524,6 +524,9 @@
     "invalidReferenceWithComponent": {
       "message": "For column: <code> {target} </code> the value <code> {value} </code> does not exist in the reference <code> {refType} </code>. Values expected <code> {referenceValues} </code>. "
     },
+    "missingMandatoryColumns": {
+      "message": "The following mandatory columns are missing: <code>{missingMandatoryColumns}</code>."
+    },
     "timeRangeOutOfInterval": {
       "message": "The date value: <code>{value}</code> must be between <code>{from}</code> and <code>{to}</code>."
     },
diff --git a/src/locales/fr.json b/src/locales/fr.json
index 078733266..c2c675108 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -524,6 +524,9 @@
     "invalidReferenceWithComponent": {
       "message": "Pour la colonne : <code>{target}</code>  la valeur <code>{value}</code> n'existe pas dans la référence <code>{refType}</code>.  Valeurs attendues <code>{referenceValues}</code>."
     },
+    "missingMandatoryColumns": {
+      "message": "Il manque les colonnes obligatoires suivantes : <code>{missingMandatoryColumns}</code>."
+    },
     "timeRangeOutOfInterval": {
       "message": "La valeur de la date : <code>{value}</code> doit être comprise entre <code>{from}</code> et <code>{to}</code>."
     },
diff --git a/src/services/ErrorsService.js b/src/services/ErrorsService.js
index 807b3dd5b..72de86989 100644
--- a/src/services/ErrorsService.js
+++ b/src/services/ErrorsService.js
@@ -66,6 +66,7 @@ const ERRORS = {
     headerColumnPatternNotMatching: (params) => i18n.t("errors-csv.headerColumnPatternNotMatching.message", params),
     invalidHeaders: (params) => i18n.t("errors-csv.invalidHeaders.message", params),
     invalidReferenceWithComponent: (params) => i18n.t("errors-csv.invalidReferenceWithComponent.message", params),
+    missingMandatoryColumns: (params) => i18n.t("errors-csv.missingMandatoryColumns.message", params),
     timeRangeOutOfInterval: (params) => i18n.t("errors-csv.timeRangeOutOfInterval.message", params),
     unexpectedHeaderColumn: (params) => i18n.t("errors-csv.unexpectedHeaderColumn.message", params),
     unexpectedHeaderColumnsInList: (params) => i18n.t("errors-csv.unexpectedHeaderColumnsInList.message", params),
-- 
GitLab


From fbc03ee04b598eb85cc61651f68fbdec040f42d2 Mon Sep 17 00:00:00 2001
From: Rachid Yahiaoui <rachid.yahiaoui@inra.fr>
Date: Tue, 21 Jan 2025 11:28:43 +0100
Subject: [PATCH 39/61] Improve GitLab CI : Centralized common variables for
 triggers

---
 .gitlab-ci.yml | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fedb0c083..f60695ec0 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -125,10 +125,15 @@ production:
 
 deployment:
   stage: trigger
+  variables:
+    TRIGGERED_BY_PARENT: 'true'
+    TRIGGERED_PROJECT_NAME: "$CI_PROJECT_NAME"
+    TRIGGERED_USER_NAME: "$GITLAB_USER_NAME"
+    TRIGGERED_PROJECT_COMMIT_ID: "[\`${CI_COMMIT_SHA:0:8}\`]($CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA)"
+    TRIGGERED_PROJECT_BRANCH: "$CI_COMMIT_REF_NAME"
   rules:
     - if: '$CI_COMMIT_REF_SLUG == "develop"'  # Development Env
       variables:
-        TRIGGERED_BY_PARENT: 'true'
         ENV: 'development'
         OA_FRONTEND_VERSION: '$CI_COMMIT_REF_SLUG' # develop branch
         INIT_DB_USER: true
@@ -136,7 +141,6 @@ deployment:
       when: on_success
     - if: '$CI_COMMIT_REF_SLUG == "main"'  # Preprod Env
       variables:
-        TRIGGERED_BY_PARENT: 'true'
         ENV: 'preprod'
         OA_FRONTEND_VERSION: '$CI_COMMIT_REF_SLUG' # main branch
         INIT_DB_USER: true
@@ -144,7 +148,6 @@ deployment:
       when: on_success
     - if: '$CI_COMMIT_TAG'  # Production Env
       variables:
-        TRIGGERED_BY_PARENT: 'true'
         ENV: "production"
         OA_FRONTEND_VERSION: '$CI_COMMIT_TAG'
         INIT_DB_USER: false
@@ -154,7 +157,6 @@ deployment:
       when: never
     - when: manual  # Trigger manually if needed ( Feature Dev branch )
       variables:
-        TRIGGERED_BY_PARENT: 'true'
         ENV: "development"
         OA_FRONTEND_VERSION: '$CI_COMMIT_REF_SLUG'
         INIT_DB_USER: true
-- 
GitLab


From edc89ce0e42731ecae4f5f45fe2a8a46f27f220e Mon Sep 17 00:00:00 2001
From: Rachid Yahiaoui <rachid.yahiaoui@inra.fr>
Date: Tue, 21 Jan 2025 11:30:39 +0100
Subject: [PATCH 40/61] Improve GitLab CI : Centralized common variables for
 triggers

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f60695ec0..ef152e7ed 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -129,7 +129,7 @@ deployment:
     TRIGGERED_BY_PARENT: 'true'
     TRIGGERED_PROJECT_NAME: "$CI_PROJECT_NAME"
     TRIGGERED_USER_NAME: "$GITLAB_USER_NAME"
-    TRIGGERED_PROJECT_COMMIT_ID: "[\`${CI_COMMIT_SHA:0:8}\`]($CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA)"
+    TRIGGERED_PROJECT_COMMIT_ID: "[`${CI_COMMIT_SHA:0:8}`]($CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA)"
     TRIGGERED_PROJECT_BRANCH: "$CI_COMMIT_REF_NAME"
   rules:
     - if: '$CI_COMMIT_REF_SLUG == "develop"'  # Development Env
-- 
GitLab


From dc1455773c6ce9f9f206254fcc6e0b4d76071bc4 Mon Sep 17 00:00:00 2001
From: Rachid Yahiaoui <rachid.yahiaoui@inra.fr>
Date: Tue, 21 Jan 2025 13:31:40 +0100
Subject: [PATCH 41/61] Improve GitLab CI : Centralized common variables for
 triggers

---
 .gitlab-ci.yml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ef152e7ed..9fd8677a3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -129,7 +129,8 @@ deployment:
     TRIGGERED_BY_PARENT: 'true'
     TRIGGERED_PROJECT_NAME: "$CI_PROJECT_NAME"
     TRIGGERED_USER_NAME: "$GITLAB_USER_NAME"
-    TRIGGERED_PROJECT_COMMIT_ID: "[`${CI_COMMIT_SHA:0:8}`]($CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA)"
+    # TRIGGERED_PROJECT_COMMIT_ID: "[`${CI_COMMIT_SHA:0:8}`]($CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA)"
+    TRIGGERED_PROJECT_COMMIT_ID: "[\`${CI_COMMIT_SHA:0:8}\`]($CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA)"
     TRIGGERED_PROJECT_BRANCH: "$CI_COMMIT_REF_NAME"
   rules:
     - if: '$CI_COMMIT_REF_SLUG == "develop"'  # Development Env
-- 
GitLab


From ce263bc0165e0ec0f4d9911c52f12e9a6bd15793 Mon Sep 17 00:00:00 2001
From: Rachid Yahiaoui <rachid.yahiaoui@inra.fr>
Date: Tue, 21 Jan 2025 13:42:37 +0100
Subject: [PATCH 42/61] Improve GitLab CI : Centralized common variables for
 triggers

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9fd8677a3..a3188b8d1 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -130,7 +130,7 @@ deployment:
     TRIGGERED_PROJECT_NAME: "$CI_PROJECT_NAME"
     TRIGGERED_USER_NAME: "$GITLAB_USER_NAME"
     # TRIGGERED_PROJECT_COMMIT_ID: "[`${CI_COMMIT_SHA:0:8}`]($CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA)"
-    TRIGGERED_PROJECT_COMMIT_ID: "[\`${CI_COMMIT_SHA:0:8}\`]($CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA)"
+    TRIGGERED_PROJECT_COMMIT_ID: "[\\\`${CI_COMMIT_SHA:0:8}\\\`]($CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA)"
     TRIGGERED_PROJECT_BRANCH: "$CI_COMMIT_REF_NAME"
   rules:
     - if: '$CI_COMMIT_REF_SLUG == "develop"'  # Development Env
-- 
GitLab


From 79442c4e3a31ecf9a0625eb45a4171b6517562a9 Mon Sep 17 00:00:00 2001
From: Rachid Yahiaoui <rachid.yahiaoui@inra.fr>
Date: Tue, 21 Jan 2025 13:43:44 +0100
Subject: [PATCH 43/61] Improve GitLab CI : Centralized common variables for
 triggers

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a3188b8d1..d00622399 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -130,7 +130,7 @@ deployment:
     TRIGGERED_PROJECT_NAME: "$CI_PROJECT_NAME"
     TRIGGERED_USER_NAME: "$GITLAB_USER_NAME"
     # TRIGGERED_PROJECT_COMMIT_ID: "[`${CI_COMMIT_SHA:0:8}`]($CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA)"
-    TRIGGERED_PROJECT_COMMIT_ID: "[\\\`${CI_COMMIT_SHA:0:8}\\\`]($CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA)"
+    TRIGGERED_PROJECT_COMMIT_ID: "[\\`${CI_COMMIT_SHA:0:8}\\`](${CI_PROJECT_URL}/-/commit/${CI_COMMIT_SHA})"
     TRIGGERED_PROJECT_BRANCH: "$CI_COMMIT_REF_NAME"
   rules:
     - if: '$CI_COMMIT_REF_SLUG == "develop"'  # Development Env
-- 
GitLab


From 1cb12d53f47072181babb26ed36b532a87eabe30 Mon Sep 17 00:00:00 2001
From: Rachid Yahiaoui <rachid.yahiaoui@inra.fr>
Date: Tue, 21 Jan 2025 14:19:02 +0100
Subject: [PATCH 44/61] Improve GitLab CI : Centralized common variables for
 triggers

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d00622399..22f1808b7 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -130,7 +130,7 @@ deployment:
     TRIGGERED_PROJECT_NAME: "$CI_PROJECT_NAME"
     TRIGGERED_USER_NAME: "$GITLAB_USER_NAME"
     # TRIGGERED_PROJECT_COMMIT_ID: "[`${CI_COMMIT_SHA:0:8}`]($CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA)"
-    TRIGGERED_PROJECT_COMMIT_ID: "[\\`${CI_COMMIT_SHA:0:8}\\`](${CI_PROJECT_URL}/-/commit/${CI_COMMIT_SHA})"
+    TRIGGERED_PROJECT_COMMIT: "$CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA"
     TRIGGERED_PROJECT_BRANCH: "$CI_COMMIT_REF_NAME"
   rules:
     - if: '$CI_COMMIT_REF_SLUG == "develop"'  # Development Env
-- 
GitLab


From 95faac4a00bae501fa421d1a2568458910f4918e Mon Sep 17 00:00:00 2001
From: Rachid Yahiaoui <rachid.yahiaoui@inra.fr>
Date: Tue, 21 Jan 2025 14:33:24 +0100
Subject: [PATCH 45/61] Add TRIGGERED_PROJECT_COMMIT_TITLE variable to the
 CI/CD pipeline

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 22f1808b7..e2799a73d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -129,8 +129,8 @@ deployment:
     TRIGGERED_BY_PARENT: 'true'
     TRIGGERED_PROJECT_NAME: "$CI_PROJECT_NAME"
     TRIGGERED_USER_NAME: "$GITLAB_USER_NAME"
-    # TRIGGERED_PROJECT_COMMIT_ID: "[`${CI_COMMIT_SHA:0:8}`]($CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA)"
     TRIGGERED_PROJECT_COMMIT: "$CI_PROJECT_URL/-/commit/$CI_COMMIT_SHA"
+    TRIGGERED_PROJECT_COMMIT_TITLE: "$CI_COMMIT_TITLE"
     TRIGGERED_PROJECT_BRANCH: "$CI_COMMIT_REF_NAME"
   rules:
     - if: '$CI_COMMIT_REF_SLUG == "develop"'  # Development Env
-- 
GitLab


From b89733a69d6be469f1933a3b326916752c6ecfc6 Mon Sep 17 00:00:00 2001
From: Rachid Yahiaoui <rachid.yahiaoui@inra.fr>
Date: Tue, 21 Jan 2025 14:44:41 +0100
Subject: [PATCH 46/61] Update .gitlab-ci.yml file

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e2799a73d..1a5efa14a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,6 @@
 image: docker:stable
 
-# Pour l'utilisation de testcontainers
+# For using Testcontainers
 # https://www.testcontainers.org/supported_docker_environment/continuous_integration/gitlab_ci/
 services: &dind_definition
   - name: docker:dind
-- 
GitLab


From a829aa17954d145da2e7cbe08069ccd6d49e1594 Mon Sep 17 00:00:00 2001
From: Rachid Yahiaoui <rachid.yahiaoui@inra.fr>
Date: Tue, 21 Jan 2025 14:55:10 +0100
Subject: [PATCH 47/61] Update .gitlab-ci.yml

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1a5efa14a..4e5160770 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,6 @@
 image: docker:stable
 
-# For using Testcontainers
+# For using Testcontainers : 
 # https://www.testcontainers.org/supported_docker_environment/continuous_integration/gitlab_ci/
 services: &dind_definition
   - name: docker:dind
-- 
GitLab


From dac2b1dd43229c45d8aac72c92a11a8736b3b052 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Tue, 21 Jan 2025 16:01:56 +0100
Subject: [PATCH 48/61] =?UTF-8?q?order=20liste=20submission=20et=20ajout?=
 =?UTF-8?q?=20background=20color=20si=20select=20reste=20=C3=A0=20faire=20?=
 =?UTF-8?q?le=20remove=20de=20la=20class=20si=20non=20select?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../common/CollapseMenuOneSelect.vue          | 20 +++++++++++++++++--
 src/views/data/DataVersioningView.vue         | 15 ++++++++++++++
 2 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/src/components/common/CollapseMenuOneSelect.vue b/src/components/common/CollapseMenuOneSelect.vue
index 162129f08..095612ff2 100644
--- a/src/components/common/CollapseMenuOneSelect.vue
+++ b/src/components/common/CollapseMenuOneSelect.vue
@@ -2,7 +2,7 @@
   <div
     v-if="!option.children.length"
     :id="option.id"
-    @click="select(option, option.i18n[locale] || option.naturalKey)"
+    @click="select(option, option.i18n[locale] || option.naturalKey, option.id)"
     style="padding: 5px 16px"
   >
     <a>{{ option.i18n[locale] || option.naturalKey }}</a>
@@ -43,6 +43,7 @@ export default {
       type: Object,
       required: true,
     },
+    listSelect: Array,
   },
   emits: ["select-menu-item"],
   setup(props, { emit }) {
@@ -50,7 +51,19 @@ export default {
     const locale = services.internationalisationService.getLocale();
     const displayText = computed(() => props.option.i18n[locale] || props.option.naturalKey);
 
-    function select(option, localName) {
+    function select(option, localName, localID) {
+      if (props.listSelect && props.listSelect.length !== 0) {
+        if (
+          props.option.i18n[locale] === props.listSelect[0] ||
+          props.option.naturalKey === props.listSelect[0]
+        ) {
+          console.log(props.listSelect, document.getElementById(props.option.id));
+        }
+      }
+      const element = document.getElementById(localID);
+      if (element) {
+        element.classList.add('colorSelected');
+      }
       option.localName = option.localName || localName;
       emit("select-menu-item", option || { ...this.option, localName });
     }
@@ -68,6 +81,9 @@ export default {
 a {
   color: black;
 }
+.colorSelected {
+  background-color: rgba(0, 100, 100, 0.4);
+}
 
 .card {
   box-shadow: none;
diff --git a/src/views/data/DataVersioningView.vue b/src/views/data/DataVersioningView.vue
index 72242e60f..34d0137f9 100644
--- a/src/views/data/DataVersioningView.vue
+++ b/src/views/data/DataVersioningView.vue
@@ -26,6 +26,7 @@
         >
           <b-dropdown
             :ref="referenceScopesByData.id"
+            :id="referenceScopesByData.id"
             expanded
             max-height="500"
             scrollable
@@ -57,6 +58,7 @@
               :id="option.id"
               :key="optionKey"
               :option="option"
+              :list-select="requiredAuthorizationsLabels[referenceScopesByData.id]"
               @select-menu-item="selectAuthorization($event.type, $event)"
             ></CollapseMenuOneSelect>
           </b-dropdown>
@@ -574,6 +576,7 @@ export default {
                 refForAuth[reference] = ref;
                 changeReferenceScopes(refForAuth[reference].referenceScopes);
               }
+              sortedReferenceScope(referenceScopes);
             }
           }
         }
@@ -601,6 +604,18 @@ export default {
       }
     }
 
+    function sortedReferenceScope(referenceScope) {
+      for (let i = 0; i < referenceScope[props.dataId].length; i++) {
+        if (Object.keys(referenceScope[props.dataId][i].nodes).length !== 0) {
+          referenceScope[props.dataId][i].nodes = Object.fromEntries(
+            Object.entries(referenceScope[props.dataId][i].nodes)
+              .sort(([, a], [, b]) => a.naturalKey.localeCompare(b.naturalKey))
+              .map(([key, value], index) => [index, value, key])
+          );
+        }
+      }
+    }
+
     function nameSelectedTagList(nameTagList) {
       return i18n.t("dataTypesManagement.selected_filter", { key: nameTagList });
     }
-- 
GitLab


From b292a90c5312fb4af3894333c5ef8e8e4922dc40 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Wed, 22 Jan 2025 16:44:34 +0100
Subject: [PATCH 49/61] ajout function de modification de class en js

---
 .../common/CollapseMenuOneSelect.vue          | 25 +++++++++----------
 src/views/data/DataVersioningView.vue         | 12 +++++++++
 2 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/src/components/common/CollapseMenuOneSelect.vue b/src/components/common/CollapseMenuOneSelect.vue
index 095612ff2..caf78dcd1 100644
--- a/src/components/common/CollapseMenuOneSelect.vue
+++ b/src/components/common/CollapseMenuOneSelect.vue
@@ -2,8 +2,8 @@
   <div
     v-if="!option.children.length"
     :id="option.id"
-    @click="select(option, option.i18n[locale] || option.naturalKey, option.id)"
     style="padding: 5px 16px"
+    @click="select(option, option.i18n[locale] || option.naturalKey, option.id)"
   >
     <a>{{ option.i18n[locale] || option.naturalKey }}</a>
   </div>
@@ -25,6 +25,9 @@
           :key="child.id"
           :option="child"
           @select-menu-item="select"
+          @change-style-if-selected="
+            select(child, child.i18n[locale] || child.naturalKey, child.id)
+          "
         >
         </CollapseMenuOneSelect>
       </div>
@@ -45,35 +48,30 @@ export default {
     },
     listSelect: Array,
   },
-  emits: ["select-menu-item"],
+  emits: ["select-menu-item", "change-style-if-selected"],
   setup(props, { emit }) {
     const isOpen = ref(false);
     const locale = services.internationalisationService.getLocale();
     const displayText = computed(() => props.option.i18n[locale] || props.option.naturalKey);
 
     function select(option, localName, localID) {
-      if (props.listSelect && props.listSelect.length !== 0) {
-        if (
-          props.option.i18n[locale] === props.listSelect[0] ||
-          props.option.naturalKey === props.listSelect[0]
-        ) {
-          console.log(props.listSelect, document.getElementById(props.option.id));
-        }
-      }
       const element = document.getElementById(localID);
       if (element) {
-        element.classList.add('colorSelected');
+        console.log(localID);
+        emit("change-style-if-selected", localID);
+        element.classList.add("colorSelected");
       }
       option.localName = option.localName || localName;
       emit("select-menu-item", option || { ...this.option, localName });
     }
+
     return {
       select,
       isOpen,
       locale,
-      displayText,
+      displayText
     };
-  },
+  }
 };
 </script>
 
@@ -81,6 +79,7 @@ export default {
 a {
   color: black;
 }
+
 .colorSelected {
   background-color: rgba(0, 100, 100, 0.4);
 }
diff --git a/src/views/data/DataVersioningView.vue b/src/views/data/DataVersioningView.vue
index 34d0137f9..626504b9a 100644
--- a/src/views/data/DataVersioningView.vue
+++ b/src/views/data/DataVersioningView.vue
@@ -60,6 +60,7 @@
               :option="option"
               :list-select="requiredAuthorizationsLabels[referenceScopesByData.id]"
               @select-menu-item="selectAuthorization($event.type, $event)"
+              @change-style-if-selected="changeStyleIfSelected($event, referenceScopesByData.id)"
             ></CollapseMenuOneSelect>
           </b-dropdown>
         </b-field>
@@ -790,6 +791,16 @@ export default {
       }
     }
 
+    function changeStyleIfSelected(event, referenceScopesByDataId) {
+      console.log("selected", event, referenceScopesByDataId);
+      const regex = new RegExp("(.*)" + referenceScopesByDataId + "K(.*)");
+      Array.from(document.querySelectorAll("div.colorSelected"))
+        .filter(el => el.id && regex.test(el.id) && !el.id.includes(event))
+        .forEach((element) => {
+          element.classList.remove("colorSelected");
+        });
+    }
+
     function isReferenceScopesSelected() {
       if (selected && selected.requiredAuthorizations) {
         submissionListVisible.value =
@@ -982,6 +993,7 @@ export default {
       comment,
       currentDataset,
       internationalizeRequiredAuthorization,
+      changeStyleIfSelected,
       submissionListVisible,
     };
   },
-- 
GitLab


From e49b1e02b357ff7ff449ef89fb2daf158524b569 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Thu, 23 Jan 2025 15:02:08 +0100
Subject: [PATCH 50/61] fonction JS pour rendre dynamique de changement du
 background du select dans de dropDown de submission

---
 .../common/CollapseMenuOneSelect.vue          | 29 ++++++++++++-------
 src/views/data/DataVersioningView.vue         | 13 +--------
 2 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/src/components/common/CollapseMenuOneSelect.vue b/src/components/common/CollapseMenuOneSelect.vue
index caf78dcd1..246bca343 100644
--- a/src/components/common/CollapseMenuOneSelect.vue
+++ b/src/components/common/CollapseMenuOneSelect.vue
@@ -24,10 +24,8 @@
           v-for="child in option.children"
           :key="child.id"
           :option="child"
+          :id-reference-scope="idReferenceScope"
           @select-menu-item="select"
-          @change-style-if-selected="
-            select(child, child.i18n[locale] || child.naturalKey, child.id)
-          "
         >
         </CollapseMenuOneSelect>
       </div>
@@ -47,6 +45,7 @@ export default {
       required: true,
     },
     listSelect: Array,
+    idReferenceScope: String,
   },
   emits: ["select-menu-item", "change-style-if-selected"],
   setup(props, { emit }) {
@@ -54,13 +53,21 @@ export default {
     const locale = services.internationalisationService.getLocale();
     const displayText = computed(() => props.option.i18n[locale] || props.option.naturalKey);
 
-    function select(option, localName, localID) {
-      const element = document.getElementById(localID);
-      if (element) {
-        console.log(localID);
-        emit("change-style-if-selected", localID);
-        element.classList.add("colorSelected");
+    function changeStyleIfSelected(localID) {
+      const localElement = document.getElementById(localID);
+      if (localElement) {
+        console.log("selected", localID, props.idReferenceScope);
+        Array.from(document.querySelectorAll("div.colorSelected"))
+          .filter(el => el.id && el.id.includes(props.idReferenceScope + "K") && !el.id.includes(localID))
+          .forEach((element) => {
+            element.classList.remove("colorSelected");
+          });
+        localElement.classList.add("colorSelected");
       }
+    }
+
+    function select(option, localName, localID) {
+      changeStyleIfSelected(localID);
       option.localName = option.localName || localName;
       emit("select-menu-item", option || { ...this.option, localName });
     }
@@ -69,9 +76,9 @@ export default {
       select,
       isOpen,
       locale,
-      displayText
+      displayText,
     };
-  }
+  },
 };
 </script>
 
diff --git a/src/views/data/DataVersioningView.vue b/src/views/data/DataVersioningView.vue
index 626504b9a..afc7e53c2 100644
--- a/src/views/data/DataVersioningView.vue
+++ b/src/views/data/DataVersioningView.vue
@@ -59,8 +59,8 @@
               :key="optionKey"
               :option="option"
               :list-select="requiredAuthorizationsLabels[referenceScopesByData.id]"
+              :id-reference-scope="referenceScopesByData.id"
               @select-menu-item="selectAuthorization($event.type, $event)"
-              @change-style-if-selected="changeStyleIfSelected($event, referenceScopesByData.id)"
             ></CollapseMenuOneSelect>
           </b-dropdown>
         </b-field>
@@ -791,16 +791,6 @@ export default {
       }
     }
 
-    function changeStyleIfSelected(event, referenceScopesByDataId) {
-      console.log("selected", event, referenceScopesByDataId);
-      const regex = new RegExp("(.*)" + referenceScopesByDataId + "K(.*)");
-      Array.from(document.querySelectorAll("div.colorSelected"))
-        .filter(el => el.id && regex.test(el.id) && !el.id.includes(event))
-        .forEach((element) => {
-          element.classList.remove("colorSelected");
-        });
-    }
-
     function isReferenceScopesSelected() {
       if (selected && selected.requiredAuthorizations) {
         submissionListVisible.value =
@@ -993,7 +983,6 @@ export default {
       comment,
       currentDataset,
       internationalizeRequiredAuthorization,
-      changeStyleIfSelected,
       submissionListVisible,
     };
   },
-- 
GitLab


From 1e9b77cccba8f5f433d1bbe567cbb43feb1cb6ab Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Fri, 24 Jan 2025 10:56:41 +0100
Subject: [PATCH 51/61] modification de tous les switch en bouton radio

---
 .../common/provider/FilterNumberOrDate.vue    | 49 ++++++-----
 .../common/provider/FiltersDataCollapse.vue   |  3 +-
 src/locales/en.json                           |  2 +-
 src/locales/fr.json                           |  2 +-
 src/main.js                                   |  6 +-
 .../DataTypeAuthorizationsView.vue            | 35 +++++---
 src/views/data/DataTableView.vue              | 83 +++++++++++--------
 7 files changed, 109 insertions(+), 71 deletions(-)

diff --git a/src/components/common/provider/FilterNumberOrDate.vue b/src/components/common/provider/FilterNumberOrDate.vue
index f17ca8fef..35ffc08a7 100644
--- a/src/components/common/provider/FilterNumberOrDate.vue
+++ b/src/components/common/provider/FilterNumberOrDate.vue
@@ -1,13 +1,24 @@
 <template>
   <div class="inputStyle">
     <b-tooltip :label="$t('dataTypeAuthorizations.interval')" position="is-right">
-      <b-switch
-        v-model="isInterval"
-        size="is-small"
-        @click.native="changeValueSizeHeight(isInterval, isInterval ? -6 : 6)"
-      >
-        {{ isInterval ? $t("rules.for-interval") : $t("rules.for-value") }}
-      </b-switch>
+      <b-field style="margin-bottom: 1rem">
+        <b-radio-button
+          v-model="isInterval"
+          :native-value="true"
+          size="is-small"
+          type="is-primary is-outlined"
+        >
+          <span>{{ $t("rules.for-interval") }}</span>
+        </b-radio-button>
+        <b-radio-button
+          v-model="isInterval"
+          :native-value="false"
+          size="is-small"
+          type="is-primary is-outlined"
+        >
+          <span>{{ $t("rules.for-value") }}</span>
+        </b-radio-button>
+      </b-field>
     </b-tooltip>
     <div v-if="isInterval" class="rows">
       <InputDateInterval
@@ -76,7 +87,7 @@ export default {
   components: { InputNumber, InputNumberInterval, InputDateInterval, InputDate },
   emits: ["update:modelValue", "sizeHeight"],
   props: {
-    modelValue: Object,
+    modelValue: Object
   },
   setup(props, ctx) {
     watch(
@@ -132,7 +143,7 @@ export default {
       y: { pattern: "\\d", type: "date" },
       M: { pattern: "\\d", type: "date" },
       Z: { pattern: "[+-]\\d{4}", type: "date" },
-      G: { pattern: "[AB]D", type: "date" },
+      G: { pattern: "[AB]D", type: "date" }
     });
     const { refText: inputType, doChangeText: changeInputType } = useText("text");
     const { refRegex: pattern, doChangeRegex: changePattern } = useRegex();
@@ -189,14 +200,14 @@ export default {
       }
       let value = isInterval.value
         ? {
-            intervalValues: {
-              from: from.value,
-              to: to.value,
-            },
+          intervalValues: {
+            from: from.value,
+            to: to.value
           }
+        }
         : {
-            simpleValue: from.value,
-          };
+          simpleValue: from.value
+        };
       ctx.emit("update:modelValue", {
         ...props.modelValue,
         type: type.value,
@@ -204,7 +215,7 @@ export default {
         format: format.value,
         intervalValues: value.intervalValues,
         simpleValue: value.simpleValue,
-        isInterval: isInterval.value,
+        isInterval: isInterval.value
       });
     }
 
@@ -212,7 +223,7 @@ export default {
       isInterval.value = collapside;
       if (event) {
         ctx.emit("sizeHeight", {
-          value: event,
+          value: event
         });
       }
       return isInterval.value;
@@ -233,9 +244,9 @@ export default {
       fromDate,
       min,
       max,
-      isInterval,
+      isInterval
     };
-  },
+  }
 };
 </script>
 
diff --git a/src/components/common/provider/FiltersDataCollapse.vue b/src/components/common/provider/FiltersDataCollapse.vue
index 10b5f9a97..cb0f1c625 100644
--- a/src/components/common/provider/FiltersDataCollapse.vue
+++ b/src/components/common/provider/FiltersDataCollapse.vue
@@ -3,7 +3,8 @@
     <template #trigger="props">
       <div class="card-header" role="button">
         <p class="card-header-title" style="text-transform: capitalize">
-          {{ $t("applications.advancedFilter") }}
+          <b-icon icon="sliders-h"></b-icon>
+          <span>{{ $t("applications.advancedFilter") }}</span>
         </p>
         <a class="card-header-icon">
           <b-icon :icon="props.open ? 'chevron-up' : 'chevron-down'"></b-icon>
diff --git a/src/locales/en.json b/src/locales/en.json
index ad4c4992a..f15588959 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -120,7 +120,7 @@
   "applications": {
     "actions": "Actions",
     "additionalFile": "Additional files",
-    "advancedFilter": "Advanced search",
+    "advancedFilter": "Filter",
     "app_version": "Current version of {name} is: {version}",
     "app_update_version": "Version of {name} proposed is: {version}",
     "change": "Update",
diff --git a/src/locales/fr.json b/src/locales/fr.json
index c2c675108..91e0d660c 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -120,7 +120,7 @@
   "applications": {
     "actions": "Actions",
     "additionalFile": "Fichiers additionnels",
-    "advancedFilter": "Recherche avancée",
+    "advancedFilter": "Filtrer",
     "app_version": "Version actuelle de {name} est : {version}",
     "app_update_version": "Version de {name} proposée est : {version}",
     "change": "Mise à jour",
diff --git a/src/main.js b/src/main.js
index db8801a46..5cc374f65 100644
--- a/src/main.js
+++ b/src/main.js
@@ -82,7 +82,7 @@ import {
   faArrowRight,
   faExchangeAlt,
   faUserShield,
-  faCity,
+  faCity, faArrowsAltV, faArrowsAltH, faSlidersH, faUsers
 } from "@fortawesome/free-solid-svg-icons";
 import {
   faCalendar as farCalendar,
@@ -117,6 +117,10 @@ library.add(
   farTimesCircle
 );
 library.add(
+  faArrowsAltV,
+  faArrowsAltH,
+  faUsers,
+  faSlidersH,
   faUsersCog,
   faUserShield,
   faLink,
diff --git a/src/views/authorizations/DataTypeAuthorizationsView.vue b/src/views/authorizations/DataTypeAuthorizationsView.vue
index ea6054af7..8295e675c 100644
--- a/src/views/authorizations/DataTypeAuthorizationsView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationsView.vue
@@ -22,19 +22,28 @@
       <div class="row">
         <div class="columns" style="margin: 0">
           <div class="column is-2">
-            <b-switch
-              v-model="hasAuthorizationsByUsers"
-              :disabled="hasPublicAuthorizations"
-              passive-type="is-dark"
-              type="is-primary"
-              @input="updateTableAuthorizations"
-            >
-              {{
-                hasAuthorizationsByUsers
-                  ? $t("dataTypeAuthorizations.table-auth-users")
-                  : $t("dataTypeAuthorizations.table-auth-name")
-              }}
-            </b-switch>
+            <b-field>
+              <b-radio-button
+                v-model="hasAuthorizationsByUsers"
+                :disabled="hasPublicAuthorizations"
+                :native-value="true"
+                type="is-primary is-outlined"
+                @input="updateTableAuthorizations"
+              >
+                <b-icon icon="users"></b-icon>
+                <span>{{ $t("dataTypeAuthorizations.table-auth-users") }}</span>
+              </b-radio-button>
+              <b-radio-button
+                v-model="hasAuthorizationsByUsers"
+                :disabled="hasPublicAuthorizations"
+                :native-value="false"
+                type="is-primary is-outlined"
+                @input="updateTableAuthorizations"
+              >
+                <b-icon icon="key"></b-icon>
+                <span>{{ $t("dataTypeAuthorizations.table-auth-name") }}</span>
+              </b-radio-button>
+            </b-field>
           </div>
           <div class="column is-2">
             <b-checkbox
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index 9d3f83848..2c3a59536 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -8,9 +8,9 @@
     />
     <TitleAndDescription
       :application="application"
+      :local-title="$t('titles.references-data', { refName: application.localRefName })"
       :localDescription="application.localRefDescription"
       :localName="application.localRefName"
-      :local-title="$t('titles.references-data', { refName: application.localRefName })"
     />
     <div id="tagsCollapsereal" class="column">
       <TagsCollapse
@@ -33,22 +33,35 @@
       />
       <LoadingAnimate v-if="isLoading" :size="'is-large'"></LoadingAnimate>
       <div v-if="data && dataColumnsToBeShown && !isLoading && totalRows > 0">
-        <b-switch v-if="canHorizontalize" v-model="horizontalDisplay" @input="changeDisplay">
-          {{
-            horizontalDisplay
-              ? $t("dataTypesManagement.horizontalized")
-              : $t("dataTypesManagement.verticalized")
-          }}
-        </b-switch>
+        <b-field v-if="canHorizontalize">
+          <b-radio-button
+            v-model="horizontalDisplay"
+            :native-value="true"
+            type="is-dark"
+            @input="changeDisplay"
+          >
+            <b-icon icon="arrows-alt-h"></b-icon>
+            <span>{{ $t("dataTypesManagement.horizontalized") }}</span>
+          </b-radio-button>
+          <b-radio-button
+            v-model="horizontalDisplay"
+            :native-value="false"
+            type="is-dark"
+            @input="changeDisplay"
+          >
+            <b-icon icon="arrows-alt-v"></b-icon>
+            <span>{{ $t("dataTypesManagement.verticalized") }}</span>
+          </b-radio-button>
+        </b-field>
         <b-table
           id="filtreTable"
           :current-page="currentPage"
           :data="rows"
+          :height="tableHeight"
           :is-focusable="true"
           :is-hoverable="true"
           :per-page="params.limit"
           :sticky-header="true"
-          :height="tableHeight"
           striped
           style="padding-bottom: 20px; position: relative; z-index: 2"
         >
@@ -56,8 +69,8 @@
             v-for="column in dataColumnsToBeShown"
             :key="column.id"
             :field="column.id"
-            style="padding-bottom: 20px; position: relative; z-index: 2"
             sortable
+            style="padding-bottom: 20px; position: relative; z-index: 2"
           >
             <template v-slot:header>
               <div v-if="column.tags" class="column" style="padding: 0">
@@ -68,28 +81,28 @@
                 </TagsInfos>
                 <DatasPatternLink
                   v-if="'PatternComponent' === column.type"
-                  :with-qualifier="horizontalDisplay"
-                  :info="column.type === 'PatternComponent'"
                   :application="application"
-                  :value="
+                  :column-id="column.id"
+                  :column-title="column.id"
+                  :data-id="dataId"
+                  :info="column.type === 'PatternComponent'"
+                  :info-values="
                     column.getColumnQualifiersMap(
                       application,
                       column.horizontalDisplay ? dataId : column.componentKey,
                       rows[0]
                     )
                   "
-                  :column-id="column.id"
-                  :column-title="column.id"
-                  :info-values="
+                  :loaded-references-by-key="{}"
+                  :pattern-checker-date-ref="patternCheckerDateRef"
+                  :value="
                     column.getColumnQualifiersMap(
                       application,
                       column.horizontalDisplay ? dataId : column.componentKey,
                       rows[0]
                     )
                   "
-                  :loaded-references-by-key="{}"
-                  :pattern-checker-date-ref="patternCheckerDateRef"
-                  :data-id="dataId"
+                  :with-qualifier="horizontalDisplay"
                 ></DatasPatternLink>
                 <div v-else-if="'patternQualifierComponent' === column.type">
                   {{ column.getHeader(application, dataId) }}
@@ -127,8 +140,8 @@
                 :column="column"
                 :column-id="column.id"
                 :component="props.row"
-                :info-values="props.row.values[column.id]"
                 :displays-for-row="props.row.displaysForRow"
+                :info-values="props.row.values[column.id]"
                 :loaded-references-by-key="{}"
                 :multiplicity="multiplicity(column.id, props.row.values[column.id])"
                 :reference-type="addRefLinkedTo(column.id, column.linkedTo)"
@@ -168,7 +181,7 @@
         </b-table>
       </div>
       <div v-else>
-        <b-message type="is-primary" :closable="false" size="is-medium" has-icon>
+        <b-message :closable="false" has-icon size="is-medium" type="is-primary">
           {{ $tc("applications.register-rows", totalRows, { totalRows: totalRows }) }}
         </b-message>
       </div>
@@ -176,17 +189,17 @@
       <div class="buttons" style="margin-top: 16px">
         <!--        <b-button @click="loadExampleData">Afficher un exemple</b-button>-->
         <b-button
+          icon-left="download"
           style="margin-bottom: 15px; float: right"
           type="is-primary"
-          icon-left="download"
           @click.prevent="downloadResultSearch"
-          >{{ $t("dataTable.donwload-result") }}
+        >{{ $t("dataTable.donwload-result") }}
         </b-button>
       </div>
     </div>
 
     <div v-else-if="state === 'NO-RIGHTS'">
-      <b-message type="is-danger" :closable="false" size="is-medium" has-icon>
+      <b-message :closable="false" has-icon size="is-medium" type="is-danger">
         {{ $t("applications.no-right-for-application") }}
       </b-message>
       <b-button
@@ -198,7 +211,7 @@
       </b-button>
     </div>
     <div v-else>
-      <b-message type="is-primary" :closable="false" size="is-medium" has-icon>
+      <b-message :closable="false" has-icon size="is-medium" type="is-primary">
         {{ $tc("applications.register-rows", totalRows, { totalRows: totalRows }) }}
       </b-message>
     </div>
@@ -239,7 +252,7 @@ export default {
   name: "DataTableView",
   props: {
     applicationName: String,
-    dataId: String,
+    dataId: String
   },
   components: {
     TitleAndDescription,
@@ -252,7 +265,7 @@ export default {
     TagsCollapse,
     DatasLink,
     DatasManyLink,
-    DatasDynamicLink,
+    DatasDynamicLink
   },
   setup(props) {
     const loadExample = ref(true);
@@ -334,7 +347,7 @@ export default {
     });
 
     const hasTags = useBoolean(false).refBoolean;
-    const changeTags = function (tagsToChange) {
+    const changeTags = function(tagsToChange) {
       _changeTags({ ...tagsToChange });
       hasTags.value =
         tags.value &&
@@ -397,7 +410,7 @@ export default {
               `/applications/${props.applicationName}/${dataIsType}/${props.dataId}`
             ),
           () => app.$router.push(`/applications/${props.applicationName}/${dataIsType}`)
-        ),
+        )
       ]);
       changeColumns(services.tagService.toBeShown(tags.value, columns.value));
       changeTags(buildTagsColumns(application, columns.value, tags.value));
@@ -409,14 +422,14 @@ export default {
         changeApplication(
           await services.applicationService.getApplication(props.applicationName, [
             "CONFIGURATION",
-            "REFERENCETYPE",
+            "REFERENCETYPE"
           ])
         );
         changeApplication({
           ...services.internationalisationService.mergeInternationalization(application),
           localRefName: application.configuration.i18n.data[props.dataId].i18n.title[locale],
           localRefDescription:
-            application.configuration.i18n.data[props.dataId].i18n.description[locale],
+            application.configuration.i18n.data[props.dataId].i18n.description[locale]
         });
         totalRows.value =
           application.referenceSynthesis.find(
@@ -428,7 +441,7 @@ export default {
           {
             horizontalDisplay: horizontalDisplay.value,
             offset: params.offset,
-            limit: params.limit,
+            limit: params.limit
           },
           loadExample.value
         );
@@ -533,7 +546,7 @@ export default {
           .reduce((accumulator, component) => {
             accumulator.push(component);
             return accumulator;
-          }, []),
+          }, [])
       ];
       changeColumns(localColumns);
       if (rows.value) {
@@ -737,9 +750,9 @@ export default {
       tableHeight,
       loader,
       canHorizontalize,
-      horizontalDisplay,
+      horizontalDisplay
     };
-  },
+  }
 };
 </script>
 <style lang="scss" scoped>
-- 
GitLab


From a0217f595d62f1ea0d51036eb07f68833485fc57 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Fri, 24 Jan 2025 11:00:46 +0100
Subject: [PATCH 52/61] correction erreur orthographe

---
 src/locales/fr.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/locales/fr.json b/src/locales/fr.json
index 91e0d660c..8b54fd9ba 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -971,7 +971,7 @@
     "integer": "Le champ doit correspondre à une valeur entière",
     "regexp": "Le champ doit correspondre à l'expression régulière {pattern}",
     "not-null": "Le champ ne doit pas être vide",
-    "for-interval": "par interval",
+    "for-interval": "par intervalle",
     "for-value": "par valeur"
   },
   "tags": {
-- 
GitLab


From b7c87566f6a17b8820b2670aa5b3cd1676d934f6 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Fri, 24 Jan 2025 11:28:22 +0100
Subject: [PATCH 53/61] modification de la position du btn authorization

---
 src/components/common/TitleAndDescription.vue | 49 ++++++++++++++++++-
 .../common/provider/FilterNumberOrDate.vue    |  8 +--
 src/views/data/DatasManagementView.vue        | 19 ++-----
 3 files changed, 56 insertions(+), 20 deletions(-)

diff --git a/src/components/common/TitleAndDescription.vue b/src/components/common/TitleAndDescription.vue
index 60658e20e..6c5fb0d5a 100644
--- a/src/components/common/TitleAndDescription.vue
+++ b/src/components/common/TitleAndDescription.vue
@@ -1,4 +1,6 @@
 <script>
+import app from "@/main";
+
 export default {
   name: "TitleAndDescription",
   props: {
@@ -6,6 +8,35 @@ export default {
     localName: String,
     localDescription: String,
     localTitle: String,
+    applicationName: {
+      type: String,
+      required: false,
+    },
+    withAuth: {
+      type: Boolean,
+      required: false,
+    },
+    canCreateApplication: {
+      type: Boolean,
+      required: false,
+    },
+    canManagerApplication: {
+      type: Boolean,
+      required: false,
+    },
+    canManagerUser: {
+      type: Boolean,
+      required: false,
+    },
+  },
+  setup(props) {
+    function consultAuthorization() {
+      app.$router.push(`/applications/${props.applicationName}/authorizations`);
+    }
+
+    return {
+      consultAuthorization,
+    };
   },
 };
 </script>
@@ -15,7 +46,7 @@ export default {
     <slot name="label" v-bind:option="application">
       {{ localTitle || localName }}
     </slot>
-    <slot name="description" v-bind:option="application" v-if="localDescription">
+    <slot v-if="localDescription" name="description" v-bind:option="application">
       <sup style="font-size: 1.5em">
         <b-tooltip
           :label="$t('applications.description', { localDescription: localDescription })"
@@ -25,10 +56,24 @@ export default {
         </b-tooltip>
       </sup>
     </slot>
+    <slot
+      v-if="canCreateApplication || canManagerApplication || canManagerUser"
+      class="btn_auth_tooltip"
+    >
+      <b-tooltip :label="$t('dataTypesManagement.consult-authorization')" position="is-top">
+        <b-button
+          icon-left="key"
+          outlined
+          rounded
+          type="is-warning"
+          @click="consultAuthorization"
+        />
+      </b-tooltip>
+    </slot>
   </h1>
 </template>
 
-<style scoped lang="scss">
+<style lang="scss" scoped>
 .icon {
   vertical-align: text-top;
 }
diff --git a/src/components/common/provider/FilterNumberOrDate.vue b/src/components/common/provider/FilterNumberOrDate.vue
index 35ffc08a7..7de432294 100644
--- a/src/components/common/provider/FilterNumberOrDate.vue
+++ b/src/components/common/provider/FilterNumberOrDate.vue
@@ -4,19 +4,19 @@
       <b-field style="margin-bottom: 1rem">
         <b-radio-button
           v-model="isInterval"
-          :native-value="true"
+          :native-value="false"
           size="is-small"
           type="is-primary is-outlined"
         >
-          <span>{{ $t("rules.for-interval") }}</span>
+          <span>{{ $t("rules.for-value") }}</span>
         </b-radio-button>
         <b-radio-button
           v-model="isInterval"
-          :native-value="false"
+          :native-value="true"
           size="is-small"
           type="is-primary is-outlined"
         >
-          <span>{{ $t("rules.for-value") }}</span>
+          <span>{{ $t("rules.for-interval") }}</span>
         </b-radio-button>
       </b-field>
     </b-tooltip>
diff --git a/src/views/data/DatasManagementView.vue b/src/views/data/DatasManagementView.vue
index 59c67ea74..bc7350614 100644
--- a/src/views/data/DatasManagementView.vue
+++ b/src/views/data/DatasManagementView.vue
@@ -19,21 +19,12 @@
       "
       :localDescription="application.localDescription"
       :localName="application.localName"
+      :with-auth="true"
+      :can-create-application="canCreateApplication"
+      :can-manager-application="canManagerApplication"
+      :can-manager-user="canManagerUser"
+      :application-name="applicationName"
     />
-    <div
-      v-if="canCreateApplication || canManagerApplication || canManagerUser"
-      class="btn_auth_tooltip"
-    >
-      <b-tooltip :label="$t('dataTypesManagement.consult-authorization')" position="is-top">
-        <b-button
-          icon-left="key"
-          outlined
-          rounded
-          type="is-warning"
-          @click="consultAuthorization"
-        />
-      </b-tooltip>
-    </div>
     <div v-if="errorsMessages.length !== 0" style="margin: 10px">
       <ShowErrors
         :errors-messages="errorsMessages"
-- 
GitLab


From 2df36dfe71b9e484e2fa2835f22eeb8b67af7c0f Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Tue, 28 Jan 2025 09:19:04 +0100
Subject: [PATCH 54/61] =?UTF-8?q?r=C3=A9solution=20checkbox=20autorisation?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../common/CollapseMenuOneSelect.vue          |  5 +-
 .../authorization/AuthorizationForScope.vue   |  2 +-
 .../AuthorizationTableForOneDataType.vue      | 83 ++++++++++++-------
 .../AuthorizationsForNoAuthorization.vue      | 20 +++--
 .../common/provider/FilterNumberOrDate.vue    | 24 +++---
 src/locales/en.json                           |  2 +-
 src/main.js                                   |  6 +-
 .../DataTypeAuthorizationInfoView.vue         |  2 +-
 .../DataTypeAuthorizationsView.vue            | 35 +++++---
 src/views/data/DataTableView.vue              | 22 ++---
 10 files changed, 123 insertions(+), 78 deletions(-)

diff --git a/src/components/common/CollapseMenuOneSelect.vue b/src/components/common/CollapseMenuOneSelect.vue
index 246bca343..c78dc3a4d 100644
--- a/src/components/common/CollapseMenuOneSelect.vue
+++ b/src/components/common/CollapseMenuOneSelect.vue
@@ -58,7 +58,10 @@ export default {
       if (localElement) {
         console.log("selected", localID, props.idReferenceScope);
         Array.from(document.querySelectorAll("div.colorSelected"))
-          .filter(el => el.id && el.id.includes(props.idReferenceScope + "K") && !el.id.includes(localID))
+          .filter(
+            (el) =>
+              el.id && el.id.includes(props.idReferenceScope + "K") && !el.id.includes(localID)
+          )
           .forEach((element) => {
             element.classList.remove("colorSelected");
           });
diff --git a/src/components/common/authorization/AuthorizationForScope.vue b/src/components/common/authorization/AuthorizationForScope.vue
index c59d01069..6b27ca67b 100644
--- a/src/components/common/authorization/AuthorizationForScope.vue
+++ b/src/components/common/authorization/AuthorizationForScope.vue
@@ -33,7 +33,7 @@
             :authorization="getAuthorization(data.id)"
             :data="data"
             :data-name="data.id"
-            :has-dependency="hasDependencies.includes(data.id)"
+            :has-dependencies="hasDependencies"
             :list-column-name="columnsName"
             :reference-scope="referencesScopes[data.id]"
             :type-time-scope="typeTimeScope(data.id)"
diff --git a/src/components/common/authorization/AuthorizationTableForOneDataType.vue b/src/components/common/authorization/AuthorizationTableForOneDataType.vue
index 31a88aa18..12d7b1d49 100644
--- a/src/components/common/authorization/AuthorizationTableForOneDataType.vue
+++ b/src/components/common/authorization/AuthorizationTableForOneDataType.vue
@@ -29,23 +29,27 @@ export default {
     withTimeScope: Boolean,
     typeTimeScope: String,
     referenceScope: Array,
-    hasDependency: Boolean,
+    hasDependencies: {
+      type: Array,
+      default: () => [],
+    },
   },
   setup(props, context) {
-    const checkboxValues = ref({});
+    let localOperationtypes = new Set([]);
+    const operationtypes = computed(() => props.authorization?.operationTypes || Array.from(localOperationtypes));
     const selectedValuesReference = computed(() =>
       props.authorization?.requiredAuthorizations ? props.authorization?.requiredAuthorizations : {}
     );
     const locale = services.internationalisationService.getLocale();
 
-    // Fonction pour initialiser checkboxValues
-    const initializeCheckboxValues = () => {
-      if (props.authorization && props.authorization.operationTypes) {
-        props.authorization.operationTypes.forEach((operationType) => {
-          checkboxValues.value[`${props.dataName}___${operationType}`] = true;
-        });
-      }
-    };
+    const isCheckboxChecked = (datatypeId, key) =>
+      key === "extraction" && props.hasDependencies.includes(datatypeId)
+        ? true
+        : (operationtypes.value ? operationtypes.value.includes(key) || Array.from(localOperationtypes).includes(key) : false);
+
+    const isCheckboxDisabled = (datatypeId, key) =>
+      key === "extraction" && props.hasDependencies.includes(datatypeId);
+
     const dateFromArray = (arrayDate) => {
       if (arrayDate && (arrayDate[0] === -999999999 || arrayDate[0] === 999999999)) {
         return null;
@@ -59,37 +63,52 @@ export default {
     const getToDate = computed(() => dateFromArray(props.authorization?.toDay));
     const hasExtraction = computed(
       () =>
-        props.authorization.operationTypes &&
-        ((props.authorization.operationTypes.has &&
-          props.authorization.operationTypes.has("extraction")) ||
-          (props.authorization.operationTypes.includes &&
-            props.authorization.operationTypes.includes("extraction")))
+        props.authorization?.operationTypes &&
+        ((props.authorization?.operationTypes.has &&
+          props.authorization?.operationTypes.has("extraction")) ||
+          (props.authorization?.operationTypes.includes &&
+            props.authorization?.operationTypes.includes("extraction")))
     );
     const localHasExtraction = ref(false);
     const modifyOperationType = (event, name) => {
-      let operationtypes = new Set();
-      for (const operationtype of props.authorization?.operationTypes || new Set()) {
-        operationtypes.add(operationtype);
-      }
-      if (!event) {
-        operationtypes.delete(name);
+      localOperationtypes = new Set(operationtypes.value || []);
+      if (event) {
+        if (name === "delete") {
+          localOperationtypes.add("depot");
+          localOperationtypes.add("publication");
+          localOperationtypes.add("extraction");
+        } else if (name === "publication") {
+          localOperationtypes.add("depot");
+          localOperationtypes.add("delete");
+          localOperationtypes.add("extraction");
+        }
+        localOperationtypes.add(name);
       } else {
-        operationtypes.add(name);
+        if (name === "delete") {
+          localOperationtypes.delete("depot");
+          localOperationtypes.delete("publication");
+          localOperationtypes.delete("extraction");
+        } else if (name === "publication") {
+          localOperationtypes.delete("depot");
+          localOperationtypes.delete("delete");
+          localOperationtypes.delete("extraction");
+        }
+        localOperationtypes.delete(name);
       }
-      context.emit("update:operation-type", operationtypes);
+      context.emit("update:operation-type", Array.from(localOperationtypes));
     };
+
     onUpdated(() => {
       localHasExtraction.value =
-        (Array.isArray(props.authorization.operationTypes)
-          ? props.authorization.operationTypes.includes("extraction")
-          : props.authorization.operationTypes.has("extraction")) &&
+        (Array.isArray(props.authorization?.operationTypes)
+          ? props.authorization?.operationTypes.includes("extraction")
+          : props.authorization?.operationTypes.has("extraction")) &&
         Object.keys(props.authorization).includes("timeScope");
       context.emit("update:has-extraction", localHasExtraction.value);
+      localOperationtypes = props.authorization?.operationTypes || Array.from(localOperationtypes);
     });
-    const displayNodeTagHierarchical = ref({});
 
-    // Appeler la fonction d'initialisation
-    initializeCheckboxValues();
+    const displayNodeTagHierarchical = ref({});
 
     function displayNodeTag(referenceScopeNode, hierarchicalTagName) {
       if (referenceScopeNode.id === hierarchicalTagName) {
@@ -133,7 +152,6 @@ export default {
 
     return {
       selectedValuesReference,
-      checkboxValues,
       locale,
       getFromDate,
       getToDate,
@@ -142,6 +160,8 @@ export default {
       localHasExtraction,
       rootReferenceScopeSelected,
       displayNodeTagHierarchical,
+      isCheckboxChecked,
+      isCheckboxDisabled,
     };
   },
 };
@@ -166,7 +186,8 @@ export default {
           <tr>
             <td v-for="(column, key) in listColumnName" :key="dataName + '___' + key">
               <b-checkbox
-                v-model="checkboxValues[data.id + '___' + key]"
+                :disabled="isCheckboxDisabled(data.id, key)"
+                :value="isCheckboxChecked(data.id, key)"
                 @input="modifyOperationType($event, key)"
               >
               </b-checkbox>
diff --git a/src/components/common/authorization/AuthorizationsForNoAuthorization.vue b/src/components/common/authorization/AuthorizationsForNoAuthorization.vue
index 8eff67267..c9f31b887 100644
--- a/src/components/common/authorization/AuthorizationsForNoAuthorization.vue
+++ b/src/components/common/authorization/AuthorizationsForNoAuthorization.vue
@@ -14,9 +14,9 @@
           <td>{{ dataType.name }}</td>
           <td v-for="(column, key) in listColumnName" :key="`${dataType.id}-${key}`">
             <b-checkbox
-              :value="isCheckboxChecked(dataType.id, key)"
               :disabled="isCheckboxDisabled(dataType.id, key)"
               :title="getCheckboxTitle(dataType.id, key)"
+              :value="isCheckboxChecked(dataType.id, key)"
               @input="modifyOperationType($event, dataType.id, key)"
             />
           </td>
@@ -66,15 +66,21 @@ export default {
 
     const modifyOperationType = (event, datatype, name) => {
       const authorization = { ...props.authorization };
-      const operationtypes = new Set(authorization[datatype]?.operationTypes || []);
-
+      const localOperationtypes = new Set(authorization[datatype]?.operationTypes || []);
       if (event) {
-        operationtypes.add(name);
+        if (name === "delete") {
+          localOperationtypes.add("depot");
+          localOperationtypes.add("extraction");
+        }
+        localOperationtypes.add(name);
       } else {
-        operationtypes.delete(name);
+        if (name === "delete") {
+          localOperationtypes.delete("depot");
+          localOperationtypes.delete("extraction");
+        }
+        localOperationtypes.delete(name);
       }
-
-      authorization[datatype] = { operationTypes: Array.from(operationtypes) };
+      authorization[datatype] = { operationTypes: Array.from(localOperationtypes) };
       emit("update:authorization", authorization);
     };
 
diff --git a/src/components/common/provider/FilterNumberOrDate.vue b/src/components/common/provider/FilterNumberOrDate.vue
index 7de432294..6a1cdbfb5 100644
--- a/src/components/common/provider/FilterNumberOrDate.vue
+++ b/src/components/common/provider/FilterNumberOrDate.vue
@@ -87,7 +87,7 @@ export default {
   components: { InputNumber, InputNumberInterval, InputDateInterval, InputDate },
   emits: ["update:modelValue", "sizeHeight"],
   props: {
-    modelValue: Object
+    modelValue: Object,
   },
   setup(props, ctx) {
     watch(
@@ -143,7 +143,7 @@ export default {
       y: { pattern: "\\d", type: "date" },
       M: { pattern: "\\d", type: "date" },
       Z: { pattern: "[+-]\\d{4}", type: "date" },
-      G: { pattern: "[AB]D", type: "date" }
+      G: { pattern: "[AB]D", type: "date" },
     });
     const { refText: inputType, doChangeText: changeInputType } = useText("text");
     const { refRegex: pattern, doChangeRegex: changePattern } = useRegex();
@@ -200,14 +200,14 @@ export default {
       }
       let value = isInterval.value
         ? {
-          intervalValues: {
-            from: from.value,
-            to: to.value
+            intervalValues: {
+              from: from.value,
+              to: to.value,
+            },
           }
-        }
         : {
-          simpleValue: from.value
-        };
+            simpleValue: from.value,
+          };
       ctx.emit("update:modelValue", {
         ...props.modelValue,
         type: type.value,
@@ -215,7 +215,7 @@ export default {
         format: format.value,
         intervalValues: value.intervalValues,
         simpleValue: value.simpleValue,
-        isInterval: isInterval.value
+        isInterval: isInterval.value,
       });
     }
 
@@ -223,7 +223,7 @@ export default {
       isInterval.value = collapside;
       if (event) {
         ctx.emit("sizeHeight", {
-          value: event
+          value: event,
         });
       }
       return isInterval.value;
@@ -244,9 +244,9 @@ export default {
       fromDate,
       min,
       max,
-      isInterval
+      isInterval,
     };
-  }
+  },
 };
 </script>
 
diff --git a/src/locales/en.json b/src/locales/en.json
index f15588959..80008636c 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -226,7 +226,7 @@
     "localization": "Localisation",
     "modify": "Modify authorization",
     "modifyRequests": "Modify authorizations requests",
-    "name-authorization": "Authorizations name",
+    "name": "Authorizations name",
     "name-authorization-placeholder": "Type the authorization name",
     "comment-authorization-placeholder": "Type the authorization comment",
     "no-data": "No authorisation is defined",
diff --git a/src/main.js b/src/main.js
index 5cc374f65..42d968d30 100644
--- a/src/main.js
+++ b/src/main.js
@@ -82,7 +82,11 @@ import {
   faArrowRight,
   faExchangeAlt,
   faUserShield,
-  faCity, faArrowsAltV, faArrowsAltH, faSlidersH, faUsers
+  faCity,
+  faArrowsAltV,
+  faArrowsAltH,
+  faSlidersH,
+  faUsers,
 } from "@fortawesome/free-solid-svg-icons";
 import {
   faCalendar as farCalendar,
diff --git a/src/views/authorizations/DataTypeAuthorizationInfoView.vue b/src/views/authorizations/DataTypeAuthorizationInfoView.vue
index 02889d270..d0931d7fe 100644
--- a/src/views/authorizations/DataTypeAuthorizationInfoView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationInfoView.vue
@@ -26,7 +26,7 @@
           vid="name"
         >
           <b-field
-            :label="$t('dataTypeAuthorizations.name-authorization')"
+            :label="$t('dataTypeAuthorizations.name')"
             :message="errors[0]"
             :type="{
               'is-danger': errors && errors.length > 0,
diff --git a/src/views/authorizations/DataTypeAuthorizationsView.vue b/src/views/authorizations/DataTypeAuthorizationsView.vue
index 8295e675c..6a625b4d3 100644
--- a/src/views/authorizations/DataTypeAuthorizationsView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationsView.vue
@@ -8,20 +8,20 @@
     />
     <TitleAndDescription
       :application="application"
-      :localDescription="application.localRefDescription"
-      :localName="application.localName || application.name"
       :local-title="
         $t('titles.data-type-authorizations', {
           dataType: application.localName || application.name,
           type: 'autorisation',
         })
       "
+      :localDescription="application.localRefDescription"
+      :localName="application.localName || application.name"
     />
 
     <div class="rows">
       <div class="row">
         <div class="columns" style="margin: 0">
-          <div class="column is-2">
+          <div class="column is-4">
             <b-field>
               <b-radio-button
                 v-model="hasAuthorizationsByUsers"
@@ -55,7 +55,7 @@
               {{ $t("dataTypeAuthorizations.table-auth-public") }}
             </b-checkbox>
           </div>
-          <div class="column is-offset-6 is-2" v-if="isApplicationManager">
+          <div v-if="isApplicationManager" class="column is-offset-4 is-2">
             <b-button icon-left="plus" type="is-primary is-right" @click="addAuthorization">
               {{ $t("dataTypeAuthorizations.add-auhtorization") }}
             </b-button>
@@ -98,7 +98,7 @@
               {{ $t("dataTypeAuthorizations.table-auth-users-all-user") }}
             </b-radio>
           </div>
-          <div class="column is-offset-4 is-2" v-if="isApplicationManager">
+          <div v-if="isApplicationManager" class="column is-offset-4 is-2">
             <b-button
               icon-left="plus"
               outlined
@@ -115,12 +115,12 @@
     <div class="columns">
       <!-- table des autorisations pas nom d'utilisateur -->
       <b-table
-        class="column"
         v-if="hasAuthorizationsByUsers"
         :data="listAuthorizationsByUsersBasedOnAuth"
         :paginated="true"
         :per-page="perPage"
         :striped="true"
+        class="column"
         default-sort="row.name"
         default-sort-direction="asc"
         height="100%"
@@ -268,12 +268,12 @@
                       >
                         <DetailAuthorizationModalCard
                           v-model="isCardModalActive"
+                          :application="application"
                           :authorization="currentAuthorizationInModal"
                           :is-loading="isLoadingModal"
-                          :open="isCardModalActive"
-                          :application="application"
                           :lang="lang"
                           :list-column-name="listColumnName"
+                          :open="isCardModalActive"
                         >
                         </DetailAuthorizationModalCard>
                       </b-modal>
@@ -287,12 +287,12 @@
       </b-table>
       <!-- table des autorisations pas nom d'autorisation -->
       <b-table
-        class="column"
         v-else
         :data="authorizations"
         :paginated="true"
         :per-page="perPage"
         :striped="true"
+        class="column"
         default-sort="row.name"
         default-sort-direction="asc"
         height="100%"
@@ -349,8 +349,8 @@
                 >
                   <a class="card-header-icon" style="padding-left: 0; padding-right: 0">
                     <b-button
-                      class="show-check-details"
                       :disabled="!isApplicationManager"
+                      class="show-check-details"
                       icon-left="times-circle"
                       size="is-small"
                       style="
@@ -746,11 +746,22 @@ export default {
               Object.values(authorizationForUser.authorizationResults || []).some((a) => a.admin)
           );
         }*/
+        let user = services.loginService.getAuthenticatedUser();
         changeIsApplicationManager(
-          services.loginService.getAuthenticatedUser().isApplicationManager(application.id)
+          application?.currentApplicationUserRolesResult?.applicationRoles.includes(
+            "applicationManager"
+          ) ||
+            user.currentUserRoles.memberOf.filter((role) =>
+              role.includes(application.id + "_applicationManager")
+            ).length === 1
         );
         changeIsUserManager(
-          services.loginService.getAuthenticatedUser().isUserManager(application.id)
+          application?.currentApplicationUserRolesResult?.applicationRoles.includes(
+            "userManager"
+          ) ||
+            user.currentUserRoles.memberOf.filter((role) =>
+              role.includes(application.id + "_userManager")
+            ).length === 1
         );
         let localeListAllUsers = await services.authorizationService.getAuthorizationGrantableInfos(
           props.applicationName
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index 2c3a59536..86268ac27 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -193,7 +193,7 @@
           style="margin-bottom: 15px; float: right"
           type="is-primary"
           @click.prevent="downloadResultSearch"
-        >{{ $t("dataTable.donwload-result") }}
+          >{{ $t("dataTable.donwload-result") }}
         </b-button>
       </div>
     </div>
@@ -252,7 +252,7 @@ export default {
   name: "DataTableView",
   props: {
     applicationName: String,
-    dataId: String
+    dataId: String,
   },
   components: {
     TitleAndDescription,
@@ -265,7 +265,7 @@ export default {
     TagsCollapse,
     DatasLink,
     DatasManyLink,
-    DatasDynamicLink
+    DatasDynamicLink,
   },
   setup(props) {
     const loadExample = ref(true);
@@ -347,7 +347,7 @@ export default {
     });
 
     const hasTags = useBoolean(false).refBoolean;
-    const changeTags = function(tagsToChange) {
+    const changeTags = function (tagsToChange) {
       _changeTags({ ...tagsToChange });
       hasTags.value =
         tags.value &&
@@ -410,7 +410,7 @@ export default {
               `/applications/${props.applicationName}/${dataIsType}/${props.dataId}`
             ),
           () => app.$router.push(`/applications/${props.applicationName}/${dataIsType}`)
-        )
+        ),
       ]);
       changeColumns(services.tagService.toBeShown(tags.value, columns.value));
       changeTags(buildTagsColumns(application, columns.value, tags.value));
@@ -422,14 +422,14 @@ export default {
         changeApplication(
           await services.applicationService.getApplication(props.applicationName, [
             "CONFIGURATION",
-            "REFERENCETYPE"
+            "REFERENCETYPE",
           ])
         );
         changeApplication({
           ...services.internationalisationService.mergeInternationalization(application),
           localRefName: application.configuration.i18n.data[props.dataId].i18n.title[locale],
           localRefDescription:
-            application.configuration.i18n.data[props.dataId].i18n.description[locale]
+            application.configuration.i18n.data[props.dataId].i18n.description[locale],
         });
         totalRows.value =
           application.referenceSynthesis.find(
@@ -441,7 +441,7 @@ export default {
           {
             horizontalDisplay: horizontalDisplay.value,
             offset: params.offset,
-            limit: params.limit
+            limit: params.limit,
           },
           loadExample.value
         );
@@ -546,7 +546,7 @@ export default {
           .reduce((accumulator, component) => {
             accumulator.push(component);
             return accumulator;
-          }, [])
+          }, []),
       ];
       changeColumns(localColumns);
       if (rows.value) {
@@ -750,9 +750,9 @@ export default {
       tableHeight,
       loader,
       canHorizontalize,
-      horizontalDisplay
+      horizontalDisplay,
     };
-  }
+  },
 };
 </script>
 <style lang="scss" scoped>
-- 
GitLab


From 970ee6df9170af3d55523582d6a86e00ead6d592 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Tue, 28 Jan 2025 10:59:28 +0100
Subject: [PATCH 55/61] =?UTF-8?q?ajout=20des=20data=20manquant=20dans=20la?=
 =?UTF-8?q?=20liste=20des=20data=20de=20la=20cr=C3=A9ation=20d'une=20autor?=
 =?UTF-8?q?isation?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../application/ApplicationCard.vue           |  2 +-
 .../AuthorizationTableForOneDataType.vue      |  8 +-
 .../common/provider/OreInputDate.vue          |  2 +-
 src/components/datas/DatasLink.vue            |  2 +-
 src/components/datas/DatasManyLink.vue        |  2 +-
 src/composable/application/data.js            | 38 +++++++++
 .../{DatePattern.js => datePattern.js}        |  0
 src/views/application/ApplicationInfoView.vue |  2 +-
 .../DataTypeAuthorizationInfoView.vue         | 77 ++++---------------
 src/views/data/DataTableView.vue              |  2 +-
 src/views/data/DataVersioningView.vue         |  2 +-
 11 files changed, 68 insertions(+), 69 deletions(-)
 create mode 100644 src/composable/application/data.js
 rename src/composable/application/{DatePattern.js => datePattern.js} (100%)

diff --git a/src/components/application/ApplicationCard.vue b/src/components/application/ApplicationCard.vue
index 32e2c3039..8ecaf3f32 100644
--- a/src/components/application/ApplicationCard.vue
+++ b/src/components/application/ApplicationCard.vue
@@ -2,7 +2,7 @@
 import useText from "@/composable/components/text";
 import useBoolean from "@/composable/components/boolean";
 import { useRedirections } from "@/composable/applications/useFunction";
-import { formatedDateArray } from "@/composable/application/DatePattern";
+import { formatedDateArray } from "@/composable/application/datePattern";
 import { onMounted, ref } from "vue";
 import app from "@/main";
 import DetailApplicationModalCard from "@/components/application/DetailApplicationModalCard.vue";
diff --git a/src/components/common/authorization/AuthorizationTableForOneDataType.vue b/src/components/common/authorization/AuthorizationTableForOneDataType.vue
index 12d7b1d49..3307272e3 100644
--- a/src/components/common/authorization/AuthorizationTableForOneDataType.vue
+++ b/src/components/common/authorization/AuthorizationTableForOneDataType.vue
@@ -36,7 +36,9 @@ export default {
   },
   setup(props, context) {
     let localOperationtypes = new Set([]);
-    const operationtypes = computed(() => props.authorization?.operationTypes || Array.from(localOperationtypes));
+    const operationtypes = computed(
+      () => props.authorization?.operationTypes || Array.from(localOperationtypes)
+    );
     const selectedValuesReference = computed(() =>
       props.authorization?.requiredAuthorizations ? props.authorization?.requiredAuthorizations : {}
     );
@@ -45,7 +47,9 @@ export default {
     const isCheckboxChecked = (datatypeId, key) =>
       key === "extraction" && props.hasDependencies.includes(datatypeId)
         ? true
-        : (operationtypes.value ? operationtypes.value.includes(key) || Array.from(localOperationtypes).includes(key) : false);
+        : operationtypes.value
+        ? operationtypes.value.includes(key) || Array.from(localOperationtypes).includes(key)
+        : false;
 
     const isCheckboxDisabled = (datatypeId, key) =>
       key === "extraction" && props.hasDependencies.includes(datatypeId);
diff --git a/src/components/common/provider/OreInputDate.vue b/src/components/common/provider/OreInputDate.vue
index 13887b961..581c9bee2 100644
--- a/src/components/common/provider/OreInputDate.vue
+++ b/src/components/common/provider/OreInputDate.vue
@@ -45,7 +45,7 @@ import moment from "moment";
 import { extend, ValidationProvider } from "vee-validate";
 import { watch, ref, reactive } from "vue";
 import InputDate from "@/components/common/provider/InputDate.vue";
-import { datePatternLang, parseDate } from "@/composable/application/DatePattern";
+import { datePatternLang, parseDate } from "@/composable/application/datePattern";
 
 export default {
   name: "OreInputDate",
diff --git a/src/components/datas/DatasLink.vue b/src/components/datas/DatasLink.vue
index 2b6b34628..896f7e61d 100644
--- a/src/components/datas/DatasLink.vue
+++ b/src/components/datas/DatasLink.vue
@@ -104,7 +104,7 @@ import LoadingAnimate from "@/components/common/LoadingAnimate.vue";
 import { inject, ref, watch } from "vue";
 import useBoolean from "@/composable/components/boolean";
 import useObject from "@/composable/components/object";
-import { datePatternLang } from "../../composable/application/DatePattern";
+import { datePatternLang } from "../../composable/application/datePattern";
 
 export default {
   name: "DatasLink",
diff --git a/src/components/datas/DatasManyLink.vue b/src/components/datas/DatasManyLink.vue
index 8e398e391..c8a6ebe42 100644
--- a/src/components/datas/DatasManyLink.vue
+++ b/src/components/datas/DatasManyLink.vue
@@ -62,7 +62,7 @@
 import services from "@/composable/services";
 import DatasLink from "@/components/datas/DatasLink.vue";
 import DatasDynamicLink from "@/components/datas/DatasDynamicLink.vue";
-import { datePatternLang } from "@/composable/application/DatePattern";
+import { datePatternLang } from "@/composable/application/datePattern";
 import { computed, inject, onMounted, ref } from "vue";
 
 export default {
diff --git a/src/composable/application/data.js b/src/composable/application/data.js
new file mode 100644
index 000000000..9b4f9250f
--- /dev/null
+++ b/src/composable/application/data.js
@@ -0,0 +1,38 @@
+import services from "@/composable/services";
+
+export function allDataName(node, nodeNames) {
+  if (node.nodeName) {
+    nodeNames.push(node.nodeName);
+  }
+  if (node.children && Array.isArray(node.children) && Array.isArray(node.children).length !== 0) {
+    for (let localChild of node.children) {
+      allDataName(localChild, nodeNames);
+    }
+  }
+  return nodeNames;
+}
+
+export function createListData(listDataNodeNames, application) {
+  return {
+    withScope: listDataNodeNames
+      .filter((name) => application.configuration.dataDescription[name].authorization)
+      .reduce((acc, data) => {
+        acc[data] = {
+          id: data,
+          name:
+            services.internationalisationService.localeReferenceNames(data, application) || data,
+        };
+        return acc;
+      }, {}),
+    withoutScope: listDataNodeNames
+      .filter((name) => application.configuration.dataDescription[name].authorization === null)
+      .reduce((acc, data) => {
+        acc[data] = {
+          id: data,
+          name:
+            services.internationalisationService.localeReferenceNames(data, application) || data,
+        };
+        return acc;
+      }, {}),
+  };
+}
diff --git a/src/composable/application/DatePattern.js b/src/composable/application/datePattern.js
similarity index 100%
rename from src/composable/application/DatePattern.js
rename to src/composable/application/datePattern.js
diff --git a/src/views/application/ApplicationInfoView.vue b/src/views/application/ApplicationInfoView.vue
index 8b82789c4..7e5dae0f9 100644
--- a/src/views/application/ApplicationInfoView.vue
+++ b/src/views/application/ApplicationInfoView.vue
@@ -10,7 +10,7 @@ import app, { i18n } from "@/main";
 import useObject from "@/composable/components/object";
 import useBoolean from "@/composable/components/boolean";
 import DetailApplicationModalCard from "@/components/application/DetailApplicationModalCard.vue";
-import { formatedDateArray } from "../../composable/application/DatePattern";
+import { formatedDateArray } from "../../composable/application/datePattern";
 import { ApplicationResult } from "@/model/ApplicationResult";
 import { User } from "@/model/User";
 
diff --git a/src/views/authorizations/DataTypeAuthorizationInfoView.vue b/src/views/authorizations/DataTypeAuthorizationInfoView.vue
index d0931d7fe..d706264b2 100644
--- a/src/views/authorizations/DataTypeAuthorizationInfoView.vue
+++ b/src/views/authorizations/DataTypeAuthorizationInfoView.vue
@@ -115,6 +115,7 @@ import services from "@/composable/services";
 import { dataLoader } from "@/composable/data/dataLoader";
 import AuthorizationTableForDatatype from "@/components/common/AuthorizationTableForDatatype.vue";
 import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
+import { allDataName, createListData } from "@/composable/application/data";
 
 export default {
   name: "DataTypeAuthorizationInfoView",
@@ -250,66 +251,22 @@ export default {
           };
           return acc;
         }, {});
-        datatypes.value = {
-          withScope: Object.keys(application.value.dataTypes)
-            .filter((name) => application.value.configuration.dataDescription[name].authorization)
-            .reduce((acc, dataType) => {
-              acc[dataType] = {
-                id: dataType,
-                name:
-                  services.internationalisationService.localeReferenceNames(
-                    dataType,
-                    application.value
-                  ) || dataType,
-              };
-              return acc;
-            }, {}),
-          withoutScope: Object.keys(application.value.dataTypes)
-            .filter(
-              (name) => application.value.configuration.dataDescription[name].authorization === null
-            )
-            .reduce((acc, dataType) => {
-              acc[dataType] = {
-                id: dataType,
-                name:
-                  services.internationalisationService.localeReferenceNames(
-                    dataType,
-                    application.value
-                  ) || dataType,
-              };
-              return acc;
-            }, {}),
-        };
-        references.value = {
-          withScope: Object.keys(application.value.references)
-            .filter((name) => application.value.configuration.dataDescription[name].authorization)
-            .reduce((acc, reference) => {
-              acc[reference] = {
-                id: reference,
-                name:
-                  services.internationalisationService.localeReferenceNames(
-                    reference,
-                    application.value
-                  ) || reference,
-              };
-              return acc;
-            }, {}),
-          withoutScope: Object.keys(application.value.references)
-            .filter(
-              (name) => application.value.configuration.dataDescription[name].authorization === null
-            )
-            .reduce((acc, reference) => {
-              acc[reference] = {
-                id: reference,
-                name:
-                  services.internationalisationService.localeReferenceNames(
-                    reference,
-                    application.value
-                  ) || reference,
-              };
-              return acc;
-            }, {}),
-        };
+        let listDataNodeNames = [];
+        for (let localDataName in application.value.dataTypes) {
+          listDataNodeNames = allDataName(
+            application.value.dataTypes[localDataName],
+            listDataNodeNames
+          );
+        }
+        datatypes.value = createListData(listDataNodeNames, application.value);
+        let listReferenceNodeNames = [];
+        for (let localDataName in application.value.references) {
+          listReferenceNodeNames = allDataName(
+            application.value.references[localDataName],
+            listReferenceNodeNames
+          );
+        }
+        references.value = createListData(listReferenceNodeNames, application.value);
         configuration.value = application.value.configuration;
         dependencies.value = buildDependencies(configuration.value.hierarchicalNodes);
         if (
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index 86268ac27..1f2dd2220 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -243,7 +243,7 @@ import TagsInfos from "@/components/common/TagsInfos.vue";
 import { Component } from "@/model/application/Component";
 import { lineCountSynthesis } from "@/composable/application/synthesis";
 import { dataLoader } from "@/composable/data/dataLoader";
-import { patternCheckerDateRef } from "@/composable/application/DatePattern";
+import { patternCheckerDateRef } from "@/composable/application/datePattern";
 import DatasPatternLink from "@/components/datas/DatasPatternLink.vue";
 import { Tag } from "@/model/application/Tag";
 import TitleAndDescription from "@/components/common/TitleAndDescription.vue";
diff --git a/src/views/data/DataVersioningView.vue b/src/views/data/DataVersioningView.vue
index afc7e53c2..228101dcb 100644
--- a/src/views/data/DataVersioningView.vue
+++ b/src/views/data/DataVersioningView.vue
@@ -331,7 +331,7 @@ import useBoolean from "@/composable/components/boolean";
 import services from "@/composable/services";
 import { onMounted, provide, ref } from "vue";
 import app, { i18n } from "@/main";
-import { datePatternLang } from "@/composable/application/DatePattern";
+import { datePatternLang } from "@/composable/application/datePattern";
 import { BinaryFile } from "@/model/file/BinaryFile";
 import { Dataset } from "@/model/file/Dataset";
 import InputDate from "@/components/common/provider/InputDate.vue";
-- 
GitLab


From ac8b02fa6b9536a2de5f5f93cb9c973e7d11aec1 Mon Sep 17 00:00:00 2001
From: lucile varloteaux <lucile.varloteaux@inrae.fr>
Date: Tue, 28 Jan 2025 11:13:53 +0100
Subject: [PATCH 56/61] gestion du cas d'une props undefined

---
 .../AuthorizationTableForOneDataType.vue         | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/components/common/authorization/AuthorizationTableForOneDataType.vue b/src/components/common/authorization/AuthorizationTableForOneDataType.vue
index 3307272e3..2c660c2c8 100644
--- a/src/components/common/authorization/AuthorizationTableForOneDataType.vue
+++ b/src/components/common/authorization/AuthorizationTableForOneDataType.vue
@@ -103,13 +103,15 @@ export default {
     };
 
     onUpdated(() => {
-      localHasExtraction.value =
-        (Array.isArray(props.authorization?.operationTypes)
-          ? props.authorization?.operationTypes.includes("extraction")
-          : props.authorization?.operationTypes.has("extraction")) &&
-        Object.keys(props.authorization).includes("timeScope");
-      context.emit("update:has-extraction", localHasExtraction.value);
-      localOperationtypes = props.authorization?.operationTypes || Array.from(localOperationtypes);
+      if (props.authorization && props.authorization.operationTypes) {
+        localHasExtraction.value =
+          (Array.isArray(props.authorization.operationTypes)
+            ? props.authorization.operationTypes.includes("extraction")
+            : props.authorization.operationTypes.has("extraction")) &&
+          Object.keys(props.authorization).includes("timeScope");
+        context.emit("update:has-extraction", localHasExtraction.value);
+        localOperationtypes = props.authorization.operationTypes || Array.from(localOperationtypes);
+      }
     });
 
     const displayNodeTagHierarchical = ref({});
-- 
GitLab


From 08ba4c58c857d6059279e20b1e19f4570860d03e Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Fri, 31 Jan 2025 10:07:27 +0100
Subject: [PATCH 57/61] correction # 331

---
 src/views/data/DataTableView.vue | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index 1f2dd2220..d4f34f584 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -427,9 +427,9 @@ export default {
         );
         changeApplication({
           ...services.internationalisationService.mergeInternationalization(application),
-          localRefName: application.configuration.i18n.data[props.dataId].i18n.title[locale],
+          localRefName: application?.configuration?.i18n?.data[props.dataId]?.i18n?.title[locale] || props.dataId,
           localRefDescription:
-            application.configuration.i18n.data[props.dataId].i18n.description[locale],
+            application.configuration?.i18n?.data[props.dataId]?.i18n?.description[locale] || props.dataId,
         });
         totalRows.value =
           application.referenceSynthesis.find(
-- 
GitLab


From 293718775f7df736d6a9260c2410643ab3d54856 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Mon, 3 Feb 2025 10:40:15 +0100
Subject: [PATCH 58/61] correction #332

---
 src/model/application/Component.js | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/model/application/Component.js b/src/model/application/Component.js
index 5dc2c9c20..882103428 100644
--- a/src/model/application/Component.js
+++ b/src/model/application/Component.js
@@ -334,8 +334,27 @@ class PatternComponent extends Component {
         returnValue[col.id] = value[col.id];
         return returnValue;
       }, []);
+      let adjacents = this.patternAdjacentComponents.map((col) => {
+        let columnName;
+        if (this.horizontalDisplay) {
+          columnName = col.getHeader(application, dataId, col.id);
+        } else {
+          columnName = dataId;
+        }
+        let returnValue = {
+          component: col,
+          column: col.id,
+          columnName,
+          value: value[col.id],
+          id: col.id,
+        };
+        returnValue[col.id] = value[col.id];
+        return returnValue;
+      }, []);
+      adjacents.forEach((adjacent) => {qualifiers.push(adjacent);})
     } else {
-      qualifiers = this.patternQualifierComponents;
+      qualifiers = [...this.patternQualifierComponents];
+      this.patternAdjacentComponents.forEach((adjacent) => {qualifiers.push(adjacent);})
     }
 
     return qualifiers;
-- 
GitLab


From d79f45fec2478ebdc75fcc3c195d6caf2cf570ed Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Mon, 10 Feb 2025 13:19:39 +0100
Subject: [PATCH 59/61] correction #334

---
 src/model/application/Component.js | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/model/application/Component.js b/src/model/application/Component.js
index 882103428..7a1517380 100644
--- a/src/model/application/Component.js
+++ b/src/model/application/Component.js
@@ -397,6 +397,12 @@ class PatternQualifierComponent extends Component {
         (column) => column.__ORIGINAL_COLUMN_NAME__ == pattern[3]
       )?.[pattern[2]];
     }
+    pattern = this.id.match("(.*)::(.*)");
+    if (pattern) {
+      return row.values[pattern[1]]?.find(
+        (column) => column.__ORIGINAL_COLUMN_NAME__ == pattern[2]
+      )?.[pattern[2]];
+    }
     let value = row.values?.[this.parentComponentKey]?.[0]?.[this.id];
     return row.displaysForRow?.[this.refLinkedTo]?.[value] || value;
   }
@@ -439,6 +445,10 @@ class PatternAdjacentComponent extends Component {
         (column) => column.__ORIGINAL_COLUMN_NAME__ == pattern[3]
       )?.[pattern[2]];
     }
+    pattern = this.id.match("(.*)::(.*)");
+    if (pattern) {
+      return row.values[pattern[1]]?.[0]?.[pattern[2]]
+    }
     return "PatternAdjacentComponent not found " + this.id;
   }
 }
-- 
GitLab


From bcbae9bcc4f0dc9b05af907ca630e31103568229 Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Mon, 10 Feb 2025 14:35:17 +0100
Subject: [PATCH 60/61] correction #334

- affichage de pattern
- link sur reference
---
 src/components/datas/DatasLink.vue        |  2 +-
 src/components/datas/DatasPatternLink.vue |  4 +-
 src/model/application/Component.js        | 47 +++++++++++++++--------
 3 files changed, 35 insertions(+), 18 deletions(-)

diff --git a/src/components/datas/DatasLink.vue b/src/components/datas/DatasLink.vue
index 896f7e61d..5394eb142 100644
--- a/src/components/datas/DatasLink.vue
+++ b/src/components/datas/DatasLink.vue
@@ -148,7 +148,7 @@ export default {
         const result = await getOrLoadDataByNaturalKey(
           props.application,
           props.referenceType,
-          props.columnId || props.value
+          props.value?.toLowerCase()
         );
         let referenceTypeForReferencingColumns = result.referenceTypeForReferencingColumns;
         if (result.rows.length !== 0) {
diff --git a/src/components/datas/DatasPatternLink.vue b/src/components/datas/DatasPatternLink.vue
index 09b141f5a..82576851f 100644
--- a/src/components/datas/DatasPatternLink.vue
+++ b/src/components/datas/DatasPatternLink.vue
@@ -104,8 +104,8 @@ export default {
     const isCardModalActive = useBoolean().refBoolean;
     const isLoading = useBoolean().refBoolean;
 
-    function showBtnTablePatternColumn(tableDynamicColumn) {
-      let showModal = Object.entries(tableDynamicColumn)
+    function showBtnTablePatternColumn(tablePatternColumn) {
+      let showModal = Object.entries(tablePatternColumn)
         .filter((a) => a[1])
         .map(function (a) {
           let obj = {};
diff --git a/src/model/application/Component.js b/src/model/application/Component.js
index 7a1517380..acf685f96 100644
--- a/src/model/application/Component.js
+++ b/src/model/application/Component.js
@@ -54,7 +54,7 @@ export class Component {
     return row.values[this.id];
   }
 
-  getDisplayValue = function (row) {
+  getDisplayValue = function(row) {
     let columnValue = this.getColumnValue(row);
     let displaysForRow = row.displaysForRow?.[this.refLinkedTo]?.[row.values[this.id]];
     if (displaysForRow && typeof columnValue !== "number") {
@@ -107,8 +107,8 @@ export class Component {
           getInternationalizedColumn(
             referenceName,
             component.patternColumnComponents[patternColumnComponent].exportHeader ||
-              component.patternColumnComponents[patternColumnComponent].exportHeaderName ||
-              component.patternColumnComponents[patternColumnComponent].componentKey,
+            component.patternColumnComponents[patternColumnComponent].exportHeaderName ||
+            component.patternColumnComponents[patternColumnComponent].componentKey,
             application
           );
       }
@@ -259,7 +259,7 @@ class PatternComponent extends Component {
     return this.originalName || this.exportHeader;
   }
 
-  getDisplayValue = function (row) {
+  getDisplayValue = function(row) {
     let columnValue = this.getColumnValue(row);
     let displaysForRow = row.displaysForRow?.[this.refLinkedTo]?.[row.values[this.id]];
     if (displaysForRow && typeof columnValue !== "number") {
@@ -329,7 +329,7 @@ class PatternComponent extends Component {
           column: col.id,
           columnName,
           value: value[col.id],
-          id: col.id,
+          id: col.id
         };
         returnValue[col.id] = value[col.id];
         return returnValue;
@@ -341,20 +341,37 @@ class PatternComponent extends Component {
         } else {
           columnName = dataId;
         }
-        let returnValue = {
-          component: col,
-          column: col.id,
-          columnName,
-          value: value[col.id],
-          id: col.id,
-        };
+        let pattern = col.id.match("(.*)::(.*)");
+        let returnValue;
+        if (pattern) {
+          returnValue = {
+            component: col,
+            column: col.id,
+            columnName,
+            value: value[pattern[2]],
+            id: col.id
+          };
+
+        } else {
+          returnValue = {
+            component: col,
+            column: col.id,
+            columnName,
+            value: value[col.id],
+            id: col.id
+          };
+        }
         returnValue[col.id] = value[col.id];
         return returnValue;
       }, []);
-      adjacents.forEach((adjacent) => {qualifiers.push(adjacent);})
+      adjacents.forEach((adjacent) => {
+        qualifiers.push(adjacent);
+      });
     } else {
       qualifiers = [...this.patternQualifierComponents];
-      this.patternAdjacentComponents.forEach((adjacent) => {qualifiers.push(adjacent);})
+      this.patternAdjacentComponents.forEach((adjacent) => {
+        qualifiers.push(adjacent);
+      });
     }
 
     return qualifiers;
@@ -447,7 +464,7 @@ class PatternAdjacentComponent extends Component {
     }
     pattern = this.id.match("(.*)::(.*)");
     if (pattern) {
-      return row.values[pattern[1]]?.[0]?.[pattern[2]]
+      return row.values[pattern[1]]?.[0]?.[pattern[2]];
     }
     return "PatternAdjacentComponent not found " + this.id;
   }
-- 
GitLab


From 01acbf25436418a01cca52e781c26cd4aaac56cc Mon Sep 17 00:00:00 2001
From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr>
Date: Wed, 19 Feb 2025 09:50:32 +0100
Subject: [PATCH 61/61] fix #334

---
 src/model/application/Component.js | 1 -
 src/views/data/DataTableView.vue   | 8 ++++----
 2 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/src/model/application/Component.js b/src/model/application/Component.js
index acf685f96..d0adea531 100644
--- a/src/model/application/Component.js
+++ b/src/model/application/Component.js
@@ -13,7 +13,6 @@ export class Component {
   id;
   title = "#id";
   key = false;
-  linkedTo = null;
   tags = [Tag.NO_TAG_INSTANCE()];
   componentKey;
   exportHeader;
diff --git a/src/views/data/DataTableView.vue b/src/views/data/DataTableView.vue
index d4f34f584..c026cf64b 100644
--- a/src/views/data/DataTableView.vue
+++ b/src/views/data/DataTableView.vue
@@ -144,7 +144,7 @@
                 :info-values="props.row.values[column.id]"
                 :loaded-references-by-key="{}"
                 :multiplicity="multiplicity(column.id, props.row.values[column.id])"
-                :reference-type="addRefLinkedTo(column.id, column.linkedTo)"
+                :reference-type="addRefLinkedTo(column.id, column.refLinkedTo)"
               ></DatasManyLink>
               <DatasLink
                 v-else-if="column.id !== '#'"
@@ -603,14 +603,14 @@ export default {
       }
     }
 
-    function addRefLinkedTo(idColumn, linkedTo) {
-      if (linkedTo === null) {
+    function addRefLinkedTo(idColumn, refLinkedTo) {
+      if (refLinkedTo === null) {
         for (let key in referenceTypeForReferencingColumns.value) {
           if (key === idColumn && referenceTypeForReferencingColumns.value[key]) {
             return referenceTypeForReferencingColumns.value[key];
           }
         }
-      } else return linkedTo;
+      } else return refLinkedTo;
     }
 
     function askDeletionConfirmation(rowId) {
-- 
GitLab