fdf08ab0be92642f67589b099515c2a90090d694
[dlux.git] / modules / yangman-resources / src / main / resources / yangman / controllers / requests-list.controller.js
1 define([
2     'app/yangman/controllers/save-req-dialog.controller',
3     'app/yangman/controllers/edit-collection-dialog.controller',
4     'app/yangman/services/handle-file.services',
5 ], function (SaveReqDialogCtrl, EditCollectionDialogCtrl) {
6     'use strict';
7
8     angular.module('app.yangman').controller('RequestsListCtrl', RequestsListCtrl);
9
10     RequestsListCtrl.$inject = [
11         '$filter', '$mdDialog', '$scope', 'YMHandleFileService', 'PathUtilsService', 'RequestsService', 'YangmanService',
12         'YangmanDesignService', 'constants',
13     ];
14
15     /**
16      * Controller for requests lists, means History requests and Collections requests
17      * @param $filter
18      * @param $mdDialog
19      * @param $scope
20      * @param YMHandleFileService
21      * @param PathUtilsService
22      * @param RequestsService
23      * @param YangmanService
24      * @param YangmanDesignService
25      * @constructor
26      */
27     function RequestsListCtrl($filter, $mdDialog, $scope, YMHandleFileService, PathUtilsService, RequestsService,
28                               YangmanService, YangmanDesignService, constants) {
29         var vm = this;
30
31         /**
32          * List of all collections containing requests, loads even for history controller to use collection names
33          * in saving requests dialog
34          * @type {*|CollectionList}
35          */
36         vm.collectionList = null;
37         vm.constants = constants;
38
39         /**
40          *
41          * @type {*|HistoryList}
42          */
43         vm.requestList = null;
44         vm.mainList = null;
45         vm.collectionsSortAsc = true;
46         vm.search = '';
47
48         // methods
49         vm.clearCollectionList = clearCollectionList;
50         vm.clearFilter = clearFilter;
51         vm.clearHistoryList = clearHistoryList;
52         vm.colMatchingReqsCount = colMatchingReqsCount;
53         vm.deselectAllFilteredRequests = deselectAllFilteredReqs;
54         vm.downloadCollection = downloadCollection;
55         vm.executeRequest = executeRequest;
56         vm.fakeFilter = fakeFilter;
57         vm.filterCol = filterCol;
58         vm.filterColName = filterColName;
59         vm.filterReq = filterReq;
60         vm.init = init;
61         vm.readCollectionFromFile = readCollectionFromFile;
62         vm.selectAllFilteredRequests = selectAllFilteredReqs;
63         vm.selectRequest = selectRequest;
64         vm.showData = showData;
65         vm.showDgDeleteCollection = showDgDeleteCollection;
66         vm.showDgDeleteRequests = showDgDeleteRequests;
67         vm.showDgEditCollection = showDgEditCollection;
68         vm.showDgSaveReq = showDgSaveReq;
69         vm.showForm = showForm;
70         vm.toggleCollectionsSort = toggleCollectionsSort;
71         vm.selectOnlyThisRequest = selectOnlyThisRequest;
72         vm.deselectAllRequests = deselectAllRequests;
73         vm.filterCollReq = filterCollReq;
74
75         /**
76          * Save request obje to collection from other controller
77          * @param reqObj
78          */
79         function saveRequestFromExt(event, args) {
80             vm.showDgSaveReq(args.params.event, args.params.reqObj, false);
81         }
82
83
84         /**
85          * Clear history requests list and save to storage
86          */
87         function clearHistoryList(event) {
88
89             YangmanDesignService.disableMdMenuItem(event);
90
91             var confirm = $mdDialog.confirm()
92                 .title($filter('translate')('YANGMAN_DELETE_HISTORY_CONFIRM_TITLE'))
93                 .textContent($filter('translate')('YANGMAN_DELETE_HISTORY_CONFIRM_TEXT'))
94                 .ariaLabel($filter('translate')('YANGMAN_DELETE_HISTORY_CONFIRM_TITLE'))
95                 .targetEvent(event)
96                 .ok($filter('translate')('YANGMAN_OK'))
97                 .cancel($filter('translate')('YANGMAN_CANCEL'));
98
99             $mdDialog.show(confirm).then(function (){
100                 vm.requestList.clear();
101                 vm.requestList.saveToStorage();
102                 loadHistoryList();
103                 YangmanDesignService.enableMdMenuItem(event);
104             }, function (){
105                 YangmanDesignService.enableMdMenuItem(event);
106             });
107         }
108
109         /**
110          * Clear collections requests list and save to storage
111          */
112         function clearCollectionList(event) {
113             var confirm = $mdDialog.confirm()
114                 .title($filter('translate')('YANGMAN_DELETE_COLLECTION_CONFIRM_TITLE'))
115                 .textContent($filter('translate')('YANGMAN_DELETE_COLLECTION_CONFIRM_TEXT'))
116                 .ariaLabel($filter('translate')('YANGMAN_DELETE_COLLECTION_CONFIRM_TITLE'))
117                 .targetEvent(event)
118                 .ok($filter('translate')('YANGMAN_OK'))
119                 .cancel($filter('translate')('YANGMAN_CANCEL'));
120
121             YangmanDesignService.disableMdMenuItem(event);
122
123             $mdDialog.show(confirm).then(function (){
124                 vm.collectionList.clear();
125                 vm.collectionList.saveToStorage();
126                 $scope.rootBroadcast(constants.YANGMAN_REFRESH_COLLECTIONS);
127                 YangmanDesignService.enableMdMenuItem(event);
128             }, function () {
129                 YangmanDesignService.enableMdMenuItem(event);
130             });
131         }
132
133         /**
134          * Create history request from other ctrl
135          * @param broadcastEvent
136          * @param params
137          */
138         function saveBcstedHistoryRequest(broadcastEvent, params) {
139             vm.requestList.addItemToList(params.params);
140             vm.requestList.saveToStorage();
141             (params.cbk || angular.noop)();
142         }
143
144         /**
145          * Clear value of input file used to import collection
146          * todo: move to design utils
147          */
148         function clearFileInputValue(){
149             angular.element(document).find('#importCollection').val('');
150         }
151
152         /**
153          * Importing collection from a file
154          * todo: error handling - msgs for user
155          * @param $fileContent
156          */
157         function readCollectionFromFile($fileContent) {
158             var data = $fileContent;
159
160             if (data && YangmanService.validateFile(data, constants.COLLECTION_CHECK_ARRAY)){
161                 try {
162                     vm.collectionList.loadListFromFile(data);
163                     vm.collectionList.saveToStorage();
164                     $scope.rootBroadcast(constants.YANGMAN_REFRESH_COLLECTIONS);
165                     clearFileInputValue();
166                 }
167                 catch (e) {
168                     clearFileInputValue();
169                     console.error('DataStorage error:', e);
170                 }
171             }
172             else {
173                 clearFileInputValue();
174             }
175             removeButtonBackground();
176
177             function removeButtonBackground() {
178                 $('#importCollection').next().css({ 'background': 'transparent' });
179             }
180         }
181
182         function toggleCollectionsSort() {
183             vm.collectionsSortAsc = !vm.collectionsSortAsc;
184         }
185
186         /**
187          * Export collection to json file
188          * @param {Collection} collection
189          */
190         function downloadCollection(collection) {
191
192             var cListJSON = vm.collectionList.getCollectionInRawJSON(collection.name);
193
194             YMHandleFileService.downloadFile(collection.name + '.json', cListJSON, 'json', 'charset=utf-8',
195                 function (){},
196                 function (e){
197                     console.error('ExportCollection error:', e);
198                 }
199             );
200         }
201
202         /**
203          * Fill request form in right panel with request data
204          * @param reqObj
205          */
206         function showForm(reqObj) {
207             var data = reqObj.sentData;
208
209             // exception for get meth
210             if ( reqObj.method === constants.OPERATION_GET ) {
211                 data = reqObj.receivedData;
212             }
213
214             $scope.rootBroadcast(
215                 constants.YANGMAN_SET_CODEMIRROR_DATA_RECEIVED, { data: reqObj.setDataForView(reqObj.receivedData) }
216             );
217             $scope.rootBroadcast(
218                 constants.YANGMAN_SET_CODEMIRROR_DATA_SENT, { data: reqObj.setDataForView(reqObj.sentData) }
219             );
220
221             $scope.rootBroadcast(constants.YANGMAN_SET_ERROR_DATA,
222                 reqObj.receivedData && reqObj.receivedData.hasOwnProperty('errors') ? reqObj.receivedData : {});
223
224             $scope.rootBroadcast(constants.YANGMAN_FILL_NODE_FROM_REQ, { requestUrl: reqObj.path, requestData: data },
225                 function (){
226                     $scope.setRightPanelSection(constants.DISPLAY_TYPE_FORM);
227                     $scope.rootBroadcast(constants.YANGMAN_HEADER_INIT, {
228                         path: reqObj.path,
229                         method: reqObj.method,
230                         statusObj: {
231                             status: reqObj.responseStatus,
232                             statusText: reqObj.responseStatusText,
233                             time: reqObj.responseTime,
234                         },
235                     });
236
237                     if ( $scope.node ) {
238                         // prepare data for filling form
239                         data = $scope.node.type === constants.NODE_RPC ?
240                                 YangmanService.prepareReceivedData(
241                                     $scope.node,
242                                     reqObj.method,
243                                     reqObj.receivedData,
244                                     reqObj.sentData,
245                                     constants.DISPLAY_TYPE_FORM
246                                 ) : data;
247
248                         // try to fill node
249                         YangmanService.fillNodeFromResponse($scope.node, data);
250                         $scope.node.expanded = true;
251                     }
252
253                 }
254             );
255
256         }
257
258         /**
259          * Force request header to execute request with data from reqObj
260          * @param reqObj
261          */
262         function executeRequest(reqObj) {
263             showData(reqObj);
264             $scope.rootBroadcast(constants.YANGMAN_EXECUTE_WITH_DATA,{ data: reqObj.sentData });
265         }
266
267         /**
268          * Method for setup data into CM, Header, find api, subapi, node
269          * @param reqObj
270          * @param status
271          */
272         function showData(reqObj, select){
273             var headerObj = {
274                 path: reqObj.path,
275                 method: reqObj.method,
276             };
277
278             // action select request
279             if ( select ) {
280                 headerObj.statusObj = {
281                     status: reqObj.responseStatus,
282                     statusText: reqObj.responseStatusText,
283                     time: reqObj.responseTime,
284                 };
285
286                 $scope.rootBroadcast(
287                     constants.YANGMAN_SET_ERROR_DATA,
288                     reqObj.receivedData && reqObj.receivedData.hasOwnProperty('errors') ? reqObj.receivedData : {}
289                 );
290             }
291
292             $scope.setRightPanelSection(constants.DISPLAY_TYPE_REQ_DATA);
293             $scope.setJsonView(true, reqObj.method !== constants.OPERATION_GET);
294
295             $scope.rootBroadcast(constants.YANGMAN_HEADER_INIT, headerObj);
296             $scope.rootBroadcast(constants.YANGMAN_FILL_NODE_FROM_REQ, { requestUrl: reqObj.path });
297
298             $scope.rootBroadcast(
299                 constants.YANGMAN_SET_CODEMIRROR_DATA_RECEIVED,
300                 { data: reqObj.setDataForView(reqObj.receivedData) }
301             );
302
303             $scope.rootBroadcast(
304                 constants.YANGMAN_SET_CODEMIRROR_DATA_SENT,
305                 { data: reqObj.setDataForView(reqObj.sentData) }
306             );
307         }
308
309         /**
310          * Clear current ctrl search value
311          */
312         function clearFilter(){
313             vm.search = '';
314         }
315
316         /**
317          * Dialog for deleting either selected requests or reqObj
318          *
319          * @param event
320          * @param reqObj
321          */
322         function showDgDeleteRequests(event, reqObj){
323
324             var confirm = $mdDialog.confirm()
325                 .title($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TITLE'))
326                 .textContent($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TEXT'))
327                 .ariaLabel($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TITLE'))
328                 .targetEvent(event)
329                 .ok($filter('translate')('YANGMAN_OK'))
330                 .cancel($filter('translate')('YANGMAN_CANCEL'));
331
332             YangmanDesignService.disableMdMenuItem(event);
333
334             $mdDialog.show(confirm).then(function (){
335                 if (reqObj){
336                     vm.mainList.deleteRequestItem(reqObj);
337                 }
338                 else {
339                     vm.mainList.getSelectedItems(
340                         vm.mainList === vm.collectionList ? filterCollReq : filterReq
341                     ).forEach(function (elem){
342                         vm.mainList.deleteRequestItem(elem);
343                     });
344                 }
345                 vm.mainList.saveToStorage();
346
347                 if (vm.mainList === vm.requestList) {
348                     loadHistoryList();
349                 }
350                 else {
351                     refreshCollectionsWithExpansion();
352                 }
353             }, function (){
354                 YangmanDesignService.enableMdMenuItem(event);
355             });
356         }
357
358
359         /**
360          * Dialog for deleting collection and refreshing collections
361          * @param ev
362          * @param collObj
363          */
364         function showDgDeleteCollection(ev, collObj){
365             var confirm = $mdDialog.confirm()
366                 .title($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TITLE') + ' ' + collObj.name + '?')
367                 .textContent($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TEXT'))
368                 .ariaLabel($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TITLE'))
369                 .targetEvent(ev)
370                 .ok($filter('translate')('YANGMAN_OK'))
371                 .cancel($filter('translate')('YANGMAN_CANCEL'));
372
373             YangmanDesignService.disableMdMenuItem(ev);
374
375             $mdDialog.show(confirm).then(function (){
376                 vm.collectionList.deleteCollection(collObj);
377                 vm.collectionList.saveToStorage();
378                 refreshCollectionsWithExpansion();
379             }, function (){
380                 YangmanDesignService.enableMdMenuItem(ev);
381             });
382         }
383
384         /**
385          * Check if reqObj matches current search value
386          * @param reqObj
387          * @returns {boolean}
388          */
389         function filterReq(reqObj){
390             var searchPhrase = vm.search.toLocaleLowerCase();
391             return reqObj.path.toLowerCase().indexOf(searchPhrase) > -1 ||
392                 reqObj.collection.toLowerCase().indexOf(searchPhrase) > -1 ||
393                 reqObj.method.toLowerCase() === searchPhrase;
394         }
395
396         /**
397          * Check if collection name matches current search value or any collection req matches
398          * @param colObj
399          */
400         function filterCol(colObj){
401             return filterColName(colObj) || colObj.data.some(filterReq);
402         }
403
404         /**
405          * Get count of requests matching filter in collection colObj
406          * @param colObj
407          * @returns {*}
408          */
409         function colMatchingReqsCount(colObj){
410             return colObj.data.filter(vm.filterReq).length;
411         }
412
413         /**
414          * Check if collection name matches current filter
415          * @param colObj
416          * @returns {boolean}
417          */
418         function filterColName(colObj){
419             return colObj.name.toLowerCase().indexOf(vm.search.toLowerCase()) > -1;
420         }
421
422         /**
423          * Returns true
424          * @returns {boolean}
425          */
426         function fakeFilter(){
427             return true;
428         }
429
430
431         /**
432          * Show dialog for saving reqObj to collection (used for duplicate req too)
433          * @param ev
434          * @param reqObj
435          * @param duplicate
436          */
437         function showDgSaveReq(ev, reqObj, duplicate){
438
439             $mdDialog.show({
440                 controller: SaveReqDialogCtrl,
441                 controllerAs: 'dialog',
442                 templateUrl: $scope.globalViewPath + 'leftpanel/save-req-dialog.tpl.html',
443                 parent: angular.element('#yangmanModule'),
444                 targetEvent: ev,
445                 clickOutsideToClose: true,
446                 locals: {
447                     requests: reqObj ? [reqObj] : vm.mainList.getSelectedItems(
448                         vm.mainList === vm.collectionList ? filterCollReq : filterReq
449                     ),
450                     collectionNames: vm.collectionList.getCollectionNames(),
451                     duplicate: duplicate || false,
452                 },
453             }).then(saveRequests);
454         }
455
456         /**
457          * Add each request from requests array to collectionList and save
458          * @param requests
459          */
460         function saveRequests(requests){
461             requests.forEach(function (reqObj){
462                 vm.collectionList.addItemToList(RequestsService.clearUnnecessaryProperties(reqObj.clone()));
463                 vm.collectionList.saveToStorage();
464                 refreshCollectionsWithExpansion();
465             });
466         }
467
468
469         /**
470          * Dialog for editing collection name (used for duplicating collection too)
471          * @param ev
472          * @param collection
473          * @param {boolean} duplicate
474          */
475         function showDgEditCollection(ev, collection, duplicate){
476             $mdDialog.show({
477                 controller: EditCollectionDialogCtrl,
478                 controllerAs: 'dialog',
479                 templateUrl: $scope.globalViewPath + 'leftpanel/edit-collection-dialog.tpl.html',
480                 parent: angular.element('#yangmanModule'),
481                 targetEvent: ev,
482                 clickOutsideToClose: true,
483                 locals: {
484                     collection: collection,
485                     allCollections: vm.collectionList.collections,
486                     duplicate: duplicate,
487                 },
488             }).then(duplicate ? duplicateCollection : changeCollectionName);
489         }
490
491         /**
492          * Rename collection
493          * @param {array} names 0. element is old name, 1. element is new name
494          */
495         function changeCollectionName(names){
496             vm.collectionList.renameCollection(names[0], names[1]);
497             vm.collectionList.saveToStorage();
498             refreshCollectionsWithExpansion();
499         }
500
501         /**
502          * Create collection duplicate, save and refresh collections
503          * @param {array} names 0. element is old name, 1. element is new name
504          */
505         function duplicateCollection(names){
506             vm.collectionList.duplicateCollection(names[0], names[1]);
507             vm.collectionList.saveToStorage();
508             refreshCollectionsWithExpansion();
509         }
510
511
512         function selectNewestRequest() {
513             vm.mainList.toggleReqSelection(true, vm.mainList.getNewestRequest());
514         }
515
516         function loadCollectionsList() {
517             vm.collectionList.loadListFromStorage();
518         }
519
520         function loadHistoryList() {
521             vm.requestList.loadListFromStorage();
522         }
523
524         /**
525          *
526          * @param mainList collectionList or requestList object
527          */
528         function init(mainList){
529
530             vm.collectionList = RequestsService.createEmptyCollectionList('yangman_collectionsList');
531             // collections are loaded for both history and collections tab
532             loadCollectionsList();
533
534             vm.requestList = RequestsService.createEmptyHistoryList('yangman_requestsList');
535
536
537             // if request was selected, deselect requests in all other instances of RequestsListCtrl
538             $scope.$on(constants.YANGMAN_DESELECT_REQUESTS, function (event, params) {
539                 if (params.params.broadcastingCtrl !== vm) {
540                     deselectAllRequests();
541                 }
542             });
543
544             $scope.$on(constants.YANGMAN_REFRESH_COLLECTIONS, function (event, params){
545                 loadCollectionsList();
546                 (params.cbk || angular.noop)();
547             });
548
549             // list type dependend operations
550             if (mainList === 'history') {
551
552                 vm.mainList = vm.requestList;
553                 loadHistoryList();
554
555                 $scope.$on(constants.YANGMAN_REFRESH_HISTORY, loadHistoryList);
556                 // saving from request header after execution
557                 $scope.$on(constants.YANGMAN_SAVE_EXECUTED_REQUEST, saveBcstedHistoryRequest);
558                 // select newest request
559                 $scope.$on(constants.YANGMAN_SELECT_THE_NEWEST_REQUEST, selectNewestRequest);
560             }
561             else {
562                 vm.mainList = vm.collectionList;
563                 // saving from request header
564                 $scope.$on(constants.YANGMAN_SAVE_REQUEST_TO_COLLECTION, saveRequestFromExt);
565                 // saving collections expanded status on refresh
566                 $scope.$on(constants.YANGMAN_REFRESH_AND_EXPAND_COLLECTIONS, function(){
567                     var expandedColNames = vm.collectionList.getExpandedCollectionNames();
568                     $scope.rootBroadcast(constants.YANGMAN_REFRESH_COLLECTIONS, {}, function (){
569                         vm.collectionList.expandCollectionByNames(expandedColNames);
570                     });
571                 });
572             }
573
574         }
575
576
577         /**
578          * Request in list selection
579          * For history reqs it is possible multiselect, thats why event.ctrlKey is used
580          * @param event
581          * @param requestObj
582          */
583         function selectRequest(event, requestObj){
584             $scope.rootBroadcast(constants.YANGMAN_DESELECT_REQUESTS, { broadcastingCtrl: vm });
585             vm.mainList.toggleReqSelection(!event.ctrlKey, requestObj);
586             if (!event.ctrlKey){
587                 if ($scope.rightPanelSection === constants.DISPLAY_TYPE_FORM) {
588                     vm.showForm(requestObj, true);
589                 }
590                 else {
591                     vm.showData(requestObj, true);
592                 }
593             }
594         }
595
596         /**
597          * Mark only requestObj in current list as selected
598          * Used for example when user clicks on request submenu
599          * @param requestObj
600          */
601         function selectOnlyThisRequest(requestObj){
602             vm.mainList.toggleReqSelection(true, requestObj);
603         }
604
605         /**
606          * Deselect history requests
607          */
608         function deselectAllFilteredReqs(){
609             vm.mainList.deselectAllFilteredItems(vm.mainList === vm.collectionList ? filterCollReq : vm.filterReq);
610         }
611
612         function deselectAllRequests() {
613             vm.mainList.deselectAllItems();
614         }
615
616         /**
617          * Select history requests
618          */
619         function selectAllFilteredReqs(){
620             vm.mainList.selectAllFilteredItems(vm.mainList === vm.collectionList ? filterCollReq : vm.filterReq);
621         }
622
623         /**
624          * Use when selecting filtered requests if they are saved to some collection
625          * Additional filter is if the collection of the request is expanded
626          * @param request
627          * @returns {*|boolean}
628          */
629         function filterCollReq(request) {
630             return vm.collectionList.getCollection(request.collection).expanded && vm.filterReq(request);
631         }
632
633         /**
634          * Refresh and expand collections
635          */
636         function refreshCollectionsWithExpansion(){
637             $scope.rootBroadcast(constants.YANGMAN_REFRESH_AND_EXPAND_COLLECTIONS);
638         }
639
640     }
641
642 });