diff --git a/src/utils/index.js b/src/utils/index.js index 1a6d59b56c11048441baa97c1373c39f8b267dfd..814c7f12fc889681b36cf515a29b2982afe0cba9 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -1,4 +1,39 @@ export function parseDate(date) { let dateArr = date.split('/').reverse(); return new Date(dateArr[0], dateArr[1] - 1, dateArr[2]); +} + +export function allowedStatus2change(statusChoices, isModerate, userStatus, isOwnFeature, currentRouteName) { + if ( //* si admin, modérateur ou super contributeur, statuts toujours disponibles: Brouillon, Publié, Archivé + userStatus === 'Modérateur' || + userStatus === 'Administrateur projet' || + (userStatus === 'Super Contributeur' && !isModerate) + ) { + return statusChoices.filter((el) => el.value !== 'pending'); + } else if (userStatus === 'Super Contributeur' && isModerate) { + return statusChoices.filter( + (el) => el.value === 'draft' || el.value === 'pending' + ); + } else if (userStatus === 'Contributeur') { //* cas particuliers du contributeur + if (currentRouteName === 'ajouter-signalement' || !isOwnFeature) { + //* même cas à l'ajout d'une feature ou si feature n'a pas été créé par le contributeur + return isModerate + ? statusChoices.filter( + (el) => el.value === 'draft' || el.value === 'pending' + ) + : statusChoices.filter( + (el) => el.value === 'draft' || el.value === 'published' + ); + } else { + //* à l'édition d'une feature et si le contributeur est l'auteur de la feature + return isModerate + ? statusChoices.filter( + (el) => el.value !== 'published' //* toutes sauf "Publié" + ) + : statusChoices.filter( + (el) => el.value !== 'pending' //* toutes sauf "En cours de publication" + ); + } + } + return []; } \ No newline at end of file diff --git a/src/views/feature/Feature_edit.vue b/src/views/feature/Feature_edit.vue index f6c7ec607324c3286f0f84f132120869bcc3d834..c54f912ee7a7d0ac66356e40e07ce5b30fd3e864 100644 --- a/src/views/feature/Feature_edit.vue +++ b/src/views/feature/Feature_edit.vue @@ -304,6 +304,7 @@ import featureAPI from '@/services/feature-api'; import L from 'leaflet'; import 'leaflet-draw'; import { mapUtil } from '@/assets/js/map-util.js'; +import { allowedStatus2change } from '@/utils'; import axios from '@/axios-client.js'; import flip from '@turf/flip'; @@ -422,48 +423,11 @@ export default { }, allowedStatusChoices() { - if (this.project) { + if (this.project && this.feature && this.user) { const isModerate = this.project.moderation; const userStatus = this.USER_LEVEL_PROJECTS[this.project.slug]; - const isOwnFeature = this.feature - ? this.feature.creator === this.user.id //* prevent undefined feature - : false; //* si le contributeur est l'auteur du signalement - if ( - //* si admin, modérateur ou super contributeur, statuts toujours disponible: Brouillon, Publié, Archivé - userStatus === 'Modérateur' || - userStatus === 'Administrateur projet' || - (userStatus === 'Super Contributeur' && !isModerate) - ) { - return this.statusChoices.filter((el) => el.value !== 'pending'); - } else if (userStatus === 'Super Contributeur' && isModerate) { - return this.statusChoices.filter( - (el) => el.value === 'draft' || el.value === 'pending' - ); - } else if (userStatus === 'Contributeur') { - //* cas particuliers du contributeur - if ( - this.currentRouteName === 'ajouter-signalement' || - !isOwnFeature - ) { - //* même cas à l'ajout d'une feature ou si feature n'a pas été créé par le contributeur - return isModerate - ? this.statusChoices.filter( - (el) => el.value === 'draft' || el.value === 'pending' - ) - : this.statusChoices.filter( - (el) => el.value === 'draft' || el.value === 'published' - ); - } else { - //* à l'édition d'une feature et si le contributeur est l'auteur de la feature - return isModerate - ? this.statusChoices.filter( - (el) => el.value !== 'published' //* toutes sauf "Publié" - ) - : this.statusChoices.filter( - (el) => el.value !== 'pending' //* toutes sauf "En cours de publication" - ); - } - } + const isOwnFeature = this.feature.creator === this.user.id; //* si le contributeur est l'auteur du signalement + return allowedStatus2change(this.statusChoices, isModerate, userStatus, isOwnFeature, this.currentRouteName); } return []; }, diff --git a/src/views/feature/Feature_list.vue b/src/views/feature/Feature_list.vue index c841ce465f3f3b81d721f980e11074b211dbf1ea..ea80fcc80e132fd04b95f9328f8e30bd578ad7d4 100644 --- a/src/views/feature/Feature_list.vue +++ b/src/views/feature/Feature_list.vue @@ -131,7 +131,7 @@ <label>Statut</label> <!-- //* giving an object mapped on key name --> <Dropdown - :options="statusChoices" + :options="filteredStatusChoices" :selected="form.status.selected.name" :selection.sync="form.status.selected" :search="true" @@ -245,6 +245,7 @@ import SidebarLayers from '@/components/map-layers/SidebarLayers'; import FeatureListTable from '@/components/feature/FeatureListTable'; import Dropdown from '@/components/Dropdown.vue'; import axios from '@/axios-client.js'; +import { allowedStatus2change } from '@/utils'; export default { name: 'FeatureList', @@ -266,24 +267,6 @@ export default { }, status: { selected: '', - choices: [ - { - name: 'Brouillon', - value: 'draft', - }, - { - name: 'En attente de publication', - value: 'pending', - }, - { - name: 'Publié', - value: 'published', - }, - { - name: 'Archivé', - value: 'archived', - }, - ], }, title: null, }, @@ -322,51 +305,32 @@ export default { 'project', ]), ...mapState('feature', [ - 'checkedFeatures' + 'checkedFeatures', + 'statusChoices', ]), ...mapState('feature_type', [ - 'feature_types' + 'feature_types', ]), ...mapState('map', [ - 'basemaps' + 'basemaps', ]), API_BASE_URL() { return this.$store.state.configuration.VUE_APP_DJANGO_API_BASE; }, - statusChoices() { + filteredStatusChoices() { //* if project is not moderate, remove pending status - return this.form.status.choices.filter((el) => + return this.statusChoices.filter((el) => this.project && this.project.moderation ? true : el.value !== 'pending' ); }, - availableStatus() { - if (this.project) { + if (this.project && this.user) { const isModerate = this.project.moderation; - const userStatus = this.USER_LEVEL_PROJECTS[this.projectSlug]; - - switch (userStatus) { - case 'Administrateur projet' : //* ajout de 'pending' si projet modéré - return isModerate ? this.statusChoices : this.statusChoices.filter((el) => el.value !== 'pending'); - - case 'Modérateur' : - console.log('Modérateur', isModerate); - return isModerate ? - this.statusChoices.filter((el) => el.value !== 'archived') : //* ajout de 'pending' si projet modéré - this.statusChoices.filter( - (el) => el.value === 'draft' || el.value === 'published' - ); - - case 'Super Contributeur' : - case 'Contributeur' : - return isModerate ? - this.statusChoices.filter((el) => el.value === 'draft') : - this.statusChoices.filter( //* ajout de 'published' si projet non-modéré - (el) => el.value === 'draft' || el.value === 'published' - ); - } + const userStatus = this.USER_LEVEL_PROJECTS[this.project.slug]; + const isOwnFeature = true; //* dans ce cas le contributeur est toujours l'auteur des signalements qu'il peut modifier + return allowedStatus2change(this.statusChoices, isModerate, userStatus, isOwnFeature); } return []; },