Skip to content
Snippets Groups Projects
Unverified Commit b6153e75 authored by Tom Robinson's avatar Tom Robinson
Browse files

Merge branch 'dashboard-drill' of github.com:metabase/metabase into dashboard-drill

parents 3483063e 1347e26f
No related branches found
No related tags found
No related merge requests found
...@@ -60,7 +60,7 @@ export default class DashCard extends Component { ...@@ -60,7 +60,7 @@ export default class DashCard extends Component {
isEditingParameter, isEditingParameter,
onAddSeries, onAddSeries,
onRemove, onRemove,
onChangeCardAndRun, navigateToNewCard,
metadata metadata
} = this.props; } = this.props;
...@@ -134,10 +134,8 @@ export default class DashCard extends Component { ...@@ -134,10 +134,8 @@ export default class DashCard extends Component {
onUpdateVisualizationSettings={this.props.onUpdateVisualizationSettings} onUpdateVisualizationSettings={this.props.onUpdateVisualizationSettings}
replacementContent={isEditingParameter && <DashCardParameterMapper dashcard={dashcard} />} replacementContent={isEditingParameter && <DashCardParameterMapper dashcard={dashcard} />}
metadata={metadata} metadata={metadata}
onChangeCardAndRun={(card) => { onChangeCardAndRun={(card: UnsavedCard|Card) => {
// ensure the original card ID is included to track lineage this.props.navigateToNewCard(card, dashcard)
card = { ...card, id: series[0].card.id };
onChangeCardAndRun(card, dashcard);
}} }}
/> />
</div> </div>
......
...@@ -197,7 +197,7 @@ export default class DashboardGrid extends Component { ...@@ -197,7 +197,7 @@ export default class DashboardGrid extends Component {
onAddSeries={this.onDashCardAddSeries.bind(this, dc)} onAddSeries={this.onDashCardAddSeries.bind(this, dc)}
onUpdateVisualizationSettings={this.props.onUpdateDashCardVisualizationSettings.bind(this, dc.id)} onUpdateVisualizationSettings={this.props.onUpdateDashCardVisualizationSettings.bind(this, dc.id)}
onReplaceAllVisualizationSettings={this.props.onReplaceAllDashCardVisualizationSettings.bind(this, dc.id)} onReplaceAllVisualizationSettings={this.props.onReplaceAllDashCardVisualizationSettings.bind(this, dc.id)}
onChangeCardAndRun={this.props.onChangeCardAndRun} navigateToNewCard={this.props.navigateToNewCard}
metadata={this.props.metadata} metadata={this.props.metadata}
/> />
) )
......
...@@ -14,7 +14,7 @@ import { applyParameters, questionUrlWithParameters } from "metabase/meta/Card"; ...@@ -14,7 +14,7 @@ import { applyParameters, questionUrlWithParameters } from "metabase/meta/Card";
import { getParametersBySlug } from "metabase/meta/Parameter"; import { getParametersBySlug } from "metabase/meta/Parameter";
import type { DashboardWithCards, DashCard, DashCardId } from "metabase/meta/types/Dashboard"; import type { DashboardWithCards, DashCard, DashCardId } from "metabase/meta/types/Dashboard";
import type { Card, CardId } from "metabase/meta/types/Card"; import type { UnsavedCard, Card, CardId } from "metabase/meta/types/Card";
import Utils from "metabase/lib/utils"; import Utils from "metabase/lib/utils";
import { getPositionForNewDashCard } from "metabase/lib/dashboard_grid"; import { getPositionForNewDashCard } from "metabase/lib/dashboard_grid";
...@@ -55,7 +55,6 @@ export const SET_DASHCARD_ATTRIBUTES = "metabase/dashboard/SET_DASHCARD_ATTRIBUT ...@@ -55,7 +55,6 @@ export const SET_DASHCARD_ATTRIBUTES = "metabase/dashboard/SET_DASHCARD_ATTRIBUT
export const UPDATE_DASHCARD_VISUALIZATION_SETTINGS = "metabase/dashboard/UPDATE_DASHCARD_VISUALIZATION_SETTINGS"; export const UPDATE_DASHCARD_VISUALIZATION_SETTINGS = "metabase/dashboard/UPDATE_DASHCARD_VISUALIZATION_SETTINGS";
export const REPLACE_ALL_DASHCARD_VISUALIZATION_SETTINGS = "metabase/dashboard/REPLACE_ALL_DASHCARD_VISUALIZATION_SETTINGS"; export const REPLACE_ALL_DASHCARD_VISUALIZATION_SETTINGS = "metabase/dashboard/REPLACE_ALL_DASHCARD_VISUALIZATION_SETTINGS";
export const UPDATE_DASHCARD_ID = "metabase/dashboard/UPDATE_DASHCARD_ID" export const UPDATE_DASHCARD_ID = "metabase/dashboard/UPDATE_DASHCARD_ID"
export const SAVE_DASHCARD = "metabase/dashboard/SAVE_DASHCARD";
export const FETCH_DASHBOARD_CARD_DATA = "metabase/dashboard/FETCH_DASHBOARD_CARD_DATA"; export const FETCH_DASHBOARD_CARD_DATA = "metabase/dashboard/FETCH_DASHBOARD_CARD_DATA";
export const FETCH_CARD_DATA = "metabase/dashboard/FETCH_CARD_DATA"; export const FETCH_CARD_DATA = "metabase/dashboard/FETCH_CARD_DATA";
...@@ -67,8 +66,6 @@ export const REVERT_TO_REVISION = "metabase/dashboard/REVERT_TO_REVISION"; ...@@ -67,8 +66,6 @@ export const REVERT_TO_REVISION = "metabase/dashboard/REVERT_TO_REVISION";
export const MARK_NEW_CARD_SEEN = "metabase/dashboard/MARK_NEW_CARD_SEEN"; export const MARK_NEW_CARD_SEEN = "metabase/dashboard/MARK_NEW_CARD_SEEN";
export const FETCH_DATABASE_METADATA = "metabase/dashboard/FETCH_DATABASE_METADATA";
export const SET_EDITING_PARAMETER_ID = "metabase/dashboard/SET_EDITING_PARAMETER_ID"; export const SET_EDITING_PARAMETER_ID = "metabase/dashboard/SET_EDITING_PARAMETER_ID";
export const ADD_PARAMETER = "metabase/dashboard/ADD_PARAMETER"; export const ADD_PARAMETER = "metabase/dashboard/ADD_PARAMETER";
export const REMOVE_PARAMETER = "metabase/dashboard/REMOVE_PARAMETER"; export const REMOVE_PARAMETER = "metabase/dashboard/REMOVE_PARAMETER";
...@@ -496,10 +493,13 @@ export const deletePublicLink = createAction(DELETE_PUBLIC_LINK, async ({ id }) ...@@ -496,10 +493,13 @@ export const deletePublicLink = createAction(DELETE_PUBLIC_LINK, async ({ id })
/** All navigation actions from dashboards to cards (e.x. clicking a title, drill through) /** All navigation actions from dashboards to cards (e.x. clicking a title, drill through)
* should go through this action, which merges any currently applied dashboard filters * should go through this action, which merges any currently applied dashboard filters
* into the new card / URL parmeters. * into the new card / URL parameters.
*/ */
const CHANGE_CARD_AND_RUN = "metabase/database/CHANGE_CARD_AND_RUN";
export const onChangeCardAndRun = createThunkAction(CHANGE_CARD_AND_RUN, (card, dashcard = null) => // TODO Atte Keinänen 5/2/17: This could be combined with `setCardAndRun` of query_builder/actions.js
// Having two separate actions for very similar behavior was a source of initial confusion for me
const NAVIGATE_TO_NEW_CARD = "metabase/dashboard/NAVIGATE_TO_NEW_CARD";
export const navigateToNewCard = createThunkAction(NAVIGATE_TO_NEW_CARD, (card: UnsavedCard|Card, dashcard: DashCard) =>
(dispatch, getState) => { (dispatch, getState) => {
const { metadata } = getState(); const { metadata } = getState();
const { dashboardId, dashboards, parameterValues } = getState().dashboard; const { dashboardId, dashboards, parameterValues } = getState().dashboard;
......
...@@ -6,15 +6,20 @@ import type { Parameter, ParameterInstance } from "./Parameter"; ...@@ -6,15 +6,20 @@ import type { Parameter, ParameterInstance } from "./Parameter";
export type CardId = number; export type CardId = number;
export type Card = { export type UnsavedCard = {
id: CardId,
name: ?string,
description: ?string,
dataset_query: DatasetQuery, dataset_query: DatasetQuery,
display: string, display: string,
visualization_settings: VisualizationSettings, visualization_settings: VisualizationSettings,
parameters?: Array<Parameter> parameters?: Array<Parameter>
}; }
export type SavedCardFields = {
id: CardId,
name: ?string,
description: ?string,
}
export type Card = UnsavedCard & SavedCardFields;
export type StructuredDatasetQuery = { export type StructuredDatasetQuery = {
type: "query", type: "query",
......
...@@ -156,6 +156,8 @@ export const initializeQB = createThunkAction(INITIALIZE_QB, (location, params) ...@@ -156,6 +156,8 @@ export const initializeQB = createThunkAction(INITIALIZE_QB, (location, params)
if (params.cardId || serializedCard) { if (params.cardId || serializedCard) {
// existing card being loaded // existing card being loaded
try { try {
// TODO: Don't load a card if a card is passed in the hash? Speeds up the page load.
if (params.cardId) { if (params.cardId) {
card = await loadCard(params.cardId); card = await loadCard(params.cardId);
......
...@@ -30,7 +30,7 @@ import cx from "classnames"; ...@@ -30,7 +30,7 @@ import cx from "classnames";
export const ERROR_MESSAGE_GENERIC = "There was a problem displaying this chart."; export const ERROR_MESSAGE_GENERIC = "There was a problem displaying this chart.";
export const ERROR_MESSAGE_PERMISSION = "Sorry, you don't have permission to see this card." export const ERROR_MESSAGE_PERMISSION = "Sorry, you don't have permission to see this card."
import type { Card as CardObject, VisualizationSettings } from "metabase/meta/types/Card"; import type {Card as CardObject, UnsavedCard, VisualizationSettings} from "metabase/meta/types/Card";
import type { HoverObject, ClickObject, Series } from "metabase/meta/types/Visualization"; import type { HoverObject, ClickObject, Series } from "metabase/meta/types/Visualization";
import type { Metadata } from "metabase/meta/types/Metadata"; import type { Metadata } from "metabase/meta/types/Metadata";
...@@ -221,6 +221,23 @@ export default class Visualization extends Component<*, Props, State> { ...@@ -221,6 +221,23 @@ export default class Visualization extends Component<*, Props, State> {
}, 100) }, 100)
} }
handleOnChangeCardAndRun = (card: UnsavedCard) => {
// If the current card has a name, carry that information to the new card for showing lineage
// The card description is omitted because it isn't relevant for showing the lineage
const { series } = this.state
const currentlyInSavedCard = series[0] && series[0].card && series[0].card.id
if (currentlyInSavedCard) {
const savedCard: CardObject = {
...card,
id: series[0].card.id,
};
this.props.onChangeCardAndRun(savedCard)
} else {
this.props.onChangeCardAndRun(card)
}
}
onRender = ({ yAxisSplit, warnings = [] } = {}) => { onRender = ({ yAxisSplit, warnings = [] } = {}) => {
this.setState({ yAxisSplit, warnings }); this.setState({ yAxisSplit, warnings });
} }
...@@ -230,7 +247,7 @@ export default class Visualization extends Component<*, Props, State> { ...@@ -230,7 +247,7 @@ export default class Visualization extends Component<*, Props, State> {
} }
render() { render() {
const { actionButtons, className, showTitle, isDashboard, width, height, errorIcon, isSlow, expectedDuration, replacementContent, onChangeCardAndRun } = this.props; const { actionButtons, className, showTitle, isDashboard, width, height, errorIcon, isSlow, expectedDuration, replacementContent } = this.props;
const { series, CardVisualization } = this.state; const { series, CardVisualization } = this.state;
const small = width < 330; const small = width < 330;
...@@ -315,7 +332,7 @@ export default class Visualization extends Component<*, Props, State> { ...@@ -315,7 +332,7 @@ export default class Visualization extends Component<*, Props, State> {
actionButtons={extra} actionButtons={extra}
description={settings["card.description"]} description={settings["card.description"]}
settings={settings} settings={settings}
onChangeCardAndRun={onChangeCardAndRun} onChangeCardAndRun={this.handleOnChangeCardAndRun}
/> />
</div> </div>
: null : null
...@@ -384,7 +401,7 @@ export default class Visualization extends Component<*, Props, State> { ...@@ -384,7 +401,7 @@ export default class Visualization extends Component<*, Props, State> {
onRenderError={this.onRenderError} onRenderError={this.onRenderError}
onRender={this.onRender} onRender={this.onRender}
gridSize={gridSize} gridSize={gridSize}
onChangeCardAndRun={onChangeCardAndRun} onChangeCardAndRun={this.handleOnChangeCardAndRun}
/> />
} }
<ChartTooltip <ChartTooltip
...@@ -394,7 +411,7 @@ export default class Visualization extends Component<*, Props, State> { ...@@ -394,7 +411,7 @@ export default class Visualization extends Component<*, Props, State> {
<ChartClickActions <ChartClickActions
clicked={clicked} clicked={clicked}
clickActions={clickActions} clickActions={clickActions}
onChangeCardAndRun={this.props.onChangeCardAndRun} onChangeCardAndRun={this.handleOnChangeCardAndRun}
onClose={() => this.setState({ clicked: null })} onClose={() => this.setState({ clicked: null })}
/> />
</div> </div>
......
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