Skip to content
This repository has been archived by the owner on May 24, 2024. It is now read-only.

Commit

Permalink
[terra-modal-manager] Added zIndex prop to handle nested modals. (#2156)
Browse files Browse the repository at this point in the history
  • Loading branch information
saket2403 authored May 8, 2024
1 parent 0fde38c commit d7176cc
Show file tree
Hide file tree
Showing 7 changed files with 152 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ exports[`ApplicationLayout Snapshot Tests renders the ApplicationLayout with giv
<ModalManager
closeOnOutsideClick={false}
shouldTrapFocus={false}
zIndex="6000"
>
<withRouter(NavigationLayout)
config={
Expand Down Expand Up @@ -311,6 +312,7 @@ exports[`ApplicationLayout Snapshot Tests renders the ApplicationLayout with onl
<ModalManager
closeOnOutsideClick={false}
shouldTrapFocus={false}
zIndex="6000"
>
<withRouter(NavigationLayout)
config={
Expand Down Expand Up @@ -428,6 +430,7 @@ exports[`ApplicationLayout Snapshot Tests when given nav items with icons matche
<ModalManager
closeOnOutsideClick={false}
shouldTrapFocus={false}
zIndex="6000"
>
<withRouter(NavigationLayout)
config={
Expand Down
3 changes: 3 additions & 0 deletions packages/terra-framework-docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
* Changed
* Updated `terra-folder-tree` example styles.

* Changed
* Updated `terra-modal-manager` example to consume `zIndex` prop.

## 1.85.0 - (May 1, 2024)

* Changed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,7 @@ const ModalManagerExample = ({ showDisclosureAccessory }) => (
Disclosure Accessory
</div>
) : undefined}
zIndex="7000"
>
<ContentComponent disclosureType="modal" />
</ModalManager>
Expand Down
3 changes: 3 additions & 0 deletions packages/terra-modal-manager/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

## Unreleased

* Changed
* Added `zIndex` prop to handle nested modals.

## 6.76.0 - (April 4, 2024)

* Changed
Expand Down
10 changes: 9 additions & 1 deletion packages/terra-modal-manager/src/ModalManager.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ export { disclosureType };

const cx = classNamesBind.bind(styles);

const zIndexes = ['6000', '7000', '8000', '9000'];

const propTypes = {
/**
* The components to be rendered in the body of the ModalManager. These components will receive the
Expand All @@ -38,11 +40,16 @@ const propTypes = {
* If set to true, then the outside click will get enabled.
*/
closeOnOutsideClick: PropTypes.bool,
/**
* Z-Index layer to apply to the ModalContent and ModalOverlay. Valid values are the standard modal layer: '6000', and the max layer: '9000'.
*/
zIndex: PropTypes.oneOf(zIndexes),
};

const defaultProps = {
shouldTrapFocus: false,
closeOnOutsideClick: false,
zIndex: '6000',
};

const heightFromSize = {
Expand Down Expand Up @@ -81,7 +88,7 @@ class ModalManager extends React.Component {

renderModal(manager) {
const {
children, disclosureAccessory, withDisclosureContainer, shouldTrapFocus, closeOnOutsideClick, ...customProps
children, disclosureAccessory, withDisclosureContainer, shouldTrapFocus, closeOnOutsideClick, zIndex, ...customProps
} = this.props;
const theme = this.context;

Expand Down Expand Up @@ -120,6 +127,7 @@ class ModalManager extends React.Component {
ariaLabel={(headerDataForPresentedComponent) ? headerDataForPresentedComponent.title : customProps['aria-label'] || 'Modal'}
setModalFocusElementRef={this.setModalFocusElementRef}
shouldTrapFocus={shouldTrapFocus}
zIndex={zIndex}
>
<ContentContainer
fill
Expand Down
11 changes: 11 additions & 0 deletions packages/terra-modal-manager/tests/jest/ModalManager.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -94,4 +94,15 @@ describe('ModalManager', () => {
);
expect(modalManager).toMatchSnapshot();
});

it('should render the ModalManager with custom zIndex', () => {
const modalManager = (
<ModalManager zIndex="7000">
<TestContainer />
</ModalManager>
);

const result = enzymeIntl.mountWithIntl(modalManager);
expect(result).toMatchSnapshot();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ exports[`ModalManager correctly applies the theme context className 1`] = `
<ModalManager
closeOnOutsideClick={false}
shouldTrapFocus={false}
zIndex="6000"
>
<withDisclosureManager(DisclosureManager)
render={[Function]}
Expand Down Expand Up @@ -102,6 +103,7 @@ exports[`ModalManager should disclose content in Modal 1`] = `
}
}
shouldTrapFocus={true}
zIndex="6000"
>
<withDisclosureManager(DisclosureManager)
render={[Function]}
Expand Down Expand Up @@ -1350,6 +1352,7 @@ exports[`ModalManager should render the ModalManager with custom props 1`] = `
}
}
shouldTrapFocus={false}
zIndex="6000"
>
<withDisclosureManager(DisclosureManager)
render={[Function]}
Expand Down Expand Up @@ -1437,6 +1440,124 @@ exports[`ModalManager should render the ModalManager with custom props 1`] = `
</ModalManager>
`;

exports[`ModalManager should render the ModalManager with custom zIndex 1`] = `
<ModalManager
closeOnOutsideClick={false}
intl={
Object {
"defaultFormats": Object {},
"defaultLocale": "en",
"formatDate": [Function],
"formatHTMLMessage": [Function],
"formatMessage": [Function],
"formatNumber": [Function],
"formatPlural": [Function],
"formatRelative": [Function],
"formatTime": [Function],
"formats": Object {},
"formatters": Object {
"getDateTimeFormat": [Function],
"getMessageFormat": [Function],
"getNumberFormat": [Function],
"getPluralFormat": [Function],
"getRelativeFormat": [Function],
},
"locale": "en",
"messages": null,
"now": [Function],
"onError": [Function],
"textComponent": "span",
"timeZone": null,
}
}
shouldTrapFocus={false}
zIndex="7000"
>
<withDisclosureManager(DisclosureManager)
render={[Function]}
supportedDisclosureTypes={
Array [
"modal",
]
}
trapNestedDisclosureRequests={true}
>
<DisclosureManager
render={[Function]}
supportedDisclosureTypes={
Array [
"modal",
]
}
trapNestedDisclosureRequests={true}
>
<div
className="container"
intl={
Object {
"defaultFormats": Object {},
"defaultLocale": "en",
"formatDate": [Function],
"formatHTMLMessage": [Function],
"formatMessage": [Function],
"formatNumber": [Function],
"formatPlural": [Function],
"formatRelative": [Function],
"formatTime": [Function],
"formats": Object {},
"formatters": Object {
"getDateTimeFormat": [Function],
"getMessageFormat": [Function],
"getNumberFormat": [Function],
"getPluralFormat": [Function],
"getRelativeFormat": [Function],
},
"locale": "en",
"messages": null,
"now": [Function],
"onError": [Function],
"textComponent": "span",
"timeZone": null,
}
}
>
<withDisclosureManager(Component)>
<Component
disclosureManager={
DisclosureManagerDelegateInstance {
"disclose": [Function],
}
}
>
<button
type="button"
>
Hello World
</button>
</Component>
</withDisclosureManager(Component)>
<AbstractModal
ariaLabel="Modal"
classNameModal="modal-manager"
classNameOverlay={null}
closeOnEsc={true}
closeOnOutsideClick={false}
isCalledFromNotificationDialog={false}
isFullscreen={false}
isOpen={false}
onRequestClose={[Function]}
role="dialog"
rootSelector="#root"
setModalFocusElementRef={[Function]}
shouldTrapFocus={false}
zIndex="7000"
/>
</div>
</DisclosureManager>
</withDisclosureManager(DisclosureManager)>
</ModalManager>
`;

exports[`ModalManager should render the ModalManager with defaults 1`] = `
<ModalManager
closeOnOutsideClick={false}
Expand Down Expand Up @@ -1468,6 +1589,7 @@ exports[`ModalManager should render the ModalManager with defaults 1`] = `
}
}
shouldTrapFocus={false}
zIndex="6000"
>
<withDisclosureManager(DisclosureManager)
render={[Function]}
Expand Down

0 comments on commit d7176cc

Please sign in to comment.