|
1 | | -<!-- eslint-disable vue/no-v-text-v-html-on-component --> |
2 | 1 | <template> |
3 | 2 | <div class="mr-4"> |
4 | 3 | <v-menu location="bottom" v-bind="$attrs" scrim eager> |
|
14 | 13 | data-test="tags-btn" |
15 | 14 | color="primary" |
16 | 15 | variant="outlined" |
17 | | - :disabled="getListTags.length == 0" |
| 16 | + :disabled="tags.length === 0" |
18 | 17 | @click="getTags" |
19 | 18 | > |
20 | 19 | Tags |
|
24 | 23 | </template> |
25 | 24 | <v-list shaped density="compact" class="bg-v-theme-surface"> |
26 | 25 | <div> |
27 | | - <template v-for="(item, i) in getListTags"> |
| 26 | + <template v-for="(item, i) in tags"> |
28 | 27 | <v-divider v-if="!item" :key="`divider-${i}`" /> |
29 | 28 |
|
30 | 29 | <v-list-item |
|
42 | 41 | color="primary" |
43 | 42 | hide-details |
44 | 43 | /> |
45 | | - |
46 | | - <v-list-item-title v-text="item" /> |
| 44 | + <v-list-item-title>{{ item }}</v-list-item-title> |
47 | 45 | </v-list-item-action> |
48 | 46 | </div> |
49 | 47 | </template> |
|
58 | 56 | <script setup lang="ts"> |
59 | 57 | import { computed, onMounted, ref } from "vue"; |
60 | 58 | import axios, { AxiosError } from "axios"; |
61 | | -import { useStore } from "@/store"; |
62 | 59 | import handleError from "@/utils/handleError"; |
63 | 60 | import useSnackbar from "@/helpers/snackbar"; |
64 | 61 | import useContainersStore from "@/store/modules/containers"; |
65 | 62 | import useDevicesStore from "@/store/modules/devices"; |
| 63 | +import useTagsStore from "@/store/modules/tags"; |
66 | 64 |
|
67 | 65 | const props = defineProps<{ variant: "device" | "container" }>(); |
68 | 66 |
|
69 | | -const store = useStore(); |
70 | 67 | const containersStore = useContainersStore(); |
71 | 68 | const devicesStore = useDevicesStore(); |
| 69 | +const tagsStore = useTagsStore(); |
72 | 70 | const snackbar = useSnackbar(); |
73 | | -const prevSelectedLength = ref(0); |
74 | | -const getListTags = computed(() => store.getters["tags/list"]); |
75 | | -const selectedTags = computed<Array<string>>(() => store.getters["tags/selected"]); |
| 71 | +const tags = computed(() => tagsStore.tags); |
| 72 | +const selectedTags = ref<Array<string>>([]); |
76 | 73 | const tagIsSelected = (tag: string) => selectedTags.value.includes(tag); |
77 | 74 |
|
78 | 75 | const getTags = async () => { |
79 | | - await store.dispatch("tags/fetch"); |
| 76 | + await tagsStore.fetchTags(); |
80 | 77 | }; |
81 | 78 |
|
82 | 79 | const fetchDevices = async (filter?: string) => { |
@@ -113,18 +110,11 @@ const getItems = async (item: Array<string>) => { |
113 | 110 | }; |
114 | 111 |
|
115 | 112 | const selectTag = async (item: string) => { |
116 | | - store.dispatch("tags/setSelected", item); |
117 | | - if (selectedTags.value.length > 0) { |
118 | | - await getItems(selectedTags.value); |
119 | | - prevSelectedLength.value = selectedTags.value.length; |
120 | | - } else if (prevSelectedLength.value === 1 && selectedTags.value.length === 0) { |
121 | | - await fetchDevices(); |
122 | | - } |
| 113 | + if (tagIsSelected(item)) selectedTags.value = selectedTags.value.filter((tag) => tag !== item); |
| 114 | + else selectedTags.value.push(item); |
123 | 115 |
|
124 | | - if (selectedTags.value.length === 0) { |
125 | | - await store.dispatch("tags/clearSelectedTags"); |
126 | | - await fetchDevices(); |
127 | | - } |
| 116 | + if (selectedTags.value.length) await getItems(selectedTags.value); |
| 117 | + else await fetchDevices(); |
128 | 118 | }; |
129 | 119 |
|
130 | 120 | onMounted(async () => { |
|
0 commit comments