Skip to content
Snippets Groups Projects
Unverified Commit ec42a9fe authored by Anton Kulyk's avatar Anton Kulyk Committed by GitHub
Browse files

Forms Refactoring 5 — Isolate legacy form types (#24463)

parent 1c490b26
No related branches found
No related tags found
No related merge requests found
Showing
with 111 additions and 18 deletions
......@@ -6,7 +6,10 @@ export type FieldValues = Record<FieldName, DefaultFieldValue>;
type FieldValidateResultOK = undefined;
type FieldValidateResultError = string;
export type BaseFieldDefinition = {
// Extending Record type here as field definition's props
// will be just spread to the final field widget
// (e.g. autoFocus, placeholder)
export type BaseFieldDefinition = Record<string, unknown> & {
name: string;
type?: string;
title?: string;
......@@ -31,7 +34,8 @@ export type BaseFieldDefinition = {
};
export type StandardFormFieldDefinition = BaseFieldDefinition & {
type: string | (() => JSX.Element);
// If not is not provided, we're going to use default text input
type?: string | (() => JSX.Element);
};
export type CustomFormFieldDefinition = BaseFieldDefinition & {
......@@ -62,7 +66,13 @@ export type FormField<Value = DefaultFieldValue> = {
};
export type FormObject = {
fields: (values: FieldValues) => FormFieldDefinition[];
fields:
| FormFieldDefinition[]
| ((values?: FieldValues) => FormFieldDefinition[]);
};
export type PopulatedFormObject = {
fields: (values?: FieldValues) => FormFieldDefinition[];
fieldNames: (values: FieldValues) => FieldName[];
hidden: (obj: unknown) => void;
initial: (obj: unknown) => void;
......
export type FieldName = string;
export type DefaultFieldValue = unknown;
export type FieldValues = Record<FieldName, DefaultFieldValue>;
type FieldValidateResultOK = undefined;
type FieldValidateResultError = string;
// Extending Record type here as field definition's props
// will be just spread to the final field widget
// (e.g. autoFocus, placeholder)
export type BaseFieldDefinition = Record<string, unknown> & {
name: string;
type?: string;
title?: string;
description?: string;
placeholder?: string;
hidden?: boolean;
info?: string;
infoLabel?: string;
infoLabelTooltip?: string;
align?: "left" | "right";
horizontal?: boolean;
descriptionPosition?: "top" | "bottom";
visibleIf?: Record<FieldName, unknown>;
initial?: (value: unknown) => DefaultFieldValue;
validate?: (
value: DefaultFieldValue,
) => FieldValidateResultOK | FieldValidateResultError;
normalize?: (value: unknown) => DefaultFieldValue;
};
export type StandardFormFieldDefinition = BaseFieldDefinition & {
// If not is not provided, we're going to use default text input
type?: string | (() => JSX.Element);
};
export type CustomFormFieldDefinition = BaseFieldDefinition & {
widget: () => JSX.Element;
};
export type FormFieldDefinition =
| StandardFormFieldDefinition
| CustomFormFieldDefinition;
export type FormField<Value = DefaultFieldValue> = {
name: FieldName;
value: Value;
error?: string;
initialValue: Value;
active: boolean;
dirty: boolean;
invalid: boolean;
pristine: boolean;
touched: boolean;
valid: boolean;
visited: boolean;
onBlur: () => void;
onFocus: () => void;
};
export type FormObject = {
fields:
| FormFieldDefinition[]
| ((values?: FieldValues) => FormFieldDefinition[]);
};
export type PopulatedFormObject = {
fields: (values?: FieldValues) => FormFieldDefinition[];
fieldNames: (values: FieldValues) => FieldName[];
hidden: (obj: unknown) => void;
initial: (obj: unknown) => void;
normalize: (obj: unknown) => void;
validate: (obj: unknown) => void;
disablePristineSubmit?: boolean;
};
import React from "react";
import _ from "underscore";
import { FormFieldDefinition, FormObject } from "metabase-types/forms";
import {
FormFieldDefinition,
PopulatedFormObject,
} from "metabase-types/forms/legacy";
import {
BaseFormProps,
......@@ -17,7 +20,7 @@ import CustomFormSubmit from "./CustomFormSubmit";
import Form from "./Form";
interface FormRenderProps extends BaseFormProps {
form: FormObject;
form: PopulatedFormObject;
formFields: FormFieldDefinition[];
Form: React.ComponentType<{ children: React.ReactNode }>;
FormField: React.ComponentType<CustomFormFieldProps>;
......
......@@ -14,7 +14,7 @@ import {
StandardFormFieldDefinition,
CustomFormFieldDefinition,
FormFieldDefinition,
} from "metabase-types/forms";
} from "metabase-types/forms/legacy";
import {
CustomFormLegacyContext,
......
import React from "react";
import PropTypes from "prop-types";
import cx from "classnames";
import { t } from "ttag";
import Button from "metabase/core/components/Button";
......
......@@ -6,13 +6,12 @@ import {
FieldValues,
FormFieldDefinition,
FormField,
FormObject,
} from "metabase-types/forms";
PopulatedFormObject,
} from "metabase-types/forms/legacy";
export interface BaseFormProps {
formKey?: string;
formName?: string;
formObject: FormObject;
formObject: PopulatedFormObject;
formFields: FormFieldDefinition[];
formFieldsByName: Record<FieldName, FormFieldDefinition>;
......
......@@ -6,7 +6,7 @@ import {
FormField as FormFieldType,
BaseFieldDefinition,
FormFieldDefinition,
} from "metabase-types/forms";
} from "metabase-types/forms/legacy";
import FormFieldView from "./FormFieldView";
......
......@@ -3,7 +3,7 @@ import cx from "classnames";
import Tooltip from "metabase/components/Tooltip";
import { BaseFieldDefinition } from "metabase-types/forms";
import { BaseFieldDefinition } from "metabase-types/forms/legacy";
import { FormFieldDescription } from "./FormFieldDescription";
import {
......
......@@ -2,7 +2,7 @@ import React from "react";
import _ from "underscore";
import { Form } from "formik";
import { FormFieldDefinition, FormObject } from "metabase-types/forms";
import { FormFieldDefinition, PopulatedFormObject } from "metabase-types/forms";
import { BaseFormProps, OptionalFormViewProps } from "./types";
......@@ -14,7 +14,7 @@ import CustomFormSubmit from "./CustomFormSubmit";
import { FormContext } from "./context";
interface FormRenderProps extends BaseFormProps {
form: FormObject;
form: PopulatedFormObject;
formFields: FormFieldDefinition[];
Form: React.ComponentType<{ children: React.ReactNode }>;
FormField: React.ComponentType<CustomFormFieldProps>;
......
......@@ -5,12 +5,13 @@ import {
FieldValues,
FormFieldDefinition,
FormField,
FormObject,
PopulatedFormObject,
} from "metabase-types/forms";
export interface BaseFormProps {
formKey?: string;
formObject: FormObject;
formName?: string;
formObject: PopulatedFormObject;
formFields: FormFieldDefinition[];
formFieldsByName: Record<FieldName, FormFieldDefinition>;
......
......@@ -31,7 +31,7 @@ interface FormContainerProps {
normalize?: () => void;
onSubmit: (values: FieldValues) => Promise<void>;
onSubmitSuccess: (action: unknown) => void;
onSubmitSuccess?: (action: unknown) => void;
}
type ServerErrorResponse = {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment