diff --git a/frontend/src/metabase/query_builder/actions.js b/frontend/src/metabase/query_builder/actions.js index 8dde488efc75adb69edd9c5193b55e8b573cb5e3..63bad7149cfb1331402276368ac196ab6c153ac4 100644 --- a/frontend/src/metabase/query_builder/actions.js +++ b/frontend/src/metabase/query_builder/actions.js @@ -633,9 +633,13 @@ export const updateQuestion = (newQuestion, { doNotClearNameAndId } = {}) => { export const API_CREATE_QUESTION = "metabase/qb/API_CREATE_QUESTION"; export const apiCreateQuestion = (question) => { return async (dispatch, getState) => { + // Needed for persisting visualization columns for pulses/alerts, see #6749 + const series = getTransformedSeries(getState()) + const questionWithVizSettings = series ? getQuestionWithDefaultVisualizationSettings(question, series) : question + let resultsMetadata = getResultsMetadata(getState()) const createdQuestion = await ( - question + questionWithVizSettings .setQuery(question.query().clean()) .setResultsMetadata(resultsMetadata) .apiCreate() @@ -656,9 +660,15 @@ export const apiCreateQuestion = (question) => { export const API_UPDATE_QUESTION = "metabase/qb/API_UPDATE_QUESTION"; export const apiUpdateQuestion = (question) => { return async (dispatch, getState) => { + question = question || getQuestion(getState()) + + // Needed for persisting visualization columns for pulses/alerts, see #6749 + const series = getTransformedSeries(getState()) + const questionWithVizSettings = series ? getQuestionWithDefaultVisualizationSettings(question, series) : question + let resultsMetadata = getResultsMetadata(getState()) const updatedQuestion = await ( - question + questionWithVizSettings .setQuery(question.query().clean()) .setResultsMetadata(resultsMetadata) .apiUpdate() @@ -1065,8 +1075,6 @@ export const queryCompleted = (card, queryResults) => { cardDisplay: getDisplayTypeForCard(card, queryResults), queryResults }) - - dispatch(persistDefaultVisualizationSettings()) }; }; @@ -1076,18 +1084,6 @@ export const queryCompleted = (card, queryResults) => { * * Needed for persisting visualization columns for pulses/alerts, see #6749. */ -export const PERSIST_DEFAULT_VIZ_SETTINGS = "metabase/qb/PERSIST_DEFAULT_VIZ_SETTINGS"; -export const persistDefaultVisualizationSettings = () => { - return (dispatch, getState) => { - const question = getQuestion(getState()) - const series = getTransformedSeries(getState()) - - const updatedQuestion = getQuestionWithDefaultVisualizationSettings(question, series) - if (updatedQuestion !== question) dispatch(updateQuestion(updatedQuestion)) - dispatch.action(PERSIST_DEFAULT_VIZ_SETTINGS) - } -} - const getQuestionWithDefaultVisualizationSettings = (question, series) => { const oldVizSettings = question.visualizationSettings() const newVizSettings = { ...getPersistableDefaultSettings(series), ...oldVizSettings } diff --git a/frontend/src/metabase/query_builder/components/AlertModals.jsx b/frontend/src/metabase/query_builder/components/AlertModals.jsx index 520193ae8f0d8a5b9ed97a2921df3f8f9594b214..84f7eb6efec3e0f148e99d3968844d2e58398d67 100644 --- a/frontend/src/metabase/query_builder/components/AlertModals.jsx +++ b/frontend/src/metabase/query_builder/components/AlertModals.jsx @@ -28,6 +28,7 @@ import MetabaseCookies from "metabase/lib/cookies"; import cxs from 'cxs'; import ChannelSetupModal from "metabase/components/ChannelSetupModal"; import ButtonWithStatus from "metabase/components/ButtonWithStatus"; +import { apiUpdateQuestion } from "metabase/query_builder/actions"; const getScheduleFromChannel = (channel) => _.pick(channel, "schedule_day", "schedule_frame", "schedule_hour", "schedule_type") @@ -43,7 +44,7 @@ const classes = cxs ({ hasLoadedChannelInfo: hasLoadedChannelInfoSelector(state), hasConfiguredAnyChannel: hasConfiguredAnyChannelSelector(state), hasConfiguredEmailChannel: hasConfiguredEmailChannelSelector(state) -}), { createAlert, fetchPulseFormInput }) +}), { createAlert, fetchPulseFormInput, apiUpdateQuestion }) export class CreateAlertModalContent extends Component { props: { onCancel: () => void, @@ -84,10 +85,14 @@ export class CreateAlertModalContent extends Component { onAlertChange = (alert) => this.setState({ alert }) onCreateAlert = async () => { - const { createAlert, onAlertCreated } = this.props + const { createAlert, apiUpdateQuestion, onAlertCreated } = this.props const { alert } = this.state + // Resave the question here (for persisting the x/y axes; see #6749) + await apiUpdateQuestion() + await createAlert(alert) + // should close be triggered manually like this // but the creation notification would appear automatically ...? // OR should the modal visibility be part of QB redux state @@ -498,7 +503,7 @@ export class AlertEditChannels extends Component { // TODO: Not sure how to translate text with formatting properly @connect((state) => ({ question: getQuestion(state), visualizationSettings: getVisualizationSettings(state) })) -class RawDataAlertTip extends Component { +export class RawDataAlertTip extends Component { render() { const display = this.props.question.display() const vizSettings = this.props.visualizationSettings diff --git a/frontend/test/alert/alert.integ.spec.js b/frontend/test/alert/alert.integ.spec.js index e80b44cd78886877db2bd0fda8c1d237a40ad417..6273763a75024769c1709883703bae6f12258455 100644 --- a/frontend/test/alert/alert.integ.spec.js +++ b/frontend/test/alert/alert.integ.spec.js @@ -24,7 +24,8 @@ import { AlertEducationalScreen, AlertSettingToggle, CreateAlertModalContent, - RawDataAlertTip, UpdateAlertModalContent + RawDataAlertTip, + UpdateAlertModalContent } from "metabase/query_builder/components/AlertModals"; import Button from "metabase/components/Button"; import { diff --git a/frontend/test/parameters/parameters.integ.spec.js b/frontend/test/parameters/parameters.integ.spec.js index 4295be3f65e0f86cc490c1c2c31a0dfcfe26fdab..0048da534b65a6d97d5b484ab4478ac376848127 100644 --- a/frontend/test/parameters/parameters.integ.spec.js +++ b/frontend/test/parameters/parameters.integ.spec.js @@ -137,6 +137,7 @@ describe("parameters", () => { expect(fieldFilterVarType.text()).toBe("Field Filter"); click(fieldFilterVarType); + // there's an async error here for some reason await store.waitForActions([UPDATE_TEMPLATE_TAG]); await delay(500); @@ -151,6 +152,7 @@ describe("parameters", () => { // close the template variable sidebar click(tagEditorSidebar.find(".Icon-close")); + // test without the parameter click(app.find(RunButton)); await store.waitForActions([RUN_QUERY, QUERY_COMPLETED])