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 3d0665183c fix: Table time comparison breaking after form data update
(#29525)
3d0665183c is described below
commit 3d0665183cac3d60b492c680774c197ea64d25e7
Author: Kamil Gabryjelski <[email protected]>
AuthorDate: Tue Jul 9 14:42:11 2024 +0200
fix: Table time comparison breaking after form data update (#29525)
---
.../src/sections/timeComparison.tsx | 2 +-
.../superset-ui-chart-controls/src/types.ts | 3 ++
.../components/ControlPanelsContainer.test.tsx | 56 ++++++++++++++++++++++
.../explore/components/ControlPanelsContainer.tsx | 10 +++-
.../explore/components/DatasourcePanel/index.tsx | 3 +-
5 files changed, 70 insertions(+), 4 deletions(-)
diff --git
a/superset-frontend/packages/superset-ui-chart-controls/src/sections/timeComparison.tsx
b/superset-frontend/packages/superset-ui-chart-controls/src/sections/timeComparison.tsx
index 86c7eb9f9d..17239de87f 100644
---
a/superset-frontend/packages/superset-ui-chart-controls/src/sections/timeComparison.tsx
+++
b/superset-frontend/packages/superset-ui-chart-controls/src/sections/timeComparison.tsx
@@ -118,7 +118,7 @@ export const timeComparisonControls: ({
'difference between the main time series and each time shift; ' +
'as the percentage change; or as the ratio between series and
time shifts.',
),
- visibility: () => Boolean(showCalculationType),
+ hidden: () => Boolean(showCalculationType),
},
},
],
diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/types.ts
b/superset-frontend/packages/superset-ui-chart-controls/src/types.ts
index 900c9d5442..d4170be17c 100644
--- a/superset-frontend/packages/superset-ui-chart-controls/src/types.ts
+++ b/superset-frontend/packages/superset-ui-chart-controls/src/types.ts
@@ -258,6 +258,9 @@ export interface BaseControlConfig<
props: ControlPanelsContainerProps,
controlData: AnyDict,
) => boolean;
+ hidden?:
+ | boolean
+ | ((props: ControlPanelsContainerProps, controlData: AnyDict) => boolean);
}
export interface ControlValueValidator<
diff --git
a/superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx
b/superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx
index 20c71243d2..04f1f41309 100644
--- a/superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx
+++ b/superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx
@@ -203,4 +203,60 @@ describe('ControlPanelsContainer', () => {
'percent_metrics',
);
});
+
+ test('hidden state of controls is correctly applied', async () => {
+ getChartControlPanelRegistry().registerValue('table', {
+ controlPanelSections: [
+ {
+ label: t('Time Comparison'),
+ expanded: true,
+ controlSetRows: [
+ [
+ {
+ name: 'time_compare',
+ config: {
+ type: 'SelectControl',
+ freeForm: true,
+ label: t('Time shift'),
+ choices: [],
+ },
+ },
+ ],
+ [
+ {
+ name: 'start_date_offset',
+ config: {
+ type: 'SelectControl',
+ choices: [],
+ label: t('Shift start date'),
+ hidden: true,
+ },
+ },
+ ],
+ [
+ {
+ name: 'comparison_type',
+ config: {
+ type: 'SelectControl',
+ label: t('Calculation type'),
+ default: 'values',
+ choices: [],
+ hidden: () => true,
+ },
+ },
+ ],
+ ],
+ },
+ ],
+ });
+ render(<ControlPanelsContainer {...getDefaultProps()} />, {
+ useRedux: true,
+ });
+
+ expect(screen.getByText('Time shift')).toBeInTheDocument();
+ expect(screen.getByText('Shift start date')).toBeInTheDocument();
+ expect(screen.getByText('Calculation type')).toBeInTheDocument();
+ expect(screen.getByText('Shift start date')).not.toBeVisible();
+ expect(screen.getByText('Calculation type')).not.toBeVisible();
+ });
});
diff --git
a/superset-frontend/src/explore/components/ControlPanelsContainer.tsx
b/superset-frontend/src/explore/components/ControlPanelsContainer.tsx
index 99a004faaa..27bf09d79d 100644
--- a/superset-frontend/src/explore/components/ControlPanelsContainer.tsx
+++ b/superset-frontend/src/explore/components/ControlPanelsContainer.tsx
@@ -448,13 +448,13 @@ export const ControlPanelsContainer = (props:
ControlPanelsContainerProps) => {
const renderControl = ({ name, config }: CustomControlItem) => {
const { controls, chart, exploreState } = props;
- const { visibility } = config;
+ const { visibility, hidden, ...restConfig } = config;
// If the control item is not an object, we have to look up the control
data from
// the centralized controls file.
// When it is an object we read control data straight from `config` instead
const controlData = {
- ...config,
+ ...restConfig,
...controls[name],
...(shouldRecalculateControlState({ name, config })
? config?.mapStateToProps?.(exploreState, controls[name], chart)
@@ -476,6 +476,11 @@ export const ControlPanelsContainer = (props:
ControlPanelsContainerProps) => {
? visibility.call(config, props, controlData)
: undefined;
+ const isHidden =
+ typeof hidden === 'function'
+ ? hidden.call(config, props, controlData)
+ : hidden;
+
const label =
typeof baseLabel === 'function'
? baseLabel(exploreState, controls[name], chart)
@@ -536,6 +541,7 @@ export const ControlPanelsContainer = (props:
ControlPanelsContainerProps) => {
validationErrors={validationErrors}
actions={props.actions}
isVisible={isVisible}
+ hidden={isHidden}
{...restProps}
/>
</StashFormDataContainer>
diff --git a/superset-frontend/src/explore/components/DatasourcePanel/index.tsx
b/superset-frontend/src/explore/components/DatasourcePanel/index.tsx
index 073a1a0b71..3626deb247 100644
--- a/superset-frontend/src/explore/components/DatasourcePanel/index.tsx
+++ b/superset-frontend/src/explore/components/DatasourcePanel/index.tsx
@@ -50,7 +50,7 @@ import { DndItemType } from '../DndItemType';
import { DndItemValue } from './types';
import { DropzoneContext } from '../ExploreContainer';
-interface DatasourceControl extends ControlConfig {
+interface DatasourceControl extends Omit<ControlConfig, 'hidden'> {
datasource?: IDatasource;
}
export interface IDatasource {
@@ -389,6 +389,7 @@ export default function DataSourcePanel({
formData={formData}
/>
)}
+ {/* @ts-ignore */}
<Control {...datasourceControl} name="datasource" actions={actions} />
{datasource.id != null && mainBody}
</DatasourceContainer>