Skip to content

Commit c7b2b3e

Browse files
TheSharpieOneeddywashere
authored andcommitted
feat(Modal): add various className props to modal (#320)
closes #257
1 parent c60f063 commit c7b2b3e

3 files changed

Lines changed: 73 additions & 4 deletions

File tree

docs/lib/Components/ModalsPage.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ export default class ModalsPage extends React.Component {
5555
PropTypes.number,
5656
PropTypes.string,
5757
]),
58+
className: PropTypes.string,
59+
wrapClassName: PropTypes.string,
60+
modalClassName: PropTypes.string,
61+
backdropClassName: PropTypes.string,
62+
contentClassName: PropTypes.string,
5863
}`}
5964
</PrismCode>
6065
</pre>

src/Modal.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ const propTypes = {
2424
onExit: PropTypes.func,
2525
children: PropTypes.node,
2626
className: PropTypes.string,
27+
wrapClassName: PropTypes.string,
28+
modalClassName: PropTypes.string,
29+
backdropClassName: PropTypes.string,
30+
contentClassName: PropTypes.string,
2731
cssModule: PropTypes.object,
2832
zIndex: PropTypes.oneOfType([
2933
PropTypes.number,
@@ -164,6 +168,10 @@ class Modal extends React.Component {
164168
renderChildren() {
165169
const {
166170
className,
171+
wrapClassName,
172+
modalClassName,
173+
backdropClassName,
174+
contentClassName,
167175
cssModule,
168176
isOpen,
169177
size,
@@ -173,7 +181,7 @@ class Modal extends React.Component {
173181
} = omit(this.props, ['toggle', 'keyboard', 'onEnter', 'onExit', 'zIndex']);
174182

175183
return (
176-
<TransitionGroup component="div">
184+
<TransitionGroup component="div" className={mapToCssModules(wrapClassName)}>
177185
{isOpen && (
178186
<Fade
179187
key="modal-dialog"
@@ -184,7 +192,7 @@ class Modal extends React.Component {
184192
transitionLeaveTimeout={300}
185193
onClickCapture={this.handleBackdropClick}
186194
onKeyUp={this.handleEscape}
187-
className={mapToCssModules('modal', cssModule)}
195+
className={mapToCssModules(classNames('modal', modalClassName), cssModule)}
188196
style={{ display: 'block' }}
189197
tabIndex="-1"
190198
>
@@ -196,7 +204,7 @@ class Modal extends React.Component {
196204
ref={(c) => (this._dialog = c)}
197205
{...attributes}
198206
>
199-
<div className={mapToCssModules('modal-content', cssModule)}>
207+
<div className={mapToCssModules(classNames('modal-content', contentClassName), cssModule)}>
200208
{children}
201209
</div>
202210
</div>
@@ -208,7 +216,7 @@ class Modal extends React.Component {
208216
transitionAppearTimeout={150}
209217
transitionEnterTimeout={150}
210218
transitionLeaveTimeout={150}
211-
className={mapToCssModules('modal-backdrop', cssModule)}
219+
className={mapToCssModules(classNames('modal-backdrop', backdropClassName), cssModule)}
212220
/>
213221
)}
214222
</TransitionGroup>

src/__tests__/Modal.spec.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,62 @@ describe('Modal', () => {
9090
wrapper.unmount();
9191
});
9292

93+
it('should render with class "modal" and have custom class name if provided with modalClassName', () => {
94+
isOpen = true;
95+
const wrapper = mount(
96+
<Modal isOpen={isOpen} toggle={toggle} modalClassName="my-custom-modal">
97+
Yo!
98+
</Modal>
99+
);
100+
101+
jasmine.clock().tick(300);
102+
expect(wrapper.children().length).toBe(0);
103+
expect(document.querySelectorAll('.modal.my-custom-modal').length).toBe(1);
104+
wrapper.unmount();
105+
});
106+
107+
it('should render with custom class name if provided with wrapClassName', () => {
108+
isOpen = true;
109+
const wrapper = mount(
110+
<Modal isOpen={isOpen} toggle={toggle} wrapClassName="my-custom-modal">
111+
Yo!
112+
</Modal>
113+
);
114+
115+
jasmine.clock().tick(300);
116+
expect(wrapper.children().length).toBe(0);
117+
expect(document.getElementsByClassName('my-custom-modal').length).toBe(1);
118+
wrapper.unmount();
119+
});
120+
121+
it('should render with class "modal-content" and have custom class name if provided with contentClassName', () => {
122+
isOpen = true;
123+
const wrapper = mount(
124+
<Modal isOpen={isOpen} toggle={toggle} contentClassName="my-custom-modal">
125+
Yo!
126+
</Modal>
127+
);
128+
129+
jasmine.clock().tick(300);
130+
expect(wrapper.children().length).toBe(0);
131+
expect(document.querySelectorAll('.modal-content.my-custom-modal').length).toBe(1);
132+
wrapper.unmount();
133+
});
134+
135+
it('should render with class "modal-backdrop" and have custom class name if provided with backdropClassName', () => {
136+
isOpen = true;
137+
const wrapper = mount(
138+
<Modal isOpen={isOpen} toggle={toggle} backdropClassName="my-custom-modal">
139+
Yo!
140+
</Modal>
141+
);
142+
143+
jasmine.clock().tick(300);
144+
expect(wrapper.children().length).toBe(0);
145+
expect(document.querySelectorAll('.modal-backdrop.my-custom-modal').length).toBe(1);
146+
wrapper.unmount();
147+
});
148+
93149
it('should render with the class "modal-${size}" when size is passed', () => {
94150
isOpen = true;
95151
const wrapper = mount(

0 commit comments

Comments
 (0)