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;
23 requestHeader.selectedOperationsList = [];
24 requestHeader.selectedOperation = null;
25 requestHeader.requestUrl = '';
26 requestHeader.selectedPluginsButtons = [];
27 requestHeader.selectedPlugin = null;
28 requestHeader.statusObj = null;
29 requestHeader.fillFormWithReceivedData = true;
32 requestHeader.executeOperation = executeOperation;
33 requestHeader.executePluginFunctionality = executePluginFunctionality;
34 requestHeader.fillNodeData = fillNodeData;
35 requestHeader.changeDataType = changeDataType;
36 requestHeader.prepareDataAndExecute = prepareDataAndExecute;
37 requestHeader.initMountPoint = initMountPoint;
38 requestHeader.setJsonView = setJsonView;
39 requestHeader.setRequestUrl = setRequestUrl;
40 requestHeader.showParamsAdmin = showParamsAdmin;
41 requestHeader.saveRequestToCollection = saveRequestToCollection;
42 requestHeader.unsetPluginFunctionality = unsetPluginFunctionality;
44 $scope.$on(constants.YANGMAN_CHANGE_TO_JSON, function () {
45 sendRequestData($scope.buildRootRequest(), 'SENT');
48 * Set selected operations based on data store
50 $scope.$on(constants.SET_SEL_OPERATIONS, function (event, operations, setUrl) {
51 setAllowedMethods(operations);
59 * Watching for changes in shown detail data type (radio button)
61 $scope.$on(constants.YANGMAN_HEADER_INIT, function (event, args) {
63 setRequestUrl(args.params.path);
64 setRequestMethod(args.params.method);
65 setRequestStatus(args.params.statusObj);
67 (args.cbk || angular.noop)();
70 $scope.$on(constants.YANGMAN_FILL_NODE_FROM_REQ, function (event, args) {
71 setNodeDataFromRequestData(args.params.requestUrl, args.params.leftpanel);
72 (args.cbk || angular.noop)();
75 $scope.$on(constants.YANGMAN_EXECUTE_WITH_DATA, function (event, args) {
76 executeOperation(args.params.data ? angular.fromJson(args.params.data) : {}, args.cbk);
82 * Setter for selected operation
85 function setRequestMethod(method){
86 requestHeader.selectedOperation = method;
90 * Setter for request status
93 function setRequestStatus(statusObj){
94 requestHeader.statusObj = statusObj;
98 * Show popup for parameters administration
101 function showParamsAdmin(event) {
103 controller: ParamsAdminCtrl,
104 controllerAs: 'paramsAdmin',
105 templateUrl: $scope.globalViewPath + 'popup/parameters-admin.tpl.html',
106 parent: angular.element('#yangmanModule'),
108 clickOutsideToClose: true,
110 parametersList: $scope.parametersList,
114 $scope.parametersList.loadListFromStorage();
117 $scope.parametersList.loadListFromStorage();
123 * Method for selecting correct json view by selected operation
125 function setJsonView(){
126 var both = [constants.OPERATION_PUT, constants.OPERATION_POST];
128 if ( both.indexOf(requestHeader.selectedOperation) > -1 ){
129 $scope.setJsonView(true, true);
131 $scope.setJsonView(true, false);
136 * Change displayed data type to json or form, after switching set current data to be displayed
138 function changeDataType(){
139 $scope.switchSection('rightPanelSection', requestHeader.selectedShownDataType);
141 if (!$scope.node || requestHeader.urlChanged) {
142 requestHeader.setRequestUrl();
143 requestHeader.urlChanged = false;
146 // if changing to json, fill codemirror data
147 if ( requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA && $scope.node ){
149 sendRequestData($scope.buildRootRequest(), 'SENT');
152 // if changing to form, try to fill node data
153 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM) {
156 reqData = getDataForForm();
157 setNodeDataFromRequestData(requestHeader.requestUrl);
161 YangmanService.fillNodeFromResponse($scope.node, reqData);
162 $scope.node.expanded = true;
168 * Helper method for building correct json data for form, rpc included
171 function getDataForForm(){
177 var sentData = { reqData: null },
178 allData = { sent: null, received: null };
180 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_RECEIVED, params);
181 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_SENT, sentData);
183 allData.sent = sentData.reqData ? angular.fromJson(sentData.reqData) : {};
184 allData.received = params.reqData ? angular.fromJson(params.reqData) : {};
186 return YangmanService.prepareReceivedData(
188 requestHeader.selectedOperation,
191 requestHeader.selectedShownDataType
194 default: function (){
196 if(requestHeader.executedOperation) {
197 dataType = requestHeader.executedOperation === constants.OPERATION_GET ? constants.REQUEST_DATA_TYPE_RECEIVED : 'SENT';
200 dataType = requestHeader.selectedOperation === constants.OPERATION_GET ? constants.REQUEST_DATA_TYPE_RECEIVED : 'SENT';
203 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA + dataType, params);
204 return params.reqData ? angular.fromJson(params.reqData) : {};
208 return $scope.node ? (dataTypeFunc[$scope.node.type] || dataTypeFunc.default)() : {};
212 * Send data to codemirror
215 function sendRequestData(data, type){
216 $scope.rootBroadcast(
217 constants.YANGMAN_SET_CODEMIRROR_DATA + type,
218 { data: data instanceof Object ? JSON.stringify(data, null, 4) : data }
223 * Set error data to be shown in form area
226 function sendErrorData(response) {
227 $scope.rootBroadcast(constants.YANGMAN_SET_ERROR_DATA, response);
231 * Create empty parameters list, load from local storage and set to $scope
233 function initParams(){
234 $scope.parametersList.loadListFromStorage();
241 setAllowedMethods(requestHeader.allOperations);
243 requestHeader.selectedShownDataType = $scope.rightPanelSection;
247 * Set allowed operations for request
250 function setAllowedMethods(operations){
251 requestHeader.selectedOperationsList = operations.length ? operations : requestHeader.allOperations;
252 if (operations.indexOf(requestHeader.selectedOperation) === -1){
253 requestHeader.selectedOperation = requestHeader.selectedOperationsList[0];
258 * Set header request url if json selected
260 function setRequestUrl(path){
261 requestHeader.requestUrl = path || ($scope.selectedSubApi ?
262 ENV.getBaseURL('MD_SAL') + '/restconf/' + $scope.selectedSubApi.buildApiRequestString() : '');
267 * Try to set api, module, dataStore and node, if api indexes for request url available
268 * and set (or unset) module detail panel to be displayed
269 * @param requestUrl url to try to find
270 * @param leftpanel index of main left tabs to be displayed (we dont want to display module detail in all cases)
272 function setNodeDataFromRequestData(requestUrl, leftpanel){
274 setApiByUrl(requestUrl, function (treeApis) {
276 $scope.setModule($filter('filter')(treeApis, { label: $scope.selectedApi.module })[0]);
281 $scope.selectedModule.children,
282 { label: $scope.selectedSubApi.storage })[0],
288 $scope.setNode($scope.selectedSubApi.node);
291 PathUtilsService.fillPath($scope.selectedSubApi.pathArray, requestUrl);
297 * Try to set current (depending on url) selectedApi and selectedSubApi to $scope if it exists in api tree data
302 function setApiByUrl(url, cbk, fill){
303 $scope.rootBroadcast(constants.YANGMAN_GET_API_TREE_DATA, null, function (treeApis) {
305 PathUtilsService.searchNodeByPath(url, treeApis, null, true, true);
311 $scope.apis[apisIndexes.indexApi],
312 $scope.apis[apisIndexes.indexApi].subApis[apisIndexes.indexSubApi]
315 if ( $scope.selectedSubApi && fill ) {
316 var updatedUrl = YangmanService.cutUrl(url);
317 PathUtilsService.fillPath($scope.selectedSubApi.pathArray, updatedUrl);
321 (cbk || angular.noop)(treeApis);
326 function saveRequestToCollection(event) {
327 var historyReq = null,
328 sentData = { reqData: null },
329 receivedData = { reqData: null };
331 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM) {
332 requestHeader.setRequestUrl();
335 historyReq = RequestService.createHistoryRequest(
336 null, null, requestHeader.requestUrl, requestHeader.selectedOperation, '', '', ''
339 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_SENT, sentData);
340 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_RECEIVED, receivedData);
342 RequestService.fillRequestByMethod(
343 historyReq, sentData, receivedData, requestHeader.selectedOperation, $scope.node,
344 requestHeader.selectedShownDataType
347 $scope.rootBroadcast(constants.YANGMAN_SAVE_REQUEST_TO_COLLECTION, { event: event, reqObj: historyReq });
350 function showRequestProgress(){
351 $scope.rootBroadcast(constants.YANGMAN_EXECUTING_REQUEST_PROGRESS_START);
356 * Stop showing progressbar
359 function finishRequestProgress(message){
360 $scope.rootBroadcast(constants.YANGMAN_EXECUTING_REQUEST_PROGRESS_STOP);
364 * Execute request operation
366 function executeOperation(requestData, executeCbk){
367 TimeTrackingService.startTimer();
368 var allowExecuteOperation =
369 requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM && $scope.selectedSubApi ?
370 !PathUtilsService.checkEmptyIdentifiers($scope.selectedSubApi.pathArray) : true;
373 if ( allowExecuteOperation ) {
375 showRequestProgress();
376 $scope.rootBroadcast(constants.YANGMAN_SET_ERROR_MESSAGE, '');
379 requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA ?
380 requestHeader.requestUrl :
383 if ( requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA ){
384 setApiByUrl(requestHeader.requestUrl, null, true);
387 var historyReq = RequestService.createHistoryRequest(
390 requestHeader.requestUrl,
391 requestHeader.selectedOperation,
395 YangmanService.executeRequestOperation(
397 $scope.selectedSubApi,
398 requestHeader.selectedOperation,
400 requestHeader.selectedShownDataType,
401 requestHeader.requestUrl,
403 $scope.parametersList,
407 requestHeader.executedOperation = requestHeader.selectedOperation;
409 $scope.rootBroadcast(
410 constants.YANGMAN_SET_ERROR_MESSAGE,
411 $filter('translate')(constants.YANGMAN_ERROR_EMPTY_IDENTIFIERS)
413 finishRequestProgress();
417 * Success callback after executin operation
421 function executeReqSuccCbk(reqInfo, response) {
423 var preparedReceivedData = {};
425 if (requestHeader.fillFormWithReceivedData) {
426 preparedReceivedData = YangmanService.prepareReceivedData(
428 requestHeader.selectedOperation,
429 response.data ? response.data.plain() : {},
430 reqInfo.requestSrcData,
431 requestHeader.selectedShownDataType
435 finishRequestProgress();
437 requestHeader.statusObj = reqInfo;
441 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA){
442 setNodeDataFromRequestData(requestHeader.requestUrl);
443 sendRequestData(preparedReceivedData, constants.REQUEST_DATA_TYPE_RECEIVED);
444 sendRequestData(reqInfo.requestSrcData || {}, 'SENT');
447 if ($scope.node && requestHeader.selectedOperation !== constants.OPERATION_DELETE && requestHeader.fillFormWithReceivedData){
449 YangmanService.fillNodeFromResponse($scope.node, preparedReceivedData);
450 YangmanService.handleNodeIdentifier(
451 $scope.parametersList, $scope.selectedSubApi, $scope.node
453 $scope.node.expanded = true;
455 $scope.rootBroadcast(constants.YANGMAN_DISABLE_ADDING_LIST_ELEMENT);
456 preparedReceivedData = YangmanService.checkRpcReceivedData(preparedReceivedData, $scope.node);
457 sendRequestData(preparedReceivedData, constants.REQUEST_DATA_TYPE_RECEIVED);
461 // create and set history request
462 requestHeader.statusObj.time = TimeTrackingService.returnTime();
464 historyReq.setExecutionData(
465 reqInfo.requestSrcData,
466 $scope.historySettings.data.saveReceived ? preparedReceivedData : null,
467 $scope.historySettings.data.saveResponseData ? reqInfo.status : '',
468 $scope.historySettings.data.saveResponseData ? reqInfo.status : '',
469 $scope.historySettings.data.saveResponseData ? reqInfo.statusText : '',
470 $scope.historySettings.data.saveResponseData ? requestHeader.statusObj.time : ''
473 $scope.rootBroadcast(constants.YANGMAN_SAVE_EXECUTED_REQUEST, historyReq, function (){
474 $scope.rootBroadcast(constants.YANGMAN_SELECT_THE_NEWEST_REQUEST);
477 (executeCbk || angular.noop)(historyReq);
482 * Error callback after executin operation
486 function executeReqErrCbk(reqInfo, response) {
487 requestHeader.statusObj = reqInfo;
489 finishRequestProgress();
491 requestHeader.statusObj.time = TimeTrackingService.returnTime();
493 historyReq.setExecutionData(
494 reqInfo.requestSrcData,
495 $scope.historySettings.data.saveReceived ? response.data : null,
496 $scope.historySettings.data.saveResponseData ? reqInfo.status : '',
497 $scope.historySettings.data.saveResponseData ? reqInfo.status : '',
498 $scope.historySettings.data.saveResponseData ? reqInfo.statusText : '',
499 $scope.historySettings.data.saveResponseData ? requestHeader.statusObj.time : ''
501 $scope.rootBroadcast(constants.YANGMAN_SAVE_EXECUTED_REQUEST, historyReq, function (){
502 $scope.rootBroadcast(constants.YANGMAN_SELECT_THE_NEWEST_REQUEST);
506 // try to fill code mirror editor
507 sendRequestData(response.data, constants.REQUEST_DATA_TYPE_RECEIVED);
508 sendErrorData(response.data);
511 (executeCbk || angular.noop)(historyReq);
519 * TODO :: description
523 function fillNodeData(pathElem, identifier) {
524 if ($scope.selectedSubApi && $scope.selectedSubApi.storage === constants.DATA_STORE_CONFIG &&
525 $scope.selectedSubApi.pathArray.indexOf(pathElem) === ($scope.selectedSubApi.pathArray.length - 1)) {
526 PathUtilsService.fillListNode($scope.node, identifier.label, identifier.value);
529 requestHeader.urlChanged = true;
533 * Check data before executin operations
535 function prepareDataAndExecute(cbk){
536 if (requestHeader.statusObj) {
537 requestHeader.statusObj.statusText = null;
538 requestHeader.statusObj.time = null;
542 showRequestProgress();
544 $timeout(prepareData);
545 function prepareData() {
546 if ( requestHeader.requestUrl.length ) {
547 if ( requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA ) {
549 var params = { reqData: null };
550 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_SENT, params);
551 executeOperation(params.reqData ? angular.fromJson(params.reqData) : {}, cbk);
553 executeOperation({}, cbk);
560 * Mount point initialization
561 * @param mountPointStructure
562 * @param mountPointTreeApis
563 * @param mountPointApis
564 * @param augmentations
566 function initMountPoint(mountPointTreeApis, mountPointApis, augmentations, reqObj){
567 DataBackupService.storeFromScope(
569 'selectedDatastore', 'node', 'apis',
570 'selectedApi', 'selectedSubApi', 'augmentations', 'selectedModule',
576 $scope.rootBroadcast(constants.YANGMAN_GET_API_TREE_DATA, null, function (treeApis) {
577 DataBackupService.storeFromScope(
579 { treeApis: treeApis },
584 $scope.setNode(null);
585 $scope.setModule(null);
586 $scope.setGlobalParams(mountPointApis, augmentations);
587 $scope.setDataStore(null);
588 requestHeader.statusObj = reqObj;
589 $scope.rootBroadcast(constants.YANGMAN_SET_API_TREE_DATA, mountPointTreeApis);
593 * Executing custom plugin callback
594 * @param customPlugin
596 function executePluginFunctionality(customPlugin){
597 requestHeader.selectedPlugin = customPlugin;
598 customPlugin.runCallback({ scope: $scope, controller: requestHeader });
602 * Unset custom plugin functionality - get back major params from scope
604 function unsetPluginFunctionality(){
605 if ( requestHeader.selectedPlugin ) {
606 $scope.unsetPlugin(requestHeader);
609 requestHeader.selectedPlugin = null;
610 requestHeader.selectedPluginsButtons = [];