+
No users found.
import Fuse from 'fuse.js'
+import tippy from 'tippy.js'
import Icon from 'Components/Icon'
import { Editor } from 'tiptap'
import {
@@ -62,21 +63,24 @@ export default {
id: 2,
},
],
- onEnter: ({ items, query, range, command }) => {
+ onEnter: ({ items, query, range, command, virtualNode }) => {
this.query = query
this.filteredUsers = items
this.pos = range
this.insertMention = command
+ this.renderDropdown(virtualNode)
},
- onChange: ({ items, query, range }) => {
+ onChange: ({ items, query, range, virtualNode }) => {
this.query = query
this.filteredUsers = items
this.pos = range
+ this.renderDropdown(virtualNode)
},
onExit: () => {
this.query = null
this.filteredUsers = []
this.pos = null
+ this.destroyDropdown()
},
onKeyDown: ({ event }) => {
// pressing up arrow
@@ -143,12 +147,38 @@ export default {
},
})
},
+ renderDropdown(node) {
+ if (this.dropdown) {
+ return
+ }
+
+ this.dropdown = tippy(node, {
+ content: this.$refs.suggestions,
+ trigger: 'mouseenter',
+ interactive: true,
+ theme: 'dark',
+ placement: 'top-start',
+ performance: true,
+ inertia: true,
+ duration: [400, 200],
+ showOnInit: true,
+ arrow: true,
+ arrowType: 'round',
+ })
+ },
+ destroyDropdown() {
+ if (this.dropdown) {
+ this.dropdown.destroyAll()
+ this.dropdown = null
+ }
+ },
},
}
diff --git a/package.json b/package.json
index 361d4b2b..9e2d2027 100644
--- a/package.json
+++ b/package.json
@@ -74,6 +74,7 @@
"rollup-plugin-vue": "^4.3.2",
"sass-loader": "^7.0.3",
"style-loader": "^0.23.0",
+ "tippy.js": "^3.0.3",
"uglify-js": "^3.4.9",
"vue": "^2.5.17",
"vue-loader": "^15.4.1",
diff --git a/packages/tiptap-extensions/src/plugins/suggestions.js b/packages/tiptap-extensions/src/plugins/suggestions.js
index 834efe07..62466742 100644
--- a/packages/tiptap-extensions/src/plugins/suggestions.js
+++ b/packages/tiptap-extensions/src/plugins/suggestions.js
@@ -97,6 +97,13 @@ export function suggestionsPlugin({
const stopped = prev.active && !next.active
const changed = !started && !stopped && prev.text !== next.text
const decorationNode = document.querySelector(`[data-decoration-id="${next.decorationId}"]`)
+ const virtualNode = decorationNode ? {
+ getBoundingClientRect() {
+ return decorationNode.getBoundingClientRect()
+ },
+ clientWidth: decorationNode.clientWidth,
+ clientHeight: decorationNode.clientHeight,
+ } : null
// Trigger the hooks when necessary
if (stopped || moved) {
@@ -106,6 +113,7 @@ export function suggestionsPlugin({
query: prev.text,
text: prev.fullText,
decorationNode,
+ virtualNode,
items: onFilter(items, prev.text),
})
}
@@ -117,6 +125,7 @@ export function suggestionsPlugin({
query: next.text,
text: next.fullText,
decorationNode,
+ virtualNode,
items: onFilter(items, next.text),
})
}
@@ -128,6 +137,7 @@ export function suggestionsPlugin({
query: next.text,
text: next.fullText,
decorationNode,
+ virtualNode,
items: onFilter(items, next.text),
command: ({ pos, attrs }) => {
command({
diff --git a/yarn.lock b/yarn.lock
index c717a83b..397c4e50 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7311,6 +7311,10 @@ pngquant-bin@^5.0.0:
execa "^0.10.0"
logalot "^2.0.0"
+popper.js@^1.14.4:
+ version "1.14.4"
+ resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.4.tgz#8eec1d8ff02a5a3a152dd43414a15c7b79fd69b6"
+
portfinder@^1.0.13:
version "1.0.17"
resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a"
@@ -9425,6 +9429,12 @@ timsort@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
+tippy.js@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-3.0.3.tgz#ee543943808201e75d3a9369464576585d9d5305"
+ dependencies:
+ popper.js "^1.14.4"
+
tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"