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;
31 requestHeader.executeOperation = executeOperation;
32 requestHeader.executePluginFunctionality = executePluginFunctionality;
33 requestHeader.fillNodeData = fillNodeData;
34 requestHeader.changeDataType = changeDataType;
35 requestHeader.prepareDataAndExecute = prepareDataAndExecute;
36 requestHeader.initMountPoint = initMountPoint;
37 requestHeader.setJsonView = setJsonView;
38 requestHeader.setRequestUrl = setRequestUrl;
39 requestHeader.showParamsAdmin = showParamsAdmin;
40 requestHeader.saveRequestToCollection = saveRequestToCollection;
41 requestHeader.unsetPluginFunctionality = unsetPluginFunctionality;
45 * Set selected operations based on data store
47 $scope.$on(constants.SET_SEL_OPERATIONS, function (event, operations, setUrl) {
48 setAllowedMethods(operations);
56 * Watching for changes in shown detail data type (radio button)
58 $scope.$on(constants.YANGMAN_HEADER_INIT, function (event, args) {
60 setRequestUrl(args.params.path);
61 setRequestMethod(args.params.method);
62 setRequestStatus(args.params.statusObj);
64 (args.cbk || angular.noop)();
67 $scope.$on(constants.YANGMAN_FILL_NODE_FROM_REQ, function (event, args) {
68 setNodeDataFromRequestData(args.params.requestUrl, args.params.leftpanel);
69 (args.cbk || angular.noop)();
72 $scope.$on(constants.YANGMAN_EXECUTE_WITH_DATA, function (event, args) {
73 executeOperation(args.params.data ? angular.fromJson(args.params.data) : {}, args.cbk);
79 * Setter for selected operation
82 function setRequestMethod(method){
83 requestHeader.selectedOperation = method;
87 * Setter for request status
90 function setRequestStatus(statusObj){
91 requestHeader.statusObj = statusObj;
95 * Show popup for parameters administration
98 function showParamsAdmin(event) {
100 controller: ParamsAdminCtrl,
101 controllerAs: 'paramsAdmin',
102 templateUrl: $scope.globalViewPath + 'popup/parameters-admin.tpl.html',
103 parent: angular.element('#yangmanModule'),
105 clickOutsideToClose: true,
107 parametersList: $scope.parametersList,
111 $scope.parametersList.loadListFromStorage();
114 $scope.parametersList.loadListFromStorage();
120 * Method for selecting correct json view by selected operation
122 function setJsonView(){
123 var both = [constants.OPERATION_PUT, constants.OPERATION_POST];
125 if ( both.indexOf(requestHeader.selectedOperation) > -1 ){
126 $scope.setJsonView(true, true);
128 $scope.setJsonView(true, false);
133 * Change displayed data type to json or form, after switching set current data to be displayed
135 function changeDataType(){
136 $scope.switchSection('rightPanelSection', requestHeader.selectedShownDataType);
138 if(!$scope.node || requestHeader.urlChanged) {
139 requestHeader.setRequestUrl();
140 requestHeader.urlChanged = false;
143 // if changing to json, fill codemirror data
144 if ( requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA && $scope.node ){
146 sendRequestData($scope.buildRootRequest(), 'SENT');
149 // if changing to form, try to fill node data
150 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM) {
153 reqData = getDataForForm();
154 setNodeDataFromRequestData(requestHeader.requestUrl);
158 YangmanService.fillNodeFromResponse($scope.node, reqData);
159 $scope.node.expanded = true;
165 * Helper method for building correct json data for form, rpc included
168 function getDataForForm(){
174 var sentData = { reqData: null },
175 allData = { sent: null, received: null };
177 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_RECEIVED, params);
178 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_SENT, sentData);
180 allData.sent = sentData.reqData ? angular.fromJson(sentData.reqData) : {};
181 allData.received = params.reqData ? angular.fromJson(params.reqData) : {};
183 return YangmanService.prepareReceivedData(
185 requestHeader.selectedOperation,
188 requestHeader.selectedShownDataType
191 default: function (){
193 if(requestHeader.executedOperation) {
194 dataType = requestHeader.executedOperation === constants.OPERATION_GET ? constants.REQUEST_DATA_TYPE_RECEIVED : 'SENT';
197 dataType = requestHeader.selectedOperation === constants.OPERATION_GET ? constants.REQUEST_DATA_TYPE_RECEIVED : 'SENT';
200 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA + dataType, params);
201 return params.reqData ? angular.fromJson(params.reqData) : {};
205 return $scope.node ? (dataTypeFunc[$scope.node.type] || dataTypeFunc.default)() : {};
209 * Send data to codemirror
212 function sendRequestData(data, type){
213 $scope.rootBroadcast(
214 constants.YANGMAN_SET_CODEMIRROR_DATA + type,
215 { data: data instanceof Object ? JSON.stringify(data, null, 4) : data }
219 function sendErrorData(response) {
220 $scope.rootBroadcast(constants.YANGMAN_SET_ERROR_DATA, response);
224 * Create empty parameters list, load from local storage and set to $scope
226 function initParams(){
227 $scope.parametersList.loadListFromStorage();
234 setAllowedMethods(requestHeader.allOperations);
236 requestHeader.selectedShownDataType = $scope.rightPanelSection;
240 * Set allowed operations for request
243 function setAllowedMethods(operations){
244 requestHeader.selectedOperationsList = operations.length ? operations : requestHeader.allOperations;
245 if (operations.indexOf(requestHeader.selectedOperation) === -1){
246 requestHeader.selectedOperation = requestHeader.selectedOperationsList[0];
251 * Set header request url if json selected
253 function setRequestUrl(path){
254 requestHeader.requestUrl = path || ($scope.selectedSubApi ?
255 ENV.getBaseURL('MD_SAL') + '/restconf/' + $scope.selectedSubApi.buildApiRequestString() : '');
260 * Try to set api, module, dataStore and node, if api indexes for request url available
261 * and set (or unset) module detail panel to be displayed
262 * @param requestUrl url to try to find
263 * @param leftpanel index of main left tabs to be displayed (we dont want to display module detail in all cases)
265 function setNodeDataFromRequestData(requestUrl, leftpanel){
267 setApiByUrl(requestUrl, function (treeApis) {
269 $scope.setModule($filter('filter')(treeApis, { label: $scope.selectedApi.module })[0]);
274 $scope.selectedModule.children,
275 { label: $scope.selectedSubApi.storage })[0],
281 $scope.setNode($scope.selectedSubApi.node);
284 PathUtilsService.fillPath($scope.selectedSubApi.pathArray, requestUrl);
290 * Try to set current (depending on url) selectedApi and selectedSubApi to $scope if it exists in api tree data
295 function setApiByUrl(url, cbk, fill){
296 $scope.rootBroadcast(constants.YANGMAN_GET_API_TREE_DATA, null, function (treeApis) {
298 PathUtilsService.searchNodeByPath(url, treeApis, null, true, true);
304 $scope.apis[apisIndexes.indexApi],
305 $scope.apis[apisIndexes.indexApi].subApis[apisIndexes.indexSubApi]
308 if ( $scope.selectedSubApi && fill ) {
309 var updatedUrl = YangmanService.cutUrl(url);
310 PathUtilsService.fillPath($scope.selectedSubApi.pathArray, updatedUrl);
314 (cbk || angular.noop)(treeApis);
319 function saveRequestToCollection(event) {
320 var historyReq = null,
321 sentData = { reqData: null },
322 receivedData = { reqData: null };
324 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM) {
325 requestHeader.setRequestUrl();
328 historyReq = RequestService.createHistoryRequest(
329 null, null, requestHeader.requestUrl, requestHeader.selectedOperation, '', '', ''
332 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_SENT, sentData);
333 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_RECEIVED, receivedData);
335 RequestService.fillRequestByMethod(
336 historyReq, sentData, receivedData, requestHeader.selectedOperation, $scope.node,
337 requestHeader.selectedShownDataType
340 $scope.rootBroadcast(constants.YANGMAN_SAVE_REQUEST_TO_COLLECTION, { event: event, reqObj: historyReq });
343 function showRequestProgress(){
344 $scope.rootBroadcast(constants.YANGMAN_EXECUTING_REQUEST_PROGRESS_START);
348 function finishRequestProgress(message){
349 $scope.rootBroadcast(constants.YANGMAN_EXECUTING_REQUEST_PROGRESS_STOP);
353 * Execute request operation
355 function executeOperation(requestData, executeCbk){
356 TimeTrackingService.startTimer();
357 var allowExecuteOperation =
358 requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_FORM && $scope.selectedSubApi ?
359 !PathUtilsService.checkEmptyIdentifiers($scope.selectedSubApi.pathArray) : true;
362 if ( allowExecuteOperation ) {
364 showRequestProgress();
365 $scope.rootBroadcast(constants.YANGMAN_SET_ERROR_MESSAGE, '');
368 requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA ?
369 requestHeader.requestUrl :
372 if ( requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA ){
373 setApiByUrl(requestHeader.requestUrl, null, true);
376 var historyReq = RequestService.createHistoryRequest(
379 requestHeader.requestUrl,
380 requestHeader.selectedOperation,
384 YangmanService.executeRequestOperation(
386 $scope.selectedSubApi,
387 requestHeader.selectedOperation,
389 requestHeader.selectedShownDataType,
390 requestHeader.requestUrl,
392 $scope.parametersList,
396 requestHeader.executedOperation = requestHeader.selectedOperation;
398 $scope.rootBroadcast(
399 constants.YANGMAN_SET_ERROR_MESSAGE,
400 $filter('translate')(constants.YANGMAN_ERROR_EMPTY_IDENTIFIERS)
405 * Success callback after executin operation
409 function executeReqSuccCbk(reqInfo, response) {
411 var preparedReceivedData = YangmanService.prepareReceivedData(
413 requestHeader.selectedOperation,
414 response.data ? response.data.plain() : {},
415 reqInfo.requestSrcData,
416 requestHeader.selectedShownDataType
419 finishRequestProgress();
421 requestHeader.statusObj = reqInfo;
425 if (requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA){
427 setNodeDataFromRequestData(requestHeader.requestUrl);
428 sendRequestData(preparedReceivedData, constants.REQUEST_DATA_TYPE_RECEIVED);
429 sendRequestData(reqInfo.requestSrcData || {}, 'SENT');
432 if ($scope.node && requestHeader.selectedOperation !== constants.OPERATION_DELETE){
434 YangmanService.fillNodeFromResponse($scope.node, preparedReceivedData);
435 YangmanService.handleNodeIdentifier(
436 $scope.parametersList, $scope.selectedSubApi, $scope.node
438 $scope.node.expanded = true;
440 $scope.rootBroadcast(constants.YANGMAN_DISABLE_ADDING_LIST_ELEMENT);
441 preparedReceivedData = YangmanService.checkRpcReceivedData(preparedReceivedData, $scope.node);
442 sendRequestData(preparedReceivedData, constants.REQUEST_DATA_TYPE_RECEIVED);
446 // create and set history request
447 requestHeader.statusObj.time = TimeTrackingService.returnTime();
449 historyReq.setExecutionData(
450 reqInfo.requestSrcData,
451 preparedReceivedData,
455 requestHeader.statusObj.time
458 $scope.rootBroadcast(constants.YANGMAN_SAVE_EXECUTED_REQUEST, historyReq, function (){
459 $scope.rootBroadcast(constants.YANGMAN_SELECT_THE_NEWEST_REQUEST);
462 (executeCbk || angular.noop)(historyReq);
467 * Error callback after executin operation
471 function executeReqErrCbk(reqInfo, response) {
472 requestHeader.statusObj = reqInfo;
474 finishRequestProgress();
476 requestHeader.statusObj.time = TimeTrackingService.returnTime();
478 historyReq.setExecutionData(
479 reqInfo.requestSrcData,
484 requestHeader.statusObj.time
486 $scope.rootBroadcast(constants.YANGMAN_SAVE_EXECUTED_REQUEST, historyReq, function (){
487 $scope.rootBroadcast(constants.YANGMAN_SELECT_THE_NEWEST_REQUEST);
491 // try to fill code mirror editor
492 sendRequestData(response.data, constants.REQUEST_DATA_TYPE_RECEIVED);
493 sendErrorData(response.data);
496 (executeCbk || angular.noop)(historyReq);
504 * TODO :: description
508 function fillNodeData(pathElem, identifier) {
509 if ($scope.selectedSubApi && $scope.selectedSubApi.storage === constants.DATA_STORE_CONFIG &&
510 $scope.selectedSubApi.pathArray.indexOf(pathElem) === ($scope.selectedSubApi.pathArray.length - 1)) {
511 PathUtilsService.fillListNode($scope.node, identifier.label, identifier.value);
514 requestHeader.urlChanged = true;
518 * Check data before executin operations
520 function prepareDataAndExecute(cbk){
521 if (requestHeader.statusObj) {
522 requestHeader.statusObj.statusText = null;
523 requestHeader.statusObj.time = null;
525 $timeout(prepareData);
526 function prepareData() {
527 if ( requestHeader.requestUrl.length ) {
528 if ( requestHeader.selectedShownDataType === constants.DISPLAY_TYPE_REQ_DATA ) {
530 var params = { reqData: null };
531 $scope.rootBroadcast(constants.YANGMAN_GET_CODEMIRROR_DATA_SENT, params);
532 executeOperation(params.reqData ? angular.fromJson(params.reqData) : {}, cbk);
534 executeOperation({}, cbk);
541 * Mount point initialization
542 * @param mountPointStructure
543 * @param mountPointTreeApis
544 * @param mountPointApis
545 * @param augmentations
547 function initMountPoint(mountPointTreeApis, mountPointApis, augmentations, reqObj){
548 DataBackupService.storeFromScope(
550 'selectedDatastore', 'node', 'apis',
551 'selectedApi', 'selectedSubApi', 'augmentations', 'selectedModule',
557 $scope.rootBroadcast(constants.YANGMAN_GET_API_TREE_DATA, null, function (treeApis) {
558 DataBackupService.storeFromScope(
560 { treeApis: treeApis },
565 $scope.setNode(null);
566 $scope.setModule(null);
567 $scope.setGlobalParams(mountPointApis, augmentations);
568 $scope.setDataStore(null);
569 requestHeader.statusObj = reqObj;
570 $scope.rootBroadcast(constants.YANGMAN_SET_API_TREE_DATA, mountPointTreeApis);
574 * Executing custom plugin callback
575 * @param customPlugin
577 function executePluginFunctionality(customPlugin){
578 requestHeader.selectedPlugin = customPlugin;
579 customPlugin.runCallback({ scope: $scope, controller: requestHeader });
583 * Unset custom plugin functionality - get back major params from scope
585 function unsetPluginFunctionality(){
586 if ( requestHeader.selectedPlugin ) {
587 $scope.unsetPlugin(requestHeader);
590 requestHeader.selectedPlugin = null;
591 requestHeader.selectedPluginsButtons = [];