This is an automated email from the ASF dual-hosted git repository.

rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git


The following commit(s) were added to refs/heads/master by this push:
     new 128ddfa  fix: Pasting text issues in MetricsControl and 
AdhocFilterControl inputs (#11445)
128ddfa is described below

commit 128ddfabb60b2cff921d22d2d830e59a052c3900
Author: Kamil Gabryjelski <[email protected]>
AuthorDate: Wed Nov 4 22:48:48 2020 +0100

    fix: Pasting text issues in MetricsControl and AdhocFilterControl inputs 
(#11445)
    
    * Fix paste not working in Metrics and Filter inputs
    
    * Use noOp instead of empty function
    
    * Use default Select component instead of OnPasteSelect
    
    * Revert onPaste override
---
 .../explore/components/AdhocFilterControl_spec.jsx | 14 ++++++------
 .../explore/components/MetricsControl_spec.jsx     | 26 ++++++++++++++++------
 .../components/controls/AdhocFilterControl.jsx     |  5 ++---
 .../explore/components/controls/MetricsControl.jsx | 15 ++++++++++---
 4 files changed, 40 insertions(+), 20 deletions(-)

diff --git 
a/superset-frontend/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx
 
b/superset-frontend/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx
index ab6e677..b891675 100644
--- 
a/superset-frontend/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx
+++ 
b/superset-frontend/spec/javascripts/explore/components/AdhocFilterControl_spec.jsx
@@ -21,7 +21,7 @@ import React from 'react';
 import sinon from 'sinon';
 import { shallow } from 'enzyme';
 
-import OnPasteSelect from 'src/components/Select/OnPasteSelect';
+import Select from 'src/components/Select';
 import AdhocFilter, {
   EXPRESSION_TYPES,
   CLAUSES,
@@ -73,14 +73,14 @@ function setup(overrides) {
 }
 
 describe('AdhocFilterControl', () => {
-  it('renders an onPasteSelect', () => {
+  it('renders Select', () => {
     const { wrapper } = setup();
-    expect(wrapper.find(OnPasteSelect)).toExist();
+    expect(wrapper.find(Select)).toExist();
   });
 
   it('handles saved metrics being selected to filter on', () => {
     const { wrapper, onChange } = setup({ value: [] });
-    const select = wrapper.find(OnPasteSelect);
+    const select = wrapper.find(Select);
     select.simulate('change', [{ saved_metric_name: 'sum__value' }]);
 
     const adhocFilter = onChange.lastCall.args[0][0];
@@ -100,7 +100,7 @@ describe('AdhocFilterControl', () => {
 
   it('handles adhoc metrics being selected to filter on', () => {
     const { wrapper, onChange } = setup({ value: [] });
-    const select = wrapper.find(OnPasteSelect);
+    const select = wrapper.find(Select);
     select.simulate('change', [sumValueAdhocMetric]);
 
     const adhocFilter = onChange.lastCall.args[0][0];
@@ -120,7 +120,7 @@ describe('AdhocFilterControl', () => {
 
   it('handles columns being selected to filter on', () => {
     const { wrapper, onChange } = setup({ value: [] });
-    const select = wrapper.find(OnPasteSelect);
+    const select = wrapper.find(Select);
     select.simulate('change', [columns[0]]);
 
     const adhocFilter = onChange.lastCall.args[0][0];
@@ -140,7 +140,7 @@ describe('AdhocFilterControl', () => {
 
   it('persists existing filters even when new filters are added', () => {
     const { wrapper, onChange } = setup();
-    const select = wrapper.find(OnPasteSelect);
+    const select = wrapper.find(Select);
     select.simulate('change', [simpleAdhocFilter, columns[0]]);
 
     const existingAdhocFilter = onChange.lastCall.args[0][0];
diff --git 
a/superset-frontend/spec/javascripts/explore/components/MetricsControl_spec.jsx 
b/superset-frontend/spec/javascripts/explore/components/MetricsControl_spec.jsx
index c924e33..ff3a3ec 100644
--- 
a/superset-frontend/spec/javascripts/explore/components/MetricsControl_spec.jsx
+++ 
b/superset-frontend/spec/javascripts/explore/components/MetricsControl_spec.jsx
@@ -23,7 +23,7 @@ import { shallow } from 'enzyme';
 
 import MetricsControl from 'src/explore/components/controls/MetricsControl';
 import { AGGREGATES } from 'src/explore/constants';
-import OnPasteSelect from 'src/components/Select/OnPasteSelect';
+import Select from 'src/components/Select';
 import AdhocMetric, { EXPRESSION_TYPES } from 'src/explore/AdhocMetric';
 
 const defaultProps = {
@@ -63,9 +63,9 @@ const sumValueAdhocMetric = new AdhocMetric({
 });
 
 describe('MetricsControl', () => {
-  it('renders an OnPasteSelect', () => {
+  it('renders Select', () => {
     const { wrapper } = setup();
-    expect(wrapper.find(OnPasteSelect)).toExist();
+    expect(wrapper.find(Select)).toExist();
   });
 
   describe('constructor', () => {
@@ -152,14 +152,14 @@ describe('MetricsControl', () => {
   describe('onChange', () => {
     it('handles saved metrics being selected', () => {
       const { wrapper, onChange } = setup();
-      const select = wrapper.find(OnPasteSelect);
+      const select = wrapper.find(Select);
       select.simulate('change', [{ metric_name: 'sum__value' }]);
       expect(onChange.lastCall.args).toEqual([['sum__value']]);
     });
 
     it('handles columns being selected', () => {
       const { wrapper, onChange } = setup();
-      const select = wrapper.find(OnPasteSelect);
+      const select = wrapper.find(Select);
       select.simulate('change', [valueColumn]);
 
       const adhocMetric = onChange.lastCall.args[0][0];
@@ -184,7 +184,7 @@ describe('MetricsControl', () => {
     it('handles aggregates being selected', () => {
       return new Promise(done => {
         const { wrapper, onChange } = setup();
-        const select = wrapper.find(OnPasteSelect);
+        const select = wrapper.find(Select);
 
         // mock out the Select ref
         const instance = wrapper.instance();
@@ -220,7 +220,7 @@ describe('MetricsControl', () => {
 
     it('preserves existing selected AdhocMetrics', () => {
       const { wrapper, onChange } = setup();
-      const select = wrapper.find(OnPasteSelect);
+      const select = wrapper.find(Select);
       select.simulate('change', [
         { metric_name: 'sum__value' },
         sumValueAdhocMetric,
@@ -262,6 +262,18 @@ describe('MetricsControl', () => {
       wrapper.instance().checkIfAggregateInInput('colu');
       expect(wrapper.state('aggregateInInput')).toBeNull();
     });
+
+    it('handles an aggregate in the input when paste event fires', () => {
+      const { wrapper } = setup();
+      expect(wrapper.state('aggregateInInput')).toBeNull();
+
+      const mEvent = {
+        clipboardData: { getData: jest.fn().mockReturnValueOnce('AVG(') },
+      };
+      const select = wrapper.find(Select);
+      select.simulate('paste', mEvent);
+      expect(wrapper.state('aggregateInInput')).toBe(AGGREGATES.AVG);
+    });
   });
 
   describe('option filter', () => {
diff --git 
a/superset-frontend/src/explore/components/controls/AdhocFilterControl.jsx 
b/superset-frontend/src/explore/components/controls/AdhocFilterControl.jsx
index 2448982..a5ea053 100644
--- a/superset-frontend/src/explore/components/controls/AdhocFilterControl.jsx
+++ b/superset-frontend/src/explore/components/controls/AdhocFilterControl.jsx
@@ -21,8 +21,7 @@ import PropTypes from 'prop-types';
 
 import { t, logging, SupersetClient } from '@superset-ui/core';
 
-import OnPasteSelect from 'src/components/Select/OnPasteSelect';
-
+import Select from 'src/components/Select';
 import ControlHeader from '../ControlHeader';
 import adhocFilterType from '../../propTypes/adhocFilterType';
 import adhocMetricType from '../../propTypes/adhocMetricType';
@@ -267,7 +266,7 @@ export default class AdhocFilterControl extends 
React.Component {
     return (
       <div className="metrics-select" data-test="adhoc-filter-control">
         <ControlHeader {...this.props} />
-        <OnPasteSelect
+        <Select
           isMulti
           isLoading={this.props.isLoading}
           name={`select-${this.props.name}`}
diff --git 
a/superset-frontend/src/explore/components/controls/MetricsControl.jsx 
b/superset-frontend/src/explore/components/controls/MetricsControl.jsx
index c7db3d0..b72b114 100644
--- a/superset-frontend/src/explore/components/controls/MetricsControl.jsx
+++ b/superset-frontend/src/explore/components/controls/MetricsControl.jsx
@@ -21,8 +21,7 @@ import PropTypes from 'prop-types';
 import { t } from '@superset-ui/core';
 import { isEqual } from 'lodash';
 
-import OnPasteSelect from 'src/components/Select/OnPasteSelect';
-
+import Select from 'src/components/Select';
 import ControlHeader from '../ControlHeader';
 import MetricDefinitionOption from '../MetricDefinitionOption';
 import MetricDefinitionValue from '../MetricDefinitionValue';
@@ -143,6 +142,7 @@ export default class MetricsControl extends 
React.PureComponent {
   constructor(props) {
     super(props);
     this.onChange = this.onChange.bind(this);
+    this.onPaste = this.onPaste.bind(this);
     this.onMetricEdit = this.onMetricEdit.bind(this);
     this.checkIfAggregateInInput = this.checkIfAggregateInInput.bind(this);
     this.optionsForSelect = this.optionsForSelect.bind(this);
@@ -258,6 +258,14 @@ export default class MetricsControl extends 
React.PureComponent {
     this.props.onChange(this.props.multi ? optionValues : optionValues[0]);
   }
 
+  onPaste(evt) {
+    const clipboard = evt.clipboardData.getData('Text');
+    if (!clipboard) {
+      return;
+    }
+    this.checkIfAggregateInInput(clipboard);
+  }
+
   checkIfAggregateInInput(input) {
     const lowercaseInput = input.toLowerCase();
     const aggregateInInput =
@@ -335,7 +343,7 @@ export default class MetricsControl extends 
React.PureComponent {
     return (
       <div className="metrics-select">
         <ControlHeader {...this.props} />
-        <OnPasteSelect
+        <Select
           isLoading={this.props.isLoading}
           isMulti={this.props.multi}
           name={`select-${this.props.name}`}
@@ -344,6 +352,7 @@ export default class MetricsControl extends 
React.PureComponent {
           value={this.state.value}
           labelKey="label"
           valueKey="optionName"
+          onPaste={this.onPaste}
           clearable={this.props.clearable}
           closeOnSelect
           onChange={this.onChange}

Reply via email to