Skip to content

Commit 2953b78

Browse files
fix(Modal): Prevent duplicate ids within Modal (#9555)
1 parent e12b872 commit 2953b78

3 files changed

Lines changed: 15 additions & 6 deletions

File tree

packages/react-core/src/components/Modal/ModalContent.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,13 @@ export const ModalContent: React.FunctionComponent<ModalContentProps> = ({
148148

149149
const defaultModalBodyAriaRole = bodyAriaLabel ? 'region' : undefined;
150150

151+
const hasNoDescription = !description && !ariaDescribedby;
152+
const id = hasNoDescription ? descriptorId : undefined;
153+
151154
const modalBody = hasNoBodyWrapper ? (
152155
children
153156
) : (
154-
<ModalBoxBody
155-
aria-label={bodyAriaLabel}
156-
role={bodyAriaRole || defaultModalBodyAriaRole}
157-
{...props}
158-
{...(!description && !ariaDescribedby && { id: descriptorId })}
159-
>
157+
<ModalBoxBody aria-label={bodyAriaLabel} role={bodyAriaRole || defaultModalBodyAriaRole} {...props} id={id}>
160158
{children}
161159
</ModalBoxBody>
162160
);

packages/react-integration/cypress/integration/modal.spec.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,12 @@ describe('Modal Test', () => {
9595
cy.get('#modal-custom-focus-confirm-button').should('have.focus');
9696
cy.get('#modal-custom-focus-cancel-button').click();
9797
});
98+
99+
it("Verify the same id doesn't appear multiple times", () => {
100+
cy.get('#showDescriptionModalButton').click();
101+
102+
cy.get('body').find('div#test-modal-id').should('have.length', 1);
103+
104+
cy.get('.pf-v5-c-modal-box__close > .pf-v5-c-button.pf-m-plain').click();
105+
});
98106
});

packages/react-integration/demo-app-ts/src/components/demos/ModalDemo/ModalDemo.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ interface ModalDemoState {
1818
isCustomFocusModalOpen: boolean;
1919
}
2020

21+
// eslint-disable-next-line patternfly-react/no-anonymous-functions
2122
export class ModalDemo extends React.Component<React.HTMLProps<HTMLDivElement>, ModalDemoState> {
2223
static displayName = 'ModalDemo';
24+
2325
state = {
2426
isModalOpen: false,
2527
isModalDescriptionOpen: false,
@@ -158,6 +160,7 @@ export class ModalDemo extends React.Component<React.HTMLProps<HTMLDivElement>,
158160
Confirm
159161
</Button>
160162
]}
163+
id="test-modal-id"
161164
>
162165
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
163166
magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo

0 commit comments

Comments
 (0)