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
This commit is contained in:
Adam Young 2011-07-08 12:06:30 -04:00 committed by Endi S. Dewata
parent bccdc7e03d
commit a746c613a4
14 changed files with 510 additions and 509 deletions

View File

@ -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;

View File

@ -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 {

View File

@ -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,6 +89,229 @@ IPA.entity_factories.dnszone = function() {
build();
};
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);
}
}
}
}
};
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"
}
]
}
]
}).
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
},
{
name:'record_data',
label:IPA.messages.objects.dnsrecord.data,
factory:IPA.text_widget,
param_info:{required:true},
undo: false
}
]
}).
build();
};
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;
};
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;
};
IPA.dnsrecord_type_widget = function (spec){
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';
@ -96,461 +321,39 @@ IPA.force_dnszone_add_checkbox_widget = function(spec) {
return IPA.checkbox_widget(spec);
};
IPA.dnsrecord_facet = function(spec) {
spec = spec || {};
IPA.dnsrecord_get_delete_values = function(){
spec.disable_breadcrumb = false;
spec.disable_facet_tabs = false;
var records = {};
var value;
var record_type;
$('input[name="select"]:checked', this.table.tbody).each(function() {
var that = IPA.search_facet(spec);
$('span',$(this).parent().parent()).each(function(){
var name = this.attributes['name'].value;
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);
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();
}
}
}
return record_types;
});
});
var value_array = [];
for (var key in records){
value_array.push(records[key]);
}
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();
}
});
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();
},
on_error: function() {
that.refresh();
dialog.close();
}
});
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();
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);
};
that.get_records = function(result) {
var idnsname;
if (result.idnsname) {
idnsname = result.idnsname[0];
} else {
idnsname = result.dn.split(',')[0].split('=')[1];
}
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);
}
}
return records;
};
that.refresh = function() {
function on_success(data, text_status, xhr) {
that.table.empty();
var result = data.result.result;
for (var i = 0; i<result.length; i++) {
var records = that.get_records(result[i]);
for (var j =0; j < records.length; j +=1){
var record = records[j];
that.table.add_record(record);
}
}
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();
};
return that;
return value_array;
};

View File

@ -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;

View File

@ -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) {

View File

@ -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/>', {

View File

@ -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']

View File

@ -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);

View File

@ -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
}
}
}

View File

@ -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"
}
}

View File

@ -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(){

View File

@ -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 {

View File

@ -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'},

View File

@ -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.super_load = that.load;
that.load = function (record){
that.super_load(record);
if (that.values || that.values.length > 0){
that.nonlink.html(that.values[0]);
that.link.html(that.values[0]);
that.link.css('display','none');
that.nonlink.css('display','inline');
}else{
that.link.html('');
that.nonlink.html('');
that.link.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();
};
that.reset = function(record) {
other_pkey = null;
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');
}
}else{
should_link = false;
that.link.html('');
that.label.html('');
that.link.css('display','none');
that.label.css('display','none');
}
};
return that;
};