diff --git a/build/Popover/Popover.html b/build/Popover/Popover.html index 8b222b0..bddb02f 100644 --- a/build/Popover/Popover.html +++ b/build/Popover/Popover.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/build/Popover/Popover.js b/build/Popover/Popover.js index 6577d6c..a9b718a 100644 --- a/build/Popover/Popover.js +++ b/build/Popover/Popover.js @@ -2,7 +2,7 @@ import template from "./Popover.html"; import style from "antd/lib/popover/style/index.css"; angular .module("esNgAntd") - .directive("esPopover", function ($compile, esNgAntd) { + .directive("esPopover", function ($compile, $timeout, esNgAntd) { return { controllerAs: "esPopover", restrict: "E", @@ -14,6 +14,7 @@ angular context: "=", placement: "@", getPopupContainer: "&", + trigger: "@", }, template: template, controller: function ($scope, $element, $attrs) { @@ -25,6 +26,8 @@ angular visible: false, content: $scope.content ? $scope.content : "", clickTarget: null, + trigger: $scope.trigger || "hover", + closing: false, }; $scope.myEvent = function () { @@ -39,6 +42,10 @@ angular }; $scope.handleClick = function () { + if ($scope.state.trigger !== "click") { + return; + } + if ($scope.state.visible === false) { // 气泡层(显示) $scope.state.visible = true; // 处理位置 @@ -58,6 +65,44 @@ angular } }; + $scope.showPopover = function () { + // 气泡层(显示) + $scope.state.visible = true; // 调整位置 + + $scope.handlePosition(); + }; + + $scope.hidePopover = function () { + $scope.state.closing = true; + $timeout(function () { + if ($scope.state.closing === false) { + return; + } + + $scope.state.visible = false; + }, 100); + }; + + $scope.onMouseEnter = function () { + if ($scope.state.trigger !== "hover") { + return; + } + + if ($scope.state.closing === true) { + $scope.state.closing = false; + } + + $scope.showPopover(); + }; + + $scope.onMouseLeave = function () { + if ($scope.state.trigger !== "hover") { + return; + } + + $scope.hidePopover(); + }; + $scope.handlePosition = function () { setTimeout(function () { let popover = @@ -128,7 +173,7 @@ angular ? `
${$scope.title}
` : ""; let content = `
-
+
diff --git a/dist/ng-antd.js b/dist/ng-antd.js index e98415a..2fe20ed 100644 --- a/dist/ng-antd.js +++ b/dist/ng-antd.js @@ -291,7 +291,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Pag /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Popover_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Popover.html */ \"./build/Popover/Popover.html\");\n/* harmony import */ var antd_lib_popover_style_index_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! antd/lib/popover/style/index.css */ \"./node_modules/antd/lib/popover/style/index.css\");\n\n\nangular\n .module(\"esNgAntd\")\n .directive(\"esPopover\", function ($compile, esNgAntd) {\n return {\n controllerAs: \"esPopover\",\n restrict: \"E\",\n transclude: true,\n replace: true,\n scope: {\n title: \"@\",\n content: \"@\",\n context: \"=\",\n placement: \"@\",\n getPopupContainer: \"&\",\n },\n template: _Popover_html__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n controller: function ($scope, $element, $attrs) {\n this.getContext = function () {\n return $scope;\n };\n\n $scope.state = {\n visible: false,\n content: $scope.content ? $scope.content : \"\",\n clickTarget: null,\n };\n\n $scope.myEvent = function () {\n setTimeout(() => {\n $scope.state.visible = false;\n $scope.$apply();\n document.body.removeEventListener(\n \"click\",\n $scope.myEvent\n );\n }, 0);\n };\n\n $scope.handleClick = function () {\n if ($scope.state.visible === false) {\n // 气泡层(显示)\n $scope.state.visible = true; // 处理位置\n\n $scope.handlePosition(); // 事件绑定\n\n document.body.addEventListener(\"click\", $scope.myEvent);\n } else {\n setTimeout(() => {\n $scope.state.visible = false;\n $scope.$apply();\n document.body.removeEventListener(\n \"click\",\n $scope.myEvent\n );\n }, 0);\n }\n };\n\n $scope.handlePosition = function () {\n setTimeout(function () {\n let popover =\n $scope.state.popover.querySelector(\".ant-popover\");\n\n if ($scope.placement === \"top\") {\n popover.style[\"top\"] = $scope.getTop();\n } else if ($scope.placement === \"bottom\") {\n popover.style[\"top\"] = $scope.getTop();\n }\n\n popover.style.left = $scope.getLeft() + \"px\";\n }, 0);\n };\n\n $scope.getLeft = function () {\n let parent = $scope.getPopupContainer();\n let popover =\n $scope.state.popover.querySelector(\".ant-popover\");\n let target = $scope.state.target;\n\n if (parent) {\n return -(\n popover.clientWidth / 2 -\n target.clientWidth / 2\n );\n } else {\n let offset = esNgAntd.getOffset(target);\n return (\n offset.left -\n (popover.clientWidth / 2 - target.clientWidth / 2)\n );\n }\n };\n\n $scope.getTop = function () {\n let parent = $scope.getPopupContainer();\n let popover =\n $scope.state.popover.querySelector(\".ant-popover\");\n let target = $scope.state.target;\n\n if (parent) {\n if ($scope.placement === \"top\") {\n return -popover.clientHeight + \"px\";\n } else if ($scope.placement === \"bottom\") {\n }\n } else {\n let offset = esNgAntd.getOffset(target);\n\n if ($scope.placement === \"top\") {\n return offset.top - popover.clientHeight - 4 + \"px\";\n } else if ($scope.placement === \"bottom\") {\n return offset.top + target.clientHeight + 4 + \"px\";\n }\n }\n };\n },\n link: function (\n $scope,\n $element,\n $attrs,\n $controllers,\n $transclude\n ) {\n esNgAntd.createStyle(\"ant-popover\", antd_lib_popover_style_index_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n $scope.state.target = $element[0];\n let title = $scope.title\n ? `
${$scope.title}
`\n : \"\";\n let content = `
\n
\n
\n
\n \n
\n
\n
\n ${title}\n
\n
\n
\n
\n
\n
`;\n let div = document.createElement(\"div\");\n\n if (typeof $scope.getPopupContainer() === \"function\") {\n $scope.state.popupContainer = $scope.getPopupContainer()();\n }\n\n if (!$scope.state.popupContainer) {\n div.style.position = \"absolute\";\n div.style.top = \"0px\";\n div.style.left = \"0px\";\n div.style.width = \"100%\";\n div.innerHTML = content;\n document.body.appendChild(div);\n } else {\n $scope.state.popupContainer.appendChild(div);\n }\n\n div.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n });\n $scope.state.target.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n });\n $compile(div)($scope);\n div.querySelector(\".ant-popover-inner-content\").innerHTML =\n $scope.state.content;\n $compile(div.querySelector(\".ant-popover-inner-content\"))(\n $scope.$parent\n );\n $scope.state.popover = div;\n },\n };\n });\n\n\n//# sourceURL=webpack://ng-antd/./build/Popover/Popover.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Popover_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Popover.html */ \"./build/Popover/Popover.html\");\n/* harmony import */ var antd_lib_popover_style_index_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! antd/lib/popover/style/index.css */ \"./node_modules/antd/lib/popover/style/index.css\");\n\n\nangular\n .module(\"esNgAntd\")\n .directive(\"esPopover\", function ($compile, $timeout, esNgAntd) {\n return {\n controllerAs: \"esPopover\",\n restrict: \"E\",\n transclude: true,\n replace: true,\n scope: {\n title: \"@\",\n content: \"@\",\n context: \"=\",\n placement: \"@\",\n getPopupContainer: \"&\",\n trigger: \"@\",\n },\n template: _Popover_html__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n controller: function ($scope, $element, $attrs) {\n this.getContext = function () {\n return $scope;\n };\n\n $scope.state = {\n visible: false,\n content: $scope.content ? $scope.content : \"\",\n clickTarget: null,\n trigger: $scope.trigger || \"hover\",\n closing: false,\n };\n\n $scope.myEvent = function () {\n setTimeout(() => {\n $scope.state.visible = false;\n $scope.$apply();\n document.body.removeEventListener(\n \"click\",\n $scope.myEvent\n );\n }, 0);\n };\n\n $scope.handleClick = function () {\n if ($scope.state.trigger !== \"click\") {\n return;\n }\n\n if ($scope.state.visible === false) {\n // 气泡层(显示)\n $scope.state.visible = true; // 处理位置\n\n $scope.handlePosition(); // 事件绑定\n\n document.body.addEventListener(\"click\", $scope.myEvent);\n } else {\n setTimeout(() => {\n $scope.state.visible = false;\n $scope.$apply();\n document.body.removeEventListener(\n \"click\",\n $scope.myEvent\n );\n }, 0);\n }\n };\n\n $scope.showPopover = function () {\n // 气泡层(显示)\n $scope.state.visible = true; // 调整位置\n\n $scope.handlePosition();\n };\n\n $scope.hidePopover = function () {\n $scope.state.closing = true;\n $timeout(function () {\n if ($scope.state.closing === false) {\n return;\n }\n\n $scope.state.visible = false;\n }, 100);\n };\n\n $scope.onMouseEnter = function () {\n if ($scope.state.trigger !== \"hover\") {\n return;\n }\n\n if ($scope.state.closing === true) {\n $scope.state.closing = false;\n }\n\n $scope.showPopover();\n };\n\n $scope.onMouseLeave = function () {\n if ($scope.state.trigger !== \"hover\") {\n return;\n }\n\n $scope.hidePopover();\n };\n\n $scope.handlePosition = function () {\n setTimeout(function () {\n let popover =\n $scope.state.popover.querySelector(\".ant-popover\");\n\n if ($scope.placement === \"top\") {\n popover.style[\"top\"] = $scope.getTop();\n } else if ($scope.placement === \"bottom\") {\n popover.style[\"top\"] = $scope.getTop();\n }\n\n popover.style.left = $scope.getLeft() + \"px\";\n }, 0);\n };\n\n $scope.getLeft = function () {\n let parent = $scope.getPopupContainer();\n let popover =\n $scope.state.popover.querySelector(\".ant-popover\");\n let target = $scope.state.target;\n\n if (parent) {\n return -(\n popover.clientWidth / 2 -\n target.clientWidth / 2\n );\n } else {\n let offset = esNgAntd.getOffset(target);\n return (\n offset.left -\n (popover.clientWidth / 2 - target.clientWidth / 2)\n );\n }\n };\n\n $scope.getTop = function () {\n let parent = $scope.getPopupContainer();\n let popover =\n $scope.state.popover.querySelector(\".ant-popover\");\n let target = $scope.state.target;\n\n if (parent) {\n if ($scope.placement === \"top\") {\n return -popover.clientHeight + \"px\";\n } else if ($scope.placement === \"bottom\") {\n }\n } else {\n let offset = esNgAntd.getOffset(target);\n\n if ($scope.placement === \"top\") {\n return offset.top - popover.clientHeight - 4 + \"px\";\n } else if ($scope.placement === \"bottom\") {\n return offset.top + target.clientHeight + 4 + \"px\";\n }\n }\n };\n },\n link: function (\n $scope,\n $element,\n $attrs,\n $controllers,\n $transclude\n ) {\n esNgAntd.createStyle(\"ant-popover\", antd_lib_popover_style_index_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n $scope.state.target = $element[0];\n let title = $scope.title\n ? `
${$scope.title}
`\n : \"\";\n let content = `
\n
\n
\n
\n \n
\n
\n
\n ${title}\n
\n
\n
\n
\n
\n
`;\n let div = document.createElement(\"div\");\n\n if (typeof $scope.getPopupContainer() === \"function\") {\n $scope.state.popupContainer = $scope.getPopupContainer()();\n }\n\n if (!$scope.state.popupContainer) {\n div.style.position = \"absolute\";\n div.style.top = \"0px\";\n div.style.left = \"0px\";\n div.style.width = \"100%\";\n div.innerHTML = content;\n document.body.appendChild(div);\n } else {\n $scope.state.popupContainer.appendChild(div);\n }\n\n div.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n });\n $scope.state.target.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n });\n $compile(div)($scope);\n div.querySelector(\".ant-popover-inner-content\").innerHTML =\n $scope.state.content;\n $compile(div.querySelector(\".ant-popover-inner-content\"))(\n $scope.$parent\n );\n $scope.state.popover = div;\n },\n };\n });\n\n\n//# sourceURL=webpack://ng-antd/./build/Popover/Popover.js?"); /***/ }), @@ -9661,7 +9661,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Module\nvar code = \"
\";\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (code);\n\n//# sourceURL=webpack://ng-antd/./build/Popover/Popover.html?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Module\nvar code = \"
\";\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (code);\n\n//# sourceURL=webpack://ng-antd/./build/Popover/Popover.html?"); /***/ }), diff --git a/src/Popover/Popover.html b/src/Popover/Popover.html index c9827e4..a0dc7c9 100644 --- a/src/Popover/Popover.html +++ b/src/Popover/Popover.html @@ -1 +1 @@ -
{children}
\ No newline at end of file +
{children}
\ No newline at end of file diff --git a/src/Popover/Popover.js b/src/Popover/Popover.js index 6066379..5c2ee82 100644 --- a/src/Popover/Popover.js +++ b/src/Popover/Popover.js @@ -2,10 +2,9 @@ import template from "./Popover.html"; import style from "antd/lib/popover/style/index.css"; class Popover { - template = template; - useModules = ["$compile", "esNgAntd"]; + useModules = ["$compile", "$timeout", "esNgAntd"]; props = { title: String, @@ -13,12 +12,15 @@ class Popover { context: Object, placement: String, getPopupContainer: Function, + trigger: String, }; state = { visible: false, content: this.props.content ? this.props.content : "", clickTarget: null, + trigger: this.props.trigger || "hover", + closing: false, }; constructor() { @@ -28,9 +30,7 @@ class Popover { ? `
${this.props.title}
` : ""; let content = `
-
+
@@ -65,8 +65,11 @@ class Popover { e.stopPropagation(); }); $compile(div)($scope); - div.querySelector(".ant-popover-inner-content").innerHTML = this.state.content; - $compile(div.querySelector(".ant-popover-inner-content"))($scope.$parent) + div.querySelector(".ant-popover-inner-content").innerHTML = + this.state.content; + $compile(div.querySelector(".ant-popover-inner-content"))( + $scope.$parent + ); this.state.popover = div; } @@ -79,6 +82,9 @@ class Popover { } handleClick() { + if (this.state.trigger !== "click") { + return; + } if (this.state.visible === false) { // 气泡层(显示) this.state.visible = true; @@ -95,6 +101,40 @@ class Popover { } } + showPopover() { + // 气泡层(显示) + this.state.visible = true; + // 调整位置 + this.handlePosition(); + } + + hidePopover() { + this.state.closing = true; + $timeout(function () { + if (this.state.closing === false) { + return; + } + this.state.visible = false; + }, 100); + } + + onMouseEnter() { + if (this.state.trigger !== "hover") { + return; + } + if (this.state.closing === true) { + this.state.closing = false; + } + this.showPopover(); + } + + onMouseLeave() { + if (this.state.trigger !== "hover") { + return; + } + this.hidePopover(); + } + handlePosition() { setTimeout(function () { let popover = this.state.popover.querySelector(".ant-popover"); -- libgit2 0.21.2