Files
freeipa/install/ui/dns.js
T
Endi S. Dewata a4aba826a0 Added facet container.
Facet container has been added to hold facet header (i.e. title,
search fields, buttons, links) and facet content. Each facet now
occupies separate container, so it can be shown/hidden without
having to redraw the content.
2011-05-05 14:57:45 -05:00

553 lines
15 KiB
JavaScript

/*jsl:import ipa.js */
/*jsl:import search.js */
/* Authors:
* Adam Young <ayoung@redhat.com>
*
* Copyright (C) 2010 Red Hat
* see file 'COPYING' for use and warranty information
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js, widget.js */
/* DNS */
IPA.entity_factories.dnszone = function() {
if (!IPA.dns_enabled){
throw "DNS not enabled on server";
}
return IPA.entity_builder().
entity('dnszone').
search_facet({
columns:['idnsname']
}).
details_facet({sections:[{
name:'identity',
fields:[
'idnsname',
'idnszoneactive',
'idnssoamname',
'idnssoarname',
'idnssoaserial',
'idnssoarefresh',
'idnssoaretry',
'idnssoaexpire',
'idnssoaminimum',
'dnsttl',
'dnsclass',
'idnsallowdynupdate',
'idnsupdatepolicy']}]}).
facet({
factory: IPA.records_facet,
'name': 'records',
'facet_group':'Member',
'label': IPA.metadata.objects.dnsrecord.label
}).
standard_association_facets().
adder_dialog({
fields: [
'idnsname',
'idnssoamname',
'idnssoarname',
{factory:IPA.force_dnszone_add_checkbox_widget}]
}).
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.records_facet = function (spec){
spec = spec || {};
var that = IPA.facet(spec);
that.record = null;
var record_types =[ 'a', 'aaaa', 'dname', 'cname', 'mx', 'ns', 'ptr',
'srv', 'txt', 'a6', 'afsdb', 'cert', 'ds',
'key', 'kx', 'loc', 'naptr', 'nsec',
'rrsig', 'sshfp'];
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 dialog = IPA.dialog({
title: IPA.messages.objects.dnsrecord.add
});
dialog.create = function() {
var dl = $('<dl/>').appendTo(dialog.container);
$('<dt/>', {
html: IPA.messages.objects.dnsrecord.resource
}).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_many, function() {
dialog.add();
});
dialog.add_button(IPA.messages.buttons.add_and_close, function() {
dialog.add();
dialog.close();
});
dialog.add_button(IPA.messages.buttons.cancel, function() {
dialog.close();
});
dialog.add = function() {
var pkey = $.bbq.getState(that.entity_name+'-pkey', true);
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) {
reload();
}
});
command.execute();
};
dialog.init();
dialog.open(that.container);
};
that.remove = function() {
var zone = $.bbq.getState('dnszone-pkey', true);
var thead = that.records_table.find('thead');
thead.find("INPUT[type='checkbox']").
attr('checked', false);
var tbody = that.records_table.find('tbody');
var records = [];
$('input[type=checkbox]:checked', tbody).each(
function(index, input){
var tr = $(input).parents('tr');
var resource = $('[title=idnsname]', tr).text();
var type = $('[title=type]', tr).text().toLowerCase();
var data = $('[title=data]', tr).text();
records.push({
resource: resource,
type: type,
data: data
});
}
);
if (records.length === 0){
return;
}
var dialog = IPA.dialog({
title: IPA.messages.buttons.remove
});
dialog.create = function() {
var to_delete_table =
$('<table class="search-table" >'+
'<thead><tr><th>Resource</th><th>Type</th></tr></thead>'+
'<tbody></tbody></table>').appendTo(dialog.container);
var to_delete_body = to_delete_table.find('tbody');
for (var i=0; i<records.length; i++) {
var record = records[i];
var tr = $('<tr></tr>').appendTo(to_delete_body);
$('<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() {
reload();
dialog.close();
},
on_error: function() {
reload();
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.is_dirty = function() {
var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
var record = $.bbq.getState(that.entity_name + '-record', true) || '';
return pkey != that.pkey || record != that.record;
};
that.create_header = function(container) {
that.facet_create_header(container);
$('<input/>', {
type: 'text',
id: 'dns-record-resource-filter',
name: 'filter'
}).appendTo(that.controls);
/*
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.button({
label: IPA.messages.buttons.find,
icon: 'ui-icon-search',
click: function(){
that.refresh();
return false;
}
}).appendTo(that.controls);
that.controls.append(IPA.create_network_spinner());
that.remove_button = IPA.action_button({
label: IPA.messages.buttons.remove,
icon: 'ui-icon-trash',
click: function() {
that.remove();
return false;
}
}).appendTo(that.controls);
that.add_button = IPA.action_button({
label: IPA.messages.buttons.add,
icon: 'ui-icon-plus',
click: function() {
that.add();
return false;
}
}).appendTo(that.controls);
};
that.create_content = function(container) {
var details = $('<div/>', {
'name': 'details'
}).appendTo(container);
details.append('<span class="records-buttons"></span>');
var records_results = $('<div/>', {
'class': 'records-results'
}).appendTo(details);
that.records_table = $('<table/>', {
'class': 'search-table'
}).appendTo(records_results);
var thead = $('<thead><tr></tr></thead>').appendTo(that.records_table);
var tbody = $('<tbody></tbody>').appendTo(that.records_table);
var tfoot = $('<tfoot></tfoot>').appendTo(that.records_table);
var tr = thead.find('tr');
tr.append($('<th style="width: 15px" />').append(
$('<input />',{
type: 'checkbox',
click : function (evt){
tbody.find("INPUT[type='checkbox']").
attr('checked', this.checked);
}
})));
tr.append($('<th/>',{
text: IPA.get_entity_param("dnsrecord", "idnsname").label }));
tr.append($('<th>Record Type</th>'));
tr.append($('<th>Data</th>'));
};
that.setup = function(container) {
that.facet_setup(container);
that.record = $.bbq.getState(that.entity_name + '-record', true) || '';
that.pkey = $.bbq.getState(that.entity_name+'-pkey', true) || '';
$('h1',container).
html("<span id='headerpkey' />"+IPA.messages.objects.dnsrecord.title+":" + that.pkey);
//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.pkey = $.bbq.getState(that.entity_name+'-pkey', true) || '';
that.entity.header.set_pkey(that.pkey);
that.entity.header.back_link.css('visibility', 'visible');
that.entity.header.facet_tabs.css('visibility', 'visible');
};
function load_on_win(data){
display(that.entity_name,data);
}
function load_on_fail(data){
display(that.entity_name,data);
}
function reload(){
that.refresh();
}
that.refresh = function() {
var options = {};
var resource_filter = that.container.
find("#dns-record-resource-filter").val();
// if (resource_filter){
// options.idnsname = resource_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 pkey = [$.bbq.getState(that.entity_name + '-pkey', true)];
if (resource_filter){
pkey.push(resource_filter);
}
IPA.command({
entity: 'dnsrecord',
method: 'find',
args: pkey,
options: options,
on_success: load_on_win,
on_error:load_on_fail
}).execute();
};
function generate_tr(thead, tbody, result){
function generate_checkbox_td(tr, pkey) {
var checkbox = $('<input />', {
name: pkey,
title: pkey,
type: 'checkbox',
'class': 'search-selector'
});
var td = $('<td></td>');
td.append(checkbox);
tr.append(td);
}
var tr = $('<tr></tr>').appendTo(tbody);
generate_checkbox_td(tr, /*pkey_value*/ '');
//TODO get this fixed on the back end. For now, workaround
if (result.idnsname){
tr.append($('<td/>',{
title:'idnsname',
text: result.idnsname[0]
}));
}else{
tr.append($('<td/>',{
title:'idnsname',
text: result.dn.split(',')[0].split('=')[1]
}));
}
for (var i = 0; i < record_types.length; i += 1){
var field_name = record_types[i];
var field = result[field_name+'record'];
if ( field ){
var record_type = field_name;
var record_data = field[0];
break;
}
}
tr.append($('<td/>',{
title:'type',
text: record_type
}));
tr.append($('<td/>',{
title:'data',
text: record_data
}));
}
//TODO this is cut and pasted from search, we need to unify
function display(obj_name, data){
var selector = '.entity[name=' + obj_name + ']';
var thead = $(selector + ' thead');
var tbody = $(selector + ' tbody');
var tfoot = $(selector + ' tfoot');
tbody.find('tr').remove();
var result = data.result.result;
for (var i = 0; i < result.length; ++i){
generate_tr(thead, tbody, result[i]);
}
tfoot.find('td').remove();
if (data.result.truncated) {
var message = IPA.messages.search.truncated;
message = message.replace('${counter}', data.result.count);
tfoot.append($('<td />',{
colspan:2,
text:message}));
} else {
tfoot.append($('<td/>',{
colspan:2,
text:data.result.summary}));
}
}
return that;
};