123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- import { REST } from 'api/rest-axios'
- import qs from 'querystring'
- export default {
- namespaced: true,
- // initial state
- state: {
- keys: '',
- searchTypeOptions: [
- { 'code': 'text', 'label': 'Dans les textes' },
- { 'code': 'persons', 'label': 'Dans les personnes' },
- { 'code': 'places', 'label': 'Dans les lieux' },
- { 'code': 'objects', 'label': 'Dans les objets' }
- ],
- searchTypeValue: { 'code': 'text', 'label': 'Dans les textes' },
- filters: { persons: [], places: [], objects: [] },
- activeFilters: { persons: [], places: [], objects: [] },
- results: [],
- resultsQuantity: null,
- isloading: false,
- limit: 10,
- offset: 0,
- opened: false
- },
- // getters
- getters: {},
- // mutations
- mutations: {
- setKeys (state, keys) {
- state.keys = keys
- },
- setResults (state, content) {
- state.results = state.results.concat(content)
- },
- resetResults (state) {
- state.results = []
- state.offset = 0
- },
- setResultsCount (state, quantity) {
- state.resultsQuantity = quantity
- },
- incrementOffset (state) {
- state.offset += state.limit
- },
- setIsloading (state, isloading) {
- state.isloading = isloading
- },
- setOpened (state, opened) {
- state.opened = opened
- },
- setSearchTypeValue (state, value) {
- state.searchTypeValue = value
- },
- setFilters (state, filters) {
- for (let index in filters) {
- if (filters.hasOwnProperty(index)) {
- console.log('index', index)
- if (filters[index]) {
- if (Array.isArray(filters[index])) {
- state.filters[index] = []
- for (var i = 0; i < filters[index].length; i++) {
- if (filters[index][i].uuid && filters[index][i].title) {
- state.filters[index].push({
- code: filters[index][i].uuid,
- label: filters[index][i].title
- })
- }
- }
- } else {
- if (filters[index].uuid && filters[index].title) {
- state.filters[index] = [{
- code: filters[index].uuid,
- label: filters[index].title
- }]
- }
- }
- } else {
- state.filters[index] = []
- }
- }
- }
- console.log('filters', state.filters)
- },
- setActiveFilters (state, filters) {
- // console.log('setActiveFilters', filters)
- state.activeFilters[filters.index] = filters.value
- // console.log('state.activeFilters', state.activeFilters)
- },
- resetActiveFilters (state) {
- for (var index of ['persons', 'places', 'objects']) {
- state.activeFilters[index] = []
- }
- }
- },
- // actions
- actions: {
- getResults ({ dispatch, commit, state }, $infiniteLoadingState = null) {
- console.log('getResults', state.keys, $infiniteLoadingState)
- // reset results on new search
- commit('setIsloading', true)
- let params = {
- search: `${state.keys}`,
- start: state.offset,
- count: state.limit
- }
- if (state.searchTypeValue.code !== 'text') {
- params.type = state.searchTypeValue.code
- }
- let f
- for (var index of ['persons', 'places', 'objects']) {
- if (state.activeFilters[index].length) {
- f = `filter${index.charAt(0).toUpperCase()}${index.slice(1)}`
- params[f] = []
- for (var i = 0; i < state.activeFilters[index].length; i++) {
- params[f].push(state.activeFilters[index][i].code)
- }
- }
- }
- // params.filterPersons = ['nomLouisXIII', 'nomChampagnePhilippeDe']
- // console.log('Search getResults params', params);
- let q = qs.stringify(params)
- return REST.get(`${window.apipath}/search?` + q)
- .then(({ data }) => {
- console.log('search REST: data', data.meta.quantity.quantity, state.offset + state.limit, data)
- commit('setIsloading', false)
- commit('setOpened', true)
- commit('setResults', data.content)
- commit('setResultsCount', data.meta.quantity)
- commit('setFilters', data.meta.filters)
- if ($infiniteLoadingState) {
- if (state.offset + state.limit > data.meta.quantity.quantity) {
- console.log('Search infinite completed')
- // tell to vue-infinite-loading plugin that there si no new page
- $infiniteLoadingState.complete()
- } else {
- console.log('Search infinite loaded')
- // tell to vue-infinite-loading plugin that newpage is loaded
- $infiniteLoadingState.loaded()
- }
- }
- })
- .catch((error) => {
- console.warn('Issue with search', error)
- commit('setIsloading', false)
- $infiniteLoadingState.error()
- Promise.reject(error)
- })
- },
- newSearch ({ dispatch, commit, state }) {
- commit('resetResults')
- commit('resetActiveFilters')
- dispatch('getResults')
- },
- filteredSearch ({ dispatch, commit, state }) {
- commit('resetResults')
- dispatch('getResults')
- },
- nextResultsBatch ({ dispatch, commit, state }, $infiniteLoadingState) {
- console.log('nextResultsBatch', $infiniteLoadingState)
- commit('incrementOffset')
- if (state.offset < state.resultsQuantity.quantity) {
- dispatch('getResults', $infiniteLoadingState)
- } else {
- $infiniteLoadingState.complete()
- }
- },
- setSearchTypeValue ({ dispatch, commit, state }, value) {
- commit('setSearchTypeValue', value)
- },
- setSearchActiveFilters ({ dispatch, commit, state }, filters) {
- // console.log('setSearchFiltersValue', filters)
- commit('setActiveFilters', filters)
- dispatch('filteredSearch')
- }
- }
- }
|