2 'app/yangman/controllers/save-req-dialog.controller',
3 'app/yangman/controllers/edit-collection-dialog.controller',
4 'app/yangman/controllers/history-settings.controller',
5 'app/yangman/services/handle-file.services',
6 ], function (SaveReqDialogCtrl, EditCollectionDialogCtrl, HistorySettingsCtrl) {
9 angular.module('app.yangman').controller('RequestsListCtrl', RequestsListCtrl);
11 RequestsListCtrl.$inject = [
12 '$filter', '$mdDialog', '$scope', 'YMHandleFileService', 'PathUtilsService', 'RequestsService', 'YangmanService',
13 'YangmanDesignService', 'constants',
17 * Controller for requests lists, means History requests and Collections requests
21 * @param YMHandleFileService
22 * @param PathUtilsService
23 * @param RequestsService
24 * @param YangmanService
25 * @param YangmanDesignService
28 function RequestsListCtrl($filter, $mdDialog, $scope, YMHandleFileService, PathUtilsService, RequestsService,
29 YangmanService, YangmanDesignService, constants) {
32 vm.collectionList = null;
33 vm.constants = constants;
35 vm.requestList = null;
37 vm.collectionsSortAsc = true;
40 vm.clearCollectionList = clearCollectionList;
41 vm.clearFilter = clearFilter;
42 vm.clearHistoryList = clearHistoryList;
43 vm.colMatchingReqsCount = colMatchingReqsCount;
44 vm.deselectAllFilteredRequests = deselectAllFilteredReqs;
45 vm.downloadCollection = downloadCollection;
46 vm.executeRequest = executeRequest;
47 vm.fakeFilter = fakeFilter;
48 vm.filterCol = filterCol;
49 vm.filterColName = filterColName;
50 vm.filterReq = filterReq;
52 vm.readCollectionFromFile = readCollectionFromFile;
53 vm.selectAllFilteredRequests = selectAllFilteredReqs;
54 vm.selectRequest = selectRequest;
55 vm.showData = showData;
56 vm.showDgDeleteCollection = showDgDeleteCollection;
57 vm.showDgDeleteRequests = showDgDeleteRequests;
58 vm.showDgEditCollection = showDgEditCollection;
59 vm.showDgSaveReq = showDgSaveReq;
60 vm.showHistorySettings = showHistorySettings;
61 vm.showForm = showForm;
62 vm.toggleCollectionsSort = toggleCollectionsSort;
63 vm.selectOnlyThisRequest = selectOnlyThisRequest;
64 vm.deselectAllRequests = deselectAllRequests;
65 vm.filterCollReq = filterCollReq;
68 * Save request obje to collection from other controller
71 function saveRequestFromExt(event, args) {
72 vm.showDgSaveReq(args.params.event, args.params.reqObj, false);
77 * Clear history requests list and save to storage
79 function clearHistoryList(event) {
81 YangmanDesignService.disableMdMenuItem(event);
83 var confirm = $mdDialog.confirm()
84 .title($filter('translate')('YANGMAN_DELETE_HISTORY_CONFIRM_TITLE'))
85 .textContent($filter('translate')('YANGMAN_DELETE_HISTORY_CONFIRM_TEXT'))
86 .ariaLabel($filter('translate')('YANGMAN_DELETE_HISTORY_CONFIRM_TITLE'))
88 .ok($filter('translate')('YANGMAN_OK'))
89 .cancel($filter('translate')('YANGMAN_CANCEL'));
91 $mdDialog.show(confirm).then(function (){
92 vm.requestList.clear();
93 vm.requestList.saveToStorage();
95 YangmanDesignService.enableMdMenuItem(event);
97 YangmanDesignService.enableMdMenuItem(event);
102 * Clear collections requests list and save to storage
104 function clearCollectionList(event) {
105 var confirm = $mdDialog.confirm()
106 .title($filter('translate')('YANGMAN_DELETE_COLLECTION_CONFIRM_TITLE'))
107 .textContent($filter('translate')('YANGMAN_DELETE_COLLECTION_CONFIRM_TEXT'))
108 .ariaLabel($filter('translate')('YANGMAN_DELETE_COLLECTION_CONFIRM_TITLE'))
110 .ok($filter('translate')('YANGMAN_OK'))
111 .cancel($filter('translate')('YANGMAN_CANCEL'));
113 YangmanDesignService.disableMdMenuItem(event);
115 $mdDialog.show(confirm).then(function (){
116 vm.collectionList.clear();
117 vm.collectionList.saveToStorage();
118 $scope.rootBroadcast(constants.YANGMAN_REFRESH_COLLECTIONS);
119 YangmanDesignService.enableMdMenuItem(event);
121 YangmanDesignService.enableMdMenuItem(event);
126 * Create history request from other ctrl
127 * @param broadcastEvent
130 function saveBcstedHistoryRequest(broadcastEvent, params) {
131 vm.requestList.addItemToList(params.params);
132 vm.requestList.saveToStorage();
133 (params.cbk || angular.noop)();
137 * Clear value of input file used to import collection
139 function clearFileInputValue(){
140 angular.element(document).find('#importCollection').val('');
144 * Importing collection from a file
145 * @param $fileContent
147 function readCollectionFromFile($fileContent) {
148 var data = $fileContent;
150 if (data && YangmanService.validateFile(data, constants.COLLECTION_CHECK_ARRAY)){
152 vm.collectionList.loadListFromFile(data);
153 vm.collectionList.saveToStorage();
154 $scope.rootBroadcast(constants.YANGMAN_REFRESH_COLLECTIONS);
155 clearFileInputValue();
158 clearFileInputValue();
159 console.error('DataStorage error:', e);
163 clearFileInputValue();
165 removeButtonBackground();
167 function removeButtonBackground() {
168 $('#importCollection').next().css({ 'background': 'transparent' });
172 function toggleCollectionsSort() {
173 vm.collectionsSortAsc = !vm.collectionsSortAsc;
177 * Export collection to json file
178 * @param {Collection} collection
180 function downloadCollection(collection) {
182 var cListJSON = vm.collectionList.getCollectionInRawJSON(collection.name);
184 YMHandleFileService.downloadFile(collection.name + '.json', cListJSON, 'json', 'charset=utf-8',
187 console.error('ExportCollection error:', e);
193 * Fill request form in right panel with request data
195 * @param preventFillingWithReceived
197 function showForm(reqObj, preventFillingWithReceived) {
198 var data = reqObj.sentData;
200 if ($scope.historySettings.data.fillWithReceived && !preventFillingWithReceived) {
201 data = reqObj.receivedData;
204 $scope.rootBroadcast(
205 constants.YANGMAN_SET_CODEMIRROR_DATA_RECEIVED, { data: reqObj.setDataForView(reqObj.receivedData) }
207 $scope.rootBroadcast(
208 constants.YANGMAN_SET_CODEMIRROR_DATA_SENT, { data: reqObj.setDataForView(reqObj.sentData) }
211 $scope.rootBroadcast(constants.YANGMAN_SET_ERROR_DATA,
212 reqObj.receivedData && reqObj.receivedData.hasOwnProperty('errors') ? reqObj.receivedData : {});
214 $scope.rootBroadcast(constants.YANGMAN_FILL_NODE_FROM_REQ, { requestUrl: reqObj.path, requestData: data },
216 $scope.setRightPanelSection(constants.DISPLAY_TYPE_FORM);
217 $scope.rootBroadcast(constants.YANGMAN_HEADER_INIT, {
219 method: reqObj.method,
221 status: reqObj.responseStatus,
222 statusText: reqObj.responseStatusText,
223 time: reqObj.responseTime,
228 // prepare data for filling form
229 if ($scope.node.type === constants.NODE_RPC && $scope.historySettings.data.fillWithReceived) {
230 data = YangmanService.prepareReceivedData(
235 constants.DISPLAY_TYPE_FORM
240 YangmanService.fillNodeFromResponse($scope.node, data);
241 $scope.node.expanded = true;
250 * Force request header to execute request with data from reqObj
253 function executeRequest(reqObj) {
254 if ($scope.rightPanelSection === constants.DISPLAY_TYPE_FORM) {
255 showForm(reqObj, true);
260 $scope.rootBroadcast(constants.YANGMAN_EXECUTE_WITH_DATA,{ data: reqObj.sentData });
264 * Method for setup data into CM, Header, find api, subapi, node
268 function showData(reqObj, select){
271 method: reqObj.method,
274 // action select request
276 headerObj.statusObj = {
277 status: reqObj.responseStatus,
278 statusText: reqObj.responseStatusText,
279 time: reqObj.responseTime,
282 $scope.rootBroadcast(
283 constants.YANGMAN_SET_ERROR_DATA,
284 reqObj.receivedData && reqObj.receivedData.hasOwnProperty('errors') ? reqObj.receivedData : {}
288 $scope.setRightPanelSection(constants.DISPLAY_TYPE_REQ_DATA);
289 $scope.setJsonView(true, reqObj.method !== constants.OPERATION_GET);
291 $scope.rootBroadcast(constants.YANGMAN_HEADER_INIT, headerObj);
292 $scope.rootBroadcast(constants.YANGMAN_FILL_NODE_FROM_REQ, { requestUrl: reqObj.path });
294 $scope.rootBroadcast(
295 constants.YANGMAN_SET_CODEMIRROR_DATA_RECEIVED,
296 { data: reqObj.setDataForView(reqObj.receivedData) }
299 $scope.rootBroadcast(
300 constants.YANGMAN_SET_CODEMIRROR_DATA_SENT,
301 { data: reqObj.setDataForView(reqObj.sentData) }
306 * Clear current ctrl search value
308 function clearFilter(){
313 * Dialog for deleting either selected requests or reqObj
318 function showDgDeleteRequests(event, reqObj){
320 var confirm = $mdDialog.confirm()
321 .title($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TITLE'))
322 .textContent($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TEXT'))
323 .ariaLabel($filter('translate')('YANGMAN_DELETE_REQ_CONFIRM_TITLE'))
325 .ok($filter('translate')('YANGMAN_OK'))
326 .cancel($filter('translate')('YANGMAN_CANCEL'));
328 YangmanDesignService.disableMdMenuItem(event);
330 $mdDialog.show(confirm).then(function (){
332 vm.mainList.deleteRequestItem(reqObj);
335 vm.mainList.getSelectedItems(
336 vm.mainList === vm.collectionList ? filterCollReq : filterReq
337 ).forEach(function (elem){
338 vm.mainList.deleteRequestItem(elem);
341 vm.mainList.saveToStorage();
343 if (vm.mainList === vm.requestList) {
347 refreshCollectionsWithExpansion();
350 YangmanDesignService.enableMdMenuItem(event);
356 * Dialog for deleting collection and refreshing collections
360 function showDgDeleteCollection(ev, collObj){
361 var confirm = $mdDialog.confirm()
362 .title($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TITLE') + ' ' + collObj.name + '?')
363 .textContent($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TEXT'))
364 .ariaLabel($filter('translate')('YANGMAN_DELETE_COL_CONFIRM_TITLE'))
366 .ok($filter('translate')('YANGMAN_OK'))
367 .cancel($filter('translate')('YANGMAN_CANCEL'));
369 YangmanDesignService.disableMdMenuItem(ev);
371 $mdDialog.show(confirm).then(function (){
372 vm.collectionList.deleteCollection(collObj);
373 vm.collectionList.saveToStorage();
374 refreshCollectionsWithExpansion();
376 YangmanDesignService.enableMdMenuItem(ev);
381 * Check if reqObj matches current search value
385 function filterReq(reqObj){
386 var searchPhrase = vm.search.toLocaleLowerCase();
387 return reqObj.path.toLowerCase().indexOf(searchPhrase) > -1 ||
388 reqObj.collection.toLowerCase().indexOf(searchPhrase) > -1 ||
389 reqObj.method.toLowerCase() === searchPhrase;
393 * Check if collection name matches current search value or any collection req matches
396 function filterCol(colObj){
397 return filterColName(colObj) || colObj.data.some(filterReq);
401 * Get count of requests matching filter in collection colObj
405 function colMatchingReqsCount(colObj){
406 return colObj.data.filter(vm.filterReq).length;
410 * Check if collection name matches current filter
414 function filterColName(colObj){
415 return colObj.name.toLowerCase().indexOf(vm.search.toLowerCase()) > -1;
422 function fakeFilter(){
428 * Show dialog for saving reqObj to collection (used for duplicate req too)
433 function showDgSaveReq(ev, reqObj, duplicate){
436 controller: SaveReqDialogCtrl,
437 controllerAs: 'dialog',
438 templateUrl: $scope.globalViewPath + 'leftpanel/save-req-dialog.tpl.html',
439 parent: angular.element('#yangmanModule'),
441 clickOutsideToClose: true,
443 requests: reqObj ? [reqObj] : vm.mainList.getSelectedItems(
444 vm.mainList === vm.collectionList ? filterCollReq : filterReq
446 collectionNames: vm.collectionList.getCollectionNames(),
447 duplicate: duplicate || false,
449 }).then(saveRequests);
453 * Show popup window for history requests settings
456 function showHistorySettings(ev){
459 controller: HistorySettingsCtrl,
460 controllerAs: 'settingsCtrl',
461 templateUrl: $scope.globalViewPath + 'leftpanel/history-settings.tpl.html',
462 parent: angular.element('#yangmanModule'),
464 clickOutsideToClose: true,
466 settingsObj: $scope.historySettings,
468 }).then(function (changedSettings){
469 $scope.historySettings.setData(changedSettings.data);
470 $scope.rootBroadcast(constants.YANGMAN_RESET_HISTORY_SETTINGS);
475 * Add each request from requests array to collectionList and save
478 function saveRequests(requests){
479 requests.forEach(function (reqObj){
480 vm.collectionList.addItemToList(RequestsService.clearUnnecessaryProperties(reqObj.clone()));
481 vm.collectionList.saveToStorage();
482 refreshCollectionsWithExpansion();
488 * Dialog for editing collection name (used for duplicating collection too)
491 * @param {boolean} duplicate
493 function showDgEditCollection(ev, collection, duplicate){
495 controller: EditCollectionDialogCtrl,
496 controllerAs: 'dialog',
497 templateUrl: $scope.globalViewPath + 'leftpanel/edit-collection-dialog.tpl.html',
498 parent: angular.element('#yangmanModule'),
500 clickOutsideToClose: true,
502 collection: collection,
503 allCollections: vm.collectionList.collections,
504 duplicate: duplicate,
506 }).then(duplicate ? duplicateCollection : changeCollectionName);
511 * @param {array} names 0. element is old name, 1. element is new name
513 function changeCollectionName(names){
514 vm.collectionList.renameCollection(names[0], names[1]);
515 vm.collectionList.saveToStorage();
516 refreshCollectionsWithExpansion();
520 * Create collection duplicate, save and refresh collections
521 * @param {array} names 0. element is old name, 1. element is new name
523 function duplicateCollection(names){
524 vm.collectionList.duplicateCollection(names[0], names[1]);
525 vm.collectionList.saveToStorage();
526 refreshCollectionsWithExpansion();
530 function selectNewestRequest() {
531 vm.mainList.toggleReqSelection(true, vm.mainList.getNewestRequest());
534 function loadCollectionsList() {
535 vm.collectionList.loadListFromStorage();
538 function loadHistoryList() {
539 vm.requestList.loadListFromStorage();
544 * @param mainList collectionList or requestList object
546 function init(mainList){
548 vm.collectionList = RequestsService.createEmptyCollectionList('yangman_collectionsList');
549 // collections are loaded for both history and collections tab
550 loadCollectionsList();
552 vm.requestList = RequestsService.createEmptyHistoryList('yangman_requestsList', $scope.historySettings);
554 $scope.$on(constants.YANGMAN_RESET_HISTORY_SETTINGS, function () {
555 vm.requestList.setSettings($scope.historySettings);
558 // if request was selected, deselect requests in all other instances of RequestsListCtrl
559 $scope.$on(constants.YANGMAN_DESELECT_REQUESTS, function (event, params) {
560 if (params.params.broadcastingCtrl !== vm) {
561 deselectAllRequests();
565 $scope.$on(constants.YANGMAN_REFRESH_COLLECTIONS, function (event, params){
566 loadCollectionsList();
567 (params.cbk || angular.noop)();
570 // list type dependend operations
571 if (mainList === 'history') {
573 vm.mainList = vm.requestList;
576 $scope.$on(constants.YANGMAN_REFRESH_HISTORY, loadHistoryList);
577 // saving from request header after execution
578 $scope.$on(constants.YANGMAN_SAVE_EXECUTED_REQUEST, saveBcstedHistoryRequest);
579 // select newest request
580 $scope.$on(constants.YANGMAN_SELECT_THE_NEWEST_REQUEST, selectNewestRequest);
583 vm.mainList = vm.collectionList;
584 // saving from request header
585 $scope.$on(constants.YANGMAN_SAVE_REQUEST_TO_COLLECTION, saveRequestFromExt);
586 // saving collections expanded status on refresh
587 $scope.$on(constants.YANGMAN_REFRESH_AND_EXPAND_COLLECTIONS, function(){
588 var expandedColNames = vm.collectionList.getExpandedCollectionNames();
589 $scope.rootBroadcast(constants.YANGMAN_REFRESH_COLLECTIONS, {}, function (){
590 vm.collectionList.expandCollectionByNames(expandedColNames);
599 * Request in list selection
600 * For history reqs it is possible multiselect, thats why event.ctrlKey is used
604 function selectRequest(event, requestObj){
605 console.debug('selected', requestObj);
607 $scope.rootBroadcast(constants.YANGMAN_DESELECT_REQUESTS, { broadcastingCtrl: vm });
608 vm.mainList.toggleReqSelection(!event.ctrlKey, requestObj);
610 if ($scope.rightPanelSection === constants.DISPLAY_TYPE_FORM) {
611 vm.showForm(requestObj);
614 vm.showData(requestObj, true);
620 * Mark only requestObj in current list as selected
621 * Used for example when user clicks on request submenu
624 function selectOnlyThisRequest(requestObj){
625 vm.mainList.toggleReqSelection(true, requestObj);
629 * Deselect history requests
631 function deselectAllFilteredReqs(){
632 vm.mainList.deselectAllFilteredItems(vm.mainList === vm.collectionList ? filterCollReq : vm.filterReq);
635 function deselectAllRequests() {
636 vm.mainList.deselectAllItems();
640 * Select history requests
642 function selectAllFilteredReqs(){
643 vm.mainList.selectAllFilteredItems(vm.mainList === vm.collectionList ? filterCollReq : vm.filterReq);
647 * Use when selecting filtered requests if they are saved to some collection
648 * Additional filter is if the collection of the request is expanded
650 * @returns {*|boolean}
652 function filterCollReq(request) {
653 return vm.collectionList.getCollection(request.collection).expanded && vm.filterReq(request);
657 * Refresh and expand collections
659 function refreshCollectionsWithExpansion(){
660 $scope.rootBroadcast(constants.YANGMAN_REFRESH_AND_EXPAND_COLLECTIONS);