1 import React from 'react';
2 import Tab from 'react-bootstrap/lib/Tab.js';
5 class ValidationTab extends React.Component {
8 children: React.PropTypes.node,
9 eventKey: React.PropTypes.any.isRequired,
10 onValidationStateChange: React.PropTypes.func //This property is assigned dynamically via React.cloneElement. lookup ValidationTabs.jsx. therefore it cannot be stated as required!
15 this.validationComponents = [];
18 static childContextTypes = {
19 validationParent: React.PropTypes.any
22 static contextTypes = {
23 validationParent: React.PropTypes.any
27 return {validationParent: this};
36 let validationParent = this.context.validationParent;
37 if (validationParent) {
38 validationParent.register(this);
42 componentWillUnmount() {
43 let validationParent = this.context.validationParent;
44 if (validationParent) {
45 validationParent.unregister(this);
49 register(validationComponent) {
50 this.validationComponents.push(validationComponent);
53 unregister(validationComponent) {
54 this.childValidStateChanged(validationComponent, true);
55 this.validationComponents = this.validationComponents.filter(otherValidationComponent => validationComponent !== otherValidationComponent);
58 notifyValidStateChangedToParent(isValid) {
60 let validationParent = this.context.validationParent;
61 if (validationParent) {
62 validationParent.childValidStateChanged(this, isValid);
66 childValidStateChanged(validationComponent, isValid) {
68 const currentValidState = this.state.isValid;
69 if (isValid !== currentValidState) {
70 let filteredValidationComponents = this.validationComponents.filter(otherValidationComponent => validationComponent !== otherValidationComponent);
71 let newValidState = isValid && filteredValidationComponents.every(otherValidationComponent => {
72 return otherValidationComponent.isValid();
74 this.setState({isValid: newValidState, notifyParent: true});
80 this.validationComponents.forEach(validationComponent => {
81 const isValidationComponentValid = validationComponent.validate().isValid;
82 isValid = isValidationComponentValid && isValid;
84 this.setState({isValid, notifyParent: false});
88 componentDidUpdate(prevProps, prevState) {
89 if(prevState.isValid !== this.state.isValid) {
90 if(this.state.notifyParent) {
91 this.notifyValidStateChangedToParent(this.state.isValid);
93 this.props.onValidationStateChange(this.props.eventKey, this.state.isValid);
98 return this.state.isValid;
102 let {children, ...tabProps} = this.props;
104 <Tab {...tabProps}>{children}</Tab>