// Libraries import { css, cx } from '@emotion/css'; import React, { PureComponent } from 'react'; import { PanelProps } from '@grafana/data'; import { config } from '@grafana/runtime'; import { Button, Spinner, stylesFactory } from '@grafana/ui'; import { contextSrv } from 'app/core/core'; import { backendSrv } from 'app/core/services/backend_srv'; import { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv'; import { Step } from './components/Step'; import { getSteps } from './steps'; import { Card, SetupStep } from './types'; interface State { checksDone: boolean; currentStep: number; steps: SetupStep[]; } export class GettingStarted extends PureComponent { state = { checksDone: false, currentStep: 0, steps: getSteps(), }; async componentDidMount() { const { steps } = this.state; const checkedStepsPromises: Array> = steps.map(async (step: SetupStep) => { const checkedCardsPromises: Array> = step.cards.map((card: Card) => { return card.check().then((passed) => { return { ...card, done: passed }; }); }); const checkedCards = await Promise.all(checkedCardsPromises); return { ...step, done: checkedCards.every((c) => c.done), cards: checkedCards, }; }); const checkedSteps = await Promise.all(checkedStepsPromises); this.setState({ currentStep: !checkedSteps[0].done ? 0 : 1, steps: checkedSteps, checksDone: true, }); } onForwardClick = () => { this.setState((prevState) => ({ currentStep: prevState.currentStep + 1, })); }; onPreviousClick = () => { this.setState((prevState) => ({ currentStep: prevState.currentStep - 1, })); }; dismiss = () => { const { id } = this.props; const dashboard = getDashboardSrv().getCurrent(); const panel = dashboard?.getPanelById(id); dashboard?.removePanel(panel!); backendSrv .request({ method: 'PUT', url: '/api/user/helpflags/1', showSuccessAlert: false, }) .then((res: any) => { contextSrv.user.helpFlags1 = res.helpFlags1; }); }; render() { const { checksDone, currentStep, steps } = this.state; const styles = getStyles(); const step = steps[currentStep]; return (
{!checksDone ? (
Checking completed setup steps
) : ( <>
Remove this panel
{currentStep === steps.length - 1 && (
)}
{currentStep < steps.length - 1 && (
)} )}
); } } const getStyles = stylesFactory(() => { const { theme } = config; return { container: css` display: flex; flex-direction: column; height: 100%; // background: url(public/img/getting_started_bg_${theme.type}.svg) no-repeat; background-size: cover; padding: ${theme.spacing.xl} ${theme.spacing.md} 0; `, content: css` label: content; display: flex; justify-content: center; @media only screen and (max-width: ${theme.breakpoints.xxl}) { margin-left: ${theme.spacing.lg}; justify-content: flex-start; } `, header: css` label: header; margin-bottom: ${theme.spacing.lg}; display: flex; flex-direction: column; @media only screen and (min-width: ${theme.breakpoints.lg}) { flex-direction: row; } `, headerLogo: css` height: 58px; padding-right: ${theme.spacing.md}; display: none; @media only screen and (min-width: ${theme.breakpoints.md}) { display: block; } `, heading: css` label: heading; margin-right: ${theme.spacing.lg}; margin-bottom: ${theme.spacing.lg}; flex-grow: 1; display: flex; @media only screen and (min-width: ${theme.breakpoints.md}) { margin-bottom: 0; } `, backForwardButtons: css` position: absolute; bottom: 50%; top: 50%; height: 50px; `, previous: css` left: 10px; @media only screen and (max-width: ${theme.breakpoints.md}) { left: 0; } `, forward: css` right: 10px; @media only screen and (max-width: ${theme.breakpoints.md}) { right: 0; } `, dismiss: css` display: flex; justify-content: flex-end; cursor: pointer; text-decoration: underline; margin-right: ${theme.spacing.md}; margin-bottom: ${theme.spacing.sm}; `, loading: css` display: flex; justify-content: center; align-items: center; height: 100%; `, loadingText: css` margin-right: ${theme.spacing.sm}; `, }; });