search.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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-es3'
  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. // include: 'drupal_internal__nid',
  102. 'filter[uuids-groupe][group][conjunction]': 'OR'
  103. };
  104. for (var i = 0; i < uuids.length; i++) {
  105. let uuid = uuids[i]
  106. params[`filter[${uuid}][condition][path]`] = 'id'
  107. params[`filter[${uuid}][condition][value]`] = uuid
  108. params[`filter[${uuid}][condition][operator]`] = '='
  109. params[`filter[${uuid}][condition][memberOf]`] = 'uuids-groupe'
  110. }
  111. // console.log('search JSONAPI params', params);
  112. let q = qs.stringify(params)
  113. return JSONAPI.get('node/materiau?'+q)
  114. .then(({ data }) => {
  115. console.log('search getItems data', data)
  116. dispatch('parseItems', {data:data.data, uuids:uuids})
  117. // commit('setItems', data.items)
  118. })
  119. .catch(( error ) => {
  120. console.warn('Issue with getItems', error)
  121. Promise.reject(error)
  122. })
  123. },
  124. parseItems({ dispatch, commit, state }, { data, uuids }) {
  125. // data comes from jsonapi query
  126. // uuids comes from solr search query (we loop from uuids to conserve the search results order)
  127. console.log('search parseItems data, uuids', data, uuids)
  128. let items = []
  129. // for (var i = 0; i < data.length; i++) {
  130. for (var i = 0; i < uuids.length; i++) {
  131. let uuid = uuids[i]
  132. // https://stackoverflow.com/questions/11258077/how-to-find-index-of-an-object-by-key-and-value-in-an-javascript-array
  133. let item_index = data.findIndex(p => p.id == uuid)
  134. // console.log('item_index', item_index);
  135. if(item_index == -1) continue;
  136. let item_src = data[item_index]
  137. let attrs = item_src.attributes
  138. let relations = item_src.relationships
  139. // get field values
  140. let item = {
  141. uuid: uuid,
  142. title: attrs.title,
  143. field_short_description: attrs.field_short_description,
  144. body: attrs.body,
  145. field_reference: attrs.field_reference,
  146. }
  147. // get images included values
  148. let img_src = relations.images.data
  149. // console.log('img_src', img_src);
  150. // this is a temporary deactivation of images
  151. // img_src = [];
  152. item.images = []
  153. for (var j = 0; j < img_src.length; j++) {
  154. if(img_src[j].meta.imageDerivatives){
  155. item.images.push({
  156. title: img_src[j].meta.title,
  157. // meta.imageDerivatives.style.href link is provided by drupal consumers_image_styles module
  158. // BUG: missing all image derivative but first
  159. url: img_src[j].meta.imageDerivatives.links.card_medium.href
  160. })
  161. }else{
  162. console.warn('missing image derivative '+j+'/'+img_src.length+' for '+attrs.title);
  163. }
  164. }
  165. items.push(item)
  166. }
  167. console.log('items', items)
  168. commit('setItems', items)
  169. if(state.infiniteLoadingState){
  170. if (state.offset + state.limit > state.count) {
  171. console.log('Search infinite completed');
  172. // tell to vue-infinite-loading plugin that there si no new page
  173. state.infiniteLoadingState.complete()
  174. }else{
  175. console.log('Search infinite loaded');
  176. // tell to vue-infinite-loading plugin that newpage is loaded
  177. state.infiniteLoadingState.loaded()
  178. }
  179. }
  180. }
  181. }
  182. }