Merge pull request #1814 from react-toolbox/update-v2-react16

Update v2 to React 16
old
Rubén Moya 2018-03-03 11:57:48 +01:00 committed by GitHub
commit a59af9a67f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 787 additions and 422 deletions

View File

@ -17,7 +17,7 @@ describe('Chip', () => {
<span>Test</span> <span>Test</span>
</Chip>, </Chip>,
); );
const chipNode = wrapper.find('div').node; const chipNode = wrapper.find('div').instance();
expect(chipNode.className).toMatch(/\bavatar-class\b/); expect(chipNode.className).toMatch(/\bavatar-class\b/);
}); });
@ -29,7 +29,7 @@ describe('Chip', () => {
<span>Test</span> <span>Test</span>
</TooltippedChip>, </TooltippedChip>,
); );
const chipNode = wrapper.find('div').node; const chipNode = wrapper.find('div').instance();
expect(chipNode.className).toMatch(/\bavatar-class\b/); expect(chipNode.className).toMatch(/\bavatar-class\b/);
}); });
}); });
@ -41,7 +41,7 @@ describe('Chip', () => {
<span>Test</span> <span>Test</span>
</Chip>, </Chip>,
); );
const chipNode = wrapper.find('div').node; const chipNode = wrapper.find('div').instance();
expect(chipNode.className).not.toMatch(/\bavatar-class\b/); expect(chipNode.className).not.toMatch(/\bavatar-class\b/);
}); });
}); });

View File

@ -1,6 +1,7 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import CssTransitionGroup from 'react-transition-group/CSSTransitionGroup'; import TransitionGroup from 'react-transition-group/TransitionGroup';
import CSSTransition from 'react-transition-group/CSSTransition';
import { range, getAnimationModule } from '../utils/utils'; import { range, getAnimationModule } from '../utils/utils';
import time from '../utils/time'; import time from '../utils/time';
import CalendarMonth from './CalendarMonth'; import CalendarMonth from './CalendarMonth';
@ -135,25 +136,23 @@ const factory = (IconButton) => {
<div data-react-toolbox="calendar"> <div data-react-toolbox="calendar">
<IconButton id="left" className={theme.prev} icon="chevron_left" onClick={this.changeViewMonth} /> <IconButton id="left" className={theme.prev} icon="chevron_left" onClick={this.changeViewMonth} />
<IconButton id="right" className={theme.next} icon="chevron_right" onClick={this.changeViewMonth} /> <IconButton id="right" className={theme.next} icon="chevron_right" onClick={this.changeViewMonth} />
<CssTransitionGroup <TransitionGroup>
transitionName={animationModule} <CSSTransition classNames={animationModule} timeout={350}>
transitionEnterTimeout={350} <CalendarMonth
transitionLeaveTimeout={350} enabledDates={this.props.enabledDates}
> disabledDates={this.props.disabledDates}
<CalendarMonth key={this.state.viewDate.getMonth()}
enabledDates={this.props.enabledDates} locale={this.props.locale}
disabledDates={this.props.disabledDates} maxDate={this.props.maxDate}
key={this.state.viewDate.getMonth()} minDate={this.props.minDate}
locale={this.props.locale} onDayClick={this.handleDayClick}
maxDate={this.props.maxDate} selectedDate={this.props.selectedDate}
minDate={this.props.minDate} sundayFirstDayOfWeek={this.props.sundayFirstDayOfWeek}
onDayClick={this.handleDayClick} theme={this.props.theme}
selectedDate={this.props.selectedDate} viewDate={this.state.viewDate}
sundayFirstDayOfWeek={this.props.sundayFirstDayOfWeek} />
theme={this.props.theme} </CSSTransition>
viewDate={this.state.viewDate} </TransitionGroup>
/>
</CssTransitionGroup>
</div> </div>
); );
} }

View File

