From ccc5d40c33f644edf2da36aa4a37ed7372c7bb07 Mon Sep 17 00:00:00 2001 From: Nabil Adouani Date: Tue, 9 Mar 2021 20:04:25 +0100 Subject: [PATCH] #1821 Add case bulk flag/unflag and delete --- .../scripts/controllers/case/CaseListCtrl.js | 87 +++++++++++++++++-- .../case/case.bulk.delete.confirm.html | 32 +++++++ .../app/views/partials/case/list/toolbar.html | 11 +++ 3 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 frontend/app/views/partials/case/case.bulk.delete.confirm.html diff --git a/frontend/app/scripts/controllers/case/CaseListCtrl.js b/frontend/app/scripts/controllers/case/CaseListCtrl.js index f56248e4b9..49429b1a1c 100644 --- a/frontend/app/scripts/controllers/case/CaseListCtrl.js +++ b/frontend/app/scripts/controllers/case/CaseListCtrl.js @@ -1,7 +1,8 @@ (function() { 'use strict'; angular.module('theHiveControllers') - .controller('CaseListCtrl', CaseListCtrl); + .controller('CaseListCtrl', CaseListCtrl) + .controller('CaseBulkDeleteModalCtrl', CaseBulkDeleteModalCtrl); function CaseListCtrl($scope, $q, $state, $window, $uibModal, StreamQuerySrv, FilteringSrv, SecuritySrv, StreamStatSrv, PaginatedQuerySrv, EntitySrv, CaseSrv, UserSrv, AuthenticationSrv, CaseResolutionStatus, NotificationSrv, Severity, Tlp, CortexSrv) { var self = this; @@ -124,10 +125,23 @@ } else { self.selection = []; self.menu.selectAll = false; - // self.updateMenu(); + self.updateMenu(); } }; + self.updateMenu = function() { + // Handle flag/unflag menu items + var temp = _.uniq(_.pluck(self.selection, 'flag')); + self.menu.unflag = temp.length === 1 && temp[0] === true; + self.menu.flag = temp.length === 1 && temp[0] === false; + + // Handle close menu item + temp = _.uniq(_.pluck(self.selection, 'status')); + self.menu.close = temp.length === 1 && temp[0] === 'Open'; + + self.menu.delete = self.selection.length > 0; + }; + self.select = function(caze) { if (caze.selected) { self.selection.push(caze); @@ -136,7 +150,7 @@ return item._id === caze._id; }); } - // self.updateMenu(); + self.updateMenu(); }; self.selectAll = function() { @@ -156,8 +170,7 @@ self.selection = []; } - //self.updateMenu(); - + self.updateMenu(); }; this.toggleStats = function () { @@ -268,6 +281,19 @@ self.filtering.setSort(sort); }; + this.bulkFlag = function(flag) { + var ids = _.pluck(self.selection, '_id'); + + return CaseSrv.bulkUpdate(ids, {flag: flag}) + .then(function(/*responses*/) { + NotificationSrv.log('Selected cases have been updated successfully', 'success'); + }) + .catch(function(err) { + NotificationSrv.error('Bulk flag cases', err.data, err.status); + }); + + } + this.bulkEdit = function() { var modal = $uibModal.open({ animation: 'true', @@ -291,6 +317,21 @@ }); }; + this.bulkRemove = function() { + var modal = $uibModal.open({ + animation: 'true', + templateUrl: 'views/partials/case/case.bulk.delete.confirm.html', + controller: 'CaseBulkDeleteModalCtrl', + controllerAs: '$dialog', + size: 'lg', + resolve: { + selection: function() { + return self.selection; + } + } + }); + } + this.getCaseResponders = function(caze, force) { if (!force && this.caseResponders !== null) { return; @@ -319,4 +360,40 @@ }); }; } + + function CaseBulkDeleteModalCtrl($uibModalInstance, $q, CaseSrv, NotificationSrv, selection) { + var self = this; + + this.selection = selection; + this.count = selection.length; + this.typedCount = undefined; + this.loading = false; + + this.ok = function() { + $uibModalInstance.close(); + } + this.cancel = function() { + $uibModalInstance.dismiss(); + } + this.confirm = function() { + self.loading = true; + + var promises = _.map(self.selection, function(caze) { + return CaseSrv.forceRemove({ caseId: caze._id }).$promise; + }); + + $q.all(promises) + .then(function(responses) { + self.loading = false; + NotificationSrv.log('Cases have been deleted successfully: ' + responses.length, 'success'); + $uibModalInstance.close(); + }) + .catch(function(errors) { + self.loading = false; + _.each(errors, function(err) { + NotificationSrv.error('Bulk delete cases', err.data, err.status); + }); + }) + } + } })(); diff --git a/frontend/app/views/partials/case/case.bulk.delete.confirm.html b/frontend/app/views/partials/case/case.bulk.delete.confirm.html new file mode 100644 index 0000000000..9d13453413 --- /dev/null +++ b/frontend/app/views/partials/case/case.bulk.delete.confirm.html @@ -0,0 +1,32 @@ +
+ + + +
diff --git a/frontend/app/views/partials/case/list/toolbar.html b/frontend/app/views/partials/case/list/toolbar.html index 07be4940cc..8e4bbbb3e5 100644 --- a/frontend/app/views/partials/case/list/toolbar.html +++ b/frontend/app/views/partials/case/list/toolbar.html @@ -11,6 +11,17 @@
  • Edit
  • +
  • +
  • + Add flag +
  • +
  • + Remove flag +
  • +
  • +
  • + Delete +