mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2024-12-25 08:21:05 -06:00
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:
parent
bccdc7e03d
commit
a746c613a4
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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/>', {
|
||||
|
@ -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']
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
73
install/ui/test/data/dnsrecord_show.json
Normal file
73
install/ui/test/data/dnsrecord_show.json
Normal 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"
|
||||
}
|
||||
}
|
@ -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(){
|
||||
|
@ -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 {
|
||||
|
@ -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'},
|
||||
|
@ -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;
|
||||
};
|
Loading…
Reference in New Issue
Block a user