diff --git a/src/views/feature/Feature_list.vue b/src/views/feature/Feature_list.vue index 4fa83fadbb2af46c352f1c2b7a6cdae478d30967..ea6fdd003b61b391cf3b4ee2494180ad3d62b4a7 100644 --- a/src/views/feature/Feature_list.vue +++ b/src/views/feature/Feature_list.vue @@ -22,7 +22,7 @@ ><i class="map fitted icon"></i ></a> <a - @click="showMap = false" + @click="showTable" :class="['item no-margin', { active: !showMap }]" data-tab="list" data-tooltip="Liste" @@ -30,7 +30,10 @@ ></a> <div class="item"> <h4> - {{ featuresCount }} signalement{{ featuresCount > 1 ? "s" : "" }} + <!-- {{ featuresCount }} signalement{{ featuresCount > 1 ? "s" : "" }} --> + {{ geojsonFeatures.length }} signalement{{ + geojsonFeatures.length > 1 ? "s" : "" + }} </h4> </div> @@ -119,7 +122,7 @@ type="text" name="title" v-model="form.title" - @input="updateFeatures" + @input="fetchPagedFeatures" /> <button type="button" @@ -145,7 +148,7 @@ <FeatureListTable v-show="!showMap" v-on:update:page="handlePageChange" - :geojsonFeatures="geojsonFeatures" + :geojsonFeatures="geojsonFeaturesPaginated" :checkedFeatures.sync="checkedFeatures" :featuresCount="featuresCount" :pagination="pagination" @@ -244,6 +247,7 @@ export default { }, geojsonFeatures: [], + geojsonFeaturesPaginated: [], baseUrl: this.$store.state.configuration.BASE_URL, map: null, zoom: null, @@ -264,6 +268,7 @@ export default { next: null, showMap: true, showAddFeature: false, + paginatedFeaturesDone: true, }; }, @@ -296,6 +301,14 @@ export default { }, methods: { + showTable() { + if (this.paginatedFeaturesDone) { + this.fetchPagedFeatures(); + this.paginatedFeaturesDone = false; + } + this.showMap = false; + }, + modalAllDelete() { this.modalAllDeleteOpen = !this.modalAllDeleteOpen; }, @@ -311,7 +324,8 @@ export default { project_slug: this.project.slug, }) .then(() => { - this.updateFeatures(); + this.fetchPagedFeatures(); + this.getNloadGeojsonFeatures(); this.checkedFeatures.splice(feature_id); }); } @@ -379,7 +393,8 @@ export default { }); // --------- End sidebar events ---------- - this.updateFeatures(); + //this.fetchPagedFeatures(); + this.getNloadGeojsonFeatures(); setTimeout(() => { const project_id = this.$route.params.slug.split("-")[0]; @@ -394,6 +409,62 @@ export default { }, 1000); }, + getNloadGeojsonFeatures() { + console.log("getNloadGeojsonFeatures"); + const url = `${this.$store.state.configuration.VUE_APP_DJANGO_API_BASE}projects/${this.$route.params.slug}/feature/?output=geojson`; + this.$store.commit( + "DISPLAY_LOADER", + "Récupération des signalements en cours..." + ); + axios + .get(url) + .then((response) => { + console.log(response); + if (response.status === 200 && response.data.features.length > 0) { + this.geojsonFeatures = response.data.features; + this.loadFeatures(); + } + this.$store.commit("DISCARD_LOADER"); + }) + .catch((error) => { + this.$store.commit("DISCARD_LOADER"); + throw error; + }); + }, + + loadFeatures() { + const urlParams = new URLSearchParams(window.location.search); + const featureType = urlParams.get("feature_type"); + const featureStatus = urlParams.get("status"); + const featureTitle = urlParams.get("title"); + this.featureGroup = mapUtil.addFeatures( + this.geojsonFeatures, + { + featureType, + featureStatus, + featureTitle, + }, + true, + this.feature_types + ); + // Fit the map to bound only if no initial zoom and center are defined + if ( + (this.lat === "" || this.lng === "" || this.zoom === "") && + this.geojsonFeatures.length > 0 + ) { + mapUtil + .getMap() + .fitBounds(this.featureGroup.getBounds(), { padding: [25, 25] }); + } + this.form.type.choices = [ + //* converting Set to an Array with spread "..." + ...new Set( + this.geojsonFeatures.map((el) => el.properties.feature_type.title) + ), //* use Set to eliminate duplicate values + ]; + }, + + //* Paginated Features for table *// getFeatureTypeSlug(title) { const featureType = this.feature_types.find((el) => el.title === title); return featureType ? featureType.slug : null; @@ -458,14 +529,16 @@ export default { updateTypeFeatures(filterValue) { //* only update:selection custom event can trigger the filter update, //* but it happens before the value is updated, thus using selected value from event to update query - this.updateFeatures({ filterType: "featureType", filterValue }); + this.fetchPagedFeatures({ filterType: "featureType", filterValue }); }, updateStatusFeatures(filterValue) { - this.updateFeatures({ filterType: "status", filterValue }); + this.fetchPagedFeatures({ filterType: "status", filterValue }); }, - updateFeatures(params) { + fetchPagedFeatures(params) { + this.onFilterChange(); //* temporary, use paginated event to watch change in filters, to modify geojson on map + //* replace function calls in watcher and on input let url = `${this.API_BASE_URL}projects/${this.$route.params.slug}/feature-paginated/?output=geojson&limit=${this.pagination.pagesize}&offset=${this.pagination.start}`; if (params) { @@ -492,10 +565,10 @@ export default { this.featuresCount = response.data.count; this.previous = response.data.previous; this.next = response.data.next; - this.geojsonFeatures = response.data.results.features; + this.geojsonFeaturesPaginated = response.data.results.features; //if (response.data.results.features.length > 0) { - this.loadFeatures(); - this.onFilterChange(); + //this.loadFeatures(); + //this.onFilterChange(); //} } this.$store.commit("DISCARD_LOADER"); @@ -506,37 +579,7 @@ export default { }); }, - loadFeatures() { - const urlParams = new URLSearchParams(window.location.search); - const featureType = urlParams.get("feature_type"); - const featureStatus = urlParams.get("status"); - const featureTitle = urlParams.get("title"); - this.featureGroup = mapUtil.addFeatures( - this.geojsonFeatures, - { - featureType, - featureStatus, - featureTitle, - }, - true, - this.feature_types - ); - // Fit the map to bound only if no initial zoom and center are defined - if ( - (this.lat === "" || this.lng === "" || this.zoom === "") && - this.geojsonFeatures.length > 0 - ) { - mapUtil - .getMap() - .fitBounds(this.featureGroup.getBounds(), { padding: [25, 25] }); - } - this.form.type.choices = [ - //* converting Set to an Array with spread "..." - ...new Set( - this.geojsonFeatures.map((el) => el.properties.feature_type.title) - ), //* use Set to eliminate duplicate values - ]; - }, + //* Pagination for table *// handlePageChange(page) { if (page === "next") { @@ -555,7 +598,7 @@ export default { this.pagination.start += toAddOrRemove; this.pagination.end += toAddOrRemove; this.pagination.currentPage = pageNumber; - this.updateFeatures(); + this.fetchPagedFeatures(); }, toPreviousPage() { @@ -565,7 +608,7 @@ export default { this.pagination.end -= this.pagination.pagesize; this.pagination.currentPage -= 1; } - this.updateFeatures(this.previous); + this.fetchPagedFeatures(this.previous); } }, @@ -576,7 +619,7 @@ export default { this.pagination.end += this.pagination.pagesize; this.pagination.currentPage += 1; } - this.updateFeatures(this.next); + this.fetchPagedFeatures(this.next); } }, },