Skip to content

Commit 91f752b

Browse files
committed
fix: refactor user menu dropdown to use Teleport and improve dropdown handling
1 parent b377673 commit 91f752b

1 file changed

Lines changed: 34 additions & 29 deletions

File tree

adminforth/spa/src/App.vue

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -54,32 +54,34 @@
5454
</svg>
5555
</button>
5656
</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>
6583
</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>
8385
</div>
8486
</div>
8587
</nav>
@@ -183,7 +185,7 @@
183185
</style>
184186

185187
<script setup lang="ts">
186-
import { computed, onMounted, ref, watch, onBeforeMount } from 'vue';
188+
import { computed, nextTick, onMounted, ref, watch, onBeforeMount } from 'vue';
187189
import { RouterView } from 'vue-router';
188190
import { Dropdown } from 'flowbite'
189191
import './index.scss'
@@ -310,11 +312,14 @@ watch(route, () => {
310312
});
311313
312314
313-
watch(dropdownUserButton, (dropdownUserButton) => {
315+
watch(dropdownUserButton, async (dropdownUserButton) => {
314316
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;
315320
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,
318323
);
319324
closeUserMenuDropdown = () => {
320325
dd.hide();

0 commit comments

Comments
 (0)