Skip to content
This repository was archived by the owner on Jun 28, 2021. It is now read-only.

Commit e975636

Browse files
author
Tommy Leunen
committed
fixes Radio and IconToggle to update the checked/disabled state after the first render
1 parent 0e37acf commit e975636

File tree

4 files changed

+75
-2
lines changed

4 files changed

+75
-2
lines changed

src/IconToggle.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { PropTypes } from 'react';
2+
import { findDOMNode } from 'react-dom';
23
import classNames from 'classnames';
34
import Icon from './Icon';
45
import mdlUpgrade from './utils/mdlUpgrade';
@@ -12,6 +13,18 @@ class IconToggle extends React.Component {
1213
onChange: PropTypes.func,
1314
ripple: PropTypes.bool
1415
}
16+
17+
componentDidUpdate(prevProps) {
18+
if(this.props.disabled !== prevProps.disabled) {
19+
const fnName = this.props.disabled ? 'disable' : 'enable';
20+
findDOMNode(this).MaterialIconToggle[fnName]();
21+
}
22+
if(this.props.checked !== prevProps.checked) {
23+
const fnName = this.props.checked ? 'check' : 'uncheck';
24+
findDOMNode(this).MaterialIconToggle[fnName]();
25+
}
26+
}
27+
1528
render() {
1629
const { className, name, ripple, ...inputProps } = this.props;
1730

src/Radio.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { PropTypes } from 'react';
2+
import { findDOMNode } from 'react-dom';
23
import classNames from 'classnames';
34
import mdlUpgrade from './utils/mdlUpgrade';
45

@@ -16,6 +17,17 @@ class Radio extends React.Component {
1617
]).isRequired
1718
};
1819

20+
componentDidUpdate(prevProps) {
21+
if(this.props.disabled !== prevProps.disabled) {
22+
const fnName = this.props.disabled ? 'disable' : 'enable';
23+
findDOMNode(this).MaterialRadio[fnName]();
24+
}
25+
if(this.props.checked !== prevProps.checked) {
26+
const fnName = this.props.checked ? 'check' : 'uncheck';
27+
findDOMNode(this).MaterialRadio[fnName]();
28+
}
29+
}
30+
1931
render() {
2032
const { children, className, name, ripple, value, ...inputProps } = this.props;
2133

src/__tests__/IconToggle-test.js

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
/* eslint-env mocha */
22
import expect from 'expect';
33
import React from 'react';
4-
import { render } from './render';
4+
import ReactDOM from 'react-dom';
5+
import { render, renderDOM } from './render';
56
import IconToggle from '../IconToggle';
67
import Icon from '../Icon';
78

@@ -62,4 +63,27 @@ describe('IconToggle', () => {
6263
expect(output.type).toBe('label');
6364
expect(output.props.className).toInclude('mdl-js-ripple-effect');
6465
});
66+
67+
describe('should update the IconToggle after the first render', () => {
68+
it('when `checked` has changed', () => {
69+
const el = renderDOM(<IconToggle name="add" />);
70+
71+
expect(el.className).toExclude('is-checked');
72+
73+
ReactDOM.render(<IconToggle name="add" checked />, el.parentNode);
74+
expect(el.className).toInclude('is-checked');
75+
ReactDOM.render(<IconToggle name="add" />, el.parentNode);
76+
expect(el.className).toExclude('is-checked');
77+
});
78+
79+
it('when `disable` has changed', () => {
80+
const el = renderDOM(<IconToggle name="add" />);
81+
82+
expect(el.className).toExclude('is-disabled');
83+
ReactDOM.render(<IconToggle name="add" disabled />, el.parentNode);
84+
expect(el.className).toInclude('is-disabled');
85+
ReactDOM.render(<IconToggle name="add" />, el.parentNode);
86+
expect(el.className).toExclude('is-disabled');
87+
});
88+
});
6589
});

src/__tests__/Radio-test.js

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
/* eslint-env mocha */
22
import expect from 'expect';
33
import React from 'react';
4-
import { render } from './render';
4+
import ReactDOM from 'react-dom';
5+
import { render, renderDOM } from './render';
56
import Radio from '../Radio';
67

78
describe('Radio', () => {
@@ -42,4 +43,27 @@ describe('Radio', () => {
4243
expect(label.props.className).toBe('mdl-radio__label');
4344
expect(label.props.children).toBe('My label');
4445
});
46+
47+
describe('should update the Radio after the first render', () => {
48+
it('when `checked` has changed', () => {
49+
const el = renderDOM(<Radio />);
50+
51+
expect(el.className).toExclude('is-checked');
52+
53+
ReactDOM.render(<Radio checked />, el.parentNode);
54+
expect(el.className).toInclude('is-checked');
55+
ReactDOM.render(<Radio />, el.parentNode);
56+
expect(el.className).toExclude('is-checked');
57+
});
58+
59+
it('when `disable` has changed', () => {
60+
const el = renderDOM(<Radio />);
61+
62+
expect(el.className).toExclude('is-disabled');
63+
ReactDOM.render(<Radio disabled />, el.parentNode);
64+
expect(el.className).toInclude('is-disabled');
65+
ReactDOM.render(<Radio />, el.parentNode);
66+
expect(el.className).toExclude('is-disabled');
67+
});
68+
});
4569
});

0 commit comments

Comments
 (0)