diff --git a/e2e/test/scenarios/actions/reproductions/32974-linked-parameter-via-url-does-not-work.cy.spec.js b/e2e/test/scenarios/actions/reproductions/32974-linked-parameter-via-url-does-not-work.cy.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..cc93136a593adfb823c9515b99c8da28bb4c7315 --- /dev/null +++ b/e2e/test/scenarios/actions/reproductions/32974-linked-parameter-via-url-does-not-work.cy.spec.js @@ -0,0 +1,172 @@ +import { + restore, + modal, + createAction, + updateDashboardCards, + setActionsEnabledForDB, + undoToast, + getDashboardCard, +} from "e2e/support/helpers"; +import { SAMPLE_DATABASE } from "e2e/support/cypress_sample_database"; +import { SAMPLE_DB_ID } from "e2e/support/cypress_data"; +import { + createMockActionParameter, + createMockParameter, +} from "metabase-types/api/mocks"; + +const { PRODUCTS, PRODUCTS_ID } = SAMPLE_DATABASE; + +const TEST_TABLE = "PRODUCTS"; + +const ID_ACTION_PARAMETER = createMockActionParameter({ + id: "86981cc2-2589-44b5-b559-2c8bbf5bb36a", + name: "ID", + slug: "id", + type: "number/=", + target: ["variable", ["template-tag", "id"]], +}); + +const ID_DASHBOARD_PARAMETER = createMockParameter({ + name: "ID", + slug: "id", + id: "9da7bdd3", + type: "id", + sectionId: "id", +}); + +const DASHBOARD_DETAILS = { + name: "action dashboard", + parameters: [ID_DASHBOARD_PARAMETER], +}; + +const MODEL_DETAILS = { + name: "Products model", + query: { "source-table": PRODUCTS_ID }, + database: SAMPLE_DB_ID, + dataset: true, +}; + +const EXPECTED_UPDATED_VALUE = 999; + +const QUERY_ACTION = { + name: "Query action", + type: "query", + parameters: [ID_ACTION_PARAMETER], + database_id: SAMPLE_DB_ID, + dataset_query: { + type: "native", + native: { + query: `UPDATE ${TEST_TABLE} SET PRICE = ${EXPECTED_UPDATED_VALUE} WHERE ID = {{ ${ID_ACTION_PARAMETER.slug} }}`, + "template-tags": { + [ID_ACTION_PARAMETER.slug]: { + id: ID_ACTION_PARAMETER.id, + "display-name": ID_ACTION_PARAMETER.name, + name: ID_ACTION_PARAMETER.slug, + type: "text", + }, + }, + }, + database: SAMPLE_DB_ID, + }, + visualization_settings: { + fields: { + [ID_ACTION_PARAMETER.id]: { + id: ID_ACTION_PARAMETER.id, + required: true, + fieldType: "number", + inputType: "number", + }, + }, + }, +}; + +describe("Issue 32974", { tags: ["@external", "@actions"] }, () => { + beforeEach(() => { + restore(); + cy.signInAsAdmin(); + cy.createQuestion(MODEL_DETAILS, { + wrapId: true, + idAlias: "modelId", + }); + setActionsEnabledForDB(SAMPLE_DB_ID, true); + }); + + it("can submit query action linked with dashboard parameters (metabase#32974)", () => { + cy.get("@modelId").then(modelId => { + createAction({ ...QUERY_ACTION, model_id: modelId }).then( + ({ body: { id: actionId } }) => { + cy.wrap(actionId).as("actionId"); + }, + ); + }); + + setupDashboard(); + + cy.get("@dashboardId").then(dashboardId => { + cy.visit({ url: `/dashboard/${dashboardId}`, qs: { id: 1 } }); + }); + + cy.log("Execute action"); + cy.button(QUERY_ACTION.name).click(); + modal().button(QUERY_ACTION.name).click(); + + cy.log("Assertions"); + getDashboardCard().findByText(EXPECTED_UPDATED_VALUE).should("exist"); + modal().should("not.exist"); + undoToast().findByText("Query action ran successfully").should("exist"); + }); +}); + +function setupDashboard() { + cy.createDashboard(DASHBOARD_DETAILS).then( + ({ body: { id: dashboardId } }) => { + cy.wrap(dashboardId).as("dashboardId"); + }, + ); + + cy.then(function () { + updateDashboardCards({ + dashboard_id: this.dashboardId, + cards: [ + { + card_id: this.modelId, + // Map dashboard parameter to PRODUCTS.ID + parameter_mappings: [ + { + parameter_id: ID_DASHBOARD_PARAMETER.id, + card_id: this.modelId, + target: ["dimension", ["field-id", PRODUCTS.ID, null]], + }, + ], + }, + { + action_id: this.actionId, + // Visualization settings when we add an action to a dashboard + visualization_settings: { + actionDisplayType: "button", + "button.label": QUERY_ACTION.name, + virtual_card: { + archived: false, + dataset_query: {}, + display: "action", + name: null, + visualization_settings: {}, + }, + }, + size_x: 4, + size_y: 1, + // Map action's ID parameter to dashboard parameter + parameter_mappings: [ + { + parameter_id: ID_DASHBOARD_PARAMETER.id, + target: [ + "variable", + ["template-tag", ID_DASHBOARD_PARAMETER.slug], + ], + }, + ], + }, + ], + }); + }); +} diff --git a/frontend/src/metabase/actions/components/ActionViz/ActionVizForm.tsx b/frontend/src/metabase/actions/components/ActionViz/ActionVizForm.tsx index f381a6bae4b5f6fe65bd074f52cd50d32254a059..d954009a88325b0d12eb839fd5be7ada053901af 100644 --- a/frontend/src/metabase/actions/components/ActionViz/ActionVizForm.tsx +++ b/frontend/src/metabase/actions/components/ActionViz/ActionVizForm.tsx @@ -140,7 +140,7 @@ function ActionVizForm({ action={action} mappedParameters={mappedParameters} initialValues={initialValues} - prefetchesInitialValues + prefetchesInitialValues={shouldPrefetch} title={title} showEmptyState={shouldPrefetch && !hasPrefetchedValues} showConfirmMessage={showConfirmMessage} @@ -180,7 +180,7 @@ function ActionVizForm({ action={action} mappedParameters={mappedParameters} initialValues={initialValues} - prefetchesInitialValues + prefetchesInitialValues={shouldPrefetch} onSubmit={onSubmit} onSubmitSuccess={handleSubmitSuccess} />