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',
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) {
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;
40 * @type {*|HistoryList}
42 vm.requestList = null;
44 vm.collectionsSortAsc = true;
48 vm.clearCollectionList = clearCollectionList;
49 vm.clearFilter = clearFilter;
50 vm.clearHistoryList = clearHistoryList;
51 vm.colMatchingReqsCount = colMatchingReqsCount;
52 vm.deselectAllFilteredRequests = deselectAllFilteredReqs;
53 vm.downloadCollection = downloadCollection;
54 vm.executeRequest = executeRequest;
55 vm.fakeFilter = fakeFilter;
56 vm.filterCol = filterCol;
57 vm.filterColName = filterColName;
58 vm.filterReq = filterReq;
60 vm.readCollectionFromFile = readCollectionFromFile;
61 vm.selectAllFilteredRequests = selectAllFilteredReqs;
62 vm.selectRequest = selectRequest;
63 vm.showData = showData;
64 vm.showDgDeleteCollection = showDgDeleteCollection;
65 vm.showDgDeleteRequests = showDgDeleteRequests;
66 vm.showDgEditCollection = showDgEditCollection;
67 vm.showDgSaveReq = showDgSaveReq;
68 vm.showForm = showForm;
69 vm.toggleCollectionsSort = toggleCollectionsSort;
70 vm.selectOnlyThisRequest = selectOnlyThisRequest;
71 vm.deselectAllRequests = deselectAllRequests;
72 vm.filterCollReq = filterCollReq;
78 * Save request obje to collection from other controller
81 function saveRequestFromExt(event, args) {
82 vm.showDgSaveReq(args.params.event, args.params.reqObj, false);
87 * Clear history requests list and save to storage
89 function clearHistoryList(event) {
91 YangmanDesignService.disableMdMenuItem(event);
93 var confirm = $mdDialog.confirm()
94 .title($filter('translate')('YANGMAN_DELETE_HISTORY_CONFIRM_TITLE'))
95 .textContent($filter('translate')('YANGMAN_DELETE_HISTORY_CONFIRM_TEXT'))
96 .ariaLabel($filter('translate')('YANGMAN_DELETE_HISTORY_CONFIRM_TITLE'))
98 .ok($filter('translate')('YANGMAN_OK'))
99 .cancel($filter('translate')('YANGMAN_CANCEL'));
101 $mdDialog.show(confirm).then(function (){
102 vm.requestList.clear();
103 vm.requestList.saveToStorage();
105 YangmanDesignService.enableMdMenuItem(event);
107 YangmanDesignService.enableMdMenuItem(event);
112 * Clear collections requests list and save to storage
114 function clearCollectionList(event) {
115 var confirm = $mdDialog.confirm()
116 .title($filter('translate')('YANGMAN_DELETE_COLLECTION_CONFIRM_TITLE'))
117 .textContent($filter('translate')('YANGMAN_DELETE_COLLECTION_CONFIRM_TEXT'))
118 .ariaLabel($filter('translate')('YANGMAN_DELETE_COLLECTION_CONFIRM_TITLE'))
120 .ok($filter('translate')('YANGMAN_OK'))
121 .cancel($filter('translate')('YANGMAN_CANCEL'));
123 YangmanDesignService.disableMdMenuItem(event);
125 $mdDialog.show(confirm).then(function (){
126 vm.collectionList.clear();
127 vm.collectionList.saveToStorage();
128 $scope.rootBroadcast('YANGMAN_REFRESH_COLLECTIONS');
129 YangmanDesignService.enableMdMenuItem(event);
131 YangmanDesignService.enableMdMenuItem(event);
136 * Create history request from other ctrl
137 * @param broadcastEvent
140 function saveBcstedHistoryRequest(broadcastEvent, params) {
141 vm.requestList.addItemToList(params.params);
142 vm.requestList.saveToStorage();
144 (params.cbk || angular.noop)();
148 * Clear value of input file used to import collection
149 * todo: move to design utils
151 function clearFileInputValue(){
152 angular.element(document).find('#importCollection').val('');
156 * Importing collection from a file
157 * todo: error handling - msgs for user
158 * @param $fileContent
160 function readCollectionFromFile($fileContent) {
161 var data = $fileContent,
162 checkArray = ['sentData', 'receivedData', 'path', 'collection', 'method', 'status', 'name'];
164 if (data && YangmanService.validateFile(data, checkArray)){
166 vm.collectionList.loadListFromFile(data);
167 vm.collectionList.saveToStorage();
168 $scope.rootBroadcast('YANGMAN_REFRESH_COLLECTIONS');
169 clearFileInputValue();
172 clearFileInputValue();
173 console.error('DataStorage error:', e);
177 clearFileInputValue();
181 function toggleCollectionsSort() {
182 vm.collectionsSortAsc = !vm.collectionsSortAsc;
186 * Export collection to json file
187 * @param {Collection} collection
189 function downloadCollection(collection) {
191 var cListJSON = vm.collectionList.getCollectionInRawJSON(collection.name);
193 YMHandleFileService.downloadFile(collection.name + '.json', cListJSON, 'json', 'charset=utf-8',
196 console.error('ExportCollection error:', e);
202 * Fill request form in right panel with request data
205 function showForm(reqObj) {
206 var data = reqObj.sentData;
208 // exception for get method
209 if ( reqObj.method === 'GET' ) {
210 data = reqObj.receivedData;
211 $scope.rootBroadcast('YANGMAN_SET_CODEMIRROR_DATA_RECEIVED', { data: reqObj.setDataForView(data) });
214 $scope.rootBroadcast('YANGMAN_SET_ERROR_DATA',
215 reqObj.receivedData && reqObj.receivedData.hasOwnProperty('errors') ? reqObj.receivedData : {});
217 $scope.rootBroadcast('YANGMAN_FILL_NODE_FROM_REQ', { requestUrl: reqObj.path, requestData: data },
219 $scope.setRightPanelSection('form');
220 $scope.rootBroadcast('YANGMAN_HEADER_INIT', {
222 method: reqObj.method,
224 status: reqObj.responseStatus,
225 statusText: reqObj.responseStatusText,
226 time: reqObj.responseTime,
231 // prepare data for filling form
232 data = $scope.node.type === 'rpc' ?
233 YangmanService.prepareReceivedData(
242 YangmanService.fillNodeFromResponse($scope.node, data);
243 $scope.node.expanded = true;
252 * Force request header to execute request with data from reqObj
255 function executeRequest(reqObj) {
257 $scope.rootBroadcast('YANGMAN_EXECUTE_WITH_DATA',{ data: reqObj.sentData });
261 * Method for setup data into CM, Header, find api, subapi, node
265 function showData(reqObj, select){
268 method: reqObj.method,
271 // action select request
273 headerObj.statusObj = {
274 status: reqObj.responseStatus,
275 statusText: reqObj.responseStatusText,
276 time: reqObj.responseTime,
279 $scope.rootBroadcast(
280 'YANGMAN_SET_ERROR_DATA',
281 reqObj.receivedData && reqObj.receivedData.hasOwnProperty('errors') ? reqObj.receivedData : {}
285 $scope.setRightPanelSection('req-data');
286 $scope.setJsonView(true, reqObj.method !== 'GET');
288 $scope.rootBroadcast('YANGMAN_HEADER_INIT', headerObj);
289 $scope.rootBroadcast('YANGMAN_FILL_NODE_FROM_REQ', { requestUrl: reqObj.path });
291 $scope.rootBroadcast(
292 'YANGMAN_SET_CODEMIRROR_DATA_RECEIVED',
293 { data: reqObj.setDataForView(reqObj.receivedData) }
296 $scope.rootBroadcast(
297 'YANGMAN_SET_CODEMIRROR_DATA_SENT',
298 { data: reqObj.setDataForView(reqObj.sentData) }
303 * Clear current ctrl search value
305 function clearFilter(){
310 * Dialog for deleting either selected requests or reqObj
315 function showDgDeleteRequests(event, reqObj){
317 var confirm = $mdDialog.confirm()
318 .title($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TITLE'))
319 .textContent($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TEXT'))
320 .ariaLabel($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TITLE'))
322 .ok($filter('translate')('YANGMAN_OK'))
323 .cancel($filter('translate')('YANGMAN_CANCEL'));
325 YangmanDesignService.disableMdMenuItem(event);
327 $mdDialog.show(confirm).then(function (){
329 vm.mainList.deleteRequestItem(reqObj);
332 vm.mainList.getSelectedItems(
333 vm.mainList === vm.collectionList ? filterCollReq : filterReq
334 ).forEach(function (elem){
335 vm.mainList.deleteRequestItem(elem);
338 vm.mainList.saveToStorage();
340 if (vm.mainList === vm.requestList) {
344 refreshCollectionsWithExpansion();
347 YangmanDesignService.enableMdMenuItem(event);
353 * Dialog for deleting collection and refreshing collections
357 function showDgDeleteCollection(ev, collObj){
358 var confirm = $mdDialog.confirm()
359 .title($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TITLE') + ' ' + collObj.name + '?')
360 .textContent($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TEXT'))
361 .ariaLabel($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TITLE'))
363 .ok($filter('translate')('YANGMAN_OK'))
364 .cancel($filter('translate')('YANGMAN_CANCEL'));
366 YangmanDesignService.disableMdMenuItem(ev);
368 $mdDialog.show(confirm).then(function (){
369 vm.collectionList.deleteCollection(collObj);
370 vm.collectionList.saveToStorage();
371 refreshCollectionsWithExpansion();
373 YangmanDesignService.enableMdMenuItem(ev);
378 * Check if reqObj matches current search value
382 function filterReq(reqObj){
383 var searchPhrase = vm.search.toLocaleLowerCase();
384 return reqObj.path.toLowerCase().indexOf(searchPhrase) > -1 ||
385 reqObj.collection.toLowerCase().indexOf(searchPhrase) > -1 ||
386 reqObj.method.toLowerCase() === searchPhrase;
390 * Check if collection name matches current search value or any collection req matches
393 function filterCol(colObj){
394 return filterColName(colObj) || colObj.data.some(filterReq);
398 * Get count of requests matching filter in collection colObj
402 function colMatchingReqsCount(colObj){
403 return colObj.data.filter(vm.filterReq).length;
407 * Check if collection name matches current filter
411 function filterColName(colObj){
412 return colObj.name.toLowerCase().indexOf(vm.search.toLowerCase()) > -1;
419 function fakeFilter(){
425 * Show dialog for saving reqObj to collection (used for duplicate req too)
430 function showDgSaveReq(ev, reqObj, duplicate){
433 controller: SaveReqDialogCtrl,
434 controllerAs: 'dialog',
435 templateUrl: $scope.globalViewPath + 'leftpanel/save-req-dialog.tpl.html',
436 parent: angular.element('#yangmanModule'),
438 clickOutsideToClose: true,
440 requests: reqObj ? [reqObj] : vm.mainList.getSelectedItems(
441 vm.mainList === vm.collectionList ? filterCollReq : filterReq
443 collectionNames: vm.collectionList.getCollectionNames(),
444 duplicate: duplicate || false,
446 }).then(saveRequests);
450 * Add each request from requests array to collectionList and save
453 function saveRequests(requests){
454 requests.forEach(function (reqObj){
455 vm.collectionList.addItemToList(reqObj);
456 vm.collectionList.saveToStorage();
457 refreshCollectionsWithExpansion();
463 * Dialog for editing collection name (used for duplicating collection too)
466 * @param {boolean} duplicate
468 function showDgEditCollection(ev, collection, duplicate){
470 controller: EditCollectionDialogCtrl,
471 controllerAs: 'dialog',
472 templateUrl: $scope.globalViewPath + 'leftpanel/edit-collection-dialog.tpl.html',
473 parent: angular.element('#yangmanModule'),
475 clickOutsideToClose: true,
477 collection: collection,
478 allCollections: vm.collectionList.collections,
479 duplicate: duplicate,
481 }).then(duplicate ? duplicateCollection : changeCollectionName);
486 * @param {array} names 0. element is old name, 1. element is new name
488 function changeCollectionName(names){
489 vm.collectionList.renameCollection(names[0], names[1]);
490 vm.collectionList.saveToStorage();
491 refreshCollectionsWithExpansion();
495 * Create collection duplicate, save and refresh collections
496 * @param {array} names 0. element is old name, 1. element is new name
498 function duplicateCollection(names){
499 vm.collectionList.duplicateCollection(names[0], names[1]);
500 vm.collectionList.saveToStorage();
501 refreshCollectionsWithExpansion();
505 function selectNewestRequest() {
506 vm.mainList.toggleReqSelection(true, vm.mainList.getNewestRequest());
509 function loadCollectionsList() {
510 vm.collectionList.loadListFromStorage();
513 function loadHistoryList() {
514 vm.requestList.loadListFromStorage();
519 * @param mainList collectionList or requestList object
521 function init(mainList){
523 vm.collectionList = RequestsService.createEmptyCollectionList('yangman_collectionsList');
524 // collections are loaded for both history and collections tab
525 loadCollectionsList();
527 vm.requestList = RequestsService.createEmptyHistoryList('yangman_requestsList');
530 // if request was selected, deselect requests in all other instances of RequestsListCtrl
531 $scope.$on('YANGMAN_DESELECT_REQUESTS', function (event, params) {
532 if (params.params.broadcastingCtrl !== vm) {
533 deselectAllRequests();
537 $scope.$on('YANGMAN_REFRESH_COLLECTIONS', loadCollectionsList);
539 // list type dependend operations
540 if (mainList === 'history') {
542 vm.mainList = vm.requestList;
545 $scope.$on('YANGMAN_REFRESH_HISTORY', loadHistoryList);
546 // saving from request header after execution
547 $scope.$on('YANGMAN_SAVE_EXECUTED_REQUEST', saveBcstedHistoryRequest);
548 // select newest request
549 $scope.$on('YANGMAN_SELECT_THE_NEWEST_REQUEST', selectNewestRequest);
552 vm.mainList = vm.collectionList;
553 // saving from request header
554 $scope.$on('YANGMAN_SAVE_REQUEST_TO_COLLECTION', saveRequestFromExt);
555 // saving collections expanded status on refresh
556 $scope.$on('YANGMAN_REFRESH_AND_EXPAND_COLLECTIONS', function(event, params){
557 $scope.rootBroadcast('YANGMAN_REFRESH_COLLECTIONS');
558 (params.cbk || angular.noop)();
568 * Request in list selection
569 * For history reqs it is possible multiselect, thats why event.ctrlKey is used
573 function selectRequest(event, requestObj){
574 $scope.rootBroadcast('YANGMAN_DESELECT_REQUESTS', { broadcastingCtrl: vm });
575 vm.mainList.toggleReqSelection(!event.ctrlKey, requestObj);
577 vm.showData(requestObj, true);
582 * Mark only requestObj in current list as selected
583 * Used for example when user clicks on request submenu
586 function selectOnlyThisRequest(requestObj){
587 vm.mainList.toggleReqSelection(true, requestObj);
591 * Deselect history requests
593 function deselectAllFilteredReqs(){
594 vm.mainList.deselectAllFilteredItems(vm.mainList === vm.collectionList ? filterCollReq : vm.filterReq);
597 function deselectAllRequests() {
598 vm.mainList.deselectAllItems();
602 * Select history requests
604 function selectAllFilteredReqs(){
605 vm.mainList.selectAllFilteredItems(vm.mainList === vm.collectionList ? filterCollReq : vm.filterReq);
609 * Use when selecting filtered requests if they are saved to some collection
610 * Additional filter is if the collection of the request is expanded
612 * @returns {*|boolean}
614 function filterCollReq(request) {
615 return vm.collectionList.getCollection(request.collection).expanded && vm.filterReq(request);
619 * Refresh and expand collections
621 function refreshCollectionsWithExpansion(){
622 var expandedCollNames = vm.collectionList.getExpandedCollectionNames();
623 $scope.rootBroadcast('YANGMAN_REFRESH_AND_EXPAND_COLLECTIONS', null, function (){
624 vm.collectionList.expandCollectionByNames(expandedCollNames);