Skip to content
Snippets Groups Projects
Commit 2ebad4ec authored by Emmanuel Salomon's avatar Emmanuel Salomon :fist:
Browse files

Bind url query to ressources filters

parent a71b5f05
No related branches found
No related tags found
No related merge requests found
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
class="flex" class="flex"
> >
<template #button="{ onClick }"> <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> <fa icon="heart"></fa><span class="ml-2">Je participe !</span>
</t-button> </t-button>
</template> </template>
...@@ -59,7 +59,10 @@ ...@@ -59,7 +59,10 @@
<li v-for="category in categories" :key="category.title"> <li v-for="category in categories" :key="category.title">
<nuxt-link <nuxt-link
class="hover:underline" class="hover:underline"
:to="`/ressources?cat=${category.title}`" :to="{
path: 'ressources',
query: { filters: category.title },
}"
> >
{{ category.title }} {{ category.title }}
</nuxt-link> </nuxt-link>
......
...@@ -108,6 +108,14 @@ export default { ...@@ -108,6 +108,14 @@ export default {
type: Function, type: Function,
required: true, required: true,
}, },
getQueryUrl: {
type: Function,
default(q) {
return new URLSearchParams({
q,
})
},
},
}, },
data() { data() {
return { return {
...@@ -136,10 +144,8 @@ export default { ...@@ -136,10 +144,8 @@ export default {
methods: { methods: {
async search(force) { async search(force) {
const query = this.query.trim() const query = this.query.trim()
let queryUrl = null
if (query.length || force) { if (query.length || force) {
queryUrl = encodeURIComponent(query)
const results = await this.searchFunction(this.query) const results = await this.searchFunction(this.query)
if (results.length) { if (results.length) {
...@@ -154,10 +160,12 @@ export default { ...@@ -154,10 +160,12 @@ export default {
this.hasNoResult = false this.hasNoResult = false
} }
// Replace url with query string
const queryUrl = this.getQueryUrl(query).toString()
history.replaceState( history.replaceState(
{}, {},
null, null,
this.$route.path + (queryUrl ? `?q=${queryUrl}` : '') this.$route.path + (queryUrl.length ? `?${queryUrl}` : '')
) )
}, },
}, },
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
:results="results" :results="results"
:search-placeholder="$t('ressources.searchPlaceholder')" :search-placeholder="$t('ressources.searchPlaceholder')"
:search-function="searchFunction" :search-function="searchFunction"
:get-query-url="getQueryUrl"
> >
<RessourcesSubmitModal slot="search" /> <RessourcesSubmitModal slot="search" />
...@@ -32,11 +33,13 @@ ...@@ -32,11 +33,13 @@
<script> <script>
import categories from '~/static/settings/categories.json' import categories from '~/static/settings/categories.json'
const defaultSelected = 'Mises en avant'
export default { export default {
name: 'RessourcesPage', name: 'RessourcesPage',
async asyncData({ $content }) { async asyncData({ $content }) {
const results = await $content('ressources') const results = await $content('ressources')
.where({ categories: { $containsAny: 'Mises en avant' } }) .where({ categories: { $containsAny: defaultSelected } })
.sortBy('featured', 'asc') .sortBy('featured', 'asc')
.fetch() .fetch()
...@@ -48,7 +51,7 @@ export default { ...@@ -48,7 +51,7 @@ export default {
const allCategories = categories.ressources.map((cat) => cat.title) const allCategories = categories.ressources.map((cat) => cat.title)
return { return {
categories: allCategories, categories: allCategories,
selectedCategories: ['Mises en avant'], // allCategories, selectedCategories: [defaultSelected], // allCategories,
} }
}, },
watch: { watch: {
...@@ -56,6 +59,14 @@ export default { ...@@ -56,6 +59,14 @@ export default {
this.$refs.searchContainer.search(true) 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: { methods: {
async searchFunction(query) { async searchFunction(query) {
return await this.$content('ressources') return await this.$content('ressources')
...@@ -64,6 +75,25 @@ export default { ...@@ -64,6 +75,25 @@ export default {
.sortBy('title', 'asc') .sortBy('title', 'asc')
.fetch() .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> </script>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment