WebUI: allow to show rows with same pkey in tables

Allows to show rows which have the same primary key. Used in Vault.

https://fedorahosted.org/freeipa/ticket/5426

Reviewed-By: Martin Basti <mbasti@redhat.com>
Reviewed-By: Petr Vobornik <pvoborni@redhat.com>
This commit is contained in:
Pavel Vomacka 2016-12-09 13:08:05 +01:00 committed by Martin Basti
parent de4d4a51b5
commit 587b7324fb
7 changed files with 90 additions and 30 deletions

View File

@ -1042,6 +1042,7 @@ exp.association_facet = IPA.association_facet = function (spec, no_init) {
that.facet_group = spec.facet_group; that.facet_group = spec.facet_group;
that.read_only = spec.read_only; that.read_only = spec.read_only;
that.show_values_with_dup_key = spec.show_values_with_dup_key || false;
that.associator = spec.associator || IPA.bulk_associator; that.associator = spec.associator || IPA.bulk_associator;
that.add_method = spec.add_method || 'add_member'; that.add_method = spec.add_method || 'add_member';
@ -1318,6 +1319,7 @@ exp.association_facet = IPA.association_facet = function (spec, no_init) {
that.get_records_map = function(data) { that.get_records_map = function(data) {
var records_map = $.ordered_map(); var records_map = $.ordered_map();
var pkeys_map = $.ordered_map();
var association_name = that.get_attribute_name(); var association_name = that.get_attribute_name();
var pkey_name = that.managed_entity.metadata.primary_key; var pkey_name = that.managed_entity.metadata.primary_key;
@ -1326,10 +1328,18 @@ exp.association_facet = IPA.association_facet = function (spec, no_init) {
var pkey = pkeys[i]; var pkey = pkeys[i];
var record = {}; var record = {};
record[pkey_name] = pkey; record[pkey_name] = pkey;
records_map.put(pkey, record); var compound_pkey = pkey;
if (that.show_values_with_dup_key) {
compound_pkey = pkey + i;
}
records_map.put(compound_pkey, record);
pkeys_map.put(compound_pkey, pkey);
} }
return records_map; return {
records_map: records_map,
pkeys_map: pkeys_map
};
}; };
that.refresh = function() { that.refresh = function() {
@ -1488,16 +1498,22 @@ exp.attribute_facet = IPA.attribute_facet = function(spec, no_init) {
that.get_records_map = function(data) { that.get_records_map = function(data) {
var records_map = $.ordered_map(); var records_map = $.ordered_map();
var pkeys_map = $.ordered_map();
var pkeys = data.result.result[that.attribute]; var pkeys = data.result.result[that.attribute];
for (var i=0; pkeys && i<pkeys.length; i++) { for (var i=0; pkeys && i<pkeys.length; i++) {
var pkey = pkeys[i]; var pkey = pkeys[i];
var record = {}; var record = {};
record[that.attribute] = pkey; record[that.attribute] = pkey;
records_map.put(pkey, record); var compound_pkey = pkey + i;
records_map.put(compound_pkey, record);
pkeys_map.put(compound_pkey, pkey);
} }
return records_map; return {
records_map: records_map,
pkeys_map: pkeys_map
};
}; };
that.refresh = function() { that.refresh = function() {

View File

@ -167,9 +167,10 @@ IPA.automember.rule_search_facet = function(spec) {
return name; return name;
}; };
that.create_get_records_command = function(pkeys, on_success, on_error) { that.create_get_records_command = function(records, pkeys, on_success, on_error) {
var batch = that.table_facet_create_get_records_command(pkeys, on_success, on_error); var batch = that.table_facet_create_get_records_command(records, pkeys,
on_success, on_error);
for (var i=0; i<batch.commands.length; i++) { for (var i=0; i<batch.commands.length; i++) {
var command = batch.commands[i]; var command = batch.commands[i];

View File

@ -875,7 +875,9 @@ IPA.dns.record_search_facet = function(spec) {
var that = IPA.nested_search_facet(spec); var that = IPA.nested_search_facet(spec);
that.get_records = function(pkeys, on_success, on_error) { that.get_records = function(records, pkeys_list, on_success, on_error) {
var pkeys = pkeys_list.keys;
var batch = rpc.batch_command({ var batch = rpc.batch_command({
name: that.get_records_command_name(), name: that.get_records_command_name(),
@ -887,6 +889,7 @@ IPA.dns.record_search_facet = function(spec) {
for (var i=0; i<pkeys.length; i++) { for (var i=0; i<pkeys.length; i++) {
var pkey = pkeys[i]; var pkey = pkeys[i];
var call_pkey = pkeys_list.get(pkey);
var command = rpc.command({ var command = rpc.command({
entity: that.table.entity.name, entity: that.table.entity.name,

View File

@ -1834,6 +1834,14 @@ exp.table_facet = IPA.table_facet = function(spec, no_init) {
var that = IPA.facet(spec, no_init); var that = IPA.facet(spec, no_init);
/**
* Sets whether table on the facet will or will not show items with the
* same key.
*
* @property {boolean}
*/
that.show_values_with_dup_key = spec.show_values_with_dup_key || false;
/** /**
* Names of additional row attributes which will be send to another facet * Names of additional row attributes which will be send to another facet
* during navigation as URL parameters. * during navigation as URL parameters.
@ -2074,11 +2082,13 @@ exp.table_facet = IPA.table_facet = function(spec, no_init) {
* *
* @protected * @protected
* @param {Object} data RPC command data * @param {Object} data RPC command data
* @return {ordered_map} record map * @return {Object} ordered_maps with records and with pkeys. keys
* are composed from pkey and index.
*/ */
that.get_records_map = function(data) { that.get_records_map = function(data) {
var records_map = $.ordered_map(); var records_map = $.ordered_map();
var pkeys_map = $.ordered_map();
var result = data.result.result; var result = data.result.result;
var pkey_name = that.managed_entity.metadata.primary_key || var pkey_name = that.managed_entity.metadata.primary_key ||
@ -2089,11 +2099,21 @@ exp.table_facet = IPA.table_facet = function(spec, no_init) {
var record = result[i]; var record = result[i];
var pkey = adapter.load(record, pkey_name)[0]; var pkey = adapter.load(record, pkey_name)[0];
if (that.filter_records(records_map, pkey, record)) { if (that.filter_records(records_map, pkey, record)) {
records_map.put(pkey, record); // This solution allows to show tables where are the same
// primary keys. (i.e. {User|Service} Vaults)
var compound_pkey = pkey;
if (that.show_values_with_dup_key) {
compound_pkey = pkey + i;
}
records_map.put(compound_pkey, record);
pkeys_map.put(compound_pkey, pkey);
} }
} }
return records_map; return {
records_map: records_map,
pkeys_map: pkeys_map
};
}; };
/** /**
@ -2110,7 +2130,9 @@ exp.table_facet = IPA.table_facet = function(spec, no_init) {
that.load_page = function(data) { that.load_page = function(data) {
// get primary keys (and the complete records if search_all_entries is true) // get primary keys (and the complete records if search_all_entries is true)
var records_map = that.get_records_map(data); var records = that.get_records_map(data);
var records_map = records.records_map;
var pkeys_map = records.pkeys_map;
var total = records_map.length; var total = records_map.length;
that.table.total_pages = total ? Math.ceil(total / that.table.page_length) : 1; that.table.total_pages = total ? Math.ceil(total / that.table.page_length) : 1;
@ -2146,11 +2168,11 @@ exp.table_facet = IPA.table_facet = function(spec, no_init) {
// sort map based on primary keys // sort map based on primary keys
if (that.sort_enabled) { if (that.sort_enabled) {
records_map = records_map.sort(); pkeys_map = pkeys_map.sort();
} }
// trim map leaving the entries visible in the current page only // trim map leaving the entries visible in the current page only
records_map = records_map.slice(start-1, end); pkeys_map = pkeys_map.slice(start-1, end);
var columns = that.table.columns.values; var columns = that.table.columns.values;
if (columns.length == 1) { // show primary keys only if (columns.length == 1) { // show primary keys only
@ -2167,16 +2189,19 @@ exp.table_facet = IPA.table_facet = function(spec, no_init) {
// get the complete records // get the complete records
that.get_records( that.get_records(
records_map, records_map,
pkeys_map,
function(data, text_status, xhr) { function(data, text_status, xhr) {
var results = data.result.results; var results = data.result.results;
for (var i=0; i<records_map.length; i++) { var show_records_map = $.ordered_map();
var pkey = records_map.keys[i]; for (var i=0; i<pkeys_map.length; i++) {
var pkey = pkeys_map.keys[i];
var record = records_map.get(pkey); var record = records_map.get(pkey);
// merge the record obtained from the refresh() // merge the record obtained from the refresh()
// with the record obtained from get_records() // with the record obtained from get_records()
$.extend(record, results[i].result); $.extend(record, results[i].result);
show_records_map.put(pkey, record);
} }
that.load_records(records_map.values); that.load_records(show_records_map.values);
}, },
function(xhr, text_status, error_thrown) { function(xhr, text_status, error_thrown) {
that.load_records([]); that.load_records([]);
@ -2249,9 +2274,9 @@ exp.table_facet = IPA.table_facet = function(spec, no_init) {
* @param {Function} on_success command success handler * @param {Function} on_success command success handler
* @param {Function} on_failure command error handler * @param {Function} on_failure command error handler
*/ */
that.create_get_records_command = function(records, on_success, on_error) { that.create_get_records_command = function(records, pkeys_list, on_success, on_error) {
var pkeys = records.keys; var pkeys = pkeys_list.keys;
var batch = rpc.batch_command({ var batch = rpc.batch_command({
name: that.get_records_command_name(), name: that.get_records_command_name(),
@ -2261,11 +2286,12 @@ exp.table_facet = IPA.table_facet = function(spec, no_init) {
for (var i=0; i<pkeys.length; i++) { for (var i=0; i<pkeys.length; i++) {
var pkey = pkeys[i]; var pkey = pkeys[i];
var call_pkey = pkeys_list.get(pkey);
var command = rpc.command({ var command = rpc.command({
entity: that.table.entity.name, entity: that.table.entity.name,
method: 'show', method: 'show',
args: [pkey] args: [call_pkey]
}); });
if (that.show_command_additional_attr) { if (that.show_command_additional_attr) {
@ -2304,13 +2330,13 @@ exp.table_facet = IPA.table_facet = function(spec, no_init) {
* Execute command for obtaining complete records * Execute command for obtaining complete records
* *
* @protected * @protected
* @param {Array.<string>} pkeys primary keys * @param records_map of all records
* @param {Function} on_success command success handler * @param {Function} on_success command success handler
* @param {Function} on_failure command error handler * @param {Function} on_failure command error handler
*/ */
that.get_records = function(pkeys, on_success, on_error) { that.get_records = function(records, pkeys, on_success, on_error) {
var batch = that.create_get_records_command(pkeys, on_success, on_error); var batch = that.create_get_records_command(records, pkeys, on_success, on_error);
batch.execute(); batch.execute();
}; };

View File

@ -706,12 +706,15 @@ IPA.hbac.test_run_facet = function(spec) {
that.get_records_map = function(data) { that.get_records_map = function(data) {
var records_map = $.ordered_map(); var records_map = $.ordered_map();
var pkeys_map = $.ordered_map();
var matched = data.result.matched; var matched = data.result.matched;
if (that.show_matched && matched) { if (that.show_matched && matched) {
for (var i=0; i<matched.length; i++) { for (var i=0; i<matched.length; i++) {
var pkey = matched[i]; var pkey = matched[i];
records_map.put(pkey, { matched: true }); var compound_pkey = pkey + i;
records_map.put(compound_pkey, { matched: true });
pkeys_map.put(compound_pkey, pkey);
} }
} }
@ -719,11 +722,16 @@ IPA.hbac.test_run_facet = function(spec) {
if (that.show_unmatched && notmatched) { if (that.show_unmatched && notmatched) {
for (i=0; i<notmatched.length; i++) { for (i=0; i<notmatched.length; i++) {
pkey = notmatched[i]; pkey = notmatched[i];
records_map.put(pkey, { matched: false }); compound_pkey = pkey + i;
records_map.put(compound_pkey, { matched: false });
pkeys_map.put(compound_pkey, pkey);
} }
} }
return records_map; return {
records_map: records_map,
pkeys_map: pkeys_map
};
}; };
that.get_records_command_name = function() { that.get_records_command_name = function() {
@ -811,4 +819,4 @@ exp.register = function() {
phases.on('registration', exp.register); phases.on('registration', exp.register);
return exp; return exp;
}); });

View File

@ -430,6 +430,7 @@ IPA.service.search_facet = function(spec) {
that.get_records_map = function(data) { that.get_records_map = function(data) {
var records_map = $.ordered_map(); var records_map = $.ordered_map();
var pkeys_map = $.ordered_map();
var result = data.result.result; var result = data.result.result;
var pkey_name = that.managed_entity.metadata.primary_key || var pkey_name = that.managed_entity.metadata.primary_key ||
@ -443,11 +444,16 @@ IPA.service.search_facet = function(spec) {
pkey = adapter.load(record, that.alternative_pkey)[0]; pkey = adapter.load(record, that.alternative_pkey)[0];
} }
if (that.filter_records(records_map, pkey, record)) { if (that.filter_records(records_map, pkey, record)) {
records_map.put(pkey, record); var compound_pkey = pkey + i;
records_map.put(compound_pkey, record);
pkeys_map.put(compound_pkey, pkey);
} }
} }
return records_map; return {
records_map: records_map,
pkeys_map: pkeys_map
};
}; };
return that; return that;

View File

@ -490,7 +490,7 @@ topology.servers_search_facet = function(spec, no_init) {
var that = IPA.search_facet(spec); var that = IPA.search_facet(spec);
that.create_get_records_command = function(pkeys, on_success, on_error) { that.create_get_records_command = function(records, pkeys, on_success, on_error) {
var on_success_extended = function(data, text_status, xhr) { var on_success_extended = function(data, text_status, xhr) {
// Call original on_success handler // Call original on_success handler
@ -560,7 +560,7 @@ topology.servers_search_facet = function(spec, no_init) {
dialog.open(); dialog.open();
}; };
var batch = that.table_facet_create_get_records_command(pkeys, var batch = that.table_facet_create_get_records_command(records, pkeys,
on_success_extended, on_error); on_success_extended, on_error);
return batch; return batch;