added content type filter to search, displaying reults

This commit is contained in:
Bachir Soussi Chiadmi 2023-08-17 19:14:29 +02:00
parent 97b4c9c098
commit 6d00fecdb3
5 changed files with 124 additions and 21 deletions

View File

@ -0,0 +1,15 @@
fragment ResultsConcernementFields on Concernement {
id
title
author {
username
structure {
name
}
}
created
changed
lieu {
name
}
}

View File

@ -0,0 +1,13 @@
fragment ResultsEntiteFields on Entite {
action
menacemaintien
title
author {
username
structure {
name
}
}
created
changed
}

View File

@ -512,6 +512,30 @@ body{
} }
} }
section.results{
ul{
margin:0;
padding:0;
li{
margin:0;
padding:0 0 1em 0;
list-style: none;
h1{
font-weight: 400;
font-size: 1.323em;
margin: 0;
}
h2 {
font-size: 0.882em;
font-weight: 100;
margin: 0;
padding: 0;
}
}
}
}
} }
&.recit-opened { &.recit-opened {
padding-bottom: 3rem; padding-bottom: 3rem;

View File

@ -3,19 +3,22 @@ import { print } from 'graphql/language/printer'
import gql from 'graphql-tag' import gql from 'graphql-tag'
// import REST from '@api/rest-axios' // import REST from '@api/rest-axios'
// import GQL from '@api/graphql-axios' import GQL from '@api/graphql-axios'
// import JSONAPI from '@api/json-axios' // import JSONAPI from '@api/json-axios'
import MA from '@api/ma-axios' import MA from '@api/ma-axios'
import qs from 'querystring-es3' import qs from 'querystring-es3'
// import StaticsFields from '@api/gql/statics.fragment.gql' import ResultsConcernementFields from '@api/gql/results_concernement.fragment.gql'
import ResultsEntiteFields from '@api/gql/results_entite.fragment.gql'
export const SearchStore = defineStore({ export const SearchStore = defineStore({
id: 'search', id: 'search',
state: () => ({ state: () => ({
keys: null, keys: null,
contentTypesFilter: [], contentTypeFilter: [],
results: [] results: [],
loaded_results: []
}), }),
getters: { getters: {
@ -24,26 +27,70 @@ export const SearchStore = defineStore({
setKeys (value) { setKeys (value) {
this.keys = value.split(' '); this.keys = value.split(' ');
}, },
setContentTypes (v) { setContentType (v) {
this.contentTypesFilter = v this.contentTypeFilter = v
}, },
loadResults () { newSearch () {
console.log('search store loadResults', this.keys); console.log('search store loadResults', this.keys);
// this.keys = keys; // this.keys = keys;
const params = { const params = {
keys: this.keys.join(', ') keys: this.keys.join(', '),
content_type: this.contentTypeFilter
} }
const q = qs.stringify(params) const q = qs.stringify(params)
return MA.get('/ouatt_searchapi/getresults?' + q) return MA.get('/ouatt_searchapi/getresults?' + q)
.then(({ data }) => { .then(({ data }) => {
console.log('search MA getresults data', data, data.nids) console.log('search MA getresults data', data, data.nids)
this.results = data.nids; this.results = data;
this.loadeResults();
}) })
.catch((error) => { .catch((error) => {
console.warn('Issue with getResults', error) console.warn('Issue with getResults', error)
// window.location.reload() // window.location.reload()
Promise.reject(error) Promise.reject(error)
}) })
},
loadeResults () {
return new Promise((resolve, reject) => {
let ast;
if (this.contentTypeFilter === 'entites') {
ast = gql`{
entites(ids: [${this.results.nids}]) {
...ResultsEntiteFields
}
}
${ResultsEntiteFields}
`
GQL.post('', { query: print(ast) })
.then(({ data : { data : { entites } } }) => {
console.log('entites all loaded', entites)
this.loaded_results = entites
})
.catch(error => {
console.warn('Issue with loadResults', error)
Promise.reject(error)
})
} else {
ast = gql`{
concernements(ids: [${this.results.nids}]) {
...ResultsConcernementFields
}
}
${ResultsConcernementFields}
`
GQL.post('', { query: print(ast) })
.then(({ data : { data : { concernements } } }) => {
console.log('concernements all loaded', concernements)
this.loaded_results = concernements
})
.catch(error => {
console.warn('Issue with loadResults', error)
Promise.reject(error)
})
}
// console.log('ast', ast);
})
} }
} }
}) })

View File

@ -8,18 +8,18 @@ export default {
data(){ data(){
return { return {
value: null, value: null,
content_types: ['concernement', 'entite'] content_type: 'concernements'
} }
}, },
computed: { computed: {
...mapState(SearchStore,['keys', 'contentTypesFilter', 'results']), ...mapState(SearchStore,['keys', 'contentTypesFilter', 'results', 'loaded_results']),
// value(){ // value(){
// return this.keys // return this.keys
// } // }
}, },
created () { created () {
console.log("search created"); console.log("search created");
this.setContentTypes(this.content_types); this.setContentType(this.content_type);
}, },
watch: { watch: {
value: { value: {
@ -28,19 +28,19 @@ export default {
}, },
deep: true deep: true
}, },
content_types: { content_type: {
handler (n,o){ handler (n,o){
this.setContentTypes(n); this.setContentType(n);
}, },
deep: true deep: true
}, },
}, },
methods: { methods: {
...mapActions(SearchStore,['setKeys','setContentTypes','loadResults']), ...mapActions(SearchStore,['setKeys','setContentType','newSearch']),
onSubmitSearch (event) { onSubmitSearch (event) {
console.log("onSubmitSearch", event, this.value); console.log("onSubmitSearch", event, this.value);
// let value = event.target[0].value; // let value = event.target[0].value;
this.loadResults(); this.newSearch();
} }
}, },
components: { components: {
@ -62,10 +62,10 @@ export default {
</select> --> </select> -->
<section class="content-type-checkboxes"> <section class="content-type-checkboxes">
<input type="checkbox" name="concernement" id="concernement_checkbox" v-model="content_types" value="concernement"> <input type="radio" name="concernement" id="concernement_radio" v-model="content_type" value="concernements">
<label for="concernement">Concernements</label> <label for="concernement_radio">Concernements</label>
<input type="checkbox" name="entite" id="entite_checkbox" v-model="content_types" value="entite"> <input type="radio" name="entite" id="entite_radio" v-model="content_type" value="entites">
<label for="concernement">Entités</label> <label for="entite_radio">Entités</label>
</section> </section>
@ -79,7 +79,11 @@ export default {
</form> </form>
<section class="results"> <section class="results">
<ul> <ul>
<li v-for="result in results">{{ result }}</li> <li v-for="result in loaded_results">
<h1>{{ result.title }}</h1>
<h2 v-if="results.content_type === 'entites'"><span>une enité de </span>{{ result.author.username }}</h2>
<h2 v-else><span>une enquête de </span>{{ result.author.username }}</h2>
</li>
</ul> </ul>
</section> </section>
</section> </section>