From 2ebad4eca8ef8d54aab9e9028a98c724b1a78f30 Mon Sep 17 00:00:00 2001 From: ManUtopiK <emmanuel.salomon@gmail.com> Date: Fri, 18 Jun 2021 05:15:33 +0200 Subject: [PATCH] Bind url query to ressources filters --- components/layout/LayoutFooter.vue | 7 ++++-- components/search/SearchContainer.vue | 14 ++++++++--- pages/ressources.vue | 34 +++++++++++++++++++++++++-- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/components/layout/LayoutFooter.vue b/components/layout/LayoutFooter.vue index 23d402d8..6f4ee5b6 100644 --- a/components/layout/LayoutFooter.vue +++ b/components/layout/LayoutFooter.vue @@ -21,7 +21,7 @@ class="flex" > <template #button="{ onClick }"> - <t-button @click="onClick" class="w-full lg:w-max"> + <t-button class="w-full lg:w-max" @click="onClick"> <fa icon="heart"></fa><span class="ml-2">Je participe !</span> </t-button> </template> @@ -59,7 +59,10 @@ <li v-for="category in categories" :key="category.title"> <nuxt-link class="hover:underline" - :to="`/ressources?cat=${category.title}`" + :to="{ + path: 'ressources', + query: { filters: category.title }, + }" > {{ category.title }} </nuxt-link> diff --git a/components/search/SearchContainer.vue b/components/search/SearchContainer.vue index 14553019..59d3a605 100644 --- a/components/search/SearchContainer.vue +++ b/components/search/SearchContainer.vue @@ -108,6 +108,14 @@ export default { type: Function, required: true, }, + getQueryUrl: { + type: Function, + default(q) { + return new URLSearchParams({ + q, + }) + }, + }, }, data() { return { @@ -136,10 +144,8 @@ export default { methods: { async search(force) { const query = this.query.trim() - let queryUrl = null if (query.length || force) { - queryUrl = encodeURIComponent(query) const results = await this.searchFunction(this.query) if (results.length) { @@ -154,10 +160,12 @@ export default { this.hasNoResult = false } + // Replace url with query string + const queryUrl = this.getQueryUrl(query).toString() history.replaceState( {}, null, - this.$route.path + (queryUrl ? `?q=${queryUrl}` : '') + this.$route.path + (queryUrl.length ? `?${queryUrl}` : '') ) }, }, diff --git a/pages/ressources.vue b/pages/ressources.vue index 7bd56e90..1766caa3 100644 --- a/pages/ressources.vue +++ b/pages/ressources.vue @@ -5,6 +5,7 @@ :results="results" :search-placeholder="$t('ressources.searchPlaceholder')" :search-function="searchFunction" + :get-query-url="getQueryUrl" > <RessourcesSubmitModal slot="search" /> @@ -32,11 +33,13 @@ <script> import categories from '~/static/settings/categories.json' +const defaultSelected = 'Mises en avant' + export default { name: 'RessourcesPage', async asyncData({ $content }) { const results = await $content('ressources') - .where({ categories: { $containsAny: 'Mises en avant' } }) + .where({ categories: { $containsAny: defaultSelected } }) .sortBy('featured', 'asc') .fetch() @@ -48,7 +51,7 @@ export default { const allCategories = categories.ressources.map((cat) => cat.title) return { categories: allCategories, - selectedCategories: ['Mises en avant'], // allCategories, + selectedCategories: [defaultSelected], // allCategories, } }, watch: { @@ -56,6 +59,14 @@ export default { this.$refs.searchContainer.search(true) }, }, + mounted() { + // Get url params + const query = this.$route.query + if (query.filters) + this.selectedCategories = Array.isArray(query.filters) + ? query.filters + : [query.filters] + }, methods: { async searchFunction(query) { return await this.$content('ressources') @@ -64,6 +75,25 @@ export default { .sortBy('title', 'asc') .fetch() }, + getQueryUrl(query) { + const params = new URLSearchParams() + if (query.length) params.set('q', query) + if (this.selectedCategories.length === 1) { + if (this.selectedCategories[0] !== defaultSelected) { + params.set('filters', this.selectedCategories[0]) + } + } else if (this.selectedCategories.length > 1) { + if (this.selectedCategories.length === this.categories.length) { + params.set('filters', 'all') + } else { + this.selectedCategories.forEach((cat) => + params.append('filters', cat) + ) + } + } + + return params + }, }, } </script> -- GitLab