diff --git a/src/components/Feature/Detail/FeatureHeader.vue b/src/components/Feature/Detail/FeatureHeader.vue index d1ab51b94908bffa2dae66f0f15f177802f1c326..d7860636f316e19c0f4740b5bc7e4deec5d01c93 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="previous-feature" :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 ef36f677aa2df6d4aa818ac0a5f065e6a020d132..25098cc9567193e0923bc0e817cb7061bed2785a 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" > <FeatureExtraForm :field="getExtraForm(field)" @@ -60,7 +60,7 @@ aria-hidden="true" /> <FeatureEditStatusField - v-if="fastEditionMode && form" + v-if="fastEditionMode && canEditFeature && form" :status="form.status.value" class="inline" /> @@ -161,7 +161,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 806182c3a835cd04a9b8a3d36c3531b7bb7b94bb..eb9a79f7567fe6339e8942dcf8aef79f308d818c 100644 --- a/src/components/Feature/FeatureEditStatusField.vue +++ b/src/components/Feature/FeatureEditStatusField.vue @@ -56,7 +56,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; } },