search.js 6.1 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. const 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. const 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. const 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 (let i = 0; i < uuids.length; i++) {
  105. const 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. const 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. const items = []
  129. // for (var i = 0; i < data.length; i++) {
  130. for (let i = 0; i < uuids.length; i++) {
  131. const 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. const item_index = data.findIndex(p => p.id == uuid)
  134. // console.log('item_index', item_index);
  135. if (item_index == -1) continue
  136. const item_src = data[item_index]
  137. const attrs = item_src.attributes
  138. const relations = item_src.relationships
  139. // get field values
  140. const 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. const 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 (let 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. }