|
54 | 54 | </svg> |
55 | 55 | </button> |
56 | 56 | </div> |
57 | | - <div class="z-50 hidden my-4 text-base list-none bg-lightUserMenuBackground divide-y divide-lightUserMenuBorder text-lightUserMenuText rounded shadow dark:shadow-black dark:bg-darkUserMenuBackground dark:divide-darkUserMenuBorder text-darkUserMenuText dark:shadow-black" id="dropdown-user"> |
58 | | - <div class="px-4 py-3" role="none"> |
59 | | - <p class="text-sm text-gray-900 dark:text-darkNavbarText" role="none" v-if="coreStore.userFullname"> |
60 | | - {{ coreStore.userFullname }} |
61 | | - </p> |
62 | | - <p class="text-sm font-medium text-gray-900 truncate dark:text-darkSidebarText" role="none"> |
63 | | - {{ coreStore.username }} |
64 | | - </p> |
| 57 | + <Teleport to="body"> |
| 58 | + <div class="z-50 hidden my-4 text-base list-none bg-lightUserMenuBackground divide-y divide-lightUserMenuBorder text-lightUserMenuText rounded shadow dark:shadow-black dark:bg-darkUserMenuBackground dark:divide-darkUserMenuBorder text-darkUserMenuText dark:shadow-black" id="dropdown-user"> |
| 59 | + <div class="px-4 py-3" role="none"> |
| 60 | + <p class="text-sm text-gray-900 dark:text-darkNavbarText" role="none" v-if="coreStore.userFullname"> |
| 61 | + {{ coreStore.userFullname }} |
| 62 | + </p> |
| 63 | + <p class="text-sm font-medium text-gray-900 truncate dark:text-darkSidebarText" role="none"> |
| 64 | + {{ coreStore.username }} |
| 65 | + </p> |
| 66 | + </div> |
| 67 | + |
| 68 | + <ul class="py-1" role="none"> |
| 69 | + <li v-for="c in userMenuComponents" class="bg-lightUserMenuItemBackground hover:bg-lightUserMenuItemBackgroundHover text-lightUserMenuItemText hover:text-lightUserMenuItemText dark:bg-darkUserMenuItemBackground dark:hover:bg-darkUserMenuItemBackgroundHover dark:text-darkUserMenuItemText dark:hover:darkUserMenuItemTextHover" > |
| 70 | + <component |
| 71 | + :is="getCustomComponent(c)" |
| 72 | + :meta="c.meta" |
| 73 | + :adminUser="coreStore.adminUser" |
| 74 | + /> |
| 75 | + </li> |
| 76 | + <li v-if="coreStore?.config?.settingPages && coreStore.config.settingPages.length > 0"> |
| 77 | + <UserMenuSettingsButton /> |
| 78 | + </li> |
| 79 | + <li> |
| 80 | + <button @click="logout" class="cursor-pointer flex items-center gap-1 block px-4 py-2 text-sm bg-lightUserMenuItemBackground hover:bg-lightUserMenuItemBackgroundHover text-lightUserMenuItemText hover:text-lightUserMenuItemText dark:bg-darkUserMenuItemBackground dark:hover:bg-darkUserMenuItemBackgroundHover dark:text-darkUserMenuItemText dark:hover:darkUserMenuItemTextHover w-full" role="menuitem">{{ $t('Sign out') }}</button> |
| 81 | + </li> |
| 82 | + </ul> |
65 | 83 | </div> |
66 | | - |
67 | | - <ul class="py-1" role="none"> |
68 | | - <li v-for="c in userMenuComponents" class="bg-lightUserMenuItemBackground hover:bg-lightUserMenuItemBackgroundHover text-lightUserMenuItemText hover:text-lightUserMenuItemText dark:bg-darkUserMenuItemBackground dark:hover:bg-darkUserMenuItemBackgroundHover dark:text-darkUserMenuItemText dark:hover:darkUserMenuItemTextHover" > |
69 | | - <component |
70 | | - :is="getCustomComponent(c)" |
71 | | - :meta="c.meta" |
72 | | - :adminUser="coreStore.adminUser" |
73 | | - /> |
74 | | - </li> |
75 | | - <li v-if="coreStore?.config?.settingPages && coreStore.config.settingPages.length > 0"> |
76 | | - <UserMenuSettingsButton /> |
77 | | - </li> |
78 | | - <li> |
79 | | - <button @click="logout" class="cursor-pointer flex items-center gap-1 block px-4 py-2 text-sm bg-lightUserMenuItemBackground hover:bg-lightUserMenuItemBackgroundHover text-lightUserMenuItemText hover:text-lightUserMenuItemText dark:bg-darkUserMenuItemBackground dark:hover:bg-darkUserMenuItemBackgroundHover dark:text-darkUserMenuItemText dark:hover:darkUserMenuItemTextHover w-full" role="menuitem">{{ $t('Sign out') }}</button> |
80 | | - </li> |
81 | | - </ul> |
82 | | - </div> |
| 84 | + </Teleport> |
83 | 85 | </div> |
84 | 86 | </div> |
85 | 87 | </nav> |
|
183 | 185 | </style> |
184 | 186 |
|
185 | 187 | <script setup lang="ts"> |
186 | | -import { computed, onMounted, ref, watch, onBeforeMount } from 'vue'; |
| 188 | +import { computed, nextTick, onMounted, ref, watch, onBeforeMount } from 'vue'; |
187 | 189 | import { RouterView } from 'vue-router'; |
188 | 190 | import { Dropdown } from 'flowbite' |
189 | 191 | import './index.scss' |
@@ -310,11 +312,14 @@ watch(route, () => { |
310 | 312 | }); |
311 | 313 |
|
312 | 314 |
|
313 | | -watch(dropdownUserButton, (dropdownUserButton) => { |
| 315 | +watch(dropdownUserButton, async (dropdownUserButton) => { |
314 | 316 | if (dropdownUserButton) { |
| 317 | + await nextTick(); |
| 318 | + const dropdownUser = document.querySelector('#dropdown-user') as HTMLElement; |
| 319 | + const dropdownUserTrigger = document.querySelector('[data-dropdown-toggle="dropdown-user"]') as HTMLElement; |
315 | 320 | const dd = new Dropdown( |
316 | | - document.querySelector('#dropdown-user') as HTMLElement, |
317 | | - document.querySelector('[data-dropdown-toggle="dropdown-user"]') as HTMLElement, |
| 321 | + dropdownUser, |
| 322 | + dropdownUserTrigger, |
318 | 323 | ); |
319 | 324 | closeUserMenuDropdown = () => { |
320 | 325 | dd.hide(); |
|
0 commit comments