Implementing user feed back
[aai/sparky-fe.git] / src / app / tierSupport / TierSupportActions.js
1 /*
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
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
11  *
12  *       http://www.apache.org/licenses/LICENSE-2.0
13  *
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=========================================================
20  *
21  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22  */
23
24 import {tierSupportActionTypes,
25   TS_BACKEND_SEARCH_SELECTED_NODE_URL} from 'app/tierSupport/TierSupportConstants.js';
26 import {
27   POST,
28   POST_HEADER,
29   ERROR_RETRIEVING_DATA,
30   NO_RESULTS_FOUND
31 } from 'app/networking/NetworkConstants.js';
32 import networkCall from 'app/networking/NetworkCalls.js';
33 import {
34   getSetGlobalMessageEvent,
35   getClearGlobalMessageEvent
36 } from 'app/globalInlineMessageBar/GlobalInlineMessageBarActions.js';
37 import {
38   STATUS_CODE_204_NO_CONTENT,
39   STATUS_CODE_3XX_REDIRECTION,
40   STATUS_CODE_5XX_SERVER_ERROR
41 } from 'utils/GlobalConstants.js';
42
43 function createOnNodeDetailsChangeEvent(newDetails) {
44   return {
45     type: tierSupportActionTypes.TS_GRAPH_NODE_SELECTED,
46     data: newDetails
47   };
48 }
49
50 function createSplitPaneResizeEvent(initialLoad) {
51   return {
52     type: tierSupportActionTypes.SPLIT_PANE_RESIZE,
53     data: initialLoad
54   };
55 }
56
57 function createOnNodeMenuSelectEvent(selectedMenu) {
58   return {
59     type: tierSupportActionTypes.TS_GRAPH_NODE_MENU_SELECTED,
60     data: selectedMenu
61   };
62 }
63
64 export function onNodeDetailsChange(newDetails) {
65   return dispatch => {
66     dispatch(createOnNodeDetailsChangeEvent(newDetails));
67   };
68 }
69
70 export function splitPaneResize(initialLoad) {
71   return dispatch => {
72     dispatch(createSplitPaneResizeEvent(initialLoad));
73   };
74 }
75
76 export function onNodeMenuChange(selectedMenu) {
77   return dispatch => {
78     dispatch(createOnNodeMenuSelectEvent(selectedMenu));
79   };
80 }
81
82 function createNodeDetailsFoundEvent(nodeDetails) {
83   return {
84     type: tierSupportActionTypes.TS_NODE_SEARCH_RESULTS,
85     data: nodeDetails
86   };
87 }
88
89 function createSelectedNodeDetails(nodeDetails) {
90   var selectedNodeDetail;
91   for(let i = 0; i < nodeDetails.nodes.length; i++) {
92     if(nodeDetails.nodes[i].nodeMeta.className === 'selectedSearchedNodeClass') {
93       selectedNodeDetail = nodeDetails.nodes[i];
94       break;
95     }
96   }
97   return {
98     type: tierSupportActionTypes.TS_GRAPH_NODE_SELECTED,
99     data: selectedNodeDetail
100   };
101 }
102
103 function noNodeDetailsFoundEvent(errorText) {
104   return {
105     type: tierSupportActionTypes.TS_NODE_SEARCH_NO_RESULTS,
106     data: {errorMsg: errorText}
107   };
108 }
109
110 function getInvalidSelectedNodeSearchEvent(errorText) {
111   return {
112     type: tierSupportActionTypes.TIER_SUPPORT_NETWORK_ERROR,
113     data: {value: errorText, errorMsg: ERROR_RETRIEVING_DATA}
114   };
115 }
116
117 export function clearVIData() {
118   return {
119     type: tierSupportActionTypes.TIER_SUPPORT_CLEAR_DATA
120   };
121 }
122
123 function setBusyFeedback(){
124   return {
125     type: tierSupportActionTypes.TIER_SUPPORT_ACTIVATE_BUSY_FEEDBACK
126   };
127 }
128
129 function disableBusyFeedback(){
130   return {
131     type: tierSupportActionTypes.TIER_SUPPORT_DISABLE_BUSY_FEEDBACK
132   };
133 }
134
135 export function fetchSelectedNodeElement(fetchRequestCallback) {
136   return dispatch => {
137     return fetchRequestCallback().then(
138       (response) => {
139         if (response.status === STATUS_CODE_204_NO_CONTENT || response.status >= STATUS_CODE_3XX_REDIRECTION) {
140           return Promise.reject(new Error(response.status));
141         } else {
142           // assume 200 status
143           return response.json();
144         }
145       }
146     ).then(
147       (responseJson) => {
148         if (responseJson.nodes.length > 0) {
149           dispatch(createNodeDetailsFoundEvent(responseJson));
150           dispatch(createSelectedNodeDetails(responseJson));
151         } else {
152           dispatch(noNodeDetailsFoundEvent(NO_RESULTS_FOUND));
153         }
154       }
155     ).then(
156       () => {
157         dispatch(disableBusyFeedback());
158       }
159     ).catch(
160       (errorCode) => {
161         dispatch(disableBusyFeedback());
162         if (errorCode.message >= STATUS_CODE_5XX_SERVER_ERROR) {
163           dispatch(getInvalidSelectedNodeSearchEvent(ERROR_RETRIEVING_DATA));
164         } else {
165           // TODO - assuming 204 status, but should include additional
166           // statuses in the future with proper messaging in order to return
167           // better messaging
168           dispatch(noNodeDetailsFoundEvent(NO_RESULTS_FOUND));
169         }
170       }
171     );
172   };
173 }
174
175 export function querySelectedNodeElement(
176   searchHashId, selectedNodeFetchRequest) {
177   let payload = {
178     hashId: searchHashId
179   };
180
181   if (selectedNodeFetchRequest === undefined) {
182     let postBody = JSON.stringify(payload);
183     selectedNodeFetchRequest =
184       () => networkCall.fetchRequestObj(TS_BACKEND_SEARCH_SELECTED_NODE_URL, POST,
185         POST_HEADER, postBody);
186   }
187
188   return dispatch => {
189     dispatch(setBusyFeedback());
190     dispatch(fetchSelectedNodeElement(selectedNodeFetchRequest));
191   };
192 }
193
194 export function setNotificationText(msgText, msgSeverity) {
195   if (msgText.length > 0) {
196     return dispatch => {
197       dispatch(
198         getSetGlobalMessageEvent(msgText, msgSeverity));
199     };
200   } else {
201     return dispatch => {
202       dispatch(getClearGlobalMessageEvent());
203     };
204   }
205 }