PersonnalizedList.vue 3.2 KB

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