summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Young <ayoung@redhat.com>2011-07-08 12:06:30 -0400
committerEndi S. Dewata <edewata@redhat.com>2011-07-13 21:57:18 +0000
commita746c613a4fb3d0eed5c73455ebb2e674ed7793d (patch)
tree09c693a9b944d0183753da302c4386f2679e4d7f
parentbccdc7e03db465201c14ddd912696afee6124437 (diff)
downloadfreeipa-a746c613a4fb3d0eed5c73455ebb2e674ed7793d.tar.gz
freeipa-a746c613a4fb3d0eed5c73455ebb2e674ed7793d.tar.xz
freeipa-a746c613a4fb3d0eed5c73455ebb2e674ed7793d.zip
dnsrecord-mod ui
Brings the DNS record infrastructure in line with the other entities. Uses widgets, nested search, and a littel bit of overloading for dns specific behavior The records now have their own page. simplified link widget and use for dns links work for nested entities. change the field in the link widget to other_entity to avoid name collision. unit test for entity link. fixed reference to entity for getting pkeys work around lack of setattr for dns record mod. update wasn't deducing locked_field type correctly. don't overwrite param_info in init data is required on adder dialog delete works for multiple records use show instead of find for entity_link_widget. https://fedorahosted.org/freeipa/ticket/1038 https://fedorahosted.org/freeipa/ticket/1448 https://fedorahosted.org/freeipa/ticket/577 https://fedorahosted.org/freeipa/ticket/1460
-rw-r--r--install/ui/add.js5
-rw-r--r--install/ui/details.js7
-rw-r--r--install/ui/dns.js695
-rw-r--r--install/ui/entity.js2
-rw-r--r--install/ui/host.js20
-rw-r--r--install/ui/navigation.js20
-rw-r--r--install/ui/policy.js3
-rw-r--r--install/ui/search.js12
-rw-r--r--install/ui/test/data/dnsrecord_find.json37
-rw-r--r--install/ui/test/data/dnsrecord_show.json73
-rw-r--r--install/ui/test/widget_tests.js35
-rw-r--r--install/ui/user.js5
-rw-r--r--install/ui/webui.js8
-rw-r--r--install/ui/widget.js73
14 files changed, 498 insertions, 497 deletions
diff --git a/install/ui/add.js b/install/ui/add.js
index 0a414b74b..b6b797c45 100644
--- a/install/ui/add.js
+++ b/install/ui/add.js
@@ -30,6 +30,7 @@ IPA.add_dialog = function (spec) {
var that = IPA.dialog(spec);
that.method = spec.method || 'add';
+ that.pre_execute_hook = spec.pre_execute_hook;
function show_edit_page(entity_name,result){
var pkey_name = IPA.metadata.objects[entity_name].primary_key;
@@ -160,9 +161,13 @@ IPA.add_dialog = function (spec) {
//alert(JSON.stringify(command.to_json()));
+ if (that.pre_execute_hook){
+ that.pre_execute_hook(command);
+ }
if (required_fields_filled){
command.execute();
}
+
};
that.add_dialog_init = that.init;
diff --git a/install/ui/details.js b/install/ui/details.js
index 746769702..b31305c69 100644
--- a/install/ui/details.js
+++ b/install/ui/details.js
@@ -591,9 +591,9 @@ IPA.details_facet = function(spec) {
values = field.save();
if (!values) continue;
- var param_info = IPA.get_entity_param(entity_name, field.name);
+ var param_info = field.param_info;
if (param_info) {
- if (param_info['primary_key']) continue;
+ if (param_info.primary_key) continue;
if (values.length === 1) {
command.set_option(field.name, values[0]);
} else if (field.join) {
@@ -601,8 +601,7 @@ IPA.details_facet = function(spec) {
} else {
command.set_option(field.name, values);
}
-
- } else {
+ } else {
if (values.length) {
command.add_option('setattr', field.name+'='+values[0]);
} else {
diff --git a/install/ui/dns.js b/install/ui/dns.js
index d689a8941..740192653 100644
--- a/install/ui/dns.js
+++ b/install/ui/dns.js
@@ -54,13 +54,15 @@ IPA.entity_factories.dnszone = function() {
'idnsallowdynupdate',
'idnsupdatepolicy']}]
}).
- facet({
- factory: IPA.dnsrecord_facet,
- name: 'records',
+ nested_search_facet({
facet_group: 'member',
+ nested_entity : 'dnsrecord',
+ name: 'records',
title: IPA.metadata.objects.dnszone.label_singular,
label: IPA.metadata.objects.dnsrecord.label,
- columns: [
+ load: IPA.dns_record_search_load,
+ get_values: IPA.dnsrecord_get_delete_values,
+ columns:[
{
name: 'idnsname',
label: IPA.get_entity_param('dnsrecord', 'idnsname').label,
@@ -87,470 +89,271 @@ IPA.entity_factories.dnszone = function() {
build();
};
-IPA.force_dnszone_add_checkbox_widget = function(spec) {
- var param_info = IPA.get_method_option('dnszone_add', 'force');
- spec.name = 'force';
- spec.label = param_info.label;
- spec.tooltip = param_info.doc;
- spec.undo = false;
- return IPA.checkbox_widget(spec);
-};
-
-IPA.dnsrecord_facet = function(spec) {
-
- spec = spec || {};
-
- spec.disable_breadcrumb = false;
- spec.disable_facet_tabs = false;
-
- var that = IPA.search_facet(spec);
+IPA.dns_record_search_load = function (result) {
+ this.table.empty();
+ var normalized_record;
+ var dns_record_types = IPA.dns_record_types();
+ for (var i = 0; i<result.length; i++) {
+ var record = result[i];
+ for (var j =0; j < dns_record_types.length; j += 1){
+ var record_type = dns_record_types[j].value;
+ if (record[record_type]){
+ var record_of_type = record[record_type];
+ for (var k =0;
+ k < record_of_type.length;
+ k+=1)
+ {
+ normalized_record = {
+ idnsname:record.idnsname,
+ type:record_type,
+ data:record_of_type[k]
+ };
+ this.table.add_record(normalized_record);
- function generate_recordtype_list(){
- var attrs = IPA.metadata.objects.dnsrecord.default_attributes;
- var record_types = [];
- for (var i =0; i < attrs.length; i+=1){
- var attr = attrs[i];
- var index = attr.search('record$');
- if (index > -1){
- var rec_type = attr.substring(0,index);
- record_types.push(rec_type);
+ }
}
}
- return record_types;
-
- }
-
- var record_types = generate_recordtype_list();
-
- that.init = function() {
-
- that.facet_init();
-
- that.table = IPA.table_widget({
- 'class': 'content-table',
- name: 'search',
- label: IPA.metadata.objects[that.entity_name].label,
- entity_name: that.entity_name,
- scrollable: true
- });
-
- var columns = that.columns.values;
- for (var i=0; i<columns.length; i++) {
- var column = columns[i];
- that.table.add_column(column);
- }
-
- that.table.select_changed = function() {
- that.select_changed();
- };
-
- that.table.refresh = function() {
- that.refresh();
- };
-
- that.table.init();
- };
-
- function create_type_select(id,add_none) {
- var type_select = $('<select/>',{
- id: id
- });
-
- if (add_none){
- type_select.append($('<option/>', {
- text: '(any)',
- value: ''
- }));
- }
- for (var t = 0 ; t < record_types.length ; t += 1){
- var record_type = record_types[t].toUpperCase();
-
- type_select.append($('<option/>',{
- text: record_type,
- value: record_type
- }));
- }
- return type_select;
}
+};
- that.add = function() {
-
- var title = IPA.messages.dialogs.add_title;
- var label = IPA.metadata.objects.dnsrecord.label_singular;
- title = title.replace('${entity}', label);
-
- var dialog = IPA.dialog({
- title: title
- });
-
- dialog.create = function() {
-
- var dl = $('<dl/>').appendTo(dialog.container);
-
- $('<dt/>', {
- html: IPA.get_entity_param('dnsrecord', 'idnsname').label
- }).appendTo(dl);
-
- var dd = $('<dd/>').appendTo(dl);
-
- dialog.resource = $('<input/>', {
- type: 'text'
- }).appendTo(dd);
-
- $('<dt/>', {
- html: IPA.messages.objects.dnsrecord.type
- }).appendTo(dl);
-
- dd = $('<dd/>').appendTo(dl);
-
- dialog.type = create_type_select('dns-record-type').appendTo(dd);
-
- $('<dt/>', {
- html: IPA.messages.objects.dnsrecord.data
- }).appendTo(dl);
-
- dd = $('<dd/>').appendTo(dl);
-
- dialog.data = $('<textarea/>', {
- rows: 8,
- cols: 20
- }).appendTo(dd);
- };
-
- dialog.add_button(IPA.messages.buttons.add, function() {
- dialog.add();
- dialog.close();
- });
-
- dialog.add_button(IPA.messages.buttons.add_and_add_another, function() {
- dialog.add();
- });
-
- dialog.add_button(IPA.messages.buttons.cancel, function() {
- dialog.close();
- });
-
- dialog.add = function() {
-
- var pkey = IPA.nav.get_state(that.entity_name+'-pkey');
- var resource = dialog.resource.val();
-
- var options = {};
- var key = dialog.type.val().toLowerCase()+'record';
- options[key] = dialog.data.val();
-
- var command = IPA.command({
- entity: 'dnsrecord',
- method: 'add',
- args: [pkey, resource],
- options: options,
- on_success: function(data, text_status, xhr) {
- that.refresh();
+IPA.entity_factories.dnsrecord = function() {
+ return IPA.entity_builder().
+ entity('dnsrecord').
+ containing_entity('dnszone').
+ details_facet({
+ disable_breadcrumb: false,
+ sections:[
+ {
+ name:'identity',
+ label: IPA.messages.details.identity,
+ fields:[
+ {
+ factory:IPA.dnsrecord_host_link_widget,
+ name: 'idnsname',
+ other_entity:'host',
+ label:'Record Name'
+ }
+ ]
+ },
+ {
+ name:'standard',
+ label:'Standard Records',
+ fields:[
+ { factory: IPA.multivalued_text_widget,
+ name: 'arecord',
+ param_info: {primary_key: false},
+ label:'A'
+ },
+ { factory: IPA.multivalued_text_widget,
+ name: 'aaaarecord',
+ param_info: {primary_key: false},
+ label:'AAAA'
+ },
+ { factory: IPA.multivalued_text_widget,
+ name: 'ptrrecord',
+ param_info: {primary_key: false},
+ label:'PTR'
+ },
+ { factory: IPA.multivalued_text_widget,
+ name: 'srvrecord',
+ param_info: {primary_key: false},
+ label:'SRV'
+ },
+ { factory: IPA.multivalued_text_widget,
+ name: 'txtrecord',
+ param_info: {primary_key: false},
+ label:'TXT'
+ },
+ { factory: IPA.multivalued_text_widget,
+ name: 'cnamerecord',
+ param_info: {primary_key: false},
+ label:'CNAME'
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'MX',
+ param_info: {primary_key: false},
+ name:"mxrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'NS',
+ param_info: {primary_key: false},
+ name:"nsrecord"
+ }
+
+ ]
+ },
+ {
+ name:'unusual',
+ label:'Other Record Types',
+ fields:[
+ { factory: IPA.multivalued_text_widget,
+ label:'AFSDB',
+ param_info: {primary_key: false},
+ name: "afsdbrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'CERT',
+ param_info: {primary_key: false},
+ name:"certrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'DNAME',
+ param_info: {primary_key: false},
+ name:"dnamerecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'DSRECORD',
+ param_info: {primary_key: false},
+ name:"dsrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'KEY',
+ param_info: {primary_key: false},
+ name:"keyrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'KX',
+ param_info: {primary_key: false},
+ name:"kxrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'LOC',
+ param_info: {primary_key: false},
+ name:"locrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'NAPTR',
+ name:"naptrrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'NSEC',
+ param_info: {primary_key: false},
+ name:"nsecrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'RRSIG',
+ param_info: {primary_key: false},
+ name:"rrsigrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'SIG',
+ param_info: {primary_key: false},
+ name:"sigrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'SSHFP',
+ param_info: {primary_key: false},
+ name:"sshfprecord"
+ }
+ ]
}
- });
-
- command.execute();
- };
-
- dialog.init();
-
- dialog.open(that.container);
- };
-
- that.remove = function() {
-
- var values = that.table.get_selected_rows();
-
- if (!values.length) {
- return;
- }
-
- var zone = IPA.nav.get_state('dnszone-pkey');
-
- var records = [];
-
- values.each(function() {
- var tr = $(this);
-
- records.push({
- resource: $('span[name=idnsname]', tr).text(),
- type: $('span[name=type]', tr).text().toLowerCase(),
- data: $('span[name=data]', tr).text()
- });
- });
-
- var title = IPA.messages.dialogs.remove_title;
- var label = IPA.metadata.objects.dnsrecord.label;
- title = title.replace('${entity}', label);
-
- var dialog = IPA.dialog({
- title: title
- });
-
- dialog.create = function() {
-
- var table = $('<table/>', {
- 'class': 'search-table'
- }).appendTo(dialog.container);
-
- var thead = $('<thead/>').appendTo(table);
-
- var tr = $('<tr/>').appendTo(thead);
-
- $('<th/>', {
- text: IPA.get_entity_param('dnsrecord', 'idnsname').label
- }).appendTo(tr);
-
- $('<th/>', {
- text: IPA.messages.objects.dnsrecord.type
- }).appendTo(tr);
-
- var tbody = $('<tbody/>').appendTo(table);
-
- for (var i=0; i<records.length; i++) {
- var record = records[i];
-
- tr = $('<tr/>').appendTo(tbody);
-
- $('<td/>', {
- html: record.resource
- }).appendTo(tr);
-
- $('<td/>', {
- html: record.type
- }).appendTo(tr);
- }
-
- $('<p/>', {
- text: IPA.messages.search.delete_confirm
- }).appendTo(dialog.container);
- };
-
- dialog.add_button(IPA.messages.buttons.remove, function() {
-
- var batch = IPA.batch_command({
- on_success: function() {
- that.refresh();
- dialog.close();
+ ]
+ }).
+ adder_dialog({
+ pre_execute_hook:function(command){
+ var record_type = command.options.record_type;
+ var record_data = command.options.record_data;
+
+ delete command.options.record_type;
+ delete command.options.record_data;
+ command.options[record_type] = record_data;
+ },
+ fields: [
+ 'idnsname',
+ {
+ name:'record_type',
+ label:IPA.messages.objects.dnsrecord.type,
+ factory:IPA.dnsrecord_type_widget,
+ undo: false
},
- on_error: function() {
- that.refresh();
- dialog.close();
+ {
+ name:'record_data',
+ label:IPA.messages.objects.dnsrecord.data,
+ factory:IPA.text_widget,
+ param_info:{required:true},
+ undo: false
}
- });
-
- for (var i=0; i<records.length; i++) {
- var record = records[i];
-
- var command = IPA.command({
- entity: 'dnsrecord',
- method: 'del',
- args: [zone, record.resource]
- });
-
- command.set_option(record.type+'record', record.data);
-
- batch.add_command(command);
- }
-
- batch.execute();
- });
-
- dialog.add_button(IPA.messages.buttons.cancel, function() {
- dialog.close();
- });
-
- dialog.init();
-
- dialog.open(that.container);
- };
-
- that.create_header = function(container) {
-
- that.facet_create_header(container);
-
- var span = $('<span/>', {
- 'class': 'right-aligned-facet-controls'
- }).appendTo(that.controls);
-
- that.filter = $('<input/>', {
- type: 'text',
- 'class': 'search-filter',
- name: 'filter'
- }).appendTo(span);
-
- that.filter.keypress(function(e) {
- /* if the key pressed is the enter key */
- if (e.which == 13) {
- that.find();
- }
- });
-
- /*
- The old DNS plugin allowed for search based on record type.
- This one does not. If the plugin gets modified to support
- Record type searches, uncomment the following lines and
- adjust the code that modifies the search parameters.
-
- that.controls.append('Type');
- create_type_select('dns-record-type-filter',true).
- appendTo(that.controls);
- */
-
- that.find_button = IPA.action_button({
- name: 'find',
- icon: 'search-icon',
- click: function(){
- that.find();
- return false;
- }
- }).appendTo(span);
-
- that.controls.append(IPA.create_network_spinner());
-
- that.remove_button = IPA.action_button({
- name: 'remove',
- label: IPA.messages.buttons.remove,
- icon: 'remove-icon',
- click: function() {
- if (that.remove_button.hasClass('input_link_disabled')) return false;
- that.remove();
- return false;
- }
- }).appendTo(that.controls);
-
- that.add_button = IPA.action_button({
- name: 'add',
- label: IPA.messages.buttons.add,
- icon: 'add-icon',
- click: function() {
- that.add();
- return false;
- }
- }).appendTo(that.controls);
- };
-
- that.create_content = function(container) {
-
- that.table.create(container);
- that.table.setup(container);
- };
-
- that.setup = function(container) {
-
- that.facet_setup(container);
-
- //commented out until data is searchable
- //control_span.append('Data');
- //control_span.append($('<input />',{
- // type: "text",
- // id: 'dns-record-data-filter',
- // name: 'search-' + obj_name + '-filter'
- //}));
- };
-
- that.show = function() {
- that.facet_show();
+ ]
+ }).
+ build();
+};
- that.record = IPA.nav.get_state(that.entity_name+'-record');
- that.pkey = IPA.nav.get_state(that.entity_name+'-pkey');
- that.header.set_pkey(that.pkey);
+IPA.dnsrecord_host_link_widget = function(spec){
+ var that = IPA.entity_link_widget(spec);
+ that.other_pkeys = function(){
+ var entity = IPA.get_entity(that.entity_name);
+ var pkey = entity.get_primary_key();
+ return [pkey[0]+'.'+pkey[1]];
};
+ return that;
+};
-
- that.get_records = function(result) {
- var idnsname;
- if (result.idnsname) {
- idnsname = result.idnsname[0];
- } else {
- idnsname = result.dn.split(',')[0].split('=')[1];
+IPA.dns_record_types = function(){
+ var attrs = IPA.metadata.objects.dnsrecord.default_attributes;
+ var record_types = [];
+ for (var i =0; i < attrs.length; i+=1){
+ var attr = attrs[i];
+ var index = attr.search('record$');
+ if (index > -1){
+ var rec_type = {
+ label: attr.substring(0,index).toUpperCase(),
+ value: attr
+ };
+ record_types.push(rec_type);
}
+ }
+ return record_types;
+};
- var records = [];
- for (var i=0; i<record_types.length; i++){
- var type = record_types[i];
- var data = result[type+'record'] || [];
- for (var j =0 ; j < data.length; j+=1){
- var record = {
- idnsname: idnsname,
- type : type,
- data : data[j]
- };
- records.unshift(record);
- }
- }
+IPA.dnsrecord_type_widget = function (spec){
- return records;
- };
+ spec.options = IPA.dns_record_types();
+ var that = IPA.select_widget(spec);
+ return that;
+};
+IPA.force_dnszone_add_checkbox_widget = function(spec) {
+ var param_info = IPA.get_method_option('dnszone_add', 'force');
+ spec.name = 'force';
+ spec.label = param_info.label;
+ spec.tooltip = param_info.doc;
+ spec.undo = false;
+ return IPA.checkbox_widget(spec);
+};
- that.refresh = function() {
- function on_success(data, text_status, xhr) {
+IPA.dnsrecord_get_delete_values = function(){
- that.table.empty();
+ var records = {};
+ var value;
+ var record_type;
+ $('input[name="select"]:checked', this.table.tbody).each(function() {
- var result = data.result.result;
- for (var i = 0; i<result.length; i++) {
- var records = that.get_records(result[i]);
+ $('span',$(this).parent().parent()).each(function(){
+ var name = this.attributes['name'].value;
- for (var j =0; j < records.length; j +=1){
- var record = records[j];
- that.table.add_record(record);
+ if (name === 'idnsname'){
+ value = records[$(this).text()];
+ if (!value){
+ value = {pkey:$(this).text()};
+ records[$(this).text()] = value;
+ }
+ }else if (name === 'type'){
+ record_type = $(this).text();
+ }else if (name === 'data'){
+ if (!value[record_type]){
+ value[record_type] = $(this).text();
+ }else{
+ value[record_type] += "," + $(this).text();
}
}
+ });
+ });
- var summary = $('span[name=summary]', that.table.tfoot);
- if (data.result.truncated) {
- var message = IPA.messages.search.truncated;
- message = message.replace('${counter}', data.result.count);
- summary.text(message);
- } else {
- summary.text(data.result.summary);
- }
-
- that.filter.focus();
- that.select_changed();
- }
-
- function on_error(xhr, text_status, error_thrown) {
- var summary = $('span[name=summary]', that.table.tfoot).empty();
- summary.append(error_thrown.name+': '+error_thrown.message);
- }
-
- var options = {};
-
- var filter = that.filter.val();
-/*
- if (filter){
- options.idnsname = filter;
- }
-
- var type_filter = that.container.find("#dns-record-type-filter").val();
- if (type_filter){
- options.type = type_filter;
- }
-
- var data_filter = that.container.find("#dns-record-data-filter").val();
- if (data_filter){
- options.data = data_filter;
- }
-*/
- var args = [IPA.nav.get_state(that.entity_name+'-pkey')];
-
- if (filter) {
- args.push(filter);
- }
-
- IPA.command({
- entity: 'dnsrecord',
- method: 'find',
- args: args,
- options: options,
- on_success: on_success,
- on_error: on_error
- }).execute();
- };
+ var value_array = [];
+ for (var key in records){
+ value_array.push(records[key]);
+ }
- return that;
+ return value_array;
};
diff --git a/install/ui/entity.js b/install/ui/entity.js
index 82edb7bbe..ec0317897 100644
--- a/install/ui/entity.js
+++ b/install/ui/entity.js
@@ -594,7 +594,7 @@ IPA.entity = function (spec) {
return pkey;
};
- /*gets the primary key for trhe current entity out of the URL parameters */
+ /*gets the primary key for the current entity out of the URL parameters */
that.get_primary_key = function() {
var pkey = that.get_primary_key_prefix();
var current_entity = that;
diff --git a/install/ui/host.js b/install/ui/host.js
index 6b5e3606e..fe9eabf0b 100644
--- a/install/ui/host.js
+++ b/install/ui/host.js
@@ -39,7 +39,10 @@ IPA.entity_factories.host = function () {
{
name:'details',
fields: [
- 'fqdn',
+ { factory: IPA.host_dnsrecord_entity_link_widget,
+ name: 'fqdn',
+ other_entity:'dnsrecord'
+ },
'krbprincipalname',
{
factory: IPA.text_widget,
@@ -124,6 +127,21 @@ IPA.entity_factories.host = function () {
};
+IPA.host_dnsrecord_entity_link_widget = function(spec){
+ var that = IPA.entity_link_widget(spec);
+
+ that.other_pkeys = function(){
+ var entity = IPA.get_entity(that.entity_name);
+ var pkey = entity.get_primary_key()[0];
+ var first_dot = pkey.search(/\./);
+ var pkeys = [];
+ pkeys[1] = pkey.substring(0,first_dot);
+ pkeys[0] = pkey.substring(first_dot+1);
+ return pkeys;
+ };
+ return that;
+};
+
/* Take an LDAP format date in UTC and format it */
IPA.utc_date_column_format = function(value){
if (!value) {
diff --git a/install/ui/navigation.js b/install/ui/navigation.js
index 9bcb20f05..25c519dce 100644
--- a/install/ui/navigation.js
+++ b/install/ui/navigation.js
@@ -172,6 +172,26 @@ IPA.navigation = function(spec) {
that.push_state(state);
};
+ /*like show page, but works for nested entities */
+ that.show_entity_page = function(entity, facet_name, pkeys) {
+ var state = that.get_path_state(entity.name);
+
+ if (facet_name) {
+ state[entity.name + '-facet'] = facet_name;
+ }
+
+ if (pkeys) {
+ var current_entity = entity;
+ while (current_entity){
+ state[current_entity.name + '-pkey'] = pkeys.pop();
+ current_entity = current_entity.containing_entity;
+ }
+ }
+
+ that.push_state(state);
+ };
+
+
that.create = function() {
var container = $('<div/>', {
diff --git a/install/ui/policy.js b/install/ui/policy.js
index cd0e499e1..46582f468 100644
--- a/install/ui/policy.js
+++ b/install/ui/policy.js
@@ -37,8 +37,7 @@ IPA.entity_factories.pwpolicy = function() {
{
factory: IPA.entity_link_widget,
name: 'cn',
- entity: 'group',
- no_link_value: 'global_policy'
+ other_entity: 'group'
},
'krbmaxpwdlife','krbminpwdlife','krbpwdhistorylength',
'krbpwdmindiffchars','krbpwdminlength']
diff --git a/install/ui/search.js b/install/ui/search.js
index b5f71e0d5..91f3d0b23 100644
--- a/install/ui/search.js
+++ b/install/ui/search.js
@@ -237,7 +237,11 @@ IPA.search_facet = function(spec) {
if (value instanceof Object){
for (var key in value){
if (value.hasOwnProperty(key)){
- command.set_option(key, value[key]);
+ if (key === 'pkey'){
+ command.add_arg(value[key]);
+ }else{
+ command.set_option(key, value[key]);
+ }
}
}
}else{
@@ -261,7 +265,7 @@ IPA.search_facet = function(spec) {
IPA.nav.push_state(state);
};
- that.load = function(result) {
+ function load(result) {
that.table.empty();
@@ -269,7 +273,9 @@ IPA.search_facet = function(spec) {
var record = that.table.get_record(result[i], 0);
that.table.add_record(record);
}
- };
+ }
+
+ that.load = spec.load || load;
that.refresh = function() {
that.search_refresh(that.entity);
diff --git a/install/ui/test/data/dnsrecord_find.json b/install/ui/test/data/dnsrecord_find.json
index fa103d109..87160e55e 100644
--- a/install/ui/test/data/dnsrecord_find.json
+++ b/install/ui/test/data/dnsrecord_find.json
@@ -2,7 +2,7 @@
"error": null,
"id": null,
"result": {
- "count": 11,
+ "count": 12,
"result": [
{
"dn": "idnsname=ayoung.boston.devel.redhat.com,cn=dns,dc=server15,dc=ayoung,dc=boston,dc=devel,dc=redhat,dc=com",
@@ -96,20 +96,41 @@
},
{
"aaaarecord": [
- "00::11",
- "00::112"
- ],
- "arecord": [
- "192.168.122.28",
- "1.2.3.4"
+ "fec0::5054:ff:feb5:5a47"
],
"dn": "idnsname=server15,idnsname=ayoung.boston.devel.redhat.com,cn=dns,dc=server15,dc=ayoung,dc=boston,dc=devel,dc=redhat,dc=com",
"idnsname": [
"server15"
]
+ },
+ {
+ "aaaarecord": [
+ "feed:babe:beef:cafe::0001",
+ "feed:babe:beef:cafe::0002",
+ "feed:babe:beef:cafe::0004"
+ ],
+ "arecord": [
+ "3.4.5.6",
+ "1.3.5.7",
+ "10.10.2.1"
+ ],
+ "dn": "idnsname=testrec,idnsname=ayoung.boston.devel.redhat.com,cn=dns,dc=server15,dc=ayoung,dc=boston,dc=devel,dc=redhat,dc=com",
+ "idnsname": [
+ "testrec"
+ ],
+ "keyrecord": [
+ "key"
+ ],
+ "srvrecord": [
+ "1 1 80 server15"
+ ],
+ "txtrecord": [
+ "A TExt Record",
+ "Another Text Record"
+ ]
}
],
"summary": null,
"truncated": false
}
-}
+} \ No newline at end of file
diff --git a/install/ui/test/data/dnsrecord_show.json b/install/ui/test/data/dnsrecord_show.json
new file mode 100644
index 000000000..e2a412546
--- /dev/null
+++ b/install/ui/test/data/dnsrecord_show.json
@@ -0,0 +1,73 @@
+{
+ "error": null,
+ "id": null,
+ "result": {
+ "result": {
+ "aaaarecord": [
+ "feed:babe:beef:cafe::0001",
+ "feed:babe:beef:cafe::0002",
+ "feed:babe:beef:cafe::0004"
+ ],
+ "arecord": [
+ "3.4.5.6",
+ "1.3.5.7",
+ "10.10.2.1"
+ ],
+ "attributelevelrights": {
+ "a6record": "rscwo",
+ "aaaarecord": "rscwo",
+ "aci": "rscwo",
+ "afsdbrecord": "rscwo",
+ "arecord": "rscwo",
+ "certrecord": "rscwo",
+ "cn": "rscwo",
+ "cnamerecord": "rscwo",
+ "dnamerecord": "rscwo",
+ "dnsclass": "rscwo",
+ "dnsttl": "rscwo",
+ "dsrecord": "rscwo",
+ "hinforecord": "rscwo",
+ "idnsallowdynupdate": "rscwo",
+ "idnsname": "rscwo",
+ "keyrecord": "rscwo",
+ "kxrecord": "rscwo",
+ "locrecord": "rscwo",
+ "mdrecord": "rscwo",
+ "minforecord": "rscwo",
+ "mxrecord": "rscwo",
+ "naptrrecord": "rscwo",
+ "nsaccountlock": "rscwo",
+ "nsecrecord": "rscwo",
+ "nsrecord": "rscwo",
+ "nxtrecord": "rscwo",
+ "objectclass": "rscwo",
+ "ptrrecord": "rscwo",
+ "rrsigrecord": "rscwo",
+ "sigrecord": "rscwo",
+ "srvrecord": "rscwo",
+ "sshfprecord": "rscwo",
+ "txtrecord": "rscwo"
+ },
+ "dn": "idnsname=testrec,idnsname=ayoung.boston.devel.redhat.com,cn=dns,dc=server15,dc=ayoung,dc=boston,dc=devel,dc=redhat,dc=com",
+ "idnsname": [
+ "testrec"
+ ],
+ "keyrecord": [
+ "key"
+ ],
+ "objectclass": [
+ "top",
+ "idnsrecord"
+ ],
+ "srvrecord": [
+ "1 1 80 server15"
+ ],
+ "txtrecord": [
+ "A Text Record",
+ "Another Text Record"
+ ]
+ },
+ "summary": null,
+ "value": "testrec"
+ }
+} \ No newline at end of file
diff --git a/install/ui/test/widget_tests.js b/install/ui/test/widget_tests.js
index f323f9697..1abac1ca0 100644
--- a/install/ui/test/widget_tests.js
+++ b/install/ui/test/widget_tests.js
@@ -275,6 +275,41 @@ test("IPA.entity_select_widget" ,function(){
});
+test("IPA.entity_link_widget" ,function(){
+ var widget = IPA.entity_link_widget({
+ name: 'gidnumber',
+ other_entity:'group',
+ });
+ base_widget_test(widget,'user','test_value');
+
+ var mock_entity = {
+ get_primary_key: function(){
+ return "";
+ }
+ };
+
+ mock_record = {'uid':'kfrog','gidnumber':'123456'};
+
+ widget.entity = mock_entity;
+ widget.create(widget_container);
+
+ var nonlink = widget_container.find('label');
+ var link = widget_container.find('a');
+
+ ok(nonlink.length > 1);
+ ok(link.length > 1);
+
+ widget.load(mock_record);
+
+ link = widget_container.find('a[text=123456]');
+
+ same(link.length, 1,'link is populated');
+ same(link.css('display'), 'inline','link is displayed');
+ same(widget.nonlink.css('display'), 'none','text is not displayed');
+
+});
+
+
test("IPA.radio_widget" ,function(){
diff --git a/install/ui/user.js b/install/ui/user.js
index fb43916f1..07fe7fbd4 100644
--- a/install/ui/user.js
+++ b/install/ui/user.js
@@ -203,8 +203,9 @@ IPA.user_status_widget = function(spec) {
var locked_field = that.record[lock_field];
var locked = false;
- if (typeof locked_field === 'array') locked_field = locked_field[0];
-
+ if (locked_field instanceof Array) {
+ locked_field = locked_field[0];
+ }
if (typeof locked_field === 'boolean') {
locked = locked_field;
} else {
diff --git a/install/ui/webui.js b/install/ui/webui.js
index 06cfa1d6e..5e0063e34 100644
--- a/install/ui/webui.js
+++ b/install/ui/webui.js
@@ -42,7 +42,13 @@ IPA.admin_navigation = function(spec) {
{entity: 'service'}
]},
{name: 'policy', label: IPA.messages.tabs.policy, children: [
- {entity: 'dnszone', label: IPA.messages.tabs.dns},
+ {name:'dns',
+ label: IPA.messages.tabs.dns,
+ children:[
+ {entity: 'dnszone', hidden:true},
+ {entity: 'dnsrecord', hidden:true}
+ ]
+ },
{name: 'hbac', label: IPA.messages.tabs.hbac, children: [
{entity: 'hbacrule'},
{entity: 'hbacsvc'},
diff --git a/install/ui/widget.js b/install/ui/widget.js
index 795fdaf60..90ebaba1f 100644
--- a/install/ui/widget.js
+++ b/install/ui/widget.js
@@ -162,8 +162,10 @@ IPA.widget = function(spec) {
that.init = function() {
if (that.entity_name) {
that.entity = IPA.get_entity(that.entity_name);
- that.param_info = IPA.get_entity_param(that.entity_name, that.name);
-
+ if (!that.param_info){
+ that.param_info =
+ IPA.get_entity_param(that.entity_name, that.name);
+ }
if (that.param_info) {
if (that.label === undefined) {
@@ -1750,10 +1752,12 @@ IPA.entity_select_widget = function(spec) {
IPA.entity_link_widget = function(spec) {
var that = IPA.widget(spec);
- var no_link_value = spec.no_link_value || null;
- var should_link = true;
- var other_pkey = null;
- var other_entity = spec.entity;
+ var other_entity = spec.other_entity;
+
+ function other_pkeys (){
+ return that.entity.get_primary_key();
+ }
+ that.other_pkeys = spec.other_pkeys || other_pkeys;
that.super_create = that.create;
that.create = function(container) {
@@ -1764,42 +1768,53 @@ IPA.entity_link_widget = function(spec) {
title: '',
html: '',
click: function() {
- if (should_link){
- IPA.nav.show_page(other_entity, 'default', other_pkey);
- }
+ IPA.nav.show_entity_page(
+ IPA.get_entity(other_entity),
+ 'default',
+ that.other_pkeys());
return false;
}
}).appendTo(container);
- that.label = $('<label/>').
+ that.nonlink = $('<label/>').
appendTo(container);
};
- that.should_link = function(){
- return (other_pkey !== no_link_value);
- };
- that.reset = function(record) {
- other_pkey = null;
+ that.super_load = that.load;
+
+ that.load = function (record){
+ that.super_load(record);
if (that.values || that.values.length > 0){
- other_pkey = that.values[0];
- var should_link = that.should_link();
- if (should_link){
- that.link.html(other_pkey);
- that.link.css('display','inline');
- that.label.css('display','none');
- }else{
- that.label.html(other_pkey);
- that.link.css('display','none');
- that.label.css('display','inline');
- }
+ that.nonlink.html(that.values[0]);
+ that.link.html(that.values[0]);
+ that.link.css('display','none');
+ that.nonlink.css('display','inline');
}else{
- should_link = false;
that.link.html('');
- that.label.html('');
+ that.nonlink.html('');
that.link.css('display','none');
- that.label.css('display','none');
+ that.nonlink.css('display','none');
+ }
+
+ function find_success(result) {
+ if (result.result){
+ that.link.css('display','inline');
+ that.nonlink.css('display','none');
+ }
+ }
+ function find_error(err){
}
+ IPA.command({
+ entity: other_entity,
+ method: 'show',
+ args:that.other_pkeys(),
+ options:{},
+ retry:false,
+ on_success:find_success,
+ on_error:find_error
+ }).execute();
};
+
return that;
}; \ No newline at end of file