2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6 * Copyright © 2017 Amdocs
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
21 * ECOMP is a trademark and service mark of AT&T Intellectual Property.
24 import React, {Component} from 'react';
25 import {connect} from 'react-redux';
26 import SplitPane from 'react-split-pane';
27 import { ClipLoader } from 'react-spinners';
28 import {COLOR_BLUE} from 'utils/GlobalConstants.js';
30 import {setSecondaryTitle} from 'app/MainScreenWrapperActionHelper.js';
31 import ForceDirectedGraph from 'generic-components/graph/ForceDirectedGraph.jsx';
32 import SelectedNodeDetails from 'app/tierSupport/selectedNodeDetails/SelectedNodeDetails.jsx';
35 import overlaysDetails from 'resources/overlays/overlaysDetails.json';
36 import * as Overlays from 'app/overlays/OverlayImports.js';
38 import i18n from 'utils/i18n/i18n';
43 querySelectedNodeElement,
46 } from 'app/tierSupport/TierSupportActions.js';
49 TSUI_NODE_DETAILS_INITIAL_WIDTH,
50 TSUI_NODE_DETAILS_MIN_WIDTH,
51 TSUI_GRAPH_MENU_NODE_DETAILS,
52 } from './TierSupportConstants.js';
54 let mapStateToProps = (
59 globalAutoCompleteSearchBar
64 forceDirectedGraphRawData = {
71 graphNodeSelectedMenu = TSUI_GRAPH_MENU_NODE_DETAILS,
73 feedbackMsgSeverity = '',
75 enableBusyFeedback = false
76 } = tierSupportReducer;
79 performPrepareVisualization = false,
80 selectedSuggestion = {}
81 } = globalAutoCompleteSearchBar;
83 forceDirectedGraphRawData,
86 graphNodeSelectedMenu,
87 performPrepareVisualization,
96 let mapActionToProps = (dispatch) => {
98 onSetViewTitle: (title) => {
99 dispatch(setSecondaryTitle(title));
101 onNodeSelected: (requestObject) => {
102 dispatch(onNodeDetailsChange(requestObject));
104 onNodeMenuSelect: (selectedMenu) => {
105 dispatch(onNodeMenuChange(selectedMenu.buttonId));
107 onSplitPaneResize: (initialLoad) => {
108 dispatch(splitPaneResize(initialLoad));
110 onNewVIParam: (param) => {
111 dispatch(querySelectedNodeElement(param));
113 onMessageStateChange: (msgText, msgSeverity) => {
114 dispatch(setNotificationText(msgText, msgSeverity));
116 onRequestClearData: () => {
117 dispatch(clearVIData());
122 class TierSupport extends Component {
124 forceDirectedGraphRawData: React.PropTypes.object,
125 windowWidth: React.PropTypes.number,
126 windowHeight: React.PropTypes.number,
127 graphNodeSelectedMenu: React.PropTypes.string,
128 feedbackMsgText: React.PropTypes.string,
129 feedbackMsgSeverity: React.PropTypes.string,
130 nodeData: React.PropTypes.object,
131 enableBusyFeedback: React.PropTypes.bool
134 componentWillReceiveProps(nextProps) {
135 if (nextProps.match.params.viParam &&
136 nextProps.match.params.viParam !==
137 this.props.match.params.viParam) {
138 this.props.onNewVIParam(nextProps.match.params.viParam);
140 if(nextProps.match.params.viParam && nextProps.match.params.viParam !==
141 this.props.match.params.viParam) {
142 this.props.onRequestClearData();
145 if (nextProps.feedbackMsgText !== this.props.feedbackMsgText) {
146 this.props.onMessageStateChange(nextProps.feedbackMsgText,
147 nextProps.feedbackMsgSeverity);
151 componentWillMount() {
152 this.props.onSetViewTitle(i18n(TSUI_TITLE));
153 if (this.props.match.params.viParam) {
154 this.props.onNewVIParam(this.props.match.params.viParam);
156 this.props.onRequestClearData();
160 componentDidMount() {
161 this.props.onSplitPaneResize(true);
164 componentWillUnmount() {
165 // resetting to default (empty screen)
166 this.props.onRequestClearData();
172 forceDirectedGraphRawData,
181 let componentVisibitliyClassName = 'showContainer';
182 if(enableBusyFeedback){
183 componentVisibitliyClassName = 'hideContainer';
185 let availableOverlay;
186 let overlayComponent;
187 // Currently only ONE overlay can be added to each view.
188 // todo: need to make it array if more than one overlay can be used. No need now.
189 overlaysDetails.forEach(function(overlay){
190 if(overlay.view === 'schema') {
191 availableOverlay = overlay.key;
192 overlayComponent = overlay.componentName;
196 //Temp code for a demo, will be removed as Vis library is updated
197 let currentNodeButton;
198 if(this.props.graphNodeSelectedMenu ===
199 TSUI_GRAPH_MENU_NODE_DETAILS ) {
200 currentNodeButton = 'NODE_DETAILS';
201 } else if(availableOverlay) {
202 currentNodeButton = availableOverlay;
205 let dataOverlayButtons = ['NODE_DETAILS'];
206 if(availableOverlay) {
207 dataOverlayButtons.push(availableOverlay);
209 let currentSelectedMenu = this.getCurrentSelectedMenu(overlayComponent);
211 <div className='tier-support-ui'>
212 <div className='spinner'>
213 <ClipLoader color={COLOR_BLUE} loading={enableBusyFeedback} />
215 <div className={componentVisibitliyClassName}>
218 enableResizing='true'
219 onDragFinished={ () => {
220 onSplitPaneResize(false);
222 defaultSize={TSUI_NODE_DETAILS_INITIAL_WIDTH}
223 minSize={TSUI_NODE_DETAILS_MIN_WIDTH}
228 viewWidth={windowWidth}
229 viewHeight={windowHeight}
230 graphData={forceDirectedGraphRawData}
231 nodeSelectedCallback={(nodeData) => {
232 onNodeSelected(nodeData);
234 nodeButtonSelectedCallback={(selectedMenuId) => {
235 onNodeMenuSelect(selectedMenuId);
237 dataOverlayButtons={dataOverlayButtons}
238 currentlySelectedNodeView={currentNodeButton}/>
242 {currentSelectedMenu}
251 for(var prop in obj) {
252 if(obj.hasOwnProperty(prop)) {
259 getCurrentSelectedMenu(overlayComponent) {
261 if (this.props.graphNodeSelectedMenu === TSUI_GRAPH_MENU_NODE_DETAILS) {
262 if (!this.nodeDetails) {
263 this.nodeDetails = <SelectedNodeDetails/>;
265 return this.nodeDetails;
268 if (this.isNotEmpty(this.props.nodeData) && overlayComponent) {
269 if (Overlays.default.hasOwnProperty(overlayComponent)) {
270 let OverlayComponent = Overlays.default[overlayComponent];
271 secondOverlay = <OverlayComponent nodeDetails={this.props.nodeData}/>;
274 return secondOverlay;
280 export default connect(mapStateToProps, mapActionToProps)(TierSupport);