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:
commit
5794eeb5a9
11 changed files with 114 additions and 107 deletions
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue