summaryrefslogtreecommitdiffstats
path: root/install/ui/dns.js
diff options
context:
space:
mode:
authorAdam Young <ayoung@redhat.com>2011-07-08 12:06:30 -0400
committerEndi S. Dewata <edewata@redhat.com>2011-07-13 21:57:18 +0000
commita746c613a4fb3d0eed5c73455ebb2e674ed7793d (patch)
tree09c693a9b944d0183753da302c4386f2679e4d7f /install/ui/dns.js
parentbccdc7e03db465201c14ddd912696afee6124437 (diff)
downloadfreeipa-a746c613a4fb3d0eed5c73455ebb2e674ed7793d.tar.gz
freeipa-a746c613a4fb3d0eed5c73455ebb2e674ed7793d.tar.xz
freeipa-a746c613a4fb3d0eed5c73455ebb2e674ed7793d.zip
dnsrecord-mod ui
Brings the DNS record infrastructure in line with the other entities. Uses widgets, nested search, and a littel bit of overloading for dns specific behavior The records now have their own page. simplified link widget and use for dns links work for nested entities. change the field in the link widget to other_entity to avoid name collision. unit test for entity link. fixed reference to entity for getting pkeys work around lack of setattr for dns record mod. update wasn't deducing locked_field type correctly. don't overwrite param_info in init data is required on adder dialog delete works for multiple records use show instead of find for entity_link_widget. https://fedorahosted.org/freeipa/ticket/1038 https://fedorahosted.org/freeipa/ticket/1448 https://fedorahosted.org/freeipa/ticket/577 https://fedorahosted.org/freeipa/ticket/1460
Diffstat (limited to 'install/ui/dns.js')
-rw-r--r--install/ui/dns.js695
1 files changed, 249 insertions, 446 deletions
diff --git a/install/ui/dns.js b/install/ui/dns.js
index d689a8941..740192653 100644
--- a/install/ui/dns.js
+++ b/install/ui/dns.js
@@ -54,13 +54,15 @@ IPA.entity_factories.dnszone = function() {
'idnsallowdynupdate',
'idnsupdatepolicy']}]
}).
- facet({
- factory: IPA.dnsrecord_facet,
- name: 'records',
+ nested_search_facet({
facet_group: 'member',
+ nested_entity : 'dnsrecord',
+ name: 'records',
title: IPA.metadata.objects.dnszone.label_singular,
label: IPA.metadata.objects.dnsrecord.label,
- columns: [
+ load: IPA.dns_record_search_load,
+ get_values: IPA.dnsrecord_get_delete_values,
+ columns:[
{
name: 'idnsname',
label: IPA.get_entity_param('dnsrecord', 'idnsname').label,
@@ -87,470 +89,271 @@ IPA.entity_factories.dnszone = function() {
build();
};
-IPA.force_dnszone_add_checkbox_widget = function(spec) {
- var param_info = IPA.get_method_option('dnszone_add', 'force');
- spec.name = 'force';
- spec.label = param_info.label;
- spec.tooltip = param_info.doc;
- spec.undo = false;
- return IPA.checkbox_widget(spec);
-};
-
-IPA.dnsrecord_facet = function(spec) {
-
- spec = spec || {};
-
- spec.disable_breadcrumb = false;
- spec.disable_facet_tabs = false;
-
- var that = IPA.search_facet(spec);
+IPA.dns_record_search_load = function (result) {
+ this.table.empty();
+ var normalized_record;
+ var dns_record_types = IPA.dns_record_types();
+ for (var i = 0; i<result.length; i++) {
+ var record = result[i];
+ for (var j =0; j < dns_record_types.length; j += 1){
+ var record_type = dns_record_types[j].value;
+ if (record[record_type]){
+ var record_of_type = record[record_type];
+ for (var k =0;
+ k < record_of_type.length;
+ k+=1)
+ {
+ normalized_record = {
+ idnsname:record.idnsname,
+ type:record_type,
+ data:record_of_type[k]
+ };
+ this.table.add_record(normalized_record);
- function generate_recordtype_list(){
- var attrs = IPA.metadata.objects.dnsrecord.default_attributes;
- var record_types = [];
- for (var i =0; i < attrs.length; i+=1){
- var attr = attrs[i];
- var index = attr.search('record$');
- if (index > -1){
- var rec_type = attr.substring(0,index);
- record_types.push(rec_type);
+ }
}
}
- return record_types;
-
- }
-
- var record_types = generate_recordtype_list();
-
- that.init = function() {
-
- that.facet_init();
-
- that.table = IPA.table_widget({
- 'class': 'content-table',
- name: 'search',
- label: IPA.metadata.objects[that.entity_name].label,
- entity_name: that.entity_name,
- scrollable: true
- });
-
- var columns = that.columns.values;
- for (var i=0; i<columns.length; i++) {
- var column = columns[i];
- that.table.add_column(column);
- }
-
- that.table.select_changed = function() {
- that.select_changed();
- };
-
- that.table.refresh = function() {
- that.refresh();
- };
-
- that.table.init();
- };
-
- function create_type_select(id,add_none) {
- var type_select = $('<select/>',{
- id: id
- });
-
- if (add_none){
- type_select.append($('<option/>', {
- text: '(any)',
- value: ''
- }));
- }
- for (var t = 0 ; t < record_types.length ; t += 1){
- var record_type = record_types[t].toUpperCase();
-
- type_select.append($('<option/>',{
- text: record_type,
- value: record_type
- }));
- }
- return type_select;
}
+};
- that.add = function() {
-
- var title = IPA.messages.dialogs.add_title;
- var label = IPA.metadata.objects.dnsrecord.label_singular;
- title = title.replace('${entity}', label);
-
- var dialog = IPA.dialog({
- title: title
- });
-
- dialog.create = function() {
-
- var dl = $('<dl/>').appendTo(dialog.container);
-
- $('<dt/>', {
- html: IPA.get_entity_param('dnsrecord', 'idnsname').label
- }).appendTo(dl);
-
- var dd = $('<dd/>').appendTo(dl);
-
- dialog.resource = $('<input/>', {
- type: 'text'
- }).appendTo(dd);
-
- $('<dt/>', {
- html: IPA.messages.objects.dnsrecord.type
- }).appendTo(dl);
-
- dd = $('<dd/>').appendTo(dl);
-
- dialog.type = create_type_select('dns-record-type').appendTo(dd);
-
- $('<dt/>', {
- html: IPA.messages.objects.dnsrecord.data
- }).appendTo(dl);
-
- dd = $('<dd/>').appendTo(dl);
-
- dialog.data = $('<textarea/>', {
- rows: 8,
- cols: 20
- }).appendTo(dd);
- };
-
- dialog.add_button(IPA.messages.buttons.add, function() {
- dialog.add();
- dialog.close();
- });
-
- dialog.add_button(IPA.messages.buttons.add_and_add_another, function() {
- dialog.add();
- });
-
- dialog.add_button(IPA.messages.buttons.cancel, function() {
- dialog.close();
- });
-
- dialog.add = function() {
-
- var pkey = IPA.nav.get_state(that.entity_name+'-pkey');
- var resource = dialog.resource.val();
-
- var options = {};
- var key = dialog.type.val().toLowerCase()+'record';
- options[key] = dialog.data.val();
-
- var command = IPA.command({
- entity: 'dnsrecord',
- method: 'add',
- args: [pkey, resource],
- options: options,
- on_success: function(data, text_status, xhr) {
- that.refresh();
+IPA.entity_factories.dnsrecord = function() {
+ return IPA.entity_builder().
+ entity('dnsrecord').
+ containing_entity('dnszone').
+ details_facet({
+ disable_breadcrumb: false,
+ sections:[
+ {
+ name:'identity',
+ label: IPA.messages.details.identity,
+ fields:[
+ {
+ factory:IPA.dnsrecord_host_link_widget,
+ name: 'idnsname',
+ other_entity:'host',
+ label:'Record Name'
+ }
+ ]
+ },
+ {
+ name:'standard',
+ label:'Standard Records',
+ fields:[
+ { factory: IPA.multivalued_text_widget,
+ name: 'arecord',
+ param_info: {primary_key: false},
+ label:'A'
+ },
+ { factory: IPA.multivalued_text_widget,
+ name: 'aaaarecord',
+ param_info: {primary_key: false},
+ label:'AAAA'
+ },
+ { factory: IPA.multivalued_text_widget,
+ name: 'ptrrecord',
+ param_info: {primary_key: false},
+ label:'PTR'
+ },
+ { factory: IPA.multivalued_text_widget,
+ name: 'srvrecord',
+ param_info: {primary_key: false},
+ label:'SRV'
+ },
+ { factory: IPA.multivalued_text_widget,
+ name: 'txtrecord',
+ param_info: {primary_key: false},
+ label:'TXT'
+ },
+ { factory: IPA.multivalued_text_widget,
+ name: 'cnamerecord',
+ param_info: {primary_key: false},
+ label:'CNAME'
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'MX',
+ param_info: {primary_key: false},
+ name:"mxrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'NS',
+ param_info: {primary_key: false},
+ name:"nsrecord"
+ }
+
+ ]
+ },
+ {
+ name:'unusual',
+ label:'Other Record Types',
+ fields:[
+ { factory: IPA.multivalued_text_widget,
+ label:'AFSDB',
+ param_info: {primary_key: false},
+ name: "afsdbrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'CERT',
+ param_info: {primary_key: false},
+ name:"certrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'DNAME',
+ param_info: {primary_key: false},
+ name:"dnamerecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'DSRECORD',
+ param_info: {primary_key: false},
+ name:"dsrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'KEY',
+ param_info: {primary_key: false},
+ name:"keyrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'KX',
+ param_info: {primary_key: false},
+ name:"kxrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'LOC',
+ param_info: {primary_key: false},
+ name:"locrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'NAPTR',
+ name:"naptrrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'NSEC',
+ param_info: {primary_key: false},
+ name:"nsecrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'RRSIG',
+ param_info: {primary_key: false},
+ name:"rrsigrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'SIG',
+ param_info: {primary_key: false},
+ name:"sigrecord"
+ },
+ { factory: IPA.multivalued_text_widget,
+ label:'SSHFP',
+ param_info: {primary_key: false},
+ name:"sshfprecord"
+ }
+ ]
}
- });
-
- command.execute();
- };
-
- dialog.init();
-
- dialog.open(that.container);
- };
-
- that.remove = function() {
-
- var values = that.table.get_selected_rows();
-
- if (!values.length) {
- return;
- }
-
- var zone = IPA.nav.get_state('dnszone-pkey');
-
- var records = [];
-
- values.each(function() {
- var tr = $(this);
-
- records.push({
- resource: $('span[name=idnsname]', tr).text(),
- type: $('span[name=type]', tr).text().toLowerCase(),
- data: $('span[name=data]', tr).text()
- });
- });
-
- var title = IPA.messages.dialogs.remove_title;
- var label = IPA.metadata.objects.dnsrecord.label;
- title = title.replace('${entity}', label);
-
- var dialog = IPA.dialog({
- title: title
- });
-
- dialog.create = function() {
-
- var table = $('<table/>', {
- 'class': 'search-table'
- }).appendTo(dialog.container);
-
- var thead = $('<thead/>').appendTo(table);
-
- var tr = $('<tr/>').appendTo(thead);
-
- $('<th/>', {
- text: IPA.get_entity_param('dnsrecord', 'idnsname').label
- }).appendTo(tr);
-
- $('<th/>', {
- text: IPA.messages.objects.dnsrecord.type
- }).appendTo(tr);
-
- var tbody = $('<tbody/>').appendTo(table);
-
- for (var i=0; i<records.length; i++) {
- var record = records[i];
-
- tr = $('<tr/>').appendTo(tbody);
-
- $('<td/>', {
- html: record.resource
- }).appendTo(tr);
-
- $('<td/>', {
- html: record.type
- }).appendTo(tr);
- }
-
- $('<p/>', {
- text: IPA.messages.search.delete_confirm
- }).appendTo(dialog.container);
- };
-
- dialog.add_button(IPA.messages.buttons.remove, function() {
-
- var batch = IPA.batch_command({
- on_success: function() {
- that.refresh();
- dialog.close();
+ ]
+ }).
+ adder_dialog({
+ pre_execute_hook:function(command){
+ var record_type = command.options.record_type;
+ var record_data = command.options.record_data;
+
+ delete command.options.record_type;
+ delete command.options.record_data;
+ command.options[record_type] = record_data;
+ },
+ fields: [
+ 'idnsname',
+ {
+ name:'record_type',
+ label:IPA.messages.objects.dnsrecord.type,
+ factory:IPA.dnsrecord_type_widget,
+ undo: false
},
- on_error: function() {
- that.refresh();
- dialog.close();
+ {
+ name:'record_data',
+ label:IPA.messages.objects.dnsrecord.data,
+ factory:IPA.text_widget,
+ param_info:{required:true},
+ undo: false
}
- });
-
- for (var i=0; i<records.length; i++) {
- var record = records[i];
-
- var command = IPA.command({
- entity: 'dnsrecord',
- method: 'del',
- args: [zone, record.resource]
- });
-
- command.set_option(record.type+'record', record.data);
-
- batch.add_command(command);
- }
-
- batch.execute();
- });
-
- dialog.add_button(IPA.messages.buttons.cancel, function() {
- dialog.close();
- });
-
- dialog.init();
-
- dialog.open(that.container);
- };
-
- that.create_header = function(container) {
-
- that.facet_create_header(container);
-
- var span = $('<span/>', {
- 'class': 'right-aligned-facet-controls'
- }).appendTo(that.controls);
-
- that.filter = $('<input/>', {
- type: 'text',
- 'class': 'search-filter',
- name: 'filter'
- }).appendTo(span);
-
- that.filter.keypress(function(e) {
- /* if the key pressed is the enter key */
- if (e.which == 13) {
- that.find();
- }
- });
-
- /*
- The old DNS plugin allowed for search based on record type.
- This one does not. If the plugin gets modified to support
- Record type searches, uncomment the following lines and
- adjust the code that modifies the search parameters.
-
- that.controls.append('Type');
- create_type_select('dns-record-type-filter',true).
- appendTo(that.controls);
- */
-
- that.find_button = IPA.action_button({
- name: 'find',
- icon: 'search-icon',
- click: function(){
- that.find();
- return false;
- }
- }).appendTo(span);
-
- that.controls.append(IPA.create_network_spinner());
-
- that.remove_button = IPA.action_button({
- name: 'remove',
- label: IPA.messages.buttons.remove,
- icon: 'remove-icon',
- click: function() {
- if (that.remove_button.hasClass('input_link_disabled')) return false;
- that.remove();
- return false;
- }
- }).appendTo(that.controls);
-
- that.add_button = IPA.action_button({
- name: 'add',
- label: IPA.messages.buttons.add,
- icon: 'add-icon',
- click: function() {
- that.add();
- return false;
- }
- }).appendTo(that.controls);
- };
-
- that.create_content = function(container) {
-
- that.table.create(container);
- that.table.setup(container);
- };
-
- that.setup = function(container) {
-
- that.facet_setup(container);
-
- //commented out until data is searchable
- //control_span.append('Data');
- //control_span.append($('<input />',{
- // type: "text",
- // id: 'dns-record-data-filter',
- // name: 'search-' + obj_name + '-filter'
- //}));
- };
-
- that.show = function() {
- that.facet_show();
+ ]
+ }).
+ build();
+};
- that.record = IPA.nav.get_state(that.entity_name+'-record');
- that.pkey = IPA.nav.get_state(that.entity_name+'-pkey');
- that.header.set_pkey(that.pkey);
+IPA.dnsrecord_host_link_widget = function(spec){
+ var that = IPA.entity_link_widget(spec);
+ that.other_pkeys = function(){
+ var entity = IPA.get_entity(that.entity_name);
+ var pkey = entity.get_primary_key();
+ return [pkey[0]+'.'+pkey[1]];
};
+ return that;
+};
-
- that.get_records = function(result) {
- var idnsname;
- if (result.idnsname) {
- idnsname = result.idnsname[0];
- } else {
- idnsname = result.dn.split(',')[0].split('=')[1];
+IPA.dns_record_types = function(){
+ var attrs = IPA.metadata.objects.dnsrecord.default_attributes;
+ var record_types = [];
+ for (var i =0; i < attrs.length; i+=1){
+ var attr = attrs[i];
+ var index = attr.search('record$');
+ if (index > -1){
+ var rec_type = {
+ label: attr.substring(0,index).toUpperCase(),
+ value: attr
+ };
+ record_types.push(rec_type);
}
+ }
+ return record_types;
+};
- var records = [];
- for (var i=0; i<record_types.length; i++){
- var type = record_types[i];
- var data = result[type+'record'] || [];
- for (var j =0 ; j < data.length; j+=1){
- var record = {
- idnsname: idnsname,
- type : type,
- data : data[j]
- };
- records.unshift(record);
- }
- }
+IPA.dnsrecord_type_widget = function (spec){
- return records;
- };
+ spec.options = IPA.dns_record_types();
+ var that = IPA.select_widget(spec);
+ return that;
+};
+IPA.force_dnszone_add_checkbox_widget = function(spec) {
+ var param_info = IPA.get_method_option('dnszone_add', 'force');
+ spec.name = 'force';
+ spec.label = param_info.label;
+ spec.tooltip = param_info.doc;
+ spec.undo = false;
+ return IPA.checkbox_widget(spec);
+};
- that.refresh = function() {
- function on_success(data, text_status, xhr) {
+IPA.dnsrecord_get_delete_values = function(){
- that.table.empty();
+ var records = {};
+ var value;
+ var record_type;
+ $('input[name="select"]:checked', this.table.tbody).each(function() {
- var result = data.result.result;
- for (var i = 0; i<result.length; i++) {
- var records = that.get_records(result[i]);
+ $('span',$(this).parent().parent()).each(function(){
+ var name = this.attributes['name'].value;
- for (var j =0; j < records.length; j +=1){
- var record = records[j];
- that.table.add_record(record);
+ if (name === 'idnsname'){
+ value = records[$(this).text()];
+ if (!value){
+ value = {pkey:$(this).text()};
+ records[$(this).text()] = value;
+ }
+ }else if (name === 'type'){
+ record_type = $(this).text();
+ }else if (name === 'data'){
+ if (!value[record_type]){
+ value[record_type] = $(this).text();
+ }else{
+ value[record_type] += "," + $(this).text();
}
}
+ });
+ });
- var summary = $('span[name=summary]', that.table.tfoot);
- if (data.result.truncated) {
- var message = IPA.messages.search.truncated;
- message = message.replace('${counter}', data.result.count);
- summary.text(message);
- } else {
- summary.text(data.result.summary);
- }
-
- that.filter.focus();
- that.select_changed();
- }
-
- function on_error(xhr, text_status, error_thrown) {
- var summary = $('span[name=summary]', that.table.tfoot).empty();
- summary.append(error_thrown.name+': '+error_thrown.message);
- }
-
- var options = {};
-
- var filter = that.filter.val();
-/*
- if (filter){
- options.idnsname = filter;
- }
-
- var type_filter = that.container.find("#dns-record-type-filter").val();
- if (type_filter){
- options.type = type_filter;
- }
-
- var data_filter = that.container.find("#dns-record-data-filter").val();
- if (data_filter){
- options.data = data_filter;
- }
-*/
- var args = [IPA.nav.get_state(that.entity_name+'-pkey')];
-
- if (filter) {
- args.push(filter);
- }
-
- IPA.command({
- entity: 'dnsrecord',
- method: 'find',
- args: args,
- options: options,
- on_success: on_success,
- on_error: on_error
- }).execute();
- };
+ var value_array = [];
+ for (var key in records){
+ value_array.push(records[key]);
+ }
- return that;
+ return value_array;
};