search.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. // import axios from 'axios'
  2. import { REST } from 'api/rest-axios'
  3. import qs from 'querystring'
  4. // const _CancelToken = axios.CancelToken
  5. // const _cancelTokenSource = _CancelToken.source()
  6. // let _cancel
  7. export default {
  8. namespaced: true,
  9. testconst: 'Hello',
  10. // initial state
  11. state: {
  12. keys: '',
  13. searchTypeOptions: [
  14. { 'code': 'text', 'label': 'Dans les textes' },
  15. { 'code': 'persons', 'label': 'Dans les personnes' },
  16. { 'code': 'places', 'label': 'Dans les lieux' },
  17. { 'code': 'objects', 'label': 'Dans les objets' }
  18. ],
  19. searchTypeValue: { 'code': 'text', 'label': 'Dans les textes' },
  20. filters: { persons: [], places: [], objects: [] },
  21. activeFilters: { persons: [], places: [], objects: [] },
  22. sortOptions: [
  23. { code: 'date', label: 'date' },
  24. { code: 'score', label: 'pertinence' },
  25. { code: 'size', label: 'nombre de mots' }
  26. ],
  27. sorting: null,
  28. results: [],
  29. resultsQuantity: null,
  30. isloading: false,
  31. // infiniteLoadingIsLoading: false,
  32. // infiniteLoadingCancelToken: null,
  33. // infiniteLoadingCancelTokenSource: null,
  34. limit: 10,
  35. offset: 0,
  36. opened: false
  37. },
  38. // getters
  39. getters: {},
  40. // mutations
  41. mutations: {
  42. setKeys (state, keys) {
  43. state.keys = keys
  44. },
  45. setResults (state, content) {
  46. state.results = state.results.concat(content)
  47. },
  48. resetResults (state) {
  49. state.results = []
  50. state.offset = 0
  51. },
  52. setResultsCount (state, quantity) {
  53. state.resultsQuantity = quantity
  54. },
  55. incrementOffset (state) {
  56. state.offset += state.limit
  57. },
  58. setIsloading (state, isloading) {
  59. state.isloading = isloading
  60. },
  61. setOpened (state, opened) {
  62. state.opened = opened
  63. },
  64. setSearchTypeValue (state, value) {
  65. state.searchTypeValue = value
  66. },
  67. setFilters (state, filters) {
  68. for (let index in filters) {
  69. if (filters.hasOwnProperty(index)) {
  70. console.log('index', index)
  71. if (filters[index]) {
  72. if (Array.isArray(filters[index])) {
  73. state.filters[index] = []
  74. for (var i = 0; i < filters[index].length; i++) {
  75. if (filters[index][i].uuid && filters[index][i].title) {
  76. state.filters[index].push({
  77. code: filters[index][i].uuid,
  78. label: filters[index][i].title
  79. })
  80. }
  81. }
  82. } else {
  83. if (filters[index].uuid && filters[index].title) {
  84. state.filters[index] = [{
  85. code: filters[index].uuid,
  86. label: filters[index].title
  87. }]
  88. }
  89. }
  90. } else {
  91. state.filters[index] = []
  92. }
  93. }
  94. }
  95. console.log('filters', state.filters)
  96. },
  97. setActiveFilters (state, filters) {
  98. // console.log('setActiveFilters', filters)
  99. state.activeFilters[filters.index] = filters.value
  100. // console.log('state.activeFilters', state.activeFilters)
  101. },
  102. resetActiveFilters (state) {
  103. for (var index of ['persons', 'places', 'objects']) {
  104. state.activeFilters[index] = []
  105. }
  106. },
  107. setSorting (state, sort) {
  108. console.log('setSorting', sort)
  109. state.sorting = sort
  110. }
  111. },
  112. // actions
  113. actions: {
  114. getResults ({ dispatch, commit, state }, $infiniteLoadingState = null) {
  115. console.log('getResults', state.keys, $infiniteLoadingState)
  116. // reset results on new search
  117. if (!$infiniteLoadingState) {
  118. commit('setIsloading', true)
  119. }
  120. // else {
  121. // state.infiniteLoadingIsLoading = true
  122. // }
  123. let params = {
  124. search: `${state.keys}`,
  125. start: state.offset,
  126. count: state.limit
  127. }
  128. if (state.searchTypeValue.code !== 'text') {
  129. params.type = state.searchTypeValue.code
  130. }
  131. let f
  132. for (var index of ['persons', 'places', 'objects']) {
  133. if (state.activeFilters[index].length) {
  134. f = `filter${index.charAt(0).toUpperCase()}${index.slice(1)}`
  135. params[f] = []
  136. for (var i = 0; i < state.activeFilters[index].length; i++) {
  137. params[f].push(state.activeFilters[index][i].code)
  138. }
  139. }
  140. }
  141. // params.filterPersons = ['nomLouisXIII', 'nomChampagnePhilippeDe']
  142. if (state.sorting) {
  143. params.sort = state.sorting.code
  144. }
  145. // console.log('Search getResults params', params);
  146. let q = qs.stringify(params)
  147. let ops = {}
  148. // if ($infiniteLoadingState) {
  149. // ops.cancelToken = new _CancelToken(function executor (c) {
  150. // _cancel = c
  151. // })
  152. // }
  153. return REST.get(`${window.apipath}/search?` + q, ops)
  154. .then(({ data }) => {
  155. console.log('search REST: data', data.meta.quantity.quantity, state.offset + state.limit, data)
  156. commit('setResultsCount', data.meta.quantity)
  157. commit('setFilters', data.meta.filters)
  158. if ($infiniteLoadingState) {
  159. if (state.isLoading) {
  160. // we are in a new search or an update so we dont apply the infinite loading received results
  161. $infiniteLoadingState.complete()
  162. } else {
  163. commit('setResults', data.content)
  164. if (state.offset + state.limit > data.meta.quantity.quantity) {
  165. console.log('Search infinite completed')
  166. // tell to vue-infinite-loading plugin that there si no new page
  167. $infiniteLoadingState.complete()
  168. } else {
  169. console.log('Search infinite loaded')
  170. // tell to vue-infinite-loading plugin that newpage is loaded
  171. $infiniteLoadingState.loaded()
  172. }
  173. // state.infiniteLoadingIsLoading = false
  174. }
  175. } else {
  176. commit('resetResults')
  177. commit('setIsloading', false)
  178. commit('setOpened', true)
  179. commit('setResults', data.content)
  180. }
  181. })
  182. .catch((error) => {
  183. console.warn('Issue with search', error)
  184. commit('setIsloading', false)
  185. // if (axios.isCancel(error)) {
  186. // console.log('Request canceled', error.message)
  187. // if ($infiniteLoadingState) {
  188. // $infiniteLoadingState.complete()
  189. // }
  190. // } else {
  191. Promise.reject(error)
  192. if ($infiniteLoadingState) {
  193. $infiniteLoadingState.error()
  194. }
  195. // }
  196. })
  197. },
  198. newSearch ({ dispatch, commit, state }) {
  199. // commit('resetResults')
  200. commit('resetActiveFilters')
  201. // if (_cancel) {
  202. // _cancel('new search fired')
  203. // }
  204. dispatch('getResults')
  205. },
  206. updateSearch ({ dispatch, commit, state }) {
  207. // TODO: wait for new results came to reset results list
  208. // TODO: indicate loading state
  209. // commit('resetResults')
  210. dispatch('getResults')
  211. },
  212. nextResultsBatch ({ dispatch, commit, state }, $infiniteLoadingState) {
  213. console.log('nextResultsBatch', $infiniteLoadingState)
  214. commit('incrementOffset')
  215. if (state.offset < state.resultsQuantity.quantity) {
  216. dispatch('getResults', $infiniteLoadingState)
  217. } else {
  218. $infiniteLoadingState.complete()
  219. }
  220. },
  221. setSearchTypeValue ({ dispatch, commit, state }, value) {
  222. commit('setSearchTypeValue', value)
  223. }
  224. // setSearchActiveFilters ({ dispatch, commit, state }, filters) {
  225. // // console.log('setSearchFiltersValue', filters)
  226. // commit('setActiveFilters', filters)
  227. // dispatch('updateSearch')
  228. // }
  229. }
  230. }