From f01e6ae0832b6dbef2efe20871e95d8d171724c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e?= <tpoussard@neogeo.fr> Date: Tue, 12 Jul 2022 14:34:01 +0200 Subject: [PATCH] add component to fast edit status in feature detail --- src/assets/styles/base.css | 3 + .../Feature/Detail/FeatureTable.vue | 12 ++- .../Feature/FeatureEditStatusField.vue | 77 +++++++++++++++++++ src/store/modules/feature.store.js | 28 ++++--- src/views/Feature/FeatureDetail.vue | 5 +- 5 files changed, 114 insertions(+), 11 deletions(-) create mode 100644 src/components/Feature/FeatureEditStatusField.vue diff --git a/src/assets/styles/base.css b/src/assets/styles/base.css index 13b03980..7aa4d2c9 100644 --- a/src/assets/styles/base.css +++ b/src/assets/styles/base.css @@ -77,6 +77,9 @@ body { /* ---------------------------------- */ /* UTILS */ /* ---------------------------------- */ +.inline { + display: inline; +} .no-margin { margin: 0 !important; } diff --git a/src/components/Feature/Detail/FeatureTable.vue b/src/components/Feature/Detail/FeatureTable.vue index d5ba2065..3949387e 100644 --- a/src/components/Feature/Detail/FeatureTable.vue +++ b/src/components/Feature/Detail/FeatureTable.vue @@ -56,7 +56,14 @@ :class="['icon', statusIcon]" aria-hidden="true" /> - {{ statusLabel }} + <FeatureEditStatusField + v-if="fastEditionMode && form" + :status="form.status.value" + class="inline" + /> + <span v-else> + {{ statusLabel }} + </span> </td> </tr> <tr> @@ -114,6 +121,7 @@ import { mapState } from 'vuex'; import FeatureTypeLink from '@/components/FeatureType/FeatureTypeLink'; +import FeatureEditStatusField from '@/components/Feature/FeatureEditStatusField'; import FeatureExtraForm from '@/components/Feature/Edit/FeatureExtraForm'; import { statusChoices } from '@/utils'; @@ -123,6 +131,7 @@ export default { components: { FeatureTypeLink, + FeatureEditStatusField, FeatureExtraForm, }, @@ -149,6 +158,7 @@ export default { ...mapState('feature', [ 'currentFeature', 'linked_features', + 'form', 'extra_forms', ]), diff --git a/src/components/Feature/FeatureEditStatusField.vue b/src/components/Feature/FeatureEditStatusField.vue new file mode 100644 index 00000000..27b4f30c --- /dev/null +++ b/src/components/Feature/FeatureEditStatusField.vue @@ -0,0 +1,77 @@ +<template> + <div class="field"> + <Dropdown + v-if="selectedStatus" + :options="allowedStatusChoices" + :selected="selectedStatus.name" + :selection.sync="selectedStatus" + /> + </div> +</template> + +<script> +import Dropdown from '@/components/Dropdown.vue'; +import { statusChoices, allowedStatus2change } from '@/utils'; +import { mapState } from 'vuex'; + + +export default { + name: 'FeatureEditStatusField', + + components: { + Dropdown, + }, + + props: { + status: { + type: String, + default: '', + }, + }, + + computed: { + ...mapState([ + 'user', + 'USER_LEVEL_PROJECTS', + ]), + ...mapState('projects', [ + 'project' + ]), + ...mapState('feature', [ + 'currentFeature' + ]), + statusObject() { + return statusChoices.find((key) => key.value === this.status); + }, + + selectedStatus: { + get() { + return this.statusObject; + + }, + set(newValue) { + this.$store.commit('feature/UPDATE_FORM_FIELD', { name: 'status', value: newValue.value }); + }, + }, + + allowedStatusChoices() { + if (this.project && this.currentFeature && this.user) { + const isModerate = this.project.moderation; + const userStatus = 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 */); + } + return []; + }, + }, + + mounted() { + console.log('selectedStatus', this.selectedStatus); + + }, + + methods: { + } + +}; +</script> \ No newline at end of file diff --git a/src/store/modules/feature.store.js b/src/store/modules/feature.store.js index 450290f9..ef76b951 100644 --- a/src/store/modules/feature.store.js +++ b/src/store/modules/feature.store.js @@ -32,6 +32,16 @@ const feature = { UPDATE_FORM(state, payload) { state.form = payload; }, + INIT_FORM(state) { + state.form = { + title: state.currentFeature.title, + description: { value: state.currentFeature.description }, + status: { value: state.currentFeature.status }, + }; + }, + UPDATE_FORM_FIELD(state, field) { + state.form[field.name].value = field.value; + }, UPDATE_EXTRA_FORM(state, extra_form) { const index = state.extra_forms.findIndex(el => el.label === extra_form.label); if (index !== -1) { @@ -188,15 +198,14 @@ const feature = { }, { root: true }, ); - if (routeName.includes('details-signalement')) return; dispatch( 'GET_PROJECT_FEATURE', { project_slug: rootState.projects.project.slug, feature_id: featureId - } - ) + }) .then(() => { + if (routeName.includes('details-signalement')) return; router.push({ name: 'details-signalement', params: { @@ -219,15 +228,16 @@ const feature = { for (const field of state.extra_forms) { extraFormObject[field.name] = field.value; } - const feature = state.form || state.currentFeature; + //const feature = state.form || state.currentFeature; return { - id: feature.feature_id, + id: state.form.feature_id || state.currentFeature.feature_id, type: 'Feature', - geometry: feature.geometry || feature.geom, + geometry: state.form.geometry || state.form.geom || + state.currentFeature.geometry || state.currentFeature.geom, properties: { - title: feature.title, - description: feature.description.value, - status: feature.status.value, + title: state.form.title, + description: state.form.description.value, + status: state.form.status.value, project: rootState.projects.project.slug, feature_type: rootState['feature-type'].current_feature_type_slug, ...extraFormObject diff --git a/src/views/Feature/FeatureDetail.vue b/src/views/Feature/FeatureDetail.vue index 1b88ecf9..3ede1cb7 100644 --- a/src/views/Feature/FeatureDetail.vue +++ b/src/views/Feature/FeatureDetail.vue @@ -259,7 +259,10 @@ export default { this.getFeatureAttachments(); this.getLinkedFeatures(); this.DISCARD_LOADER(); - if (this.project.fast_edition_mode) this.$store.dispatch('feature/INIT_EXTRA_FORMS'); + if (this.project.fast_edition_mode) { + this.$store.commit('feature/INIT_FORM'); + this.$store.dispatch('feature/INIT_EXTRA_FORMS'); + } }, confirmLeave() { -- GitLab