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 1/3] =?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 2/3] =?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 3/3] 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