Merge branch 'disjointed-popovers' into shigusegubu-vue3

* disjointed-popovers:
  close on avatar click again, add zooming as option
  fix basicusercard
  make hover popovers less annoying to close
  move tooltips setting
  unify styling of timelines dropdown with other dropdown menus
  put modals on top of navbar
This commit is contained in:
Henry Jameson 2022-06-27 19:54:55 +03:00
commit 5794eeb5a9
11 changed files with 114 additions and 107 deletions

View file

@ -1,4 +1,4 @@
import UserCard from '../user_card/user_card.vue' import UserPopover from '../user_popover/user_popover.vue'
import UserAvatar from '../user_avatar/user_avatar.vue' import UserAvatar from '../user_avatar/user_avatar.vue'
import RichContent from 'src/components/rich_content/rich_content.jsx' import RichContent from 'src/components/rich_content/rich_content.jsx'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator' import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
@ -7,20 +7,12 @@ const BasicUserCard = {
props: [ props: [
'user' 'user'
], ],
data () {
return {
userExpanded: false
}
},
components: { components: {
UserCard, UserPopover,
UserAvatar, UserAvatar,
RichContent RichContent
}, },
methods: { methods: {
toggleUserExpanded () {
this.userExpanded = !this.userExpanded
},
userProfileLink (user) { userProfileLink (user) {
return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames) return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames)
} }

View file

@ -1,24 +1,19 @@
<template> <template>
<div class="basic-user-card"> <div class="basic-user-card">
<router-link :to="userProfileLink(user)"> <router-link @click.prevent :to="userProfileLink(user)">
<UserPopover
:userId="user.id"
:overlayCenters="true"
overlayCentersSelector=".avatar"
>
<UserAvatar <UserAvatar
class="avatar" class="user-avatar avatar"
:user="user" :user="user"
@click.prevent="toggleUserExpanded" @click.prevent
/> />
</UserPopover>
</router-link> </router-link>
<div <div
v-if="userExpanded"
class="basic-user-card-expanded-content"
>
<UserCard
:user-id="user.id"
:rounded="true"
:bordered="true"
/>
</div>
<div
v-else
class="basic-user-card-collapsed-content" class="basic-user-card-collapsed-content"
> >
<div <div
@ -53,6 +48,8 @@
margin: 0; margin: 0;
padding: 0.6em 1em; padding: 0.6em 1em;
--emoji-size: 14px;
&-collapsed-content { &-collapsed-content {
margin-left: 0.7em; margin-left: 0.7em;
text-align: left; text-align: left;

View file

@ -45,6 +45,10 @@ const Popover = {
inject: ['popoversZLayer'], // override popover z layer inject: ['popoversZLayer'], // override popover z layer
data () { data () {
return { return {
// lockReEntry is a flag that is set when mouse cursor is leaving the popover's content
// so that if mouse goes back into popover it won't be re-shown again to prevent annoyance
// with popovers refusing to be hidden when user wants to interact with something in below popover
lockReEntry: false,
hidden: true, hidden: true,
styles: {}, styles: {},
oldSize: { width: 0, height: 0 }, oldSize: { width: 0, height: 0 },
@ -202,6 +206,7 @@ const Popover = {
}, },
onMouseenter (e) { onMouseenter (e) {
if (this.trigger === 'hover') { if (this.trigger === 'hover') {
this.lockReEntry = false
clearTimeout(this.graceTimeout) clearTimeout(this.graceTimeout)
this.graceTimeout = null this.graceTimeout = null
this.showPopover() this.showPopover()
@ -213,7 +218,8 @@ const Popover = {
} }
}, },
onMouseenterContent (e) { onMouseenterContent (e) {
if (this.trigger === 'hover') { if (this.trigger === 'hover' && !this.lockReEntry) {
this.lockReEntry = true
clearTimeout(this.graceTimeout) clearTimeout(this.graceTimeout)
this.graceTimeout = null this.graceTimeout = null
this.showPopover() this.showPopover()

View file

@ -74,6 +74,11 @@
{{ $t('settings.show_scrollbars') }} {{ $t('settings.show_scrollbars') }}
</BooleanSetting> </BooleanSetting>
</li> </li>
<li>
<BooleanSetting path="userPopoverZoom">
{{ $t('settings.user_popover_avatar_zoom') }}
</BooleanSetting>
</li>
<li> <li>
<ChoiceSetting <ChoiceSetting
v-if="user" v-if="user"
@ -261,10 +266,7 @@
{{ $t('settings.mention_link_display') }} {{ $t('settings.mention_link_display') }}
</ChoiceSetting> </ChoiceSetting>
</li> </li>
<ul <li>
class="setting-list suboptions"
>
<li v-if="mentionLinkDisplay === 'short'">
<BooleanSetting <BooleanSetting
path="mentionLinkShowTooltip" path="mentionLinkShowTooltip"
expert="1" expert="1"
@ -272,7 +274,6 @@
{{ $t('settings.mention_link_use_tooltip') }} {{ $t('settings.mention_link_use_tooltip') }}
</BooleanSetting> </BooleanSetting>
</li> </li>
</ul>
<li> <li>
<BooleanSetting <BooleanSetting
path="useAtIcon" path="useAtIcon"

View file

@ -1,8 +1,8 @@
<template> <template>
<ul> <div class="dropdown-menu">
<li v-if="currentUser">
<router-link <router-link
class="menu-item" v-if="currentUser"
class="dropdown-item button-default"
:to="{ name: 'friends' }" :to="{ name: 'friends' }"
> >
<FAIcon <FAIcon
@ -11,10 +11,9 @@
icon="home" icon="home"
/>{{ $t("nav.home_timeline") }} />{{ $t("nav.home_timeline") }}
</router-link> </router-link>
</li>
<li v-if="currentUser || !privateMode">
<router-link <router-link
class="menu-item" v-if="currentUser || !privateMode"
class="dropdown-item button-default"
:to="{ name: 'public-timeline' }" :to="{ name: 'public-timeline' }"
> >
<FAIcon <FAIcon
@ -23,10 +22,9 @@
icon="users" icon="users"
/>{{ $t("nav.public_tl") }} />{{ $t("nav.public_tl") }}
</router-link> </router-link>
</li>
<li v-if="federating && (currentUser || !privateMode)">
<router-link <router-link
class="menu-item" v-if="federating && (currentUser || !privateMode)"
class="dropdown-item button-default"
:to="{ name: 'public-external-timeline' }" :to="{ name: 'public-external-timeline' }"
> >
<FAIcon <FAIcon
@ -35,10 +33,9 @@
icon="globe" icon="globe"
/>{{ $t("nav.twkn") }} />{{ $t("nav.twkn") }}
</router-link> </router-link>
</li>
<li v-if="currentUser">
<router-link <router-link
class="menu-item" v-if="currentUser"
class="dropdown-item button-default"
:to="{ name: 'bookmarks'}" :to="{ name: 'bookmarks'}"
> >
<FAIcon <FAIcon
@ -47,10 +44,9 @@
icon="bookmark" icon="bookmark"
/>{{ $t("nav.bookmarks") }} />{{ $t("nav.bookmarks") }}
</router-link> </router-link>
</li>
<li v-if="currentUser">
<router-link <router-link
class="menu-item" v-if="currentUser"
class="dropdown-item button-default"
:to="{ name: 'dms', params: { username: currentUser.screen_name } }" :to="{ name: 'dms', params: { username: currentUser.screen_name } }"
> >
<FAIcon <FAIcon
@ -59,8 +55,7 @@
icon="envelope" icon="envelope"
/>{{ $t("nav.dms") }} />{{ $t("nav.dms") }}
</router-link> </router-link>
</li> </div>
</ul>
</template> </template>
<script src="./timeline_menu_content.js" ></script> <script src="./timeline_menu_content.js" ></script>

View file

@ -38,7 +38,8 @@ export default {
'rounded', 'rounded',
'bordered', 'bordered',
'allowZoomingAvatar', 'allowZoomingAvatar',
'onClose' 'onClose',
'onAvatarClick'
], ],
data () { data () {
return { return {
@ -182,6 +183,12 @@ export default {
}, },
mentionUser () { mentionUser () {
this.$store.dispatch('openPostStatusModal', { replyTo: true, repliedUser: this.user }) this.$store.dispatch('openPostStatusModal', { replyTo: true, repliedUser: this.user })
},
onAvatarClickHandler (e) {
if (this.onAvatarClick) {
e.preventDefault()
this.onAvatarClick()
}
} }
} }
} }

View file

@ -30,6 +30,7 @@
<router-link <router-link
v-else v-else
:to="userProfileLink(user)" :to="userProfileLink(user)"
@click="onAvatarClickHandler"
> >
<UserAvatar <UserAvatar
:better-shadow="betterShadow" :better-shadow="betterShadow"

View file

@ -4,11 +4,16 @@ import { defineAsyncComponent } from 'vue'
const UserPopover = { const UserPopover = {
name: 'UserPopover', name: 'UserPopover',
props: [ props: [
'userId', 'overlayCenters', 'disabled' 'userId', 'overlayCenters', 'disabled', 'overlayCentersSelector'
], ],
components: { components: {
UserCard, UserCard,
Popover: defineAsyncComponent(() => import('../popover/popover.vue')) Popover: defineAsyncComponent(() => import('../popover/popover.vue'))
},
computed: {
userPopoverZoom () {
return this.$store.getters.mergedConfig.userPopoverZoom
}
} }
} }

View file

@ -2,7 +2,7 @@
<Popover <Popover
trigger="click" trigger="click"
popover-class="popover-default user-popover" popover-class="popover-default user-popover"
overlay-centers-selector=".user-info-avatar-link .Avatar" :overlay-centers-selector="overlayCentersSelector || '.user-info .Avatar'"
:overlay-centers="overlayCenters" :overlay-centers="overlayCenters"
:disabled="disabled" :disabled="disabled"
> >
@ -14,8 +14,9 @@
class="user-popover" class="user-popover"
:user-id="userId" :user-id="userId"
:hide-bio="true" :hide-bio="true"
:allow-zooming-avatar="true" :allow-zooming-avatar="userPopoverZoom"
:onClose="close" :on-avatar-click="userPopoverZoom ? null : close"
:on-close="close"
/> />
</template> </template>
</Popover> </Popover>

View file

@ -550,6 +550,7 @@
"mention_link_show_avatar": "Show user avatar beside the link", "mention_link_show_avatar": "Show user avatar beside the link",
"mention_link_fade_domain": "Fade domains (e.g. {'@'}example.org in {'@'}foo{'@'}example.org)", "mention_link_fade_domain": "Fade domains (e.g. {'@'}example.org in {'@'}foo{'@'}example.org)",
"mention_link_bolden_you": "Highlight mention of you when you are mentioned", "mention_link_bolden_you": "Highlight mention of you when you are mentioned",
"user_popover_avatar_zoom": "Clicking on user avatar in popover zooms it instead of closing the popover",
"fun": "Fun", "fun": "Fun",
"greentext": "Meme arrows", "greentext": "Meme arrows",
"show_yous": "Show (You)s", "show_yous": "Show (You)s",

View file

@ -81,6 +81,7 @@ export const defaultState = {
useContainFit: true, useContainFit: true,
disableStickyHeaders: false, disableStickyHeaders: false,
showScrollbars: false, showScrollbars: false,
userPopoverZoom: false,
greentext: undefined, // instance default greentext: undefined, // instance default
useAtIcon: undefined, // instance default useAtIcon: undefined, // instance default
mentionLinkDisplay: undefined, // instance default mentionLinkDisplay: undefined, // instance default