2 'app/yangman/controllers/params-admin.controller',
3 'app/yangman/services/time-tracking.services',
4 ], function (ParamsAdminCtrl) {
7 angular.module('app.yangman').controller('RequestHeaderCtrl', RequestHeaderCtrl);
9 RequestHeaderCtrl.$inject = [
10 '$timeout', '$mdDialog', '$mdToast', '$scope', '$rootScope', 'ENV', 'YangmanService', 'ParametersService',
11 'PathUtilsService', 'RequestsService', '$filter', 'DataBackupService', 'constants', 'TimeTrackingService'
14 function RequestHeaderCtrl($timeout, $mdDialog, $mdToast, $scope, $rootScope, ENV, YangmanService, ParametersService,
15 PathUtilsService, RequestService, $filter, DataBackupService, constants,
16 TimeTrackingService) {
17 var requestHeader = this;
19 requestHeader.allOperations = [constants.OPERATION_GET, constants.OPERATION_POST, constants.OPERATION_PUT, constants.OPERATION_DELETE];
20 requestHeader.constants = constants;
21 requestHeader.urlChanged = false;
22 requestHeader.executedOperation = null;
24 requestHeader.selectedOperationsList = [];
25 requestHeader.selectedOperation = null;
26 requestHeader.requestUrl = '';
27 requestHeader.selectedPluginsButtons = [];
28 requestHeader.selectedPlugin = null;
29 requestHeader.statusObj = null;
30 requestHeader.fillFormWithReceivedData = true;
33 requestHeader.executeOperation = executeOperation;
34 requestHeader.executePluginFunctionality = executePluginFunctionality;
35 requestHeader.fillNodeData = fillNodeData;
36 requestHeader.changeDataType = changeDataType;
37 requestHeader.prepareDataAndExecute = prepareDataAndExecute;
38 requestHeader.initMountPoint = initMountPoint;
39 requestHeader.setJsonView = setJsonView;
40 requestHeader.setRequestUrl = setRequestUrl;
41 requestHeader.showParamsAdmin = showParamsAdmin;
42 requestHeader.saveRequestToCollection = saveRequestToCollection;
43 requestHeader.unsetPluginFunctionality = unsetPluginFunctionality;
45 $scope.$on(constants.YANGMAN_CHANGE_TO_JSON, function () {
46 sendRequestData($scope.buildRootRequest(), 'SENT');
49 * Set selected operations based on data store
51 $scope.$on(constants.SET_SEL_OPERATIONS, function (event, operations, setUrl) {
52 setAllowedMethods(operations);
60 * Watching for changes in shown detail data type (radio button)
62 $scope.$on(constants.YANGMAN_HEADER_INIT, function (event, args) {
64 setRequestUrl(args.params.path);
65 setRequestMethod(args.params.method);
66 setRequestStatus(args.params.statusObj);
68 (args.cbk || angular.noop)();
71 $scope.$on(constants.YANGMAN_FILL_NODE_FROM_REQ, function (event, args) {
72 setNodeDataFromRequestData(args.params.requestUrl, args.params.leftpanel);
73 (args.cbk || angular.noop)();
76 $scope.$on(constants.YANGMAN_EXECUTE_WITH_DATA, function (event, args) {
77 executeOperation(args.params.data ? angular.fromJson(args.params.data) : {}, args.cbk);
83 * Setter for selected operation
86 function setRequestMethod(method){
87 requestHeader.selectedOperation = method;
91 * Setter for request status
94 function setRequestStatus(statusObj){
95 requestHeader.statusObj = statusObj;
99 * Show popup for parameters administration
102 function showParamsAdmin(event) {
104 controller: ParamsAdminCtrl,
105 controllerAs: 'paramsAdmin',
106 templateUrl: $scope.globalViewPath + 'popup/parameters-admin.tpl.html',
107 parent: angular.element('#yangmanModule'),
109 clickOutsideToClose: true,
111 parametersList: $scope.parametersList,
115 $scope.parametersList.loadListFromStorage();
118 $scope.parametersList.loadListFromStorage();
124 * Method for selecting correct json view by selected operation
126 function setJsonView(){
127 var both = [constants.OPERATION_PUT, constants.OPERATION_POST];
129 if ( both.indexOf(requestHeader.selectedOperation) > -1 ){
130 $scope.setJsonView(true, true);
132 $scope.setJsonView(true, false);
137 * Change displayed data type to json or form, after switching set current data to be displayed
139 function changeDataType(){
140 $scope.switchSection('rightPanelSection', requestHeader.selectedShownDataType);
142 if ($scope.node || requestHeader.urlChanged) {
143 requestHeader.setRequestUrl();
144 requestHeader.urlChanged = false;
147 // if changing to json, fill codemirror data
148 if ( requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA && $scope.node ){
150 sendRequestData($scope.buildRootRequest(), 'SENT');
153 // if changing to form, try to fill node data
154 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM) {
157 reqData = getDataForForm();
158 setNodeDataFromRequestData(requestHeader.requestUrl);
162 YangmanService.fillNodeFromResponse($scope.node, reqData);
163 $scope.node.expanded = true;
169 * Helper method for building correct json data for form, rpc included
172 function getDataForForm(){
178 var sentData = { reqData: null },
179 allData = { sent: null, received: null };
181 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_RECEIVED, params);
182 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_SENT, sentData);
184 allData.sent = sentData.reqData ? angular.fromJson(sentData.reqData) : {};
185 allData.received = params.reqData ? angular.fromJson(params.reqData) : {};
187 return YangmanService.prepareReceivedData(
189 requestHeader.selectedOperation,
192 requestHeader.selectedShownDataType
195 default: function (){
197 if (requestHeader.executedOperation) {
198 dataType = requestHeader.executedOperation === constants.OPERATION_GET ?
199 constants.REQUEST_DATA_TYPE_RECEIVED :
206 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA + dataType, params);
207 return params.reqData ? angular.fromJson(params.reqData) : {};
211 return $scope.node ? (dataTypeFunc[$scope.node.type] || dataTypeFunc.default)() : {};
215 * Send data to codemirror
218 function sendRequestData(data, type){
219 $scope.rootBroadcast(
220 constants.YANGMAN_SET_CODEMIRROR_DATA + type,
221 { data: data instanceof Object ? JSON.stringify(data, null, 4) : data }
226 * Set error data to be shown in form area
229 function sendErrorData(response) {
230 $scope.rootBroadcast(constants.YANGMAN_SET_ERROR_DATA, response);
234 * Create empty parameters list, load from local storage and set to $scope
236 function initParams(){
237 $scope.parametersList.loadListFromStorage();
244 setAllowedMethods(requestHeader.allOperations);
246 requestHeader.selectedShownDataType = $scope.rightPanelSection;
250 * Set allowed operations for request
253 function setAllowedMethods(operations){
254 requestHeader.selectedOperationsList = operations.length ? operations : requestHeader.allOperations;
255 if (operations.indexOf(requestHeader.selectedOperation) === -1){
256 requestHeader.selectedOperation = requestHeader.selectedOperationsList[0];
261 * Set header request url if json selected
263 function setRequestUrl(path){
264 requestHeader.requestUrl = path || ($scope.selectedSubApi ?
265 ENV.getBaseURL('MD_SAL') + '/restconf/' + $scope.selectedSubApi.buildApiRequestString() : '');
270 * Try to set api, module, dataStore and node, if api indexes for request url available
271 * and set (or unset) module detail panel to be displayed
272 * @param requestUrl url to try to find
273 * @param leftpanel index of main left tabs to be displayed (we dont want to display module detail in all cases)
275 function setNodeDataFromRequestData(requestUrl, leftpanel){
277 setApiByUrl(requestUrl, function (treeApis) {
279 $scope.setModule($filter('filter')(treeApis, { label: $scope.selectedApi.module })[0]);
284 $scope.selectedModule.children,
285 { label: $scope.selectedSubApi.storage })[0],
291 $scope.setNode($scope.selectedSubApi.node);
294 PathUtilsService.fillPath($scope.selectedSubApi.pathArray, requestUrl);
300 * Try to set current (depending on url) selectedApi and selectedSubApi to $scope if it exists in api tree data
305 function setApiByUrl(url, cbk, fill){
306 $scope.rootBroadcast(constants.YANGMAN_GET_API_TREE_DATA, null, function (treeApis) {
308 PathUtilsService.searchNodeByPath(url, treeApis, null, true, true);
314 $scope.apis[apisIndexes.indexApi],
315 $scope.apis[apisIndexes.indexApi].subApis[apisIndexes.indexSubApi]
318 if ( $scope.selectedSubApi && fill ) {
319 var updatedUrl = YangmanService.cutUrl(url);
320 PathUtilsService.fillPath($scope.selectedSubApi.pathArray, updatedUrl);
324 (cbk || angular.noop)(treeApis);
329 function saveRequestToCollection(event) {
330 var historyReq = null,
331 sentData = { reqData: null },
332 receivedData = { reqData: null };
334 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM) {
335 requestHeader.setRequestUrl();
338 historyReq = RequestService.createHistoryRequest(
339 null, null, requestHeader.requestUrl, requestHeader.selectedOperation, '', '', ''
342 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_SENT, sentData);
343 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_RECEIVED, receivedData);
345 RequestService.fillRequestByMethod(
346 historyReq, sentData, receivedData, requestHeader.selectedOperation, $scope.node,
347 requestHeader.selectedShownDataType
350 $scope.rootBroadcast(constants.YANGMAN_SAVE_REQUEST_TO_COLLECTION, { event: event, reqObj: historyReq });
353 function showRequestProgress(){
354 $scope.rootBroadcast(constants.YANGMAN_EXECUTING_REQUEST_PROGRESS_START);
359 * Stop showing progressbar
362 function finishRequestProgress(message){
363 $scope.rootBroadcast(constants.YANGMAN_EXECUTING_REQUEST_PROGRESS_STOP);
367 * Execute request operation
369 function executeOperation(requestData, executeCbk){
370 TimeTrackingService.startTimer();
371 var allowExecuteOperation =
372 requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM && $scope.selectedSubApi ?
373 !PathUtilsService.checkEmptyIdentifiers($scope.selectedSubApi.pathArray) : true;
376 if ( allowExecuteOperation ) {
378 showRequestProgress();
379 $scope.rootBroadcast(constants.YANGMAN_SET_ERROR_MESSAGE, '');
382 requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA ?
383 requestHeader.requestUrl :
386 if ( requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA ){
387 setApiByUrl(requestHeader.requestUrl, null, true);
390 var historyReq = RequestService.createHistoryRequest(
393 requestHeader.requestUrl,
394 requestHeader.selectedOperation,
398 YangmanService.executeRequestOperation(
400 $scope.selectedSubApi,
401 requestHeader.selectedOperation,
403 requestHeader.selectedShownDataType,
404 requestHeader.requestUrl,
406 $scope.parametersList,
410 requestHeader.executedOperation = requestHeader.selectedOperation;
412 $scope.rootBroadcast(
413 constants.YANGMAN_SET_ERROR_MESSAGE,
414 $filter('translate')(constants.YANGMAN_ERROR_EMPTY_IDENTIFIERS)
416 finishRequestProgress();
420 * Success callback after executin operation
424 function executeReqSuccCbk(reqInfo, response) {
426 var preparedReceivedData = {};
428 if (requestHeader.fillFormWithReceivedData || requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA ) {
429 preparedReceivedData = YangmanService.prepareReceivedData(
431 requestHeader.selectedOperation,
432 response.data ? response.data.plain() : {},
433 reqInfo.requestSrcData,
434 requestHeader.selectedShownDataType
438 finishRequestProgress();
440 requestHeader.statusObj = reqInfo;
444 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA){
445 setNodeDataFromRequestData(requestHeader.requestUrl);
446 sendRequestData(preparedReceivedData, constants.REQUEST_DATA_TYPE_RECEIVED);
447 sendRequestData(reqInfo.requestSrcData || {}, 'SENT');
450 if ($scope.node && requestHeader.selectedOperation !== constants.OPERATION_DELETE && requestHeader.fillFormWithReceivedData){
452 YangmanService.fillNodeFromResponse($scope.node, preparedReceivedData);
453 YangmanService.handleNodeIdentifier(
454 $scope.parametersList, $scope.selectedSubApi, $scope.node
456 $scope.node.expanded = true;
458 $scope.rootBroadcast(constants.YANGMAN_DISABLE_ADDING_LIST_ELEMENT);
459 preparedReceivedData = YangmanService.checkRpcReceivedData(preparedReceivedData, $scope.node);
460 sendRequestData(preparedReceivedData, constants.REQUEST_DATA_TYPE_RECEIVED);
464 // create and set history request
465 requestHeader.statusObj.time = TimeTrackingService.returnTime();
467 historyReq.setExecutionData(
468 reqInfo.requestSrcData,
469 $scope.historySettings.data.saveReceived ? preparedReceivedData : null,
470 $scope.historySettings.data.saveResponseData ? reqInfo.status : '',
471 $scope.historySettings.data.saveResponseData ? reqInfo.status : '',
472 $scope.historySettings.data.saveResponseData ? reqInfo.statusText : '',
473 $scope.historySettings.data.saveResponseData ? requestHeader.statusObj.time : ''
476 $scope.rootBroadcast(constants.YANGMAN_SAVE_EXECUTED_REQUEST, historyReq, function (){
477 $scope.rootBroadcast(constants.YANGMAN_SELECT_THE_NEWEST_REQUEST);
480 (executeCbk || angular.noop)(historyReq);
485 * Error callback after executin operation
489 function executeReqErrCbk(reqInfo, response) {
490 requestHeader.statusObj = reqInfo;
492 finishRequestProgress();
494 requestHeader.statusObj.time = TimeTrackingService.returnTime();
496 historyReq.setExecutionData(
497 reqInfo.requestSrcData,
498 $scope.historySettings.data.saveReceived ? response.data : null,
499 $scope.historySettings.data.saveResponseData ? reqInfo.status : '',
500 $scope.historySettings.data.saveResponseData ? reqInfo.status : '',
501 $scope.historySettings.data.saveResponseData ? reqInfo.statusText : '',
502 $scope.historySettings.data.saveResponseData ? requestHeader.statusObj.time : ''
504 $scope.rootBroadcast(constants.YANGMAN_SAVE_EXECUTED_REQUEST, historyReq, function (){
505 $scope.rootBroadcast(constants.YANGMAN_SELECT_THE_NEWEST_REQUEST);
509 // try to fill code mirror editor
510 sendRequestData(response.data, constants.REQUEST_DATA_TYPE_RECEIVED);
511 sendErrorData(response.data);
514 (executeCbk || angular.noop)(historyReq);
522 * TODO :: description
526 function fillNodeData(pathElem, identifier) {
527 if ($scope.selectedSubApi && $scope.selectedSubApi.storage === constants.DATA_STORE_CONFIG &&
528 $scope.selectedSubApi.pathArray.indexOf(pathElem) === ($scope.selectedSubApi.pathArray.length - 1)) {
529 PathUtilsService.fillListNode($scope.node, identifier.label, identifier.value);
532 requestHeader.urlChanged = true;
536 * Check data before executin operations
538 function prepareDataAndExecute(cbk){
539 if (requestHeader.statusObj) {
540 requestHeader.statusObj.statusText = null;
541 requestHeader.statusObj.time = null;
545 showRequestProgress();
547 $timeout(prepareData);
548 function prepareData() {
549 if ( requestHeader.requestUrl.length ) {
550 if ( requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA ) {
552 var params = { reqData: null };
553 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_SENT, params);
554 executeOperation(params.reqData ? angular.fromJson(params.reqData) : {}, cbk);
556 executeOperation({}, cbk);
563 * Mount point initialization
564 * @param mountPointStructure
565 * @param mountPointTreeApis
566 * @param mountPointApis
567 * @param augmentations
569 function initMountPoint(mountPointTreeApis, mountPointApis, augmentations, reqObj){
570 DataBackupService.storeFromScope(
572 'selectedDatastore', 'node', 'apis',
573 'selectedApi', 'selectedSubApi', 'augmentations', 'selectedModule',
579 $scope.rootBroadcast(constants.YANGMAN_GET_API_TREE_DATA, null, function (treeApis) {
580 DataBackupService.storeFromScope(
582 { treeApis: treeApis },
587 $scope.setNode(null);
588 $scope.setModule(null);
589 $scope.setGlobalParams(mountPointApis, augmentations);
590 $scope.setDataStore(null);
591 requestHeader.statusObj = reqObj;
592 $scope.rootBroadcast(constants.YANGMAN_SET_API_TREE_DATA, mountPointTreeApis);
596 * Executing custom plugin callback
597 * @param customPlugin
599 function executePluginFunctionality(customPlugin){
600 requestHeader.selectedPlugin = customPlugin;
601 $scope.setSelectedPlugin(true);
602 customPlugin.runCallback({ scope: $scope, controller: requestHeader });
606 * Unset custom plugin functionality - get back major params from scope
608 function unsetPluginFunctionality(){
609 if ( requestHeader.selectedPlugin ) {
610 $scope.unsetPlugin(requestHeader);
611 $scope.setSelectedPlugin(false);
614 requestHeader.selectedPlugin = null;
615 requestHeader.selectedPluginsButtons = [];