import { css } from '@emotion/css';
import { GrafanaTheme2 } from '@grafana/data';
import { Button, Drawer, Dropdown, Icon, LinkButton, Menu, Stack, Text, Tooltip, useStyles2 } from '@grafana/ui';
import { RelativeUrl, createRelativeUrl } from 'app/features/alerting/unified/utils/url';
import { SectionDto, SectionDtoStep, SectionsDto, StepButtonDto } from '../irmHooks';
import { ProgressBar, StepsStatus } from './ProgressBar';
export interface EssentialsProps {
onClose: () => void;
essentialsConfig: SectionsDto;
stepsDone: number;
totalStepsToDo: number;
}
export function Essentials({ onClose, essentialsConfig, stepsDone, totalStepsToDo }: EssentialsProps) {
return (
);
}
export function EssentialContent({
essentialContent,
stepsDone,
totalStepsToDo,
}: {
essentialContent: SectionsDto;
stepsDone: number;
totalStepsToDo: number;
}) {
return (
{essentialContent.sections.map((section: SectionDto) => (
))}
);
}
interface SectionProps {
section: SectionDto;
}
function Section({ section }: SectionProps) {
const styles = useStyles2(getStyles);
return (
{section.title}
{section.description}
{section.steps.map((step, index) => (
))}
);
}
function DoneIcon({ done }: { done: boolean }) {
return done ? (
) : (
);
}
interface StepProps {
step: SectionDtoStep;
}
function Step({ step }: StepProps) {
return (
{step.done !== undefined && }
{step.title}
);
}
interface LinkButtonProps {
urlLink?: { url: RelativeUrl; queryParams?: Record };
label: string;
urlLinkOnDone?: { url: RelativeUrl; queryParams?: Record };
labelOnDone?: string;
done?: boolean;
}
function OpenLinkButton(props: LinkButtonProps) {
const { urlLink, label, urlLinkOnDone, labelOnDone, done } = props;
const urlToGoWhenNotDone = urlLink?.url
? createRelativeUrl(urlLink.url, {
returnTo: location.pathname + location.search,
...urlLink.queryParams,
})
: '';
const urlToGoWhenDone = urlLinkOnDone?.url
? createRelativeUrl(urlLinkOnDone.url, {
returnTo: location.pathname + location.search,
...urlLinkOnDone.queryParams,
})
: '';
const urlToGo = done ? urlToGoWhenDone : urlToGoWhenNotDone;
return (
{done ? (labelOnDone ?? label) : label}
);
}
interface StepButtonProps extends StepButtonDto {
done?: boolean;
}
function StepButton({
type,
urlLink,
urlLinkOnDone,
label,
labelOnDone,
options,
onClickOption,
done,
stepNotAvailableText,
}: StepButtonProps) {
switch (type) {
case 'openLink':
return (
);
case 'dropDown':
if (Boolean(options?.length)) {
return (
{options?.map((option) => (
{
onClickOption?.(option.value);
}}
/>
))}
}
>
);
} else {
return {stepNotAvailableText ?? 'No options available'} ;
}
}
}
function ProgressStatus({ stepsDone, totalStepsToDo }: { stepsDone: number; totalStepsToDo: number }) {
return (
Your progress
);
}
const getStyles = (theme: GrafanaTheme2) => {
return {
wrapper: css({
margin: theme.spacing(2, 0),
padding: theme.spacing(2),
border: `1px solid ${theme.colors.border.medium}`,
borderRadius: theme.shape.radius.default,
display: 'flex',
flexDirection: 'column',
gap: theme.spacing(2),
}),
};
};