Yangman - cleaned code
[dlux.git] / modules / yangman-resources / src / main / resources / yangman / controllers / requests-list.controller.js
index d80c91da194adb628d615f0ca8b0ec53863938ad..62a35f891961f1126a63fff73e1352e5382911ff 100644 (file)
@@ -8,46 +8,143 @@ define([
     angular.module('app.yangman').controller('RequestsListCtrl', RequestsListCtrl);
 
     RequestsListCtrl.$inject = [
-        '$filter', '$mdDialog', '$scope', 'HandleFileService', 'PathUtilsService', 'RequestsService',
+        '$filter', '$mdDialog', '$scope', 'YMHandleFileService', 'PathUtilsService', 'RequestsService', 'YangmanService',
+        'YangmanDesignService', 'constants',
     ];
 
-    function RequestsListCtrl($filter, $mdDialog, $scope, HandleFileService, PathUtilsService, RequestsService) {
+    /**
+     * Controller for requests lists, means History requests and Collections requests
+     * @param $filter
+     * @param $mdDialog
+     * @param $scope
+     * @param YMHandleFileService
+     * @param PathUtilsService
+     * @param RequestsService
+     * @param YangmanService
+     * @param YangmanDesignService
+     * @constructor
+     */
+    function RequestsListCtrl($filter, $mdDialog, $scope, YMHandleFileService, PathUtilsService, RequestsService,
+                              YangmanService, YangmanDesignService, constants) {
         var vm = this;
 
-        vm.collectionList = RequestsService.createEmptyCollectionList('yangman_collectionsList', vm.getApiCallback);
+        /**
+         * List of all collections containing requests, loads even for history controller to use collection names
+         * in saving requests dialog
+         * @type {*|CollectionList}
+         */
+        vm.collectionList = null;
+        vm.constants = constants;
+
+        /**
+         *
+         * @type {*|HistoryList}
+         */
+        vm.requestList = null;
         vm.mainList = null;
-        vm.requestList = RequestsService.createEmptyHistoryList('yangman_requestsList', vm.getApiCallback);
-        vm.search = '';
         vm.collectionsSortAsc = true;
+        vm.search = '';
 
+        // methods
+        vm.clearCollectionList = clearCollectionList;
         vm.clearFilter = clearFilter;
-        vm.filterReq = filterReq;
-        vm.filterCol = filterCol;
-        vm.filterColName = filterColName;
+        vm.clearHistoryList = clearHistoryList;
         vm.colMatchingReqsCount = colMatchingReqsCount;
+        vm.deselectAllFilteredRequests = deselectAllFilteredReqs;
         vm.downloadCollection = downloadCollection;
+        vm.executeRequest = executeRequest;
         vm.fakeFilter = fakeFilter;
-        vm.getApiCallback = getApiCallback;
-        vm.loadRequests = loadRequests;
-        vm.toggleCollectionsSort = toggleCollectionsSort;
+        vm.filterCol = filterCol;
+        vm.filterColName = filterColName;
+        vm.filterReq = filterReq;
+        vm.init = init;
+        vm.readCollectionFromFile = readCollectionFromFile;
+        vm.selectAllFilteredRequests = selectAllFilteredReqs;
         vm.selectRequest = selectRequest;
-
+        vm.showData = showData;
         vm.showDgDeleteCollection = showDgDeleteCollection;
         vm.showDgDeleteRequests = showDgDeleteRequests;
         vm.showDgEditCollection = showDgEditCollection;
-        vm.readCollectionFromFile = readCollectionFromFile;
         vm.showDgSaveReq = showDgSaveReq;
+        vm.showForm = showForm;
+        vm.toggleCollectionsSort = toggleCollectionsSort;
+        vm.selectOnlyThisRequest = selectOnlyThisRequest;
+        vm.deselectAllRequests = deselectAllRequests;
+        vm.filterCollReq = filterCollReq;
 
-        vm.showData = showData;
-        vm.useAsMainList = useAsMainList;
+        /**
+         * Save request obje to collection from other controller
+         * @param reqObj
+         */
+        function saveRequestFromExt(event, args) {
+            vm.showDgSaveReq(args.params.event, args.params.reqObj, false);
+        }
+
+
+        /**
+         * Clear history requests list and save to storage
+         */
+        function clearHistoryList(event) {
 
-        $scope.$on('YANGMAN_REFRESH_HISTORY', loadHistoryRequests);
-        $scope.$on('YANGMAN_REFRESH_COLLECTIONS', loadCollectionRequest);
+            YangmanDesignService.disableMdMenuItem(event);
 
-        loadRequests();
+            var confirm = $mdDialog.confirm()
+                .title($filter('translate')('YANGMAN_DELETE_HISTORY_CONFIRM_TITLE'))
+                .textContent($filter('translate')('YANGMAN_DELETE_HISTORY_CONFIRM_TEXT'))
+                .ariaLabel($filter('translate')('YANGMAN_DELETE_HISTORY_CONFIRM_TITLE'))
+                .targetEvent(event)
+                .ok($filter('translate')('YANGMAN_OK'))
+                .cancel($filter('translate')('YANGMAN_CANCEL'));
+
+            $mdDialog.show(confirm).then(function (){
+                vm.requestList.clear();
+                vm.requestList.saveToStorage();
+                loadHistoryList();
+                YangmanDesignService.enableMdMenuItem(event);
+            }, function (){
+                YangmanDesignService.enableMdMenuItem(event);
+            });
+        }
+
+        /**
+         * Clear collections requests list and save to storage
+         */
+        function clearCollectionList(event) {
+            var confirm = $mdDialog.confirm()
+                .title($filter('translate')('YANGMAN_DELETE_COLLECTION_CONFIRM_TITLE'))
+                .textContent($filter('translate')('YANGMAN_DELETE_COLLECTION_CONFIRM_TEXT'))
+                .ariaLabel($filter('translate')('YANGMAN_DELETE_COLLECTION_CONFIRM_TITLE'))
+                .targetEvent(event)
+                .ok($filter('translate')('YANGMAN_OK'))
+                .cancel($filter('translate')('YANGMAN_CANCEL'));
+
+            YangmanDesignService.disableMdMenuItem(event);
+
+            $mdDialog.show(confirm).then(function (){
+                vm.collectionList.clear();
+                vm.collectionList.saveToStorage();
+                $scope.rootBroadcast('YANGMAN_REFRESH_COLLECTIONS');
+                YangmanDesignService.enableMdMenuItem(event);
+            }, function () {
+                YangmanDesignService.enableMdMenuItem(event);
+            });
+        }
+
+        /**
+         * Create history request from other ctrl
+         * @param broadcastEvent
+         * @param params
+         */
+        function saveBcstedHistoryRequest(broadcastEvent, params) {
+            vm.requestList.addItemToList(params.params);
+            vm.requestList.saveToStorage();
+            loadHistoryList();
+            (params.cbk || angular.noop)();
+        }
 
         /**
          * Clear value of input file used to import collection
+         * todo: move to design utils
          */
         function clearFileInputValue(){
             angular.element(document).find('#importCollection').val('');
@@ -60,20 +157,13 @@ define([
          */
         function readCollectionFromFile($fileContent) {
             var data = $fileContent,
-                checkArray = ['sentData',
-                    'receivedData',
-                    'path',
-                    'collection',
-                    'parametrizedPath',
-                    'method',
-                    'status',
-                    'name',
-                ];
-
-            if (data && RequestsService.validateFile(data, checkArray)){
+                checkArray = ['sentData', 'receivedData', 'path', 'collection', 'method', 'status', 'name'];
+
+            if (data && YangmanService.validateFile(data, checkArray)){
                 try {
                     vm.collectionList.loadListFromFile(data);
                     vm.collectionList.saveToStorage();
+                    $scope.rootBroadcast('YANGMAN_REFRESH_COLLECTIONS');
                     clearFileInputValue();
                 }
                 catch (e) {
@@ -84,6 +174,11 @@ define([
             else {
                 clearFileInputValue();
             }
+            removeButtonBackground();
+
+            function removeButtonBackground() {
+                $('#importCollection').next().css({ 'background': 'transparent' });
+            }
         }
 
         function toggleCollectionsSort() {
@@ -96,9 +191,9 @@ define([
          */
         function downloadCollection(collection) {
 
-            var cListJSON = vm.collectionList.getCollectionInJSON(collection.name);
+            var cListJSON = vm.collectionList.getCollectionInRawJSON(collection.name);
 
-            HandleFileService.downloadFile(collection.name + '.json', cListJSON, 'json', 'charset=utf-8',
+            YMHandleFileService.downloadFile(collection.name + '.json', cListJSON, 'json', 'charset=utf-8',
                 function (){},
                 function (e){
                     console.error('ExportCollection error:', e);
@@ -106,17 +201,111 @@ define([
             );
         }
 
+        /**
+         * Fill request form in right panel with request data
+         * @param reqObj
+         */
+        function showForm(reqObj) {
+            var data = reqObj.sentData;
+
+            // exception for get meth
+            if ( reqObj.method === constants.OPERATION_GET ) {
+                data = reqObj.receivedData;
+            }
+
+            $scope.rootBroadcast(
+                'YANGMAN_SET_CODEMIRROR_DATA_RECEIVED', { data: reqObj.setDataForView(reqObj.receivedData) }
+            );
+            $scope.rootBroadcast(
+                'YANGMAN_SET_CODEMIRROR_DATA_SENT', { data: reqObj.setDataForView(reqObj.sentData) }
+            );
+
+            $scope.rootBroadcast('YANGMAN_SET_ERROR_DATA',
+                reqObj.receivedData && reqObj.receivedData.hasOwnProperty('errors') ? reqObj.receivedData : {});
+
+            $scope.rootBroadcast('YANGMAN_FILL_NODE_FROM_REQ', { requestUrl: reqObj.path, requestData: data },
+                function (){
+                    $scope.setRightPanelSection(constants.DISPLAY_TYPE_FORM);
+                    $scope.rootBroadcast('YANGMAN_HEADER_INIT', {
+                        path: reqObj.path,
+                        method: reqObj.method,
+                        statusObj: {
+                            status: reqObj.responseStatus,
+                            statusText: reqObj.responseStatusText,
+                            time: reqObj.responseTime,
+                        },
+                    });
+
+                    if ( $scope.node ) {
+                        // prepare data for filling form
+                        data = $scope.node.type === constants.NODE_RPC ?
+                                YangmanService.prepareReceivedData(
+                                    $scope.node,
+                                    reqObj.method,
+                                    reqObj.receivedData,
+                                    reqObj.sentData,
+                                    constants.DISPLAY_TYPE_FORM
+                                ) : data;
+
+                        // try to fill node
+                        YangmanService.fillNodeFromResponse($scope.node, data);
+                        $scope.node.expanded = true;
+                    }
+
+                }
+            );
+
+        }
 
         /**
-         * Show current reqObj sent data in right panel section
+         * Force request header to execute request with data from reqObj
          * @param reqObj
-         * @param dataType
          */
-        function showData(reqObj, dataType) {
-            $scope.setRequestToShow(reqObj, dataType);
-            $scope.setRightPanelSection('req-data');
-            $scope.broadcastFromRoot('YANGMAN_REFRESH_CM_DATA');
-            $scope.rootBroadcast('YANGMAN_HEADER_INIT', { path: $scope.requestToShow.path });
+        function executeRequest(reqObj) {
+            showData(reqObj);
+            $scope.rootBroadcast('YANGMAN_EXECUTE_WITH_DATA',{ data: reqObj.sentData });
+        }
+
+        /**
+         * Method for setup data into CM, Header, find api, subapi, node
+         * @param reqObj
+         * @param status
+         */
+        function showData(reqObj, select){
+            var headerObj = {
+                path: reqObj.path,
+                method: reqObj.method,
+            };
+
+            // action select request
+            if ( select ) {
+                headerObj.statusObj = {
+                    status: reqObj.responseStatus,
+                    statusText: reqObj.responseStatusText,
+                    time: reqObj.responseTime,
+                };
+
+                $scope.rootBroadcast(
+                    'YANGMAN_SET_ERROR_DATA',
+                    reqObj.receivedData && reqObj.receivedData.hasOwnProperty('errors') ? reqObj.receivedData : {}
+                );
+            }
+
+            $scope.setRightPanelSection(constants.DISPLAY_TYPE_REQ_DATA);
+            $scope.setJsonView(true, reqObj.method !== constants.OPERATION_GET);
+
+            $scope.rootBroadcast('YANGMAN_HEADER_INIT', headerObj);
+            $scope.rootBroadcast('YANGMAN_FILL_NODE_FROM_REQ', { requestUrl: reqObj.path });
+
+            $scope.rootBroadcast(
+                'YANGMAN_SET_CODEMIRROR_DATA_RECEIVED',
+                { data: reqObj.setDataForView(reqObj.receivedData) }
+            );
+
+            $scope.rootBroadcast(
+                'YANGMAN_SET_CODEMIRROR_DATA_SENT',
+                { data: reqObj.setDataForView(reqObj.sentData) }
+            );
         }
 
         /**
@@ -129,51 +318,68 @@ define([
         /**
          * Dialog for deleting either selected requests or reqObj
          *
-         * @param ev
+         * @param event
          * @param reqObj
          */
-        function showDgDeleteRequests(ev, reqObj){
+        function showDgDeleteRequests(event, reqObj){
+
             var confirm = $mdDialog.confirm()
                 .title($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TITLE'))
                 .textContent($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TEXT'))
                 .ariaLabel($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TITLE'))
-                .targetEvent(ev)
+                .targetEvent(event)
                 .ok($filter('translate')('YANGMAN_OK'))
                 .cancel($filter('translate')('YANGMAN_CANCEL'));
 
+            YangmanDesignService.disableMdMenuItem(event);
+
             $mdDialog.show(confirm).then(function (){
                 if (reqObj){
                     vm.mainList.deleteRequestItem(reqObj);
                 }
                 else {
-                    vm.mainList.selectedRequests.forEach(function (elem){
+                    vm.mainList.getSelectedItems(
+                        vm.mainList === vm.collectionList ? filterCollReq : filterReq
+                    ).forEach(function (elem){
                         vm.mainList.deleteRequestItem(elem);
                     });
                 }
                 vm.mainList.saveToStorage();
-                loadRequests();
+
+                if (vm.mainList === vm.requestList) {
+                    loadHistoryList();
+                }
+                else {
+                    refreshCollectionsWithExpansion();
+                }
+            }, function (){
+                YangmanDesignService.enableMdMenuItem(event);
             });
         }
 
 
         /**
-         * Dialog for delete collection
+         * Dialog for deleting collection and refreshing collections
          * @param ev
          * @param collObj
          */
         function showDgDeleteCollection(ev, collObj){
             var confirm = $mdDialog.confirm()
-                .title($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TITLE'))
+                .title($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TITLE') + ' ' + collObj.name + '?')
                 .textContent($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TEXT'))
                 .ariaLabel($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TITLE'))
                 .targetEvent(ev)
                 .ok($filter('translate')('YANGMAN_OK'))
                 .cancel($filter('translate')('YANGMAN_CANCEL'));
 
+            YangmanDesignService.disableMdMenuItem(ev);
+
             $mdDialog.show(confirm).then(function (){
                 vm.collectionList.deleteCollection(collObj);
                 vm.collectionList.saveToStorage();
-                $scope.broadcastFromRoot('YANGMAN_REFRESH_COLLECTIONS');
+                refreshCollectionsWithExpansion();
+            }, function (){
+                YangmanDesignService.enableMdMenuItem(ev);
             });
         }
 
@@ -183,7 +389,10 @@ define([
          * @returns {boolean}
          */
         function filterReq(reqObj){
-            return reqObj.path.indexOf(vm.search) !== -1;
+            var searchPhrase = vm.search.toLocaleLowerCase();
+            return reqObj.path.toLowerCase().indexOf(searchPhrase) > -1 ||
+                reqObj.collection.toLowerCase().indexOf(searchPhrase) > -1 ||
+                reqObj.method.toLowerCase() === searchPhrase;
         }
 
         /**
@@ -209,7 +418,7 @@ define([
          * @returns {boolean}
          */
         function filterColName(colObj){
-            return colObj.name.indexOf(vm.search) !== -1;
+            return colObj.name.toLowerCase().indexOf(vm.search.toLowerCase()) > -1;
         }
 
         /**
@@ -220,6 +429,7 @@ define([
             return true;
         }
 
+
         /**
          * Show dialog for saving reqObj to collection (used for duplicate req too)
          * @param ev
@@ -236,7 +446,9 @@ define([
                 targetEvent: ev,
                 clickOutsideToClose: true,
                 locals: {
-                    requests: reqObj ? [reqObj] : vm.requestList.selectedRequests,
+                    requests: reqObj ? [reqObj] : vm.mainList.getSelectedItems(
+                        vm.mainList === vm.collectionList ? filterCollReq : filterReq
+                    ),
                     collectionNames: vm.collectionList.getCollectionNames(),
                     duplicate: duplicate || false,
                 },
@@ -249,9 +461,9 @@ define([
          */
         function saveRequests(requests){
             requests.forEach(function (reqObj){
-                vm.collectionList.addRequestToList(reqObj);
+                vm.collectionList.addItemToList(RequestsService.clearUnnecessaryProperties(reqObj.clone()));
                 vm.collectionList.saveToStorage();
-                $scope.broadcastFromRoot('YANGMAN_REFRESH_COLLECTIONS');
+                refreshCollectionsWithExpansion();
             });
         }
 
@@ -285,52 +497,85 @@ define([
         function changeCollectionName(names){
             vm.collectionList.renameCollection(names[0], names[1]);
             vm.collectionList.saveToStorage();
-            $scope.broadcastFromRoot('YANGMAN_REFRESH_COLLECTIONS');
+            refreshCollectionsWithExpansion();
         }
 
         /**
-         * Create collection duplicate and save
+         * Create collection duplicate, save and refresh collections
          * @param {array} names 0. element is old name, 1. element is new name
          */
         function duplicateCollection(names){
             vm.collectionList.duplicateCollection(names[0], names[1]);
             vm.collectionList.saveToStorage();
-            $scope.broadcastFromRoot('YANGMAN_REFRESH_COLLECTIONS');
+            refreshCollectionsWithExpansion();
         }
 
 
+        function selectNewestRequest() {
+            vm.mainList.toggleReqSelection(true, vm.mainList.getNewestRequest());
+        }
 
-        /**
-         *
-         * @param list collectionList or requestList object
-         */
-        function useAsMainList(list){
-            vm.mainList = list;
+        function loadCollectionsList() {
+            vm.collectionList.loadListFromStorage();
         }
 
-        /**
-         * Loading history request and grouping by date
-         */
-        function loadHistoryRequests(){
+        function loadHistoryList() {
             vm.requestList.loadListFromStorage();
-            vm.requestList.groupListByDate();
         }
 
         /**
-         * Loading collections
+         *
+         * @param mainList collectionList or requestList object
          */
-        function loadCollectionRequest(){
-            vm.collectionList.loadListFromStorage();
-        }
+        function init(mainList){
+
+            vm.collectionList = RequestsService.createEmptyCollectionList('yangman_collectionsList');
+            // collections are loaded for both history and collections tab
+            loadCollectionsList();
+
+            vm.requestList = RequestsService.createEmptyHistoryList('yangman_requestsList');
+
+
+            // if request was selected, deselect requests in all other instances of RequestsListCtrl
+            $scope.$on('YANGMAN_DESELECT_REQUESTS', function (event, params) {
+                if (params.params.broadcastingCtrl !== vm) {
+                    deselectAllRequests();
+                }
+            });
+
+            $scope.$on('YANGMAN_REFRESH_COLLECTIONS', function (event, params){
+                loadCollectionsList();
+                (params.cbk || angular.noop)();
+            });
+
+            // list type dependend operations
+            if (mainList === 'history') {
+
+                vm.mainList = vm.requestList;
+                loadHistoryList();
+
+                $scope.$on('YANGMAN_REFRESH_HISTORY', loadHistoryList);
+                // saving from request header after execution
+                $scope.$on('YANGMAN_SAVE_EXECUTED_REQUEST', saveBcstedHistoryRequest);
+                // select newest request
+                $scope.$on('YANGMAN_SELECT_THE_NEWEST_REQUEST', selectNewestRequest);
+            }
+            else {
+                vm.mainList = vm.collectionList;
+                // saving from request header
+                $scope.$on('YANGMAN_SAVE_REQUEST_TO_COLLECTION', saveRequestFromExt);
+                // saving collections expanded status on refresh
+                $scope.$on('YANGMAN_REFRESH_AND_EXPAND_COLLECTIONS', function(){
+                    var expandedColNames = vm.collectionList.getExpandedCollectionNames();
+                    $scope.rootBroadcast('YANGMAN_REFRESH_COLLECTIONS', {}, function (){
+                        vm.collectionList.expandCollectionByNames(expandedColNames);
+                    });
+                });
+            }
 
-        /**
-         * Loading both history and collections reqs
-         */
-        function loadRequests(){
-            loadHistoryRequests();
-            loadCollectionRequest();
         }
 
+
         /**
          * Request in list selection
          * For history reqs it is possible multiselect, thats why event.ctrlKey is used
@@ -338,45 +583,57 @@ define([
          * @param requestObj
          */
         function selectRequest(event, requestObj){
+            $scope.rootBroadcast('YANGMAN_DESELECT_REQUESTS', { broadcastingCtrl: vm });
             vm.mainList.toggleReqSelection(!event.ctrlKey, requestObj);
-            $scope.setHistoryReqsSelected(vm.requestList.selectedRequests.length > 0);
+            if (!event.ctrlKey){
+                vm.showData(requestObj, true);
+            }
         }
 
         /**
-         *
-         * @param pathString
-         * @returns {*}
+         * Mark only requestObj in current list as selected
+         * Used for example when user clicks on request submenu
+         * @param requestObj
          */
-        function getApiCallback(pathString) {
-            var snp = PathUtilsService.getStorageAndNormalizedPath(pathString),
-            // if the path is for mountpoint then get the path to treedata structure
-                mpSearchPath = MountPointsConnectorService.alterMpPath(pathString),
-                apiIndexes = PathUtilsService.searchNodeByPath(mpSearchPath, $scope.treeApis, $scope.treeRows),
-                selApi = apiIndexes ? $scope.apis[apiIndexes.indexApi] : null,
-                selSubApi = selApi ? selApi.subApis[apiIndexes.indexSubApi] : null,
-                copiedApi = selSubApi ?
-                    selSubApi.clone({ storage: snp.storage, withoutNode: true, clonePathArray: true }) :
-                    null;
-
-            if (copiedApi) {
-                copiedApi.pathArray.forEach(function (p) {
-                    p.hover = false;
-                });
+        function selectOnlyThisRequest(requestObj){
+            vm.mainList.toggleReqSelection(true, requestObj);
+        }
 
-                PathUtilsService.fillPath(copiedApi.pathArray, snp.normalizedPath);
-            }
+        /**
+         * Deselect history requests
+         */
+        function deselectAllFilteredReqs(){
+            vm.mainList.deselectAllFilteredItems(vm.mainList === vm.collectionList ? filterCollReq : vm.filterReq);
+        }
 
-            var searchedModule = PathUtilsService.getModuleNameFromPath(pathString);
+        function deselectAllRequests() {
+            vm.mainList.deselectAllItems();
+        }
 
-            if (mpSearchPath.indexOf(mountPrefix) !== -1 && copiedApi){
-                copiedApi = $scope.selSubApi &&
-                searchedModule === $scope.selSubApi.pathArray[1].module ?
-                    copiedApi :
-                    null;
-            }
+        /**
+         * Select history requests
+         */
+        function selectAllFilteredReqs(){
+            vm.mainList.selectAllFilteredItems(vm.mainList === vm.collectionList ? filterCollReq : vm.filterReq);
+        }
 
-            return copiedApi;
+        /**
+         * Use when selecting filtered requests if they are saved to some collection
+         * Additional filter is if the collection of the request is expanded
+         * @param request
+         * @returns {*|boolean}
+         */
+        function filterCollReq(request) {
+            return vm.collectionList.getCollection(request.collection).expanded && vm.filterReq(request);
         }
+
+        /**
+         * Refresh and expand collections
+         */
+        function refreshCollectionsWithExpansion(){
+            $scope.rootBroadcast('YANGMAN_REFRESH_AND_EXPAND_COLLECTIONS');
+        }
+
     }
 
 });