From d5bc825616858f8eccb4fb9786f0178bce44e979 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Sun, 31 Jul 2022 00:05:26 +0300 Subject: [PATCH] add stay-on-click prop to solve case of clicking user avatar in status popover --- src/components/popover/popover.js | 18 ++++++++++++---- src/components/popover/popover.vue | 21 +++++++++++++++++++ .../status_popover/status_popover.vue | 1 + 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/components/popover/popover.js b/src/components/popover/popover.js index c19e6904..843b22f3 100644 --- a/src/components/popover/popover.js +++ b/src/components/popover/popover.js @@ -40,7 +40,10 @@ const Popover = { overlayCenters: Boolean, // What selector (witin popover!) to use for determining center of popover - overlayCentersSelector: String + overlayCentersSelector: String, + + // Lets hover popover stay when clicking inside of it + stayOnClick: Boolean }, inject: ['popoversZLayer'], // override popover z layer data () { @@ -50,6 +53,7 @@ const Popover = { // with popovers refusing to be hidden when user wants to interact with something in below popover lockReEntry: false, hidden: true, + pinned: false, styles: {}, oldSize: { width: 0, height: 0 }, scrollable: null, @@ -196,9 +200,10 @@ const Popover = { }, showPopover () { if (this.disabled) return + this.pinned = false const wasHidden = this.hidden this.hidden = false - if (this.trigger === 'click') { + if (this.trigger === 'click' || this.stayOnClick) { document.addEventListener('click', this.onClickOutside) } this.scrollable.addEventListener('scroll', this.onScroll) @@ -227,7 +232,7 @@ const Popover = { } }, onMouseleave (e) { - if (this.trigger === 'hover') { + if (this.trigger === 'hover' && !this.pinned) { this.graceTimeout = setTimeout(() => this.hidePopover(), 1) } }, @@ -240,7 +245,7 @@ const Popover = { } }, onMouseleaveContent (e) { - if (this.trigger === 'hover') { + if (this.trigger === 'hover' && !this.pinned) { this.graceTimeout = setTimeout(() => this.hidePopover(), 1) } }, @@ -259,6 +264,11 @@ const Popover = { if (this.$el.contains(e.target)) return this.hidePopover() }, + onClickContent (e) { + if (this.trigger === 'hover' && this.stayOnClick) { + this.pinned = true + } + }, onScroll (e) { this.updateStyles() }, diff --git a/src/components/popover/popover.vue b/src/components/popover/popover.vue index f854515c..9b67f400 100644 --- a/src/components/popover/popover.vue +++ b/src/components/popover/popover.vue @@ -21,12 +21,22 @@ :class="popoverClass || 'popover-default'" @mouseenter="onMouseenterContent" @mouseleave="onMouseleaveContent" + @click="onClickContent" > +
+ +
@@ -51,6 +61,17 @@ box-shadow: var(--popupShadow); } +.pinned-tooltip-icon { + position: absolute; + top: -1em; + left: -1em; + width: 2em; + height: 2em; + display: flex; + justify-content: center; + align-items: center; +} + .popover-default { &:after { content: ''; diff --git a/src/components/status_popover/status_popover.vue b/src/components/status_popover/status_popover.vue index 2c436d04..9cabb751 100644 --- a/src/components/status_popover/status_popover.vue +++ b/src/components/status_popover/status_popover.vue @@ -1,6 +1,7 @@