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