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:
1 parent
bccdc7e03d
commit
a746c613a4
14 files changed
+510
-509
No files matched your search
@@ -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 {
|
||||
|
||||
+256
-453
@@ -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;
|
||||
|
||||
+19
-1
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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(){
|
||||
|
||||
+3
-2
@@ -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 {
|
||||
|
||||
+7
-1
@@ -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'},
|
||||
|
||||
+49
-34
@@ -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;
|
||||
};
|
||||
Reference in new issue
Block a user