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 @@
-
Name | -Label | -Type | +Type | +Name | +Label | Description | +Options | +Actions |
---|---|---|---|---|---|---|---|---|
{{field.name}} | +||||||||
+ {{field.type | uppercase}} + | +{{field.name}} | {{field.label}} | -{{field.type | uppercase}} | {{field.description || 'N/A'}} | ++ None + | +
+
|