1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | import { __assign, __decorate, __extends, __rest } from "tslib";
|
17 | import classNames from "classnames";
|
18 | import * as React from "react";
|
19 | import * as ReactDOM from "react-dom";
|
20 | import { polyfill } from "react-lifecycles-compat";
|
21 | import { AbstractPureComponent2, Classes, Position } from "../../common";
|
22 | import { Popover } from "../popover/popover";
|
23 | var POPPER_MODIFIERS = {
|
24 | preventOverflow: { boundariesElement: "viewport" },
|
25 | };
|
26 | var TRANSITION_DURATION = 100;
|
27 |
|
28 |
|
29 | var ContextMenu = (function (_super) {
|
30 | __extends(ContextMenu, _super);
|
31 | function ContextMenu() {
|
32 | var _this = _super !== null && _super.apply(this, arguments) || this;
|
33 | _this.state = {
|
34 | isDarkTheme: false,
|
35 | isOpen: false,
|
36 | };
|
37 | _this.cancelContextMenu = function (e) { return e.preventDefault(); };
|
38 | _this.handleBackdropContextMenu = function (e) {
|
39 |
|
40 | e.persist();
|
41 | e.preventDefault();
|
42 |
|
43 |
|
44 | _this.setTimeout(function () {
|
45 |
|
46 |
|
47 |
|
48 | var newTarget = document.elementFromPoint(e.clientX, e.clientY);
|
49 | var view = e.view, newEventInit = __rest(e, ["view"]);
|
50 | newTarget === null || newTarget === void 0 ? void 0 : newTarget.dispatchEvent(new MouseEvent("contextmenu", newEventInit));
|
51 | }, TRANSITION_DURATION);
|
52 | };
|
53 | _this.handlePopoverInteraction = function (nextOpenState) {
|
54 | if (!nextOpenState) {
|
55 |
|
56 |
|
57 | _this.requestAnimationFrame(function () { return _this.hide(); });
|
58 | }
|
59 | };
|
60 | return _this;
|
61 | }
|
62 | ContextMenu.prototype.render = function () {
|
63 | var _a;
|
64 |
|
65 | var content = React.createElement("div", { onContextMenu: this.cancelContextMenu }, this.state.menu);
|
66 | var popoverClassName = classNames((_a = {}, _a[Classes.DARK] = this.state.isDarkTheme, _a));
|
67 |
|
68 |
|
69 |
|
70 |
|
71 | var key = this.state.offset === undefined ? "" : this.state.offset.left + "x" + this.state.offset.top;
|
72 |
|
73 |
|
74 |
|
75 | return (React.createElement("div", { className: Classes.CONTEXT_MENU_POPOVER_TARGET, style: this.state.offset },
|
76 | React.createElement(Popover, __assign({}, this.props, { backdropProps: { onContextMenu: this.handleBackdropContextMenu }, content: content, enforceFocus: false, key: key, hasBackdrop: true, isOpen: this.state.isOpen, minimal: true, modifiers: POPPER_MODIFIERS, onInteraction: this.handlePopoverInteraction, position: Position.RIGHT_TOP, popoverClassName: popoverClassName, target: React.createElement("div", null), transitionDuration: TRANSITION_DURATION }))));
|
77 |
|
78 | };
|
79 | ContextMenu.prototype.show = function (menu, offset, onClose, isDarkTheme) {
|
80 | if (isDarkTheme === void 0) { isDarkTheme = false; }
|
81 | this.setState({ isOpen: true, menu: menu, offset: offset, onClose: onClose, isDarkTheme: isDarkTheme });
|
82 | };
|
83 | ContextMenu.prototype.hide = function () {
|
84 | var _a, _b;
|
85 | (_b = (_a = this.state).onClose) === null || _b === void 0 ? void 0 : _b.call(_a);
|
86 | this.setState({ isOpen: false, onClose: undefined });
|
87 | };
|
88 | ContextMenu = __decorate([
|
89 | polyfill
|
90 | ], ContextMenu);
|
91 | return ContextMenu;
|
92 | }(AbstractPureComponent2));
|
93 | var contextMenuElement;
|
94 |
|
95 | var contextMenu;
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 | export function show(menu, offset, onClose, isDarkTheme) {
|
102 | if (contextMenuElement === undefined) {
|
103 | contextMenuElement = document.createElement("div");
|
104 | contextMenuElement.classList.add(Classes.CONTEXT_MENU);
|
105 | document.body.appendChild(contextMenuElement);
|
106 |
|
107 | contextMenu = ReactDOM.render(React.createElement(ContextMenu, { onClosed: remove }), contextMenuElement);
|
108 |
|
109 | }
|
110 | contextMenu.show(menu, offset, onClose, isDarkTheme);
|
111 | }
|
112 |
|
113 | export function hide() {
|
114 | contextMenu === null || contextMenu === void 0 ? void 0 : contextMenu.hide();
|
115 | }
|
116 |
|
117 | export function isOpen() {
|
118 | return contextMenu != null && contextMenu.state.isOpen;
|
119 | }
|
120 | function remove() {
|
121 | if (contextMenuElement != null) {
|
122 | ReactDOM.unmountComponentAtNode(contextMenuElement);
|
123 | contextMenuElement.remove();
|
124 | contextMenuElement = undefined;
|
125 | contextMenu = undefined;
|
126 | }
|
127 | }
|
128 |
|
\ | No newline at end of file |