You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by kg...@apache.org on 2023/03/06 12:43:01 UTC

[superset] branch master updated: fix(dashboard): Allow selecting text in cells in Table and PivotTable without triggering cross filters (#23283)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new d16512b775 fix(dashboard): Allow selecting text in cells in Table and PivotTable without triggering cross filters (#23283)
d16512b775 is described below

commit d16512b7758e36a1263fc63bd7d9d1f93060dc93
Author: Kamil Gabryjelski <ka...@gmail.com>
AuthorDate: Mon Mar 6 13:42:52 2023 +0100

    fix(dashboard): Allow selecting text in cells in Table and PivotTable without triggering cross filters (#23283)
---
 .../src/utils/{index.ts => getSelectedText.ts}     | 15 +----------
 .../packages/superset-ui-core/src/utils/index.ts   |  1 +
 .../utils/getSelectedText.test.ts}                 | 30 ++++++++++++----------
 .../src/PivotTableChart.tsx                        |  6 +++++
 .../plugins/plugin-chart-table/src/TableChart.tsx  |  8 +++++-
 5 files changed, 31 insertions(+), 29 deletions(-)

diff --git a/superset-frontend/packages/superset-ui-core/src/utils/index.ts b/superset-frontend/packages/superset-ui-core/src/utils/getSelectedText.ts
similarity index 52%
copy from superset-frontend/packages/superset-ui-core/src/utils/index.ts
copy to superset-frontend/packages/superset-ui-core/src/utils/getSelectedText.ts
index 19c5ed5861..d3671d875c 100644
--- a/superset-frontend/packages/superset-ui-core/src/utils/index.ts
+++ b/superset-frontend/packages/superset-ui-core/src/utils/getSelectedText.ts
@@ -16,17 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-export { default as convertKeysToCamelCase } from './convertKeysToCamelCase';
-export { default as ensureIsArray } from './ensureIsArray';
-export { default as ensureIsInt } from './ensureIsInt';
-export { default as isDefined } from './isDefined';
-export { default as isRequired } from './isRequired';
-export { default as isEqualArray } from './isEqualArray';
-export { default as makeSingleton } from './makeSingleton';
-export { default as promiseTimeout } from './promiseTimeout';
-export { default as logging } from './logging';
-export { default as removeDuplicates } from './removeDuplicates';
-export { lruCache } from './lruCache';
-export * from './featureFlags';
-export * from './random';
-export * from './typedMemo';
+export const getSelectedText = () => window.getSelection()?.toString();
diff --git a/superset-frontend/packages/superset-ui-core/src/utils/index.ts b/superset-frontend/packages/superset-ui-core/src/utils/index.ts
index 19c5ed5861..4efc3dedb6 100644
--- a/superset-frontend/packages/superset-ui-core/src/utils/index.ts
+++ b/superset-frontend/packages/superset-ui-core/src/utils/index.ts
@@ -27,6 +27,7 @@ export { default as promiseTimeout } from './promiseTimeout';
 export { default as logging } from './logging';
 export { default as removeDuplicates } from './removeDuplicates';
 export { lruCache } from './lruCache';
+export { getSelectedText } from './getSelectedText';
 export * from './featureFlags';
 export * from './random';
 export * from './typedMemo';
diff --git a/superset-frontend/packages/superset-ui-core/src/utils/index.ts b/superset-frontend/packages/superset-ui-core/test/utils/getSelectedText.test.ts
similarity index 52%
copy from superset-frontend/packages/superset-ui-core/src/utils/index.ts
copy to superset-frontend/packages/superset-ui-core/test/utils/getSelectedText.test.ts
index 19c5ed5861..75682e9e74 100644
--- a/superset-frontend/packages/superset-ui-core/src/utils/index.ts
+++ b/superset-frontend/packages/superset-ui-core/test/utils/getSelectedText.test.ts
@@ -16,17 +16,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-export { default as convertKeysToCamelCase } from './convertKeysToCamelCase';
-export { default as ensureIsArray } from './ensureIsArray';
-export { default as ensureIsInt } from './ensureIsInt';
-export { default as isDefined } from './isDefined';
-export { default as isRequired } from './isRequired';
-export { default as isEqualArray } from './isEqualArray';
-export { default as makeSingleton } from './makeSingleton';
-export { default as promiseTimeout } from './promiseTimeout';
-export { default as logging } from './logging';
-export { default as removeDuplicates } from './removeDuplicates';
-export { lruCache } from './lruCache';
-export * from './featureFlags';
-export * from './random';
-export * from './typedMemo';
+import { getSelectedText } from '@superset-ui/core';
+
+test('Returns null if Selection object is null', () => {
+  jest.spyOn(window, 'getSelection').mockImplementationOnce(() => null);
+  expect(getSelectedText()).toEqual(undefined);
+  jest.restoreAllMocks();
+});
+
+test('Returns selection text if Selection object is not null', () => {
+  jest
+    .spyOn(window, 'getSelection')
+    // @ts-ignore
+    .mockImplementationOnce(() => ({ toString: () => 'test string' }));
+  expect(getSelectedText()).toEqual('test string');
+  jest.restoreAllMocks();
+});
diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/PivotTableChart.tsx b/superset-frontend/plugins/plugin-chart-pivot-table/src/PivotTableChart.tsx
index 84a64adfc7..53e98fd31d 100644
--- a/superset-frontend/plugins/plugin-chart-pivot-table/src/PivotTableChart.tsx
+++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/PivotTableChart.tsx
@@ -30,6 +30,7 @@ import {
   isAdhocColumn,
   BinaryQueryObjectFilterClause,
   t,
+  getSelectedText,
 } from '@superset-ui/core';
 import { PivotTable, sortAs, aggregatorTemplates } from './react-pivottable';
 import {
@@ -356,6 +357,11 @@ export default function PivotTableChart(props: PivotTableProps) {
         return;
       }
 
+      // allow selecting text in a cell
+      if (getSelectedText()) {
+        return;
+      }
+
       const isActiveFilterValue = (key: string, val: DataRecordValue) =>
         !!selectedFilters && selectedFilters[key]?.includes(val);
 
diff --git a/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx b/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx
index 9843a4ae8b..ac02a10137 100644
--- a/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx
+++ b/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx
@@ -41,6 +41,7 @@ import {
   DTTM_ALIAS,
   ensureIsArray,
   GenericDataType,
+  getSelectedText,
   getTimeFormatterForGranularity,
   BinaryQueryObjectFilterClause,
   styled,
@@ -493,7 +494,12 @@ export default function TableChart<D extends DataRecord = DataRecord>(
             title: typeof value === 'number' ? String(value) : undefined,
             onClick:
               emitCrossFilters && !valueRange && !isMetric
-                ? () => toggleFilter(key, value)
+                ? () => {
+                    // allow selecting text in a cell
+                    if (!getSelectedText()) {
+                      toggleFilter(key, value);
+                    }
+                  }
                 : undefined,
             onContextMenu: (e: MouseEvent) => {
               if (handleContextMenu) {