Skip to content

Commit

Permalink
#12 Display custom field form in case details page
Browse files Browse the repository at this point in the history
  • Loading branch information
nadouani committed Jun 22, 2017
1 parent b9e5ab6 commit 7bec5f2
Show file tree
Hide file tree
Showing 8 changed files with 261 additions and 126 deletions.
164 changes: 111 additions & 53 deletions ui/app/scripts/controllers/case/CaseDetailsCtrl.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
(function() {
'use strict';

angular.module('theHiveControllers').controller('CaseDetailsCtrl',
function($scope, $state, $uibModal, CaseTabsSrv, UserInfoSrv, PSearchSrv) {
angular.module('theHiveControllers').controller('CaseDetailsCtrl', function($scope, $state, $uibModal, CaseTabsSrv, UserInfoSrv, PSearchSrv) {

CaseTabsSrv.activateTab($state.current.data.tab);
CaseTabsSrv.activateTab($state.current.data.tab);

$scope.isDefined = false;
$scope.state = {
'editing': false,
'isCollapsed': true
};
$scope.isDefined = false;
$scope.state = {
'editing': false,
'isCollapsed': true
};

$scope.attachments = PSearchSrv($scope.caseId, 'case_task_log', {
scope: $scope,
filter: {
'_and': [{
$scope.attachments = PSearchSrv($scope.caseId, 'case_task_log', {
scope: $scope,
filter: {
'_and': [
{
'_not': {
'status': 'Deleted'
}
Expand All @@ -33,57 +33,115 @@
}
}
}
}]
},
pageSize: 100,
nparent: 1
});

$scope.hasNoMetrics = function(caze) {
return !caze.metrics || _.keys(caze.metrics).length === 0 || caze.metrics.length === 0;
};

$scope.addMetric = function(metric) {
var modalInstance = $uibModal.open({
scope: $scope,
templateUrl: 'views/partials/case/case.add.metric.html',
controller: 'CaseAddMetricConfirmCtrl',
size: '',
resolve: {
metric: function() {
return metric;
}
}
});
]
},
pageSize: 100,
nparent: 1
});

modalInstance.result.then(function() {
if (!$scope.caze.metrics) {
$scope.caze.metrics = {};
$scope.hasNoMetrics = function(caze) {
return !caze.metrics || _.keys(caze.metrics).length === 0 || caze.metrics.length === 0;
};

$scope.addMetric = function(metric) {
var modalInstance = $uibModal.open({
scope: $scope,
templateUrl: 'views/partials/case/case.add.metric.html',
controller: 'CaseAddMetadataConfirmCtrl',
size: '',
resolve: {
data: function() {
return metric;
}
$scope.caze.metrics[metric.name] = null;
$scope.updateField('metrics', $scope.caze.metrics);
$scope.updateMetricsList();
});
};

$scope.openAttachment = function(attachment) {
$state.go('app.case.tasks-item', {
caseId: $scope.caze.id,
itemId: attachment.case_task.id
});
};
}
});

modalInstance.result.then(function() {
if (!$scope.caze.metrics) {
$scope.caze.metrics = {};
}
$scope.caze.metrics[metric.name] = null;
$scope.updateField('metrics', $scope.caze.metrics);
$scope.updateMetricsList();
});
};

$scope.openAttachment = function(attachment) {
$state.go('app.case.tasks-item', {
caseId: $scope.caze.id,
itemId: attachment.case_task.id
});
};
});

angular.module('theHiveControllers').controller('CaseCustomFieldsCtrl', function($scope, $uibModal, CustomFieldsCacheSrv) {
var getTemplateCustomFields = function(customFields) {
var result = [];

result = _.pluck(_.sortBy(_.map(customFields, function(definition, name){
return {
name: name,
order: definition.order
}
}), function(item){
return item.order;
}), 'name');

return result;
}
);

angular.module('theHiveControllers').controller('CaseAddMetricConfirmCtrl', function($scope, $uibModalInstance, metric) {
$scope.metric = metric;
$scope.getCustomFieldName = function(fieldDef) {
return 'customFields.' + fieldDef.name + '.' + fieldDef.type;
};

$scope.addCustomField = function(customField) {
var modalInstance = $uibModal.open({
scope: $scope,
templateUrl: 'views/partials/case/case.add.field.html',
controller: 'CaseAddMetadataConfirmCtrl',
size: '',
resolve: {
data: function() {
return customField;
}
}
});

modalInstance.result.then(function() {
var temp = $scope.caze.customFields || {};

temp[customField.name] = {};
temp[customField.name][customField.type] = null;
temp[customField.name].order = _.keys(temp).length;

$scope.caze.customFields = temp;

$scope.updateField('customFields.', $scope.caze.customFields);
$scope.updateCustomFieldsList();
});
};

$scope.updateCustomFieldsList = function() {
CustomFieldsCacheSrv.all().then(function(fields) {
$scope.orderedFields = getTemplateCustomFields($scope.caze.customFields);
$scope.allCustomFields = _.omit(fields, _.keys($scope.caze.customFields));
$scope.customFieldsAvailable = _.keys($scope.allCustomFields).length > 0;
});
};

$scope.updateCustomFieldsList();
});

angular.module('theHiveControllers').controller('CaseAddMetadataConfirmCtrl', function($scope, $uibModalInstance, data) {
$scope.data = data;

$scope.cancel = function() {
$uibModalInstance.dismiss(metric);
$uibModalInstance.dismiss(data);
};

$scope.confirm = function() {
$uibModalInstance.close(metric);
$uibModalInstance.close(data);
};
});

Expand Down
15 changes: 15 additions & 0 deletions ui/app/views/partials/case/case.add.field.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<div class="modal-header bg-primary">
<h3 class="modal-title">Add custom field to Case #{{caze.caseId}}</h3>
</div>
<div class="modal-body">
<div class="vpad20">
You are about to add the <strong uib-tooltip="{{data.description}}">{{data.label}}</strong> custom field to the case <strong>#{{caze.caseId}}: {{caze.title}}</strong>
<br/>
<br/>
Are you sure you want to continue ?
</div>
</div>
<div class="modal-footer text-left">
<button class="btn btn-default" ng-click="cancel()" type="button">Cancel</button>
<button class="btn btn-primary pull-right" type="button" ng-click="confirm()">Confirm</button>
</div>
2 changes: 1 addition & 1 deletion ui/app/views/partials/case/case.add.metric.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ <h3 class="modal-title">Add metric to Case #{{caze.caseId}}</h3>
</div>
<div class="modal-body">
<div class="vpad20">
You are about to add the <strong uib-tooltip="{{metric.description}}">{{metric.title}}</strong> metric to the case <strong>#{{caze.caseId}}: {{caze.title}}</strong>
You are about to add the <strong uib-tooltip="{{data.description}}">{{data.title}}</strong> metric to the case <strong>#{{caze.caseId}}: {{caze.title}}</strong>
<br/>
<br/>
Are you sure you want to continue ?
Expand Down
75 changes: 3 additions & 72 deletions ui/app/views/partials/case/case.details.html
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ <h4 class="vpad10 text-primary">Basic information</h4>
<updatable-tags on-update="updateField('tags', getTags(newValue))" value="caze.tags"></updatable-tags>
</dd>
</dl>

<dl class="dl-horizontal clear">
<dt class="pull-left">Description</dt>
<dd>
Expand All @@ -80,78 +79,10 @@ <h4 class="vpad10 text-primary">Basic information</h4>
</dl>
</div>
<div class="col-md-5 case-metrics">
<div class="case-links" ng-show="links.length > 0">
<h4 class="vpad10 text-primary">Related cases</h4>

<div>
<h5>Newest (<a href ui-sref="app.case.details({caseId:links[0].id})">Case # {{newestLink.caseId}} - {{newestLink.title}}</a>)</h5>
<div>
Created on <strong>{{newestLink.startDate | showDate:'YYYY-MM-DD'}}</strong>
</div>
<div>
Shares <strong><ng-pluralize count="newestLink.linksCount" when="{'one': '1 observable', 'other': '{} observables'}"></ng-pluralize></strong>
<strong ng-if="newestLink.iocCount > 0" class="text-danger">
(<ng-pluralize count="newestLink.iocCount" when="{'0': 'No IOCs', 'one': '1 IOC', 'other': '{} IOCs'}"></ng-pluralize>)
</strong>
</div>
<div>
Tagged as <tag-list data="newestLink.tags"></tag-list>
</div>
<div class="hr-line-dashed"></div>
</div>

<div ng-show="links.length > 1">
<h5>Oldest (<a href ui-sref="app.case.details({caseId:oldestLink.id})">Case # {{oldestLink.caseId}} - {{oldestLink.title}}</a>)</h5>
<div>
Created on <strong>{{oldestLink.startDate | showDate:'YYYY-MM-DD'}}</strong>
</div>
<div>
Shares
<strong><ng-pluralize count="oldestLink.linksCount" when="{'one': '1 observable', 'other': '{} observables'}"></ng-pluralize></strong>
<strong ng-if="oldestLink.iocCount > 0" class="text-danger">
(<ng-pluralize count="oldestLink.iocCount" when="{'one': '1 IOC', 'other': '{} IOCs'}"></ng-pluralize>)
</strong>
</div>
<div>
Tagged as <tag-list data="oldestLink.tags"></tag-list>
</div>
<div class="hr-line-dashed"></div>
</div>

<div class="mt-xs">
<a href ui-sref="app.case.links({caseId:caze.id})">
See all (<ng-pluralize count="links.length" when="{'one': '1 related case', 'other': '{} related cases'}"></ng-pluralize>)
</a>
</div>
</div>
<div class="case-metrics">
<h4 class="vpad10 text-primary">
Metrics
<span uib-dropdown class="pull-right" ng-show="metricsAvailable">
<a href class="dropdown-toggle" uib-dropdown-toggle>
<i class="fa fa-plus"></i>
Add metric
<span class="caret"></span>
</a>
<ul class="dropdown-menu" uib-dropdown-menu>
<li ng-repeat="(key, value) in allMetrics">
<a ng-click="addMetric(value)">{{value.title}}</a>
</li>
</ul>
</span>
</h4>

<div ng-if="hasNoMetrics(caze)">
<em>No metrics need to be set</em>
</div>

<dl class="dl-horizontal clear" ng-repeat="(k,v) in caze.metrics">
<dt class="pull-left" uib-tooltip="{{metricsCache[k].description}}">{{metricsCache[k].title}}</dt>
<dd>
<updatable-simple-text input-type="number" on-update="updateField('metrics.' + k, newValue)" value="caze.metrics[k]"></updatable-simple-text>
</dd>
</dl>
</div>
<ng-include src="'views/partials/case/details/custom.fields.html'"></ng-include>
<ng-include src="'views/partials/case/details/metrics.html'"></ng-include>
<ng-include src="'views/partials/case/details/related.cases.html'"></ng-include>
</div>
</div>

Expand Down
15 changes: 15 additions & 0 deletions ui/app/views/partials/case/case0.add.metric.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<div class="modal-header bg-primary">
<h3 class="modal-title">Add metric to Case #{{caze.caseId}}</h3>
</div>
<div class="modal-body">
<div class="vpad20">
You are about to add the <strong uib-tooltip="{{metric.description}}">{{data.title}}</strong> metric to the case <strong>#{{caze.caseId}}: {{caze.title}}</strong>
<br/>
<br/>
Are you sure you want to continue ?
</div>
</div>
<div class="modal-footer text-left">
<button class="btn btn-default" ng-click="cancel()" type="button">Cancel</button>
<button class="btn btn-primary pull-right" type="button" ng-click="confirm()">Confirm</button>
</div>
44 changes: 44 additions & 0 deletions ui/app/views/partials/case/details/custom.fields.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<div class="case-custom-fields" ng-controller="CaseCustomFieldsCtrl">
<h4 class="vpad10 text-primary">
Custom fields
<span uib-dropdown class="pull-right" ng-show="customFieldsAvailable">
<a href class="dropdown-toggle" uib-dropdown-toggle>
<i class="fa fa-plus"></i>
Add Custom field
<span class="caret"></span>
</a>
<ul class="dropdown-menu" uib-dropdown-menu>
<li ng-repeat="(key, value) in allCustomFields">
<a ng-click="addCustomField(value)">{{value.label}}</a>
</li>
</ul>
</span>
</h4>

<div ng-if="!orderedFields || orderedFields.length === 0">
<em>No custom fields need to be set</em>
</div>

<dl class="dl-horizontal clear"
ng-repeat="k in orderedFields"
ng-init="fieldDef = customFieldsCache[k]; customFieldValue=caze.customFields[fieldDef.name][fieldDef.type];">
<dt class="pull-left" uib-tooltip="{{fieldDef.description}}">{{fieldDef.label}}</dt>
<dd ng-switch="fieldDef.type">
<updatable-simple-text ng-switch-when="string"
input-type="text"
on-update="updateField(getCustomFieldName(fieldDef), newValue)"
value="customFieldValue"></updatable-simple-text>

<updatable-date ng-switch-when="date"
on-update="updateField(getCustomFieldName(fieldDef), newValue)"
value="customFieldValue"></updatable-date>

<updatable-simple-text ng-switch-when="number"
input-type="number"
on-update="updateField(getCustomFieldName(fieldDef), newValue)"
value="customFieldValue"></updatable-simple-text>

<span ng-switch-default>Not Editable</span>
</dd>
</dl>
</div>
28 changes: 28 additions & 0 deletions ui/app/views/partials/case/details/metrics.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<div class="case-metrics">
<h4 class="vpad10 text-primary">
Metrics
<span uib-dropdown class="pull-right" ng-show="metricsAvailable">
<a href class="dropdown-toggle" uib-dropdown-toggle>
<i class="fa fa-plus"></i>
Add metric
<span class="caret"></span>
</a>
<ul class="dropdown-menu" uib-dropdown-menu>
<li ng-repeat="(key, value) in allMetrics">
<a ng-click="addMetric(value)">{{value.title}}</a>
</li>
</ul>
</span>
</h4>

<div ng-if="hasNoMetrics(caze)">
<em>No metrics need to be set</em>
</div>

<dl class="dl-horizontal clear" ng-repeat="(k,v) in caze.metrics">
<dt class="pull-left" uib-tooltip="{{metricsCache[k].description}}">{{metricsCache[k].title}}</dt>
<dd>
<updatable-simple-text input-type="number" on-update="updateField('metrics.' + k, newValue)" value="caze.metrics[k]"></updatable-simple-text>
</dd>
</dl>
</div>
Loading

0 comments on commit 7bec5f2

Please sign in to comment.