@ -28,13 +28,6 @@ const ActivableRendererFactory = (options = { delay: 500 }) =>
clearTimeout(this.unrenderTimeout); clearTimeout(this.unrenderTimeout);
} }
renderAndActivate() {
if (this.unrenderTimeout) clearTimeout(this.unrenderTimeout);
this.setState({ rendered: true, active: false }, () => {
this.activateTimeout = setTimeout(() => this.setState({ active: true }), 20);
});
}
deactivateAndUnrender() { deactivateAndUnrender() {
this.setState({ rendered: true, active: false }, () => { this.setState({ rendered: true, active: false }, () => {
this.unrenderTimeout = setTimeout(() => { this.unrenderTimeout = setTimeout(() => {
@ -44,6 +37,13 @@ const ActivableRendererFactory = (options = { delay: 500 }) =>
}); });
} }
renderAndActivate() {
if (this.unrenderTimeout) clearTimeout(this.unrenderTimeout);
this.setState({ rendered: true, active: false }, () => {
this.activateTimeout = setTimeout(() => this.setState({ active: true }), 20);
});
}
render() { render() {
const { delay, ...others } = this.props; // eslint-disable-line no-unused-vars const { delay, ...others } = this.props; // eslint-disable-line no-unused-vars
const { active, rendered } = this.state; const { active, rendered } = this.state;

View File

@ -27,25 +27,25 @@ describe('ProgressBar', () => {
describe('#render', () => { describe('#render', () => {
it('renders the value and buffer bars when it is linear', () => { it('renders the value and buffer bars when it is linear', () => {
const wrapper = mount(<ProgressBar theme={theme} />); const wrapper = mount(<ProgressBar theme={theme} />);
expect(wrapper.childAt(0).props().children.length).toEqual(2); expect(wrapper.childAt(0).childAt(0).props().children.length).toEqual(2);
}); });
it('renders the value and buffer bars when it is linear', () => { it('renders the value and buffer bars when it is linear', () => {
const wrapper = mount(<ProgressBar mode="determinate" value={30} buffer={60} theme={theme} />); const wrapper = mount(<ProgressBar mode="determinate" value={30} buffer={60} theme={theme} />);
const buffer = wrapper.childAt(0).childAt(0); const buffer = wrapper.childAt(0).childAt(0).childAt(0);
const value = wrapper.childAt(0).childAt(1); const value = wrapper.childAt(0).childAt(0).childAt(1);
expect(buffer.props().style.transform).toEqual(`scaleX(${0.6})`); expect(buffer.props().style.transform).toEqual(`scaleX(${0.6})`);
expect(value.props().style.transform).toEqual(`scaleX(${0.3})`); expect(value.props().style.transform).toEqual(`scaleX(${0.3})`);
}); });
it('renders the svg circle when it is circular', () => { it('renders the svg circle when it is circular', () => {
const wrapper = mount(<ProgressBar type="circular" theme={theme} />); const wrapper = mount(<ProgressBar type="circular" theme={theme} />);
expect(wrapper.childAt(0).props().children.type).toEqual('circle'); expect(wrapper.childAt(0).childAt(0).props().children.type).toEqual('circle');
}); });
it('renders the proper circle length style when it is circular and determinate', () => { it('renders the proper circle length style when it is circular and determinate', () => {
const wrapper = mount(<ProgressBar type="circular" mode="determinate" value={30} theme={theme} />); const wrapper = mount(<ProgressBar type="circular" mode="determinate" value={30} theme={theme} />);
const circle = wrapper.childAt(0).props().children; const circle = wrapper.childAt(0).childAt(0).props().children;
const strokeLength = 2 * Math.PI * circle.props.r * 0.3; const strokeLength = 2 * Math.PI * circle.props.r * 0.3;
expect(circle.props.style.strokeDasharray).toEqual(`${strokeLength}, 400`); expect(circle.props.style.strokeDasharray).toEqual(`${strokeLength}, 400`);
}); });

View File

@ -93,7 +93,7 @@ describe('Slider', () => {
it('sets pressed state when knob is clicked', () => { it('sets pressed state when knob is clicked', () => {
const onChange = jest.fn(); const onChange = jest.fn();
const wrapper = mount(<Slider min={-500} max={500} onChange={onChange} />); const wrapper = mount(<Slider min={-500} max={500} onChange={onChange} />);
const knob = wrapper.childAt(0).childAt(0); const knob = wrapper.childAt(0).childAt(0).childAt(0);
knob.simulate('mouseDown'); knob.simulate('mouseDown');
expect(wrapper.state().pressed).toEqual(true); expect(wrapper.state().pressed).toEqual(true);
}); });
@ -102,7 +102,7 @@ describe('Slider', () => {
const onChange = jest.fn(); const onChange = jest.fn();
const event = { touches: [{ pageX: 200 }] }; const event = { touches: [{ pageX: 200 }] };
const wrapper = mount(<Slider min={-500} max={500} onChange={onChange} />); const wrapper = mount(<Slider min={-500} max={500} onChange={onChange} />);
const knob = wrapper.childAt(0).childAt(0); const knob = wrapper.childAt(0).childAt(0).childAt(0);
knob.simulate('touchStart', event); knob.simulate('touchStart', event);
expect(wrapper.state().pressed).toEqual(true); expect(wrapper.state().pressed).toEqual(true);
}); });
@ -114,7 +114,7 @@ describe('Slider', () => {
const instance = wrapper.instance(); const instance = wrapper.instance();
instance.setState({ sliderStart: 0, sliderLength: 1000 }); instance.setState({ sliderStart: 0, sliderLength: 1000 });
instance.handleResize = (evt, callback) => { callback(); }; instance.handleResize = (evt, callback) => { callback(); };
wrapper.childAt(0).simulate('mouseDown', event); wrapper.childAt(0).childAt(0).simulate('mouseDown', event);
expect(onChange).toHaveBeenCalledWith(-300); expect(onChange).toHaveBeenCalledWith(-300);
}); });
@ -125,7 +125,7 @@ describe('Slider', () => {
const instance = wrapper.instance(); const instance = wrapper.instance();
instance.setState({ sliderStart: 0, sliderLength: 1000 }); instance.setState({ sliderStart: 0, sliderLength: 1000 });
instance.handleResize = (evt, callback) => { callback(); }; instance.handleResize = (evt, callback) => { callback(); };
wrapper.childAt(0).simulate('touchStart', event); wrapper.childAt(0).childAt(0).simulate('touchStart', event);
expect(onChange).toHaveBeenCalledWith(-300); expect(onChange).toHaveBeenCalledWith(-300);
}); });
@ -136,7 +136,7 @@ describe('Slider', () => {
const instance = wrapper.instance(); const instance = wrapper.instance();
instance.setState({ sliderStart: 0, sliderLength: 1000 }); instance.setState({ sliderStart: 0, sliderLength: 1000 });
instance.handleResize = (evt, callback) => { callback(); }; instance.handleResize = (evt, callback) => { callback(); };
wrapper.childAt(0).simulate('mouseDown', event); wrapper.childAt(0).childAt(0).simulate('mouseDown', event);
expect(onChange).toHaveBeenCalledWith(90); expect(onChange).toHaveBeenCalledWith(90);
}); });
@ -154,7 +154,7 @@ describe('Slider', () => {
const onChange = jest.fn(); const onChange = jest.fn();
const wrapper = mount(<Slider editable value={50} onChange={onChange} />); const wrapper = mount(<Slider editable value={50} onChange={onChange} />);
wrapper.instance().setState({ sliderStart: 0, sliderLength: 1000 }); wrapper.instance().setState({ sliderStart: 0, sliderLength: 1000 });
wrapper.childAt(0).simulate('mouseDown', { pageX: 900, pageY: 0 }); wrapper.childAt(0).childAt(0).simulate('mouseDown', { pageX: 900, pageY: 0 });
expect(onChange).toHaveBeenCalled(); expect(onChange).toHaveBeenCalled();
}); });
}); });

