search.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import { JSONAPI } from 'vuejs/api/json-axios'
  2. import { MA } from 'vuejs/api/ma-axios'
  3. import qs from 'querystring'
  4. export default {
  5. namespaced: true,
  6. // initial state
  7. state : {
  8. keys: "",
  9. term: "",
  10. uuids: [],
  11. items: [],
  12. offset: 0,
  13. limit: 15,
  14. infos: null,
  15. count: 0,
  16. // infinteState will come from vue-infinite-loading plugin
  17. // implemented in vuejs/components/Content/Base.vue
  18. infiniteState: null
  19. },
  20. // getters
  21. getters : {},
  22. // mutations
  23. mutations : {
  24. setUuids (state, uuids) {
  25. state.uuids = state.uuids.concat(uuids)
  26. },
  27. resetUuids (state) {
  28. state.uuids = []
  29. },
  30. setItems (state, items) {
  31. state.items = state.items.concat(items)
  32. },
  33. resetItems (state) {
  34. state.items = []
  35. },
  36. setKeys (state, keys) {
  37. state.keys = keys
  38. },
  39. setTerm (state, term) {
  40. state.term = term
  41. },
  42. setInfos (state, infos) {
  43. state.infos = infos
  44. },
  45. setCount (state, count) {
  46. state.count = count
  47. },
  48. resetOffset(state) {
  49. state.offset = 0
  50. },
  51. incrementOffset(state) {
  52. state.offset += state.limit
  53. },
  54. setInfiniteState(state, s){
  55. state.infiniteState = s
  56. }
  57. },
  58. // actions
  59. actions : {
  60. newSearch({ dispatch, commit, state }) {
  61. console.log('Search newSearch');
  62. commit('resetUuids')
  63. commit('resetItems')
  64. commit('resetOffset')
  65. dispatch('getResults')
  66. },
  67. nextPage ({ dispatch, commit, state }, $state) {
  68. console.log("Search nextPage", $state);
  69. commit('incrementOffset')
  70. commit('setInfiniteState', $state)
  71. dispatch('getResults')
  72. },
  73. getResults ({ dispatch, commit, state }) {
  74. let params = {
  75. keys: state.keys,
  76. term: state.term,
  77. offset:state.offset,
  78. limit: state.limit
  79. }
  80. // console.log('Search getResults params', params);
  81. let q = qs.stringify(params)
  82. return MA.get(`/materio_sapi/getresults?`+q)
  83. .then(({ data }) => {
  84. console.log('search MA getresults data', data)
  85. // commit('setItems', data.items)
  86. commit('setInfos', data.infos)
  87. commit('setCount', data.count)
  88. commit('setUuids', data.uuids)
  89. dispatch('getItems', data.uuids)
  90. })
  91. .catch(( error ) => {
  92. console.warn('Issue with getResults', error)
  93. Promise.reject(error)
  94. })
  95. },
  96. getItems({ dispatch, commit, state }, uuids) {
  97. let params = {
  98. // include: 'images', // no needs to include thanks to consumers_image_styles module
  99. 'filter[uuids-groupe][group][conjunction]': 'OR'
  100. };
  101. for (var i = 0; i < uuids.length; i++) {
  102. let uuid = uuids[i]
  103. params[`filter[${uuid}][condition][path]`] = 'id'
  104. params[`filter[${uuid}][condition][value]`] = uuid
  105. params[`filter[${uuid}][condition][operator]`] = '='
  106. params[`filter[${uuid}][condition][memberOf]`] = 'uuids-groupe'
  107. }
  108. // console.log('search JSONAPI params', params);
  109. let q = qs.stringify(params)
  110. return JSONAPI.get('node/materiau?'+q)
  111. .then(({ data }) => {
  112. console.log('search getItems data', data)
  113. dispatch('parseItems', {data:data.data, uuids:uuids})
  114. // commit('setItems', data.items)
  115. })
  116. .catch(( error ) => {
  117. console.warn('Issue with getItems', error)
  118. Promise.reject(error)
  119. })
  120. },
  121. parseItems({ dispatch, commit, state }, { data, uuids }) {
  122. // data comes from jsonapi query
  123. // uuids comes from solr search query (we loop from uuids to conserve the search results order)
  124. console.log('search parseItems data, uuids', data, uuids)
  125. let items = []
  126. // for (var i = 0; i < data.length; i++) {
  127. for (var i = 0; i < uuids.length; i++) {
  128. let uuid = uuids[i]
  129. // https://stackoverflow.com/questions/11258077/how-to-find-index-of-an-object-by-key-and-value-in-an-javascript-array
  130. let item_index = data.findIndex(p => p.id == uuid)
  131. let item_src = data[item_index]
  132. let attrs = item_src.attributes
  133. let relations = item_src.relationships
  134. // get field values
  135. let item = {
  136. uuid: uuid,
  137. title: attrs.title,
  138. description: attrs.field_short_description,
  139. body: attrs.body,
  140. reference: attrs.field_reference,
  141. }
  142. // get images included values
  143. let img_src = relations.images.data
  144. item.images = []
  145. for (var j = 0; j < img_src.length; j++) {
  146. item.images.push({
  147. title: img_src[j].meta.title,
  148. // meta.imageDerivatives.style.href link is provided by drupal consumers_image_styles module
  149. url: img_src[j].meta.imageDerivatives.links.card_medium.href
  150. })
  151. }
  152. items.push(item)
  153. }
  154. console.log('items', items)
  155. commit('setItems', items)
  156. if(state.infiniteState){
  157. if (state.offset + state.limit > state.count) {
  158. console.log('Search infinite completed');
  159. // tell to vue-infinite-loading plugin that there si no new page
  160. state.infiniteState.complete()
  161. }else{
  162. console.log('Search infinite loaded');
  163. // tell to vue-infinite-loading plugin that newpage is loaded
  164. state.infiniteState.loaded()
  165. }
  166. }
  167. }
  168. }
  169. }