Skip to content

Commit

Permalink
feat(Modal): add charCode prop for custom icon (#1162)
Browse files Browse the repository at this point in the history
Closes #1155
  • Loading branch information
Seth authored and TheSharpieOne committed Aug 6, 2018
1 parent 2a9ac21 commit 4d19b09
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 1 deletion.
17 changes: 17 additions & 0 deletions docs/lib/Components/ModalsPage.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ const ModalFadelessExampleSource = require('!!raw!../examples/ModalFadeless');
import ModalExternalExample from '../examples/ModalExternal';
const ModalExternalExampleSource = require('!!raw!../examples/ModalExternal');

import ModalCustomCloseIconExample from '../examples/ModalCustomCloseIcon';
const ModalCustomCloseIconExampleSource = require('!!raw!../examples/ModalCutomCloseIcon');

export default class ModalsPage extends React.Component {
render() {
return (
Expand Down Expand Up @@ -171,6 +174,20 @@ export default class ModalsPage extends React.Component {
{ModalExternalExampleSource}
</PrismCode>
</pre>

<h4>Modals with custom close icon</h4>
<div className="docs-example">
<div className="btn-group">
<div className="btn">
<ModalCustomCloseIconExample buttonLabel="Launch Modal with custom close button" />
</div>
</div>
</div>
<pre>
<PrismCode className="language-jsx">
{ModalCustomCloseIconExampleSource}
</PrismCode>
</pre>
</div>
);
}
Expand Down
41 changes: 41 additions & 0 deletions docs/lib/examples/ModalCustomCloseIcon.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/* eslint react/no-multi-comp: 0, react/prop-types: 0 */

import React from 'react';
import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';

class ModalExample extends React.Component {
constructor(props) {
super(props);
this.state = {
modal: false
};

this.toggle = this.toggle.bind(this);
}

toggle() {
this.setState({
modal: !this.state.modal
});
}

render() {
return (
<div>
<Button color="danger" onClick={this.toggle}>{this.props.buttonLabel}</Button>
<Modal isOpen={this.state.modal} toggle={this.toggle} className={this.props.className}>
<ModalHeader toggle={this.toggle} charCode="Y">Modal title</ModalHeader>
<ModalBody>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</ModalBody>
<ModalFooter>
<Button color="primary" onClick={this.toggle}>Do Something</Button>{' '}
<Button color="secondary" onClick={this.toggle}>Cancel</Button>
</ModalFooter>
</Modal>
</div>
);
}
}

export default ModalExample;
6 changes: 5 additions & 1 deletion src/ModalHeader.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@ const propTypes = {
cssModule: PropTypes.object,
children: PropTypes.node,
closeAriaLabel: PropTypes.string,
charCode: PropTypes.oneOfType([PropTypes.string, PropTypes.number])
};

const defaultProps = {
tag: 'h5',
wrapTag: 'div',
closeAriaLabel: 'Close',
charCode: 215,
};

const ModalHeader = (props) => {
Expand All @@ -29,6 +31,7 @@ const ModalHeader = (props) => {
tag: Tag,
wrapTag: WrapTag,
closeAriaLabel,
charCode,
...attributes } = props;

const classes = mapToCssModules(classNames(
Expand All @@ -37,9 +40,10 @@ const ModalHeader = (props) => {
), cssModule);

if (toggle) {
const closeIcon = typeof charCode === 'number' ? String.fromCharCode(charCode) : charCode;
closeButton = (
<button type="button" onClick={toggle} className={mapToCssModules('close', cssModule)} aria-label={closeAriaLabel}>
<span aria-hidden="true">{String.fromCharCode(215)}</span>
<span aria-hidden="true">{closeIcon}</span>
</button>
);
}
Expand Down
15 changes: 15 additions & 0 deletions src/__tests__/ModalHeader.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,19 @@ describe('ModalHeader', () => {
const closeButton = wrapper.find('button.close').first();
expect(closeButton.prop('aria-label')).toBe('oseclay');
});

it('should render close button with default icon', () => {
const wrapper = shallow(<ModalHeader toggle={() => {}}>Yo!</ModalHeader>);

const closeButtonIcon = wrapper.find('button.close span');
const defaultIcon = String.fromCharCode(215);
expect(closeButtonIcon.text()).toEqual(defaultIcon);
});

it('should render close button with custom icon', () => {
const wrapper = shallow(<ModalHeader toggle={() => {}} charCode={'X'}>Yo!</ModalHeader>);

const closeButtonIcon = wrapper.find('button.close span');
expect(closeButtonIcon.text()).toEqual('X');
});
});

0 comments on commit 4d19b09

Please sign in to comment.