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