@@ -8,8 +8,9 @@ import type { UserStatusStatusType } from '../../UserStatus/userStatus.types.ts'
88
99import { t } from ' @nextcloud/l10n'
1010import { generateUrl } from ' @nextcloud/router'
11+ import { spawnDialog } from ' @nextcloud/vue/functions/dialog'
1112import { storeToRefs } from ' pinia'
12- import { ref , useTemplateRef , watch } from ' vue'
13+ import { ref , watch } from ' vue'
1314import NcAvatar from ' @nextcloud/vue/components/NcAvatar'
1415import NcPopover from ' @nextcloud/vue/components/NcPopover'
1516import NcUserStatusIcon from ' @nextcloud/vue/components/NcUserStatusIcon'
@@ -39,8 +40,6 @@ const serverUrlShort = serverUrl.replace(/^https?:\/\//, '')
3940const theming = appData .capabilities .theming
4041
4142const isOpen = ref (false )
42- const userMenuContainer = useTemplateRef (' userMenuContainer' )
43- const isUserStatusDialogOpen = ref (false )
4443const userStatusSubMenuOpen = ref (false )
4544
4645// Close the submenu before opening the menu
@@ -64,143 +63,139 @@ function handleUserStatusChange(status: UserStatusStatusType) {
6463 userStatusStore .saveUserStatus ({ ... userStatus .value ! , status })
6564 userStatusSubMenuOpen .value = false
6665}
66+
67+ /**
68+ * Open the user status dialog
69+ */
70+ function openUserStatusDialog() {
71+ spawnDialog (UserStatusDialog )
72+ }
6773 </script >
6874
6975<template >
70- <div ref =" userMenuContainer" class =" user-menu" >
71- <NcPopover
72- v-if =" userMenuContainer "
73- v-model :shown =" isOpen "
74- :container =" userMenuContainer "
75- :popperHideTriggers =" (triggers : string []) => [... triggers , ' click' ] "
76- :triggers =" [] "
77- noAutoFocus>
78- <template #trigger =" { attrs } " >
79- <div class =" user-menu__trigger" >
80- <!-- Floating-Vue doesn't support open on span[role=button] - opening manually -->
81- <NcAvatar
82- class="user-menu__avatar"
83- :user =" user .id "
84- :preloadedUserStatus =" userStatus "
85- :displayName =" user [' display-name' ]"
86- :size =" 32 "
87- disableMenu
88- disableTooltip
89- v-bind =" attrs "
90- tabindex="0"
91- role="button"
92- @click =" isOpen = ! isOpen "
93- @keydown .space =" isOpen = ! isOpen "
94- @keydown .enter =" isOpen = ! isOpen " />
95- </div >
96- </template >
97-
98- <template #default >
99- <UiMenu aria-label="Settings menu" class="user-menu__menu">
100- <template v-if =" userStatusSubMenuOpen " >
101- <UiMenuItem tag="button" @click .stop =" userStatusSubMenuOpen = false " >
102- <template #icon >
103- <IconChevronLeft :size =" 20 " />
104- </template >
105- {{ t('talk_desktop', 'Back') }}
106- </UiMenuItem >
107- <UiMenuItem
108- v-for =" status in availableUserStatusStatusTypes "
109- :key =" status "
110- tag="button"
111- @click .stop =" handleUserStatusChange (status )" >
76+ <NcPopover
77+ v-model :shown =" isOpen "
78+ :popperHideTriggers =" (triggers : string []) => [... triggers , ' click' ] "
79+ :triggers =" [] "
80+ noAutoFocus>
81+ <template #trigger =" { attrs } " >
82+ <div class =" user-menu__trigger" >
83+ <!-- Floating-Vue doesn't support open on span[role=button] - opening manually -->
84+ <NcAvatar
85+ class="user-menu__avatar"
86+ :user =" user .id "
87+ :preloadedUserStatus =" userStatus "
88+ :displayName =" user [' display-name' ]"
89+ :size =" 32 "
90+ disableMenu
91+ disableTooltip
92+ v-bind =" attrs "
93+ tabindex="0"
94+ role="button"
95+ @click =" isOpen = ! isOpen "
96+ @keydown .space =" isOpen = ! isOpen "
97+ @keydown .enter =" isOpen = ! isOpen " />
98+ </div >
99+ </template >
100+
101+ <template #default >
102+ <UiMenu aria-label="Settings menu" class="user-menu__menu">
103+ <template v-if =" userStatusSubMenuOpen " >
104+ <UiMenuItem tag="button" @click .stop =" userStatusSubMenuOpen = false " >
105+ <template #icon >
106+ <IconChevronLeft :size =" 20 " />
107+ </template >
108+ {{ t('talk_desktop', 'Back') }}
109+ </UiMenuItem >
110+ <UiMenuItem
111+ v-for =" status in availableUserStatusStatusTypes "
112+ :key =" status "
113+ tag="button"
114+ @click .stop =" handleUserStatusChange (status )" >
115+ <template #icon >
116+ <NcUserStatusIcon :status =" status " />
117+ </template >
118+ {{ userStatusTranslations[status] }}
119+ <!-- @vue-expect-error This menu can only be open from a button with v-if="userStatus", but in Vue 2 we cannot add type assertion -->
120+ <template v-if =" status === userStatus .status " #actionIcon >
121+ <IconCheck :size =" 20 " />
122+ </template >
123+ </UiMenuItem >
124+ </template >
125+
126+ <template v-else >
127+ <UiMenuItem
128+ tag="a"
129+ :href =" userProfileLink "
130+ target="_blank">
131+ <strong >{{ user['display-name'] }}</strong >
132+ <div >
133+ {{ t('talk_desktop', 'View profile') }}
134+ </div >
135+ </UiMenuItem >
136+
137+ <UiMenuSeparator />
138+
139+ <UiMenuItem tag="a" :href =" serverUrl " target="_blank">
140+ <template #icon >
141+ <ThemeLogo :size =" 24 " />
142+ </template >
143+ <span class =" user-menu__server" >
144+ <span >{{ theming.name }}</span >
145+ <em >{{ serverUrlShort }}</em >
146+ </span >
147+ </UiMenuItem >
148+
149+ <UiMenuSeparator />
150+
151+ <template v-if =" userStatus " >
152+ <UiMenuItem tag="button" @click .stop =" userStatusSubMenuOpen = true " >
112153 <template #icon >
113- <NcUserStatusIcon :status =" status " />
154+ <NcUserStatusIcon :status =" userStatus . status " />
114155 </template >
115- {{ userStatusTranslations[status] }}
116- <!-- @vue-expect-error This menu can only be open from a button with v-if="userStatus", but in Vue 2 we cannot add type assertion -->
117- <template v-if =" status === userStatus .status " #actionIcon >
118- <IconCheck :size =" 20 " />
156+ {{ userStatusTranslations[userStatus.status] }}
157+ <template #actionIcon >
158+ <IconChevronRight :size =" 20 " />
119159 </template >
120160 </UiMenuItem >
121- </template >
122-
123- <template v-else >
124- <UiMenuItem
125- tag="a"
126- :href =" userProfileLink "
127- target="_blank">
128- <strong >{{ user['display-name'] }}</strong >
129- <div >
130- {{ t('talk_desktop', 'View profile') }}
131- </div >
132- </UiMenuItem >
133-
134- <UiMenuSeparator />
135-
136- <UiMenuItem tag="a" :href =" serverUrl " target="_blank">
161+ <UiMenuItem key="custom-status" tag="button" @click =" openUserStatusDialog " >
137162 <template #icon >
138- <ThemeLogo :size =" 24 " />
163+ <span v-if =" userStatus.icon" style =" font-size : 20px " >
164+ {{ userStatus.icon }}
165+ </span >
166+ <IconEmoticonOutline v-else :size =" 20 " />
167+ </template >
168+ {{ userStatus.message || t('talk_desktop', 'Set custom status') }}
169+ <template v-if =" userStatus .message " #actionIcon >
170+ <IconPencilOutline :size =" 20 " />
139171 </template >
140- <span class =" user-menu__server" >
141- <span >{{ theming.name }}</span >
142- <em >{{ serverUrlShort }}</em >
143- </span >
144172 </UiMenuItem >
145173
146174 <UiMenuSeparator />
175+ </template >
147176
148- <template v-if =" userStatus " >
149- <UiMenuItem tag="button" @click .stop =" userStatusSubMenuOpen = true " >
150- <template #icon >
151- <NcUserStatusIcon :status =" userStatus .status " />
152- </template >
153- {{ userStatusTranslations[userStatus.status] }}
154- <template #actionIcon >
155- <IconChevronRight :size =" 20 " />
156- </template >
157- </UiMenuItem >
158- <UiMenuItem key="custom-status" tag="button" @click =" isUserStatusDialogOpen = true " >
159- <template #icon >
160- <span v-if =" userStatus.icon" style =" font-size : 20px " >
161- {{ userStatus.icon }}
162- </span >
163- <IconEmoticonOutline v-else :size =" 20 " />
164- </template >
165- {{ userStatus.message || t('talk_desktop', 'Set custom status') }}
166- <template v-if =" userStatus .message " #actionIcon >
167- <IconPencilOutline :size =" 20 " />
168- </template >
169- </UiMenuItem >
170-
171- <UiMenuSeparator />
177+ <UiMenuItem tag="button" @click =" logout " >
178+ <template #icon >
179+ <IconLogout :size =" 20 " />
172180 </template >
181+ {{ t('talk_desktop', 'Log out') }}
182+ </UiMenuItem >
173183
174- <UiMenuItem tag="button" @click =" logout " >
175- <template #icon >
176- <IconLogout :size =" 20 " />
177- </template >
178- {{ t('talk_desktop', 'Log out') }}
179- </UiMenuItem >
180-
181- <UiMenuSeparator />
184+ <UiMenuSeparator />
182185
183- <UiMenuItem tag="button" @click =" quit " >
184- <template #icon >
185- <IconPower :size =" 20 " />
186- </template >
187- {{ t('talk_desktop', 'Quit') }}
188- </UiMenuItem >
189- </template >
190- </UiMenu >
191- </template >
192- </NcPopover >
193-
194- <UserStatusDialog v-if =" isUserStatusDialogOpen " @close =" isUserStatusDialogOpen = false " />
195- </div >
186+ <UiMenuItem tag="button" @click =" quit " >
187+ <template #icon >
188+ <IconPower :size =" 20 " />
189+ </template >
190+ {{ t('talk_desktop', 'Quit') }}
191+ </UiMenuItem >
192+ </template >
193+ </UiMenu >
194+ </template >
195+ </NcPopover >
196196</template >
197197
198198<style scoped>
199-
200- .user-menu :deep(.v-popper--theme-dropdown.v-popper__popper .v-popper__inner ) {
201- border-radius : var (--border-radius-large );
202- }
203-
204199.user-menu__trigger {
205200 display : flex ;
206201 align-items : center ;
0 commit comments