mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
POC: Disable ConfirmButton
(#89539)
This commit is contained in:
parent
2035814059
commit
fd96edaef7
@ -7,8 +7,8 @@ import { selectors } from '@grafana/e2e-selectors';
|
|||||||
|
|
||||||
import { useStyles2 } from '../../themes';
|
import { useStyles2 } from '../../themes';
|
||||||
import { Button, ButtonVariant } from '../Button';
|
import { Button, ButtonVariant } from '../Button';
|
||||||
|
import { Field } from '../Forms/Field';
|
||||||
import { Input } from '../Input/Input';
|
import { Input } from '../Input/Input';
|
||||||
import { Box } from '../Layout/Box/Box';
|
|
||||||
import { Stack } from '../Layout/Stack/Stack';
|
import { Stack } from '../Layout/Stack/Stack';
|
||||||
import { JustifyContent } from '../Layout/types';
|
import { JustifyContent } from '../Layout/types';
|
||||||
import { ResponsiveProp } from '../Layout/utils/responsiveness';
|
import { ResponsiveProp } from '../Layout/utils/responsiveness';
|
||||||
@ -40,6 +40,8 @@ export interface ConfirmContentProps {
|
|||||||
onDismiss(): void;
|
onDismiss(): void;
|
||||||
/** Alternative action callback */
|
/** Alternative action callback */
|
||||||
onAlternative?(): void;
|
onAlternative?(): void;
|
||||||
|
/** Disable the confirm button and the confirm text input if needed */
|
||||||
|
disabled?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ConfirmContent = ({
|
export const ConfirmContent = ({
|
||||||
@ -55,13 +57,14 @@ export const ConfirmContent = ({
|
|||||||
alternativeButtonLabel,
|
alternativeButtonLabel,
|
||||||
description,
|
description,
|
||||||
justifyButtons = 'flex-end',
|
justifyButtons = 'flex-end',
|
||||||
|
disabled,
|
||||||
}: ConfirmContentProps) => {
|
}: ConfirmContentProps) => {
|
||||||
const [disabled, setDisabled] = useState(Boolean(confirmPromptText));
|
const [isDisabled, setIsDisabled] = useState(disabled);
|
||||||
const styles = useStyles2(getStyles);
|
const styles = useStyles2(getStyles);
|
||||||
const buttonRef = useRef<HTMLButtonElement>(null);
|
const buttonRef = useRef<HTMLButtonElement>(null);
|
||||||
|
|
||||||
const onConfirmationTextChange = (event: React.FormEvent<HTMLInputElement>) => {
|
const onConfirmationTextChange = (event: React.FormEvent<HTMLInputElement>) => {
|
||||||
setDisabled(confirmPromptText?.toLowerCase().localeCompare(event.currentTarget.value.toLowerCase()) !== 0);
|
setIsDisabled(confirmPromptText?.toLowerCase().localeCompare(event.currentTarget.value.toLowerCase()) !== 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -69,15 +72,15 @@ export const ConfirmContent = ({
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setDisabled(Boolean(confirmPromptText));
|
setIsDisabled(disabled ? true : Boolean(confirmPromptText));
|
||||||
}, [confirmPromptText]);
|
}, [confirmPromptText, disabled]);
|
||||||
|
|
||||||
const onConfirmClick = async () => {
|
const onConfirmClick = async () => {
|
||||||
setDisabled(true);
|
setIsDisabled(true);
|
||||||
try {
|
try {
|
||||||
await onConfirm();
|
await onConfirm();
|
||||||
} finally {
|
} finally {
|
||||||
setDisabled(false);
|
setIsDisabled(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -91,9 +94,9 @@ export const ConfirmContent = ({
|
|||||||
{confirmPromptText ? (
|
{confirmPromptText ? (
|
||||||
<div className={styles.confirmationInput}>
|
<div className={styles.confirmationInput}>
|
||||||
<Stack alignItems="flex-start">
|
<Stack alignItems="flex-start">
|
||||||
<Box>
|
<Field disabled={disabled}>
|
||||||
<Input placeholder={`Type "${confirmPromptText}" to confirm`} onChange={onConfirmationTextChange} />
|
<Input placeholder={`Type "${confirmPromptText}" to confirm`} onChange={onConfirmationTextChange} />
|
||||||
</Box>
|
</Field>
|
||||||
</Stack>
|
</Stack>
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
@ -106,7 +109,7 @@ export const ConfirmContent = ({
|
|||||||
<Button
|
<Button
|
||||||
type="submit"
|
type="submit"
|
||||||
variant={confirmButtonVariant}
|
variant={confirmButtonVariant}
|
||||||
disabled={disabled}
|
disabled={isDisabled}
|
||||||
ref={buttonRef}
|
ref={buttonRef}
|
||||||
data-testid={selectors.pages.ConfirmModal.delete}
|
data-testid={selectors.pages.ConfirmModal.delete}
|
||||||
>
|
>
|
||||||
|
@ -44,6 +44,8 @@ export interface ConfirmModalProps {
|
|||||||
onDismiss(): void;
|
onDismiss(): void;
|
||||||
/** Alternative action callback */
|
/** Alternative action callback */
|
||||||
onAlternative?(): void;
|
onAlternative?(): void;
|
||||||
|
/** Disable the confirm button and the confirm text input if needed */
|
||||||
|
disabled?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ConfirmModal = ({
|
export const ConfirmModal = ({
|
||||||
@ -63,6 +65,7 @@ export const ConfirmModal = ({
|
|||||||
onDismiss,
|
onDismiss,
|
||||||
onAlternative,
|
onAlternative,
|
||||||
confirmButtonVariant = 'destructive',
|
confirmButtonVariant = 'destructive',
|
||||||
|
disabled,
|
||||||
}: ConfirmModalProps): JSX.Element => {
|
}: ConfirmModalProps): JSX.Element => {
|
||||||
const styles = useStyles2(getStyles);
|
const styles = useStyles2(getStyles);
|
||||||
|
|
||||||
@ -80,6 +83,7 @@ export const ConfirmModal = ({
|
|||||||
onConfirm={onConfirm}
|
onConfirm={onConfirm}
|
||||||
onDismiss={onDismiss}
|
onDismiss={onDismiss}
|
||||||
onAlternative={onAlternative}
|
onAlternative={onAlternative}
|
||||||
|
disabled={disabled}
|
||||||
/>
|
/>
|
||||||
</Modal>
|
</Modal>
|
||||||
);
|
);
|
||||||
|
@ -18,7 +18,7 @@ export interface Props {
|
|||||||
|
|
||||||
export const DeleteModal = ({ onConfirm, onDismiss, selectedItems, ...props }: Props) => {
|
export const DeleteModal = ({ onConfirm, onDismiss, selectedItems, ...props }: Props) => {
|
||||||
const { data } = useGetAffectedItemsQuery(selectedItems);
|
const { data } = useGetAffectedItemsQuery(selectedItems);
|
||||||
const deleteIsInvalid = !config.featureToggles.nestedFolders && data && (data.alertRule || data.libraryPanel);
|
const deleteIsInvalid = Boolean(data && (data.alertRule || data.libraryPanel));
|
||||||
const [isDeleting, setIsDeleting] = useState(false);
|
const [isDeleting, setIsDeleting] = useState(false);
|
||||||
const onDelete = async () => {
|
const onDelete = async () => {
|
||||||
setIsDeleting(true);
|
setIsDeleting(true);
|
||||||
@ -80,6 +80,7 @@ export const DeleteModal = ({ onConfirm, onDismiss, selectedItems, ...props }: P
|
|||||||
onConfirm={onDelete}
|
onConfirm={onDelete}
|
||||||
title={t('browse-dashboards.action.delete-modal-title', 'Delete')}
|
title={t('browse-dashboards.action.delete-modal-title', 'Delete')}
|
||||||
{...props}
|
{...props}
|
||||||
|
disabled={deleteIsInvalid}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user