Files
Hugo Häggmark 119d5897ea i18n: imports use @grafana/i18n (#105177)
* i18n: everything should target @grafana/i18n

* wip

* chore: updates after PR feedback

* Trigger build

* Trigger build

* Trigger build

* chore: skip flaky tests

* chore: skip flaky tests

* chore: skip flaky tests

* chore: skip flaky tests

* chore: skip flaky tests

* chore: skip flaky tests

* chore: revert all flaky tests

* chore: some incorrect usages of useTranslate
2025-05-15 09:17:14 +02:00

91 lines
2.7 KiB
TypeScript

import { css } from '@emotion/css';
import { useState } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { Trans } from '@grafana/i18n';
import { Modal, Button, useStyles2, Stack, Text } from '@grafana/ui';
import { SetupStep } from './SetupStep';
import { Sidebar } from './Sidebar';
import { Step } from './types';
export interface Props {
title: string;
description: string;
steps: Step[];
isOpen: boolean;
onDismiss: () => void;
}
export const SetupModal = ({ title, description, steps, isOpen, onDismiss }: Props) => {
const styles = useStyles2(getStyles);
const [currentStep, setCurrentStep] = useState(0);
const isFirstStep = currentStep === 0;
const isLastStep = currentStep === steps.length - 1;
const stepTitles = steps.map((step) => step.title);
const handleNext = () => !isLastStep && setCurrentStep(currentStep + 1);
const handlePrevious = () => !isFirstStep && setCurrentStep(currentStep - 1);
return (
<Modal isOpen={isOpen} title={title} onDismiss={onDismiss} className={styles.modal}>
<Stack direction={'column'} gap={4}>
<Text variant="body" color="secondary">
{description}
</Text>
<Stack direction="row" height="100%">
<Sidebar steps={stepTitles} currentStep={currentStep} onStepClick={setCurrentStep} />
<div className={styles.contentWrapper}>
<SetupStep step={steps[currentStep]} />
</div>
</Stack>
</Stack>
<Modal.ButtonRow>
<Stack direction="row" justifyContent="flex-end" gap={2}>
<Button variant="secondary" onClick={handlePrevious} disabled={isFirstStep}>
<Trans i18nKey="provisioning.setup-modal.previous">Previous</Trans>
</Button>
{isLastStep ? (
<Button variant="primary" onClick={onDismiss} icon="check-circle">
<Trans i18nKey="provisioning.setup-modal.done">Done</Trans>
</Button>
) : (
<Button variant="primary" onClick={handleNext}>
<Trans i18nKey="provisioning.setup-modal.next">Next</Trans>
</Button>
)}
</Stack>
</Modal.ButtonRow>
</Modal>
);
};
const getStyles = (theme: GrafanaTheme2) => ({
modal: css({
width: '1100px',
maxWidth: '95%',
}),
description: css({
marginBottom: theme.spacing(3),
padding: theme.spacing(0, 1),
}),
contentWrapper: css({
flex: 1,
overflowY: 'auto',
minWidth: 0,
padding: theme.spacing(2),
borderLeft: `1px solid ${theme.colors.border.weak}`,
}),
footer: css({
padding: theme.spacing(2),
borderTop: `1px solid ${theme.colors.border.weak}`,
marginTop: theme.spacing(2),
}),
});