search.js 6.0 KB

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