Skip to content

Commit

Permalink
Merge pull request #1234 from parklab/jkmarx/data-set2-select-all-update
Browse files Browse the repository at this point in the history
Jkmarx/data set2 select all update
  • Loading branch information
jkmarx committed Jul 12, 2016
2 parents 5388f2d + 5ada876 commit ec43d5b
Show file tree
Hide file tree
Showing 9 changed files with 131 additions and 42 deletions.
6 changes: 2 additions & 4 deletions refinery/core/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1566,11 +1566,10 @@ def test_get_invalid_format_uuid(self):

def test_post_valid_form(self):
# valid form
nodes_str = (',').join(self.nodes_list_uuid)
new_node_group = {'name': 'Test Group3',
'assay': self.assay.uuid,
'study': self.study.uuid,
'nodes': nodes_str
'nodes': self.nodes_list_uuid
}
request = self.factory.post('%s/' % self.url_root, new_node_group)
response = self.view(request)
Expand All @@ -1592,10 +1591,9 @@ def test_post_invalid_form(self):

def test_put_valid_uuid_and_valid_input(self):
# valid uuid and valid input
nodes_str = (',').join(self.nodes_list_uuid)
request = self.factory.put('%s/' % self.url_root,
{'uuid': self.node_group_2.uuid,
'nodes': nodes_str,
'nodes': self.nodes_list_uuid,
'is_current': True})
response = self.view(request)
self.assertEqual(response.status_code, 202)
Expand Down
2 changes: 1 addition & 1 deletion refinery/core/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -767,7 +767,7 @@ def filter_nodes_uuids_in_solr(assay_uuid, filter_out_uuids=[]):
is default for all node_group list
:param assay_uuid: unicode, string
:param filter_out_uuids: unicode, string
:param filter_out_uuids: array of unicode, string
:return: List of uuids
"""
# Params required to filter solr_request to just get uuids for nodes
Expand Down
74 changes: 46 additions & 28 deletions refinery/core/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -1060,6 +1060,10 @@ class NodeGroups(APIView):
type: string
POST:
consumes:
- application/json
produces:
- application/json
parameters:
- name: name
description: Name of node group
Expand Down Expand Up @@ -1089,10 +1093,7 @@ class NodeGroups(APIView):
description: uuids of nodes in group expect format uuid,uuid,uuid
paramType: form
type: array
items:
type: string
required: false
collectionFormat: multi
- name: use_complement_nodes
description: True will subtract nodes from all assay file nodes
Expand Down Expand Up @@ -1122,7 +1123,7 @@ class NodeGroups(APIView):
- name: nodes
description: Uuids of nodes in group expect format uuid,uuid,uuid
paramType: form
type: string
type: array
required: false
- name: use_complement_nodes
Expand Down Expand Up @@ -1163,22 +1164,31 @@ def get(self, request, format=None):

def post(self, request, format=None):
# Swagger issue: put/post queryDict, make data mutable to update nodes
request.data._mutable = True
if request.data.get('nodes') and isinstance(request.data.get(
'nodes'), unicode):
nodes_uuid_list = request.data.get('nodes').replace(" ", "").split(
',')
request.data.setlist('nodes', nodes_uuid_list)
# Convert to dict for ease
if 'form-urlencoded' in request.content_type:
param_dict = {}
for key in request.data:

if key == 'nodes':
param_dict[key] = request.data.get(
key).replace(' ', '').split(',')
elif key == 'use_complement_nodes':
# correct type to boolean, used in conditional below
param_dict[key] = json.loads(request.data.get(key))
else:
param_dict[key] = request.data.get(key)
else:
param_dict = request.data

# Nodes list updated with remaining nodes after subtraction
if request.data.get('use_complement_nodes') == 'true':
if param_dict.get('use_complement_nodes'):
filtered_uuid_list = filter_nodes_uuids_in_solr(
request.data.get('assay'),
request.data.get('use_complement_nodes')
param_dict.get('assay'),
param_dict.get('nodes')
)
request.data.setlist('nodes', filtered_uuid_list)
param_dict['nodes'] = filtered_uuid_list

serializer = NodeGroupSerializer(data=request.data)
serializer = NodeGroupSerializer(data=param_dict)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
Expand All @@ -1191,23 +1201,31 @@ def put(self, request, format=None):
return Response(status=status.HTTP_400_BAD_REQUEST)

# Swagger issue: put/post queryDict, make data mutable to update nodes
request.data._mutable = True
if request.data.get('nodes') and isinstance(request.data.get(
'nodes'), unicode):
nodes_uuid_list = request.data.get('nodes').replace(" ", "").split(
',')
request.data.setlist('nodes', nodes_uuid_list)
# Convert to dict for ease
if 'form-urlencoded' in request.content_type:
param_dict = {}
for key in request.data:

if key == 'nodes':
param_dict[key] = request.data.get(
key).replace(' ', '').split(',')
elif key == 'use_complement_nodes':
# correct type to boolean, used in conditional below
param_dict[key] = json.loads(request.data.get(key))
else:
param_dict[key] = request.data.get(key)
else:
param_dict = request.data

# Nodes list updated with remaining nodes after subtraction
if request.data.get('use_complement_nodes'):
uuid_list = filter_nodes_uuids_in_solr(
request.data.get('assay'),
request.data.get('use_complement_nodes')
if param_dict.get('use_complement_nodes'):
filtered_uuid_list = filter_nodes_uuids_in_solr(
param_dict.get('assay'),
param_dict.get('nodes')
)
request.data.setlist('nodes', uuid_list)

param_dict['nodes'] = filtered_uuid_list
node_group = self.get_object(uuid)
serializer = NodeGroupSerializer(node_group, data=request.data,
serializer = NodeGroupSerializer(node_group, data=param_dict,
partial=True)
if serializer.is_valid():
serializer.save()
Expand Down
4 changes: 4 additions & 0 deletions refinery/ui/source/js/commons/services/node_group.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ angular
type: string list, uuids
@params: is_current
type: boolen
@params: use_complement_nodes
type: boolen
*/
update: {
method: 'PUT'
Expand All @@ -51,6 +53,8 @@ angular
type: string list, uuids
@params: is_current
type: boolen
@params: use_complement_nodes
type: boolen
*/
save: {
method: 'POST'
Expand Down
20 changes: 14 additions & 6 deletions refinery/ui/source/js/file-browser/ctrls/ctrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -152,16 +152,24 @@ function FileBrowserCtrl (
vm.sortChanged(vm.gridApi.grid, [vm.gridOptions.columnDefs[1]]);

// Checkbox selection events
vm.gridApi.selection.on.rowSelectionChanged(null, function () {
vm.gridApi.selection.on.rowSelectionChanged(null, function (row) {
selectedNodesService.setSelectedNodes(gridApi.selection.getSelectedRows());
vm.selectNodesCount = selectedNodesService.selectedNodes.length;
selectedNodesService.getUuidsFromSelectedNodesInUI();
if (selectedNodesService.selectedAllFlag) {
selectedNodesService.setComplementSeletedNodes(row.entity.uuid);
}
});

// update node service selected node which is shared by nodeGroupCtrl
vm.gridApi.selection.on.rowSelectionChangedBatch(null, function () {
selectedNodesService.setSelectedNodes(gridApi.selection.getSelectedRows());
vm.selectNodesCount = selectedNodesService.selectedNodes.length;
// Event only occurs when checkbox is selected. Checking the first row
// selected, ensures it's a true select all
vm.gridApi.selection.on.rowSelectionChangedBatch(null, function (eventRows) {
if (eventRows[0].isSelected) {
selectedNodesService.setSelectedAllFlags(true);
// Need to manually set vm.selectNodesCount to count of all list
} else {
selectedNodesService.setSelectedAllFlags(false);
}
});
}
};
Expand Down Expand Up @@ -342,7 +350,7 @@ function FileBrowserCtrl (
width: columnWidth + '%',
field: attribute.internal_name,
cellTooltip: true,
enableHiding: false,
enableHiding: false
};
if (columnName === 'Url') {
// Url requires a custom template for downloading links
Expand Down
13 changes: 11 additions & 2 deletions refinery/ui/source/js/file-browser/ctrls/node-group-ctrl.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,18 @@ function NodeGroupCtrl (
var params = {
name: name,
assay: $window.externalAssayUuid,
study: $window.externalStudyUuid,
nodes: selectedNodesService.selectedNodeUuidsFromUI
study: $window.externalStudyUuid
};

// If select all box is checked, the complements are sent and backend
// generates nodes list
if (selectedNodesService.selectedAllFlag) {
params.nodes = selectedNodesService.complementSelectedNodes;
params.use_complement_nodes = true;
} else {
params.nodes = selectedNodesService.selectedNodeUuidsFromUI;
params.use_complement_nodes = false;
}
fileBrowserFactory.createNodeGroup(params).then(function () {
vm.refreshNodeGroupList();
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ function rpFileBrowserNodeGroupName (bootbox, $log) {
var isUniqueName = function (name) {
var flag = true;
for (var i = 0; i < ctrl.nodeGroups.groups.length; i ++) {
if (ctrl.nodeGroups.items[i].name === name) {
if (ctrl.nodeGroups && ctrl.nodeGroups.items[i].name === name) {
flag = false;
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ function selectedNodesService () {
vm.selectedNodes = [];
vm.selectedNodeUuidsFromUI = [];
vm.selectedNodeUuidsFromNodeGroup = [];
vm.selectedAllFlag = false;
vm.complementSelectedNodes = [];

vm.setSelectedNodes = function (nodesList) {
vm.selectedNodes = [];
Expand All @@ -25,13 +27,33 @@ function selectedNodesService () {
return vm.selectedNodeUuidsFromNodeGroup;
};

// Grabs uuids from UI-Grid row objects
vm.getUuidsFromSelectedNodesInUI = function () {
var uuidsList = [];
angular.forEach(vm.selectedNodes, function (node) {
uuidsList.push(node.uuid);
});
vm.setSelectedNodeUuidsFromUI(uuidsList);
};

// Flag for when select all event checkbox is selected
vm.setSelectedAllFlags = function (flag) {
if (flag) {
vm.selectedAllFlag = flag;
} else {
// flag is false, reset complement selected nodes
vm.selectedAllFlag = flag;
vm.complementSelectedNodes = [];
}
};

// These are non-selected nodes uuid, when the select all flag is true
vm.setComplementSeletedNodes = function (nodeUuid) {
if (vm.complementSelectedNodes.indexOf(nodeUuid) === -1) {
vm.complementSelectedNodes.push(nodeUuid);
}
return vm.complementSelectedNodes;
};
}

angular.module('refineryFileBrowser')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,17 @@ describe('Selected-Nodes-Service', function () {
expect(service.selectedNodes).toEqual([]);
expect(service.selectedNodeUuidsFromUI).toEqual([]);
expect(service.selectedNodeUuidsFromNodeGroup).toEqual([]);
expect(service.selectedAllFlag).toEqual(false);
expect(service.complementSelectedNodes).toEqual([]);
});

it('all methods exist', function () {
expect(angular.isFunction(service.setSelectedNodes)).toBe(true);
expect(angular.isFunction(service.setSelectedNodeUuidsFromUI)).toBe(true);
expect(angular.isFunction(service.setSelectedNodeUuidsFromNodeGroup)).toBe(true);
expect(angular.isFunction(service.getUuidsFromSelectedNodesInUI)).toBe(true);
expect(angular.isFunction(service.setSelectedAllFlags)).toBe(true);
expect(angular.isFunction(service.setComplementSeletedNodes)).toBe(true);
});

it('setSelectedNodes updates selectedNodes', function () {
Expand Down Expand Up @@ -63,4 +67,30 @@ describe('Selected-Nodes-Service', function () {
service.getUuidsFromSelectedNodesInUI();
expect(service.setSelectedNodeUuidsFromUI).toHaveBeenCalled();
});

it('setSelectedAllFlags', function () {
service.complementSelectedNodes = [
'x508x83x-x9xx-4740-x9x7-x7x0x631280x',
'x5788x83x-x9xx-4740-x9x7-x7x0x98765x'
];
service.setSelectedAllFlags(true);
expect(service.selectedAllFlag).toEqual(true);
expect(service.complementSelectedNodes.length).toEqual(2);
service.setSelectedAllFlags(false);
expect(service.selectedAllFlag).toEqual(false);
expect(service.complementSelectedNodes).toEqual([]);
});

it('setComplementSeletedNodes', function () {
service.complementSelectedNodes = [
'x508x83x-x9xx-4740-x9x7-x7x0x631280x',
'x5788x83x-x9xx-4740-x9x7-x7x0x98765x'
];
expect(service.complementSelectedNodes.length).toEqual(2);
// Does not add duplicate uuids
service.setComplementSeletedNodes('x5788x83x-x9xx-4740-x9x7-x7x0x98765x');
expect(service.complementSelectedNodes.length).toEqual(2);
service.setComplementSeletedNodes('x7398x83x-x9xx-4740-x9x7-x7x0x98123x');
expect(service.complementSelectedNodes.length).toEqual(3);
});
});

0 comments on commit ec43d5b

Please sign in to comment.