Merge "YangUI data parametrization and Augment switching"
[dlux.git] / modules / yangui-resources / src / main / resources / yangui / yangui.controller.js
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
2 \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
9 \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
23 \r
24       $scope.status = {\r
25           type: 'noreq',\r
26           msg: null\r
27       };\r
28 \r
29       $scope.mainTabs = {\r
30         api: true,\r
31         history : false,\r
32         collection : false,\r
33         parameters : false\r
34       };\r
35 \r
36       $scope.showTabs = function(tabs, tabName){\r
37         for(var prop in tabs){\r
38           tabs[prop] = tabName === prop;\r
39         }\r
40       };\r
41 \r
42       var mountPrefix = constants.MPPREFIX;\r
43 \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
47       };\r
48 \r
49       var fillPathIdentifiersByKey = function(inputs) {\r
50           var node = inputs[0],\r
51               value = inputs[1] || '';\r
52 \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
56           }\r
57       };\r
58 \r
59       var fillPathIdentifiersByListData = function(inputs) {\r
60           var node = inputs[0];\r
61 \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
64                   keys = node.refKey;\r
65 \r
66               keys.forEach(function(key) {\r
67                   pathUtils.fillIdentifiers(identifiers, key.label, key.value);\r
68               });\r
69           }\r
70       };\r
71 \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
75           }\r
76       };\r
77 \r
78       $scope.parameterizeData = function(path) {\r
79           var parameterList = null;\r
80           \r
81           $scope.$broadcast('GET_PARAMETER_LIST', function(parameters) {\r
82               parameterList = parameters;\r
83           });\r
84 \r
85           return HistoryServices.parametrizeData(parameterList.list, path);\r
86       };\r
87 \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
91 \r
92       var processingModulesCallback = function(e) {\r
93           $scope.status = {\r
94               isWorking: true,\r
95               type: 'warning',\r
96               msg: 'PROCESSING_MODULES',\r
97               rawMsg: e || ''\r
98           };\r
99       };\r
100 \r
101       $scope.processingModulesSuccessCallback = function(e) {\r
102           $scope.status = {\r
103               type: 'success',\r
104               msg: 'PROCESSING_MODULES_SUCCESS',\r
105               rawMsg: e || ''\r
106           };\r
107       };\r
108 \r
109       $scope.processingModulesErrorCallback = function(e) {\r
110           $scope.status = {\r
111               type: 'danger',\r
112               msg: 'PROCESSING_MODULES_ERROR',\r
113               rawMsg: e || ''\r
114           };\r
115       };\r
116 \r
117       var requestWorkingCallback = function() {\r
118           $scope.status = {\r
119               isWorking: true,\r
120               type: 'warning',\r
121               msg: 'SEND_WAIT'\r
122           };\r
123       };\r
124 \r
125       var requestSuccessCallback = function() {\r
126           $scope.status = {\r
127               type: 'success',\r
128               msg: 'SEND_SUCCESS'\r
129           };\r
130       };\r
131 \r
132       $scope.setStatusMessage = function(type, msg, e){\r
133           $scope.status = {\r
134               type: type,\r
135               msg: msg,\r
136               rawMsg: e || ''\r
137           };\r
138       };\r
139 \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
143 \r
144           $scope.status = {\r
145               type: 'danger',\r
146               msg: msg,\r
147               rawMsg: e.toString()\r
148           };\r
149       };\r
150 \r
151       var setCustFunct = function(apis) {\r
152           pluginHandler.plugAll($scope.apis, $scope);\r
153       };\r
154       \r
155       $scope.removeMountPointPath = function(pathArray){\r
156           var mpPathIndex = pathArray.length;\r
157 \r
158           pathArray.some(function(pathElem, index) {\r
159               var isMPElem = pathElem.name === mountPrefix;\r
160               if(isMPElem) {\r
161                   mpPathIndex = index;\r
162               }\r
163 \r
164               return isMPElem;\r
165           });\r
166 \r
167           var pathCopy = pathArray.slice(0, mpPathIndex);\r
168           return pathCopy;\r
169       };\r
170 \r
171       $scope.invalidatePreview = function() {\r
172           $scope.previewValidity = false;\r
173       };\r
174 \r
175       $scope.validatePreview = function() {\r
176           $scope.previewValidity = true;\r
177       };\r
178 \r
179       $scope.isPreviewValid = function() {\r
180           return $scope.previewValidity;\r
181       };\r
182 \r
183       $scope.preview = function() {\r
184           if($scope.isPreviewValid()) {\r
185               $scope.invalidatePreview();\r
186 \r
187               $timeout(function () {\r
188                   $scope.buildPreview();\r
189                   $scope.validatePreview();\r
190               }, $scope.previewDelay);\r
191           }\r
192       };\r
193 \r
194       $scope.buildPreview = function() {\r
195           if($scope.node) {\r
196               var reqString = $scope.selSubApi.buildApiRequestString(),\r
197                   requestData = {};\r
198 \r
199               // create request\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
203 \r
204               var jsonRequestData = requestData ? JSON.stringify(requestData, null, 4) : '';\r
205               // preview data\r
206               $scope.previewValue = $scope.selApi.basePath + reqString;\r
207               $scope.previewValue = $scope.previewValue + '\r\n' + jsonRequestData;\r
208           } else {\r
209               $scope.previewValue = '';\r
210           }\r
211       };\r
212 \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
216       };\r
217 \r
218       $scope.showCustFunctButton = function() {\r
219           return $scope.selCustFunct === null;\r
220       };\r
221 \r
222       $scope.showCustFunctCancelButton = function() {\r
223           return $scope.selCustFunct !== null;\r
224       };\r
225 \r
226       $scope.unsetCustomFunctionality = function() {\r
227           if($scope.selCustFunct) {\r
228               customFunctUnsetter.unset($scope.selCustFunct, $scope);\r
229           }\r
230           $scope.selCustFunct = null;\r
231           $scope.treeName = $scope.defaultTreeName;\r
232           $scope.selCustFunctButts = [];\r
233       };\r
234 \r
235       var loadApis = function loadApis() {\r
236           $scope.apis = [];\r
237           $scope.allNodes = [];\r
238           $scope.treeApis = [];\r
239           $scope.augmentations = {};\r
240 \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
250 \r
251               setCustFunct($scope.apis);\r
252               $scope.$broadcast('LOAD_REQ_DATA');\r
253           }, function(e) {\r
254               $scope.processingModulesErrorCallback(e);\r
255           });\r
256       };\r
257 \r
258       $scope.isMountPointSelected = function() {\r
259           return $scope.selCustFunct.label === 'YANGUI_CUST_MOUNT_POINTS';\r
260       };\r
261 \r
262       $scope.dismissStatus = function() {\r
263           $scope.status = {};\r
264       };\r
265 \r
266       $scope.setNode = function() {\r
267           $scope.node = $scope.selSubApi.node;\r
268       };\r
269 \r
270       $scope.setApiNode = function(indexApi, indexSubApi) {\r
271           $scope.selectedOperation = null;\r
272 \r
273           if(indexApi !== undefined && indexSubApi !== undefined ) {\r
274               $scope.selApi = $scope.apis[indexApi];\r
275               $scope.selSubApi = $scope.selApi.subApis[indexSubApi];\r
276 \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
281 \r
282               if($scope.selSubApi && $scope.selSubApi.operations) {\r
283                   $scope.selectedOperation = $scope.selSubApi.operations[0];\r
284               }\r
285               $scope.$broadcast('EV_REFRESH_LIST_INDEX');\r
286           } else {\r
287               $scope.selApi = null;\r
288               $scope.selSubApi = null;\r
289               $scope.node = null;\r
290           }\r
291       };\r
292 \r
293       $scope.loadController = function() {\r
294           $scope.flows = [];\r
295           $scope.devices = [];\r
296           $scope.apis = [];\r
297           $scope.previewVisible = false;\r
298           $scope.previewValue = '';\r
299           $scope.popupData = { show: false};\r
300           $scope.dataToFill = '';\r
301           $scope.apiToFill = '';\r
302 \r
303           loadApis();\r
304 \r
305           $rootScope.$on('$includeContentLoaded', function() {\r
306               designUtils.setDraggablePopups();\r
307               //designUtils.getHistoryPopUpWidth();\r
308           });\r
309       };\r
310 \r
311       $scope.executeOperation = function(operation, callback, reqPath) {\r
312           var reqString = $scope.selSubApi.buildApiRequestString(),\r
313               requestData = {},\r
314               preparedRequestData = {},\r
315               headers = null;\r
316 \r
317           reqString = reqPath ? reqPath.slice($scope.selApi.basePath.length, reqPath.length) : reqString;\r
318           var requestPath = $scope.selApi.basePath + reqString;\r
319 \r
320           $scope.node.buildRequest(reqBuilder, requestData);\r
321           angular.copy(requestData, preparedRequestData);\r
322 \r
323           preparedRequestData = yangUtils.prepareRequestData(preparedRequestData, operation, reqString, $scope.selSubApi);\r
324           \r
325           operation = yangUtils.prepareOperation(operation);\r
326           headers = yangUtils.prepareHeaders(preparedRequestData);\r
327 \r
328           requestWorkingCallback();\r
329 \r
330           YangUtilsRestangular.one('restconf').customOperation(operation.toLowerCase(), reqString, null, headers, preparedRequestData).then(\r
331               function(data) {\r
332                   if(operation === 'REMOVE'){\r
333                       $scope.node.clear();\r
334                   }\r
335 \r
336                   if(data) {\r
337                       $scope.node.clear();\r
338                       var props = Object.getOwnPropertyNames(data);\r
339 \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
342                       });\r
343                       $scope.node.expanded = true;\r
344                   }\r
345                   \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
349                       requestData = {};\r
350                   }\r
351                   $scope.$broadcast('YUI_ADD_TO_HISTORY', 'success', data, preparedRequestData, operation, requestPath);\r
352 \r
353                   if ( angular.isFunction(callback) ) {\r
354                       callback(data);\r
355                   }\r
356 \r
357                   if($scope.previewVisible === true){\r
358                       $scope.preview();\r
359                   }\r
360 \r
361               }, function(resp) {\r
362                   var errorMsg = '';\r
363 \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
367                       }).join(', ');\r
368                   }\r
369 \r
370                   requestErrorCallback(errorMsg, resp);\r
371                   \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
374                       requestData = {};\r
375                   }\r
376                   $scope.$broadcast('YUI_ADD_TO_HISTORY', 'error', resp.data, preparedRequestData, operation, requestPath);\r
377 \r
378                   console.info('error sending request to',$scope.selSubApi.buildApiRequestString(),'reqString',reqString,'got',resp.status,'data',resp.data);\r
379               }\r
380           );\r
381       };\r
382 \r
383       $scope.executeCustFunctionality = function(custFunct) {\r
384           custFunct.runCallback($scope);\r
385           $scope.selCustFunct = custFunct;\r
386       };\r
387 \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
392           }\r
393       };\r
394 \r
395       $scope.showPreview = function() {\r
396           $scope.previewVisible = true;\r
397           $scope.buildPreview();\r
398       };\r
399 \r
400       $scope.hidePreview = function() {\r
401           $scope.previewVisible = false;\r
402       };\r
403 \r
404       $scope.buildRoot = function() {\r
405           $scope.node.buildRequest(reqBuilder, {});\r
406       };\r
407 \r
408       $scope.changePathInPreview = function() {\r
409           $scope.preview();\r
410       };\r
411 \r
412       $scope.fillApiAndData = function(req) {\r
413         $scope.updateParameterizeData(req);\r
414 \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
418 \r
419         if(path) {\r
420             $scope.fillApi(path);\r
421             \r
422             if($scope.node && (rdata || sdata)) {\r
423               if(rdata) {\r
424                  $scope.fillApiData(rdata);\r
425               }\r
426 \r
427               if(sdata) {\r
428                  $scope.fillApiData(sdata); \r
429               }\r
430             }\r
431         }\r
432 \r
433         $scope.selectedOperation = req.method;\r
434       };\r
435 \r
436       $scope.fillStandardApi = function(searchPath, fillPath) {\r
437           fillPath = fillPath || searchPath;\r
438           var apiIndexes = pathUtils.searchNodeByPath(searchPath, $scope.treeApis, $scope.treeRows);\r
439 \r
440           if(apiIndexes) {\r
441               $scope.setApiNode(apiIndexes.indexApi, apiIndexes.indexSubApi);\r
442               if($scope.selSubApi) {\r
443                   pathUtils.fillPath($scope.selSubApi.pathArray, fillPath);\r
444               }\r
445           }\r
446       };\r
447 \r
448       $scope.fillApi = function(path) {\r
449           var parameterizedPath = $scope.parameterizeData(path);\r
450               fillPath = parameterizedPath;\r
451 \r
452           if(parameterizedPath.indexOf(mountPrefix) !== -1) {\r
453               fillPath = parameterizedPath.replace('restconf/config','restconf/operational');\r
454           }\r
455 \r
456           $scope.fillStandardApi(fillPath);\r
457 \r
458           if(path.indexOf(mountPrefix) !== -1 && $scope.selSubApi) {\r
459               $scope.selSubApi.pathArray = $scope.removeMountPointPath($scope.selSubApi.pathArray);\r
460               $scope.selectMP();\r
461 \r
462               $scope.mpSynchronizer.waitFor(function () {\r
463                   $scope.fillMPApi(parameterizedPath);\r
464               });\r
465           }\r
466       };\r
467 \r
468       $scope.selectMP = function() {\r
469           var mpCF = custFunctFact.getMPCustFunctionality($scope.selSubApi.custFunct);\r
470           if(mpCF) {\r
471               $scope.executeCustFunctionality(mpCF);\r
472           } else {\r
473               console.warn('Mountpoint custom functionality for api', $scope.selSubApi.buildApiRequestString(), ' is not set');\r
474           }\r
475       };\r
476 \r
477       $scope.fillMPApi = function(path) {\r
478           var mpPath = mountPointsConnector.alterMpPath(path),\r
479               apiIndexes = pathUtils.searchNodeByPath(mpPath, $scope.treeApis, $scope.treeRows);\r
480           if(apiIndexes) {\r
481               $scope.setApiNode(apiIndexes.indexApi, apiIndexes.indexSubApi);\r
482               if($scope.selSubApi) {\r
483                   pathUtils.fillPath($scope.selSubApi.pathArray, path);\r
484               }\r
485           }\r
486       };\r
487 \r
488       $scope.fillApiData = function(data){\r
489           var parametrizedData = $scope.parameterizeData(data),\r
490               obj = null;\r
491 \r
492           obj = typeof parametrizedData === "object" ? parametrizedData : JSON.parse(parametrizedData);\r
493 \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
497           }\r
498       };\r
499 \r
500       $scope.show_add_data_popup = function(){\r
501           $scope.popupData.show = true;\r
502       };\r
503 \r
504       $scope.close_popup = function(popObj){\r
505           popObj.show = false;\r
506       };\r
507 \r
508       $scope.tabs = function(event, index){\r
509         var tabDom = $(event.target).closest('.tabs');\r
510 \r
511         tabDom.find(' > .tab-content').children('.tab-pane')\r
512           .removeClass('active')\r
513           .eq(index).addClass('active');\r
514 \r
515         tabDom.find('> .nav-tabs').children('li')\r
516           .removeClass('btn-selected')\r
517           .eq(index).addClass('btn-selected');\r
518       };\r
519 \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
530       };\r
531 \r
532       $scope.showModalRequestWin = function(){\r
533         $scope.$broadcast('LOAD_REQ_DATA');\r
534       };\r
535 \r
536       $scope.$on('SET_SCOPE_TREE_ROWS', function(e, rows){\r
537         $scope.treeRows = rows;\r
538       });\r
539 \r
540       $scope.__test = {\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
548       };\r
549 \r
550       $scope.loadController();\r
551 \r
552     }]);\r
553 \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
556 \r
557     $scope.collectionBoxView = false;\r
558 \r
559     var mountPrefix = constants.MPPREFIX;\r
560 \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
567 \r
568         if (selSubApi) {\r
569             copiedApi = selSubApi.cloneWithoutNode();\r
570                 copiedApi.pathArray.forEach(function(p){\r
571                 p.hover = false;\r
572             });\r
573 \r
574             pathUtils.fillPath(copiedApi.pathArray, normalizedPath);\r
575         }\r
576         return copiedApi;\r
577     };\r
578 \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
583     \r
584     $scope.popupHistory = { show: false};\r
585 \r
586     $scope.$on('REFRESH_HISTORY_REQUEST_APIS', function(event, callback){\r
587         $scope.requestList.refresh();\r
588         $scope.collectionList.refresh();\r
589     });\r
590 \r
591         \r
592     $scope.$on('GET_PARAMETER_LIST', function(event, callback){\r
593         callback($scope.parameterList);\r
594     });\r
595 \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
598     });\r
599 \r
600     $scope.addRequestToList = function(status, receivedData, sentData, operation, path) {\r
601         if(typeof(Storage) !== "undefined") {\r
602 \r
603             var rList = HistoryServices.createEmptyHistoryList(),\r
604                 reqObj = HistoryServices.createHistoryRequest(sentData, receivedData, null, path, null, operation, status, null, null, getApiCallback);\r
605 \r
606             $scope.requestList.addRequestToList(reqObj);\r
607             $scope.requestList.saveToStorage();\r
608 \r
609         }\r
610     };\r
611     \r
612     $scope.reqHistoryFunc = function(){\r
613         $scope.popupHistory.show = !$scope.popupHistory.show;\r
614 \r
615         $scope.requestList.loadListFromStorage();\r
616         $scope.collectionList.loadListFromStorage();\r
617         $scope.requestList.show = false;\r
618     };\r
619 \r
620     $scope.show_history_data = function(req, sent, noData){\r
621         req.sentDataView = sent;\r
622         req.show = true;//!req.show;\r
623         if ( !noData ) {\r
624           req.setDataForView(sent);\r
625         }\r
626     };\r
627 \r
628     $scope.close_history_data = function(req){\r
629         req.show = false;\r
630     };\r
631 \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
635             d = '';\r
636         \r
637         ParsingException = function(msg){\r
638             this.msg = msg;\r
639         };\r
640         \r
641         try{\r
642             try{\r
643                 d = JSON.parse(req.data);\r
644             }catch(e){\r
645                 throw new ParsingException(e.message);\r
646             }\r
647             newReq.sentData = d;\r
648 \r
649             req.clearParametrizedData();\r
650 \r
651             list.addRequestToList(newReq);\r
652             list.saveToStorage();\r
653 \r
654             req.show = false;\r
655             return true;\r
656         }\r
657         catch(e){\r
658             if(e instanceof ParsingException){\r
659                 alert($filter('translate')('YANGUI_ERROR_PARSING_JSON') + ': ' + e.msg);\r
660             }\r
661             return false;\r
662         }\r
663 \r
664     };\r
665 \r
666     $scope.showCollBox = function(req, edit){\r
667       $scope.collectionBoxView = true;\r
668       $scope.$broadcast('COLL_CLEAR_VAL_SET_REQ', req, edit);\r
669     };\r
670     \r
671 \r
672     $scope.hideCollBox = function(){\r
673       $scope.collectionBoxView = false;\r
674     };\r
675 \r
676     $scope.saveElemToList = function(elem) {\r
677         $scope.collectionList.addRequestToList(elem);\r
678         $scope.collectionList.saveToStorage();\r
679     };\r
680 \r
681     $scope.saveParamToList = function(elem, oldElem) {\r
682         $scope.parameterList.saveRequestToList(elem, oldElem);\r
683     };\r
684 \r
685     $scope.deleteRequestItem = function(elem, list){\r
686         $scope[list].deleteRequestItem(elem);\r
687         $scope[list].saveToStorage();\r
688     };\r
689 \r
690     $scope.clearHistoryData = function(list){\r
691         $scope[list].clear();\r
692         $scope[list].saveToStorage();\r
693     };\r
694 \r
695     var clearFileInputValue = function() {\r
696         var el = document.getElementById("upload-collection");\r
697         el.value = '';\r
698     };\r
699 \r
700     $scope.exportHistoryData = function() {\r
701         var cListJSON = localStorage.getItem("collectionList");\r
702 \r
703         handleFile.downloadFile('requestCollection.json', cListJSON, 'json', 'charset=utf-8', function(){\r
704             $scope.setStatusMessage('success', 'EXPORT_COLLECTIONS_SUCCESS');\r
705         },function(e){\r
706             $scope.setStatusMessage('danger', 'EXPORT_COLLECTIONS_ERROR', e);\r
707             console.error('ExportCollection error:', e);\r
708         });\r
709     };\r
710 \r
711     $scope.readCollectionFromFile = function($fileContent) {\r
712         var data = $fileContent;\r
713 \r
714         if(data && HistoryServices.validateCollectionFile(data)){\r
715             try {\r
716               $scope.collectionList.loadListFromFile(data);\r
717               $scope.collectionList.saveToStorage();\r
718               $scope.setStatusMessage('success', 'LOAD_COLLECTIONS_SUCCESS');\r
719               clearFileInputValue();\r
720             }catch(e) {\r
721                 clearFileInputValue();\r
722                 $scope.setStatusMessage('danger', 'PARSE_JSON_FILE_ERROR', e);\r
723                 console.error('DataStorage error:', e);\r
724             }\r
725         }else{\r
726             $scope.setStatusMessage('danger', 'PARSE_JSON_FILE_ERROR');\r
727             clearFileInputValue();\r
728         }\r
729     };\r
730 \r
731     $scope.executeCollectionRequest = function(req) {\r
732         $scope.updateParameterizeData(req);\r
733 \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
737 \r
738         path = $scope.parameterizeData(path);\r
739         $scope.fillStandardApi(path, req.path);\r
740 \r
741         if(sdata) {\r
742             $scope.fillApiData(sdata);\r
743         }\r
744 \r
745         if($scope.baseMpApi) {\r
746             pathStrParts.splice(1, 0, $scope.baseMpApi);\r
747             path = pathStrParts.join('/');\r
748         }\r
749 \r
750         var requestPath = req.api.parent.basePath + path;\r
751 \r
752         $scope.executeOperation(req.method, function(data){\r
753 \r
754             if ( !data &&  req.receivedData ){\r
755               $scope.node.fill($scope.node.label,req.receivedData[$scope.node.label]);\r
756             }\r
757         }, requestPath);\r
758     };\r
759 \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
765 \r
766           angular.copy(strippedData, req.parametrizedData);\r
767           req.data = JSON.stringify(strippedData, null, 4);\r
768         }\r
769 \r
770         req.parametrizedPath = pathUtils.translatePathArray(req.api.clonedPathArray).join('/');\r
771     };\r
772 \r
773     $scope.groupView = {};\r
774 \r
775     $scope.setGroupView = function(key) {\r
776       $scope.groupView[key] = false;\r
777     };\r
778 \r
779     $scope.toggleExpanded = function(key) {\r
780         $scope.groupView[key] = !$scope.groupView[key];\r
781     };\r
782 \r
783     $scope.$on('LOAD_REQ_DATA', function(){\r
784       $scope.reqHistoryFunc();\r
785     });\r
786 \r
787   }]);\r
788 \r
789   yangui.register.controller('collBoxCtrl', ['$scope','HistoryServices',function ($scope, HistoryServices) {\r
790     \r
791     $scope.collection = {\r
792       name: '',\r
793       group: ''\r
794     };\r
795 \r
796     $scope.selectedRequest = null;\r
797     $scope.editBox = false;\r
798 \r
799     $scope.addHistoryItemToColl = function(){\r
800         var elemToAdd = $scope.selectedRequest.clone();\r
801 \r
802         HistoryServices.setNameAndGroup($scope.collection.name, $scope.collection.group, elemToAdd);\r
803         $scope.saveElemToList(elemToAdd);\r
804 \r
805         if ( $scope.editBox ) {\r
806           $scope.deleteRequestItem($scope.selectedRequest, 'collectionList');\r
807         }\r
808 \r
809         $scope.hideCollBox();\r
810     };\r
811 \r
812     $scope.moveHistoryItemToGroup = function(elem, event){\r
813         var elemToMove = elem.clone();\r
814 \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
819     };\r
820 \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
826     });\r
827 \r
828   }]);\r
829   \r
830   yangui.register.controller('historyParamCtrl',['$scope','HistoryServices', function($scope, HistoryServices){\r
831           \r
832     $scope.showParamBox = function(param){\r
833         $scope.$broadcast('HISTORY_INIT_PARAM', param);\r
834     };\r
835     \r
836     $scope.createNewParam = function(){\r
837         return HistoryServices.createParameter('','');\r
838     };\r
839     \r
840     \r
841   }]);\r
842 \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
847 \r
848     $scope.hideParamBox = function(){\r
849         $scope.boxView = false;\r
850         $scope.paramObj = $scope.createNewParam();\r
851     };\r
852 \r
853     var addEditSuccessfull = function() {\r
854         $scope.hideParamBox();\r
855         $scope.parameterList.saveToStorage();\r
856     };\r
857 \r
858     eventDispatcher.registerHandler(constants.EV_PARAM_EDIT_SUCC, addEditSuccessfull);\r
859 \r
860     $scope.saveParam = function(){\r
861         $scope.saveParamToList($scope.paramObj, $scope.oldParam);\r
862     };\r
863 \r
864     $scope.$on('HISTORY_INIT_PARAM', function(e, obj){\r
865         if ( obj ){\r
866             $scope.paramObj = obj.clone();\r
867             $scope.oldParam = obj;\r
868             $scope.boxView = true;\r
869         }\r
870     });\r
871   }]);\r
872 \r
873   yangui.register.controller('leafCtrl', function ($scope) {\r
874     var types = [\r
875                   'binary', \r
876                   'bits', \r
877                   'boolean', \r
878                   'decimal64', \r
879                   'enumeration', \r
880                   'empty', \r
881                   'identityref', \r
882                   'instance-identifier', \r
883                   'int16', \r
884                   'int32', \r
885                   'int64', \r
886                   'int8', \r
887                   'leafref', \r
888                   'string', \r
889                   'uint16', \r
890                   'uint32', \r
891                   'uint64', \r
892                   'uint8', \r
893                   'union'\r
894                 ];\r
895 \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
899       };\r
900 \r
901       $scope.displayValue = function() {\r
902           return $scope.node.typeChild.label !== 'empty';\r
903       };\r
904   });\r
905 \r
906   yangui.register.controller('containerCtrl', function ($scope) {\r
907       $scope.augModalView = false;\r
908 \r
909       $scope.toggleExpandedAugModal = function(){\r
910         $scope.augModalView = !$scope.augModalView;\r
911       };\r
912 \r
913       $scope.toggleExpanded = function() {\r
914           $scope.node.expanded = !$scope.node.expanded;\r
915       };\r
916   });\r
917 \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
920 \r
921       $scope.augModalView = false;\r
922 \r
923       $scope.toggleExpandedAugModal = function(){\r
924         $scope.augModalView = !$scope.augModalView;\r
925       };\r
926   });\r
927 \r
928   yangui.register.controller('augmentationModalCtrl', ['$scope', function($scope){\r
929     $scope.init = function(node){\r
930       $scope.node = node;\r
931     };\r
932   }]);\r
933 \r
934   yangui.register.controller('choiceCtrl', function ($scope, constants) {\r
935     $scope.constants = constants;\r
936     $scope.augModalView = false;\r
937 \r
938     $scope.toggleExpandedAugModal = function(){\r
939       $scope.augModalView = !$scope.augModalView;\r
940     };\r
941 \r
942     $scope.toggleExpanded = function() {\r
943         $scope.node.expanded = !$scope.node.expanded;\r
944     };\r
945 \r
946     $scope.caseShowing = function (node) {\r
947       return !node.augmentationId ? true : $scope.augmentations.getAugmentation(node.parent, node.augmentationId).expanded;\r
948     };\r
949   });\r
950 \r
951   yangui.register.controller('rpcCtrl', function ($scope) {\r
952     $scope.toggleExpanded = function() {\r
953         $scope.node.expanded = !$scope.node.expanded;\r
954     };\r
955   });\r
956 \r
957   yangui.register.controller('inputCtrl', function ($scope) {\r
958     $scope.augModalView = false;\r
959 \r
960     $scope.toggleExpandedAugModal = function(){\r
961       $scope.augModalView = !$scope.augModalView;\r
962     };\r
963 \r
964     $scope.toggleExpanded = function() {\r
965         $scope.node.expanded = !$scope.node.expanded;\r
966     };\r
967   });\r
968 \r
969   yangui.register.controller('outputCtrl', function ($scope) {\r
970     $scope.augModalView = false;\r
971 \r
972     $scope.toggleExpandedAugModal = function(){\r
973       $scope.augModalView = !$scope.augModalView;\r
974     };\r
975 \r
976     $scope.toggleExpanded = function() {\r
977         $scope.node.expanded = !$scope.node.expanded;\r
978     };\r
979   });\r
980 \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
989 \r
990       $scope.toggleExpandedAugModal = function(){\r
991         $scope.augModalView = !$scope.augModalView;\r
992       };\r
993 \r
994       $scope.$on('EV_REFRESH_LIST_INDEX', function(event) {\r
995           $scope.currentDisplayIndex = 1;\r
996       });\r
997 \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
1003       };\r
1004 \r
1005       $scope.removeListElem = function(elemIndex,fromFilter) {\r
1006           $scope.node.removeListElem(elemIndex,fromFilter);\r
1007           $scope.preview();\r
1008           $scope.currentDisplayIndex = Math.max(Math.min($scope.currentDisplayIndex, $scope.node.listData.length - 2), 1);\r
1009       };\r
1010 \r
1011       $scope.toggleExpanded = function() {\r
1012           $scope.node.expanded = !$scope.node.expanded;\r
1013       };\r
1014 \r
1015       $scope.shiftDisplayNext = function(typeListData) {\r
1016           $scope.currentDisplayIndex = Math.min($scope.currentDisplayIndex + 3, $scope.node[typeListData].length - 2);\r
1017       };\r
1018 \r
1019       $scope.shiftDisplayPrev = function() {\r
1020           $scope.currentDisplayIndex = Math.max($scope.currentDisplayIndex - 3, 1);\r
1021       };\r
1022 \r
1023       $scope.showPrevButton = function() {\r
1024          return $scope.currentDisplayIndex > 1;\r
1025       };\r
1026 \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
1029       };\r
1030 \r
1031       $scope.showModalWin = function() {\r
1032         $scope.showModal = !$scope.showModal;\r
1033         if($scope.showListFilter){\r
1034             $scope.showListFilter = !$scope.showListFilter;\r
1035         }\r
1036       };\r
1037 \r
1038       $scope.showListFilterWin = function() {\r
1039           $scope.showListFilter = !$scope.showListFilter;\r
1040           if($scope.showModal){\r
1041               $scope.showModal = !$scope.showModal;\r
1042           }\r
1043           listFiltering.showListFilterWin($scope.filterRootNode,$scope.node);\r
1044       };\r
1045 \r
1046       $scope.getFilterData = function() {\r
1047           listFiltering.getFilterData($scope.node);\r
1048       };\r
1049 \r
1050       $scope.switchFilter = function(showedFilter) {\r
1051          listFiltering.switchFilter($scope.node,showedFilter);\r
1052       };\r
1053 \r
1054       $scope.createNewFilter = function() {\r
1055          listFiltering.createNewFilter($scope.node);\r
1056       };\r
1057 \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
1064           }else{\r
1065             $scope.node.doubleKeyIndexes = nodeWrapper.checkKeyDuplicity($scope.node.listData,$scope.node.refKey);\r
1066           }\r
1067       };\r
1068 \r
1069       $scope.clearFilterData = function(changeAct, filterForClear, removeFilters) {\r
1070         listFiltering.clearFilterData($scope.node,changeAct,filterForClear,removeFilters);\r
1071         if(changeAct){\r
1072             $scope.showListFilter = !$scope.showListFilter;\r
1073         }\r
1074         $scope.node.doubleKeyIndexes = nodeWrapper.checkKeyDuplicity($scope.node.listData,$scope.node.refKey);\r
1075       };\r
1076 \r
1077       $scope.activeFilter = function(filter) {\r
1078         if(filter.active == 1){\r
1079             filter.active = 2;\r
1080         }else{\r
1081             filter.active = 1;\r
1082         }\r
1083       };\r
1084 \r
1085       $scope.getListName = function(offset, config) {\r
1086         var createdListItemName = $scope.node.createListName($scope.currentDisplayIndex + offset);\r
1087 \r
1088         if ( createdListItemName.length > 33 ) {\r
1089           return {\r
1090             name: createdListItemName.substring(0,30) + '...',\r
1091             tooltip: createdListItemName\r
1092           };\r
1093         } else {\r
1094           return {\r
1095             name: config ? createdListItemName || '[' + ($scope.currentDisplayIndex + offset) + ']' : createdListItemName,\r
1096             tooltip: ''\r
1097           };\r
1098         }\r
1099       };\r
1100 \r
1101   });\r
1102 \r
1103   yangui.register.controller('leafListCtrl', function ($scope) {\r
1104 \r
1105       $scope.addListElem = function() {\r
1106           $scope.node.addListElem();\r
1107       };\r
1108 \r
1109       $scope.removeListElem = function(elem){\r
1110           $scope.node.removeListElem(elem);\r
1111       };\r
1112 \r
1113       $scope.changed = function() {\r
1114           $scope.preview();\r
1115       };\r
1116 \r
1117       $scope.toggleExpanded = function() {\r
1118           $scope.node.expanded = !$scope.node.expanded;\r
1119       };\r
1120 \r
1121   });\r
1122 \r
1123   yangui.register.controller('typeCtrl', function($scope){\r
1124 \r
1125     $scope.valueChanged = function(){\r
1126       if($scope.previewVisible) {\r
1127         $scope.preview();\r
1128       } else {\r
1129         $scope.buildRoot();\r
1130       }\r
1131 \r
1132       $scope.node.checkValueType();\r
1133       $scope.node.fill($scope.node.label, $scope.node.value);\r
1134     };\r
1135 \r
1136   });\r
1137 \r
1138   yangui.register.controller('filterTypeCtrl', function($scope){\r
1139 \r
1140     $scope.valueChanged = function(){\r
1141       $scope.node.checkValueType();\r
1142       $scope.node.fill($scope.node.label, $scope.node.value);\r
1143     };\r
1144 \r
1145   });\r
1146 \r
1147   yangui.register.controller('typeEmptyCtrl', function($scope){\r
1148     $scope.valueChanged = function(){\r
1149       $scope.type.setLeafValue($scope.type.emptyValue);\r
1150 \r
1151       if($scope.previewVisible) {\r
1152           $scope.preview();\r
1153       } else {\r
1154           $scope.buildRoot();\r
1155       }\r
1156     };\r
1157     \r
1158   });\r
1159 \r
1160   yangui.register.controller('typeEnumCtrl', function($scope){\r
1161 \r
1162     $scope.valueChanged = function(){\r
1163       var value = $scope.type.selEnum && $scope.type.selEnum.label ? $scope.type.selEnum.label : '';\r
1164 \r
1165       $scope.type.setLeafValue(value);\r
1166 \r
1167       if($scope.previewVisible) {\r
1168         $scope.preview();\r
1169       } else {\r
1170         $scope.buildRoot();\r
1171       }\r
1172 \r
1173       $scope.node.checkValueType();\r
1174       $scope.node.fill($scope.node.label, $scope.node.value);\r
1175     };\r
1176     \r
1177   });\r
1178 \r
1179 yangui.register.controller('typeBitCtrl', function($scope){\r
1180 \r
1181     $scope.valueChanged = function(){\r
1182       $scope.type.setLeafValue($scope.type.bitsValues);\r
1183 \r
1184       if($scope.previewVisible) {\r
1185         $scope.preview();\r
1186       } else {\r
1187         $scope.buildRoot();\r
1188       }\r
1189 \r
1190       $scope.node.checkValueType();\r
1191       $scope.node.fill($scope.node.label, $scope.node.value);\r
1192     };\r
1193     \r
1194   });\r
1195 \r
1196   yangui.register.controller('filter', function($scope, listFiltering){\r
1197     $scope.isFilter = true;\r
1198 \r
1199     $scope.getFilterTypeArray = function(type){\r
1200       return listFiltering.getFilterTypeArray(type);\r
1201     };\r
1202   });\r
1203 \r
1204   yangui.register.controller('filterTypeEnumCtrl', function($scope){\r
1205 \r
1206     $scope.valueChanged = function(){\r
1207       var value = $scope.type.selEnum && $scope.type.selEnum.label ? $scope.type.selEnum.label : '';\r
1208 \r
1209       $scope.type.setLeafValue(value);\r
1210 \r
1211       $scope.node.checkValueType();\r
1212       $scope.node.fill($scope.node.label, $scope.node.value);\r
1213     };\r
1214     \r
1215   });\r
1216 \r
1217   yangui.register.controller('filterTypeBitCtrl', function($scope){\r
1218 \r
1219     $scope.valueChanged = function(){\r
1220       $scope.type.setLeafValue($scope.type.bitsValues,true);\r
1221 \r
1222       $scope.node.checkValueType();\r
1223       $scope.node.fill($scope.node.label, $scope.node.value);\r
1224     };\r
1225     \r
1226   });\r
1227 \r
1228   yangui.register.filter('onlyConfigStmts', function(nodeUtils){\r
1229         return function(nodes){\r
1230             \r
1231             if(nodes.length) {\r
1232                 nodes = nodes.filter(function(n){\r
1233                     return nodeUtils.isOnlyOperationalNode(n);\r
1234                 });\r
1235             }\r
1236 \r
1237             return nodes;\r
1238         };\r
1239     });\r
1240 \r
1241 });\r