View File

@ -19,7 +19,7 @@ const factory = (Button) => {
PropTypes.element, PropTypes.element,
]), ]),
onClick: PropTypes.func, onClick: PropTypes.func,
onTimeout: PropTypes.func, onTimeout: PropTypes.func, // eslint-disable-line
theme: PropTypes.shape({ theme: PropTypes.shape({
accept: PropTypes.string, accept: PropTypes.string,
active: PropTypes.string, active: PropTypes.string,

View File

@ -4,7 +4,7 @@ import classnames from 'classnames';
import { themr } from 'react-css-themr'; import { themr } from 'react-css-themr';
import { TABS } from '../identifiers'; import { TABS } from '../identifiers';
class TabContent extends Component { class TabContent extends Component { // eslint-disable-line react/prefer-stateless-function
static propTypes = { static propTypes = {
active: PropTypes.bool, active: PropTypes.bool,
children: PropTypes.node, children: PropTypes.node,

View File

@ -24,21 +24,27 @@ describe('Tabs', () => {
it('defaults to only rendering the current tab', () => { it('defaults to only rendering the current tab', () => {
const wrapper = mount(<Composition />); const wrapper = mount(<Composition />);
expect(wrapper.find(TabContent).length).toEqual(1); expect(wrapper.find(TabContent).length).toEqual(1);
expect(wrapper.find(TabContent).first().prop('tabIndex')).toEqual(0); expect(wrapper.find(TabContent).first().prop('tabIndex')).toEqual(0);
wrapper.instance().setState({ index: 1 }); wrapper.instance().setState({ index: 1 });
wrapper.update();
expect(wrapper.find(TabContent).length).toEqual(1); expect(wrapper.find(TabContent).length).toEqual(1);
expect(wrapper.find(TabContent).first().prop('tabIndex')).toEqual(1); expect(wrapper.find(TabContent).first().prop('tabIndex')).toEqual(1);
}); });
it('renders inactive tabs when hideMode is set to display', () => { it('renders inactive tabs when hideMode is set to display', () => {
const wrapper = mount(<Composition hideMode="display" />); const wrapper = mount(<Composition hideMode="display" />);
expect(wrapper.find(TabContent).length).toEqual(2); expect(wrapper.find(TabContent).length).toEqual(2);
expect(wrapper.find(TabContent).at(0).prop('hidden')).toEqual(false); expect(wrapper.find(TabContent).at(0).prop('hidden')).toEqual(false);
expect(wrapper.find(TabContent).at(1).prop('hidden')).toEqual(true); expect(wrapper.find(TabContent).at(1).prop('hidden')).toEqual(true);
wrapper.instance().setState({ index: 1 }); wrapper.instance().setState({ index: 1 });
wrapper.update();
expect(wrapper.find(TabContent).length).toEqual(2); expect(wrapper.find(TabContent).length).toEqual(2);
expect(wrapper.find(TabContent).at(0).prop('hidden')).toEqual(true); expect(wrapper.find(TabContent).at(0).prop('hidden')).toEqual(true);
expect(wrapper.find(TabContent).at(1).prop('hidden')).toEqual(false); expect(wrapper.find(TabContent).at(1).prop('hidden')).toEqual(false);

View File

@ -1,6 +1,7 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import CssTransitionGroup from 'react-transition-group/CSSTransitionGroup'; import TransitionGroup from 'react-transition-group/TransitionGroup';
import CSSTransition from 'react-transition-group/CSSTransition';
import { getAnimationModule } from '../utils/utils'; import { getAnimationModule } from '../utils/utils';
import time from '../utils/time'; import time from '../utils/time';
import Hours from './ClockHours'; import Hours from './ClockHours';
@ -116,20 +117,18 @@ class Clock extends Component {
style={{ height: this.state.radius * 2 }} style={{ height: this.state.radius * 2 }}
ref={(node) => { this.placeholderNode = node; }} ref={(node) => { this.placeholderNode = node; }}
> >
<CssTransitionGroup <TransitionGroup>
transitionName={animationModule} <CSSTransition classNames={animationModule} timeout={500}>
transitionEnterTimeout={500} <div
transitionLeaveTimeout={500} key={this.props.display}
> className={theme.clockWrapper}
<div style={{ height: this.state.radius * 2 }}
key={this.props.display} >
className={theme.clockWrapper} {this.props.display === 'hours' ? this.renderHours() : null}
style={{ height: this.state.radius * 2 }} {this.props.display === 'minutes' ? this.renderMinutes() : null}
> </div>
{this.props.display === 'hours' ? this.renderHours() : null} </CSSTransition>
{this.props.display === 'minutes' ? this.renderMinutes() : null} </TransitionGroup>
</div>
</CssTransitionGroup>
</div> </div>
</div> </div>
); );

View File

@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import TestUtils from 'react-addons-test-utils'; import TestUtils from 'react-dom/test-utils';
export default { export default {
renderComponent(Component, props = {}, state = {}) { renderComponent(Component, props = {}, state = {}) {

3
jest.polyfills.js Normal file
View File

@ -0,0 +1,3 @@
global.requestAnimationFrame = function (callback) {
setTimeout(callback, 0);
};

View File

@ -1 +1,7 @@
Object.defineProperty(window, 'requestAnimationFrame', { value: fn => fn() }); import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
configure({
adapter: new Adapter(),
disableLifecycleMethods: true,
});

View File

@ -26,38 +26,42 @@
"toolkit" "toolkit"
], ],
"dependencies": { "dependencies": {
"@types/prop-types": "^15.5.2",
"classnames": "^2.2.5", "classnames": "^2.2.5",
"core-js": "^2.4.0", "core-js": "^2.4.0",
"ramda": "^0.23.0", "ramda": "^0.23.0",
"react-css-themr": "^2.1.2", "react-css-themr": "^2.1.2",
"react-style-proptype": "^3.0.0", "react-style-proptype": "^3.0.0",
"react-transition-group": "^1.1.3" "react-transition-group": "^2.2.1"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^7.0.4", "@types/node": "^7.0.4",
"@types/react": "^15.0.0", "@types/react": "^16.0.7",
"babel-cli": "^6.24.1", "ajv": "^6.1.1",
"babel-core": "^6.24.1", "babel-cli": "^6.26.0",
"babel-core": "^6.26.0",
"babel-eslint": "^7.2.3", "babel-eslint": "^7.2.3",
"babel-loader": "^7.0.0", "babel-loader": "^7.1.2",
"babel-plugin-react-transform": "^2.0.2", "babel-plugin-react-transform": "^2.0.2",
"babel-polyfill": "^6.23.0", "babel-polyfill": "^6.23.0",
"babel-preset-es2015": "^6.24.1", "babel-preset-es2015": "^6.24.1",
"babel-preset-react": "^6.24.1", "babel-preset-react": "^6.24.1",
"babel-preset-stage-0": "^6.24.1", "babel-preset-stage-0": "^6.24.1",
"caniuse-db": "^1.0.30000652",
"cpx": "^1.5.0", "cpx": "^1.5.0",
"cross-env": "^5.0.0", "cross-env": "^5.0.0",
"css-loader": "^0.28.2", "css-loader": "^0.28.2",
"enzyme": "^2.8.2", "enzyme": "^3.3.0",
"enzyme-to-json": "^1.5.1", "enzyme-adapter-react-16": "^1.1.1",
"enzyme-to-json": "^3.0.1",
"eslint": "^3.19.0", "eslint": "^3.19.0",
"eslint-config-airbnb": "^15.0.1", "eslint-config-airbnb": "^15.0.1",
"eslint-import-resolver-webpack": "^0.8.1", "eslint-import-resolver-webpack": "^0.8.3",
"eslint-plugin-babel": "^4.1.1", "eslint-plugin-babel": "^4.1.2",
"eslint-plugin-compat": "^1.0.2", "eslint-plugin-compat": "^1.0.4",
"eslint-plugin-import": "^2.3.0", "eslint-plugin-import": "^2.7.0",
"eslint-plugin-jsx-a11y": "^5.0.3", "eslint-plugin-jsx-a11y": "^5.0.3",
"eslint-plugin-react": "^7.0.1", "eslint-plugin-react": "^7.4.0",
"express": "^4.15.3", "express": "^4.15.3",
"extract-text-webpack-plugin": "^2.1.0", "extract-text-webpack-plugin": "^2.1.0",
"git-dirty": "^1.0.2", "git-dirty": "^1.0.2",
@ -79,21 +83,20 @@
"postcss-nesting": "^4.0.1", "postcss-nesting": "^4.0.1",
"postcss-reporter": "^3.0.0", "postcss-reporter": "^3.0.0",
"pre-commit": "^1.2.2", "pre-commit": "^1.2.2",
"prop-types": "^15.5.10", "prop-types": "^15.6.0",
"react": "^15.5.0", "react": "^16.2.0",
"react-addons-test-utils": "^15.5.0", "react-dom": "^16.2.0",
"react-dom": "^15.5.0", "react-test-renderer": "^16.2.0",
"react-test-renderer": "^15.5.0",
"react-transform-catch-errors": "^1.0.2", "react-transform-catch-errors": "^1.0.2",
"react-transform-hmr": "^1.0.4", "react-transform-hmr": "^1.0.4",
"redbox-react": "^1.3.6", "redbox-react": "^1.5.0",
"rimraf": "^2.6.1", "rimraf": "^2.6.1",
"sinon": "^2.0.0-pre.2", "sinon": "^2.0.0-pre.2",
"style-loader": "^0.18.1", "style-loader": "^0.18.1",
"stylelint": "^7.10.1", "stylelint": "^7.10.1",
"stylelint-config-standard": "^16.0.0", "stylelint-config-standard": "^16.0.0",
"stylelint-order": "^0.4.4", "stylelint-order": "^0.4.4",
"typescript": "^2.1.5", "typescript": "^2.3.0",
"webpack": "^2.6.0", "webpack": "^2.6.0",
"webpack-dev-middleware": "^1.10.2", "webpack-dev-middleware": "^1.10.2",
"webpack-hot-middleware": "^2.18.0" "webpack-hot-middleware": "^2.18.0"
@ -132,6 +135,7 @@
"<rootDir>/components" "<rootDir>/components"
], ],
"setupFiles": [ "setupFiles": [
"./jest.polyfills.js",
"./jest.setup.js" "./jest.setup.js"
], ],
"snapshotSerializers": [ "snapshotSerializers": [
@ -140,10 +144,10 @@
}, },
"peerDependencies": { "peerDependencies": {
"classnames": "^2.2.0", "classnames": "^2.2.0",
"prop-types": "^15.5.7", "prop-types": "^15.6.0",
"react": "^15.5.0", "react": "^15.5.0 || ^16.0.0",
"react-dom": "^15.5.0", "react-dom": "^15.5.0 || ^16.0.0",
"react-transition-group": "^1.1.3" "react-transition-group": "^2.2.0"
}, },
"pre-commit": "lint:staged" "pre-commit": "lint:staged"
} }

View File

@ -1,4 +1,5 @@
import * as React from 'react'; import * as React from 'react';
import * as PropTypes from 'prop-types';
import Button from '../../components/button'; import Button from '../../components/button';
import Dialog from '../../components/dialog'; import Dialog from '../../components/dialog';
import Dropdown from '../../components/dropdown'; import Dropdown from '../../components/dropdown';
@ -64,11 +65,11 @@ class DialogTest extends React.Component<any, any> {
class ContextComponent extends React.Component<any, any> { class ContextComponent extends React.Component<any, any> {
static propTypes = { static propTypes = {
children: React.PropTypes.any, children: PropTypes.any,
}; };
static childContextTypes = { static childContextTypes = {
message: React.PropTypes.string, message: PropTypes.string,
} }
getChildContext() { getChildContext() {
@ -84,7 +85,7 @@ class ContextComponent extends React.Component<any, any> {
class DialogChild extends React.Component<any, any> { class DialogChild extends React.Component<any, any> {
static contextTypes = { static contextTypes = {
message: React.PropTypes.string, message: PropTypes.string,
} }
render() { render() {

View File

@ -3,8 +3,8 @@ import DatePicker from '../../components/date_picker';
import TimePicker from '../../components/time_picker'; import TimePicker from '../../components/time_picker';
const datetime = new Date(2015, 10, 16); const datetime = new Date(2015, 10, 16);
const min_datetime = new Date(new Date(datetime).setDate(8)); const min_datetime = new Date(new Date(datetime.toString()).setDate(8));
const max_datetime = new Date(new Date(datetime).setDate(24)); const max_datetime = new Date(new Date(datetime.toString()).setDate(24));
datetime.setHours(17); datetime.setHours(17);
datetime.setMinutes(28); datetime.setMinutes(28);
const today = new Date(); const today = new Date();

1015
yarn.lock

File diff suppressed because it is too large Load Diff