PersonnalizedList.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <template>
  2. <main>
  3. <v-menu
  4. bottom
  5. left
  6. transition="slide-y-transition"
  7. :close-on-content-click="false"
  8. min-width="500"
  9. >
  10. <template #activator="{ on, attrs }">
  11. <span
  12. v-bind="attrs"
  13. class="ot_green--text"
  14. v-on="on"
  15. >
  16. {{ $t('my_list') }}
  17. </span>
  18. </template>
  19. <v-list>
  20. <v-list-item>
  21. <v-list-item-title>
  22. <UiInputAutocomplete
  23. :label="$t('searchList')"
  24. :is-loading="isLoading"
  25. :items="items"
  26. :item-text="['label']"
  27. :return-object="true"
  28. @update="goOn"
  29. />
  30. </v-list-item-title>
  31. </v-list-item>
  32. </v-list>
  33. </v-menu>
  34. </main>
  35. </template>
  36. <script lang="ts">
  37. import {
  38. computed, defineComponent, useContext, useFetch, ref, Ref, ComputedRef
  39. } from '@nuxtjs/composition-api'
  40. import { Collection } from '@vuex-orm/core'
  41. import { QUERY_TYPE } from '~/types/enums'
  42. import { PersonalizedList } from '~/models/Access/PersonalizedList'
  43. import { repositoryHelper } from '~/services/store/repository'
  44. import { AnyJson } from '~/types/interfaces'
  45. import { $objectProperties } from '~/services/utils/objectProperties'
  46. import VueI18n from "vue-i18n";
  47. export default defineComponent({
  48. fetchOnServer: false,
  49. setup () {
  50. const { $dataProvider, $config } = useContext()
  51. const isLoading: Ref<boolean> = ref(true)
  52. const homeUrl:string = $config.baseURL_adminLegacy
  53. useFetch(async () => {
  54. await $dataProvider.invoke({
  55. type: QUERY_TYPE.MODEL,
  56. model: PersonalizedList
  57. })
  58. isLoading.value = false
  59. })
  60. const items:ComputedRef<Array<AnyJson>> = computed(() => {
  61. const lists = repositoryHelper.findCollectionFromModel(PersonalizedList, {'id':'desc'}) as Collection<PersonalizedList>
  62. let listsGroupByKeyMenu:Array<AnyJson> = groupListByKey(lists)
  63. listsGroupByKeyMenu = $objectProperties.sortObjectByKey(listsGroupByKeyMenu)
  64. return constructAutoCompleteItems(listsGroupByKeyMenu)
  65. })
  66. const goOn = (list:PersonalizedList) => {
  67. window.location.href = `${homeUrl}/${list.entity}/list/${list.id}`
  68. }
  69. return {
  70. items,
  71. isLoading,
  72. goOn
  73. }
  74. }
  75. })
  76. /**
  77. * On regroupe la list par clé afin de constituer les groups
  78. * @param lists
  79. * @param i18n
  80. */
  81. function groupListByKey (lists:Collection<PersonalizedList>): Array<AnyJson> {
  82. const { app: { i18n } } = useContext()
  83. const listsGroupByKeyMenu:any = {}
  84. for (const list of lists) {
  85. const key = i18n.t(list.menuKey) as string
  86. listsGroupByKeyMenu[key] = listsGroupByKeyMenu[key] ?? []
  87. listsGroupByKeyMenu[key].push(list)
  88. }
  89. return listsGroupByKeyMenu
  90. }
  91. /**
  92. * On construit la list d'Item, constituée de Header et d'Item "sélectionnable"
  93. * @param listsGroupByKeyMenu
  94. */
  95. function constructAutoCompleteItems (listsGroupByKeyMenu:Array<any>) {
  96. const items: any = []
  97. for (const key in listsGroupByKeyMenu) {
  98. items.push({ header: key })
  99. for (const item of listsGroupByKeyMenu[key]) {
  100. items.push(item)
  101. }
  102. }
  103. return items
  104. }
  105. </script>
  106. <style scoped>
  107. </style>