PublicDashboards: Use API to render public dashboard badge (#107638)

* PublicDashboards: Use API to render public dashboard badge

* i18n

* Keine console bitte

* Update public/app/features/dashboard-scene/scene/NavToolbarActions.tsx

* Update tests
This commit is contained in:
Dominik Prokop
2025-07-08 13:11:25 +02:00
committed by GitHub
parent 285c69c487
commit 365234c2fe
5 changed files with 36 additions and 56 deletions
@@ -5,17 +5,7 @@ import { GrafanaTheme2, store } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
import { Trans, t } from '@grafana/i18n';
import { config, locationService } from '@grafana/runtime';
import {
Badge,
Button,
ButtonGroup,
Dropdown,
Icon,
Menu,
ToolbarButton,
ToolbarButtonRow,
useStyles2,
} from '@grafana/ui';
import { Button, ButtonGroup, Dropdown, Icon, Menu, ToolbarButton, ToolbarButtonRow, useStyles2 } from '@grafana/ui';
import { AppChromeUpdate } from 'app/core/components/AppChrome/AppChromeUpdate';
import { NavToolbarSeparator } from 'app/core/components/AppChrome/NavToolbar/NavToolbarSeparator';
import grafanaConfig from 'app/core/config';
@@ -39,6 +29,7 @@ import { GoToSnapshotOriginButton } from './GoToSnapshotOriginButton';
import ManagedDashboardNavBarBadge from './ManagedDashboardNavBarBadge';
import { LeftActions } from './new-toolbar/LeftActions';
import { RightActions } from './new-toolbar/RightActions';
import { PublicDashboardBadge } from './new-toolbar/actions/PublicDashboardBadge';
interface Props {
dashboard: DashboardScene;
@@ -119,23 +110,13 @@ export function ToolbarActions({ dashboard }: Props) {
},
});
if (meta.publicDashboardEnabled) {
toolbarActions.push({
group: 'icon-actions',
condition: uid && Boolean(meta.canStar) && isShowingDashboard && !isEditing,
render: () => {
return (
<Badge
color="blue"
text={t('dashboard.toolbar.public-dashboard', 'Public')}
key="public-dashboard-button-badge"
className={styles.publicBadge}
data-testid={selectors.pages.Dashboard.DashNav.publicDashboardTag}
/>
);
},
});
}
toolbarActions.push({
group: 'icon-actions',
condition: uid && Boolean(meta.canStar) && isShowingDashboard && !isEditing,
render: () => {
return <PublicDashboardBadge key="public-dashboard-badge" dashboard={dashboard} />;
},
});
if (dashboard.isManaged() && meta.canEdit) {
toolbarActions.push({
@@ -16,7 +16,6 @@ export const LeftActions = ({ dashboard }: { dashboard: DashboardScene }) => {
const isViewingPanel = Boolean(viewPanelScene);
const isEditingDashboard = Boolean(isEditing);
const isEditingPanel = Boolean(editPanel);
const isPublicDashboard = Boolean(meta.publicDashboardEnabled);
const hasUid = Boolean(uid);
const canEdit = Boolean(meta.canEdit);
const canStar = Boolean(meta.canStar);
@@ -37,7 +36,7 @@ export const LeftActions = ({ dashboard }: { dashboard: DashboardScene }) => {
key: 'public-dashboard-badge',
component: PublicDashboardBadge,
group: 'actions',
condition: isPublicDashboard && hasUid && canStar && isShowingDashboard && !isEditingDashboard,
condition: hasUid && canStar && isShowingDashboard && !isEditingDashboard,
},
{
key: 'managed-dashboard-badge',
@@ -3,10 +3,32 @@ import { css } from '@emotion/css';
import { selectors } from '@grafana/e2e-selectors';
import { t } from '@grafana/i18n';
import { Badge, useStyles2 } from '@grafana/ui';
import { useGetPublicDashboardQuery } from 'app/features/dashboard/api/publicDashboardApi';
import { ToolbarActionProps } from '../types';
export const PublicDashboardBadge = ({}: ToolbarActionProps) => {
export const PublicDashboardBadge = ({ dashboard }: ToolbarActionProps) => {
if (!dashboard.state.uid) {
return null;
}
return <PublicDashboardBadgeInternal uid={dashboard.state.uid} />;
};
// Used in old architecture
export const PublicDashboardBadgeLegacy = PublicDashboardBadgeInternal;
function PublicDashboardBadgeInternal({ uid }: { uid?: string }) {
if (!uid) {
return null;
}
const { data: publicDashboard } = useGetPublicDashboardQuery(uid);
if (!publicDashboard) {
return null;
}
const styles = useStyles2(getStyles);
return (
@@ -17,7 +39,7 @@ export const PublicDashboardBadge = ({}: ToolbarActionProps) => {
data-testid={selectors.pages.Dashboard.DashNav.publicDashboardTag}
/>
);
};
}
const getStyles = () => ({
badge: css({
@@ -4,7 +4,6 @@ import { connect, ConnectedProps } from 'react-redux';
import { useLocation } from 'react-router-dom-v5-compat';
import { textUtil } from '@grafana/data';
import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src';
import { Trans, t } from '@grafana/i18n';
import { locationService } from '@grafana/runtime';
import {
@@ -14,7 +13,6 @@ import {
useForceUpdate,
ToolbarButtonRow,
ConfirmModal,
Badge,
} from '@grafana/ui';
import { updateNavIndex } from 'app/core/actions';
import { AppChromeUpdate } from 'app/core/components/AppChrome/AppChromeUpdate';
@@ -29,6 +27,7 @@ import AddPanelButton from 'app/features/dashboard/components/AddPanelButton/Add
import { SaveDashboardDrawer } from 'app/features/dashboard/components/SaveDashboard/SaveDashboardDrawer';
import { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';
import { DashboardModel } from 'app/features/dashboard/state/DashboardModel';
import { PublicDashboardBadgeLegacy } from 'app/features/dashboard-scene/scene/new-toolbar/actions/PublicDashboardBadge';
import { DashboardInteractions } from 'app/features/dashboard-scene/utils/interactions';
import { playlistSrv } from 'app/features/playlist/PlaylistSrv';
import { updateTimeZoneForSession } from 'app/features/profile/state/reducers';
@@ -58,8 +57,6 @@ const mapStateToProps = (state: StoreState) => ({
const connector = connect(mapStateToProps, mapDispatchToProps);
const selectors = e2eSelectors.pages.Dashboard.DashNav;
export interface OwnProps {
dashboard: DashboardModel;
isFullscreen: boolean;
@@ -215,18 +212,7 @@ export const DashNav = memo<Props>((props) => {
);
}
if (dashboard.meta.publicDashboardEnabled) {
// TODO: This will be replaced with the new badge component. Color is required but gets override by css
buttons.push(
<Badge
color="blue"
text={t('dashboard.dash-nav.render-left-actions.text-public', 'Public')}
key="public-dashboard-button-badge"
className={publicBadgeStyle}
data-testid={selectors.publicDashboardTag}
/>
);
}
buttons.push(<PublicDashboardBadgeLegacy key="public-dashboard-badge" uid={dashboard.uid} />);
if (isDevEnv && config.featureToggles.dashboardScene) {
buttons.push(
@@ -377,9 +363,3 @@ const modalStyles = css({
width: 'max-content',
maxWidth: '80vw',
});
const publicBadgeStyle = css({
color: 'grey',
backgroundColor: 'transparent',
border: '1px solid',
});
-2
View File
@@ -4399,7 +4399,6 @@
}
},
"render-left-actions": {
"text-public": "Public",
"tooltip-view-as-scene": "View as Scene"
}
},
@@ -5173,7 +5172,6 @@
"playlist-next": "Go to next dashboard",
"playlist-previous": "Go to previous dashboard",
"playlist-stop": "Stop playlist",
"public-dashboard": "Public",
"refresh": "Refresh dashboard",
"save": "Save dashboard",
"save-dashboard": {