diff --git a/src/components/Feature/Detail/FeatureHeader.vue b/src/components/Feature/Detail/FeatureHeader.vue index ff4fbd0859600dc1ab7c5ba619f15585045bde45..49f1d98c814903ff66820cda039ec3fd0451c3c6 100644 --- a/src/components/Feature/Detail/FeatureHeader.vue +++ b/src/components/Feature/Detail/FeatureHeader.vue @@ -3,7 +3,7 @@ <h1 class="ui header"> <div class="content"> <span - v-if="fastEditionMode && form" + v-if="fastEditionMode && form && canEditFeature" class="form ui half-block" > <input @@ -73,7 +73,7 @@ </button> <button - v-if="fastEditionMode && userCanFastEdit" + v-if="fastEditionMode && canEditFeature" id="save-fast-edit" :class="['ui button button-hover-orange tiny-margin', { disabled: false }]" data-tooltip="Enregistrer les modifications" @@ -106,11 +106,7 @@ </router-link> <router-link - v-if="slugSignal && - ((permissions && permissions.can_update_feature) || - isFeatureCreator || - isModerator) - " + v-if="slugSignal && canEditFeature" id="edit-feature" :to="{ name: 'editer-signalement', @@ -147,7 +143,7 @@ <div class="ui hidden divider" /> <div class="sub header prewrap"> <span - v-if="fastEditionMode && form" + v-if="fastEditionMode && canEditFeature && form" class="form ui half-block" > <textarea @@ -196,12 +192,19 @@ export default { type: Boolean, default: false, }, + isFeatureCreator: { + type: Boolean, + default: false, + }, + canEditFeature: { + type: Boolean, + default: false, + }, }, computed: { ...mapState([ 'user', - 'USER_LEVEL_PROJECTS', 'isOnline', ]), ...mapState('feature', [ @@ -212,24 +215,6 @@ export default { 'permissions', ]), - isFeatureCreator() { - if (this.currentFeature && this.user) { - return this.currentFeature.creator === this.user.id; - } - return false; - }, - - isModerator() { - return this.USER_LEVEL_PROJECTS && this.USER_LEVEL_PROJECTS[this.$route.params.slug] === 'Modérateur'; - }, - - userCanFastEdit() { - const superiorRoles = ['contributor', 'super_contributor', 'moderator', 'admin']; - return this.USER_LEVEL_PROJECTS && - superiorRoles.includes(this.USER_LEVEL_PROJECTS[this.$route.params.slug]) || - this.user.is_superuser; - }, - queryparams() { return this.$route.query.offset >= 0 ? { previous: parseInt(this.$route.query.offset) - 1, diff --git a/src/components/Feature/Detail/FeatureTable.vue b/src/components/Feature/Detail/FeatureTable.vue index 06bbf0db1bfa0f160f5621dc9ebab3eec2ef63c4..b0e4a8b8e963be24bac5a544dd6464c03d244929 100644 --- a/src/components/Feature/Detail/FeatureTable.vue +++ b/src/components/Feature/Detail/FeatureTable.vue @@ -23,7 +23,7 @@ <td> <strong class="ui form"> <span - v-if="fastEditionMode && extra_forms.length > 0" + v-if="fastEditionMode && canEditFeature && extra_forms.length > 0" :id="field.label" > <FeatureExtraForm @@ -61,7 +61,7 @@ aria-hidden="true" /> <FeatureEditStatusField - v-if="fastEditionMode && form" + v-if="fastEditionMode && canEditFeature && form" :status="form.status.value" class="inline" /> @@ -162,7 +162,11 @@ export default { fastEditionMode: { type: Boolean, default: false, - } + }, + canEditFeature: { + type: Boolean, + default: false, + }, }, computed: { diff --git a/src/components/Feature/FeatureEditStatusField.vue b/src/components/Feature/FeatureEditStatusField.vue index 448a227676a3a8b325ccc9633c06f9c7365c58f7..3c4133b5c7ff9b8a459ebca9733bd74268604c98 100644 --- a/src/components/Feature/FeatureEditStatusField.vue +++ b/src/components/Feature/FeatureEditStatusField.vue @@ -59,7 +59,7 @@ export default { allowedStatusChoices() { if (this.project && this.currentFeature && this.user) { const isModerate = this.project.moderation; - const userStatus = this.USER_LEVEL_PROJECTS[this.project.slug]; + const userStatus = this.USER_LEVEL_PROJECTS && this.USER_LEVEL_PROJECTS[this.project.slug]; const isOwnFeature = this.currentFeature.creator === this.user.id; //* si le contributeur est l'auteur du signalement return allowedStatus2change(this.user, isModerate, userStatus, isOwnFeature, /* this.currentRouteName */); } diff --git a/src/views/Feature/FeatureDetail.vue b/src/views/Feature/FeatureDetail.vue index 6926b84925ecad4dde6bd8fe2422beddc5bafdf5..88ae5aa146bde9b12b8093a85b8149ce48ea20e5 100644 --- a/src/views/Feature/FeatureDetail.vue +++ b/src/views/Feature/FeatureDetail.vue @@ -13,6 +13,8 @@ :feature-type="featureType" :fast-edition-mode="project.fast_edition_mode" :display-to-list-button="displayToListButton" + :is-feature-creator="isFeatureCreator" + :can-edit-feature="canEditFeature" @setIsCancelling="isCanceling = true" @tofeature="pushNgo" /> @@ -24,6 +26,7 @@ v-if="project" :feature-type="featureType" :fast-edition-mode="project.fast_edition_mode" + :can-edit-feature="canEditFeature" @tofeature="pushNgo" /> </div> @@ -101,7 +104,7 @@ </template> <script> -import { mapState, mapActions, mapMutations } from 'vuex'; +import { mapState, mapActions, mapMutations, mapGetters } from 'vuex'; import mapService from '@/services/map-service'; import axios from '@/axios-client.js'; @@ -177,6 +180,9 @@ export default { }, computed: { + ...mapState([ + 'USER_LEVEL_PROJECTS', + ]), ...mapState('projects', [ 'project' ]), @@ -188,6 +194,9 @@ export default { 'currentFeature', 'form', ]), + ...mapGetters([ + 'permissions', + ]), hasUnsavedChange() { if (this.form) { @@ -200,6 +209,23 @@ export default { } } return false; + }, + + isFeatureCreator() { + if (this.currentFeature && this.user) { + return this.currentFeature.creator === this.user.id; + } + return false; + }, + + isModerator() { + return this.USER_LEVEL_PROJECTS && this.USER_LEVEL_PROJECTS[this.$route.params.slug] === 'Modérateur'; + }, + + canEditFeature() { + return (this.permissions && this.permissions.can_update_feature) || + this.isFeatureCreator || + this.isModerator; } },