|
1 | 1 | <template> |
2 | | - <div class="cursor-pointer hover:scale-110 transition-transform" @click="isDropdownOpen = !isDropdownOpen"> |
3 | | - <div v-if="isAlLeastOneJobRunning" class="relative"> |
4 | | - <div class="loader "></div> |
5 | | - <div class="absolute -bottom-1 -right-1 rounded-full bg-lightPrimary w-4 h-4 text-xs flex items-center justify-center text-white"> {{ jobsCount }}</div> |
| 2 | + <div ref="dropdownRef"> |
| 3 | + <div class="cursor-pointer hover:scale-110 transition-transform" @click="isDropdownOpen = !isDropdownOpen"> |
| 4 | + <div v-if="isAlLeastOneJobRunning" class="relative"> |
| 5 | + <div class="loader "></div> |
| 6 | + <div class="absolute -bottom-1 -right-1 rounded-full bg-lightPrimary w-4 h-4 text-xs flex items-center justify-center text-white"> {{ jobsCount }}</div> |
| 7 | + </div> |
| 8 | + <div class="flex items-center justify-center" v-else-if="jobs.length > 0"> |
| 9 | + <Tooltip> |
| 10 | + <IconCheckCircleOutline class="w-8 h-8 text-green-500" /> |
| 11 | + <template #tooltip> |
| 12 | + {{ t('All jobs completed') }} |
| 13 | + </template> |
| 14 | + </Tooltip> |
| 15 | + </div> |
6 | 16 | </div> |
7 | | - <div class="flex items-center justify-center" v-else-if="jobs.length > 0"> |
8 | | - <Tooltip> |
9 | | - <IconCheckCircleOutline class="w-8 h-8 text-green-500" /> |
10 | | - <template #tooltip> |
11 | | - {{ t('All jobs completed') }} |
12 | | - </template> |
13 | | - </Tooltip> |
| 17 | + <div v-if="isDropdownOpen" class="absolute right-28 top-14 md:top-12 rounded z-10"> |
| 18 | + <JobsList :jobs="jobs" /> |
14 | 19 | </div> |
15 | 20 | </div> |
16 | | - <div v-if="isDropdownOpen" class="absolute right-28 top-14 md:top-12 rounded z-10"> |
17 | | - <JobsList :jobs="jobs" /> |
18 | | - </div> |
19 | 21 |
|
20 | 22 |
|
21 | 23 | </template> |
|
32 | 34 | import type { IJob } from './utils'; |
33 | 35 | import { callAdminForthApi } from '@/utils'; |
34 | 36 | import websocket from '@/websocket'; |
| 37 | + import { onClickOutside } from '@vueuse/core' |
35 | 38 |
|
36 | 39 | const { t } = useI18n(); |
37 | 40 |
|
|
44 | 47 |
|
45 | 48 | const isDropdownOpen = ref(false); |
46 | 49 | const jobs = ref<IJob[]>([]); |
| 50 | + const dropdownRef = ref<HTMLElement | null>(null); |
| 51 | +
|
| 52 | + onClickOutside(dropdownRef, () => { |
| 53 | + isDropdownOpen.value = false; |
| 54 | + }); |
47 | 55 |
|
48 | 56 | const isAlLeastOneJobRunning = computed(() => { |
49 | 57 | return jobs.value.some(job => job.status === 'IN_PROGRESS'); |
|
0 commit comments