Skip to content
Snippets Groups Projects
Unverified Commit e20c00b1 authored by Alexander Polyankin's avatar Alexander Polyankin Committed by GitHub
Browse files

Fix actions without parameters (#49125)


* Fix actions without parameters

* Update frontend/src/metabase/actions/components/ActionViz/ActionDashcardSettings.unit.spec.tsx

Co-authored-by: default avatarKamil Mielnik <kamil@kamilmielnik.com>

---------

Co-authored-by: default avatarKamil Mielnik <kamil@kamilmielnik.com>
parent c6683ce7
No related branches found
Tags v0.49.3 v1.49.3
No related merge requests found
......@@ -18,7 +18,7 @@ export interface WritebackActionBase {
model_id: CardId;
name: string;
description: string | null;
parameters: WritebackParameter[];
parameters?: WritebackParameter[];
visualization_settings?: ActionFormSettings;
archived: boolean;
creator_id: UserId;
......
......@@ -41,7 +41,7 @@ export const createMockQueryAction = ({
description: null,
model_id: 1,
database_id: 1,
parameters: [],
parameters: undefined,
creator_id: creator.id,
creator,
archived: false,
......@@ -66,7 +66,7 @@ export const createMockImplicitQueryAction = ({
description: "",
model_id: 1,
database_id: 1,
parameters: [],
parameters: undefined,
visualization_settings: undefined,
creator_id: creator.id,
creator,
......
......@@ -71,8 +71,8 @@ export function ActionDashcardSettings({
);
const isFormInvalid =
!!action &&
action.parameters.some(actionParameter => {
action != null &&
action.parameters?.some(actionParameter => {
const isHidden = isParameterHidden(action, actionParameter);
const isRequired = isParameterRequired(action, actionParameter);
const isParameterMapped =
......
......@@ -456,6 +456,16 @@ describe("ActionViz > ActionDashcardSettings", () => {
).toBeInTheDocument();
});
it("should be valid and not crash when the action does not have parameters (metabase#32665)", async () => {
const { closeSpy } = setup({
dashcard: createMockActionDashboardCard({
action: createMockQueryAction(),
}),
});
await userEvent.click(screen.getByRole("button", { name: "Done" }));
expect(closeSpy).toHaveBeenCalled();
});
it("shows parameters for an action", async () => {
setup({
dashcard: actionDashcardWithAction,
......
......@@ -6,6 +6,7 @@ import type {
ActionFormInitialValues,
ParametersForActionExecution,
WritebackAction,
WritebackParameter,
} from "metabase-types/api";
import {
......@@ -22,27 +23,28 @@ type Opts = {
};
const INITIAL_VALUES = {};
const DEFAULT_PARAMETERS: WritebackParameter[] = [];
function useActionForm({
action,
action: { parameters = DEFAULT_PARAMETERS, visualization_settings },
initialValues = INITIAL_VALUES,
prefetchesInitialValues,
}: Opts) {
const fieldSettings = useMemo(() => {
return getOrGenerateFieldSettings(
action.parameters,
action.visualization_settings?.fields,
parameters,
visualization_settings?.fields,
);
}, [action]);
}, [parameters, visualization_settings]);
const form = useMemo(
() => getForm(action.parameters, fieldSettings),
[action.parameters, fieldSettings],
() => getForm(parameters, fieldSettings),
[parameters, fieldSettings],
);
const validationSchema = useMemo(
() => getFormValidationSchema(action.parameters, fieldSettings),
[action.parameters, fieldSettings],
() => getFormValidationSchema(parameters, fieldSettings),
[parameters, fieldSettings],
);
const cleanedInitialValues = useMemo(() => {
......
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