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);
127 * Change displayed data type to json or form, after switching set current data to be displayed
129 function changeDataType(){
130 $scope.switchSection('rightPanelSection', requestHeader.selectedShownDataType);
132 if(!$scope.node || requestHeader.urlChanged) {
133 requestHeader.setRequestUrl();
134 requestHeader.urlChanged = false;
137 // if changing to json, fill codemirror data
138 if ( requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA && $scope.node ){
140 sendRequestData($scope.buildRootRequest(), 'SENT');
143 // if changing to form, try to fill node data
144 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM) {
147 reqData = getDataForForm();
148 setNodeDataFromRequestData(requestHeader.requestUrl);
152 YangmanService.fillNodeFromResponse($scope.node, reqData);
153 $scope.node.expanded = true;
159 * Helper method for building correct json data for form, rpc included
162 function getDataForForm(){
168 var sentData = { reqData: null },
169 allData = { sent: null, received: null };
171 $scope.rootBroadcast('YANGMAN_GET_CODEMIRROR_DATA_RECEIVED', params);
172 $scope.rootBroadcast('YANGMAN_GET_CODEMIRROR_DATA_SENT', sentData);
174 allData.sent = sentData.reqData ? angular.fromJson(sentData.reqData) : {};
175 allData.received = params.reqData ? angular.fromJson(params.reqData) : {};
177 return YangmanService.prepareReceivedData(
179 requestHeader.selectedOperation,
182 requestHeader.selectedShownDataType
185 default: function (){
187 if(requestHeader.executedOperation) {
188 dataType = requestHeader.executedOperation === constants.OPERATION_GET ? constants.REQUEST_DATA_TYPE_RECEIVED : 'SENT';
191 dataType = requestHeader.selectedOperation === constants.OPERATION_GET ? constants.REQUEST_DATA_TYPE_RECEIVED : 'SENT';
194 $scope.rootBroadcast('YANGMAN_GET_CODEMIRROR_DATA_' + dataType, params);
195 return params.reqData ? angular.fromJson(params.reqData) : {};
199 return $scope.node ? (dataTypeFunc[$scope.node.type] || dataTypeFunc.default)() : {};
203 * Send data to codemirror
206 function sendRequestData(data, type){
207 $scope.rootBroadcast(
208 'YANGMAN_SET_CODEMIRROR_DATA_' + type,
209 { data: data instanceof Object ? JSON.stringify(data, null, 4) : data }
213 function sendErrorData(response) {
214 $scope.rootBroadcast('YANGMAN_SET_ERROR_DATA', response);
218 * Create empty parameters list, load from local storage and set to $scope
220 function initParams(){
221 $scope.parametersList.loadListFromStorage();
228 setAllowedMethods(requestHeader.allOperations);
230 requestHeader.selectedShownDataType = $scope.rightPanelSection;
234 * Set allowed operations for request
237 function setAllowedMethods(operations){
238 requestHeader.selectedOperationsList = operations.length ? operations : requestHeader.allOperations;
239 if (operations.indexOf(requestHeader.selectedOperation) === -1){
240 requestHeader.selectedOperation = requestHeader.selectedOperationsList[0];
245 * Set header request url if json selected
247 function setRequestUrl(path){
248 requestHeader.requestUrl = path || ($scope.selectedSubApi ?
249 ENV.getBaseURL('MD_SAL') + '/restconf/' + $scope.selectedSubApi.buildApiRequestString() : '');
254 * Try to set api, module, dataStore and node, if api indexes for request url available
255 * and set (or unset) module detail panel to be displayed
256 * @param requestUrl url to try to find
257 * @param leftpanel index of main left tabs to be displayed (we dont want to display module detail in all cases)
259 function setNodeDataFromRequestData(requestUrl, leftpanel){
261 setApiByUrl(requestUrl, function (treeApis) {
263 $scope.setModule($filter('filter')(treeApis, { label: $scope.selectedApi.module })[0]);
268 $scope.selectedModule.children,
269 { label: $scope.selectedSubApi.storage })[0],
275 $scope.setNode($scope.selectedSubApi.node);
278 PathUtilsService.fillPath($scope.selectedSubApi.pathArray, requestUrl);
283 function setApiByUrl(url, cbk, fill){
284 $scope.rootBroadcast('YANGMAN_GET_API_TREE_DATA', null, function (treeApis) {
286 PathUtilsService.searchNodeByPath(url, treeApis, null, true, true);
292 $scope.apis[apisIndexes.indexApi],
293 $scope.apis[apisIndexes.indexApi].subApis[apisIndexes.indexSubApi]
296 if ( $scope.selectedSubApi && fill ) {
297 var updatedUrl = YangmanService.cutUrl(url);
298 PathUtilsService.fillPath($scope.selectedSubApi.pathArray, updatedUrl);
302 (cbk || angular.noop)(treeApis);
307 function saveRequestToCollection(event) {
308 var historyReq = null,
309 sentData = { reqData: null },
310 receivedData = { reqData: null };
312 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM) {
313 requestHeader.setRequestUrl();
316 historyReq = RequestService.createHistoryRequest(
317 null, null, requestHeader.requestUrl, requestHeader.selectedOperation, '', '', ''
320 $scope.rootBroadcast('YANGMAN_GET_CODEMIRROR_DATA_SENT', sentData);
321 $scope.rootBroadcast('YANGMAN_GET_CODEMIRROR_DATA_RECEIVED', receivedData);
323 RequestService.fillRequestByMethod(
324 historyReq, sentData, receivedData, requestHeader.selectedOperation, $scope.node,
325 requestHeader.selectedShownDataType
328 $scope.rootBroadcast('YANGMAN_SAVE_REQUEST_TO_COLLECTION', { event: event, reqObj: historyReq });
331 function showRequestProgress(){
332 $scope.rootBroadcast('YANGMAN_EXECUTING_REQUEST_PROGRESS_START');
336 function finishRequestProgress(message){
337 $scope.rootBroadcast('YANGMAN_EXECUTING_REQUEST_PROGRESS_STOP');
341 * Execute request operation
343 function executeOperation(requestData, executeCbk){
344 var allowExecuteOperation =
345 requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM && $scope.selectedSubApi ?
346 !PathUtilsService.checkEmptyIdentifiers($scope.selectedSubApi.pathArray) : true;
348 if ( allowExecuteOperation ) {
350 showRequestProgress();
351 setRequestUrl(requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA ? requestHeader.requestUrl : null);
352 $scope.rootBroadcast('YANGMAN_SET_ERROR_MESSAGE', '');
354 if ( requestHeader.selectedShownDataType !== constants.DISPLAY_TYPE_FORM ){
355 setApiByUrl(requestHeader.requestUrl, null, true);
358 var historyReq = RequestService.createHistoryRequest(null, null, requestHeader.requestUrl,
359 requestHeader.selectedOperation, '', '', '');
361 YangmanService.executeRequestOperation(
363 $scope.selectedSubApi,
364 requestHeader.selectedOperation,
366 requestHeader.selectedShownDataType,
367 requestHeader.requestUrl,
369 $scope.parametersList,
373 requestHeader.executedOperation = requestHeader.selectedOperation;
375 $scope.rootBroadcast(
376 'YANGMAN_SET_ERROR_MESSAGE',
377 $filter('translate')('YANGMAN_ERROR_EMPTY_IDENTIFIERS')
382 * Success callback after executin operation
386 function executeReqSuccCbk(reqInfo, response) {
387 var preparedReceivedData = YangmanService.prepareReceivedData(
389 requestHeader.selectedOperation,
390 response.data ? response.data.plain() : {},
391 reqInfo.requestSrcData,
392 requestHeader.selectedShownDataType
395 finishRequestProgress();
397 requestHeader.statusObj = reqInfo;
401 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA){
403 setNodeDataFromRequestData(requestHeader.requestUrl);
404 sendRequestData(preparedReceivedData, constants.REQUEST_DATA_TYPE_RECEIVED);
405 sendRequestData(reqInfo.requestSrcData || {}, 'SENT');
410 YangmanService.fillNodeFromResponse($scope.node, preparedReceivedData);
411 YangmanService.handleNodeIdentifier(
412 $scope.parametersList, $scope.selectedSubApi, $scope.node
414 $scope.node.expanded = true;
416 $scope.rootBroadcast('YANGMAN_DISABLE_ADDING_LIST_ELEMENT');
417 preparedReceivedData = YangmanService.checkRpcReceivedData(preparedReceivedData, $scope.node);
418 sendRequestData(preparedReceivedData, constants.REQUEST_DATA_TYPE_RECEIVED);
422 // create and set history request
423 historyReq.setExecutionData(
424 reqInfo.requestSrcData,
425 preparedReceivedData,
432 $scope.rootBroadcast('YANGMAN_SAVE_EXECUTED_REQUEST', historyReq, function (){
433 $scope.rootBroadcast('YANGMAN_SELECT_THE_NEWEST_REQUEST');
436 (executeCbk || angular.noop)(historyReq);
442 * Error callback after executin operation
446 function executeReqErrCbk(reqInfo, response) {
447 requestHeader.statusObj = reqInfo;
449 finishRequestProgress();
451 historyReq.setExecutionData(
452 reqInfo.requestSrcData,
459 $scope.rootBroadcast('YANGMAN_SAVE_EXECUTED_REQUEST', historyReq, function (){
460 $scope.rootBroadcast('YANGMAN_SELECT_THE_NEWEST_REQUEST');
464 // try to fill code mirror editor
465 sendRequestData(response.data, constants.REQUEST_DATA_TYPE_RECEIVED);
466 sendErrorData(response.data);
469 (executeCbk || angular.noop)(historyReq);
477 * TODO :: description
481 function fillNodeData(pathElem, identifier) {
482 if ($scope.selectedSubApi && $scope.selectedSubApi.storage === constants.DATA_STORE_CONFIG &&
483 $scope.selectedSubApi.pathArray.indexOf(pathElem) === ($scope.selectedSubApi.pathArray.length - 1)) {
484 PathUtilsService.fillListNode($scope.node, identifier.label, identifier.value);
487 requestHeader.urlChanged = true;
491 * Check data before executin operations
493 function prepareDataAndExecute(cbk){
494 if ( requestHeader.requestUrl.length ) {
496 if ( requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA ) {
498 var params = { reqData: null };
499 $scope.rootBroadcast('YANGMAN_GET_CODEMIRROR_DATA_SENT', params);
500 executeOperation(params.reqData ? angular.fromJson(params.reqData) : {}, cbk);
502 executeOperation({}, cbk);
508 * Mount point initialization
509 * @param mountPointStructure
510 * @param mountPointTreeApis
511 * @param mountPointApis
512 * @param augmentations
514 function initMountPoint(mountPointTreeApis, mountPointApis, augmentations, reqObj){
515 DataBackupService.storeFromScope(
517 'selectedDatastore', 'node', 'apis',
518 'selectedApi', 'selectedSubApi', 'augmentations', 'selectedModule',
524 $scope.rootBroadcast('YANGMAN_GET_API_TREE_DATA', null, function (treeApis) {
525 DataBackupService.storeFromScope(
527 { treeApis: treeApis },
532 $scope.setNode(null);
533 $scope.setModule(null);
534 $scope.setGlobalParams(mountPointApis, augmentations);
535 $scope.setDataStore(null);
536 requestHeader.statusObj = reqObj;
537 $scope.rootBroadcast('YANGMAN_SET_API_TREE_DATA', mountPointTreeApis);
541 * Executing custom plugin callback
542 * @param customPlugin
544 function executePluginFunctionality(customPlugin){
545 requestHeader.selectedPlugin = customPlugin;
546 customPlugin.runCallback({ scope: $scope, controller: requestHeader });
550 * Unset custom plugin functionality - get back major params from scope
552 function unsetPluginFunctionality(){
553 if ( requestHeader.selectedPlugin ) {
554 $scope.unsetPlugin(requestHeader);
557 requestHeader.selectedPlugin = null;
558 requestHeader.selectedPluginsButtons = [];