This is an automated email from the ASF dual-hosted git repository.
maximebeauchemin pushed a commit to branch template_less
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/template_less by this push:
new 971715931b refactor(form): Migrate Form component to Ant Design 5
(#32729)
971715931b is described below
commit 971715931b586b34b68a2eb19d3e88ab4e393900
Author: Mehmet Salih Yavuz <[email protected]>
AuthorDate: Tue Apr 1 19:29:17 2025 +0300
refactor(form): Migrate Form component to Ant Design 5 (#32729)
---
.../e2e/dashboard/horizontalFilterBar.test.ts | 4 +-
.../cypress/e2e/database/modal.test.ts | 4 +-
.../src/components/Datasource/Field.tsx | 2 +-
.../src/components/Flex/Flex.stories.tsx | 86 +++++++++++++++++++++
.../{Form/index.tsx => Flex/Flex.test.tsx} | 17 +++--
.../src/components/{Form => Flex}/index.tsx | 14 ++--
superset-frontend/src/components/Form/Form.tsx | 18 +----
superset-frontend/src/components/Form/FormItem.tsx | 13 ++--
.../src/components/Form/FormLabel.tsx | 34 ++++-----
.../src/components/Form/LabeledErrorBoundInput.tsx | 6 +-
superset-frontend/src/components/Form/index.tsx | 4 +-
superset-frontend/src/components/index.ts | 4 -
.../dashboard/components/PropertiesModal/index.tsx | 10 +--
.../FilterBar/FilterControls/FilterControl.tsx | 25 +++---
.../nativeFilters/FilterBar/Horizontal.tsx | 2 -
.../nativeFilters/FilterBar/Vertical.tsx | 11 ++-
.../FiltersConfigForm/ColumnSelect.tsx | 7 +-
.../FiltersConfigForm/DefaultValue.tsx | 2 +-
.../FiltersConfigForm/FilterScope/FilterScope.tsx | 4 +-
.../__tests__/TreeInitialization.test.tsx | 2 +-
.../FilterScope/__tests__/TreeSelection.test.tsx | 2 +-
.../FilterScope/__tests__/utils.tsx | 8 +-
.../FiltersConfigForm/FiltersConfigForm.tsx | 88 +++++-----------------
.../FiltersConfigForm/getControlItemsMap.test.tsx | 6 +-
.../FiltersConfigForm/getControlItemsMap.tsx | 4 +-
.../FiltersConfigModal/FiltersConfigForm/state.ts | 2 +-
.../FiltersConfigModal/FiltersConfigForm/utils.ts | 2 +-
.../FiltersConfigModal/FiltersConfigModal.tsx | 12 ++-
.../nativeFilters/FiltersConfigModal/utils.ts | 2 +-
.../explore/components/PropertiesModal/index.tsx | 13 ++--
.../LayerConfigsPopoverContent.tsx | 2 +-
.../DatabaseConnectionForm/EncryptedField.tsx | 2 +-
.../DatabaseConnectionForm/TableCatalog.tsx | 2 +-
.../databases/DatabaseModal/SSHTunnelForm.tsx | 4 +-
.../features/databases/UploadDataModel/index.tsx | 16 ++--
.../filters/components/Range/RangeFilterPlugin.tsx | 7 +-
.../components/Select/SelectFilterPlugin.tsx | 7 +-
.../TimeColumn/TimeColumnFilterPlugin.tsx | 12 +--
.../components/TimeGrain/TimeGrainFilterPlugin.tsx | 12 +--
superset-frontend/src/filters/components/common.ts | 7 --
40 files changed, 248 insertions(+), 231 deletions(-)
diff --git
a/superset-frontend/cypress-base/cypress/e2e/dashboard/horizontalFilterBar.test.ts
b/superset-frontend/cypress-base/cypress/e2e/dashboard/horizontalFilterBar.test.ts
index b89e9f8a4b..4fe862b023 100644
---
a/superset-frontend/cypress-base/cypress/e2e/dashboard/horizontalFilterBar.test.ts
+++
b/superset-frontend/cypress-base/cypress/e2e/dashboard/horizontalFilterBar.test.ts
@@ -157,11 +157,11 @@ describe('Horizontal FilterBar', () => {
cy.get('.filter-item-wrapper').should('have.length', 3);
openMoreFilters();
cy.getBySel('form-item-value').should('have.length', 12);
-
cy.getBySel('filter-control-name').contains('test_10').should('be.visible');
+ cy.getBySel('filter-control-name').contains('test_9').should('be.visible');
cy.getBySel('filter-control-name')
.contains('test_12')
.should('not.be.visible');
- cy.get('.antd5-popover-inner').scrollTo('bottom');
+ cy.getBySel('filter-control-name').contains('test_12').scrollIntoView();
cy.getBySel('filter-control-name').contains('test_12').should('be.visible');
});
diff --git a/superset-frontend/cypress-base/cypress/e2e/database/modal.test.ts
b/superset-frontend/cypress-base/cypress/e2e/database/modal.test.ts
index 87a0bb9230..fac22596fc 100644
--- a/superset-frontend/cypress-base/cypress/e2e/database/modal.test.ts
+++ b/superset-frontend/cypress-base/cypress/e2e/database/modal.test.ts
@@ -66,7 +66,7 @@ describe('Add database', () => {
cy.focused().type('badhost', { force: true });
cy.get('input[name="port"]').focus();
cy.focused().type('5432', { force: true });
- cy.get('.ant-form-item-explain-error').contains(
+ cy.get('.antd5-form-item-explain-error').contains(
"The hostname provided can't be resolved",
);
});
@@ -79,6 +79,6 @@ describe('Add database', () => {
cy.get('input[name="port"]').focus();
cy.focused().type('123', { force: true });
cy.get('input[name="database"]').focus();
- cy.get('.ant-form-item-explain-error').contains('The port is closed');
+ cy.get('.antd5-form-item-explain-error').contains('The port is closed');
});
});
diff --git a/superset-frontend/src/components/Datasource/Field.tsx
b/superset-frontend/src/components/Datasource/Field.tsx
index 5478ba0b2b..eeebe61273 100644
--- a/superset-frontend/src/components/Datasource/Field.tsx
+++ b/superset-frontend/src/components/Datasource/Field.tsx
@@ -23,7 +23,7 @@ import { Tooltip } from 'src/components/Tooltip';
import { FormItem, FormLabel } from 'src/components/Form';
const formItemInlineCss = css`
- .ant-form-item-control-input-content {
+ .antd5-form-item-control-input-content {
display: flex;
flex-direction: row;
}
diff --git a/superset-frontend/src/components/Flex/Flex.stories.tsx
b/superset-frontend/src/components/Flex/Flex.stories.tsx
new file mode 100644
index 0000000000..6766df7aa3
--- /dev/null
+++ b/superset-frontend/src/components/Flex/Flex.stories.tsx
@@ -0,0 +1,86 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Flex, FlexProps } from 'src/components/Flex';
+import { css } from '@superset-ui/core';
+
+export default {
+ title: 'Flex',
+ component: Flex,
+};
+
+export const InteractiveFlex = (args: FlexProps) => (
+ <Flex
+ {...args}
+ css={css`
+ width: 100%;
+ height: 90vh;
+ `}
+ >
+ {new Array(20).fill(null).map((_, i) => (
+ <p key={i}>Item</p>
+ ))}
+ </Flex>
+);
+
+InteractiveFlex.args = {
+ vertical: false,
+ wrap: 'nowrap',
+ justify: 'normal',
+ align: 'normal',
+ flex: 'normal',
+ gap: 'small',
+};
+
+InteractiveFlex.argTypes = {
+ vertical: {
+ control: { type: 'boolean' },
+ type: { name: 'boolean', required: false },
+ },
+ wrap: {
+ control: { type: 'select' },
+ options: ['nowrap', 'wrap', 'wrap-reverse', false, true],
+ type: { name: 'string', required: false },
+ },
+ justify: {
+ control: { type: 'select' },
+ options: [
+ 'start',
+ 'center',
+ 'space-between',
+ 'space-around',
+ 'space-evenly',
+ ],
+ type: { name: 'string', required: false },
+ },
+ align: {
+ control: { type: 'select' },
+ options: ['start', 'center', 'end', 'stretch'],
+ type: { name: 'string', required: false },
+ },
+ flex: {
+ control: { type: 'string' },
+ type: { name: 'string', required: false },
+ },
+ gap: {
+ control: { type: 'select' },
+ options: ['small', 'medium', 'large'],
+ type: { name: 'string', required: false },
+ },
+};
diff --git a/superset-frontend/src/components/Form/index.tsx
b/superset-frontend/src/components/Flex/Flex.test.tsx
similarity index 75%
copy from superset-frontend/src/components/Form/index.tsx
copy to superset-frontend/src/components/Flex/Flex.test.tsx
index ec198e0a82..863c3a012c 100644
--- a/superset-frontend/src/components/Form/index.tsx
+++ b/superset-frontend/src/components/Flex/Flex.test.tsx
@@ -16,10 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
-import Form, { FormProps } from './Form';
-import FormItem from './FormItem';
-import FormLabel from './FormLabel';
-import LabeledErrorBoundInput from './LabeledErrorBoundInput';
-export { Form, FormItem, FormLabel, LabeledErrorBoundInput };
-export type { FormProps };
+import { render } from 'spec/helpers/testing-library';
+import { Flex } from 'src/components/Flex';
+
+test('should render', () => {
+ const { container } = render(
+ <Flex>
+ <p>Item</p>
+ </Flex>,
+ );
+ expect(container).toBeInTheDocument();
+});
diff --git a/superset-frontend/src/components/Form/index.tsx
b/superset-frontend/src/components/Flex/index.tsx
similarity index 75%
copy from superset-frontend/src/components/Form/index.tsx
copy to superset-frontend/src/components/Flex/index.tsx
index ec198e0a82..bed64a5949 100644
--- a/superset-frontend/src/components/Form/index.tsx
+++ b/superset-frontend/src/components/Flex/index.tsx
@@ -16,10 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-import Form, { FormProps } from './Form';
-import FormItem from './FormItem';
-import FormLabel from './FormLabel';
-import LabeledErrorBoundInput from './LabeledErrorBoundInput';
-export { Form, FormItem, FormLabel, LabeledErrorBoundInput };
-export type { FormProps };
+import { Flex as AntdFlex } from 'antd-v5';
+import { ComponentProps } from 'react';
+
+export type FlexProps = ComponentProps<typeof AntdFlex>;
+
+export function Flex(props: FlexProps) {
+ return <AntdFlex {...props} />;
+}
diff --git a/superset-frontend/src/components/Form/Form.tsx
b/superset-frontend/src/components/Form/Form.tsx
index b7e9403a4e..dcbcc173a3 100644
--- a/superset-frontend/src/components/Form/Form.tsx
+++ b/superset-frontend/src/components/Form/Form.tsx
@@ -16,21 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-// eslint-disable-next-line no-restricted-imports
-import AntdForm, { FormProps } from 'antd/lib/form'; // TODO: Remove antd
-import { styled } from '@superset-ui/core';
-
-const StyledForm = styled(AntdForm)`
- &.ant-form label {
- font-size: ${({ theme }) => theme.fontSizeSM}px;
- }
- .ant-form-item {
- margin-bottom: ${({ theme }) => theme.sizeUnit * 4}px;
- }
-`;
+import { Form as AntdForm } from 'antd-v5';
+import { FormProps, FormInstance, FormItemProps } from 'antd-v5/es/form';
function Form(props: FormProps) {
- return <StyledForm {...props} />;
+ return <AntdForm {...props} />;
}
export default Object.assign(Form, {
@@ -41,4 +31,4 @@ export default Object.assign(Form, {
Provider: AntdForm.Provider,
});
-export type { FormProps };
+export type { FormProps, FormInstance, FormItemProps };
diff --git a/superset-frontend/src/components/Form/FormItem.tsx
b/superset-frontend/src/components/Form/FormItem.tsx
index 257987cbbe..84bd2b180d 100644
--- a/superset-frontend/src/components/Form/FormItem.tsx
+++ b/superset-frontend/src/components/Form/FormItem.tsx
@@ -16,24 +16,21 @@
* specific language governing permissions and limitations
* under the License.
*/
-// eslint-disable-next-line no-restricted-imports
-import Form from 'antd/lib/form'; // TODO: Remove antd
+import { Form } from 'antd-v5';
import { styled } from '@superset-ui/core';
const StyledItem = styled(Form.Item)`
${({ theme }) => `
- .ant-form-item-label {
- padding-bottom: ${theme.sizeUnit}px;
+ margin-bottom: 0;
+ .antd5-form-item-label {
& > label {
- font-size: ${theme.fontSizeSM}px;
- color: ${theme.colors.grayscale.base};
-
- &.ant-form-item-required:not(.ant-form-item-required-mark-optional) {
+
&.antd5-form-item-required:not(.antd5-form-item-required-mark-optional) {
&::before {
display: none;
}
&::after {
display: inline-block;
+ visibility: visible;
color: ${theme.colorError};
font-size: ${theme.fontSizeSM}px;
content: '*';
diff --git a/superset-frontend/src/components/Form/FormLabel.tsx
b/superset-frontend/src/components/Form/FormLabel.tsx
index e14b56c94b..6e33fb98a6 100644
--- a/superset-frontend/src/components/Form/FormLabel.tsx
+++ b/superset-frontend/src/components/Form/FormLabel.tsx
@@ -26,23 +26,18 @@ export type FormLabelProps = {
className?: string;
};
-const Label = styled.label`
- font-size: ${({ theme }) => theme.fontSizeSM}px;
- color: ${({ theme }) => theme.colors.grayscale.dark2};
- margin-bottom: ${({ theme }) => theme.sizeUnit}px;
-`;
-
-const RequiredLabel = styled.label`
- font-size: ${({ theme }) => theme.fontSizeSM}px;
- color: ${({ theme }) => theme.colors.grayscale.dark2};
- margin-bottom: ${({ theme }) => theme.sizeUnit}px;
- &::after {
- display: inline-block;
- margin-left: ${({ theme }) => theme.sizeUnit}px;
- color: ${({ theme }) => theme.colorError};
- font-size: ${({ theme }) => theme.fontSize}px;
- content: '*';
- }
+const Label = styled.label<{ required?: boolean }>`
+ ${({ required, theme }) =>
+ required &&
+ `
+ &::after {
+ display: inline-block;
+ margin-left: ${theme.sizeUnit}px;
+ color: ${theme.colorError};
+ font-size: ${theme.fontSize}px;
+ content: '*';
+ }
+ `}
`;
export default function FormLabel({
@@ -51,10 +46,9 @@ export default function FormLabel({
required = false,
className,
}: FormLabelProps) {
- const StyledLabel = required ? RequiredLabel : Label;
return (
- <StyledLabel htmlFor={htmlFor} className={className}>
+ <Label htmlFor={htmlFor} className={className} required={required}>
{children}
- </StyledLabel>
+ </Label>
);
}
diff --git a/superset-frontend/src/components/Form/LabeledErrorBoundInput.tsx
b/superset-frontend/src/components/Form/LabeledErrorBoundInput.tsx
index 73ab7ad28c..a4f37676b6 100644
--- a/superset-frontend/src/components/Form/LabeledErrorBoundInput.tsx
+++ b/superset-frontend/src/components/Form/LabeledErrorBoundInput.tsx
@@ -51,11 +51,11 @@ const StyledInputPassword = styled(Input.Password)`
`;
const alertIconStyles = (theme: SupersetTheme, hasError: boolean) => css`
- .ant-form-item-children-icon {
+ .antd5-form-item-children-icon {
display: none;
}
${hasError &&
- `.ant-form-item-control-input-content {
+ `.antd5-form-item-control-input-content {
position: relative;
&:after {
content: ' ';
@@ -79,7 +79,7 @@ const StyledFormGroup = styled('div')`
margin: 0;
}
margin-bottom: ${({ theme }) => theme.sizeUnit * 3}px;
- .ant-form-item {
+ .antd5-form-item {
margin-bottom: 0;
}
`;
diff --git a/superset-frontend/src/components/Form/index.tsx
b/superset-frontend/src/components/Form/index.tsx
index ec198e0a82..7af2de0173 100644
--- a/superset-frontend/src/components/Form/index.tsx
+++ b/superset-frontend/src/components/Form/index.tsx
@@ -16,10 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
-import Form, { FormProps } from './Form';
+import Form, { FormProps, FormItemProps, FormInstance } from './Form';
import FormItem from './FormItem';
import FormLabel from './FormLabel';
import LabeledErrorBoundInput from './LabeledErrorBoundInput';
export { Form, FormItem, FormLabel, LabeledErrorBoundInput };
-export type { FormProps };
+export type { FormProps, FormItemProps, FormInstance };
diff --git a/superset-frontend/src/components/index.ts
b/superset-frontend/src/components/index.ts
index 3858ad83c2..ac130ae926 100644
--- a/superset-frontend/src/components/index.ts
+++ b/superset-frontend/src/components/index.ts
@@ -57,12 +57,8 @@ export {
Breadcrumb as AntdBreadcrumb,
Checkbox as AntdCheckbox,
Collapse as AntdCollapse,
- Form as AntdForm,
Select as AntdSelect,
} from 'antd';
-// Exported types
-// eslint-disable-next-line no-restricted-imports
-export type { FormInstance } from 'antd/lib/form'; // TODO: Remove antd
// eslint-disable-next-line no-restricted-imports
export type { RadioChangeEvent } from 'antd/lib/radio'; // TODO: Remove antd
diff --git
a/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx
b/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx
index 27501b81a7..a2190d9cb9 100644
--- a/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx
+++ b/superset-frontend/src/dashboard/components/PropertiesModal/index.tsx
@@ -19,10 +19,10 @@
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { omit } from 'lodash';
import { Input } from 'src/components/Input';
-import { FormItem } from 'src/components/Form';
+import { Form, FormItem } from 'src/components/Form';
import jsonStringify from 'json-stringify-pretty-compact';
import Button from 'src/components/Button';
-import { AntdForm, AsyncSelect, Col, Row } from 'src/components';
+import { AsyncSelect, Col, Row } from 'src/components';
import rison from 'rison';
import {
ensureIsArray,
@@ -111,7 +111,7 @@ const PropertiesModal = ({
show = false,
}: PropertiesModalProps) => {
const dispatch = useDispatch();
- const [form] = AntdForm.useForm();
+ const [form] = Form.useForm();
const [isLoading, setIsLoading] = useState(false);
const [isAdvancedOpen, setIsAdvancedOpen] = useState(false);
const [colorScheme, setCurrentColorScheme] = useState(currentColorScheme);
@@ -631,7 +631,7 @@ const PropertiesModal = ({
}
responsive
>
- <AntdForm
+ <Form
form={form}
onFinish={onFinish}
data-test="dashboard-edit-properties-form"
@@ -775,7 +775,7 @@ const PropertiesModal = ({
)}
</Col>
</Row>
- </AntdForm>
+ </Form>
</Modal>
);
};
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl.tsx
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl.tsx
index bb81b44dfe..554f1df468 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl.tsx
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl.tsx
@@ -42,7 +42,6 @@ const FilterStyledIcon = styled.div`
const VerticalFilterControlTitle = styled.h4`
font-size: ${({ theme }) => theme.fontSizeSM}px;
color: ${({ theme }) => theme.colorText};
- margin: 0;
overflow-wrap: anywhere;
`;
@@ -78,22 +77,22 @@ const HorizontalOverflowFilterControlTitleBox = styled(
const VerticalFilterControlContainer = styled(Form)`
width: 100%;
- && .ant-form-item-label > label {
+ && .antd5-form-item-label > label {
text-transform: none;
width: 100%;
padding-right: ${({ theme }) => theme.sizeUnit * 11}px;
}
- .ant-form-item-tooltip {
+ .antd5-form-item-tooltip {
margin-bottom: ${({ theme }) => theme.sizeUnit}px;
}
`;
const HorizontalFilterControlContainer = styled(Form)`
- && .ant-form-item-label > label {
+ && .antd5-form-item-label > label {
margin-bottom: 0;
text-transform: none;
}
- .ant-form-item-tooltip {
+ .antd5-form-item-tooltip {
margin-bottom: ${({ theme }) => theme.sizeUnit}px;
}
`;
@@ -101,7 +100,7 @@ const HorizontalFilterControlContainer = styled(Form)`
const HorizontalOverflowFilterControlContainer = styled(
VerticalFilterControlContainer,
)`
- && .ant-form-item-label {
+ && .antd5-form-item-label {
line-height: 1;
& > label {
padding-right: unset;
@@ -110,9 +109,11 @@ const HorizontalOverflowFilterControlContainer = styled(
`;
const VerticalFormItem = styled(StyledFormItem)`
- .ant-form-item-label {
+ .antd5-form-item-label {
overflow: visible;
- label.ant-form-item-required:not(.ant-form-item-required-mark-optional) {
+ label.antd5-form-item-required:not(
+ .antd5-form-item-required-mark-optional
+ ) {
&::after {
display: none;
}
@@ -126,11 +127,13 @@ const HorizontalFormItem = styled(StyledFormItem)`
align-items: center;
}
- .ant-form-item-label {
+ .antd5-form-item-label {
overflow: visible;
padding-bottom: 0;
margin-right: ${({ theme }) => theme.sizeUnit * 2}px;
- label.ant-form-item-required:not(.ant-form-item-required-mark-optional) {
+ label.antd5-form-item-required:not(
+ .antd5-form-item-required-mark-optional
+ ) {
&::after {
display: none;
}
@@ -141,7 +144,7 @@ const HorizontalFormItem = styled(StyledFormItem)`
}
}
- .ant-form-item-control {
+ .antd5-form-item-control {
width: ${({ theme }) => theme.sizeUnit * 41}px;
}
`;
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Horizontal.tsx
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Horizontal.tsx
index 8e3906a114..b4eb572a7a 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Horizontal.tsx
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Horizontal.tsx
@@ -47,8 +47,6 @@ const HorizontalBarContent = styled.div`
flex-wrap: nowrap;
align-items: center;
justify-content: flex-start;
- line-height: 0;
-
.loading {
margin: ${theme.sizeUnit * 2}px auto ${theme.sizeUnit * 2}px;
padding: 0;
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx
index d659d7d2c1..2b334a0bad 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx
@@ -103,9 +103,14 @@ const FilterBarEmptyStateContainer = styled.div`
`;
const FilterControlsWrapper = styled.div`
- padding: ${({ theme }) => theme.sizeUnit * 4}px;
- // 108px padding to make room for buttons with position: absolute
- padding-bottom: ${({ theme }) => theme.sizeUnit * 27}px;
+ ${({ theme }) => `
+ display: flex;
+ flex-direction: column;
+ gap: ${theme.sizeUnit * 2}px;
+ padding: ${theme.sizeUnit * 4}px;
+ // 108px padding to make room for buttons with position: absolute
+ padding-bottom: ${theme.sizeUnit * 27}px;
+ `}
`;
export const FilterBarScrollContext = createContext(false);
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx
index 72d4197acc..a749496054 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ColumnSelect.tsx
@@ -25,16 +25,17 @@ import {
useChangeEffect,
getClientErrorObject,
} from '@superset-ui/core';
-import { Select, FormInstance } from 'src/components';
+import { Select } from 'src/components';
+import { FormInstance } from 'src/components/Form';
import { useToasts } from 'src/components/MessageToasts/withToasts';
import { cachedSupersetGet } from 'src/utils/cachedSupersetGet';
-import { NativeFiltersForm } from '../types';
+import { NativeFiltersForm, NativeFiltersFormItem } from '../types';
interface ColumnSelectProps {
allowClear?: boolean;
filterValues?: (column: Column) => boolean;
form: FormInstance<NativeFiltersForm>;
- formField?: string;
+ formField?: keyof NativeFiltersFormItem;
filterId: string;
datasetId?: number;
value?: string | string[];
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx
index 1fbda8cd24..b20d315c16 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/DefaultValue.tsx
@@ -24,7 +24,7 @@ import {
AppSection,
t,
} from '@superset-ui/core';
-import { FormInstance } from 'src/components';
+import { FormInstance } from 'src/components/Form';
import Loading from 'src/components/Loading';
import { NativeFiltersForm } from '../types';
import { getFormData } from '../../utils';
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx
index 89457db858..a19f6c977b 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/FilterScope.tsx
@@ -19,7 +19,7 @@
import { FC, useCallback, useEffect, useMemo, useState } from 'react';
import { NativeFilterScope, styled } from '@superset-ui/core';
-import { AntdForm } from 'src/components';
+import { FormItem } from 'src/components/Form';
import ScopingTree from './ScopingTree';
import { getDefaultScopeValue } from './utils';
@@ -42,7 +42,7 @@ const Wrapper = styled.div`
padding: 0px ${({ theme }) => theme.sizeUnit * 4}px;
`;
-const CleanFormItem = styled(AntdForm.Item)`
+const CleanFormItem = styled(FormItem)`
margin-bottom: 0;
`;
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/__tests__/TreeInitialization.test.tsx
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/__tests__/TreeInitialization.test.tsx
index bd611519e9..f18c71ce95 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/__tests__/TreeInitialization.test.tsx
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/__tests__/TreeInitialization.test.tsx
@@ -23,7 +23,7 @@ import {
waitFor,
cleanup,
} from 'spec/helpers/testing-library';
-import { FormInstance } from 'antd/lib/form';
+import { FormInstance } from 'src/components/Form';
import { createMockModal } from './utils';
describe('FilterScope TreeInitialization', () => {
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/__tests__/TreeSelection.test.tsx
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/__tests__/TreeSelection.test.tsx
index 0d1e8e6535..148e478dc7 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/__tests__/TreeSelection.test.tsx
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/__tests__/TreeSelection.test.tsx
@@ -23,7 +23,7 @@ import {
waitFor,
cleanup,
} from 'spec/helpers/testing-library';
-import { FormInstance } from 'antd/lib/form';
+import { FormInstance } from 'src/components/Form';
import { createMockModal, getTreeSwitcher } from './utils';
describe('FilterScope TreeSelection', () => {
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/__tests__/utils.tsx
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/__tests__/utils.tsx
index 2f6aaf51a9..81427417bf 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/__tests__/utils.tsx
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FilterScope/__tests__/utils.tsx
@@ -18,11 +18,11 @@
*/
import { useEffect } from 'react';
import { Provider } from 'react-redux';
-import { AntdForm, FormInstance } from 'src/components';
import FiltersConfigForm, {
FilterPanels,
} from
'src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm';
import { mockStoreWithChartsInTabsAndRoot } from 'spec/fixtures/mockStore';
+import { Form, FormInstance } from 'src/components/Form';
export const createMockedProps = () => ({
expanded: false,
@@ -48,7 +48,7 @@ interface MockModalProps {
export const createMockModal = ({ scope, formRef }: MockModalProps) => {
const MockModalComponent = () => {
- const [form] = AntdForm.useForm();
+ const [form] = Form.useForm();
useEffect(() => {
// Create a new ref object instead of modifying the parameter
@@ -71,9 +71,9 @@ export const createMockModal = ({ scope, formRef }:
MockModalProps) => {
return (
<Provider store={mockStoreWithChartsInTabsAndRoot}>
- <AntdForm form={form}>
+ <Form form={form}>
<FiltersConfigForm form={form} {...createMockedProps()} />
- </AntdForm>
+ </Form>
</Provider>
);
};
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx
index 008ed703ee..1681ffadd8 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx
@@ -59,11 +59,11 @@ import { PluginFilterSelectCustomizeProps } from
'src/filters/components/Select/
import { useSelector } from 'react-redux';
import { getChartDataRequest } from 'src/components/Chart/chartAction';
import { Input, TextArea } from 'src/components/Input';
-import { Select, FormInstance } from 'src/components';
+import { Select } from 'src/components';
import Collapse from 'src/components/Collapse';
import BasicErrorAlert from 'src/components/ErrorMessage/BasicErrorAlert';
import ErrorMessageWithStackTrace from
'src/components/ErrorMessage/ErrorMessageWithStackTrace';
-import { FormItem } from 'src/components/Form';
+import { FormItem, FormInstance } from 'src/components/Form';
import { Icons } from 'src/components/Icons';
import Loading from 'src/components/Loading';
import { addDangerToast } from 'src/components/MessageToasts/actions';
@@ -86,6 +86,7 @@ import {
mergeExtraFormData,
} from 'src/dashboard/components/nativeFilters/utils';
import { DatasetSelectLabel } from 'src/features/datasets/DatasetSelectLabel';
+import { Flex } from 'src/components/Flex';
import {
ALLOW_DEPENDENCIES as TYPES_SUPPORT_DEPENDENCIES,
getFiltersConfigModalTestId,
@@ -123,12 +124,8 @@ const StyledContainer = styled.div`
`}
`;
-const StyledRowContainer = styled.div`
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- width: 100%;
- padding: 0px ${({ theme }) => theme.sizeUnit * 4}px;
+const StyledRowContainer = styled(Flex)`
+ padding: ${({ theme }) => theme.sizeUnit * 4}px;
`;
type ControlKey = keyof PluginFilterSelectCustomizeProps;
@@ -143,66 +140,21 @@ const controlsOrder: ControlKey[] = [
export const StyledFormItem = styled(FormItem)<{ expanded: boolean }>`
width: ${({ expanded }) => (expanded ? '49%' : `${FORM_ITEM_WIDTH}px`)};
- margin-bottom: ${({ theme }) => theme.sizeUnit * 4}px;
-
- & .ant-form-item-label {
- padding-bottom: 0;
- }
-
- & .ant-form-item-control-input {
- min-height: ${({ theme }) => theme.sizeUnit * 10}px;
- }
`;
export const StyledRowFormItem = styled(FormItem)<{ expanded: boolean }>`
- margin-bottom: 0;
- padding-bottom: 0;
min-width: ${({ expanded }) => (expanded ? '50%' : `${FORM_ITEM_WIDTH}px`)};
-
- & .ant-form-item-label {
- padding-bottom: 0;
- }
-
- .ant-form-item-control-input-content > div > div {
- height: auto;
- }
-
- & .ant-form-item-control-input {
- min-height: ${({ theme }) => theme.sizeUnit * 10}px;
- }
`;
export const StyledRowSubFormItem = styled(FormItem)<{ expanded: boolean }>`
min-width: ${({ expanded }) => (expanded ? '50%' : `${FORM_ITEM_WIDTH}px`)};
-
- & .ant-form-item-label {
- padding-bottom: 0;
- }
-
- .ant-form-item {
- margin-bottom: 0;
- }
-
- .ant-form-item-control-input-content > div > div {
- height: auto;
- }
-
- .ant-form-item-extra {
- display: none;
- }
-
- & .ant-form-item-control-input {
- height: auto;
- }
`;
export const StyledLabel = styled.span`
- color: ${({ theme }) => theme.colors.grayscale.base};
- font-size: ${({ theme }) => theme.fontSizeSM}px;
-`;
-
-const CleanFormItem = styled(FormItem)`
- margin-bottom: 0;
+ ${({ theme }) => `
+ font-size: ${theme.fontSizeSM}px;
+ color: ${theme.colorTextSecondary};
+ `}
`;
const DefaultValueContainer = styled.div`
@@ -249,7 +201,7 @@ const StyledTabs = styled(Tabs)`
padding: 0;
}
- .ant-form-item-label {
+ .ant-5-form-item-label {
padding-bottom: 0;
}
`;
@@ -901,7 +853,7 @@ const FiltersConfigForm = (
</FilterTypeInfo>
)}
{hasDataset && (
- <StyledRowContainer>
+ <StyledRowContainer justify="space-between">
{showDataset ? (
<StyledFormItem
expanded={expanded}
@@ -997,7 +949,7 @@ const FiltersConfigForm = (
</StyledRowFormItem>
)}
{hasDataset && hasAdditionalFilters && (
- <CleanFormItem name={['filters', filterId, 'preFilter']}>
+ <FormItem name={['filters', filterId, 'preFilter']}>
<CollapsibleControl
initialValue={hasPreFilter}
title={t('Pre-filter available values')}
@@ -1081,10 +1033,10 @@ const FiltersConfigForm = (
? timeColumn
: undefined}
</CollapsibleControl>
- </CleanFormItem>
+ </FormItem>
)}
{formFilter?.filterType !== 'filter_range' ? (
- <CleanFormItem name={['filters', filterId, 'sortFilter']}>
+ <FormItem name={['filters', filterId, 'sortFilter']}>
<CollapsibleControl
initialValue={hasSorting}
title={t('Sort filter values')}
@@ -1154,9 +1106,9 @@ const FiltersConfigForm = (
</StyledRowSubFormItem>
)}
</CollapsibleControl>
- </CleanFormItem>
+ </FormItem>
) : (
- <CleanFormItem name={['filters', filterId, 'rangeFilter']}>
+ <FormItem name={['filters', filterId, 'rangeFilter']}>
<CollapsibleControl
initialValue={hasEnableSingleValue}
title={t('Single Value')}
@@ -1199,7 +1151,7 @@ const FiltersConfigForm = (
/>
</StyledRowFormItem>
</CollapsibleControl>
- </CleanFormItem>
+ </FormItem>
)}
</Collapse.Panel>
)}
@@ -1216,12 +1168,12 @@ const FiltersConfigForm = (
>
<TextArea onChange={debouncedFormChanged} />
</StyledFormItem>
- <CleanFormItem
+ <FormItem
name={['filters', filterId, 'defaultValueQueriesData']}
hidden
initialValue={null}
/>
- <CleanFormItem name={['filters', filterId, 'defaultValue']}>
+ <FormItem name={['filters', filterId, 'defaultValue']}>
<CollapsibleControl
checked={hasDefaultValue}
disabled={isRequired || defaultToFirstItem}
@@ -1338,7 +1290,7 @@ const FiltersConfigForm = (
</StyledRowSubFormItem>
)}
</CollapsibleControl>
- </CleanFormItem>
+ </FormItem>
{Object.keys(controlItems)
.sort(
(a, b) =>
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.test.tsx
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.test.tsx
index 6d6966f709..b9703f4b96 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.test.tsx
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.test.tsx
@@ -18,7 +18,7 @@
*/
import { Filter, NativeFilterType } from '@superset-ui/core';
import { render, screen, userEvent } from 'spec/helpers/testing-library';
-import { FormInstance } from 'src/components';
+import { FormInstance } from 'src/components/Form';
import getControlItemsMap, { ControlItemsProps } from './getControlItemsMap';
import { getControlItems, setNativeFilterFieldValues } from './utils';
@@ -28,7 +28,9 @@ jest.mock('./utils', () => ({
}));
const formMock: FormInstance = {
- __INTERNAL__: { itemRef: () => () => {} },
+ focusField: () => {},
+ getFieldWarning: () => [],
+ setFieldValue: () => {},
scrollToField: () => {},
getFieldInstance: () => {},
getFieldValue: () => {},
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx
index ed92809988..b4ed135a8a 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/getControlItemsMap.tsx
@@ -21,7 +21,7 @@ import {
InfoTooltipWithTrigger,
} from '@superset-ui/chart-controls';
import { ReactNode } from 'react';
-import { AntdCheckbox, FormInstance } from 'src/components';
+import { AntdCheckbox } from 'src/components';
import {
Filter,
getChartControlPanelRegistry,
@@ -29,7 +29,7 @@ import {
t,
} from '@superset-ui/core';
import { Tooltip } from 'src/components/Tooltip';
-import { FormItem } from 'src/components/Form';
+import { FormItem, FormInstance } from 'src/components/Form';
import {
doesColumnMatchFilterType,
getControlItems,
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts
index f71d60a134..4070a142c5 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/state.ts
@@ -17,7 +17,7 @@
* under the License.
*/
import { useEffect, useState } from 'react';
-import { FormInstance } from 'src/components';
+import { FormInstance } from 'src/components/Form';
import { Filter, t } from '@superset-ui/core';
import { NativeFiltersForm, NativeFiltersFormItem } from '../types';
import { setNativeFilterFieldValues, useForceUpdate } from './utils';
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/utils.ts
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/utils.ts
index 09f515b63e..be51b40a95 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/utils.ts
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/utils.ts
@@ -17,7 +17,7 @@
* under the License.
*/
import { flatMapDeep } from 'lodash';
-import { FormInstance } from 'src/components';
+import { FormInstance } from 'src/components/Form';
import { useState, useCallback } from 'react';
import { CustomControlItem, Dataset } from '@superset-ui/chart-controls';
import { Column, ensureIsArray, GenericDataType } from '@superset-ui/core';
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx
index a7004954f2..56715f936d 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx
@@ -29,7 +29,7 @@ import {
useTheme,
} from '@superset-ui/core';
import { useDispatch } from 'react-redux';
-import { AntdForm } from 'src/components';
+import { Form } from 'src/components/Form';
import { Icons } from 'src/components/Icons';
import ErrorBoundary from 'src/components/ErrorBoundary';
import { StyledModal } from 'src/components/Modal';
@@ -101,7 +101,7 @@ export const StyledModalBody = styled.div<{ expanded:
boolean }>`
}
`;
-export const StyledForm = styled(AntdForm)`
+export const StyledForm = styled(Form)`
width: 100%;
`;
@@ -156,7 +156,7 @@ function FiltersConfigModal({
const dispatch = useDispatch();
const theme = useTheme();
- const [form] = AntdForm.useForm<NativeFiltersForm>();
+ const [form] = Form.useForm<NativeFiltersForm>();
const configFormRef = useRef<any>();
@@ -554,7 +554,11 @@ function FiltersConfigModal({
.forEach(filterId => {
const result = hasCircularDependency(dependencyMap, filterId);
const field = {
- name: ['filters', filterId, 'dependencies'],
+ name: ['filters', filterId, 'dependencies'] as [
+ 'filters',
+ string,
+ 'dependencies',
+ ],
errors: result ? [t('Cyclic dependency detected')] : [],
};
form.setFields([field]);
diff --git
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts
index af51dedbe6..fb702e8852 100644
---
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts
+++
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-import { FormInstance } from 'src/components';
+import { FormInstance } from 'src/components/Form';
import { nanoid } from 'nanoid';
import { getInitialDataMask } from 'src/dataMask/reducer';
import {
diff --git a/superset-frontend/src/explore/components/PropertiesModal/index.tsx
b/superset-frontend/src/explore/components/PropertiesModal/index.tsx
index 422ecc8257..928055fcc0 100644
--- a/superset-frontend/src/explore/components/PropertiesModal/index.tsx
+++ b/superset-frontend/src/explore/components/PropertiesModal/index.tsx
@@ -21,7 +21,7 @@ import { ChangeEvent, useMemo, useState, useCallback,
useEffect } from 'react';
import Modal from 'src/components/Modal';
import { Input, TextArea } from 'src/components/Input';
import Button from 'src/components/Button';
-import { AsyncSelect, Row, Col, AntdForm } from 'src/components';
+import { AsyncSelect, Row, Col } from 'src/components';
// eslint-disable-next-line no-restricted-imports
import { SelectValue } from 'antd/lib/select'; // TODO: Remove antd
import rison from 'rison';
@@ -42,6 +42,7 @@ import withToasts from
'src/components/MessageToasts/withToasts';
import { loadTags } from 'src/components/Tags/utils';
import { fetchTags, OBJECT_TYPES } from 'src/features/tags/tags';
import TagType from 'src/types/TagType';
+import { Form } from 'src/components/Form';
export type PropertiesModalProps = {
slice: Slice;
@@ -53,9 +54,9 @@ export type PropertiesModalProps = {
addSuccessToast: (msg: string) => void;
};
-const FormItem = AntdForm.Item;
+const FormItem = Form.Item;
-const StyledFormItem = styled(AntdForm.Item)`
+const StyledFormItem = styled(Form.Item)`
margin-bottom: 0;
`;
@@ -72,7 +73,7 @@ function PropertiesModal({
}: PropertiesModalProps) {
const theme = useTheme();
const [submitting, setSubmitting] = useState(false);
- const [form] = AntdForm.useForm();
+ const [form] = Form.useForm();
// values of form inputs
const [name, setName] = useState(slice.slice_name || '');
const [selectedOwners, setSelectedOwners] = useState<SelectValue | null>(
@@ -294,7 +295,7 @@ function PropertiesModal({
responsive
wrapProps={{ 'data-test': 'properties-edit-modal' }}
>
- <AntdForm
+ <Form
form={form}
onFinish={onSubmit}
layout="vertical"
@@ -408,7 +409,7 @@ function PropertiesModal({
)}
</Col>
</Row>
- </AntdForm>
+ </Form>
</Modal>
);
}
diff --git
a/superset-frontend/src/explore/components/controls/LayerConfigsControl/LayerConfigsPopoverContent.tsx
b/superset-frontend/src/explore/components/controls/LayerConfigsControl/LayerConfigsPopoverContent.tsx
index c0331a204f..bcefbd4e00 100644
---
a/superset-frontend/src/explore/components/controls/LayerConfigsControl/LayerConfigsPopoverContent.tsx
+++
b/superset-frontend/src/explore/components/controls/LayerConfigsControl/LayerConfigsPopoverContent.tsx
@@ -98,7 +98,7 @@ export const StyledGeoStyler = styled(GeoStylerWrapper)`
font-weight: ${theme.fontWeightNormal};
font-size: ${theme.fontSizeXL}px;
}
- .ant-form-item-control {
+ .antd5-form-item-control {
flex: unset;
}
`}
diff --git
a/superset-frontend/src/features/databases/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx
b/superset-frontend/src/features/databases/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx
index c10859993a..af8e64693d 100644
---
a/superset-frontend/src/features/databases/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx
+++
b/superset-frontend/src/features/databases/DatabaseModal/DatabaseConnectionForm/EncryptedField.tsx
@@ -19,7 +19,7 @@
import { useRef, useState } from 'react';
import { SupersetTheme, t } from '@superset-ui/core';
import { Button, AntdSelect } from 'src/components';
-import FormLabel from 'src/components/Form/FormLabel';
+import { FormLabel } from 'src/components/Form';
import { Icons } from 'src/components/Icons';
import { DatabaseParameters, FieldPropTypes } from '../../types';
import { infoTooltip, CredentialInfoForm } from '../styles';
diff --git
a/superset-frontend/src/features/databases/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx
b/superset-frontend/src/features/databases/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx
index cb30054364..fca72603e3 100644
---
a/superset-frontend/src/features/databases/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx
+++
b/superset-frontend/src/features/databases/DatabaseModal/DatabaseConnectionForm/TableCatalog.tsx
@@ -18,7 +18,7 @@
*/
import { css, SupersetTheme, t } from '@superset-ui/core';
import ValidatedInput from 'src/components/Form/LabeledErrorBoundInput';
-import FormLabel from 'src/components/Form/FormLabel';
+import { FormLabel } from 'src/components/Form';
import { Icons } from 'src/components/Icons';
import { StyledFooterButton, StyledCatalogTable } from '../styles';
import { CatalogObject, FieldPropTypes } from '../../types';
diff --git
a/superset-frontend/src/features/databases/DatabaseModal/SSHTunnelForm.tsx
b/superset-frontend/src/features/databases/DatabaseModal/SSHTunnelForm.tsx
index 7feb06aaf9..a0390cd0e0 100644
--- a/superset-frontend/src/features/databases/DatabaseModal/SSHTunnelForm.tsx
+++ b/superset-frontend/src/features/databases/DatabaseModal/SSHTunnelForm.tsx
@@ -18,7 +18,7 @@
*/
import { useState } from 'react';
import { t, styled } from '@superset-ui/core';
-import { AntdForm, Col, Row } from 'src/components';
+import { Col, Row } from 'src/components';
import { Form, FormLabel } from 'src/components/Form';
import { Radio } from 'src/components/Radio';
import { Input, TextArea } from 'src/components/Input';
@@ -40,7 +40,7 @@ const StyledRow = styled(Row)`
padding-bottom: ${({ theme }) => theme.sizeUnit * 2}px;
`;
-const StyledFormItem = styled(AntdForm.Item)`
+const StyledFormItem = styled(Form.Item)`
margin-bottom: 0 !important;
`;
diff --git a/superset-frontend/src/features/databases/UploadDataModel/index.tsx
b/superset-frontend/src/features/databases/UploadDataModel/index.tsx
index 55681b5c1b..beb866d697 100644
--- a/superset-frontend/src/features/databases/UploadDataModel/index.tsx
+++ b/superset-frontend/src/features/databases/UploadDataModel/index.tsx
@@ -35,20 +35,14 @@ import Modal from 'src/components/Modal';
import Button from 'src/components/Button';
import { Switch, SwitchProps } from 'src/components/Switch';
import Collapse from 'src/components/Collapse';
-import {
- AntdForm,
- AsyncSelect,
- Col,
- Row,
- Select,
- Upload,
-} from 'src/components';
+import { AsyncSelect, Col, Row, Select, Upload } from 'src/components';
import { Icons } from 'src/components/Icons';
import { Input, InputNumber } from 'src/components/Input';
import rison from 'rison';
// eslint-disable-next-line no-restricted-imports
import { UploadChangeParam, UploadFile } from 'antd/lib/upload/interface'; //
TODO: Remove antd
import withToasts from 'src/components/MessageToasts/withToasts';
+import { Form } from 'src/components/Form';
import {
antdCollapseStyles,
antDModalNoPaddingStyles,
@@ -218,7 +212,7 @@ const UploadDataModal:
FunctionComponent<UploadDataModalProps> = ({
allowedExtensions,
type = 'csv',
}) => {
- const [form] = AntdForm.useForm();
+ const [form] = Form.useForm();
const [currentDatabaseId, setCurrentDatabaseId] = useState<number>(0);
const [fileList, setFileList] = useState<UploadFile[]>([]);
const [columns, setColumns] = useState<string[]>([]);
@@ -589,7 +583,7 @@ const UploadDataModal:
FunctionComponent<UploadDataModalProps> = ({
show={show}
title={<UploadTitle />}
>
- <AntdForm
+ <Form
form={form}
onFinish={onFinish}
data-test="dashboard-edit-properties-form"
@@ -1034,7 +1028,7 @@ const UploadDataModal:
FunctionComponent<UploadDataModalProps> = ({
</Collapse.Panel>
)}
</Collapse>
- </AntdForm>
+ </Form>
</Modal>
);
};
diff --git
a/superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx
b/superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx
index 2ae9b4af32..6a7dda0f10 100644
--- a/superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx
+++ b/superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx
@@ -30,8 +30,9 @@ import { InputNumber } from 'src/components/Input';
import { FilterBarOrientation } from 'src/dashboard/types';
import Metadata from 'src/components/Metadata';
import { isNumber } from 'lodash';
+import { FormItem } from 'src/components/Form';
import { PluginFilterRangeProps } from './types';
-import { StatusMessage, StyledFormItem, FilterPluginStyle } from '../common';
+import { StatusMessage, FilterPluginStyle } from '../common';
import { getRangeExtraFormData } from '../../utils';
import { SingleValueType } from './SingleValueType';
@@ -340,7 +341,7 @@ export default function RangeFilterPlugin(props:
PluginFilterRangeProps) {
{Number.isNaN(Number(min)) || Number.isNaN(Number(max)) ? (
<h4>{t('Chosen non-numeric column')}</h4>
) : (
- <StyledFormItem
+ <FormItem
aria-labelledby={`filter-name-${formData.nativeFilterId}`}
extra={formItemExtra}
>
@@ -382,7 +383,7 @@ export default function RangeFilterPlugin(props:
PluginFilterRangeProps) {
{(rangeInput ||
filterBarOrientation === FilterBarOrientation.Vertical) &&
!filterState.validateStatus && <Metadata value={metadataText} />}
- </StyledFormItem>
+ </FormItem>
)}
</FilterPluginStyle>
);
diff --git
a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx
b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx
index 23447fb295..e8e0bd0d04 100644
--- a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx
+++ b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx
@@ -38,8 +38,9 @@ import { Select } from 'src/components';
import { SLOW_DEBOUNCE } from 'src/constants';
import { hasOption, propertyComparator } from 'src/components/Select/utils';
import { FilterBarOrientation } from 'src/dashboard/types';
+import { FormItem } from 'src/components/Form';
import { PluginFilterSelectProps, SelectValue } from './types';
-import { FilterPluginStyle, StatusMessage, StyledFormItem } from '../common';
+import { FilterPluginStyle, StatusMessage } from '../common';
import { getDataRecordFormatter, getSelectExtraFormData } from '../../utils';
type DataMaskAction =
@@ -289,7 +290,7 @@ export default function PluginFilterSelect(props:
PluginFilterSelectProps) {
return (
<FilterPluginStyle height={height} width={width}>
- <StyledFormItem
+ <FormItem
validateStatus={filterState.validateStatus}
extra={formItemExtra}
>
@@ -326,7 +327,7 @@ export default function PluginFilterSelect(props:
PluginFilterSelectProps) {
sortComparator={sortComparator}
onDropdownVisibleChange={setFilterActive}
/>
- </StyledFormItem>
+ </FormItem>
</FilterPluginStyle>
);
}
diff --git
a/superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx
b/superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx
index 0e456b35c0..9f50e2103c 100644
---
a/superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx
+++
b/superset-frontend/src/filters/components/TimeColumn/TimeColumnFilterPlugin.tsx
@@ -25,9 +25,8 @@ import {
} from '@superset-ui/core';
import { useEffect, useState } from 'react';
import { Select } from 'src/components';
-// eslint-disable-next-line no-restricted-imports
-import { FormItemProps } from 'antd/lib/form'; // TODO: Remove antd
-import { FilterPluginStyle, StyledFormItem, StatusMessage } from '../common';
+import { FormItem, FormItemProps } from 'src/components/Form';
+import { FilterPluginStyle, StatusMessage } from '../common';
import { PluginFilterTimeColumnProps } from './types';
export default function PluginFilterTimeColumn(
@@ -107,10 +106,7 @@ export default function PluginFilterTimeColumn(
return (
<FilterPluginStyle height={height} width={width}>
- <StyledFormItem
- validateStatus={filterState.validateStatus}
- {...formItemData}
- >
+ <FormItem validateStatus={filterState.validateStatus} {...formItemData}>
<Select
name={formData.nativeFilterId}
allowClear
@@ -126,7 +122,7 @@ export default function PluginFilterTimeColumn(
options={options}
onDropdownVisibleChange={setFilterActive}
/>
- </StyledFormItem>
+ </FormItem>
</FilterPluginStyle>
);
}
diff --git
a/superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx
b/superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx
index e8381f53e5..230823c7d7 100644
---
a/superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx
+++
b/superset-frontend/src/filters/components/TimeGrain/TimeGrainFilterPlugin.tsx
@@ -25,9 +25,8 @@ import {
} from '@superset-ui/core';
import { useEffect, useMemo, useState } from 'react';
import { Select } from 'src/components';
-// eslint-disable-next-line no-restricted-imports
-import { FormItemProps } from 'antd/lib/form'; // TODO: Remove antd
-import { FilterPluginStyle, StyledFormItem, StatusMessage } from '../common';
+import { FormItem, FormItemProps } from 'src/components/Form';
+import { FilterPluginStyle, StatusMessage } from '../common';
import { PluginFilterTimeGrainProps } from './types';
export default function PluginFilterTimegrain(
@@ -117,10 +116,7 @@ export default function PluginFilterTimegrain(
return (
<FilterPluginStyle height={height} width={width}>
- <StyledFormItem
- validateStatus={filterState.validateStatus}
- {...formItemData}
- >
+ <FormItem validateStatus={filterState.validateStatus} {...formItemData}>
<Select
name={formData.nativeFilterId}
allowClear
@@ -136,7 +132,7 @@ export default function PluginFilterTimegrain(
options={options}
onDropdownVisibleChange={setFilterActive}
/>
- </StyledFormItem>
+ </FormItem>
</FilterPluginStyle>
);
}
diff --git a/superset-frontend/src/filters/components/common.ts
b/superset-frontend/src/filters/components/common.ts
index cb6d7f22f1..2074309526 100644
--- a/superset-frontend/src/filters/components/common.ts
+++ b/superset-frontend/src/filters/components/common.ts
@@ -18,7 +18,6 @@
*/
import { styled } from '@superset-ui/core';
import { PluginFilterStylesProps } from './types';
-import FormItem from '../../components/Form/FormItem';
export const RESPONSIVE_WIDTH = 0;
@@ -27,12 +26,6 @@ export const FilterPluginStyle =
styled.div<PluginFilterStylesProps>`
width: ${({ width }) => (width === RESPONSIVE_WIDTH ? '100%' :
`${width}px`)};
`;
-export const StyledFormItem = styled(FormItem)`
- &.ant-row.ant-form-item {
- margin: 0;
- }
-`;
-
export const StatusMessage = styled.div<{
status?: 'error' | 'warning' | 'info';
}>`