summaryrefslogtreecommitdiffstats
path: root/openecomp-ui/src/nfvo-components/input/validation/ValidationTab.jsx
blob: 6036518288eb2d0cbe5c6a80d210b9dadfa3398e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import React from 'react';
import Tab from 'react-bootstrap/lib/Tab.js';

export default
class ValidationTab extends React.Component {

	static propTypes = {
		children: React.PropTypes.node,
		eventKey: React.PropTypes.any.isRequired,
		onValidationStateChange: React.PropTypes.func //This property is assigned dynamically via React.cloneElement. lookup ValidationTabs.jsx. therefore it cannot be stated as required!
	};

	constructor(props) {
		super(props);
		this.validationComponents = [];
	}

	static childContextTypes = {
		validationParent: React.PropTypes.any
	};

	static contextTypes = {
		validationParent: React.PropTypes.any
	};

	getChildContext() {
		return {validationParent: this};
	}

	state = {
		isValid: true,
		notifyParent: false
	};

	componentDidMount() {
		let validationParent = this.context.validationParent;
		if (validationParent) {
			validationParent.register(this);
		}
	}

	componentWillUnmount() {
		let validationParent = this.context.validationParent;
		if (validationParent) {
			validationParent.unregister(this);
		}
	}

	register(validationComponent) {
		this.validationComponents.push(validationComponent);
	}

	unregister(validationComponent) {
		this.childValidStateChanged(validationComponent, true);
		this.validationComponents = this.validationComponents.filter(otherValidationComponent => validationComponent !== otherValidationComponent);
	}

	notifyValidStateChangedToParent(isValid) {

		let validationParent = this.context.validationParent;
		if (validationParent) {
			validationParent.childValidStateChanged(this, isValid);
		}
	}

	childValidStateChanged(validationComponent, isValid) {

		const currentValidState = this.state.isValid;
		if (isValid !== currentValidState) {
			let filteredValidationComponents = this.validationComponents.filter(otherValidationComponent => validationComponent !== otherValidationComponent);
			let newValidState = isValid && filteredValidationComponents.every(otherValidationComponent => {
				return otherValidationComponent.isValid();
			});
			this.setState({isValid: newValidState, notifyParent: true});
		}
	}

	validate() {
		let isValid = true;
		this.validationComponents.forEach(validationComponent => {
			const isValidationComponentValid = validationComponent.validate().isValid;
			isValid = isValidationComponentValid && isValid;
		});
		this.setState({isValid, notifyParent: false});
		return {isValid};
	}

	componentDidUpdate(prevProps, prevState) {
		if(prevState.isValid !== this.state.isValid) {
			if(this.state.notifyParent) {
				this.notifyValidStateChangedToParent(this.state.isValid);
			}
			this.props.onValidationStateChange(this.props.eventKey, this.state.isValid);
		}
	}

	isValid() {
		return this.state.isValid;
	}

	render() {
		let {children, ...tabProps} = this.props;
		return (
			<Tab {...tabProps}>{children}</Tab>
		);
	}
}