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

Implement drill through from and between transient dashboards

parent cb1a51a6
Branches
Tags
No related merge requests found
......@@ -14,7 +14,7 @@ import NativeQuery from "./queries/NativeQuery";
import { memoize } from "metabase-lib/lib/utils";
import * as Card_DEPRECATED from "metabase/lib/card";
import { getParametersWithExtras } from "metabase/meta/Card";
import { getParametersWithExtras, isTransientId } from "metabase/meta/Card";
import {
summarize,
......@@ -382,6 +382,25 @@ export default class Question {
: Urls.question(this.id(), "");
}
getAutomaticDashboardUrl(filters /*?: Filter[] = []*/) {
let cellQuery = "";
if (filters.length > 0) {
const mbqlFilter = filters.length > 1 ? ["and", ...filters] : filters[0];
cellQuery = `/cell/${Card_DEPRECATED.utf8_to_b64url(
JSON.stringify(mbqlFilter),
)}`;
}
const questionId = this.id();
if (questionId != null && !isTransientId(questionId)) {
return `/auto/dashboard/question/${questionId}${cellQuery}`;
} else {
const adHocQuery = Card_DEPRECATED.utf8_to_b64url(
JSON.stringify(this.card().dataset_query),
);
return `/auto/dashboard/adhoc/${adHocQuery}${cellQuery}`;
}
}
setResultsMetadata(resultsMetadata) {
let metadataColumns = resultsMetadata && resultsMetadata.columns;
let metadataChecksum = resultsMetadata && resultsMetadata.checksum;
......
......@@ -12,6 +12,8 @@ import { Dashboard } from "./Dashboard";
import DashboardData from "metabase/dashboard/hoc/DashboardData";
import Parameters from "metabase/parameters/components/Parameters";
import { getMetadata } from "metabase/selectors/metadata";
import { DashboardApi } from "metabase/services";
import * as Urls from "metabase/lib/urls";
......@@ -65,6 +67,7 @@ const getDashboardId = (state, { params: { splat } }) =>
`/auto/dashboard/${splat}`;
const mapStateToProps = (state, props) => ({
metadata: getMetadata(state),
dashboardId: getDashboardId(state, props),
});
......
......@@ -44,14 +44,7 @@ export class Dashboard extends Component {
className={cx("Dashboard p1 flex-full")}
loading={!dashboard}
>
{() => (
<DashboardGrid
{...this.props}
className={"spread"}
// Don't allow clicking titles on public dashboards
navigateToNewCardFromDashboard={null}
/>
)}
{() => <DashboardGrid {...this.props} className={"spread"} />}
</LoadingAndErrorWrapper>
);
}
......
......@@ -214,6 +214,10 @@ export function applyParameters(
return datasetQuery;
}
export function isTransientId(id: ?any) {
return id != null && typeof id === "string" && isNaN(parseInt(id));
}
/** returns a question URL with parameters added to query string or MBQL filters */
export function questionUrlWithParameters(
card: Card,
......@@ -240,6 +244,7 @@ export function questionUrlWithParameters(
// If we have a clean question without parameters applied, don't add the dataset query hash
if (
!cardIsDirty &&
!isTransientId(card.id) &&
datasetQuery.parameters &&
datasetQuery.parameters.length === 0
) {
......@@ -268,5 +273,13 @@ export function questionUrlWithParameters(
console.warn("UNHANDLED PARAMETER", datasetParameter);
}
}
if (isTransientId(card.id)) {
card.id = null;
}
if (isTransientId(card.original_card_id)) {
card.original_card_id = null;
}
return Urls.question(null, card.dataset_query ? card : undefined, query);
}
/* @flow */
import { inflect } from "metabase/lib/formatting";
import { utf8_to_b64url } from "metabase/lib/card";
import StructuredQuery from "metabase-lib/lib/queries/StructuredQuery";
import { t } from "c-3po";
......@@ -16,11 +15,6 @@ export default ({ question, clicked }: ClickActionProps): ClickAction[] => {
return [];
}
// saved questions only, for now
if (question.id() == null) {
return [];
}
// questions with a breakout
const dimensions = (clicked && clicked.dimensions) || [];
if (!clicked || dimensions.length === 0) {
......@@ -37,9 +31,7 @@ export default ({ question, clicked }: ClickActionProps): ClickAction[] => {
.drillUnderlyingRecords(dimensions)
.query()
.filters();
const filter = filters.length > 1 ? ["and", ...filters] : filters[0];
const cellQuery = utf8_to_b64url(JSON.stringify(filter));
return `/auto/dashboard/question/${question.id()}/cell/${cellQuery}`;
return question.getAutomaticDashboardUrl(filters);
},
},
];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment