summaryrefslogtreecommitdiffstats
path: root/openecomp-ui/src/nfvo-components/panel/SlidePanel.jsx
blob: 10c532630033cead9a52962af5a8b57737b3b5fc (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
108
109
import React from 'react';
import FontAwesome from 'react-fontawesome';
import ReactDOM from 'react-dom';

class SlidePanel extends React.Component {

	static PropTypes = {
		direction: React.PropTypes.string.isRequired,
		className: React.PropTypes.string,
		title: React.PropTypes.string,
		isOpen: React.PropTypes.bool
	};

	static defaultProps = {
		title: '',
		className: '',
		isOpen: true
	};

	state = {
		isOpen: this.props.isOpen,
		direction: this.props.direction,
		width: 0,
		arrowWidth: 0
	};

	componentDidMount() {
		this.setSliderPosition();
	}

	componentDidUpdate() {
		this.setSliderPosition();
	}

	render() {

		let {children, className} = this.props;
		let {isOpen} = this.state;

		return (
			<div className={ `slide-panel ${className}`}>
				{this.renderHeader(isOpen)}
				<div className={'slide-panel-content ' + (isOpen ? 'opened' : 'closed')}>{children}</div>
			</div>
		);
	}

	renderHeader(isOpen) {
		let {direction: initialDirection, title} = this.props;
		let {direction: currentDirection} = this.state;

		let iconName = currentDirection === 'right' ? 'angle-double-right collapse-double-icon' : 'angle-double-left collapse-double-icon';

		let awestyle = {padding: '5px'};

		if (!isOpen && initialDirection === 'right') {
			awestyle.marginLeft = '-1px';
		}
		return (
			<div className='slide-panel-header'>
				{ initialDirection === 'left' && <span className='slide-panel-header-title'>{title}</span>}
				<FontAwesome
					ref='arrowIcon'
					style={awestyle}
					onClick={this.handleClick}
					className='pull-right'
					name={iconName}
					size='2x'/>
				{ initialDirection === 'right' && <span className='slide-panel-header-title'>{title}</span>}
			</div>
		);
	}

	handleClick = () => {
		this.setState({
			isOpen: !this.state.isOpen,
			direction: this.state.direction === 'left' ? 'right' : 'left'
		});
	}

	setSliderPosition = () => {

		let el = ReactDOM.findDOMNode(this);
		let {style} = el;

		let {direction: initialDirection} = this.props;
		let arrowIconSize = Math.floor(ReactDOM.findDOMNode(this.refs.arrowIcon).getBoundingClientRect().width) * 2;
		if (!this.state.isOpen) {
			if (this.props.direction === 'left') {
				style.left = arrowIconSize - el.getBoundingClientRect().width + 'px';
			}
			if (initialDirection === 'right') {
				style.right = arrowIconSize - el.getBoundingClientRect().width + 'px';
			}
		}
		else {
			if (initialDirection === 'left') {
				style.left = '0px';
			}

			if (this.props.direction === 'right') {
				style.right = '0px';
			}
		}
	}

}

export default SlidePanel;