mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
112 lines
3.4 KiB
TypeScript
112 lines
3.4 KiB
TypeScript
import { css, cx } from '@emotion/css';
|
|
import React from 'react';
|
|
|
|
import { GrafanaTheme2 } from '@grafana/data/src';
|
|
import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src';
|
|
import { Button, LoadingPlaceholder, Modal, ModalsController, useStyles2 } from '@grafana/ui/src';
|
|
import {
|
|
generatePublicDashboardConfigUrl,
|
|
generatePublicDashboardUrl,
|
|
} from 'app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils';
|
|
|
|
import { useGetActiveUserDashboardsQuery } from '../../dashboard/api/publicDashboardApi';
|
|
|
|
const selectors = e2eSelectors.pages.UserListPage.UsersListPublicDashboardsPage.DashboardsListModal;
|
|
export const DashboardsListModal = ({ email, onDismiss }: { email: string; onDismiss: () => void }) => {
|
|
const styles = useStyles2(getStyles);
|
|
|
|
const { data: dashboards, isLoading } = useGetActiveUserDashboardsQuery(email);
|
|
|
|
return (
|
|
<Modal className={styles.modal} isOpen title="Public dashboards" onDismiss={onDismiss}>
|
|
{isLoading ? (
|
|
<div className={styles.loading}>
|
|
<LoadingPlaceholder text="Loading..." />
|
|
</div>
|
|
) : (
|
|
dashboards?.map((dash) => (
|
|
<div key={dash.dashboardUid} className={styles.listItem} data-testid={selectors.listItem(dash.dashboardUid)}>
|
|
<p className={styles.dashboardTitle}>{dash.dashboardTitle}</p>
|
|
<div className={styles.urlsContainer}>
|
|
<a
|
|
rel="noreferrer"
|
|
target="_blank"
|
|
className={cx('external-link', styles.url)}
|
|
href={generatePublicDashboardUrl(dash.publicDashboardAccessToken)}
|
|
onClick={onDismiss}
|
|
>
|
|
Public dashboard URL
|
|
</a>
|
|
<span className={styles.urlsDivider}>•</span>
|
|
<a
|
|
className={cx('external-link', styles.url)}
|
|
href={generatePublicDashboardConfigUrl(dash.dashboardUid)}
|
|
onClick={onDismiss}
|
|
>
|
|
Public dashboard settings
|
|
</a>
|
|
</div>
|
|
<hr className={styles.divider} />
|
|
</div>
|
|
))
|
|
)}
|
|
</Modal>
|
|
);
|
|
};
|
|
|
|
export const DashboardsListModalButton = ({ email }: { email: string }) => (
|
|
<ModalsController>
|
|
{({ showModal, hideModal }) => (
|
|
<Button
|
|
variant="secondary"
|
|
size="sm"
|
|
icon="question-circle"
|
|
title="Open dashboards list"
|
|
aria-label="Open dashboards list"
|
|
onClick={() => showModal(DashboardsListModal, { email, onDismiss: hideModal })}
|
|
/>
|
|
)}
|
|
</ModalsController>
|
|
);
|
|
|
|
const getStyles = (theme: GrafanaTheme2) => ({
|
|
modal: css`
|
|
width: 590px;
|
|
`,
|
|
loading: css`
|
|
display: flex;
|
|
justify-content: center;
|
|
`,
|
|
listItem: css`
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: ${theme.spacing(0.5)};
|
|
`,
|
|
divider: css`
|
|
margin: ${theme.spacing(1.5, 0)};
|
|
color: ${theme.colors.text.secondary};
|
|
`,
|
|
urlsContainer: css`
|
|
display: flex;
|
|
gap: ${theme.spacing(0.5)};
|
|
|
|
${theme.breakpoints.down('sm')} {
|
|
flex-direction: column;
|
|
}
|
|
`,
|
|
urlsDivider: css`
|
|
color: ${theme.colors.text.secondary};
|
|
${theme.breakpoints.down('sm')} {
|
|
display: none;
|
|
}
|
|
`,
|
|
dashboardTitle: css`
|
|
font-size: ${theme.typography.body.fontSize};
|
|
font-weight: ${theme.typography.fontWeightBold};
|
|
margin-bottom: 0;
|
|
`,
|
|
url: css`
|
|
font-size: ${theme.typography.body.fontSize};
|
|
`,
|
|
});
|