Skip to content
Snippets Groups Projects
Unverified Commit c1928e1f authored by Ryan Laurie's avatar Ryan Laurie Committed by GitHub
Browse files

Action Creator 9: Inline Forms (#25567)

* add inline forms for actions

* better style names
parent 79c7b5f1
No related branches found
No related tags found
No related merge requests found
...@@ -26,6 +26,7 @@ import { StyledButton } from "./ActionButton.styled"; ...@@ -26,6 +26,7 @@ import { StyledButton } from "./ActionButton.styled";
import DefaultActionButton from "./DefaultActionButton"; import DefaultActionButton from "./DefaultActionButton";
import ImplicitActionButton from "./ImplicitActionButton"; import ImplicitActionButton from "./ImplicitActionButton";
import ActionForm from "./ActionForm";
interface ActionProps extends VisualizationProps { interface ActionProps extends VisualizationProps {
dashcard: ActionDashboardCard; dashcard: ActionDashboardCard;
...@@ -44,6 +45,11 @@ function ActionComponent({ ...@@ -44,6 +45,11 @@ function ActionComponent({
onVisualizationClick, onVisualizationClick,
parameterValues, parameterValues,
}: ActionProps) { }: ActionProps) {
const dashcardSettings = dashcard.visualization_settings;
const actionSettings = dashcard.action?.visualization_settings;
const actionDisplayType =
dashcardSettings?.actionDisplayType ?? actionSettings?.type ?? "modal";
const dashcardParamValues = useMemo( const dashcardParamValues = useMemo(
() => getDashcardParamValues(dashcard, parameterValues), () => getDashcardParamValues(dashcard, parameterValues),
[dashcard, parameterValues], [dashcard, parameterValues],
...@@ -59,6 +65,9 @@ function ActionComponent({ ...@@ -59,6 +65,9 @@ function ActionComponent({
); );
}, [dashcard, dashcardParamValues]); }, [dashcard, dashcardParamValues]);
const shouldDisplayButton =
actionDisplayType !== "inline" || !missingParameters.length;
const onSubmit = useCallback( const onSubmit = useCallback(
(extra_parameters: ArbitraryParameterForActionExecution[]) => (extra_parameters: ArbitraryParameterForActionExecution[]) =>
executeRowAction({ executeRowAction({
...@@ -67,23 +76,33 @@ function ActionComponent({ ...@@ -67,23 +76,33 @@ function ActionComponent({
parameters: dashcardParamValues, parameters: dashcardParamValues,
extra_parameters, extra_parameters,
dispatch, dispatch,
shouldToast: true, shouldToast: shouldDisplayButton,
}), }),
[dashboard, dashcard, dashcardParamValues, dispatch], [dashboard, dashcard, dashcardParamValues, dispatch, shouldDisplayButton],
); );
if (isImplicitActionButton(dashcard)) { if (isImplicitActionButton(dashcard)) {
return <ImplicitActionButton isSettings={isSettings} settings={settings} />; return <ImplicitActionButton isSettings={isSettings} settings={settings} />;
} }
if (shouldDisplayButton) {
return (
<DefaultActionButton
onSubmit={onSubmit}
missingParameters={missingParameters}
isSettings={isSettings}
settings={settings}
getExtraDataForClick={getExtraDataForClick}
onVisualizationClick={onVisualizationClick}
/>
);
}
return ( return (
<DefaultActionButton <ActionForm
onSubmit={onSubmit} onSubmit={onSubmit}
missingParameters={missingParameters} missingParameters={missingParameters}
isSettings={isSettings} action={dashcard.action as WritebackQueryAction}
settings={settings}
getExtraDataForClick={getExtraDataForClick}
onVisualizationClick={onVisualizationClick}
/> />
); );
} }
......
import styled from "@emotion/styled";
import { space } from "metabase/styled-components/theme";
import { color } from "metabase/lib/colors";
export const DataAppPageFormWrapper = styled.div`
padding: 1.5rem;
background-color: ${color("white")};
border-radius: ${space(1)};
border: 1px solid ${color("border")};
overflow-y: auto;
`;
export const DataAppPageFormTitle = styled.h4`
margin-bottom: 1.5rem;
`;
import React from "react";
import type {
ArbitraryParameterForActionExecution,
WritebackQueryAction,
WritebackParameter,
OnSubmitActionForm,
} from "metabase-types/api";
import ActionParametersInputForm from "../../containers/ActionParametersInputForm";
import {
DataAppPageFormWrapper,
DataAppPageFormTitle,
} from "./ActionForm.styled";
interface ActionFormProps {
onSubmit: OnSubmitActionForm;
missingParameters: WritebackParameter[];
action: WritebackQueryAction;
}
function ActionForm({ onSubmit, missingParameters, action }: ActionFormProps) {
return (
<DataAppPageFormWrapper>
<DataAppPageFormTitle>{action.name}</DataAppPageFormTitle>
<ActionParametersInputForm
onSubmit={onSubmit}
missingParameters={missingParameters}
action={action}
/>
</DataAppPageFormWrapper>
);
}
export default ActionForm;
...@@ -11,7 +11,7 @@ export default Object.assign(Action, { ...@@ -11,7 +11,7 @@ export default Object.assign(Action, {
hidden: true, hidden: true,
supportPreviewing: false, supportPreviewing: false,
minSize: { width: 2, height: 1 }, minSize: { width: 1, height: 1 },
checkRenderable: () => true, checkRenderable: () => true,
isSensible: () => false, isSensible: () => false,
...@@ -25,9 +25,8 @@ export default Object.assign(Action, { ...@@ -25,9 +25,8 @@ export default Object.assign(Action, {
}, },
actionDisplayType: { actionDisplayType: {
section: t`Display`, section: t`Display`,
title: t`Action Display`, title: t`Action Form Display`,
widget: "radio", widget: "radio",
default: "inline",
props: { props: {
options: [ options: [
{ name: t`Inline`, value: "inline" }, { name: t`Inline`, value: "inline" },
......
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