From 347e040d7cba5c3e9b70b91413cbcabd60f59a26 Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Wed, 17 Jul 2024 15:33:39 +1200 Subject: [PATCH 01/26] disable data selection from results table --- superset-frontend/src/components/FilterableTable/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/superset-frontend/src/components/FilterableTable/index.tsx b/superset-frontend/src/components/FilterableTable/index.tsx index f77f4aede0eb..86197a550b5c 100644 --- a/superset-frontend/src/components/FilterableTable/index.tsx +++ b/superset-frontend/src/components/FilterableTable/index.tsx @@ -50,6 +50,7 @@ const StyledFilterableTable = styled.div` min-width: 0px; align-self: center; font-size: ${theme.typography.sizes.s}px; + user-select: none; } .even-row { @@ -63,6 +64,7 @@ const StyledFilterableTable = styled.div` .cell-text-for-measuring { font-family: ${theme.typography.families.sansSerif}; font-size: ${theme.typography.sizes.s}px; + user-select: none; } `} `; From 879ac4573c2b7b2c81f8d8efa3f3985d2f62ada2 Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Wed, 17 Jul 2024 16:00:29 +1200 Subject: [PATCH 02/26] disable selection from chart table --- superset-frontend/plugins/plugin-chart-table/src/Styles.tsx | 3 +++ .../plugins/plugin-chart-table/src/TableChart.tsx | 2 ++ 2 files changed, 5 insertions(+) diff --git a/superset-frontend/plugins/plugin-chart-table/src/Styles.tsx b/superset-frontend/plugins/plugin-chart-table/src/Styles.tsx index e394d16446ee..a75e6285afec 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/Styles.tsx +++ b/superset-frontend/plugins/plugin-chart-table/src/Styles.tsx @@ -118,5 +118,8 @@ export default styled.div` table .right-border-only:last-child { border-right: none; } + .no-select { + user-select: none; + } `} `; diff --git a/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx b/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx index a87371f440f0..e477cd71270e 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx +++ b/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx @@ -736,6 +736,8 @@ export default function TableChart( } } + className += ' no-select'; + return { id: String(i), // to allow duplicate column keys // must use custom accessor to allow `.` in column names From bd8771ddd0648c420023025ba36151e38425c1de Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Wed, 17 Jul 2024 16:01:18 +1200 Subject: [PATCH 03/26] disable pivot chart select --- .../plugin-chart-pivot-table/src/react-pivottable/Styles.js | 1 + superset-frontend/src/components/FilterableTable/index.tsx | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js index 0854620f2b96..ba2f6bdf12bb 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js @@ -30,6 +30,7 @@ export const Styles = styled.div` border-collapse: separate; font-family: ${theme.typography.families.sansSerif}; line-height: 1.4; + user-select: none; } table thead { diff --git a/superset-frontend/src/components/FilterableTable/index.tsx b/superset-frontend/src/components/FilterableTable/index.tsx index 86197a550b5c..224d67e5f58f 100644 --- a/superset-frontend/src/components/FilterableTable/index.tsx +++ b/superset-frontend/src/components/FilterableTable/index.tsx @@ -64,7 +64,6 @@ const StyledFilterableTable = styled.div` .cell-text-for-measuring { font-family: ${theme.typography.families.sansSerif}; font-size: ${theme.typography.sizes.s}px; - user-select: none; } `} `; From e4b3960720c857d3be4da486d75a1d9d7e982fb9 Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Mon, 22 Jul 2024 17:52:16 +1200 Subject: [PATCH 04/26] add user select to permissions model --- .../src/components/FilterableTable/index.tsx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/superset-frontend/src/components/FilterableTable/index.tsx b/superset-frontend/src/components/FilterableTable/index.tsx index 224d67e5f58f..0d691c6538d3 100644 --- a/superset-frontend/src/components/FilterableTable/index.tsx +++ b/superset-frontend/src/components/FilterableTable/index.tsx @@ -18,11 +18,14 @@ */ import _JSONbig from 'json-bigint'; import { useEffect, useRef, useState, useMemo } from 'react'; +import { useSelector } from 'react-redux'; import { getMultipleTextDimensions, styled } from '@superset-ui/core'; import { useDebounceValue } from 'src/hooks/useDebounceValue'; import { useCellContentParser } from './useCellContentParser'; import { renderResultCell } from './utils'; import { Table, TableSize } from '../Table'; +import { RootState } from 'src/dashboard/types'; +import { findPermission } from 'src/utils/findPermission'; const JSONbig = _JSONbig({ storeAsString: true, @@ -35,8 +38,12 @@ const SCROLL_BAR_HEIGHT = 15; // See https://stackoverflow.com/a/30987109 for more details const ONLY_NUMBER_REGEX = /^(NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity))$/; -const StyledFilterableTable = styled.div` - ${({ theme }) => ` +interface StyledFilterableTableProps { + canDownload?: boolean; +} + +const StyledFilterableTable = styled.div` + ${({ theme, canDownload }) => ` height: 100%; overflow: hidden; @@ -50,7 +57,7 @@ const StyledFilterableTable = styled.div` min-width: 0px; align-self: center; font-size: ${theme.typography.sizes.s}px; - user-select: none; + user-select: ${canDownload ? 'auto' : 'none'}; } .even-row { @@ -250,11 +257,16 @@ const FilterableTable = ({ }), })); + const canDownload = useSelector((state: RootState) => + findPermission('can_csv', 'Superset', state.user?.roles), + ); + return ( {fitted && ( Date: Mon, 22 Jul 2024 18:10:47 +1200 Subject: [PATCH 05/26] change perms to can_export_csv --- .../src/components/FilterableTable/index.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/superset-frontend/src/components/FilterableTable/index.tsx b/superset-frontend/src/components/FilterableTable/index.tsx index 0d691c6538d3..fc9a593d00d2 100644 --- a/superset-frontend/src/components/FilterableTable/index.tsx +++ b/superset-frontend/src/components/FilterableTable/index.tsx @@ -39,11 +39,11 @@ const SCROLL_BAR_HEIGHT = 15; const ONLY_NUMBER_REGEX = /^(NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity))$/; interface StyledFilterableTableProps { - canDownload?: boolean; + canExportData?: boolean; } const StyledFilterableTable = styled.div` - ${({ theme, canDownload }) => ` + ${({ theme, canExportData }) => ` height: 100%; overflow: hidden; @@ -57,7 +57,7 @@ const StyledFilterableTable = styled.div` min-width: 0px; align-self: center; font-size: ${theme.typography.sizes.s}px; - user-select: ${canDownload ? 'auto' : 'none'}; + user-select: ${canExportData ? 'auto' : 'none'}; } .even-row { @@ -257,8 +257,8 @@ const FilterableTable = ({ }), })); - const canDownload = useSelector((state: RootState) => - findPermission('can_csv', 'Superset', state.user?.roles), + const canExportData = useSelector((state: RootState) => + findPermission('can_export_csv', 'SQLLab', state.user?.roles), ); return ( @@ -266,7 +266,7 @@ const FilterableTable = ({ className="filterable-table-container" data-test="table-container" ref={container} - canDownload={canDownload} + canExportData={canExportData} > {fitted && (
Date: Mon, 29 Jul 2024 16:53:39 +1200 Subject: [PATCH 06/26] pass dataSelectionMode prop to plugin --- .../superset-ui-core/src/chart/components/SuperChart.tsx | 2 ++ .../superset-ui-core/src/chart/models/ChartProps.ts | 9 +++++++++ .../plugins/plugin-chart-table/src/TableChart.tsx | 5 ++++- .../plugins/plugin-chart-table/src/transformProps.ts | 2 ++ superset-frontend/src/components/Chart/ChartRenderer.jsx | 4 ++++ .../src/components/FilterableTable/index.tsx | 4 ++-- 6 files changed, 23 insertions(+), 3 deletions(-) diff --git a/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx b/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx index 473a3506a411..e200f4126a98 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx +++ b/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx @@ -97,6 +97,8 @@ export type Props = Omit & * Determines is the context menu related to the chart is open */ inContextMenu?: boolean; + /** Prop that controls user selection of chart data */ + dataSelectionMode?: string; }; type PropsWithDefault = Props & Readonly; diff --git a/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts b/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts index 829440133a32..8b01c7f27f8e 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts +++ b/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts @@ -105,6 +105,8 @@ export interface ChartPropsConfig { inputRef?: RefObject; /** Theme object */ theme: SupersetTheme; + /** Set chart data selectable by user **/ + dataSelectionMode?: string; } const DEFAULT_WIDTH = 800; @@ -155,6 +157,8 @@ export default class ChartProps { theme: SupersetTheme; + dataSelectionMode?: string; + constructor(config: ChartPropsConfig & { formData?: FormData } = {}) { const { annotationData = {}, @@ -176,6 +180,7 @@ export default class ChartProps { inContextMenu = false, emitCrossFilters = false, theme, + dataSelectionMode, } = config; this.width = width; this.height = height; @@ -198,6 +203,7 @@ export default class ChartProps { this.inContextMenu = inContextMenu; this.emitCrossFilters = emitCrossFilters; this.theme = theme; + this.dataSelectionMode = dataSelectionMode; } } @@ -223,6 +229,7 @@ ChartProps.createSelector = function create(): ChartPropsSelector { input => input.inContextMenu, input => input.emitCrossFilters, input => input.theme, + input => input.dataSelectionMode, ( annotationData, datasource, @@ -243,6 +250,7 @@ ChartProps.createSelector = function create(): ChartPropsSelector { inContextMenu, emitCrossFilters, theme, + dataSelectionMode, ) => new ChartProps({ annotationData, @@ -264,6 +272,7 @@ ChartProps.createSelector = function create(): ChartPropsSelector { inContextMenu, emitCrossFilters, theme, + dataSelectionMode, }), ); }; diff --git a/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx b/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx index e477cd71270e..7e481413ca00 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx +++ b/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx @@ -264,6 +264,7 @@ export default function TableChart( isUsingTimeComparison, basicColorFormatters, basicColorColumnFormatters, + dataSelectionMode, } = props; const comparisonColumns = [ { key: 'all', label: t('Display all') }, @@ -736,7 +737,9 @@ export default function TableChart( } } - className += ' no-select'; + if (dataSelectionMode === 'None') { + className += ' no-select'; + } return { id: String(i), // to allow duplicate column keys diff --git a/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts b/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts index 48871e4ea418..73276b589607 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts @@ -455,6 +455,7 @@ const transformProps = ( onContextMenu, }, emitCrossFilters, + dataSelectionMode, } = chartProps; const { @@ -706,6 +707,7 @@ const transformProps = ( basicColorFormatters, startDateOffset, basicColorColumnFormatters, + dataSelectionMode, }; }; diff --git a/superset-frontend/src/components/Chart/ChartRenderer.jsx b/superset-frontend/src/components/Chart/ChartRenderer.jsx index b9cd6caf4fb9..3037774074cc 100644 --- a/superset-frontend/src/components/Chart/ChartRenderer.jsx +++ b/superset-frontend/src/components/Chart/ChartRenderer.jsx @@ -48,6 +48,7 @@ const propTypes = { setControlValue: PropTypes.func, vizType: PropTypes.string.isRequired, triggerRender: PropTypes.bool, + // dataSelectionMode: PropTypes.string, // state chartAlert: PropTypes.string, chartStatus: PropTypes.string, @@ -315,6 +316,8 @@ class ChartRenderer extends Component { ); } + const dataSelectionMode = 'None'; + // Check for Behavior.DRILL_TO_DETAIL to tell if chart can receive Drill to // Detail props or if it'll cause side-effects (e.g. excessive re-renders). const drillToDetailProps = getChartMetadataRegistry() @@ -362,6 +365,7 @@ class ChartRenderer extends Component { postTransformProps={postTransformProps} emitCrossFilters={emitCrossFilters} legendState={this.state.legendState} + dataSelectionMode={dataSelectionMode} {...drillToDetailProps} /> diff --git a/superset-frontend/src/components/FilterableTable/index.tsx b/superset-frontend/src/components/FilterableTable/index.tsx index fc9a593d00d2..a46b89d94796 100644 --- a/superset-frontend/src/components/FilterableTable/index.tsx +++ b/superset-frontend/src/components/FilterableTable/index.tsx @@ -21,11 +21,11 @@ import { useEffect, useRef, useState, useMemo } from 'react'; import { useSelector } from 'react-redux'; import { getMultipleTextDimensions, styled } from '@superset-ui/core'; import { useDebounceValue } from 'src/hooks/useDebounceValue'; +import { RootState } from 'src/dashboard/types'; +import { findPermission } from 'src/utils/findPermission'; import { useCellContentParser } from './useCellContentParser'; import { renderResultCell } from './utils'; import { Table, TableSize } from '../Table'; -import { RootState } from 'src/dashboard/types'; -import { findPermission } from 'src/utils/findPermission'; const JSONbig = _JSONbig({ storeAsString: true, From 7396fd092b6e5aab96c9c008e6d279af20bb5f3c Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Mon, 29 Jul 2024 17:27:46 +1200 Subject: [PATCH 07/26] remove unneeded prop --- .../superset-ui-core/src/chart/components/SuperChart.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx b/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx index e200f4126a98..473a3506a411 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx +++ b/superset-frontend/packages/superset-ui-core/src/chart/components/SuperChart.tsx @@ -97,8 +97,6 @@ export type Props = Omit & * Determines is the context menu related to the chart is open */ inContextMenu?: boolean; - /** Prop that controls user selection of chart data */ - dataSelectionMode?: string; }; type PropsWithDefault = Props & Readonly; From 750ddd8e2be21ae8454c066ee322e87991cba5c1 Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Wed, 31 Jul 2024 11:32:32 +1200 Subject: [PATCH 08/26] get permissions from role TableChart --- .../plugins/plugin-chart-table/src/TableChart.tsx | 2 +- superset-frontend/src/components/Chart/Chart.jsx | 8 ++++++++ superset-frontend/src/components/Chart/ChartContainer.jsx | 8 +++++++- superset-frontend/src/components/Chart/ChartRenderer.jsx | 6 ++---- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx b/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx index 7e481413ca00..b6132ed5a183 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx +++ b/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx @@ -737,7 +737,7 @@ export default function TableChart( } } - if (dataSelectionMode === 'None') { + if (dataSelectionMode === 'none') { className += ' no-select'; } diff --git a/superset-frontend/src/components/Chart/Chart.jsx b/superset-frontend/src/components/Chart/Chart.jsx index ea1a2d968c99..794dfdae1c2c 100644 --- a/superset-frontend/src/components/Chart/Chart.jsx +++ b/superset-frontend/src/components/Chart/Chart.jsx @@ -39,6 +39,7 @@ import { ResourceStatus } from 'src/hooks/apiResources/apiResources'; import ChartRenderer from './ChartRenderer'; import { ChartErrorMessage } from './ChartErrorMessage'; import { getChartRequiredFieldsMissingMessage } from '../../utils/getChartRequiredFieldsMissingMessage'; +import { findPermission } from 'src/utils/findPermission'; const propTypes = { annotationData: PropTypes.object, @@ -82,6 +83,7 @@ const propTypes = { datasetsStatus: PropTypes.oneOf(['loading', 'error', 'complete']), isInView: PropTypes.bool, emitCrossFilters: PropTypes.bool, + user: PropTypes.object, }; const BLANK = {}; @@ -156,6 +158,11 @@ class Chart extends PureComponent { super(props); this.handleRenderContainerFailure = this.handleRenderContainerFailure.bind(this); + this.canExportData = findPermission( + 'can_export_csv', + 'SQLLab', + this.props.user?.roles, + ); } componentDidMount() { @@ -271,6 +278,7 @@ class Chart extends PureComponent { {...this.props} source={this.props.dashboardId ? 'dashboard' : 'explore'} data-test={this.props.vizType} + dataSelectionMode={this.canExportData ? 'auto' : 'none'} /> ) : ( diff --git a/superset-frontend/src/components/Chart/ChartContainer.jsx b/superset-frontend/src/components/Chart/ChartContainer.jsx index 50c036c28db3..a358ba03f435 100644 --- a/superset-frontend/src/components/Chart/ChartContainer.jsx +++ b/superset-frontend/src/components/Chart/ChartContainer.jsx @@ -24,6 +24,12 @@ import { logEvent } from '../../logger/actions'; import Chart from './Chart'; import { updateDataMask } from '../../dataMask/actions'; +function mapStateToProps(state) { + return { + user: state.user, + }; +} + function mapDispatchToProps(dispatch) { return { actions: bindActionCreators( @@ -37,4 +43,4 @@ function mapDispatchToProps(dispatch) { }; } -export default connect(null, mapDispatchToProps)(Chart); +export default connect(mapStateToProps, mapDispatchToProps)(Chart); diff --git a/superset-frontend/src/components/Chart/ChartRenderer.jsx b/superset-frontend/src/components/Chart/ChartRenderer.jsx index 3037774074cc..48c1c5e44d31 100644 --- a/superset-frontend/src/components/Chart/ChartRenderer.jsx +++ b/superset-frontend/src/components/Chart/ChartRenderer.jsx @@ -48,8 +48,6 @@ const propTypes = { setControlValue: PropTypes.func, vizType: PropTypes.string.isRequired, triggerRender: PropTypes.bool, - // dataSelectionMode: PropTypes.string, - // state chartAlert: PropTypes.string, chartStatus: PropTypes.string, queriesResponse: PropTypes.arrayOf(PropTypes.object), @@ -64,6 +62,7 @@ const propTypes = { postTransformProps: PropTypes.func, source: PropTypes.oneOf([ChartSource.Dashboard, ChartSource.Explore]), emitCrossFilters: PropTypes.bool, + dataSelectionMode: PropTypes.string, }; const BLANK = {}; @@ -265,6 +264,7 @@ class ChartRenderer extends Component { formData, latestQueryFormData, postTransformProps, + dataSelectionMode, } = this.props; const currentFormData = @@ -316,8 +316,6 @@ class ChartRenderer extends Component { ); } - const dataSelectionMode = 'None'; - // Check for Behavior.DRILL_TO_DETAIL to tell if chart can receive Drill to // Detail props or if it'll cause side-effects (e.g. excessive re-renders). const drillToDetailProps = getChartMetadataRegistry() From cf5bfc07386df6dccfa135dcfff32af351c8a5e2 Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Wed, 31 Jul 2024 12:21:15 +1200 Subject: [PATCH 09/26] add user permissions to pivot table --- .../plugins/plugin-chart-pivot-table/src/PivotTableChart.tsx | 2 ++ .../plugin-chart-pivot-table/src/plugin/transformProps.ts | 5 +++++ .../plugin-chart-pivot-table/src/react-pivottable/Styles.js | 4 ++-- .../src/react-pivottable/TableRenderers.jsx | 2 +- .../plugins/plugin-chart-pivot-table/src/types.ts | 1 + 5 files changed, 11 insertions(+), 3 deletions(-) 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 a17bac64aa78..6c4f2bd9fac2 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/PivotTableChart.tsx +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/PivotTableChart.tsx @@ -155,6 +155,7 @@ export default function PivotTableChart(props: PivotTableProps) { onContextMenu, timeGrainSqla, allowRenderHtml, + dataSelectionMode, } = props; const theme = useTheme(); @@ -557,6 +558,7 @@ export default function PivotTableChart(props: PivotTableProps) { namesMapping={verboseMap} onContextMenu={handleContextMenu} allowRenderHtml={allowRenderHtml} + dataSelectionMode={dataSelectionMode} /> diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts index f6018289804e..e29ade9ae3fe 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts @@ -81,6 +81,7 @@ export default function transformProps(chartProps: ChartProps) { filterState, datasource: { verboseMap = {}, columnFormats = {}, currencyFormats = {} }, emitCrossFilters, + dataSelectionMode, } = chartProps; const { data, colnames, coltypes } = queriesData[0]; const { @@ -175,6 +176,10 @@ export default function transformProps(chartProps: ChartProps) { dateFormatters, onContextMenu, timeGrainSqla, +<<<<<<< HEAD allowRenderHtml, +======= + dataSelectionMode, +>>>>>>> c9fcad01b (add user permissions to pivot table) }; } diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js index ba2f6bdf12bb..b9fdf42abb3d 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js @@ -20,7 +20,7 @@ import { css, styled } from '@superset-ui/core'; export const Styles = styled.div` - ${({ theme, isDashboardEditMode }) => css` + ${({ theme, isDashboardEditMode, dataSelectionMode }) => css` table.pvtTable { position: ${isDashboardEditMode ? 'inherit' : 'relative'}; width: calc(100% - ${theme.gridUnit}px); @@ -30,7 +30,7 @@ export const Styles = styled.div` border-collapse: separate; font-family: ${theme.typography.families.sansSerif}; line-height: 1.4; - user-select: none; + user-select: ${dataSelectionMode}; } table thead { diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx index 06085a42ad25..ebc36ddaac85 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx @@ -915,7 +915,7 @@ export class TableRenderer extends Component { }; return ( - +
{colAttrs.map((c, j) => diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/types.ts b/superset-frontend/plugins/plugin-chart-pivot-table/src/types.ts index 83c4e76b8617..8571c88382d5 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/types.ts +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/types.ts @@ -79,6 +79,7 @@ interface PivotTableCustomizeProps { dateFormatters: Record; legacy_order_by: QueryFormMetric[] | QueryFormMetric | null; order_desc: boolean; + dataSelectionMode: string; onContextMenu?: ( clientX: number, clientY: number, From 1a709ed50353cfbf40c635531a724d96d0bffcf8 Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Wed, 31 Jul 2024 14:29:50 +1200 Subject: [PATCH 10/26] apply linter and fix compiler errors --- .../superset-ui-core/src/chart/models/ChartProps.ts | 4 ++-- .../src/react-pivottable/TableRenderers.jsx | 5 ++++- .../test/plugin/buildQuery.test.ts | 1 + .../plugins/plugin-chart-table/src/transformProps.ts | 2 +- .../plugins/plugin-chart-table/src/types.ts | 1 + superset-frontend/src/components/Chart/Chart.jsx | 12 ++++++------ 6 files changed, 15 insertions(+), 10 deletions(-) diff --git a/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts b/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts index 8b01c7f27f8e..d5782177d349 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts +++ b/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts @@ -105,7 +105,7 @@ export interface ChartPropsConfig { inputRef?: RefObject; /** Theme object */ theme: SupersetTheme; - /** Set chart data selectable by user **/ + /** Set chart data selectable by user */ dataSelectionMode?: string; } @@ -272,7 +272,7 @@ ChartProps.createSelector = function create(): ChartPropsSelector { inContextMenu, emitCrossFilters, theme, - dataSelectionMode, + dataSelectionMode, }), ); }; diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx index ebc36ddaac85..6be7424df8ed 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/TableRenderers.jsx @@ -915,7 +915,10 @@ export class TableRenderer extends Component { }; return ( - +
{colAttrs.map((c, j) => diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts b/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts index 3bf887c0b60f..5d7ac7a0a663 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts +++ b/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts @@ -54,6 +54,7 @@ const formData: PivotTableQueryFormData = { time_grain_sqla: TimeGranularity.MONTH, temporal_columns_lookup: { col1: true }, currencyFormat: { symbol: 'USD', symbolPosition: 'prefix' }, + dataSelectionMode: 'auto', }; test('should build groupby with series in form data', () => { diff --git a/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts b/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts index 73276b589607..49a9017545e0 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts @@ -707,7 +707,7 @@ const transformProps = ( basicColorFormatters, startDateOffset, basicColorColumnFormatters, - dataSelectionMode, + dataSelectionMode: dataSelectionMode ?? 'auto', }; }; diff --git a/superset-frontend/plugins/plugin-chart-table/src/types.ts b/superset-frontend/plugins/plugin-chart-table/src/types.ts index 1ec3cbe29d72..d9c28109c6c2 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/types.ts +++ b/superset-frontend/plugins/plugin-chart-table/src/types.ts @@ -146,6 +146,7 @@ export interface TableChartTransformedProps { basicColorFormatters?: { [Key: string]: BasicColorFormatterType }[]; basicColorColumnFormatters?: { [Key: string]: BasicColorFormatterType }[]; startDateOffset?: string; + dataSelectionMode: string; } export enum ColorSchemeEnum { diff --git a/superset-frontend/src/components/Chart/Chart.jsx b/superset-frontend/src/components/Chart/Chart.jsx index 794dfdae1c2c..32b5de44d264 100644 --- a/superset-frontend/src/components/Chart/Chart.jsx +++ b/superset-frontend/src/components/Chart/Chart.jsx @@ -36,10 +36,10 @@ import { getUrlParam } from 'src/utils/urlUtils'; import { isCurrentUserBot } from 'src/utils/isBot'; import { ChartSource } from 'src/types/ChartSource'; import { ResourceStatus } from 'src/hooks/apiResources/apiResources'; +import { findPermission } from 'src/utils/findPermission'; import ChartRenderer from './ChartRenderer'; import { ChartErrorMessage } from './ChartErrorMessage'; import { getChartRequiredFieldsMissingMessage } from '../../utils/getChartRequiredFieldsMissingMessage'; -import { findPermission } from 'src/utils/findPermission'; const propTypes = { annotationData: PropTypes.object, @@ -158,11 +158,11 @@ class Chart extends PureComponent { super(props); this.handleRenderContainerFailure = this.handleRenderContainerFailure.bind(this); - this.canExportData = findPermission( - 'can_export_csv', - 'SQLLab', - this.props.user?.roles, - ); + this.canExportData = findPermission( + 'can_export_csv', + 'SQLLab', + this.props.user?.roles, + ); } componentDidMount() { From 3b8a8224918810b29bcbf48fd75503623a3bbfca Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Wed, 31 Jul 2024 15:35:51 +1200 Subject: [PATCH 11/26] update permissions to inline with previous features --- superset-frontend/src/components/Chart/Chart.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/superset-frontend/src/components/Chart/Chart.jsx b/superset-frontend/src/components/Chart/Chart.jsx index 32b5de44d264..6d28050d1b31 100644 --- a/superset-frontend/src/components/Chart/Chart.jsx +++ b/superset-frontend/src/components/Chart/Chart.jsx @@ -159,8 +159,8 @@ class Chart extends PureComponent { this.handleRenderContainerFailure = this.handleRenderContainerFailure.bind(this); this.canExportData = findPermission( - 'can_export_csv', - 'SQLLab', + 'can_csv', + 'Superset', this.props.user?.roles, ); } From 783795bc2f4e9bb625d35775d94e4a33083fbd06 Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Fri, 2 Aug 2024 14:33:16 +1200 Subject: [PATCH 12/26] apply unsaved changes --- .../plugin-chart-pivot-table/src/plugin/transformProps.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts index e29ade9ae3fe..6fefbf04627e 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts @@ -176,10 +176,7 @@ export default function transformProps(chartProps: ChartProps) { dateFormatters, onContextMenu, timeGrainSqla, -<<<<<<< HEAD allowRenderHtml, -======= dataSelectionMode, ->>>>>>> c9fcad01b (add user permissions to pivot table) }; } From e82967b7ae9c0df1626285819d3cb498d5d0bf77 Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Fri, 2 Aug 2024 17:20:08 +1200 Subject: [PATCH 13/26] fix filterable table test --- .../FilterableTable/FilterableTable.test.tsx | 63 ++++++++++++++++--- 1 file changed, 55 insertions(+), 8 deletions(-) diff --git a/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx b/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx index 415d7f053dfc..de4c6f0eabe6 100644 --- a/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx +++ b/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx @@ -20,6 +20,8 @@ import { isValidElement } from 'react'; import FilterableTable from 'src/components/FilterableTable'; import { render, screen, within } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; +import { Provider } from 'react-redux'; +import configureStore from 'redux-mock-store'; describe('FilterableTable', () => { const mockedProps = { @@ -31,12 +33,18 @@ describe('FilterableTable', () => { ], height: 500, }; + const initialState = { state: { user : {role : 'test'}} }; + const mockStore = configureStore(); + let store; it('is valid element', () => { expect(isValidElement()).toBe(true); }); it('renders a grid with 3 Table rows', () => { + store = mockStore(initialState); const { getByRole, getByText } = render( - , + + + , ); expect(getByRole('table')).toBeInTheDocument(); mockedProps.data.forEach(({ b: columnBContent }) => { @@ -48,7 +56,12 @@ describe('FilterableTable', () => { ...mockedProps, filterText: 'b1', }; - const { getByText, queryByText } = render(); + store = mockStore(initialState); + const { getByText, queryByText } = render( + + + , + ); expect(getByText(props.filterText)).toBeInTheDocument(); expect(queryByText('b2')).toBeFalsy(); expect(queryByText('b3')).toBeFalsy(); @@ -58,7 +71,12 @@ describe('FilterableTable', () => { ...mockedProps, filterText: '100', }; - const { getByText, queryByText } = render(); + store = mockStore(initialState); + const { getByText, queryByText } = render( + + + , + ); expect(getByText('b2')).toBeInTheDocument(); expect(queryByText('b1')).toBeFalsy(); expect(queryByText('b3')).toBeFalsy(); @@ -66,6 +84,9 @@ describe('FilterableTable', () => { }); describe('FilterableTable sorting - RTL', () => { + const initialState = { state: { user : {role : 'test'}} }; + const mockStore = configureStore(); + let store; it('sorts strings correctly', () => { const stringProps = { orderedColumnKeys: ['columnA'], @@ -76,7 +97,12 @@ describe('FilterableTable sorting - RTL', () => { ], height: 500, }; - render(); + store = mockStore(initialState); + render( + + + , + ); const stringColumn = within(screen.getByRole('table')) .getByText('columnA') @@ -122,7 +148,12 @@ describe('FilterableTable sorting - RTL', () => { data: [{ columnB: 21 }, { columnB: 0 }, { columnB: 623 }], height: 500, }; - render(); + store = mockStore(initialState); + render( + + + , + ); const integerColumn = within(screen.getByRole('table')) .getByText('columnB') @@ -157,7 +188,13 @@ describe('FilterableTable sorting - RTL', () => { data: [{ columnC: 45.67 }, { columnC: 1.23 }, { columnC: 89.0000001 }], height: 500, }; - render(); + mockStore(initialState); + store = mockStore(initialState); + render( + + + , + ); const floatColumn = within(screen.getByRole('table')) .getByText('columnC') @@ -212,7 +249,12 @@ describe('FilterableTable sorting - RTL', () => { ], height: 500, }; - render(); + store = mockStore(initialState); + render( + + + , + ); const mixedFloatColumn = within(screen.getByRole('table')) .getByText('columnD') @@ -310,7 +352,12 @@ describe('FilterableTable sorting - RTL', () => { ], height: 500, }; - render(); + store = mockStore(initialState); + render( + + + , + ); const dsColumn = within(screen.getByRole('table')) .getByText('columnDS') From 8dadd6ea4eeef5e5a51f51451db5c0a43b1d1f70 Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Mon, 9 Sep 2024 14:04:02 +1200 Subject: [PATCH 14/26] move access to redux state outside of filterable table comp --- .../src/SqlLab/components/ResultSet/index.tsx | 15 ++++++++------- .../src/components/FilterableTable/index.tsx | 17 ++++++----------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet/index.tsx b/superset-frontend/src/SqlLab/components/ResultSet/index.tsx index 152d0b9208c7..aeef52b8ed10 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet/index.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet/index.tsx @@ -84,6 +84,7 @@ import ExploreResultsButton from '../ExploreResultsButton'; import HighlightedSql from '../HighlightedSql'; import QueryStateLabel from '../QueryStateLabel'; + enum LimitingFactor { Query = 'QUERY', QueryAndDropdown = 'QUERY_AND_DROPDOWN', @@ -263,6 +264,12 @@ const ResultSet = ({ setSearchText(event.target.value); }; + const canExportData = findPermission( + 'can_export_csv', + 'SQLLab', + user?.roles, + ); + const createExploreResultsOnClick = async (clickEvent: MouseEvent) => { const { results } = query; @@ -309,13 +316,6 @@ const ResultSet = ({ templateParams: query?.templateParams, schema: query?.schema, }; - - const canExportData = findPermission( - 'can_export_csv', - 'SQLLab', - user?.roles, - ); - return ( ); diff --git a/superset-frontend/src/components/FilterableTable/index.tsx b/superset-frontend/src/components/FilterableTable/index.tsx index a46b89d94796..017285cce4d5 100644 --- a/superset-frontend/src/components/FilterableTable/index.tsx +++ b/superset-frontend/src/components/FilterableTable/index.tsx @@ -18,11 +18,8 @@ */ import _JSONbig from 'json-bigint'; import { useEffect, useRef, useState, useMemo } from 'react'; -import { useSelector } from 'react-redux'; import { getMultipleTextDimensions, styled } from '@superset-ui/core'; import { useDebounceValue } from 'src/hooks/useDebounceValue'; -import { RootState } from 'src/dashboard/types'; -import { findPermission } from 'src/utils/findPermission'; import { useCellContentParser } from './useCellContentParser'; import { renderResultCell } from './utils'; import { Table, TableSize } from '../Table'; @@ -39,11 +36,11 @@ const SCROLL_BAR_HEIGHT = 15; const ONLY_NUMBER_REGEX = /^(NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity))$/; interface StyledFilterableTableProps { - canExportData?: boolean; + disableTextSelection?: boolean; } const StyledFilterableTable = styled.div` - ${({ theme, canExportData }) => ` + ${({ theme, disableTextSelection }) => ` height: 100%; overflow: hidden; @@ -57,7 +54,7 @@ const StyledFilterableTable = styled.div` min-width: 0px; align-self: center; font-size: ${theme.typography.sizes.s}px; - user-select: ${canExportData ? 'auto' : 'none'}; + user-select: ${disableTextSelection ? 'auto' : 'none'}; } .even-row { @@ -91,6 +88,7 @@ export interface FilterableTableProps { striped?: boolean; expandedColumns?: string[]; allowHTML?: boolean; + disableTextSelection?: boolean; } const FilterableTable = ({ @@ -100,6 +98,7 @@ const FilterableTable = ({ filterText = '', expandedColumns = [], allowHTML = true, + disableTextSelection, }: FilterableTableProps) => { const formatTableData = (data: Record[]): Datum[] => data.map(row => { @@ -257,16 +256,12 @@ const FilterableTable = ({ }), })); - const canExportData = useSelector((state: RootState) => - findPermission('can_export_csv', 'SQLLab', state.user?.roles), - ); - return ( {fitted && (
Date: Mon, 9 Sep 2024 15:59:22 +1200 Subject: [PATCH 15/26] move state query to DashboardBuilder --- .../src/chart/models/ChartProps.ts | 16 ++++++++-------- .../src/plugin/transformProps.ts | 4 ++-- .../plugin-chart-table/src/transformProps.ts | 4 ++-- superset-frontend/src/components/Chart/Chart.jsx | 7 +------ .../DashboardBuilder/DashboardBuilder.tsx | 5 +++++ .../dashboard/containers/DashboardComponent.jsx | 2 ++ 6 files changed, 20 insertions(+), 18 deletions(-) diff --git a/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts b/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts index d5782177d349..3691f68e0899 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts +++ b/superset-frontend/packages/superset-ui-core/src/chart/models/ChartProps.ts @@ -105,8 +105,8 @@ export interface ChartPropsConfig { inputRef?: RefObject; /** Theme object */ theme: SupersetTheme; - /** Set chart data selectable by user */ - dataSelectionMode?: string; + /** User able to export data */ + canExportData?: string; } const DEFAULT_WIDTH = 800; @@ -157,7 +157,7 @@ export default class ChartProps { theme: SupersetTheme; - dataSelectionMode?: string; + canExportData?: string; constructor(config: ChartPropsConfig & { formData?: FormData } = {}) { const { @@ -180,7 +180,7 @@ export default class ChartProps { inContextMenu = false, emitCrossFilters = false, theme, - dataSelectionMode, + canExportData, } = config; this.width = width; this.height = height; @@ -203,7 +203,7 @@ export default class ChartProps { this.inContextMenu = inContextMenu; this.emitCrossFilters = emitCrossFilters; this.theme = theme; - this.dataSelectionMode = dataSelectionMode; + this.canExportData = canExportData; } } @@ -229,7 +229,7 @@ ChartProps.createSelector = function create(): ChartPropsSelector { input => input.inContextMenu, input => input.emitCrossFilters, input => input.theme, - input => input.dataSelectionMode, + input => input.canExportData, ( annotationData, datasource, @@ -250,7 +250,7 @@ ChartProps.createSelector = function create(): ChartPropsSelector { inContextMenu, emitCrossFilters, theme, - dataSelectionMode, + canExportData, ) => new ChartProps({ annotationData, @@ -272,7 +272,7 @@ ChartProps.createSelector = function create(): ChartPropsSelector { inContextMenu, emitCrossFilters, theme, - dataSelectionMode, + canExportData, }), ); }; diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts index 6fefbf04627e..ae059eba3783 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/plugin/transformProps.ts @@ -81,7 +81,7 @@ export default function transformProps(chartProps: ChartProps) { filterState, datasource: { verboseMap = {}, columnFormats = {}, currencyFormats = {} }, emitCrossFilters, - dataSelectionMode, + canExportData, } = chartProps; const { data, colnames, coltypes } = queriesData[0]; const { @@ -177,6 +177,6 @@ export default function transformProps(chartProps: ChartProps) { onContextMenu, timeGrainSqla, allowRenderHtml, - dataSelectionMode, + dataSelectionMode: canExportData ? 'auto' : 'none', }; } diff --git a/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts b/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts index 49a9017545e0..b27270ba63c3 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts @@ -455,7 +455,7 @@ const transformProps = ( onContextMenu, }, emitCrossFilters, - dataSelectionMode, + canExportData, } = chartProps; const { @@ -707,7 +707,7 @@ const transformProps = ( basicColorFormatters, startDateOffset, basicColorColumnFormatters, - dataSelectionMode: dataSelectionMode ?? 'auto', + dataSelectionMode: canExportData ? 'auto' : 'none', }; }; diff --git a/superset-frontend/src/components/Chart/Chart.jsx b/superset-frontend/src/components/Chart/Chart.jsx index 6d28050d1b31..8fdb4371f71e 100644 --- a/superset-frontend/src/components/Chart/Chart.jsx +++ b/superset-frontend/src/components/Chart/Chart.jsx @@ -158,11 +158,6 @@ class Chart extends PureComponent { super(props); this.handleRenderContainerFailure = this.handleRenderContainerFailure.bind(this); - this.canExportData = findPermission( - 'can_csv', - 'Superset', - this.props.user?.roles, - ); } componentDidMount() { @@ -278,7 +273,7 @@ class Chart extends PureComponent { {...this.props} source={this.props.dashboardId ? 'dashboard' : 'explore'} data-test={this.props.vizType} - dataSelectionMode={this.canExportData ? 'auto' : 'none'} + canExportData={this.props.canExportData} /> ) : ( diff --git a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx index 03d993288f4f..6b4cd0190c92 100644 --- a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx +++ b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx @@ -81,6 +81,7 @@ import { getRootLevelTabsComponent, shouldFocusTabs } from './utils'; import DashboardContainer from './DashboardContainer'; import { useNativeFilters } from './state'; import DashboardWrapper from './DashboardWrapper'; +import { findPermission } from 'src/utils/findPermission'; type DashboardBuilderProps = {}; @@ -402,6 +403,9 @@ const DashboardBuilder: FC = () => { ? dashboardInfo.filterBarOrientation : FilterBarOrientation.Vertical, ); + const canExportData = useSelector( + state => findPermission('can_csv', 'Superset', state.user?.roles), + ); const handleChangeTab = useCallback( ({ pathToTabIndex }: { pathToTabIndex: string[] }) => { @@ -555,6 +559,7 @@ const DashboardBuilder: FC = () => { renderTabContent={false} renderHoverMenu={false} onChangeTab={handleChangeTab} + canExportData={canExportData} /> )} diff --git a/superset-frontend/src/dashboard/containers/DashboardComponent.jsx b/superset-frontend/src/dashboard/containers/DashboardComponent.jsx index bf92c5dcecae..cfdb5949ceba 100644 --- a/superset-frontend/src/dashboard/containers/DashboardComponent.jsx +++ b/superset-frontend/src/dashboard/containers/DashboardComponent.jsx @@ -58,6 +58,7 @@ const propTypes = { directPathLastUpdated: PropTypes.number, dashboardId: PropTypes.number.isRequired, isComponentVisible: PropTypes.bool, + canExportData: PropTypes.bool, }; const defaultProps = { @@ -80,6 +81,7 @@ function mapStateToProps( dashboardId: dashboardInfo.id, dashboardInfo, fullSizeChartId: dashboardState.fullSizeChartId, + canExportData: dashboardState.canExportData, }; // rows and columns need more data about their child dimensions From b71fcd3d0eebb75bb84160be7a65e961bb79910f Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Mon, 9 Sep 2024 16:38:17 +1200 Subject: [PATCH 16/26] revert redundant changes to filt table test --- .../FilterableTable/FilterableTable.test.tsx | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx b/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx index de4c6f0eabe6..27df8a1539ab 100644 --- a/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx +++ b/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx @@ -20,8 +20,6 @@ import { isValidElement } from 'react'; import FilterableTable from 'src/components/FilterableTable'; import { render, screen, within } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; -import { Provider } from 'react-redux'; -import configureStore from 'redux-mock-store'; describe('FilterableTable', () => { const mockedProps = { @@ -33,18 +31,12 @@ describe('FilterableTable', () => { ], height: 500, }; - const initialState = { state: { user : {role : 'test'}} }; - const mockStore = configureStore(); - let store; it('is valid element', () => { expect(isValidElement()).toBe(true); }); it('renders a grid with 3 Table rows', () => { - store = mockStore(initialState); const { getByRole, getByText } = render( - - , ); expect(getByRole('table')).toBeInTheDocument(); mockedProps.data.forEach(({ b: columnBContent }) => { @@ -56,11 +48,8 @@ describe('FilterableTable', () => { ...mockedProps, filterText: 'b1', }; - store = mockStore(initialState); const { getByText, queryByText } = render( - - , ); expect(getByText(props.filterText)).toBeInTheDocument(); expect(queryByText('b2')).toBeFalsy(); @@ -71,11 +60,8 @@ describe('FilterableTable', () => { ...mockedProps, filterText: '100', }; - store = mockStore(initialState); const { getByText, queryByText } = render( - - , ); expect(getByText('b2')).toBeInTheDocument(); expect(queryByText('b1')).toBeFalsy(); @@ -85,8 +71,6 @@ describe('FilterableTable', () => { describe('FilterableTable sorting - RTL', () => { const initialState = { state: { user : {role : 'test'}} }; - const mockStore = configureStore(); - let store; it('sorts strings correctly', () => { const stringProps = { orderedColumnKeys: ['columnA'], @@ -97,11 +81,8 @@ describe('FilterableTable sorting - RTL', () => { ], height: 500, }; - store = mockStore(initialState); render( - - , ); const stringColumn = within(screen.getByRole('table')) @@ -148,11 +129,8 @@ describe('FilterableTable sorting - RTL', () => { data: [{ columnB: 21 }, { columnB: 0 }, { columnB: 623 }], height: 500, }; - store = mockStore(initialState); render( - - , ); const integerColumn = within(screen.getByRole('table')) @@ -188,12 +166,8 @@ describe('FilterableTable sorting - RTL', () => { data: [{ columnC: 45.67 }, { columnC: 1.23 }, { columnC: 89.0000001 }], height: 500, }; - mockStore(initialState); - store = mockStore(initialState); render( - - , ); const floatColumn = within(screen.getByRole('table')) @@ -249,11 +223,8 @@ describe('FilterableTable sorting - RTL', () => { ], height: 500, }; - store = mockStore(initialState); render( - - , ); const mixedFloatColumn = within(screen.getByRole('table')) @@ -352,11 +323,8 @@ describe('FilterableTable sorting - RTL', () => { ], height: 500, }; - store = mockStore(initialState); render( - - , ); const dsColumn = within(screen.getByRole('table')) From e52fe258c3def29f524b9251d11d279df093c402 Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Mon, 9 Sep 2024 17:09:05 +1200 Subject: [PATCH 17/26] ammend transform props test --- .../plugin-chart-pivot-table/test/plugin/transformProps.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/transformProps.test.ts index c639140abe1f..ee4bba9c4374 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/transformProps.test.ts +++ b/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/transformProps.test.ts @@ -93,6 +93,7 @@ describe('PivotTableChart transformProps', () => { columnFormats: {}, currencyFormats: {}, currencyFormat: { symbol: 'USD', symbolPosition: 'prefix' }, + dataSelectionMode: 'none', }); }); }); From c734c4c0d65bf7017d48ec9feb095f80116893dd Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Mon, 9 Sep 2024 17:15:12 +1200 Subject: [PATCH 18/26] remove unneeded import --- superset-frontend/src/components/Chart/Chart.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/superset-frontend/src/components/Chart/Chart.jsx b/superset-frontend/src/components/Chart/Chart.jsx index 8fdb4371f71e..ca509e62d5a0 100644 --- a/superset-frontend/src/components/Chart/Chart.jsx +++ b/superset-frontend/src/components/Chart/Chart.jsx @@ -36,7 +36,6 @@ import { getUrlParam } from 'src/utils/urlUtils'; import { isCurrentUserBot } from 'src/utils/isBot'; import { ChartSource } from 'src/types/ChartSource'; import { ResourceStatus } from 'src/hooks/apiResources/apiResources'; -import { findPermission } from 'src/utils/findPermission'; import ChartRenderer from './ChartRenderer'; import { ChartErrorMessage } from './ChartErrorMessage'; import { getChartRequiredFieldsMissingMessage } from '../../utils/getChartRequiredFieldsMissingMessage'; From 8920bcf91884c1cfddd2b900fe2d8e2b4db36cbb Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Tue, 10 Sep 2024 14:22:37 +1200 Subject: [PATCH 19/26] access state from explorechartpanel --- superset-frontend/src/components/Chart/Chart.jsx | 4 ++-- .../src/components/Chart/ChartContainer.jsx | 8 +------- .../src/explore/components/ExploreChartPanel/index.jsx | 9 ++++++++- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/superset-frontend/src/components/Chart/Chart.jsx b/superset-frontend/src/components/Chart/Chart.jsx index ca509e62d5a0..23caec37060a 100644 --- a/superset-frontend/src/components/Chart/Chart.jsx +++ b/superset-frontend/src/components/Chart/Chart.jsx @@ -82,7 +82,7 @@ const propTypes = { datasetsStatus: PropTypes.oneOf(['loading', 'error', 'complete']), isInView: PropTypes.bool, emitCrossFilters: PropTypes.bool, - user: PropTypes.object, + canExportData: PropTypes.bool, }; const BLANK = {}; @@ -272,7 +272,7 @@ class Chart extends PureComponent { {...this.props} source={this.props.dashboardId ? 'dashboard' : 'explore'} data-test={this.props.vizType} - canExportData={this.props.canExportData} + dataSelectionMode={this.props.canExportData ? 'auto' : none} /> ) : ( diff --git a/superset-frontend/src/components/Chart/ChartContainer.jsx b/superset-frontend/src/components/Chart/ChartContainer.jsx index a358ba03f435..50c036c28db3 100644 --- a/superset-frontend/src/components/Chart/ChartContainer.jsx +++ b/superset-frontend/src/components/Chart/ChartContainer.jsx @@ -24,12 +24,6 @@ import { logEvent } from '../../logger/actions'; import Chart from './Chart'; import { updateDataMask } from '../../dataMask/actions'; -function mapStateToProps(state) { - return { - user: state.user, - }; -} - function mapDispatchToProps(dispatch) { return { actions: bindActionCreators( @@ -43,4 +37,4 @@ function mapDispatchToProps(dispatch) { }; } -export default connect(mapStateToProps, mapDispatchToProps)(Chart); +export default connect(null, mapDispatchToProps)(Chart); diff --git a/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx b/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx index 189177019c70..2d6367eb5f83 100644 --- a/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx +++ b/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { useState, useEffect, useCallback, useMemo } from 'react'; +import { useState, useEffect, useCallback, useMemo, useSelector } from 'react'; import PropTypes from 'prop-types'; import Split from 'react-split'; import { @@ -47,6 +47,7 @@ import { DataTablesPane } from '../DataTablesPane'; import { ChartPills } from '../ChartPills'; import { ExploreAlert } from '../ExploreAlert'; import useResizeDetectorByObserver from './useResizeDetectorByObserver'; +import { findPermission } from 'src/utils/findPermission'; const propTypes = { actions: PropTypes.object.isRequired, @@ -71,6 +72,7 @@ const propTypes = { chart: chartPropShape, errorMessage: PropTypes.node, triggerRender: PropTypes.bool, + canExportData: PropTypes.bool, }; const GUTTER_SIZE_FACTOR = 1.25; @@ -237,6 +239,10 @@ const ExploreChartPanel = ({ setShowSplit(isOpen); }, []); + const canExportData = useSelector( + state => findPermission('can_csv', 'Superset', state.user?.roles), + ); + const renderChart = useCallback( () => (
)}
From b101378c9eabc9f2ee5e4a7c2f6074f36e8bac4b Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Wed, 11 Sep 2024 11:07:37 +1200 Subject: [PATCH 20/26] correct chart props --- superset-frontend/src/components/Chart/Chart.jsx | 2 +- superset-frontend/src/components/Chart/ChartRenderer.jsx | 6 +++--- .../src/explore/components/ExploreChartPanel/index.jsx | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/superset-frontend/src/components/Chart/Chart.jsx b/superset-frontend/src/components/Chart/Chart.jsx index 23caec37060a..cb30ff5aed49 100644 --- a/superset-frontend/src/components/Chart/Chart.jsx +++ b/superset-frontend/src/components/Chart/Chart.jsx @@ -272,7 +272,7 @@ class Chart extends PureComponent { {...this.props} source={this.props.dashboardId ? 'dashboard' : 'explore'} data-test={this.props.vizType} - dataSelectionMode={this.props.canExportData ? 'auto' : none} + canExportData={this.props.canExportData} /> ) : ( diff --git a/superset-frontend/src/components/Chart/ChartRenderer.jsx b/superset-frontend/src/components/Chart/ChartRenderer.jsx index 48c1c5e44d31..91395ee7ec33 100644 --- a/superset-frontend/src/components/Chart/ChartRenderer.jsx +++ b/superset-frontend/src/components/Chart/ChartRenderer.jsx @@ -62,7 +62,7 @@ const propTypes = { postTransformProps: PropTypes.func, source: PropTypes.oneOf([ChartSource.Dashboard, ChartSource.Explore]), emitCrossFilters: PropTypes.bool, - dataSelectionMode: PropTypes.string, + canExportData: PropTypes.bool, }; const BLANK = {}; @@ -264,7 +264,7 @@ class ChartRenderer extends Component { formData, latestQueryFormData, postTransformProps, - dataSelectionMode, + canExportData, } = this.props; const currentFormData = @@ -363,7 +363,7 @@ class ChartRenderer extends Component { postTransformProps={postTransformProps} emitCrossFilters={emitCrossFilters} legendState={this.state.legendState} - dataSelectionMode={dataSelectionMode} + canExportData={canExportData} {...drillToDetailProps} /> diff --git a/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx b/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx index 2d6367eb5f83..41cc852384b9 100644 --- a/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx +++ b/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx @@ -16,7 +16,8 @@ * specific language governing permissions and limitations * under the License. */ -import { useState, useEffect, useCallback, useMemo, useSelector } from 'react'; +import { useState, useEffect, useCallback, useMemo} from 'react'; +import { useSelector } from 'react-redux'; import PropTypes from 'prop-types'; import Split from 'react-split'; import { From 1651a738b1459484c18f057ce1efb5202a6b9267 Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Wed, 11 Sep 2024 12:20:16 +1200 Subject: [PATCH 21/26] remove canExportData from DashboardBuilder and component, pass in from gridConponents/chart --- .../components/DashboardBuilder/DashboardBuilder.tsx | 5 ----- .../src/dashboard/components/gridComponents/Chart.jsx | 1 + .../src/dashboard/containers/DashboardComponent.jsx | 2 -- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx index 6b4cd0190c92..03d993288f4f 100644 --- a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx +++ b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardBuilder.tsx @@ -81,7 +81,6 @@ import { getRootLevelTabsComponent, shouldFocusTabs } from './utils'; import DashboardContainer from './DashboardContainer'; import { useNativeFilters } from './state'; import DashboardWrapper from './DashboardWrapper'; -import { findPermission } from 'src/utils/findPermission'; type DashboardBuilderProps = {}; @@ -403,9 +402,6 @@ const DashboardBuilder: FC = () => { ? dashboardInfo.filterBarOrientation : FilterBarOrientation.Vertical, ); - const canExportData = useSelector( - state => findPermission('can_csv', 'Superset', state.user?.roles), - ); const handleChangeTab = useCallback( ({ pathToTabIndex }: { pathToTabIndex: string[] }) => { @@ -559,7 +555,6 @@ const DashboardBuilder: FC = () => { renderTabContent={false} renderHoverMenu={false} onChangeTab={handleChangeTab} - canExportData={canExportData} /> )} diff --git a/superset-frontend/src/dashboard/components/gridComponents/Chart.jsx b/superset-frontend/src/dashboard/components/gridComponents/Chart.jsx index 6b79d3182654..0379120855bd 100644 --- a/superset-frontend/src/dashboard/components/gridComponents/Chart.jsx +++ b/superset-frontend/src/dashboard/components/gridComponents/Chart.jsx @@ -528,6 +528,7 @@ class Chart extends Component { datasetsStatus={datasetsStatus} isInView={isInView} emitCrossFilters={emitCrossFilters} + canExportData={supersetCanCSV} /> diff --git a/superset-frontend/src/dashboard/containers/DashboardComponent.jsx b/superset-frontend/src/dashboard/containers/DashboardComponent.jsx index cfdb5949ceba..bf92c5dcecae 100644 --- a/superset-frontend/src/dashboard/containers/DashboardComponent.jsx +++ b/superset-frontend/src/dashboard/containers/DashboardComponent.jsx @@ -58,7 +58,6 @@ const propTypes = { directPathLastUpdated: PropTypes.number, dashboardId: PropTypes.number.isRequired, isComponentVisible: PropTypes.bool, - canExportData: PropTypes.bool, }; const defaultProps = { @@ -81,7 +80,6 @@ function mapStateToProps( dashboardId: dashboardInfo.id, dashboardInfo, fullSizeChartId: dashboardState.fullSizeChartId, - canExportData: dashboardState.canExportData, }; // rows and columns need more data about their child dimensions From 3aefbab463c4b3633e7b5fd4c8fae87eb961cd6f Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Wed, 11 Sep 2024 13:14:48 +1200 Subject: [PATCH 22/26] run prettier --- .../src/SqlLab/components/ResultSet/index.tsx | 7 +--- .../FilterableTable/FilterableTable.test.tsx | 32 ++++++------------- .../components/ExploreChartPanel/index.jsx | 6 ++-- 3 files changed, 13 insertions(+), 32 deletions(-) diff --git a/superset-frontend/src/SqlLab/components/ResultSet/index.tsx b/superset-frontend/src/SqlLab/components/ResultSet/index.tsx index aeef52b8ed10..1eff5b191689 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet/index.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet/index.tsx @@ -84,7 +84,6 @@ import ExploreResultsButton from '../ExploreResultsButton'; import HighlightedSql from '../HighlightedSql'; import QueryStateLabel from '../QueryStateLabel'; - enum LimitingFactor { Query = 'QUERY', QueryAndDropdown = 'QUERY_AND_DROPDOWN', @@ -264,11 +263,7 @@ const ResultSet = ({ setSearchText(event.target.value); }; - const canExportData = findPermission( - 'can_export_csv', - 'SQLLab', - user?.roles, - ); + const canExportData = findPermission('can_export_csv', 'SQLLab', user?.roles); const createExploreResultsOnClick = async (clickEvent: MouseEvent) => { const { results } = query; diff --git a/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx b/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx index 27df8a1539ab..07dd72d93b2d 100644 --- a/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx +++ b/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx @@ -36,7 +36,7 @@ describe('FilterableTable', () => { }); it('renders a grid with 3 Table rows', () => { const { getByRole, getByText } = render( - + , ); expect(getByRole('table')).toBeInTheDocument(); mockedProps.data.forEach(({ b: columnBContent }) => { @@ -48,9 +48,7 @@ describe('FilterableTable', () => { ...mockedProps, filterText: 'b1', }; - const { getByText, queryByText } = render( - - ); + const { getByText, queryByText } = render(); expect(getByText(props.filterText)).toBeInTheDocument(); expect(queryByText('b2')).toBeFalsy(); expect(queryByText('b3')).toBeFalsy(); @@ -60,9 +58,7 @@ describe('FilterableTable', () => { ...mockedProps, filterText: '100', }; - const { getByText, queryByText } = render( - - ); + const { getByText, queryByText } = render(); expect(getByText('b2')).toBeInTheDocument(); expect(queryByText('b1')).toBeFalsy(); expect(queryByText('b3')).toBeFalsy(); @@ -70,7 +66,7 @@ describe('FilterableTable', () => { }); describe('FilterableTable sorting - RTL', () => { - const initialState = { state: { user : {role : 'test'}} }; + const initialState = { state: { user: { role: 'test' } } }; it('sorts strings correctly', () => { const stringProps = { orderedColumnKeys: ['columnA'], @@ -81,9 +77,7 @@ describe('FilterableTable sorting - RTL', () => { ], height: 500, }; - render( - - ); + render(); const stringColumn = within(screen.getByRole('table')) .getByText('columnA') @@ -129,9 +123,7 @@ describe('FilterableTable sorting - RTL', () => { data: [{ columnB: 21 }, { columnB: 0 }, { columnB: 623 }], height: 500, }; - render( - - ); + render(); const integerColumn = within(screen.getByRole('table')) .getByText('columnB') @@ -166,9 +158,7 @@ describe('FilterableTable sorting - RTL', () => { data: [{ columnC: 45.67 }, { columnC: 1.23 }, { columnC: 89.0000001 }], height: 500, }; - render( - - ); + render(); const floatColumn = within(screen.getByRole('table')) .getByText('columnC') @@ -223,9 +213,7 @@ describe('FilterableTable sorting - RTL', () => { ], height: 500, }; - render( - - ); + render(); const mixedFloatColumn = within(screen.getByRole('table')) .getByText('columnD') @@ -323,9 +311,7 @@ describe('FilterableTable sorting - RTL', () => { ], height: 500, }; - render( - - ); + render(); const dsColumn = within(screen.getByRole('table')) .getByText('columnDS') diff --git a/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx b/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx index 41cc852384b9..6fc22500ccd5 100644 --- a/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx +++ b/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { useState, useEffect, useCallback, useMemo} from 'react'; +import { useState, useEffect, useCallback, useMemo } from 'react'; import { useSelector } from 'react-redux'; import PropTypes from 'prop-types'; import Split from 'react-split'; @@ -240,8 +240,8 @@ const ExploreChartPanel = ({ setShowSplit(isOpen); }, []); - const canExportData = useSelector( - state => findPermission('can_csv', 'Superset', state.user?.roles), + const canExportData = useSelector(state => + findPermission('can_csv', 'Superset', state.user?.roles), ); const renderChart = useCallback( From 8e95100ff387287194070aa5ae11df46069245ab Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Wed, 11 Sep 2024 13:27:09 +1200 Subject: [PATCH 23/26] remove unneeded test change --- .../plugin-chart-pivot-table/test/plugin/buildQuery.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts b/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts index 5d7ac7a0a663..3bf887c0b60f 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts +++ b/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts @@ -54,7 +54,6 @@ const formData: PivotTableQueryFormData = { time_grain_sqla: TimeGranularity.MONTH, temporal_columns_lookup: { col1: true }, currencyFormat: { symbol: 'USD', symbolPosition: 'prefix' }, - dataSelectionMode: 'auto', }; test('should build groupby with series in form data', () => { From 8f3ac01d1d780a1a5742da12dc889561b65b325a Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Wed, 11 Sep 2024 13:43:13 +1200 Subject: [PATCH 24/26] remove redundant filt table test var --- .../src/components/FilterableTable/FilterableTable.test.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx b/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx index 07dd72d93b2d..415d7f053dfc 100644 --- a/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx +++ b/superset-frontend/src/components/FilterableTable/FilterableTable.test.tsx @@ -66,7 +66,6 @@ describe('FilterableTable', () => { }); describe('FilterableTable sorting - RTL', () => { - const initialState = { state: { user: { role: 'test' } } }; it('sorts strings correctly', () => { const stringProps = { orderedColumnKeys: ['columnA'], From e7e8710d7e870a8b6effaf9f735adc461c51654d Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Tue, 24 Sep 2024 16:20:29 +1200 Subject: [PATCH 25/26] update buildQuery test with DataSelectionMode --- .../plugin-chart-pivot-table/test/plugin/buildQuery.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts b/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts index 3bf887c0b60f..5d7ac7a0a663 100644 --- a/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts +++ b/superset-frontend/plugins/plugin-chart-pivot-table/test/plugin/buildQuery.test.ts @@ -54,6 +54,7 @@ const formData: PivotTableQueryFormData = { time_grain_sqla: TimeGranularity.MONTH, temporal_columns_lookup: { col1: true }, currencyFormat: { symbol: 'USD', symbolPosition: 'prefix' }, + dataSelectionMode: 'auto', }; test('should build groupby with series in form data', () => { From abe05189537688013b836b574f711d27d9e084ff Mon Sep 17 00:00:00 2001 From: Mial Lewis Date: Wed, 2 Oct 2024 18:35:05 +1300 Subject: [PATCH 26/26] correct import order --- .../src/explore/components/ExploreChartPanel/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx b/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx index 6fc22500ccd5..60c63313cfd3 100644 --- a/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx +++ b/superset-frontend/src/explore/components/ExploreChartPanel/index.jsx @@ -44,11 +44,11 @@ import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal'; import { getDatasourceAsSaveableDataset } from 'src/utils/datasourceUtils'; import { buildV1ChartDataPayload } from 'src/explore/exploreUtils'; import { getChartRequiredFieldsMissingMessage } from 'src/utils/getChartRequiredFieldsMissingMessage'; +import { findPermission } from 'src/utils/findPermission'; import { DataTablesPane } from '../DataTablesPane'; import { ChartPills } from '../ChartPills'; import { ExploreAlert } from '../ExploreAlert'; import useResizeDetectorByObserver from './useResizeDetectorByObserver'; -import { findPermission } from 'src/utils/findPermission'; const propTypes = { actions: PropTypes.object.isRequired,