-
Notifications
You must be signed in to change notification settings - Fork 261
/
mention.js
92 lines (76 loc) 路 2.08 KB
/
mention.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import Quill from "quill";
const Embed = Quill.import("blots/embed");
class MentionBlot extends Embed {
hoverHandler;
constructor(scroll, node) {
super(scroll, node);
this.clickHandler = null;
this.hoverHandler = null;
this.mounted = false;
}
static create(data) {
const node = super.create();
const denotationChar = document.createElement("span");
denotationChar.className = "ql-mention-denotation-char";
denotationChar.innerHTML = data.denotationChar;
node.appendChild(denotationChar);
node.innerHTML += data.value;
return MentionBlot.setDataValues(node, data);
}
static setDataValues(element, data) {
const domNode = element;
Object.keys(data).forEach(key => {
domNode.dataset[key] = data[key];
});
return domNode;
}
static value(domNode) {
return domNode.dataset;
}
attach() {
super.attach();
if (!this.mounted) {
this.mounted = true;
this.clickHandler = this.getClickHandler();
this.hoverHandler = this.getHoverHandler();
this.domNode.addEventListener("click", this.clickHandler, false);
this.domNode.addEventListener("mouseenter", this.hoverHandler, false);
}
}
detach() {
super.detach();
this.mounted = false;
if (this.clickHandler) {
this.domNode.removeEventListener("click", this.clickHandler);
this.clickHandler = null;
}
}
getClickHandler() {
return e => {
const event = this.buildEvent("mention-clicked", e);
window.dispatchEvent(event);
e.preventDefault();
};
}
getHoverHandler() {
return e => {
const event = this.buildEvent('mention-hovered', e);
window.dispatchEvent(event);
e.preventDefault();
}
}
buildEvent(name, e) {
const event = new Event(name, {
bubbles: true,
cancelable: true
});
event.value = Object.assign({}, this.domNode.dataset);
event.event = e;
return event;
}
hoverHandler;
}
MentionBlot.blotName = "mention";
MentionBlot.tagName = "span";
MentionBlot.className = "mention";
Quill.register(MentionBlot);