ConfirmDialog uses a Dialog UI
import { ConfirmDialog } from 'primereact/confirmdialog';
<ConfirmDialog>
<ConfirmDialog.Trigger />
<ConfirmDialog.Portal>
<ConfirmDialog.Header>
<ConfirmDialog.Title />
<ConfirmDialog.HeaderActions>
<ConfirmDialog.Close />
</ConfirmDialog.HeaderActions>
</ConfirmDialog.Header>
<ConfirmDialog.Content />
<ConfirmDialog.Footer />
</ConfirmDialog.Portal>
</ConfirmDialog>
ConfirmDialog is defined using ConfirmDialog
, ConfirmDialog.Trigger
, ConfirmDialog.Portal
, ConfirmDialog.Header
, ConfirmDialog.Content
and ConfirmDialog.Footer
components.
import { ConfirmDialog } from 'primereact/confirmdialog';
export default function BasicDemo() {
return (
<div className="card flex flex-wrap gap-2 justify-center">
<ConfirmDialog>
<ConfirmDialog.Trigger variant="outlined">Save</ConfirmDialog.Trigger>
<ConfirmDialog.Portal>
<ConfirmDialog.Header>
<ConfirmDialog.Title>Edit Profile</ConfirmDialog.Title>
<ConfirmDialog.Close />
</ConfirmDialog.Header>
<ConfirmDialog.Content>
<ConfirmDialog.Icon className="pi pi-exclamation-triangle" />
<ConfirmDialog.Message>Are you sure you want to proceed?</ConfirmDialog.Message>
</ConfirmDialog.Content>
<ConfirmDialog.Footer>
<ConfirmDialog.Cancel variant="outlined">Cancel</ConfirmDialog.Cancel>
<ConfirmDialog.Action>Save</ConfirmDialog.Action>
</ConfirmDialog.Footer>
</ConfirmDialog.Portal>
</ConfirmDialog>
<ConfirmDialog>
<ConfirmDialog.Trigger severity="danger" variant="outlined">
Delete
</ConfirmDialog.Trigger>
<ConfirmDialog.Portal>
<ConfirmDialog.Header>
<ConfirmDialog.Title>Danger Zone</ConfirmDialog.Title>
<ConfirmDialog.Close />
</ConfirmDialog.Header>
<ConfirmDialog.Content>
<ConfirmDialog.Icon className="pi pi-exclamation-triangle" />
<ConfirmDialog.Message>Do you want to delete this record?</ConfirmDialog.Message>
</ConfirmDialog.Content>
<ConfirmDialog.Footer>
<ConfirmDialog.Cancel variant="outlined">Cancel</ConfirmDialog.Cancel>
<ConfirmDialog.Action severity="danger">Delete</ConfirmDialog.Action>
</ConfirmDialog.Footer>
</ConfirmDialog.Portal>
</ConfirmDialog>
</div>
);
}
The position of the confirmdialog can be customized with the position
property. The available values are top
, top-left
, top-right
, bottom
, bottom-left
, bottom-right
, left
, right
, and center
.
import { ConfirmDialogChangeEvent, ConfirmDialogProps } from '@primereact/types/shared/confirmdialog';
import { Button } from 'primereact/button';
import { ConfirmDialog } from 'primereact/confirmdialog';
import * as React from 'react';
export default function PositionDemo() {
const [open, setOpen] = React.useState<boolean>(false);
const [position, setPosition] = React.useState<ConfirmDialogProps['position']>('center');
const openPosition = (position: ConfirmDialogProps['position']) => {
setOpen(true);
setPosition(position);
};
return (
<div className="card">
<div className="flex flex-wrap justify-center gap-2 mb-2">
<Button onClick={() => openPosition('left')} severity="secondary" style={{ minWidth: '10rem' }}>
Left
<i className="pi pi-arrow-right" />
</Button>
<Button onClick={() => openPosition('right')} severity="secondary" style={{ minWidth: '10rem' }}>
Right
<i className="pi pi-arrow-left" />
</Button>
</div>
<div className="flex flex-wrap justify-center gap-2 mb-2">
<Button onClick={() => openPosition('topleft')} severity="secondary" style={{ minWidth: '10rem' }}>
TopLeft
<i className="pi pi-arrow-down-right" />
</Button>
<Button onClick={() => openPosition('top')} severity="secondary" style={{ minWidth: '10rem' }}>
Top
<i className="pi pi-arrow-down" />
</Button>
<Button onClick={() => openPosition('topright')} severity="secondary" style={{ minWidth: '10rem' }}>
TopRight
<i className="pi pi-arrow-down-left" />
</Button>
</div>
<div className="flex flex-wrap justify-center gap-2">
<Button onClick={() => openPosition('bottomleft')} severity="secondary" style={{ minWidth: '10rem' }}>
BottomLeft
<i className="pi pi-arrow-up-right" />
</Button>
<Button onClick={() => openPosition('bottom')} severity="secondary" style={{ minWidth: '10rem' }}>
Bottom
<i className="pi pi-arrow-up" />
</Button>
<Button onClick={() => openPosition('bottomright')} severity="secondary" style={{ minWidth: '10rem' }}>
BottomRight
<i className="pi pi-arrow-up-left" />
</Button>
</div>
<ConfirmDialog open={open} onOpenChange={(e: ConfirmDialogChangeEvent) => setOpen(e.value as boolean)} position={position}>
<ConfirmDialog.Portal>
<ConfirmDialog.Header>
<ConfirmDialog.Title>Edit Profile</ConfirmDialog.Title>
<ConfirmDialog.Close />
</ConfirmDialog.Header>
<ConfirmDialog.Content>
<ConfirmDialog.Icon className="pi pi-exclamation-triangle" />
<ConfirmDialog.Message>Are you sure you want to proceed?</ConfirmDialog.Message>
</ConfirmDialog.Content>
<ConfirmDialog.Footer>
<ConfirmDialog.Cancel>Cancel</ConfirmDialog.Cancel>
<ConfirmDialog.Action>Save</ConfirmDialog.Action>
</ConfirmDialog.Footer>
</ConfirmDialog.Portal>
</ConfirmDialog>
</div>
);
}
ConfirmDialog component uses confirmdialog
role along with aria-labelledby
referring to the header element however any attribute is passed to the root element so you may use aria-labelledby
to override this default behavior. In addition aria-modal
is added since focus is kept within the popup.
Trigger element also has aria-expanded and aria-controls to be handled explicitly.
Key | Function |
---|---|
tab | Moves focus to the next the focusable element within the confirmdialog if modal is true. Otherwise, the focusable element in the page tab sequence. |
shift + tab | Moves focus to the previous the focusable element within the confirmdialog if modal is true. Otherwise, the focusable element in the page tab sequence. |
escape | Closes the confirmdialog if closeOnEscape is true. |
Key | Function |
---|---|
enter | Closes the confirmdialog. |
space | Closes the confirmdialog. |