search.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. import { REST } from 'api/rest-axios'
  2. import qs from 'querystring'
  3. export default {
  4. namespaced: true,
  5. // initial state
  6. state: {
  7. keys: '',
  8. searchTypeOptions: [
  9. { 'code': 'text', 'label': 'Dans les textes' },
  10. { 'code': 'persons', 'label': 'Dans les personnes' },
  11. { 'code': 'places', 'label': 'Dans les lieux' },
  12. { 'code': 'objects', 'label': 'Dans les objets' }
  13. ],
  14. searchTypeValue: { 'code': 'text', 'label': 'Dans les textes' },
  15. filters: { persons: [], places: [], objects: [] },
  16. activeFilters: { persons: [], places: [], objects: [] },
  17. results: [],
  18. resultsQuantity: null,
  19. isloading: false,
  20. limit: 10,
  21. offset: 0,
  22. opened: false
  23. },
  24. // getters
  25. getters: {},
  26. // mutations
  27. mutations: {
  28. setKeys (state, keys) {
  29. state.keys = keys
  30. },
  31. setResults (state, content) {
  32. state.results = state.results.concat(content)
  33. },
  34. resetResults (state) {
  35. state.results = []
  36. state.offset = 0
  37. },
  38. setResultsCount (state, quantity) {
  39. state.resultsQuantity = quantity
  40. },
  41. incrementOffset (state) {
  42. state.offset += state.limit
  43. },
  44. setIsloading (state, isloading) {
  45. state.isloading = isloading
  46. },
  47. setOpened (state, opened) {
  48. state.opened = opened
  49. },
  50. setSearchTypeValue (state, value) {
  51. state.searchTypeValue = value
  52. },
  53. setFilters (state, filters) {
  54. for (let index in filters) {
  55. if (filters.hasOwnProperty(index)) {
  56. console.log('index', index)
  57. if (filters[index]) {
  58. if (Array.isArray(filters[index])) {
  59. state.filters[index] = []
  60. for (var i = 0; i < filters[index].length; i++) {
  61. if (filters[index][i].uuid && filters[index][i].title) {
  62. state.filters[index].push({
  63. code: filters[index][i].uuid,
  64. label: filters[index][i].title
  65. })
  66. }
  67. }
  68. } else {
  69. if (filters[index].uuid && filters[index].title) {
  70. state.filters[index] = [{
  71. code: filters[index].uuid,
  72. label: filters[index].title
  73. }]
  74. }
  75. }
  76. } else {
  77. state.filters[index] = []
  78. }
  79. }
  80. }
  81. console.log('filters', state.filters)
  82. },
  83. setActiveFilters (state, filters) {
  84. // console.log('setActiveFilters', filters)
  85. state.activeFilters[filters.index] = filters.value
  86. // console.log('state.activeFilters', state.activeFilters)
  87. },
  88. resetActiveFilters (state) {
  89. for (var index of ['persons', 'places', 'objects']) {
  90. state.activeFilters[index] = []
  91. }
  92. }
  93. },
  94. // actions
  95. actions: {
  96. getResults ({ dispatch, commit, state }, $infiniteLoadingState = null) {
  97. console.log('getResults', state.keys, $infiniteLoadingState)
  98. // reset results on new search
  99. commit('setIsloading', true)
  100. let params = {
  101. search: `${state.keys}`,
  102. start: state.offset,
  103. count: state.limit
  104. }
  105. if (state.searchTypeValue.code !== 'text') {
  106. params.type = state.searchTypeValue.code
  107. }
  108. let f
  109. for (var index of ['persons', 'places', 'objects']) {
  110. if (state.activeFilters[index].length) {
  111. f = `filter${index.charAt(0).toUpperCase()}${index.slice(1)}`
  112. params[f] = []
  113. for (var i = 0; i < state.activeFilters[index].length; i++) {
  114. params[f].push(state.activeFilters[index][i].code)
  115. }
  116. }
  117. }
  118. // params.filterPersons = ['nomLouisXIII', 'nomChampagnePhilippeDe']
  119. // console.log('Search getResults params', params);
  120. let q = qs.stringify(params)
  121. return REST.get(`${window.apipath}/search?` + q)
  122. .then(({ data }) => {
  123. console.log('search REST: data', data.meta.quantity.quantity, state.offset + state.limit, data)
  124. commit('setIsloading', false)
  125. commit('setOpened', true)
  126. commit('setResults', data.content)
  127. commit('setResultsCount', data.meta.quantity)
  128. commit('setFilters', data.meta.filters)
  129. if ($infiniteLoadingState) {
  130. if (state.offset + state.limit > data.meta.quantity.quantity) {
  131. console.log('Search infinite completed')
  132. // tell to vue-infinite-loading plugin that there si no new page
  133. $infiniteLoadingState.complete()
  134. } else {
  135. console.log('Search infinite loaded')
  136. // tell to vue-infinite-loading plugin that newpage is loaded
  137. $infiniteLoadingState.loaded()
  138. }
  139. }
  140. })
  141. .catch((error) => {
  142. console.warn('Issue with search', error)
  143. commit('setIsloading', false)
  144. $infiniteLoadingState.error()
  145. Promise.reject(error)
  146. })
  147. },
  148. newSearch ({ dispatch, commit, state }) {
  149. commit('resetResults')
  150. commit('resetActiveFilters')
  151. dispatch('getResults')
  152. },
  153. filteredSearch ({ dispatch, commit, state }) {
  154. commit('resetResults')
  155. dispatch('getResults')
  156. },
  157. nextResultsBatch ({ dispatch, commit, state }, $infiniteLoadingState) {
  158. console.log('nextResultsBatch', $infiniteLoadingState)
  159. commit('incrementOffset')
  160. if (state.offset < state.resultsQuantity.quantity) {
  161. dispatch('getResults', $infiniteLoadingState)
  162. } else {
  163. $infiniteLoadingState.complete()
  164. }
  165. },
  166. setSearchTypeValue ({ dispatch, commit, state }, value) {
  167. commit('setSearchTypeValue', value)
  168. },
  169. setSearchActiveFilters ({ dispatch, commit, state }, filters) {
  170. // console.log('setSearchFiltersValue', filters)
  171. commit('setActiveFilters', filters)
  172. dispatch('filteredSearch')
  173. }
  174. }
  175. }