search.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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. resultsCount: '',
  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. },
  37. setResultsCount (state, quantity) {
  38. state.resultsCount = `${quantity.quantity} ${quantity.unit}`
  39. },
  40. incrementOffset (state) {
  41. state.offset += state.limit
  42. },
  43. setIsloading (state, isloading) {
  44. state.isloading = isloading
  45. },
  46. setOpened (state, opened) {
  47. state.opened = opened
  48. },
  49. setSearchTypeValue (state, value) {
  50. state.searchTypeValue = value
  51. },
  52. setFilters (state, filters) {
  53. for (let index in filters) {
  54. if (filters.hasOwnProperty(index)) {
  55. console.log('index', index)
  56. if (filters[index]) {
  57. if (Array.isArray(filters[index])) {
  58. state.filters[index] = []
  59. for (var i = 0; i < filters[index].length; i++) {
  60. if (filters[index][i].uuid && filters[index][i].title) {
  61. state.filters[index].push({
  62. code: filters[index][i].uuid,
  63. label: filters[index][i].title
  64. })
  65. }
  66. }
  67. } else {
  68. if (filters[index].uuid && filters[index].title) {
  69. state.filters[index] = [{
  70. code: filters[index].uuid,
  71. label: filters[index].title
  72. }]
  73. }
  74. }
  75. } else {
  76. state.filters[index] = []
  77. }
  78. }
  79. }
  80. console.log('filters', state.filters)
  81. },
  82. setActiveFilters (state, filters) {
  83. // console.log('setActiveFilters', filters)
  84. state.activeFilters[filters.index] = filters.value
  85. // console.log('state.activeFilters', state.activeFilters)
  86. },
  87. resetFiltersValues (state) {
  88. for (var index of ['persons', 'places', 'objects']) {
  89. state.activeFilters[index] = []
  90. }
  91. }
  92. },
  93. // actions
  94. actions: {
  95. getResults ({ dispatch, commit, state }, $infiniteLoadingState = null) {
  96. console.log('getResults', state.keys, $infiniteLoadingState)
  97. // reset results on new search
  98. if (!$infiniteLoadingState) {
  99. commit('resetResults')
  100. }
  101. commit('setIsloading', true)
  102. let params = {
  103. search: `${state.keys}`,
  104. start: state.offset,
  105. count: state.limit
  106. }
  107. if (state.searchTypeValue.code !== 'text') {
  108. params.type = state.searchTypeValue.code
  109. }
  110. // params.filterPersons = ['nomLouisXIII', 'nomChampagnePhilippeDe']
  111. // if ()
  112. // console.log('Search getResults params', params);
  113. let q = qs.stringify(params)
  114. return REST.get(`${window.apipath}/search?` + q)
  115. .then(({ data }) => {
  116. // console.log('search REST: data', data.meta.quantity.quantity, state.offset + state.limit, data)
  117. commit('setIsloading', false)
  118. commit('setOpened', true)
  119. commit('setResults', data.content)
  120. commit('setResultsCount', data.meta.quantity)
  121. commit('setFilters', data.meta.filters)
  122. if ($infiniteLoadingState) {
  123. if (state.offset + state.limit > data.meta.quantity.quantity) {
  124. console.log('Search infinite completed')
  125. // tell to vue-infinite-loading plugin that there si no new page
  126. $infiniteLoadingState.complete()
  127. } else {
  128. console.log('Search infinite loaded')
  129. // tell to vue-infinite-loading plugin that newpage is loaded
  130. $infiniteLoadingState.loaded()
  131. }
  132. }
  133. })
  134. .catch((error) => {
  135. console.warn('Issue with search', error)
  136. commit('setIsloading', false)
  137. $infiniteLoadingState.error()
  138. Promise.reject(error)
  139. })
  140. },
  141. nextResultsBatch ({ dispatch, commit, state }, $infiniteLoadingState) {
  142. console.log('nextResultsBatch', $infiniteLoadingState)
  143. commit('incrementOffset')
  144. dispatch('getResults', $infiniteLoadingState)
  145. },
  146. setSearchTypeValue ({ dispatch, commit, state }, value) {
  147. commit('setSearchTypeValue', value)
  148. },
  149. setSearchFiltersValue ({ dispatch, commit, state }, filters) {
  150. // console.log('setSearchFiltersValue', filters)
  151. commit('setActiveFilters', filters)
  152. }
  153. }
  154. }