-
Ryan Laurie authored
* derive parameter types from form settings on save * update template tag types with parameter types * improve tests * pass action visualization settings to actionParametersInputForm
Ryan Laurie authored* derive parameter types from form settings on save * update template tag types with parameter types * improve tests * pass action visualization settings to actionParametersInputForm
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ActionParametersInputForm.tsx 2.43 KiB
import React, { useCallback, useMemo } from "react";
import { connect } from "react-redux";
import { t } from "ttag";
import Form from "metabase/containers/Form";
import {
getFormFieldForParameter,
getSubmitButtonLabel,
} from "metabase/writeback/components/ActionCreator/FormCreator";
import type {
ArbitraryParameterForActionExecution,
WritebackParameter,
WritebackAction,
} from "metabase-types/api";
import type { Parameter, ParameterId } from "metabase-types/types/Parameter";
import type { Dispatch, ReduxAction } from "metabase-types/store";
interface Props {
missingParameters: WritebackParameter[];
action: WritebackAction;
onSubmit: (parameters: ArbitraryParameterForActionExecution[]) => ReduxAction;
onSubmitSuccess: () => void;
dispatch: Dispatch;
}
function getActionParameterType(parameter: Parameter) {
const { type } = parameter;
if (type === "category") {
return "string/=";
}
return type;
}
function formatParametersBeforeSubmit(
values: Record<ParameterId, string | number>,
missingParameters: WritebackParameter[],
) {
const formattedParams: ArbitraryParameterForActionExecution[] = [];
Object.keys(values).forEach(parameterId => {
const parameter = missingParameters.find(
parameter => parameter.id === parameterId,
);
if (parameter) {
formattedParams.push({
value: values[parameterId],
type: getActionParameterType(parameter),
target: parameter.target,
});
}
});
return formattedParams;
}
function ActionParametersInputForm({
missingParameters,
action,
dispatch,
onSubmit,
onSubmitSuccess,
}: Props) {
const fieldSettings = useMemo(
() => action.visualization_settings?.fields ?? {},
[action],
);
const form = useMemo(() => {
return {
fields: missingParameters.map(param =>
getFormFieldForParameter(param, fieldSettings[param.id]),
),
};
}, [missingParameters, fieldSettings]);
const handleSubmit = useCallback(
params => {
const formattedParams = formatParametersBeforeSubmit(
params,
missingParameters,
);
dispatch(onSubmit(formattedParams));
onSubmitSuccess();
},
[missingParameters, onSubmit, onSubmitSuccess, dispatch],
);
const submitButtonLabel = getSubmitButtonLabel(action);
return (
<Form form={form} onSubmit={handleSubmit} submitTitle={submitButtonLabel} />
);
}
export default connect()(ActionParametersInputForm);