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) {
8 angular.module('app.yangman').controller('RequestsListCtrl', RequestsListCtrl);
10 RequestsListCtrl.$inject = [
11 '$filter', '$mdDialog', '$scope', 'YMHandleFileService', 'PathUtilsService', 'RequestsService', 'YangmanService',
12 'YangmanDesignService', 'constants',
16 * Controller for requests lists, means History requests and Collections requests
20 * @param YMHandleFileService
21 * @param PathUtilsService
22 * @param RequestsService
23 * @param YangmanService
24 * @param YangmanDesignService
27 function RequestsListCtrl($filter, $mdDialog, $scope, YMHandleFileService, PathUtilsService, RequestsService,
28 YangmanService, YangmanDesignService, constants) {
32 * List of all collections containing requests, loads even for history controller to use collection names
33 * in saving requests dialog
34 * @type {*|CollectionList}
36 vm.collectionList = null;
37 vm.constants = constants;
41 * @type {*|HistoryList}
43 vm.requestList = null;
45 vm.collectionsSortAsc = true;
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;
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;
76 * Save request obje to collection from other controller
79 function saveRequestFromExt(event, args) {
80 vm.showDgSaveReq(args.params.event, args.params.reqObj, false);
85 * Clear history requests list and save to storage
87 function clearHistoryList(event) {
89 YangmanDesignService.disableMdMenuItem(event);
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'))
96 .ok($filter('translate')('YANGMAN_OK'))
97 .cancel($filter('translate')('YANGMAN_CANCEL'));
99 $mdDialog.show(confirm).then(function (){
100 vm.requestList.clear();
101 vm.requestList.saveToStorage();
103 YangmanDesignService.enableMdMenuItem(event);
105 YangmanDesignService.enableMdMenuItem(event);
110 * Clear collections requests list and save to storage
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'))
118 .ok($filter('translate')('YANGMAN_OK'))
119 .cancel($filter('translate')('YANGMAN_CANCEL'));
121 YangmanDesignService.disableMdMenuItem(event);
123 $mdDialog.show(confirm).then(function (){
124 vm.collectionList.clear();
125 vm.collectionList.saveToStorage();
126 $scope.rootBroadcast('YANGMAN_REFRESH_COLLECTIONS');
127 YangmanDesignService.enableMdMenuItem(event);
129 YangmanDesignService.enableMdMenuItem(event);
134 * Create history request from other ctrl
135 * @param broadcastEvent
138 function saveBcstedHistoryRequest(broadcastEvent, params) {
139 vm.requestList.addItemToList(params.params);
140 vm.requestList.saveToStorage();
142 (params.cbk || angular.noop)();
146 * Clear value of input file used to import collection
147 * todo: move to design utils
149 function clearFileInputValue(){
150 angular.element(document).find('#importCollection').val('');
154 * Importing collection from a file
155 * todo: error handling - msgs for user
156 * @param $fileContent
158 function readCollectionFromFile($fileContent) {
159 var data = $fileContent,
160 checkArray = ['sentData', 'receivedData', 'path', 'collection', 'method', 'status', 'name'];
162 if (data && YangmanService.validateFile(data, checkArray)){
164 vm.collectionList.loadListFromFile(data);
165 vm.collectionList.saveToStorage();
166 $scope.rootBroadcast('YANGMAN_REFRESH_COLLECTIONS');
167 clearFileInputValue();
170 clearFileInputValue();
171 console.error('DataStorage error:', e);
175 clearFileInputValue();
177 removeButtonBackground();
179 function removeButtonBackground() {
180 $('#importCollection').next().css({ 'background': 'transparent' });
184 function toggleCollectionsSort() {
185 vm.collectionsSortAsc = !vm.collectionsSortAsc;
189 * Export collection to json file
190 * @param {Collection} collection
192 function downloadCollection(collection) {
194 var cListJSON = vm.collectionList.getCollectionInRawJSON(collection.name);
196 YMHandleFileService.downloadFile(collection.name + '.json', cListJSON, 'json', 'charset=utf-8',
199 console.error('ExportCollection error:', e);
205 * Fill request form in right panel with request data
208 function showForm(reqObj) {
209 var data = reqObj.sentData;
211 // exception for get meth
212 if ( reqObj.method === constants.OPERATION_GET ) {
213 data = reqObj.receivedData;
216 $scope.rootBroadcast(
217 'YANGMAN_SET_CODEMIRROR_DATA_RECEIVED', { data: reqObj.setDataForView(reqObj.receivedData) }
219 $scope.rootBroadcast(
220 'YANGMAN_SET_CODEMIRROR_DATA_SENT', { data: reqObj.setDataForView(reqObj.sentData) }
223 $scope.rootBroadcast('YANGMAN_SET_ERROR_DATA',
224 reqObj.receivedData && reqObj.receivedData.hasOwnProperty('errors') ? reqObj.receivedData : {});
226 $scope.rootBroadcast('YANGMAN_FILL_NODE_FROM_REQ', { requestUrl: reqObj.path, requestData: data },
228 $scope.setRightPanelSection(constants.DISPLAY_TYPE_FORM);
229 $scope.rootBroadcast('YANGMAN_HEADER_INIT', {
231 method: reqObj.method,
233 status: reqObj.responseStatus,
234 statusText: reqObj.responseStatusText,
235 time: reqObj.responseTime,
240 // prepare data for filling form
241 data = $scope.node.type === constants.NODE_RPC ?
242 YangmanService.prepareReceivedData(
247 constants.DISPLAY_TYPE_FORM
251 YangmanService.fillNodeFromResponse($scope.node, data);
252 $scope.node.expanded = true;
261 * Force request header to execute request with data from reqObj
264 function executeRequest(reqObj) {
266 $scope.rootBroadcast('YANGMAN_EXECUTE_WITH_DATA',{ data: reqObj.sentData });
270 * Method for setup data into CM, Header, find api, subapi, node
274 function showData(reqObj, select){
277 method: reqObj.method,
280 // action select request
282 headerObj.statusObj = {
283 status: reqObj.responseStatus,
284 statusText: reqObj.responseStatusText,
285 time: reqObj.responseTime,
288 $scope.rootBroadcast(
289 'YANGMAN_SET_ERROR_DATA',
290 reqObj.receivedData && reqObj.receivedData.hasOwnProperty('errors') ? reqObj.receivedData : {}
294 $scope.setRightPanelSection(constants.DISPLAY_TYPE_REQ_DATA);
295 $scope.setJsonView(true, reqObj.method !== constants.OPERATION_GET);
297 $scope.rootBroadcast('YANGMAN_HEADER_INIT', headerObj);
298 $scope.rootBroadcast('YANGMAN_FILL_NODE_FROM_REQ', { requestUrl: reqObj.path });
300 $scope.rootBroadcast(
301 'YANGMAN_SET_CODEMIRROR_DATA_RECEIVED',
302 { data: reqObj.setDataForView(reqObj.receivedData) }
305 $scope.rootBroadcast(
306 'YANGMAN_SET_CODEMIRROR_DATA_SENT',
307 { data: reqObj.setDataForView(reqObj.sentData) }
312 * Clear current ctrl search value
314 function clearFilter(){
319 * Dialog for deleting either selected requests or reqObj
324 function showDgDeleteRequests(event, reqObj){
326 var confirm = $mdDialog.confirm()
327 .title($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TITLE'))
328 .textContent($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TEXT'))
329 .ariaLabel($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TITLE'))
331 .ok($filter('translate')('YANGMAN_OK'))
332 .cancel($filter('translate')('YANGMAN_CANCEL'));
334 YangmanDesignService.disableMdMenuItem(event);
336 $mdDialog.show(confirm).then(function (){
338 vm.mainList.deleteRequestItem(reqObj);
341 vm.mainList.getSelectedItems(
342 vm.mainList === vm.collectionList ? filterCollReq : filterReq
343 ).forEach(function (elem){
344 vm.mainList.deleteRequestItem(elem);
347 vm.mainList.saveToStorage();
349 if (vm.mainList === vm.requestList) {
353 refreshCollectionsWithExpansion();
356 YangmanDesignService.enableMdMenuItem(event);
362 * Dialog for deleting collection and refreshing collections
366 function showDgDeleteCollection(ev, collObj){
367 var confirm = $mdDialog.confirm()
368 .title($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TITLE') + ' ' + collObj.name + '?')
369 .textContent($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TEXT'))
370 .ariaLabel($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TITLE'))
372 .ok($filter('translate')('YANGMAN_OK'))
373 .cancel($filter('translate')('YANGMAN_CANCEL'));
375 YangmanDesignService.disableMdMenuItem(ev);
377 $mdDialog.show(confirm).then(function (){
378 vm.collectionList.deleteCollection(collObj);
379 vm.collectionList.saveToStorage();
380 refreshCollectionsWithExpansion();
382 YangmanDesignService.enableMdMenuItem(ev);
387 * Check if reqObj matches current search value
391 function filterReq(reqObj){
392 var searchPhrase = vm.search.toLocaleLowerCase();
393 return reqObj.path.toLowerCase().indexOf(searchPhrase) > -1 ||
394 reqObj.collection.toLowerCase().indexOf(searchPhrase) > -1 ||
395 reqObj.method.toLowerCase() === searchPhrase;
399 * Check if collection name matches current search value or any collection req matches
402 function filterCol(colObj){
403 return filterColName(colObj) || colObj.data.some(filterReq);
407 * Get count of requests matching filter in collection colObj
411 function colMatchingReqsCount(colObj){
412 return colObj.data.filter(vm.filterReq).length;
416 * Check if collection name matches current filter
420 function filterColName(colObj){
421 return colObj.name.toLowerCase().indexOf(vm.search.toLowerCase()) > -1;
428 function fakeFilter(){
434 * Show dialog for saving reqObj to collection (used for duplicate req too)
439 function showDgSaveReq(ev, reqObj, duplicate){
442 controller: SaveReqDialogCtrl,
443 controllerAs: 'dialog',
444 templateUrl: $scope.globalViewPath + 'leftpanel/save-req-dialog.tpl.html',
445 parent: angular.element('#yangmanModule'),
447 clickOutsideToClose: true,
449 requests: reqObj ? [reqObj] : vm.mainList.getSelectedItems(
450 vm.mainList === vm.collectionList ? filterCollReq : filterReq
452 collectionNames: vm.collectionList.getCollectionNames(),
453 duplicate: duplicate || false,
455 }).then(saveRequests);
459 * Add each request from requests array to collectionList and save
462 function saveRequests(requests){
463 requests.forEach(function (reqObj){
464 vm.collectionList.addItemToList(RequestsService.clearUnnecessaryProperties(reqObj.clone()));
465 vm.collectionList.saveToStorage();
466 refreshCollectionsWithExpansion();
472 * Dialog for editing collection name (used for duplicating collection too)
475 * @param {boolean} duplicate
477 function showDgEditCollection(ev, collection, duplicate){
479 controller: EditCollectionDialogCtrl,
480 controllerAs: 'dialog',
481 templateUrl: $scope.globalViewPath + 'leftpanel/edit-collection-dialog.tpl.html',
482 parent: angular.element('#yangmanModule'),
484 clickOutsideToClose: true,
486 collection: collection,
487 allCollections: vm.collectionList.collections,
488 duplicate: duplicate,
490 }).then(duplicate ? duplicateCollection : changeCollectionName);
495 * @param {array} names 0. element is old name, 1. element is new name
497 function changeCollectionName(names){
498 vm.collectionList.renameCollection(names[0], names[1]);
499 vm.collectionList.saveToStorage();
500 refreshCollectionsWithExpansion();
504 * Create collection duplicate, save and refresh collections
505 * @param {array} names 0. element is old name, 1. element is new name
507 function duplicateCollection(names){
508 vm.collectionList.duplicateCollection(names[0], names[1]);
509 vm.collectionList.saveToStorage();
510 refreshCollectionsWithExpansion();
514 function selectNewestRequest() {
515 vm.mainList.toggleReqSelection(true, vm.mainList.getNewestRequest());
518 function loadCollectionsList() {
519 vm.collectionList.loadListFromStorage();
522 function loadHistoryList() {
523 vm.requestList.loadListFromStorage();
528 * @param mainList collectionList or requestList object
530 function init(mainList){
532 vm.collectionList = RequestsService.createEmptyCollectionList('yangman_collectionsList');
533 // collections are loaded for both history and collections tab
534 loadCollectionsList();
536 vm.requestList = RequestsService.createEmptyHistoryList('yangman_requestsList');
539 // if request was selected, deselect requests in all other instances of RequestsListCtrl
540 $scope.$on('YANGMAN_DESELECT_REQUESTS', function (event, params) {
541 if (params.params.broadcastingCtrl !== vm) {
542 deselectAllRequests();
546 $scope.$on('YANGMAN_REFRESH_COLLECTIONS', function (event, params){
547 loadCollectionsList();
548 (params.cbk || angular.noop)();
551 // list type dependend operations
552 if (mainList === 'history') {
554 vm.mainList = vm.requestList;
557 $scope.$on('YANGMAN_REFRESH_HISTORY', loadHistoryList);
558 // saving from request header after execution
559 $scope.$on('YANGMAN_SAVE_EXECUTED_REQUEST', saveBcstedHistoryRequest);
560 // select newest request
561 $scope.$on('YANGMAN_SELECT_THE_NEWEST_REQUEST', selectNewestRequest);
564 vm.mainList = vm.collectionList;
565 // saving from request header
566 $scope.$on('YANGMAN_SAVE_REQUEST_TO_COLLECTION', saveRequestFromExt);
567 // saving collections expanded status on refresh
568 $scope.$on('YANGMAN_REFRESH_AND_EXPAND_COLLECTIONS', function(){
569 var expandedColNames = vm.collectionList.getExpandedCollectionNames();
570 $scope.rootBroadcast('YANGMAN_REFRESH_COLLECTIONS', {}, function (){
571 vm.collectionList.expandCollectionByNames(expandedColNames);
580 * Request in list selection
581 * For history reqs it is possible multiselect, thats why event.ctrlKey is used
585 function selectRequest(event, requestObj){
586 $scope.rootBroadcast('YANGMAN_DESELECT_REQUESTS', { broadcastingCtrl: vm });
587 vm.mainList.toggleReqSelection(!event.ctrlKey, requestObj);
589 vm.showData(requestObj, true);
594 * Mark only requestObj in current list as selected
595 * Used for example when user clicks on request submenu
598 function selectOnlyThisRequest(requestObj){
599 vm.mainList.toggleReqSelection(true, requestObj);
603 * Deselect history requests
605 function deselectAllFilteredReqs(){
606 vm.mainList.deselectAllFilteredItems(vm.mainList === vm.collectionList ? filterCollReq : vm.filterReq);
609 function deselectAllRequests() {
610 vm.mainList.deselectAllItems();
614 * Select history requests
616 function selectAllFilteredReqs(){
617 vm.mainList.selectAllFilteredItems(vm.mainList === vm.collectionList ? filterCollReq : vm.filterReq);
621 * Use when selecting filtered requests if they are saved to some collection
622 * Additional filter is if the collection of the request is expanded
624 * @returns {*|boolean}
626 function filterCollReq(request) {
627 return vm.collectionList.getCollection(request.collection).expanded && vm.filterReq(request);
631 * Refresh and expand collections
633 function refreshCollectionsWithExpansion(){
634 $scope.rootBroadcast('YANGMAN_REFRESH_AND_EXPAND_COLLECTIONS');