浏览代码

fix: Don't open panel menu when dragging (react-)panel in dashboard #14946

Johannes Schill 6 年之前
父节点
当前提交
1afc590c70
共有 1 个文件被更改,包括 31 次插入6 次删除
  1. 31 6
      public/app/features/dashboard/dashgrid/PanelHeader/PanelHeader.tsx

+ 31 - 6
public/app/features/dashboard/dashgrid/PanelHeader/PanelHeader.tsx

@@ -1,5 +1,6 @@
 import React, { Component } from 'react';
 import classNames from 'classnames';
+import { isEqual } from 'lodash';
 
 import PanelHeaderCorner from './PanelHeaderCorner';
 import { PanelHeaderMenu } from './PanelHeaderMenu';
@@ -19,21 +20,45 @@ export interface Props {
   links?: [];
 }
 
+interface ClickCoordinates {
+  x: number;
+  y: number;
+}
+
 interface State {
   panelMenuOpen: boolean;
 }
 
 export class PanelHeader extends Component<Props, State> {
+  clickCoordinates: ClickCoordinates = {x: 0, y: 0};
   state = {
     panelMenuOpen: false,
+    clickCoordinates: {x: 0, y: 0}
+  };
+
+  eventToClickCoordinates = (event: React.MouseEvent<HTMLDivElement>) => {
+    return {
+      x: event.clientX,
+      y: event.clientY
+    };
+  }
+
+  onMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {
+    this.clickCoordinates = this.eventToClickCoordinates(event);
   };
 
-  onMenuToggle = event => {
-    event.stopPropagation();
+  isClick = (clickCoordinates: ClickCoordinates) => {
+    return isEqual(clickCoordinates, this.clickCoordinates);
+  }
+
+  onMenuToggle = (event: React.MouseEvent<HTMLDivElement>) => {
+    if (this.isClick(this.eventToClickCoordinates(event))) {
+      event.stopPropagation();
 
-    this.setState(prevState => ({
-      panelMenuOpen: !prevState.panelMenuOpen,
-    }));
+      this.setState(prevState => ({
+        panelMenuOpen: !prevState.panelMenuOpen,
+      }));
+    }
   };
 
   closeMenu = () => {
@@ -64,7 +89,7 @@ export class PanelHeader extends Component<Props, State> {
               <i className="fa fa-spinner fa-spin" />
             </span>
           )}
-          <div className="panel-title-container" onClick={this.onMenuToggle}>
+          <div className="panel-title-container" onClick={this.onMenuToggle} onMouseDown={this.onMouseDown}>
             <div className="panel-title">
               <span className="icon-gf panel-alert-icon" />
               <span className="panel-title-text">