1 define(['app/yangui/yangui.module', 'app/yangui/yangui.services', 'app/yangui/directives/abn_tree.directive', 'app/yangui/directives/sticky.directive', 'app/yangui/directives/read_file.directive', 'app/yangui/pluginHandler.services'], function(yangui) {
\r
3 yangui.register.controller('yanguiCtrl', ['$scope', '$timeout', '$rootScope', '$http', '$filter', 'YangUtilsRestangular', 'yangUtils', 'reqBuilder', 'custFunct',
\r
4 'pluginHandler', 'pathUtils', 'constants', 'nodeWrapper', 'mountPointsConnector', 'filterConstants','displayMountPoints','yinParser', 'designUtils', 'eventDispatcher', 'syncFact',
\r
5 'customFunctUnsetter', 'HistoryServices', 'dataBackuper',
\r
6 function ($scope, $timeout, $rootScope, $http, $filter, YangUtilsRestangular, yangUtils, reqBuilder, custFunctFact, pluginHandler, pathUtils, constants, nodeWrapper, mountPointsConnector,
\r
7 filterConstants, displayMountPoints, yinParser, designUtils, eventDispatcher, syncFact, customFunctUnsetter, HistoryServices, dataBackuper) {
\r
8 $rootScope['section_logo'] = 'assets/images/logo_yangui.gif';
\r
10 $scope.currentPath = 'src/app/yangui/views/';
\r
11 $scope.apiType = '';
\r
12 $scope.constants = constants;
\r
13 $scope.filterConstants = filterConstants;
\r
14 $scope.filterRootNode = null;
\r
15 $scope.previewValidity = true;
\r
16 $scope.previewDelay = 2000;
\r
17 $scope.selCustFunct = null;
\r
18 $scope.selCustFunctButts = [];
\r
19 $scope.mpSynchronizer = syncFact.generateObj();
\r
20 $scope.baseMpApi = '';
\r
21 $scope.defaultTreeName = $filter('translate')('YANGUI_ROOT');
\r
22 $scope.treeName = $scope.defaultTreeName;
\r
36 $scope.showTabs = function(tabs, tabName){
\r
37 for(var prop in tabs){
\r
38 tabs[prop] = tabName === prop;
\r
42 var mountPrefix = constants.MPPREFIX;
\r
44 var statusChangeEvent = function(messages) {
\r
45 // var newMessage = $scope.status.rawMsg + '\r\n' + messages.join('\r\n');
\r
46 processingModulesCallback(messages[0]);
\r
49 var fillPathIdentifiersByKey = function(inputs) {
\r
50 var node = inputs[0],
\r
51 value = inputs[1] || '';
\r
53 if($scope.selSubApi && node.parent && $scope.selSubApi.node.id === node.parent.id) { //or $scope.node === node.parent?
\r
54 var identifiers = $scope.selSubApi.pathArray[$scope.selSubApi.pathArray.length - 1].identifiers;
\r
55 pathUtils.fillIdentifiers(identifiers, node.label, value);
\r
59 var fillPathIdentifiersByListData = function(inputs) {
\r
60 var node = inputs[0];
\r
62 if($scope.selSubApi && node && $scope.selSubApi.node.id === node.id) { //or $scope.node === node.parent?
\r
63 var identifiers = $scope.selSubApi.pathArray[$scope.selSubApi.pathArray.length - 1].identifiers,
\r
66 keys.forEach(function(key) {
\r
67 pathUtils.fillIdentifiers(identifiers, key.label, key.value);
\r
72 $scope.updateParameterizeData = function(req) {
\r
73 if((req.method === 'PUT' || req.method === 'POST') && req.data && $.isEmptyObject(req.data) === false) {
\r
74 req.parametrizedData = JSON.parse(req.data);
\r
78 $scope.parameterizeData = function(path) {
\r
79 var parameterList = null;
\r
81 $scope.$broadcast('GET_PARAMETER_LIST', function(parameters) {
\r
82 parameterList = parameters;
\r
85 return HistoryServices.parametrizeData(parameterList.list, path);
\r
88 eventDispatcher.registerHandler(constants.EV_SRC_MAIN, statusChangeEvent);
\r
89 eventDispatcher.registerHandler(constants.EV_FILL_PATH, fillPathIdentifiersByKey);
\r
90 eventDispatcher.registerHandler(constants.EV_LIST_CHANGED, fillPathIdentifiersByListData);
\r
92 var processingModulesCallback = function(e) {
\r
96 msg: 'PROCESSING_MODULES',
\r
101 $scope.processingModulesSuccessCallback = function(e) {
\r
104 msg: 'PROCESSING_MODULES_SUCCESS',
\r
109 $scope.processingModulesErrorCallback = function(e) {
\r
112 msg: 'PROCESSING_MODULES_ERROR',
\r
117 var requestWorkingCallback = function() {
\r
125 var requestSuccessCallback = function() {
\r
128 msg: 'SEND_SUCCESS'
\r
132 $scope.setStatusMessage = function(type, msg, e){
\r
140 var requestErrorCallback = function(e, resp) {
\r
141 var errorMessages = yangUtils.errorMessages,
\r
142 msg = errorMessages.method[resp.config.method] ? errorMessages.method[resp.config.method][resp.status] ? errorMessages.method[resp.config.method][resp.status] : 'SEND_ERROR' : 'SEND_ERROR';
\r
147 rawMsg: e.toString()
\r
151 var setCustFunct = function(apis) {
\r
152 pluginHandler.plugAll($scope.apis, $scope);
\r
155 $scope.removeMountPointPath = function(pathArray){
\r
156 var mpPathIndex = pathArray.length;
\r
158 pathArray.some(function(pathElem, index) {
\r
159 var isMPElem = pathElem.name === mountPrefix;
\r
161 mpPathIndex = index;
\r
167 var pathCopy = pathArray.slice(0, mpPathIndex);
\r
171 $scope.invalidatePreview = function() {
\r
172 $scope.previewValidity = false;
\r
175 $scope.validatePreview = function() {
\r
176 $scope.previewValidity = true;
\r
179 $scope.isPreviewValid = function() {
\r
180 return $scope.previewValidity;
\r
183 $scope.preview = function() {
\r
184 if($scope.isPreviewValid()) {
\r
185 $scope.invalidatePreview();
\r
187 $timeout(function () {
\r
188 $scope.buildPreview();
\r
189 $scope.validatePreview();
\r
190 }, $scope.previewDelay);
\r
194 $scope.buildPreview = function() {
\r
196 var reqString = $scope.selSubApi.buildApiRequestString(),
\r
200 $scope.node.buildRequest(reqBuilder, requestData);
\r
201 // update request data (remove envelope from POST request etc.)
\r
202 requestData = yangUtils.prepareRequestData(requestData, $scope.selectedOperation, reqString, $scope.selSubApi);
\r
204 var jsonRequestData = requestData ? JSON.stringify(requestData, null, 4) : '';
\r
206 $scope.previewValue = $scope.selApi.basePath + reqString;
\r
207 $scope.previewValue = $scope.previewValue + '\r\n' + jsonRequestData;
\r
209 $scope.previewValue = '';
\r
213 $scope.getNodeName = function(localeLabel, label) {
\r
214 var localeResult = $filter('translate')(localeLabel);
\r
215 return localeResult.indexOf(constants.LOCALE_PREFIX) === 0 ? label : localeResult;
\r
218 $scope.showCustFunctButton = function() {
\r
219 return $scope.selCustFunct === null;
\r
222 $scope.showCustFunctCancelButton = function() {
\r
223 return $scope.selCustFunct !== null;
\r
226 $scope.unsetCustomFunctionality = function() {
\r
227 if($scope.selCustFunct) {
\r
228 customFunctUnsetter.unset($scope.selCustFunct, $scope);
\r
230 $scope.selCustFunct = null;
\r
231 $scope.treeName = $scope.defaultTreeName;
\r
232 $scope.selCustFunctButts = [];
\r
235 var loadApis = function loadApis() {
\r
237 $scope.allNodes = [];
\r
238 $scope.treeApis = [];
\r
239 $scope.augmentations = {};
\r
241 processingModulesCallback();
\r
242 yangUtils.generateNodesToApis(function(apis, allNodes, augGroups) {
\r
243 $scope.apis = apis;
\r
244 $scope.allNodes = allNodes;
\r
245 $scope.augmentations = augGroups;
\r
246 console.info('got data', $scope.apis, $scope.allNodes, $scope.augmentations);
\r
247 $scope.treeApis = yangUtils.generateApiTreeData(apis);
\r
248 console.info('tree api', $scope.treeApis);
\r
249 $scope.processingModulesSuccessCallback();
\r
251 setCustFunct($scope.apis);
\r
252 $scope.$broadcast('LOAD_REQ_DATA');
\r
254 $scope.processingModulesErrorCallback(e);
\r
258 $scope.isMountPointSelected = function() {
\r
259 return $scope.selCustFunct.label === 'YANGUI_CUST_MOUNT_POINTS';
\r
262 $scope.dismissStatus = function() {
\r
263 $scope.status = {};
\r
266 $scope.setNode = function() {
\r
267 $scope.node = $scope.selSubApi.node;
\r
270 $scope.setApiNode = function(indexApi, indexSubApi) {
\r
271 $scope.selectedOperation = null;
\r
273 if(indexApi !== undefined && indexSubApi !== undefined ) {
\r
274 $scope.selApi = $scope.apis[indexApi];
\r
275 $scope.selSubApi = $scope.selApi.subApis[indexSubApi];
\r
277 $scope.apiType = $scope.selSubApi.pathArray[0].name === 'operational' ? 'operational/':'';
\r
278 $scope.node = $scope.selSubApi.node;
\r
279 $scope.filterRootNode = $scope.selSubApi.node;
\r
280 $scope.node.clear();
\r
282 if($scope.selSubApi && $scope.selSubApi.operations) {
\r
283 $scope.selectedOperation = $scope.selSubApi.operations[0];
\r
285 $scope.$broadcast('EV_REFRESH_LIST_INDEX');
\r
287 $scope.selApi = null;
\r
288 $scope.selSubApi = null;
\r
289 $scope.node = null;
\r
293 $scope.loadController = function() {
\r
295 $scope.devices = [];
\r
297 $scope.previewVisible = false;
\r
298 $scope.previewValue = '';
\r
299 $scope.popupData = { show: false};
\r
300 $scope.dataToFill = '';
\r
301 $scope.apiToFill = '';
\r
305 $rootScope.$on('$includeContentLoaded', function() {
\r
306 designUtils.setDraggablePopups();
\r
307 //designUtils.getHistoryPopUpWidth();
\r
311 $scope.executeOperation = function(operation, callback, reqPath) {
\r
312 var reqString = $scope.selSubApi.buildApiRequestString(),
\r
314 preparedRequestData = {},
\r
317 reqString = reqPath ? reqPath.slice($scope.selApi.basePath.length, reqPath.length) : reqString;
\r
318 var requestPath = $scope.selApi.basePath + reqString;
\r
320 $scope.node.buildRequest(reqBuilder, requestData);
\r
321 angular.copy(requestData, preparedRequestData);
\r
323 preparedRequestData = yangUtils.prepareRequestData(preparedRequestData, operation, reqString, $scope.selSubApi);
\r
325 operation = yangUtils.prepareOperation(operation);
\r
326 headers = yangUtils.prepareHeaders(preparedRequestData);
\r
328 requestWorkingCallback();
\r
330 YangUtilsRestangular.one('restconf').customOperation(operation.toLowerCase(), reqString, null, headers, preparedRequestData).then(
\r
332 if(operation === 'REMOVE'){
\r
333 $scope.node.clear();
\r
337 $scope.node.clear();
\r
338 var props = Object.getOwnPropertyNames(data);
\r
340 props.forEach(function(p) { //fill each property - needed for root mountpoint node, in other cases there should be only one property anyway
\r
341 $scope.node.fill(p, data[p]);
\r
343 $scope.node.expanded = true;
\r
346 requestSuccessCallback();
\r
347 //TODO after first GET we have set $scope.node with data so build from the top of this function return requestData
\r
348 if(operation === 'GET'){
\r
351 $scope.$broadcast('YUI_ADD_TO_HISTORY', 'success', data, preparedRequestData, operation, requestPath);
\r
353 if ( angular.isFunction(callback) ) {
\r
357 if($scope.previewVisible === true){
\r
361 }, function(resp) {
\r
364 if(resp.data && resp.data.errors && resp.data.errors.error && resp.data.errors.error.length) {
\r
365 errorMsg = ': ' + resp.data.errors.error.map(function(e) {
\r
366 return e['error-message'];
\r
370 requestErrorCallback(errorMsg, resp);
\r
372 //TODO after first GET we have set $scope.node with data so build from the top of this function return requestData
\r
373 if(operation === 'GET'){
\r
376 $scope.$broadcast('YUI_ADD_TO_HISTORY', 'error', resp.data, preparedRequestData, operation, requestPath);
\r
378 console.info('error sending request to',$scope.selSubApi.buildApiRequestString(),'reqString',reqString,'got',resp.status,'data',resp.data);
\r
383 $scope.executeCustFunctionality = function(custFunct) {
\r
384 custFunct.runCallback($scope);
\r
385 $scope.selCustFunct = custFunct;
\r
388 $scope.fillNodeData = function(pathElem, identifier) {
\r
389 if($scope.selSubApi && $scope.selSubApi.storage === 'config' &&
\r
390 $scope.selSubApi.pathArray.indexOf(pathElem) === ($scope.selSubApi.pathArray.length - 1)) {
\r
391 pathUtils.fillListNode($scope.node, identifier.label, identifier.value);
\r
395 $scope.showPreview = function() {
\r
396 $scope.previewVisible = true;
\r
397 $scope.buildPreview();
\r
400 $scope.hidePreview = function() {
\r
401 $scope.previewVisible = false;
\r
404 $scope.buildRoot = function() {
\r
405 $scope.node.buildRequest(reqBuilder, {});
\r
408 $scope.changePathInPreview = function() {
\r
412 $scope.fillApiAndData = function(req) {
\r
413 $scope.updateParameterizeData(req);
\r
415 var path = req.parametrizedPath ? req.parametrizedPath : req.path,
\r
416 rdata = req.receivedData,
\r
417 sdata = (req.parametrizedData && !$.isEmptyObject(req.parametrizedData)) ? req.parametrizedData : req.sentData;
\r
420 $scope.fillApi(path);
\r
422 if($scope.node && (rdata || sdata)) {
\r
424 $scope.fillApiData(rdata);
\r
428 $scope.fillApiData(sdata);
\r
433 $scope.selectedOperation = req.method;
\r
436 $scope.fillStandardApi = function(searchPath, fillPath) {
\r
437 fillPath = fillPath || searchPath;
\r
438 var apiIndexes = pathUtils.searchNodeByPath(searchPath, $scope.treeApis, $scope.treeRows);
\r
441 $scope.setApiNode(apiIndexes.indexApi, apiIndexes.indexSubApi);
\r
442 if($scope.selSubApi) {
\r
443 pathUtils.fillPath($scope.selSubApi.pathArray, fillPath);
\r
448 $scope.fillApi = function(path) {
\r
449 var parameterizedPath = $scope.parameterizeData(path);
\r
450 fillPath = parameterizedPath;
\r
452 if(parameterizedPath.indexOf(mountPrefix) !== -1) {
\r
453 fillPath = parameterizedPath.replace('restconf/config','restconf/operational');
\r
456 $scope.fillStandardApi(fillPath);
\r
458 if(path.indexOf(mountPrefix) !== -1 && $scope.selSubApi) {
\r
459 $scope.selSubApi.pathArray = $scope.removeMountPointPath($scope.selSubApi.pathArray);
\r
462 $scope.mpSynchronizer.waitFor(function () {
\r
463 $scope.fillMPApi(parameterizedPath);
\r
468 $scope.selectMP = function() {
\r
469 var mpCF = custFunctFact.getMPCustFunctionality($scope.selSubApi.custFunct);
\r
471 $scope.executeCustFunctionality(mpCF);
\r
473 console.warn('Mountpoint custom functionality for api', $scope.selSubApi.buildApiRequestString(), ' is not set');
\r
477 $scope.fillMPApi = function(path) {
\r
478 var mpPath = mountPointsConnector.alterMpPath(path),
\r
479 apiIndexes = pathUtils.searchNodeByPath(mpPath, $scope.treeApis, $scope.treeRows);
\r
481 $scope.setApiNode(apiIndexes.indexApi, apiIndexes.indexSubApi);
\r
482 if($scope.selSubApi) {
\r
483 pathUtils.fillPath($scope.selSubApi.pathArray, path);
\r
488 $scope.fillApiData = function(data){
\r
489 var parametrizedData = $scope.parameterizeData(data),
\r
492 obj = typeof parametrizedData === "object" ? parametrizedData : JSON.parse(parametrizedData);
\r
494 if (obj !== null && typeof obj === "object") {
\r
495 var p = Object.keys(obj)[0];
\r
496 $scope.node.fill(p, obj[p]);
\r
500 $scope.show_add_data_popup = function(){
\r
501 $scope.popupData.show = true;
\r
504 $scope.close_popup = function(popObj){
\r
505 popObj.show = false;
\r
508 $scope.tabs = function(event, index){
\r
509 var tabDom = $(event.target).closest('.tabs');
\r
511 tabDom.find(' > .tab-content').children('.tab-pane')
\r
512 .removeClass('active')
\r
513 .eq(index).addClass('active');
\r
515 tabDom.find('> .nav-tabs').children('li')
\r
516 .removeClass('btn-selected')
\r
517 .eq(index).addClass('btn-selected');
\r
520 $scope.initMp = function(mountPointStructure, mountPointTreeApis, mountPointApis, baseMpApi, augmentations){
\r
521 dataBackuper.storeFromScope(['treeApis', 'treeRows', 'apis', 'node', 'selApi', 'selSubApi', 'augmentations'], $scope);
\r
522 $scope.filterRootNode = null;
\r
523 $scope.node = null;
\r
524 $scope.treeApis = mountPointTreeApis;
\r
525 $scope.apis = mountPointApis;
\r
526 $scope.processingModulesSuccessCallback();
\r
527 $scope.baseMpApi = baseMpApi;
\r
528 $scope.augmentations = augmentations;
\r
529 $scope.$broadcast('REFRESH_HISTORY_REQUEST_APIS');
\r
532 $scope.showModalRequestWin = function(){
\r
533 $scope.$broadcast('LOAD_REQ_DATA');
\r
536 $scope.$on('SET_SCOPE_TREE_ROWS', function(e, rows){
\r
537 $scope.treeRows = rows;
\r
541 loadApis: loadApis,
\r
542 processingModulesErrorCallback: $scope.processingModulesErrorCallback,
\r
543 requestErrorCallback: requestErrorCallback,
\r
544 requestSuccessCallback: requestSuccessCallback,
\r
545 requestWorkingCallback: requestWorkingCallback,
\r
546 processingModulesCallback: processingModulesCallback,
\r
547 processingModulesSuccessCallback: $scope.processingModulesSuccessCallback
\r
550 $scope.loadController();
\r
554 yangui.register.controller('requestHistoryCtrl', ['$scope', '$rootScope','pathUtils','HistoryServices', 'handleFile', 'yangUtils', 'constants', 'mountPointsConnector', '$filter',
\r
555 function ($scope, $rootScope, pathUtils, HistoryServices, handleFile, yangUtils, constants, mountPointsConnector, $filter) {
\r
557 $scope.collectionBoxView = false;
\r
559 var mountPrefix = constants.MPPREFIX;
\r
561 var getApiCallback = function(pathString) {
\r
562 var normalizedPath = mountPointsConnector.alterMpPath(pathString), //if the path is for mountpoint then normalize it
\r
563 apiIndexes = pathUtils.searchNodeByPath(normalizedPath, $scope.treeApis, $scope.treeRows),
\r
564 selApi = apiIndexes ? $scope.apis[apiIndexes.indexApi] : null,
\r
565 selSubApi = selApi ? selApi.subApis[apiIndexes.indexSubApi] : null,
\r
566 copiedApi = selSubApi ? {pathArray : []} : null;
\r
569 copiedApi = selSubApi.cloneWithoutNode();
\r
570 copiedApi.pathArray.forEach(function(p){
\r
574 pathUtils.fillPath(copiedApi.pathArray, normalizedPath);
\r
579 $scope.requestList = HistoryServices.createEmptyHistoryList('requestList', getApiCallback);
\r
580 $scope.collectionList = HistoryServices.createEmptyCollectionList('collectionList', getApiCallback);
\r
581 $scope.parameterList = HistoryServices.createEmptyParamList('parameterList');
\r
582 $scope.parameterList.loadListFromStorage();
\r
584 $scope.popupHistory = { show: false};
\r
586 $scope.$on('REFRESH_HISTORY_REQUEST_APIS', function(event, callback){
\r
587 $scope.requestList.refresh();
\r
588 $scope.collectionList.refresh();
\r
592 $scope.$on('GET_PARAMETER_LIST', function(event, callback){
\r
593 callback($scope.parameterList);
\r
596 $scope.$on('YUI_ADD_TO_HISTORY', function(event, status, data, requestData, operation, requestPath) {
\r
597 $scope.addRequestToList(status, data, requestData, operation, requestPath);
\r
600 $scope.addRequestToList = function(status, receivedData, sentData, operation, path) {
\r
601 if(typeof(Storage) !== "undefined") {
\r
603 var rList = HistoryServices.createEmptyHistoryList(),
\r
604 reqObj = HistoryServices.createHistoryRequest(sentData, receivedData, null, path, null, operation, status, null, null, getApiCallback);
\r
606 $scope.requestList.addRequestToList(reqObj);
\r
607 $scope.requestList.saveToStorage();
\r
612 $scope.reqHistoryFunc = function(){
\r
613 $scope.popupHistory.show = !$scope.popupHistory.show;
\r
615 $scope.requestList.loadListFromStorage();
\r
616 $scope.collectionList.loadListFromStorage();
\r
617 $scope.requestList.show = false;
\r
620 $scope.show_history_data = function(req, sent, noData){
\r
621 req.sentDataView = sent;
\r
622 req.show = true;//!req.show;
\r
624 req.setDataForView(sent);
\r
628 $scope.close_history_data = function(req){
\r
632 $scope.saveParametrizedData = function(req, list){
\r
633 var parametrizedPath = req.api.parent.basePath + pathUtils.translatePathArray(req.api.clonedPathArray).join('/'),
\r
634 newReq = req.copyWithParametrizationAsNatural(parametrizedPath, getApiCallback),
\r
637 ParsingException = function(msg){
\r
643 d = JSON.parse(req.data);
\r
645 throw new ParsingException(e.message);
\r
647 newReq.sentData = d;
\r
649 req.clearParametrizedData();
\r
651 list.addRequestToList(newReq);
\r
652 list.saveToStorage();
\r
658 if(e instanceof ParsingException){
\r
659 alert($filter('translate')('YANGUI_ERROR_PARSING_JSON') + ': ' + e.msg);
\r
666 $scope.showCollBox = function(req, edit){
\r
667 $scope.collectionBoxView = true;
\r
668 $scope.$broadcast('COLL_CLEAR_VAL_SET_REQ', req, edit);
\r
672 $scope.hideCollBox = function(){
\r
673 $scope.collectionBoxView = false;
\r
676 $scope.saveElemToList = function(elem) {
\r
677 $scope.collectionList.addRequestToList(elem);
\r
678 $scope.collectionList.saveToStorage();
\r
681 $scope.saveParamToList = function(elem, oldElem) {
\r
682 $scope.parameterList.saveRequestToList(elem, oldElem);
\r
685 $scope.deleteRequestItem = function(elem, list){
\r
686 $scope[list].deleteRequestItem(elem);
\r
687 $scope[list].saveToStorage();
\r
690 $scope.clearHistoryData = function(list){
\r
691 $scope[list].clear();
\r
692 $scope[list].saveToStorage();
\r
695 var clearFileInputValue = function() {
\r
696 var el = document.getElementById("upload-collection");
\r
700 $scope.exportHistoryData = function() {
\r
701 var cListJSON = localStorage.getItem("collectionList");
\r
703 handleFile.downloadFile('requestCollection.json', cListJSON, 'json', 'charset=utf-8', function(){
\r
704 $scope.setStatusMessage('success', 'EXPORT_COLLECTIONS_SUCCESS');
\r
706 $scope.setStatusMessage('danger', 'EXPORT_COLLECTIONS_ERROR', e);
\r
707 console.error('ExportCollection error:', e);
\r
711 $scope.readCollectionFromFile = function($fileContent) {
\r
712 var data = $fileContent;
\r
714 if(data && HistoryServices.validateCollectionFile(data)){
\r
716 $scope.collectionList.loadListFromFile(data);
\r
717 $scope.collectionList.saveToStorage();
\r
718 $scope.setStatusMessage('success', 'LOAD_COLLECTIONS_SUCCESS');
\r
719 clearFileInputValue();
\r
721 clearFileInputValue();
\r
722 $scope.setStatusMessage('danger', 'PARSE_JSON_FILE_ERROR', e);
\r
723 console.error('DataStorage error:', e);
\r
726 $scope.setStatusMessage('danger', 'PARSE_JSON_FILE_ERROR');
\r
727 clearFileInputValue();
\r
731 $scope.executeCollectionRequest = function(req) {
\r
732 $scope.updateParameterizeData(req);
\r
734 var sdata = !$.isEmptyObject(req.parametrizedData) ? req.parametrizedData : req.sentData,
\r
735 path = req.parametrizedPath && req.show ? pathUtils.translatePathArray(req.api.clonedPathArray).join('/') : req.api.buildApiRequestString(),
\r
736 pathStrParts = path.split('/');
\r
738 path = $scope.parameterizeData(path);
\r
739 $scope.fillStandardApi(path, req.path);
\r
742 $scope.fillApiData(sdata);
\r
745 if($scope.baseMpApi) {
\r
746 pathStrParts.splice(1, 0, $scope.baseMpApi);
\r
747 path = pathStrParts.join('/');
\r
750 var requestPath = req.api.parent.basePath + path;
\r
752 $scope.executeOperation(req.method, function(data){
\r
754 if ( !data && req.receivedData ){
\r
755 $scope.node.fill($scope.node.label,req.receivedData[$scope.node.label]);
\r
760 $scope.fillRequestData = function(req, pathElem, identifier) {
\r
761 if(req.api && req.api.clonedPathArray.indexOf(pathElem) === (req.api.clonedPathArray.length - 1)) {
\r
762 var data = JSON.parse(req.data);
\r
763 pathUtils.fillListRequestData(data, pathElem.name, identifier.label, identifier.value);
\r
764 var strippedData = yangUtils.stripAngularGarbage(data, req.getLastPathDataElemName());
\r
766 angular.copy(strippedData, req.parametrizedData);
\r
767 req.data = JSON.stringify(strippedData, null, 4);
\r
770 req.parametrizedPath = pathUtils.translatePathArray(req.api.clonedPathArray).join('/');
\r
773 $scope.groupView = {};
\r
775 $scope.setGroupView = function(key) {
\r
776 $scope.groupView[key] = false;
\r
779 $scope.toggleExpanded = function(key) {
\r
780 $scope.groupView[key] = !$scope.groupView[key];
\r
783 $scope.$on('LOAD_REQ_DATA', function(){
\r
784 $scope.reqHistoryFunc();
\r
789 yangui.register.controller('collBoxCtrl', ['$scope','HistoryServices',function ($scope, HistoryServices) {
\r
791 $scope.collection = {
\r
796 $scope.selectedRequest = null;
\r
797 $scope.editBox = false;
\r
799 $scope.addHistoryItemToColl = function(){
\r
800 var elemToAdd = $scope.selectedRequest.clone();
\r
802 HistoryServices.setNameAndGroup($scope.collection.name, $scope.collection.group, elemToAdd);
\r
803 $scope.saveElemToList(elemToAdd);
\r
805 if ( $scope.editBox ) {
\r
806 $scope.deleteRequestItem($scope.selectedRequest, 'collectionList');
\r
809 $scope.hideCollBox();
\r
812 $scope.moveHistoryItemToGroup = function(elem, event){
\r
813 var elemToMove = elem.clone();
\r
815 HistoryServices.setNameAndGroup($scope.collection.name, $scope.collection.group, elemToMove);
\r
816 $scope.saveElemToList(elemToMove);
\r
817 $scope.deleteRequestItem(elem, 'collectionList');
\r
818 $scope.hideCollBox();
\r
821 $scope.$on('COLL_CLEAR_VAL_SET_REQ', function(e, req, edit){
\r
822 $scope.collection.name = edit ? req.name : '';
\r
823 $scope.collection.group = edit ? req.groupName : '';
\r
824 $scope.selectedRequest = req;
\r
825 $scope.editBox = edit;
\r
830 yangui.register.controller('historyParamCtrl',['$scope','HistoryServices', function($scope, HistoryServices){
\r
832 $scope.showParamBox = function(param){
\r
833 $scope.$broadcast('HISTORY_INIT_PARAM', param);
\r
836 $scope.createNewParam = function(){
\r
837 return HistoryServices.createParameter('','');
\r
843 yangui.register.controller('paramBoxCtrl', ['$scope', 'HistoryServices', 'eventDispatcher', 'constants', function ($scope, HistoryServices, eventDispatcher, constants) {
\r
844 $scope.paramObj = null;
\r
845 $scope.oldParam = null;
\r
846 $scope.boxView = false;
\r
848 $scope.hideParamBox = function(){
\r
849 $scope.boxView = false;
\r
850 $scope.paramObj = $scope.createNewParam();
\r
853 var addEditSuccessfull = function() {
\r
854 $scope.hideParamBox();
\r
855 $scope.parameterList.saveToStorage();
\r
858 eventDispatcher.registerHandler(constants.EV_PARAM_EDIT_SUCC, addEditSuccessfull);
\r
860 $scope.saveParam = function(){
\r
861 $scope.saveParamToList($scope.paramObj, $scope.oldParam);
\r
864 $scope.$on('HISTORY_INIT_PARAM', function(e, obj){
\r
866 $scope.paramObj = obj.clone();
\r
867 $scope.oldParam = obj;
\r
868 $scope.boxView = true;
\r
873 yangui.register.controller('leafCtrl', function ($scope) {
\r
882 'instance-identifier',
\r
896 $scope.getLeafType = function(){
\r
897 var label = $scope.node.getChildren('type')[0].label;
\r
898 return types.indexOf(label) !== -1 ? label : 'default';
\r
901 $scope.displayValue = function() {
\r
902 return $scope.node.typeChild.label !== 'empty';
\r
906 yangui.register.controller('containerCtrl', function ($scope) {
\r
907 $scope.augModalView = false;
\r
909 $scope.toggleExpandedAugModal = function(){
\r
910 $scope.augModalView = !$scope.augModalView;
\r
913 $scope.toggleExpanded = function() {
\r
914 $scope.node.expanded = !$scope.node.expanded;
\r
918 yangui.register.controller('caseCtrl', function ($scope) {
\r
919 $scope.empty = ($scope.case.children.length === 0 || ($scope.case.children.length === 1 && $scope.case.children[0].children.length ===0));
\r
921 $scope.augModalView = false;
\r
923 $scope.toggleExpandedAugModal = function(){
\r
924 $scope.augModalView = !$scope.augModalView;
\r
928 yangui.register.controller('augmentationModalCtrl', ['$scope', function($scope){
\r
929 $scope.init = function(node){
\r
930 $scope.node = node;
\r
934 yangui.register.controller('choiceCtrl', function ($scope, constants) {
\r
935 $scope.constants = constants;
\r
936 $scope.augModalView = false;
\r
938 $scope.toggleExpandedAugModal = function(){
\r
939 $scope.augModalView = !$scope.augModalView;
\r
942 $scope.toggleExpanded = function() {
\r
943 $scope.node.expanded = !$scope.node.expanded;
\r
946 $scope.caseShowing = function (node) {
\r
947 return !node.augmentationId ? true : $scope.augmentations.getAugmentation(node.parent, node.augmentationId).expanded;
\r
951 yangui.register.controller('rpcCtrl', function ($scope) {
\r
952 $scope.toggleExpanded = function() {
\r
953 $scope.node.expanded = !$scope.node.expanded;
\r
957 yangui.register.controller('inputCtrl', function ($scope) {
\r
958 $scope.augModalView = false;
\r
960 $scope.toggleExpandedAugModal = function(){
\r
961 $scope.augModalView = !$scope.augModalView;
\r
964 $scope.toggleExpanded = function() {
\r
965 $scope.node.expanded = !$scope.node.expanded;
\r
969 yangui.register.controller('outputCtrl', function ($scope) {
\r
970 $scope.augModalView = false;
\r
972 $scope.toggleExpandedAugModal = function(){
\r
973 $scope.augModalView = !$scope.augModalView;
\r
976 $scope.toggleExpanded = function() {
\r
977 $scope.node.expanded = !$scope.node.expanded;
\r
981 yangui.register.controller('listCtrl', function ($scope, listFiltering, nodeWrapper) {
\r
982 $scope.actElement = null;
\r
983 $scope.showModal = false;
\r
984 $scope.showListFilter = false;
\r
985 $scope.filterListHover = 0;
\r
986 $scope.currentDisplayIndex = 1;
\r
987 $scope.displayOffsets = [-1, 0, 1];
\r
988 $scope.augModalView = false;
\r
990 $scope.toggleExpandedAugModal = function(){
\r
991 $scope.augModalView = !$scope.augModalView;
\r
994 $scope.$on('EV_REFRESH_LIST_INDEX', function(event) {
\r
995 $scope.currentDisplayIndex = 1;
\r
998 $scope.addListElem = function() {
\r
999 $scope.showListFilter = false;
\r
1000 $scope.showModal = false;
\r
1001 listFiltering.removeEmptyFilters($scope.node);
\r
1002 $scope.node.addListElem();
\r
1005 $scope.removeListElem = function(elemIndex,fromFilter) {
\r
1006 $scope.node.removeListElem(elemIndex,fromFilter);
\r
1008 $scope.currentDisplayIndex = Math.max(Math.min($scope.currentDisplayIndex, $scope.node.listData.length - 2), 1);
\r
1011 $scope.toggleExpanded = function() {
\r
1012 $scope.node.expanded = !$scope.node.expanded;
\r
1015 $scope.shiftDisplayNext = function(typeListData) {
\r
1016 $scope.currentDisplayIndex = Math.min($scope.currentDisplayIndex + 3, $scope.node[typeListData].length - 2);
\r
1019 $scope.shiftDisplayPrev = function() {
\r
1020 $scope.currentDisplayIndex = Math.max($scope.currentDisplayIndex - 3, 1);
\r
1023 $scope.showPrevButton = function() {
\r
1024 return $scope.currentDisplayIndex > 1;
\r
1027 $scope.showNextButton = function(typeListData) {
\r
1028 return $scope.node[typeListData] && $scope.currentDisplayIndex < $scope.node[typeListData].length - 2; //node is selected after view is loaded
\r
1031 $scope.showModalWin = function() {
\r
1032 $scope.showModal = !$scope.showModal;
\r
1033 if($scope.showListFilter){
\r
1034 $scope.showListFilter = !$scope.showListFilter;
\r
1038 $scope.showListFilterWin = function() {
\r
1039 $scope.showListFilter = !$scope.showListFilter;
\r
1040 if($scope.showModal){
\r
1041 $scope.showModal = !$scope.showModal;
\r
1043 listFiltering.showListFilterWin($scope.filterRootNode,$scope.node);
\r
1046 $scope.getFilterData = function() {
\r
1047 listFiltering.getFilterData($scope.node);
\r
1050 $scope.switchFilter = function(showedFilter) {
\r
1051 listFiltering.switchFilter($scope.node,showedFilter);
\r
1054 $scope.createNewFilter = function() {
\r
1055 listFiltering.createNewFilter($scope.node);
\r
1058 $scope.applyFilter = function() {
\r
1059 listFiltering.applyFilter($scope.node);
\r
1060 $scope.showListFilter = !$scope.showListFilter;
\r
1061 $scope.currentDisplayIndex = 1;
\r
1062 if($scope.node.filteredListData.length){
\r
1063 $scope.node.doubleKeyIndexes = nodeWrapper.checkKeyDuplicity($scope.node.filteredListData,$scope.node.refKey);
\r
1065 $scope.node.doubleKeyIndexes = nodeWrapper.checkKeyDuplicity($scope.node.listData,$scope.node.refKey);
\r
1069 $scope.clearFilterData = function(changeAct, filterForClear, removeFilters) {
\r
1070 listFiltering.clearFilterData($scope.node,changeAct,filterForClear,removeFilters);
\r
1072 $scope.showListFilter = !$scope.showListFilter;
\r
1074 $scope.node.doubleKeyIndexes = nodeWrapper.checkKeyDuplicity($scope.node.listData,$scope.node.refKey);
\r
1077 $scope.activeFilter = function(filter) {
\r
1078 if(filter.active == 1){
\r
1079 filter.active = 2;
\r
1081 filter.active = 1;
\r
1085 $scope.getListName = function(offset, config) {
\r
1086 var createdListItemName = $scope.node.createListName($scope.currentDisplayIndex + offset);
\r
1088 if ( createdListItemName.length > 33 ) {
\r
1090 name: createdListItemName.substring(0,30) + '...',
\r
1091 tooltip: createdListItemName
\r
1095 name: config ? createdListItemName || '[' + ($scope.currentDisplayIndex + offset) + ']' : createdListItemName,
\r
1103 yangui.register.controller('leafListCtrl', function ($scope) {
\r
1105 $scope.addListElem = function() {
\r
1106 $scope.node.addListElem();
\r
1109 $scope.removeListElem = function(elem){
\r
1110 $scope.node.removeListElem(elem);
\r
1113 $scope.changed = function() {
\r
1117 $scope.toggleExpanded = function() {
\r
1118 $scope.node.expanded = !$scope.node.expanded;
\r
1123 yangui.register.controller('typeCtrl', function($scope){
\r
1125 $scope.valueChanged = function(){
\r
1126 if($scope.previewVisible) {
\r
1129 $scope.buildRoot();
\r
1132 $scope.node.checkValueType();
\r
1133 $scope.node.fill($scope.node.label, $scope.node.value);
\r
1138 yangui.register.controller('filterTypeCtrl', function($scope){
\r
1140 $scope.valueChanged = function(){
\r
1141 $scope.node.checkValueType();
\r
1142 $scope.node.fill($scope.node.label, $scope.node.value);
\r
1147 yangui.register.controller('typeEmptyCtrl', function($scope){
\r
1148 $scope.valueChanged = function(){
\r
1149 $scope.type.setLeafValue($scope.type.emptyValue);
\r
1151 if($scope.previewVisible) {
\r
1154 $scope.buildRoot();
\r
1160 yangui.register.controller('typeEnumCtrl', function($scope){
\r
1162 $scope.valueChanged = function(){
\r
1163 var value = $scope.type.selEnum && $scope.type.selEnum.label ? $scope.type.selEnum.label : '';
\r
1165 $scope.type.setLeafValue(value);
\r
1167 if($scope.previewVisible) {
\r
1170 $scope.buildRoot();
\r
1173 $scope.node.checkValueType();
\r
1174 $scope.node.fill($scope.node.label, $scope.node.value);
\r
1179 yangui.register.controller('typeBitCtrl', function($scope){
\r
1181 $scope.valueChanged = function(){
\r
1182 $scope.type.setLeafValue($scope.type.bitsValues);
\r
1184 if($scope.previewVisible) {
\r
1187 $scope.buildRoot();
\r
1190 $scope.node.checkValueType();
\r
1191 $scope.node.fill($scope.node.label, $scope.node.value);
\r
1196 yangui.register.controller('filter', function($scope, listFiltering){
\r
1197 $scope.isFilter = true;
\r
1199 $scope.getFilterTypeArray = function(type){
\r
1200 return listFiltering.getFilterTypeArray(type);
\r
1204 yangui.register.controller('filterTypeEnumCtrl', function($scope){
\r
1206 $scope.valueChanged = function(){
\r
1207 var value = $scope.type.selEnum && $scope.type.selEnum.label ? $scope.type.selEnum.label : '';
\r
1209 $scope.type.setLeafValue(value);
\r
1211 $scope.node.checkValueType();
\r
1212 $scope.node.fill($scope.node.label, $scope.node.value);
\r
1217 yangui.register.controller('filterTypeBitCtrl', function($scope){
\r
1219 $scope.valueChanged = function(){
\r
1220 $scope.type.setLeafValue($scope.type.bitsValues,true);
\r
1222 $scope.node.checkValueType();
\r
1223 $scope.node.fill($scope.node.label, $scope.node.value);
\r
1228 yangui.register.filter('onlyConfigStmts', function(nodeUtils){
\r
1229 return function(nodes){
\r
1231 if(nodes.length) {
\r
1232 nodes = nodes.filter(function(n){
\r
1233 return nodeUtils.isOnlyOperationalNode(n);
\r