123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- import axios from 'axios'
- import { REST } from 'api/rest-axios'
- import qs from 'querystring'
- const _filterskeys = ['persons', 'places', 'objects', 'texts']
- const _CancelToken = axios.CancelToken
- // const _cancelTokenSource = _CancelToken.source()
- let _cancelTokens = []
- export default {
- namespaced: true,
- testconst: 'Hello',
- // initial state
- state: {
- keys: '',
- searchedKeys: '',
- 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: [], texts: [] },
- activeFilters: { persons: [], places: [], objects: [], texts: [] },
- sortOptions: [
- { code: 'date', label: 'date' },
- { code: 'score', label: 'pertinence' },
- { code: 'size', label: 'nombre de mots' }
- ],
- sorting: null,
- results: [],
- resultsQuantity: null,
- isloading: false,
- limit: 10,
- offset: 0,
- opened: false
- },
- // getters
- getters: {},
- // mutations
- mutations: {
- setKeys (state, keys) {
- state.keys = keys
- },
- setSearchKeys (state) {
- state.searchedKeys = state.keys
- },
- setResults (state, content) {
- state.results = state.results.concat(content)
- },
- resetResults (state) {
- console.log('resetResults')
- state.results = []
- },
- resetOffset (state) {
- state.offset = 0
- },
- setResultsCount (state, quantity) {
- state.resultsQuantity = quantity
- },
- incrementOffset (state) {
- state.offset += state.limit
- },
- setIsloading (state, isloading) {
- console.log('setIsloading', isloading)
- state.isloading = isloading
- },
- setOpened (state, opened) {
- state.opened = opened
- },
- setSearchTypeValue (state, value) {
- state.searchTypeValue = value
- },
- setFilters (state, filters) {
- for (let filter in filters) {
- if (filters.hasOwnProperty(filter)) {
- console.log('filter', filter)
- if (filters[filter]) {
- if (Array.isArray(filters[filter])) {
- state.filters[filter] = []
- for (var i = 0; i < filters[filter].length; i++) {
- if (filters[filter][i].uuid && filters[filter][i].title) {
- state.filters[filter].push({
- code: filters[filter][i].uuid,
- label: filters[filter][i].title
- })
- }
- }
- } else {
- if (filters[filter].uuid && filters[filter].title) {
- state.filters[filter] = [{
- code: filters[filter].uuid,
- label: filters[filter].title
- }]
- }
- }
- } else {
- state.filters[filter] = []
- }
- }
- }
- console.log('filters', state.filters)
- },
- setActiveFilters (state, filters) {
- // console.log('setActiveFilters', filters)
- state.activeFilters[filters.filter] = filters.value
- // console.log('state.activeFilters', state.activeFilters)
- },
- resetActiveFilters (state) {
- for (var index of _filterskeys) {
- state.activeFilters[index] = []
- }
- },
- setSorting (state, sort) {
- console.log('setSorting', sort)
- state.sorting = sort
- }
- },
- // actions
- actions: {
- getResults ({ dispatch, commit, state }, pl) {
- console.log(`getResults keys: ${pl.keys}, infiniteLoading:`, pl.infiniteLoading)
- if (!pl.infiniteLoading) {
- // loading indicator unless we are on infiniteloading
- commit('setIsloading', true)
- commit('resetOffset')
- // cancel infiniteloading requests
- _cancelTokens.forEach((ct, i) => {
- console.log('_cancelTokens forEach ct', ct)
- ct.cancel('new or updated search fired')
- })
- }
- // construct params
- let params = {
- search: `${pl.keys}`,
- start: state.offset,
- count: state.limit
- }
- if (state.searchTypeValue.code !== 'text') {
- params.type = state.searchTypeValue.code
- }
- let f
- for (var filter of _filterskeys) {
- // console.log(`state.activeFilters[${filter}]`, state.activeFilters[filter])
- if (state.activeFilters[filter].length) {
- f = filter === 'texts' ? 'text' : `filter${filter.charAt(0).toUpperCase()}${filter.slice(1)}`
- params[f] = []
- for (var i = 0; i < state.activeFilters[filter].length; i++) {
- params[f].push(state.activeFilters[filter][i].code)
- }
- }
- }
- if (state.sorting) {
- params.sort = state.sorting.code
- }
- console.log('Search getResults params', params)
- let q = qs.stringify(params)
- // construct options
- let ops = {}
- if (pl.infiniteLoading) {
- ops.cancelToken = pl.infiniteLoading.cancelToken
- }
- return REST.get(`${window.apipath}/search?` + q, ops)
- .then(({ data }) => {
- console.log(`search REST quantity: ${data.meta.quantity.quantity}, offset+limit: ${state.offset + state.limit}, data:`, data)
- commit('setResultsCount', data.meta.quantity)
- commit('setFilters', data.meta.filters)
- if (state.isloading) {
- // a new or updated search has been launched :
- // we dont apply the infinite loading received results
- // and we reset the infinite loader
- // pl.infiniteLoading.$state.reset()
- _cancelTokens.forEach((ct, i) => {
- console.log('_cancelTokens forEach AFTER ct', ct)
- ct.cancel('new or updated search fired')
- ct.$state.complete()
- })
- _cancelTokens = []
- }
- if (!pl.infiniteLoading) {
- // we are not on infiniteloading
- // new or updated search
- commit('resetResults')
- commit('setSearchKeys')
- commit('setResults', data.content)
- commit('setIsloading', false)
- commit('setOpened', true)
- } else {
- // we are on infiniteloading
- // normal InfiniteLoading procedure
- commit('setResults', data.content)
- if (state.offset + state.limit > data.meta.quantity.quantity) {
- // tell to vue-infinite-loading plugin that there is no new page
- pl.infiniteLoading.$state.complete()
- } else {
- // tell to vue-infinite-loading plugin that newpage is loaded
- pl.infiniteLoading.$state.loaded()
- }
- }
- })
- .catch((error) => {
- // console.warn('Issue with search', error)
- if (axios.isCancel(error)) {
- console.info(`Request canceled, message: ${error.message}`)
- // TODO: the $state here is probably not the good one
- // Promise.reject(error)
- // pl.infiniteLoading.$state.reset()
- } else {
- commit('setIsloading', false)
- if (pl.infiniteLoading) {
- pl.infiniteLoading.$state.error()
- }
- Promise.reject(error)
- }
- })
- },
- newSearch ({ dispatch, commit, state }) {
- commit('resetActiveFilters')
- dispatch('getResults', { keys: state.keys })
- // .then((e) => {
- // console.log('dispatch get results then', e)
- // })
- },
- updateSearch ({ dispatch, commit, state }) {
- dispatch('getResults', { keys: state.searchedKeys })
- },
- nextResultsBatch ({ dispatch, commit, state }, $infiniteLoadingState) {
- console.log(`nextResultsBatch, isloading: ${state.isloading}`, $infiniteLoadingState)
- if (state.isloading) {
- // we are loading a new or updated searche
- // we stop the infinite
- $infiniteLoadingState.complete()
- } else {
- commit('incrementOffset')
- if (state.offset < state.resultsQuantity.quantity) {
- dispatch('getResults', {
- keys: state.searchedKeys,
- infiniteLoading: {
- $state: $infiniteLoadingState,
- cancelToken: new _CancelToken((c) => {
- _cancelTokens.push({
- cancel: c,
- $state: $infiniteLoadingState
- })
- })
- }
- })
- } else {
- $infiniteLoadingState.complete()
- }
- }
- }
- }
- }
|