diff --git a/thehive-backend/conf/routes b/thehive-backend/conf/routes index 7920d0c526..cb106abf4e 100644 --- a/thehive-backend/conf/routes +++ b/thehive-backend/conf/routes @@ -76,9 +76,11 @@ POST /api/maintenance/migrate org.elastic4play.controllers.M GET /api/list org.elastic4play.controllers.DBListCtrl.list() DELETE /api/list/:itemId org.elastic4play.controllers.DBListCtrl.deleteItem(itemId) +PATCH /api/list/:itemId org.elastic4play.controllers.DBListCtrl.updateItem(itemId) POST /api/list/:listName org.elastic4play.controllers.DBListCtrl.addItem(listName) GET /api/list/:listName org.elastic4play.controllers.DBListCtrl.listItems(listName) + GET /api/user/current controllers.UserCtrl.currentUser() POST /api/user/_search controllers.UserCtrl.find() POST /api/user controllers.UserCtrl.create() diff --git a/ui/app/index.html b/ui/app/index.html index 176fb081cb..c0fe076e3c 100644 --- a/ui/app/index.html +++ b/ui/app/index.html @@ -134,6 +134,7 @@ + diff --git a/ui/app/scripts/controllers/admin/AdminCustomFieldDialogCtrl.js b/ui/app/scripts/controllers/admin/AdminCustomFieldDialogCtrl.js new file mode 100644 index 0000000000..814991e657 --- /dev/null +++ b/ui/app/scripts/controllers/admin/AdminCustomFieldDialogCtrl.js @@ -0,0 +1,46 @@ +(function() { + 'use strict'; + + angular.module('theHiveControllers').controller('AdminCustomFieldDialogCtrl', + function($scope, $uibModalInstance, ListSrv, NotificationSrv, customField) { + var self = this; + self.reference = { + types: ['string', 'number', 'boolean', 'date'] + }; + + self.customField = customField; + self.customField.options = (customField.options || []).join('\n'); + + var onSuccess = function(data) { + $uibModalInstance.close(data); + }; + + var onFailure = function(response) { + NotificationSrv.error('AdminCustomFieldDialogCtrl', response.data, response.status); + }; + + self.saveField = function() { + var postData = _.pick(self.customField, 'name', 'title', 'label', 'description', 'type'); + postData.options = _.isArray(self.customField.options) ? self.customField.options : self.customField.options.split('\n'); + + if(self.customField.id) { + ListSrv.update( + {'itemId': self.customField.id}, + {'value': JSON.stringify(postData)}, + onSuccess, + onFailure); + } else { + ListSrv.save( + {'listId': 'custom_fields'}, + {'value': JSON.stringify(postData)}, + onSuccess, + onFailure); + } + }; + + self.cancel = function() { + $uibModalInstance.dismiss(); + } + + }); +})(); diff --git a/ui/app/scripts/controllers/admin/AdminCustomFieldsCtrl.js b/ui/app/scripts/controllers/admin/AdminCustomFieldsCtrl.js index 446ff6bc4a..b92aed2282 100644 --- a/ui/app/scripts/controllers/admin/AdminCustomFieldsCtrl.js +++ b/ui/app/scripts/controllers/admin/AdminCustomFieldsCtrl.js @@ -2,7 +2,7 @@ 'use strict'; angular.module('theHiveControllers').controller('AdminCustomFieldsCtrl', - function($scope, ListSrv, CustomFieldsCacheSrv, NotificationSrv) { + function($scope, $uibModal, ListSrv, CustomFieldsCacheSrv, NotificationSrv) { var self = this; self.reference = { @@ -24,8 +24,15 @@ 'listId': 'custom_fields' }, {}, function(response) { - self.customFields = _.values(response).filter(_.isString).map(function(item) { - return JSON.parse(item); + // self.customFields = _.values(response).filter(_.isString).map(function(item) { + // return JSON.parse(item); + // }); + + self.customFields = _.map(response.toJSON(), function(value, key) { + var obj = JSON.parse(value); + obj.id = key; + + return obj; }); }, function(response) { @@ -33,22 +40,23 @@ }); }; - self.addCustomField = function() { - ListSrv.save({ - 'listId': 'custom_fields' - }, { - 'value': JSON.stringify(self.formData) - }, function() { - self.initCustomfields(); - - CustomFieldsCacheSrv.clearCache(); + self.showFieldDialog = function(customField) { + var modalInstance = $uibModal.open({ + templateUrl: 'views/partials/admin/custom-field-dialog.html', + controller: 'AdminCustomFieldDialogCtrl', + controllerAs: '$vm', + size: 'lg', + resolve: { + customField: angular.copy(customField) || {} + } + }); - $scope.$emit('custom-fields:refresh'); - }, - function(response) { - NotificationSrv.error('AdminCustomfieldsCtrl', response.data, response.status); - }); - }; + modalInstance.result.then(function(data) { + self.initCustomfields(); + CustomFieldsCacheSrv.clearCache(); + $scope.$emit('custom-fields:refresh'); + }); + } self.initCustomfields(); }); diff --git a/ui/app/scripts/services/ListSrv.js b/ui/app/scripts/services/ListSrv.js index 9479faf890..92933b9a33 100644 --- a/ui/app/scripts/services/ListSrv.js +++ b/ui/app/scripts/services/ListSrv.js @@ -8,6 +8,10 @@ }, add: { method: 'PUT' + }, + update: { + url: './api/list/:itemId', + method: 'PATCH', } }); }); diff --git a/ui/app/styles/main.css b/ui/app/styles/main.css index 73a55bf9a6..ef0a86031c 100644 --- a/ui/app/styles/main.css +++ b/ui/app/styles/main.css @@ -260,8 +260,9 @@ ul.observable-reports-summary li { padding: 20px 10px 10px 10px; } -.case-metrics dt { - width: 300px !important; +.case-metrics dt, +.case-custom-fields dt { + width: 200px !important; } .scrollable { @@ -495,7 +496,7 @@ tags-input.input-sm .tags.focused { } footer.main-footer { - padding: 2px; + padding: 2px; line-height: 40px; } diff --git a/ui/app/views/directives/updatable-date.html b/ui/app/views/directives/updatable-date.html index 8542625dc4..647801d0b1 100644 --- a/ui/app/views/directives/updatable-date.html +++ b/ui/app/views/directives/updatable-date.html @@ -1,5 +1,6 @@ - + {{value | showDate}} + Not Specified @@ -8,20 +9,21 @@       -
-
-
- - now -
-
-
- - + +
+
+ + + + Now + + + - - - -
-
+
+
diff --git a/ui/app/views/partials/admin/custom-field-dialog.html b/ui/app/views/partials/admin/custom-field-dialog.html new file mode 100644 index 0000000000..e55242056f --- /dev/null +++ b/ui/app/views/partials/admin/custom-field-dialog.html @@ -0,0 +1,64 @@ +
+ + + +
diff --git a/ui/app/views/partials/admin/custom-fields.html b/ui/app/views/partials/admin/custom-fields.html index 3eaca368cb..4596a52248 100644 --- a/ui/app/views/partials/admin/custom-fields.html +++ b/ui/app/views/partials/admin/custom-fields.html @@ -3,44 +3,8 @@

Case custom fields ({{$vm.customFields.length}})

-
-
-
-
- - -
-
- - -
-
-
-
- - -
-
- - - -
-
- - -
- - -
-
-
- -
-
-
+
@@ -50,18 +14,30 @@

Case custom fields ({{$vm.customFields.length}})

- - - + + + + + - - + + + - + +
NameLabelTypeTypeNameLabel DescriptionOptionsActions
{{field.name}}
+ {{field.type | uppercase}} + {{field.name}} {{field.label}}{{field.type | uppercase}} {{field.description || 'N/A'}} + None + +
    +
  • {{option}}
  • +
+
diff --git a/ui/app/views/partials/admin/report-template-dialog.html b/ui/app/views/partials/admin/report-template-dialog.html index 427a2947a9..0025cad539 100644 --- a/ui/app/views/partials/admin/report-template-dialog.html +++ b/ui/app/views/partials/admin/report-template-dialog.html @@ -34,6 +34,6 @@
diff --git a/ui/app/views/partials/case/case.details.html b/ui/app/views/partials/case/case.details.html index f581db3ec2..84350aa757 100644 --- a/ui/app/views/partials/case/case.details.html +++ b/ui/app/views/partials/case/case.details.html @@ -78,7 +78,7 @@

Basic information

-
+