import template from "./Popover.html";
class Popover {
props = {
title: String,
content: String,
context: Object,
placement: String,
getPopupContainer: Function,
};
state = {
visible: false,
content: this.props.content ? this.props.content : "",
clickTarget: null,
};
template = template;
useModules = ["$compile"];
constructor() {
this.state.target = $element[0];
let title = this.props.title
? `
${this.props.title}
`
: "";
let content = `
${title}
${this.state.content.replace(
/\$scope/g,
"context"
)}
`;
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 {
div.innerHTML = content;
this.state.popupContainer.appendChild(div);
}
div.addEventListener("click", function (event) {
event.stopPropagation();
});
this.state.target.addEventListener("click", (e) => {
e.stopPropagation();
});
$compile(div)($scope);
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;
// j
this.handlePosition();
// 事件绑定
document.body.addEventListener("click", this.myEvent);
} else {
setTimeout(() => {
this.state.visible = false;
this.$apply();
document.body.removeEventListener("click", this.myEvent);
}, 0);
}
}
showPopover() {
let popover = this.state.popover;
popover.classList.remove("ant-popover-hidden");
}
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 {
return (
$(target).offset().left -
(popover.clientWidth / 2 - target.clientWidth / 2)
);
}
}
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 {
if (this.props.placement === "top") {
return $(target).offset().top - popover.clientHeight - 4 + "px";
} else if (this.props.placement === "bottom") {
return $(target).offset().top + target.clientHeight + 4 + "px";
}
}
}
}