fix(dashboard): copy permalink to dashboard chart (#19772)

* fix(dashboard): copy permalink to dashboard chart

* lint

* address comments
This commit is contained in:
Ville Brofeldt 2022-04-19 22:34:41 +03:00 committed by GitHub
parent a6f46013d9
commit e061955fd0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 28 deletions

View File

@ -57,11 +57,11 @@ class URLShortLinkButton extends React.Component {
if (this.props.dashboardId) {
getFilterValue(this.props.dashboardId, nativeFiltersKey)
.then(filterState =>
getDashboardPermalink(
String(this.props.dashboardId),
getDashboardPermalink({
dashboardId: this.props.dashboardId,
filterState,
this.props.anchorLinkId,
)
hash: this.props.anchorLinkId,
})
.then(this.onShortUrlSuccess)
.catch(this.props.addDangerToast),
)

View File

@ -213,6 +213,8 @@ class SliceHeaderControls extends React.PureComponent<
render() {
const {
componentId,
dashboardId,
slice,
isFullSize,
cachedDttm = [],
@ -221,7 +223,6 @@ class SliceHeaderControls extends React.PureComponent<
addDangerToast = () => {},
supersetCanShare = false,
isCached = [],
formData,
} = this.props;
const crossFilterItems = getChartMetadataRegistry().items;
const isTable = slice.viz_type === 'table';
@ -310,13 +311,14 @@ class SliceHeaderControls extends React.PureComponent<
{supersetCanShare && (
<ShareMenuItems
dashboardId={dashboardId}
dashboardComponentId={componentId}
copyMenuItemTitle={t('Copy permalink to clipboard')}
emailMenuItemTitle={t('Share permalink by email')}
emailSubject={t('Superset chart')}
emailBody={t('Check out this chart: ')}
addSuccessToast={addSuccessToast}
addDangerToast={addDangerToast}
formData={formData}
/>
)}

View File

@ -18,14 +18,10 @@
*/
import React from 'react';
import copyTextToClipboard from 'src/utils/copy';
import { t, logging, QueryFormData } from '@superset-ui/core';
import { t, logging } from '@superset-ui/core';
import { Menu } from 'src/components/Menu';
import {
getChartPermalink,
getDashboardPermalink,
getUrlParam,
} from 'src/utils/urlUtils';
import { RESERVED_DASHBOARD_URL_PARAMS, URL_PARAMS } from 'src/constants';
import { getDashboardPermalink, getUrlParam } from 'src/utils/urlUtils';
import { URL_PARAMS } from 'src/constants';
import { getFilterValue } from 'src/dashboard/components/nativeFilters/FilterBar/keyValue';
interface ShareMenuItemProps {
@ -36,8 +32,8 @@ interface ShareMenuItemProps {
emailBody: string;
addDangerToast: Function;
addSuccessToast: Function;
dashboardId?: string;
formData?: Pick<QueryFormData, 'slice_id' | 'datasource'>;
dashboardId: string | number;
dashboardComponentId?: string;
}
const ShareMenuItems = (props: ShareMenuItemProps) => {
@ -49,23 +45,21 @@ const ShareMenuItems = (props: ShareMenuItemProps) => {
addDangerToast,
addSuccessToast,
dashboardId,
formData,
dashboardComponentId,
...rest
} = props;
async function generateUrl() {
// chart
if (formData) {
// we need to remove reserved dashboard url params
return getChartPermalink(formData, RESERVED_DASHBOARD_URL_PARAMS);
}
// dashboard
const nativeFiltersKey = getUrlParam(URL_PARAMS.nativeFiltersKey);
let filterState = {};
if (nativeFiltersKey && dashboardId) {
filterState = await getFilterValue(dashboardId, nativeFiltersKey);
}
return getDashboardPermalink(String(dashboardId), filterState);
return getDashboardPermalink({
dashboardId,
filterState,
hash: dashboardComponentId,
});
}
async function onCopyLink() {

View File

@ -154,11 +154,15 @@ export function getChartPermalink(
});
}
export function getDashboardPermalink(
dashboardId: string,
filterState: JsonObject,
hash?: string,
) {
export function getDashboardPermalink({
dashboardId,
filterState,
hash, // the anchor part of the link which corresponds to the tab/chart id
}: {
dashboardId: string | number;
filterState: JsonObject;
hash?: string;
}) {
// only encode filter box state if non-empty
return getPermalink(`/api/v1/dashboard/${dashboardId}/permalink`, {
filterState,