Skip to content

Commit

Permalink
Jkmarx/avoid duplicate api calls (#3204)
Browse files Browse the repository at this point in the history
* Avoid duplicate calls.

* Add unit tests.
  • Loading branch information
jkmarx committed Feb 8, 2019
1 parent 14e3113 commit fb49ec4
Show file tree
Hide file tree
Showing 8 changed files with 175 additions and 82 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
/**
* User File Browser Files Ctrl
* @namespace UserFileBrowserFilesCtrl
* @desc Main controller for user files data.
* @memberOf refineryApp.refineryUserFileBrowser
*/
(function () {
'use strict';

Expand Down Expand Up @@ -34,28 +40,27 @@
userFileSortsService,
gridOptionsService
) {
gridOptionsService.appScopeProvider = vm;
var promise = $q.defer();
var vm = this;
vm.nodesCount = userFileBrowserFactory.dataSetNodes.nodesCount;
vm.totalNodesCount = userFileBrowserFactory.dataSetNodes.totalNodesCount;
vm.downloadCsv = downloadCsv;
vm.downloadCsvQuery = downloadCsvQuery;
vm.refreshUserFiles = refreshUserFiles;
vm.gridOptions = gridOptionsService;
vm.nodesCount = userFileBrowserFactory.dataSetNodes.nodesCount;
vm.sortChanged = sortChanged;
vm.totalNodesCount = userFileBrowserFactory.dataSetNodes.totalNodesCount;

var promise = $q.defer();
var getUserFiles = userFileBrowserFactory.getUserFiles;
getUserFiles().then(function (solr) {
gridOptionsService.columnDefs = userFileBrowserFactory.createColumnDefs(
cullEmptyAttributes(solr.facet_field_counts)
);
userFileBrowserFactory.dataSetNodes.nodesCount = solr.nodes.length;
userFileBrowserFactory.dataSetNodes.totalNodesCount = solr.nodes_count;

gridOptionsService.data = userFileBrowserFactory.createData(solr.nodes);
promise.resolve();
}, function () {
$log.error('/files/ request failed');
promise.reject();
});
activate();

/*
* ---------------------------------------------------------
* Methods Definitions
* ---------------------------------------------------------
*/
function activate () {
refreshUserFiles();
}
// helper method to cull out attributes with no fields
function cullEmptyAttributes (facetCountObj) {
_.each(facetCountObj, function (counts, facetName) {
Expand All @@ -67,40 +72,6 @@
return _.keys(facetCountObj).concat('date_submitted', 'sample_name', 'name');
}

vm.sortChanged = function (grid, sortColumns) {
var sortUrlParam = 'sort';
var directionUrlParam = 'direction';
if (typeof sortColumns !== 'undefined' && sortColumns.length > 0) {
// NOTE: With the current config, you can only sort on one column
var column = sortColumns[0];
// If a hash is used with $location.search, it clears all params
$location.search(sortUrlParam, column.field);
$location.search(directionUrlParam, column.sort.direction);
userFileSortsService.fields[0] = {
name: column.field,
direction: column.sort.direction
};

// TODO: This is copy-and-paste
getUserFiles().then(function (solr) {
// TODO: Should there be something that wraps up this "then"? It is repeated.
// gridOptionsService.columnDefs = userFileBrowserFactory.createColumnDefs();
gridOptionsService.data = userFileBrowserFactory.createData(solr.nodes);
userFileBrowserFactory.dataSetNodes.nodesCount = solr.nodes.length;
userFileBrowserFactory.dataSetNodes.totalNodesCount = solr.nodes_count;
promise.resolve();
}, function () {
$log.error('/files/ request failed');
promise.reject();
});
} else {
$location.search(sortUrlParam, null);
$location.search(directionUrlParam, null);
}
};

gridOptionsService.appScopeProvider = vm;

/**
* @name downloadCsv
* @desc VM method used to interact with the `/files_download`
Expand All @@ -125,11 +96,65 @@
});
}

vm.gridOptions = gridOptionsService;
vm.gridOptions.onRegisterApi = function (api) {
api.core.on.sortChanged(null, vm.sortChanged);
};

/**
* @name refreshUserFiles
* @desc Uses service to update the data in grid
* @memberOf refineryUserFileBrowser.refreshUserFiles
**/
function refreshUserFiles () {
userFileBrowserFactory.getUserFiles().then(function (solr) {
gridOptionsService.columnDefs = userFileBrowserFactory.createColumnDefs(
cullEmptyAttributes(solr.facet_field_counts)
);
userFileBrowserFactory.dataSetNodes.nodesCount = solr.nodes.length;
userFileBrowserFactory.dataSetNodes.totalNodesCount = solr.nodes_count;

gridOptionsService.data = userFileBrowserFactory.createData(solr.nodes);
promise.resolve();
}, function () {
$log.error('/files/ request failed');
promise.reject();
});
}

function sortChanged (grid, sortColumns) {
var sortUrlParam = 'sort';
var directionUrlParam = 'direction';
if (typeof sortColumns !== 'undefined' && sortColumns.length > 0) {
// NOTE: With the current config, you can only sort on one column
var column = sortColumns[0];
// If a hash is used with $location.search, it clears all params
$location.search(sortUrlParam, column.field);
$location.search(directionUrlParam, column.sort.direction);
userFileSortsService.fields[0] = {
name: column.field,
direction: column.sort.direction
};

refreshUserFiles.getUserFiles().then(function (solr) {
gridOptionsService.data = userFileBrowserFactory.createData(solr.nodes);
userFileBrowserFactory.dataSetNodes.nodesCount = solr.nodes.length;
userFileBrowserFactory.dataSetNodes.totalNodesCount = solr.nodes_count;
promise.resolve();
}, function () {
$log.error('/files/ request failed');
promise.reject();
});
} else {
$location.search(sortUrlParam, null);
$location.search(directionUrlParam, null);
}
}

/*
* ---------------------------------------------------------
* Watchers
* ---------------------------------------------------------
*/
$scope.$watchCollection(
function () {
return userFileBrowserFactory.dataSetNodes;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

describe('Controller: UserFileBrowserFilesCtrl', function () {
var ctrl;
var factory;
var scope;
var window;

Expand All @@ -12,8 +13,10 @@
beforeEach(inject(function (
$controller,
$rootScope,
$window
$window,
userFileBrowserFactory
) {
factory = userFileBrowserFactory;
scope = $rootScope.$new();
window = $window;
ctrl = $controller('UserFileBrowserFilesCtrl', {
Expand Down Expand Up @@ -50,5 +53,21 @@
'/files_download?filter_attribute=%7B%7D&limit=100000000&sort='
);
});

describe('refreshUserFiles', function () {
it('called the correct service', function () {
var mockServiceResponse = false;
spyOn(factory, 'getUserFiles').and.callFake(function () {
return {
then: function () {
mockServiceResponse = true;
}
};
});
expect(mockServiceResponse).toEqual(false);
ctrl.refreshUserFiles();
expect(mockServiceResponse).toEqual(true);
});
});
});
})();
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
/**
* User File Browser Filters Ctrl
* @namespace UserFileBrowserFiltersCtrl
* @desc Main controller for user files filter.
* @memberOf refineryApp.refineryUserFileBrowser
*/
(function () {
'use strict';

Expand All @@ -9,6 +15,7 @@
'$location',
'$log',
'$q',
'$scope',
'settings',
'gridOptionsService',
'userFileBrowserFactory',
Expand All @@ -20,20 +27,31 @@
$location,
$log,
$q,
$scope,
settings,
gridOptionsService,
userFileBrowserFactory,
userFileFiltersService,
userFileSortsService
) {
var direction;
var promise = $q.defer();
var sort;
var vm = this;
vm.attributeFilters = userFileBrowserFactory.attributeFilters;
vm.foldedDown = {};
// sync the attribute filter order with grid column order
vm.orderColumns = settings.djangoApp.userFilesColumns;

/*
* ---------------------------------------------------------
* Methods Definitions
* ---------------------------------------------------------
*/
vm.togglePanel = function (attribute) {
vm.foldedDown[attribute] = ! vm.foldedDown[attribute];
};

vm.foldedDown = {};
vm.isDown = function (attribute, search) {
var attributeObj = vm.attributeFilters[attribute];
return vm.foldedDown[attribute] ||
Expand All @@ -49,8 +67,7 @@
var set = filterSet(attribute, value);
$location.search(attribute, set);

getUserFiles().then(function (solr) {
// TODO: Should there be something that wraps up this "then"? It is repeated.
userFileBrowserFactory.getUserFiles().then(function (solr) {
vm.attributeFilters =
userFileBrowserFactory.createFilters(solr.facet_field_counts);

Expand Down Expand Up @@ -84,8 +101,6 @@
return set;
}

var sort;
var direction;
angular.forEach($location.search(), function (values, key) {
if (key === 'sort') {
sort = values;
Expand All @@ -108,15 +123,15 @@
};
}

var promise = $q.defer();
var getUserFiles = userFileBrowserFactory.getUserFiles;

getUserFiles().then(function (solr) {
vm.attributeFilters = userFileBrowserFactory.createFilters(solr.facet_field_counts);
promise.resolve();
}, function () {
$log.error('/files/ request failed');
promise.reject();
/*
* ---------------------------------------------------------
* Watchers
* ---------------------------------------------------------
*/
$scope.$watchCollection(function () {
return userFileBrowserFactory.attributeFilters;
}, function (updatedFilters) {
vm.attributeFilters = updatedFilters;
});
}
})();
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
(function () {
'use strict';

describe('Controller: UserFileBrowserFiltersCtrl', function () {
var ctrl;
var factory;
var scope;

beforeEach(module('refineryApp'));
beforeEach(module('refineryUserFileBrowser'));
beforeEach(inject(function (
$controller,
$rootScope,
$window,
settings,
userFileBrowserFactory
) {
factory = userFileBrowserFactory;
scope = $rootScope.$new();
settings.djangoApp.userFilesColumns = '';

ctrl = $controller('UserFileBrowserFiltersCtrl', {
$scope: scope
});
}));

it('ctrl should exist', function () {
expect(ctrl).toBeDefined();
});

it('view variables should be initialized', function () {
expect(ctrl.attributeFilters).toEqual([]);
expect(ctrl.foldedDown).toEqual({});
expect(ctrl.orderColumns).toEqual('');
});

it('watches factory attributeFilters and updates', function () {
var mockAttributes = [{ name: 'Test Attribute' }];
angular.copy(mockAttributes, factory.attributeFilters);
expect(ctrl.attributeFilters).toEqual(mockAttributes);
});
});
})();
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
angular
.module('refineryUserFileBrowser')
.component('rpUserFileBrowser', {
controller: 'UserFileBrowserCtrl',
templateUrl: ['$window', function ($window) {
return $window.getStaticUrl('partials/user-file-browser/views/user-file-browser.html');
}]
Expand Down
6 changes: 4 additions & 2 deletions refinery/ui/source/js/user-file-browser/services/factory.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@
nodesCount: 0,
totalNodesCount: 0
};
var attributeFilters = [];
var URL = 'url';

var service = {
attributeFilters: attributeFilters,
createColumnDefs: createColumnDefs,
createData: createData,
createFilters: createFilters,
Expand Down Expand Up @@ -136,8 +138,8 @@

function getUserFiles () {
var userFile = userFileService.query();
userFile.$promise.then(function (/* response */) {
// TODO: addNodeDetailtoUserFiles();
userFile.$promise.then(function (response) {
angular.copy(createFilters(response.facet_field_counts), attributeFilters);
}, function (error) {
$log.error(error);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

it('factory and tools variables should exist', function () {
expect(factory).toBeDefined();
expect(factory.attributeFilters).toEqual([]);
expect(factory.dataSetNodes).toEqual({ nodesCount: 0, totalNodesCount: 0 });
});

describe('createData', function () {
Expand Down

0 comments on commit fb49ec4

Please sign in to comment.