3a3ecabe
Imshann
init
|
1
|
import template from "./Popover.html";
|
6fcf6aec
Imshann
feat(popover): 优化组件
|
2
|
import style from "antd/lib/popover/style/index.css";
|
3a3ecabe
Imshann
init
|
3
4
|
class Popover {
|
6fcf6aec
Imshann
feat(popover): 优化组件
|
5
6
7
8
9
|
template = template;
useModules = ["$compile", "esNgAntd"];
|
3a3ecabe
Imshann
init
|
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
props = {
title: String,
content: String,
context: Object,
placement: String,
getPopupContainer: Function,
};
state = {
visible: false,
content: this.props.content ? this.props.content : "",
clickTarget: null,
};
|
3a3ecabe
Imshann
init
|
24
|
constructor() {
|
6fcf6aec
Imshann
feat(popover): 优化组件
|
25
|
esNgAntd.createStyle("ant-popover", style);
|
3a3ecabe
Imshann
init
|
26
27
28
29
30
31
32
|
this.state.target = $element[0];
let title = this.props.title
? `<div class="ant-popover-title"><span>${this.props.title}</span></div>`
: "";
let content = `<div>
<div style="outline:none" ng-class="'ant-popover ant-popover-placement-${
this.props.placement
|
6fcf6aec
Imshann
feat(popover): 优化组件
|
33
|
}'+(!state.visible?' ant-popover-hidden': '')+(state.visible?' ant-zoom-big-enter ant-zoom-big-enter-active': '')">
|
3a3ecabe
Imshann
init
|
34
|
<div class="ant-popover-content">
|
6fcf6aec
Imshann
feat(popover): 优化组件
|
35
36
37
|
<div class="ant-popover-arrow">
<span class="ant-popover-arrow-content"></span>
</div>
|
3a3ecabe
Imshann
init
|
38
39
40
|
<div class="ant-popover-inner">
<div>
${title}
|
6fcf6aec
Imshann
feat(popover): 优化组件
|
41
|
<div class="ant-popover-inner-content"></div>
|
3a3ecabe
Imshann
init
|
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
</div>
</div>
</div>
</div>
</div>`;
let div = document.createElement("div");
if (typeof this.props.getPopupContainer() === "function") {
this.state.popupContainer = this.props.getPopupContainer()();
}
if (!this.state.popupContainer) {
div.style.position = "absolute";
div.style.top = "0px";
div.style.left = "0px";
div.style.width = "100%";
div.innerHTML = content;
document.body.appendChild(div);
} else {
|
3a3ecabe
Imshann
init
|
59
60
61
62
63
64
65
66
67
|
this.state.popupContainer.appendChild(div);
}
div.addEventListener("click", function (event) {
event.stopPropagation();
});
this.state.target.addEventListener("click", (e) => {
e.stopPropagation();
});
$compile(div)($scope);
|
6fcf6aec
Imshann
feat(popover): 优化组件
|
68
69
|
div.querySelector(".ant-popover-inner-content").innerHTML = this.state.content;
$compile(div.querySelector(".ant-popover-inner-content"))($scope.$parent)
|
3a3ecabe
Imshann
init
|
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
this.state.popover = div;
}
myEvent() {
setTimeout(() => {
this.state.visible = false;
this.$apply();
document.body.removeEventListener("click", this.myEvent);
}, 0);
}
handleClick() {
if (this.state.visible === false) {
// 气泡层(显示)
this.state.visible = true;
|
6fcf6aec
Imshann
feat(popover): 优化组件
|
85
|
// 处理位置
|
3a3ecabe
Imshann
init
|
86
87
88
89
90
91
92
93
94
95
96
97
|
this.handlePosition();
// 事件绑定
document.body.addEventListener("click", this.myEvent);
} else {
setTimeout(() => {
this.state.visible = false;
this.$apply();
document.body.removeEventListener("click", this.myEvent);
}, 0);
}
}
|
3a3ecabe
Imshann
init
|
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
handlePosition() {
setTimeout(function () {
let popover = this.state.popover.querySelector(".ant-popover");
if (this.props.placement === "top") {
popover.style["top"] = this.getTop();
} else if (this.props.placement === "bottom") {
popover.style["top"] = this.getTop();
}
popover.style.left = this.getLeft() + "px";
}, 0);
}
getLeft() {
let parent = this.props.getPopupContainer();
let popover = this.state.popover.querySelector(".ant-popover");
let target = this.state.target;
if (parent) {
return -(popover.clientWidth / 2 - target.clientWidth / 2);
} else {
|
6fcf6aec
Imshann
feat(popover): 优化组件
|
117
|
let offset = esNgAntd.getOffset(target);
|
3a3ecabe
Imshann
init
|
118
|
return (
|
6fcf6aec
Imshann
feat(popover): 优化组件
|
119
|
offset.left - (popover.clientWidth / 2 - target.clientWidth / 2)
|
3a3ecabe
Imshann
init
|
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
);
}
}
getTop() {
let parent = this.props.getPopupContainer();
let popover = this.state.popover.querySelector(".ant-popover");
let target = this.state.target;
if (parent) {
if (this.props.placement === "top") {
return -popover.clientHeight + "px";
} else if (this.props.placement === "bottom") {
}
} else {
|
6fcf6aec
Imshann
feat(popover): 优化组件
|
134
|
let offset = esNgAntd.getOffset(target);
|
3a3ecabe
Imshann
init
|
135
|
if (this.props.placement === "top") {
|
6fcf6aec
Imshann
feat(popover): 优化组件
|
136
|
return offset.top - popover.clientHeight - 4 + "px";
|
3a3ecabe
Imshann
init
|
137
|
} else if (this.props.placement === "bottom") {
|
6fcf6aec
Imshann
feat(popover): 优化组件
|
138
|
return offset.top + target.clientHeight + 4 + "px";
|
3a3ecabe
Imshann
init
|
139
140
141
142
|
}
}
}
}
|