2 'app/yangman/controllers/params-admin.controller',
3 ], function (ParamsAdminCtrl) {
6 angular.module('app.yangman').controller('RequestHeaderCtrl', RequestHeaderCtrl);
8 RequestHeaderCtrl.$inject = [
9 '$mdDialog', '$mdToast', '$scope', '$rootScope', 'ENV', 'YangmanService', 'ParametersService',
10 'PathUtilsService', 'RequestsService', '$filter', 'DataBackupService', 'constants'
13 function RequestHeaderCtrl($mdDialog, $mdToast, $scope, $rootScope, ENV, YangmanService, ParametersService,
14 PathUtilsService, RequestService, $filter, DataBackupService, constants) {
15 var requestHeader = this;
17 requestHeader.allOperations = [constants.OPERATION_GET, constants.OPERATION_POST, constants.OPERATION_PUT, constants.OPERATION_DELETE];
18 requestHeader.constants = constants;
19 requestHeader.urlChanged = false;
20 requestHeader.executedOperation = null;
21 requestHeader.selectedOperationsList = [];
22 requestHeader.selectedOperation = null;
23 requestHeader.requestUrl = '';
24 requestHeader.selectedPluginsButtons = [];
25 requestHeader.selectedPlugin = null;
26 requestHeader.statusObj = null;
29 requestHeader.executeOperation = executeOperation;
30 requestHeader.executePluginFunctionality = executePluginFunctionality;
31 requestHeader.fillNodeData = fillNodeData;
32 requestHeader.changeDataType = changeDataType;
33 requestHeader.prepareDataAndExecute = prepareDataAndExecute;
34 requestHeader.initMountPoint = initMountPoint;
35 requestHeader.setJsonView = setJsonView;
36 requestHeader.setRequestUrl = setRequestUrl;
37 requestHeader.showParamsAdmin = showParamsAdmin;
38 requestHeader.saveRequestToCollection = saveRequestToCollection;
39 requestHeader.unsetPluginFunctionality = unsetPluginFunctionality;
43 * Set selected operations based on data store
45 $scope.$on('SET_SEL_OPERATIONS', function (event, operations, setUrl) {
46 setAllowedMethods(operations);
54 * Watching for changes in shown detail data type (radio button)
56 $scope.$on('YANGMAN_HEADER_INIT', function (event, args) {
58 setRequestUrl(args.params.path);
59 setRequestMethod(args.params.method);
60 setRequestStatus(args.params.statusObj);
62 (args.cbk || angular.noop)();
65 $scope.$on('YANGMAN_FILL_NODE_FROM_REQ', function (event, args) {
66 setNodeDataFromRequestData(args.params.requestUrl, args.params.leftpanel);
67 (args.cbk || angular.noop)();
70 $scope.$on('YANGMAN_EXECUTE_WITH_DATA', function (event, args) {
71 executeOperation(args.params.data ? angular.fromJson(args.params.data) : {}, args.cbk);
77 * Setter for selected operation
80 function setRequestMethod(method){
81 requestHeader.selectedOperation = method;
85 * Setter for request status
88 function setRequestStatus(statusObj){
89 requestHeader.statusObj = statusObj;
93 * Show popup for parameters administration
96 function showParamsAdmin(event) {
98 controller: ParamsAdminCtrl,
99 controllerAs: 'paramsAdmin',
100 templateUrl: $scope.globalViewPath + 'popup/parameters-admin.tpl.html',
101 parent: angular.element('#yangmanModule'),
103 clickOutsideToClose: true,
105 parametersList: $scope.parametersList,
108 $scope.parametersList.loadListFromStorage();
114 * Method for selecting correct json view by selected operation
116 function setJsonView(){
117 var both = [constants.OPERATION_PUT, constants.OPERATION_POST];
119 if ( both.indexOf(requestHeader.selectedOperation) > -1 ){
120 $scope.setJsonView(true, true);
122 $scope.setJsonView(true, false);
125 // sendRequestData({}, 'RECEIVED');
129 * Change displayed data type to json or form, after switching set current data to be displayed
131 function changeDataType(){
132 $scope.switchSection('rightPanelSection', requestHeader.selectedShownDataType);
134 if(!$scope.node || requestHeader.urlChanged) {
135 requestHeader.setRequestUrl();
136 requestHeader.urlChanged = false;
139 // if changing to json, fill codemirror data
140 if ( requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA && $scope.node ){
142 sendRequestData($scope.buildRootRequest(), 'SENT');
145 // if changing to form, try to fill node data
146 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM) {
149 reqData = getDataForForm();
150 setNodeDataFromRequestData(requestHeader.requestUrl);
154 YangmanService.fillNodeFromResponse($scope.node, reqData);
155 $scope.node.expanded = true;
161 * Helper method for building correct json data for form, rpc included
164 function getDataForForm(){
170 var sentData = { reqData: null },
171 allData = { sent: null, received: null };
173 $scope.rootBroadcast('YANGMAN_GET_CODEMIRROR_DATA_RECEIVED', params);
174 $scope.rootBroadcast('YANGMAN_GET_CODEMIRROR_DATA_SENT', sentData);
176 allData.sent = sentData.reqData ? angular.fromJson(sentData.reqData) : {};
177 allData.received = params.reqData ? angular.fromJson(params.reqData) : {};
179 return YangmanService.prepareReceivedData(
181 requestHeader.selectedOperation,
184 requestHeader.selectedShownDataType
187 default: function (){
189 if(requestHeader.executedOperation) {
190 dataType = requestHeader.executedOperation === constants.OPERATION_GET ? constants.REQUEST_DATA_TYPE_RECEIVED : 'SENT';
193 dataType = requestHeader.selectedOperation === constants.OPERATION_GET ? constants.REQUEST_DATA_TYPE_RECEIVED : 'SENT';
196 $scope.rootBroadcast('YANGMAN_GET_CODEMIRROR_DATA_' + dataType, params);
197 return params.reqData ? angular.fromJson(params.reqData) : {};
201 return $scope.node ? (dataTypeFunc[$scope.node.type] || dataTypeFunc.default)() : {};
205 * Send data to codemirror
208 function sendRequestData(data, type){
209 $scope.rootBroadcast(
210 'YANGMAN_SET_CODEMIRROR_DATA_' + type,
211 { data: data instanceof Object ? JSON.stringify(data, null, 4) : data }
215 function sendErrorData(response) {
216 $scope.rootBroadcast('YANGMAN_SET_ERROR_DATA', response);
220 * Create empty parameters list, load from local storage and set to $scope
222 function initParams(){
223 $scope.parametersList.loadListFromStorage();
230 setAllowedMethods(requestHeader.allOperations);
232 requestHeader.selectedShownDataType = $scope.rightPanelSection;
236 * Set allowed operations for request
239 function setAllowedMethods(operations){
240 requestHeader.selectedOperationsList = operations.length ? operations : requestHeader.allOperations;
241 if (operations.indexOf(requestHeader.selectedOperation) === -1){
242 requestHeader.selectedOperation = requestHeader.selectedOperationsList[0];
247 * Set header request url if json selected
249 function setRequestUrl(path){
250 requestHeader.requestUrl = path || ($scope.selectedSubApi ?
251 ENV.getBaseURL('MD_SAL') + '/restconf/' + $scope.selectedSubApi.buildApiRequestString() : '');
256 * Try to set api, module, dataStore and node, if api indexes for request url available
257 * and set (or unset) module detail panel to be displayed
258 * @param requestUrl url to try to find
259 * @param leftpanel index of main left tabs to be displayed (we dont want to display module detail in all cases)
261 function setNodeDataFromRequestData(requestUrl, leftpanel){
263 setApiByUrl(requestUrl, function (treeApis) {
265 $scope.setModule($filter('filter')(treeApis, { label: $scope.selectedApi.module })[0]);
270 $scope.selectedModule.children,
271 { label: $scope.selectedSubApi.storage })[0],
277 $scope.setNode($scope.selectedSubApi.node);
280 PathUtilsService.fillPath($scope.selectedSubApi.pathArray, requestUrl);
285 function setApiByUrl(url, cbk, fill){
286 $scope.rootBroadcast('YANGMAN_GET_API_TREE_DATA', null, function (treeApis) {
288 PathUtilsService.searchNodeByPath(url, treeApis, null, true, true);
294 $scope.apis[apisIndexes.indexApi],
295 $scope.apis[apisIndexes.indexApi].subApis[apisIndexes.indexSubApi]
298 if ( $scope.selectedSubApi && fill ) {
299 var updatedUrl = YangmanService.cutUrl(url);
300 PathUtilsService.fillPath($scope.selectedSubApi.pathArray, updatedUrl);
304 (cbk || angular.noop)(treeApis);
309 function saveRequestToCollection(event) {
310 var historyReq = null,
311 sentData = { reqData: null },
312 receivedData = { reqData: null };
314 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM) {
315 requestHeader.setRequestUrl();
318 historyReq = RequestService.createHistoryRequest(
319 null, null, requestHeader.requestUrl, requestHeader.selectedOperation, '', '', ''
322 $scope.rootBroadcast('YANGMAN_GET_CODEMIRROR_DATA_SENT', sentData);
323 $scope.rootBroadcast('YANGMAN_GET_CODEMIRROR_DATA_RECEIVED', receivedData);
325 RequestService.fillRequestByMethod(
326 historyReq, sentData, receivedData, requestHeader.selectedOperation, $scope.node,
327 requestHeader.selectedShownDataType
330 $scope.rootBroadcast('YANGMAN_SAVE_REQUEST_TO_COLLECTION', { event: event, reqObj: historyReq });
333 function showRequestProgress(){
334 $scope.rootBroadcast('YANGMAN_EXECUTING_REQUEST_PROGRESS_START');
338 function finishRequestProgress (message){
339 $scope.rootBroadcast('YANGMAN_EXECUTING_REQUEST_PROGRESS_STOP');
342 // .textContent(message)
343 // .position('bottom right')
344 // .parent(angular.element('.yangmanModule__right-panel__header'))
351 * Execute request operation
353 function executeOperation(requestData, executeCbk){
354 var allowExecuteOperation =
355 requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM && $scope.selectedSubApi ?
356 !PathUtilsService.checkEmptyIdentifiers($scope.selectedSubApi.pathArray) : true;
358 if ( allowExecuteOperation ) {
360 showRequestProgress();
361 setRequestUrl(requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA ? requestHeader.requestUrl : null);
362 $scope.rootBroadcast('YANGMAN_SET_ERROR_MESSAGE', '');
364 if ( requestHeader.selectedShownDataType !== constants.DISPLAY_TYPE_FORM ){
365 setApiByUrl(requestHeader.requestUrl, null, true);
368 var historyReq = RequestService.createHistoryRequest(null, null, requestHeader.requestUrl,
369 requestHeader.selectedOperation, '', '', '');
371 YangmanService.executeRequestOperation(
373 $scope.selectedSubApi,
374 requestHeader.selectedOperation,
376 requestHeader.selectedShownDataType,
377 requestHeader.requestUrl,
379 $scope.parametersList,
383 requestHeader.executedOperation = requestHeader.selectedOperation;
385 $scope.rootBroadcast(
386 'YANGMAN_SET_ERROR_MESSAGE',
387 $filter('translate')('YANGMAN_ERROR_EMPTY_IDENTIFIERS')
392 * Success callback after executin operation
396 function executeReqSuccCbk(reqInfo, response) {
397 var preparedReceivedData = YangmanService.prepareReceivedData(
399 requestHeader.selectedOperation,
400 response.data ? response.data.plain() : {},
401 reqInfo.requestSrcData,
402 requestHeader.selectedShownDataType
405 finishRequestProgress();
407 requestHeader.statusObj = reqInfo;
411 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA){
413 setNodeDataFromRequestData(requestHeader.requestUrl);
414 sendRequestData(preparedReceivedData, constants.REQUEST_DATA_TYPE_RECEIVED);
415 sendRequestData(reqInfo.requestSrcData || {}, 'SENT');
420 YangmanService.fillNodeFromResponse($scope.node, preparedReceivedData);
421 YangmanService.handleNodeIdentifier(
422 $scope.parametersList, $scope.selectedSubApi, $scope.node
424 $scope.node.expanded = true;
426 $scope.rootBroadcast('YANGMAN_DISABLE_ADDING_LIST_ELEMENT');
427 preparedReceivedData = YangmanService.checkRpcReceivedData(preparedReceivedData, $scope.node);
428 sendRequestData(preparedReceivedData, constants.REQUEST_DATA_TYPE_RECEIVED);
432 // create and set history request
433 historyReq.setExecutionData(
434 reqInfo.requestSrcData,
435 preparedReceivedData,
442 $scope.rootBroadcast('YANGMAN_SAVE_EXECUTED_REQUEST', historyReq, function (){
443 $scope.rootBroadcast('YANGMAN_SELECT_THE_NEWEST_REQUEST');
446 (executeCbk || angular.noop)(historyReq);
452 * Error callback after executin operation
456 function executeReqErrCbk(reqInfo, response) {
457 requestHeader.statusObj = reqInfo;
459 finishRequestProgress();
461 historyReq.setExecutionData(
462 reqInfo.requestSrcData,
469 $scope.rootBroadcast('YANGMAN_SAVE_EXECUTED_REQUEST', historyReq, function (){
470 $scope.rootBroadcast('YANGMAN_SELECT_THE_NEWEST_REQUEST');
473 //setNodeDataFromRequestData(requestHeader.requestUrl);
476 // try to fill code mirror editor
477 sendRequestData(response.data, constants.REQUEST_DATA_TYPE_RECEIVED);
478 sendErrorData(response.data);
481 (executeCbk || angular.noop)(historyReq);
489 * TODO :: description
493 function fillNodeData(pathElem, identifier) {
494 if ($scope.selectedSubApi && $scope.selectedSubApi.storage === constants.DATA_STORE_CONFIG &&
495 $scope.selectedSubApi.pathArray.indexOf(pathElem) === ($scope.selectedSubApi.pathArray.length - 1)) {
496 PathUtilsService.fillListNode($scope.node, identifier.label, identifier.value);
499 requestHeader.urlChanged = true;
503 * Check data before executin operations
505 function prepareDataAndExecute(cbk){
506 if ( requestHeader.requestUrl.length ) {
508 if ( requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA ) {
510 var params = { reqData: null };
511 $scope.rootBroadcast('YANGMAN_GET_CODEMIRROR_DATA_SENT', params);
512 executeOperation(params.reqData ? angular.fromJson(params.reqData) : {}, cbk);
514 executeOperation({}, cbk);
520 * Mount point initialization
521 * @param mountPointStructure
522 * @param mountPointTreeApis
523 * @param mountPointApis
524 * @param augmentations
526 function initMountPoint(mountPointTreeApis, mountPointApis, augmentations, reqObj){
527 DataBackupService.storeFromScope(
529 'selectedDatastore', 'node', 'apis',
530 'selectedApi', 'selectedSubApi', 'augmentations', 'selectedModule',
536 $scope.rootBroadcast('YANGMAN_GET_API_TREE_DATA', null, function (treeApis) {
537 DataBackupService.storeFromScope(
539 { treeApis: treeApis },
544 $scope.setNode(null);
545 $scope.setModule(null);
546 $scope.setGlobalParams(mountPointApis, augmentations);
547 $scope.setDataStore(null);
548 requestHeader.statusObj = reqObj;
549 $scope.rootBroadcast('YANGMAN_SET_API_TREE_DATA', mountPointTreeApis);
553 * Executing custom plugin callback
554 * @param customPlugin
556 function executePluginFunctionality(customPlugin){
557 requestHeader.selectedPlugin = customPlugin;
558 customPlugin.runCallback({ scope: $scope, controller: requestHeader });
562 * Unset custom plugin functionality - get back major params from scope
564 function unsetPluginFunctionality(){
565 if ( requestHeader.selectedPlugin ) {
566 $scope.unsetPlugin(requestHeader);
569 requestHeader.selectedPlugin = null;
570 requestHeader.selectedPluginsButtons = [];