summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEndi S. Dewata <edewata@redhat.com>2016-03-15 21:10:30 +0100
committerEndi S. Dewata <edewata@redhat.com>2016-03-17 01:03:43 +0100
commit2e02c078fb57fa806d3ff2bf7a1ed2df34966acc (patch)
tree03c9803a6445b3fcbc982359adc82d36fccb76ab
parentb5637ae9c646c99efce4ff874666b75400502b2d (diff)
downloadpki-2e02c078fb57fa806d3ff2bf7a1ed2df34966acc.tar.gz
pki-2e02c078fb57fa806d3ff2bf7a1ed2df34966acc.tar.xz
pki-2e02c078fb57fa806d3ff2bf7a1ed2df34966acc.zip
Added TPS token filter dialog.
The TPS UI Tokens page and the pki tps-token-find CLI have been modified to provide an interface to filter tokens based on their attributes. The TokenService.findTokens() has been modified to accept additional search criteria based on token attributes. https://fedorahosted.org/pki/ticket/1482
-rw-r--r--base/common/src/com/netscape/certsrv/tps/token/TokenClient.java20
-rw-r--r--base/common/src/com/netscape/certsrv/tps/token/TokenResource.java4
-rw-r--r--base/java-tools/src/com/netscape/cmstools/tps/token/TokenFindCLI.java31
-rw-r--r--base/server/share/webapps/pki/js/pki-ui.js28
-rw-r--r--base/tps/shared/webapps/tps/js/token.js70
-rw-r--r--base/tps/shared/webapps/tps/ui/tokens.html31
-rw-r--r--base/tps/src/org/dogtagpki/server/tps/rest/TokenService.java29
7 files changed, 200 insertions, 13 deletions
diff --git a/base/common/src/com/netscape/certsrv/tps/token/TokenClient.java b/base/common/src/com/netscape/certsrv/tps/token/TokenClient.java
index a62e71cf8..63e0edcde 100644
--- a/base/common/src/com/netscape/certsrv/tps/token/TokenClient.java
+++ b/base/common/src/com/netscape/certsrv/tps/token/TokenClient.java
@@ -40,8 +40,24 @@ public class TokenClient extends Client {
resource = createProxy(TokenResource.class);
}
- public TokenCollection findTokens(String filter, Integer start, Integer size) {
- Response response = resource.findTokens(filter, start, size);
+ public TokenCollection findTokens(
+ String filter,
+ String tokenID,
+ String userID,
+ String type,
+ String status,
+ Integer start,
+ Integer size) {
+
+ Response response = resource.findTokens(
+ filter,
+ tokenID,
+ userID,
+ type,
+ status,
+ start,
+ size);
+
return client.getEntity(response, TokenCollection.class);
}
diff --git a/base/common/src/com/netscape/certsrv/tps/token/TokenResource.java b/base/common/src/com/netscape/certsrv/tps/token/TokenResource.java
index e530a8527..4c1bc39aa 100644
--- a/base/common/src/com/netscape/certsrv/tps/token/TokenResource.java
+++ b/base/common/src/com/netscape/certsrv/tps/token/TokenResource.java
@@ -45,6 +45,10 @@ public interface TokenResource {
@ClientResponseType(entityType=TokenCollection.class)
public Response findTokens(
@QueryParam("filter") String filter,
+ @QueryParam("tokenID") String tokenID,
+ @QueryParam("userID") String userID,
+ @QueryParam("type") String type,
+ @QueryParam("status") String status,
@QueryParam("start") Integer start,
@QueryParam("size") Integer size);
diff --git a/base/java-tools/src/com/netscape/cmstools/tps/token/TokenFindCLI.java b/base/java-tools/src/com/netscape/cmstools/tps/token/TokenFindCLI.java
index 9afc05ebe..cfe7c2fe3 100644
--- a/base/java-tools/src/com/netscape/cmstools/tps/token/TokenFindCLI.java
+++ b/base/java-tools/src/com/netscape/cmstools/tps/token/TokenFindCLI.java
@@ -48,7 +48,23 @@ public class TokenFindCLI extends CLI {
}
public void createOptions() {
- Option option = new Option(null, "start", true, "Page start");
+ Option option = new Option(null, "token", true, "Token ID");
+ option.setArgName("token ID");
+ options.addOption(option);
+
+ option = new Option(null, "user", true, "User ID");
+ option.setArgName("user ID");
+ options.addOption(option);
+
+ option = new Option(null, "type", true, "Token type");
+ option.setArgName("type");
+ options.addOption(option);
+
+ option = new Option(null, "status", true, "Token status");
+ option.setArgName("status");
+ options.addOption(option);
+
+ option = new Option(null, "start", true, "Page start");
option.setArgName("start");
options.addOption(option);
@@ -78,6 +94,10 @@ public class TokenFindCLI extends CLI {
String[] cmdArgs = cmd.getArgs();
String filter = cmdArgs.length > 0 ? cmdArgs[0] : null;
+ String tokenID = cmd.getOptionValue("token");
+ String userID = cmd.getOptionValue("user");
+ String type = cmd.getOptionValue("type");
+ String status = cmd.getOptionValue("status");
String s = cmd.getOptionValue("start");
Integer start = s == null ? null : Integer.valueOf(s);
@@ -85,7 +105,14 @@ public class TokenFindCLI extends CLI {
s = cmd.getOptionValue("size");
Integer size = s == null ? null : Integer.valueOf(s);
- TokenCollection result = tokenCLI.tokenClient.findTokens(filter, start, size);
+ TokenCollection result = tokenCLI.tokenClient.findTokens(
+ filter,
+ tokenID,
+ userID,
+ type,
+ status,
+ start,
+ size);
MainCLI.printMessage(result.getTotal() + " entries matched");
if (result.getTotal() == 0) return;
diff --git a/base/server/share/webapps/pki/js/pki-ui.js b/base/server/share/webapps/pki/js/pki-ui.js
index 96c92f3f1..0b5cdb0dd 100644
--- a/base/server/share/webapps/pki/js/pki-ui.js
+++ b/base/server/share/webapps/pki/js/pki-ui.js
@@ -198,6 +198,7 @@ var Dialog = Backbone.View.extend({
self.title = options.title;
self.content = options.content;
+ self.entry = options.entry || {};
// list of readonly fields
// by default all fields are editable
@@ -499,11 +500,15 @@ var Table = Backbone.View.extend({
var self = this;
Table.__super__.initialize.call(self, options);
+
self.entries = options.entries || [];
self.columnMappings = options.columnMappings || {};
self.mode = options.mode || "view";
self.parent = options.parent;
+ self.searchFilter = "";
+ self.searchAttributes = {};
+
self.addDialog = options.addDialog;
self.editDialog = options.editDialog;
self.viewDialog = options.viewDialog;
@@ -525,6 +530,9 @@ var Table = Backbone.View.extend({
self.searchField = $("input[name='search']", self.thead);
self.searchField.keypress(function(e) {
if (e.which == 13) {
+
+ self.searchFilter = self.searchField.val();
+
// show the first page of search results
self.page = 1;
self.render();
@@ -634,11 +642,10 @@ var Table = Backbone.View.extend({
var self = this;
// perform manual filter
- var filter = self.searchField.val();
self.filteredEntries = [];
_(self.entries).each(function(item, index) {
- if (!self.matchesFilter(item, filter)) return;
+ if (!self.matchesFilter(item, self.searchFilter)) return;
self.filteredEntries.push(item);
});
@@ -792,11 +799,20 @@ var ModelTable = Table.extend({
}
// set query based on current page, page size, and filter
- self.collection.query({
+ var params = {
start: (self.page - 1) * self.pageSize,
- size: self.pageSize,
- filter: self.searchField.val()
- });
+ size: self.pageSize
+ };
+
+ if (self.searchFilter != null) {
+ params["filter"] = self.searchFilter;
+ }
+
+ if (!_.isEmpty(self.searchAttributes)) {
+ _.extend(params, self.searchAttributes);
+ }
+
+ self.collection.query(params);
// fetch data based on query
self.collection.fetch({
diff --git a/base/tps/shared/webapps/tps/js/token.js b/base/tps/shared/webapps/tps/js/token.js
index fb1c3ea46..e09fa5fc6 100644
--- a/base/tps/shared/webapps/tps/js/token.js
+++ b/base/tps/shared/webapps/tps/js/token.js
@@ -19,6 +19,17 @@
* @author Endi S. Dewata
*/
+// TODO: load labels from server
+var TokenStatus = {
+ UNINITIALIZED : "Uninitialized",
+ ACTIVE : "Active",
+ TEMP_LOST : "Temporarily lost",
+ PERM_LOST : "Permanently lost",
+ DAMAGED : "Physically damaged",
+ TEMP_LOST_PERM_LOST : "Temporarily lost then permanently lost",
+ TERMINATED : "Terminated"
+};
+
var TokenModel = Model.extend({
urlRoot: "/tps/rest/tokens",
parseResponse: function(response) {
@@ -119,6 +130,34 @@ var TokenDialog = Dialog.extend({
}
});
+var TokenFilterDialog = Dialog.extend({
+ loadField: function(input) {
+ var self = this;
+
+ var name = input.attr("name");
+ if (name != "status") {
+ TokenFilterDialog.__super__.loadField.call(self, input);
+ return;
+ }
+
+ var select = input.empty();
+ var status = self.entry.status;
+
+ $('<option/>', {
+ text: "",
+ value: ""
+ }).appendTo(select);
+
+ _.each(TokenStatus, function(value, key) {
+ $('<option/>', {
+ value: key,
+ text: value,
+ selected: key == status
+ }).appendTo(select);
+ });
+ }
+});
+
var TokenPage = EntryPage.extend({
initialize: function(options) {
var self = this;
@@ -314,11 +353,40 @@ var TokensPage = Page.extend({
load: function() {
var self = this;
+ self.tokensTable = self.$("table[name='tokens']");
+
var table = new TokensTable({
- el: $("table[name='tokens']"),
+ el: self.tokensTable,
collection: new TokenCollection()
});
table.render();
+
+ $("a[name='filter']", self.tokensTable).click(function(e) {
+
+ e.preventDefault();
+
+ var dialog = new TokenFilterDialog({
+ el: $("#token-filter-dialog"),
+ actions: ["cancel", "apply"]
+ });
+
+ dialog.entry = _.clone(table.searchAttributes);
+
+ dialog.handler("apply", function() {
+
+ dialog.save();
+
+ table.searchAttributes = _.clone(dialog.entry);
+
+ // show the first page of search results
+ table.page = 1;
+ table.render();
+
+ dialog.close();
+ });
+
+ dialog.open();
+ });
}
});
diff --git a/base/tps/shared/webapps/tps/ui/tokens.html b/base/tps/shared/webapps/tps/ui/tokens.html
index b0782d373..b085c0b06 100644
--- a/base/tps/shared/webapps/tps/ui/tokens.html
+++ b/base/tps/shared/webapps/tps/ui/tokens.html
@@ -30,6 +30,7 @@
<th class="pki-table-actions" colspan="10">
<span name="search">
<input name="search" type="text" placeholder="Search...">
+ <a name="filter" href="#tokens-search">Advanced Search</a>
</span>
<span class="pki-table-buttons">
<button name="add">Add</button>
@@ -127,3 +128,33 @@
</div>
</div>
</div>
+
+<div id="token-filter-dialog" class="modal">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">
+ <span class="pficon pficon-close"></span>
+ </button>
+ <h4 class="modal-title">Token Filter</h4>
+ </div>
+ <div class="modal-body">
+ <fieldset>
+ <label>Token ID</label>
+ <input name="tokenID"><br>
+ <label>User ID</label>
+ <input name="userID"><br>
+ <label>Type</label>
+ <input name="type"><br>
+ <label>Status</label>
+ <select name="status">
+ </select><br>
+ </fieldset>
+ </div>
+ <div class="modal-footer">
+ <button name="apply" class="btn btn-primary">Apply</button>
+ <button name="cancel" class="btn btn-default" data-dismiss="modal">Cancel</button>
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/base/tps/src/org/dogtagpki/server/tps/rest/TokenService.java b/base/tps/src/org/dogtagpki/server/tps/rest/TokenService.java
index 226f039f4..a0ca7add3 100644
--- a/base/tps/src/org/dogtagpki/server/tps/rest/TokenService.java
+++ b/base/tps/src/org/dogtagpki/server/tps/rest/TokenService.java
@@ -268,7 +268,14 @@ public class TokenService extends PKIService implements TokenResource {
}
@Override
- public Response findTokens(String filter, Integer start, Integer size) {
+ public Response findTokens(
+ String filter,
+ String tokenID,
+ String userID,
+ String type,
+ String status,
+ Integer start,
+ Integer size) {
CMS.debug("TokenService.findTokens()");
@@ -276,6 +283,24 @@ public class TokenService extends PKIService implements TokenResource {
throw new BadRequestException("Filter is too short.");
}
+ Map<String, String> attributes = new HashMap<String, String>();
+
+ if (StringUtils.isNotEmpty(tokenID)) {
+ attributes.put("id", tokenID);
+ }
+
+ if (StringUtils.isNotEmpty(userID)) {
+ attributes.put("userID", userID);
+ }
+
+ if (StringUtils.isNotEmpty(type)) {
+ attributes.put("type", type);
+ }
+
+ if (StringUtils.isNotEmpty(status)) {
+ attributes.put("status", status);
+ }
+
start = start == null ? 0 : start;
size = size == null ? DEFAULT_SIZE : size;
@@ -283,7 +308,7 @@ public class TokenService extends PKIService implements TokenResource {
TPSSubsystem subsystem = (TPSSubsystem)CMS.getSubsystem(TPSSubsystem.ID);
TokenDatabase database = subsystem.getTokenDatabase();
- Iterator<TokenRecord> tokens = database.findRecords(filter).iterator();
+ Iterator<TokenRecord> tokens = database.findRecords(filter, attributes).iterator();
TokenCollection response = new TokenCollection();
int i = 0;