Host details adjustments.

The labels for the following fields in Host details page have been
changed:
 - fqdn: Fully Qualified Host Name
 - serverhostname: Host Name

The ipa_details_field_create_input() and _ipa_create_text_input()
has been converted into methods in ipa_details_field class. The code
has been modified to display read-only fields as labels instead
of disabled text fields.

The attributelevelrights in host test data files have been updated.
This commit is contained in:
Endi S. Dewata 2011-01-13 10:00:38 +07:00 committed by Endi Sukma Dewata
parent b79bf4ab17
commit d92f5bf8bb
7 changed files with 188 additions and 189 deletions

View File

@ -89,12 +89,12 @@ function ipa_details_field(spec) {
dd = ipa_create_first_dd(that.name);
dd.append(ipa_details_field_create_input.call(that, that.values[0], hint_span, rights, 0));
dd.append(that.create_value(that.values[0], hint_span, rights, 0));
dd.appendTo(that.container);
for (var i = 1; i < that.values.length; ++i) {
dd = ipa_create_other_dd(that.name);
dd.append(ipa_details_field_create_input.call(that, that.values[i], hint_span, rights, i));
dd.append(that.create_value(that.values[i], hint_span, rights, i));
dd.appendTo(that.container);
}
@ -112,12 +112,113 @@ function ipa_details_field(spec) {
} else {
dd = ipa_create_first_dd(that.name);
dd.append(ipa_details_field_create_input.call(that, '', hint_span, rights, 0));
dd.append(that.create_value('', hint_span, rights, 0));
dd.appendTo(that.container);
}
}
};
/* create an HTML element for displaying/editing an attribute
* arguments:
* attr - LDAP attribute name
* value - the attributes value */
that.create_value = function(value, hint, rights, index) {
// if field is primary key or non-writable, return a label
var label = $('<label/>', { html:value.toString() });
if (!IPA.is_field_writable(rights)) return label;
var param_info = ipa_get_param_info(that.entity_name, that.name);
if (param_info) {
if (param_info['primary_key']) return label;
if ('no_update' in param_info['flags']) return label;
}
// otherwise, create input field
var input = that.create_input(value, param_info, rights, index);
if (param_info) {
if (param_info['multivalue'] || param_info['class'] == 'List') {
input.append(_ipa_create_remove_link(that.name, param_info));
}
}
if (hint) input.after(hint);
return input;
};
/* creates a input box for editing a string attribute */
that.create_input = function(value, param_info, rights, index) {
index = index || 0;
function validate_input(text, param_info, error_link) {
if (param_info && param_info.pattern) {
var regex = new RegExp( param_info.pattern );
if (!text.match(regex)) {
error_link.style.display = "block";
if (param_info.pattern_errmsg) {
error_link.innerHTML = param_info.pattern_errmsg;
}
} else {
error_link.style.display = "none";
}
}
}
var doc = that.name;
if (param_info && param_info.doc) {
doc = param_info.doc;
}
var span = $("<Span />");
var input = $("<input/>", {
type: "text",
name: that.name,
value: value.toString(),
title: doc,
keyup: function(){
var undo_link = this.nextElementSibling;
undo_link.style.display = "inline";
var error_link = undo_link.nextElementSibling;
var text = $(this).val();
validate_input(text, param_info,error_link);
}
}).appendTo(span) ;
if (!IPA.is_field_writable(rights)) {
input.attr('disabled', 'disabled');
}
span.append($("<a/>", {
html:"undo",
"class":"ui-state-highlight ui-corner-all undo",
style:"display:none",
click: function(){
var previous_value = that.values || '';
if (index >= previous_value.length){
previous_value = '';
}else{
previous_value= previous_value[index];
}
this.previousElementSibling.value = previous_value;
this.style.display = "none";
var error_link = this.nextElementSibling;
validate_input(previous_value, param_info,error_link);
}
}));
span.append($("<span/>", {
html:"Does not match pattern",
"class":"ui-state-error ui-corner-all",
style:"display:none"
}));
return span;
};
function save() {
var values = [];
@ -178,6 +279,10 @@ function ipa_details_section(spec){
};
that.create_field = function(spec) {
//TODO: replace ipa_details_field with class-specific implementation
//Valid field classes: Str, IA5Str, Int, Bool and List
var field = ipa_details_field(spec);
that.add_field(field);
return field;
@ -332,11 +437,13 @@ function ipa_details_list_section(spec){
var field = fields[i];
var label = field.label;
if (label !== ''){
// no need to get i18n label from metadata
// because it's already done by field.init()
if (label !== '') {
label += ':';
}
var param_info = ipa_get_param_info(that.entity_name, field.name);
if (param_info && param_info['label']) label = param_info['label'];
$('<dt/>', {
html: label
@ -727,56 +834,6 @@ function ipa_insert_dd(jobj, content, dd_class){
/* mapping of parameter types to handlers used to create inputs */
var _ipa_param_type_2_handler_map = {
'Str': _ipa_create_text_input,
'IA5Str': _ipa_create_text_input,
'Int': _ipa_create_text_input,
'Bool': _ipa_create_text_input,
'List': _ipa_create_text_input
};
/* create an HTML element for displaying/editing an attribute
* arguments:
* attr - LDAP attribute name
* value - the attributes value */
function ipa_details_field_create_input(value,hint,rights, index)
{
var that = this;
var input = $("<label>",{html:value.toString()});
var param_info = ipa_get_param_info(that.entity_name, that.name);
if (!param_info) {
/* no information about the param is available, default to text input */
input = _ipa_create_text_input.call(that, value, null, rights, index);
if (hint){
input.after(hint);
}
}else if (param_info['primary_key'] ||
('no_update' in param_info['flags'])){
/* check if the param value can be modified */
/* This is currently a no-op, as we use this logic for the
default case as well */
return input;
}else{
/* call handler by param class */
var handler = _ipa_param_type_2_handler_map[param_info['class']];
if (handler) {
input = handler.call(that, value, param_info, rights, index);
if ((param_info['multivalue'] ||
param_info['class'] == 'List') &&
IPA.is_field_writable(rights)){
input.append( _ipa_create_remove_link(that.name, param_info));
}
if (hint){
input.after(hint);
}
}
}
return input;
}
/* creates a Remove link for deleting attribute values */
function _ipa_create_remove_link(attr, param_info)
{
@ -797,76 +854,6 @@ function _ipa_create_remove_link(attr, param_info)
}
/* creates a input box for editing a string attribute */
function _ipa_create_text_input(value, param_info, rights, index)
{
var that = this;
index = index || 0;
function validate_input(text, param_info,error_link){
if(param_info && param_info.pattern){
var regex = new RegExp( param_info.pattern );
if (!text.match(regex)) {
error_link.style.display ="block";
if ( param_info.pattern_errmsg){
error_link.innerHTML = param_info.pattern_errmsg;
}
}else{
error_link.style.display ="none";
}
}
}
var doc = that.name;
if (param_info && param_info.doc){
doc = param_info.doc;
}
var span = $("<Span />");
var input = $("<input/>",{
type: "text",
name: that.name,
value: value.toString(),
title: doc,
keyup: function(){
var undo_link=this.nextElementSibling;
undo_link.style.display ="inline";
var error_link = undo_link.nextElementSibling;
var text = $(this).val();
validate_input(text, param_info,error_link);
}
}).appendTo(span) ;
if (!IPA.is_field_writable(rights)){
input.attr('disabled', 'disabled');
}
span.append($("<a/>",{
html:"undo",
"class":"ui-state-highlight ui-corner-all undo",
style:"display:none",
click: function(){
var previous_value = that.values || '';
if (index >= previous_value.length){
previous_value = '';
}else{
previous_value= previous_value[index];
}
this.previousElementSibling.value = previous_value;
this.style.display = "none";
var error_link = this.nextElementSibling;
validate_input(previous_value, param_info,error_link);
}
}));
span.append($("<span/>",{
html:"Does not match pattern",
"class":"ui-state-error ui-corner-all",
style:"display:none"
}));
return span;
}
function ipa_details_field_create_add_link(title, rights, index) {
var that = this;
@ -878,7 +865,7 @@ function ipa_details_field_create_add_link(title, rights, index) {
'click': function () {
var param_info = ipa_get_param_info(that.entity_name, '');
var input = _ipa_create_text_input.call(that, '', param_info, rights, index);
var input = that.create_input('', param_info, rights, index);
link.replaceWith(input);
input.focus();

View File

@ -129,17 +129,24 @@ function ipa_host_details_facet(spec) {
});
that.add_section(section);
section.create_field({'name': 'fqdn'});
//TODO: use i18n labels
section.create_field({
name: 'fqdn',
label: 'Fully Qualified Host Name'
});
section.create_field({'name': 'krbprincipalname'});
//TODO add this to the host plugin
//TODO: add this to the host plugin
//TODO: use i18n labels
section.create_field({
'name': 'serverhostname',
'label': 'Server Host Name'
'label': 'Host Name'
});
section.create_field({'name': 'description'});
//TODO: use i18n labels
section = ipa_details_list_section({
'name': 'enrollment',
'label': 'Enrollment'

View File

@ -11,23 +11,26 @@
"fqdn": "rscwo",
"ipaclientversion": "rscwo",
"ipauniqueid": "rsc",
"krbcanonicalname": "rscwo",
"krbextradata": "rscwo",
"krblastfailedauth": "rscwo",
"krbcanonicalname": "rsc",
"krbextradata": "rsc",
"krblastfailedauth": "rsc",
"krblastpwdchange": "rscwo",
"krblastsuccessfulauth": "rscwo",
"krbloginfailedcount": "rscwo",
"krblastsuccessfulauth": "rsc",
"krbloginfailedcount": "rsc",
"krbmaxrenewableage": "rscwo",
"krbmaxticketlife": "rscwo",
"krbobjectreferences": "rscwo",
"krbpasswordexpiration": "rscwo",
"krbprincipalaliases": "rscwo",
"krbprincipalexpiration": "rscwo",
"krbpasswordexpiration": "rsc",
"krbprincipalaliases": "rsc",
"krbprincipalexpiration": "rsc",
"krbprincipalkey": "wo",
"krbprincipalname": "rscwo",
"krbprincipaltype": "rscwo",
"krbpwdhistory": "rscwo",
"krbpwdpolicyreference": "rscwo",
"krbticketpolicyreference": "rscwo",
"krbupenabled": "rscwo",
"krbprincipalname": "rsc",
"krbprincipaltype": "rsc",
"krbpwdhistory": "rsc",
"krbpwdpolicyreference": "rsc",
"krbticketflags": "rsc",
"krbticketpolicyreference": "rsc",
"krbupenabled": "rsc",
"l": "rscwo",
"managedby": "rscwo",
"memberof": "rsc",

View File

@ -11,26 +11,26 @@
"fqdn": "rscwo",
"ipaclientversion": "rscwo",
"ipauniqueid": "rsc",
"krbcanonicalname": "rscwo",
"krbextradata": "rscwo",
"krblastfailedauth": "rscwo",
"krbcanonicalname": "rsc",
"krbextradata": "rsc",
"krblastfailedauth": "rsc",
"krblastpwdchange": "rscwo",
"krblastsuccessfulauth": "rscwo",
"krbloginfailedcount": "rscwo",
"krblastsuccessfulauth": "rsc",
"krbloginfailedcount": "rsc",
"krbmaxrenewableage": "rscwo",
"krbmaxticketlife": "rscwo",
"krbobjectreferences": "rscwo",
"krbpasswordexpiration": "rscwo",
"krbprincipalaliases": "rscwo",
"krbprincipalexpiration": "rscwo",
"krbpasswordexpiration": "rsc",
"krbprincipalaliases": "rsc",
"krbprincipalexpiration": "rsc",
"krbprincipalkey": "wo",
"krbprincipalname": "rscwo",
"krbprincipaltype": "rscwo",
"krbpwdhistory": "rscwo",
"krbpwdpolicyreference": "rscwo",
"krbticketflags": "rscwo",
"krbticketpolicyreference": "rscwo",
"krbupenabled": "rscwo",
"krbprincipalname": "rsc",
"krbprincipaltype": "rsc",
"krbpwdhistory": "rsc",
"krbpwdpolicyreference": "rsc",
"krbticketflags": "rsc",
"krbticketpolicyreference": "rsc",
"krbupenabled": "rsc",
"l": "rscwo",
"managedby": "rscwo",
"memberof": "rsc",

View File

@ -11,23 +11,26 @@
"fqdn": "rscwo",
"ipaclientversion": "rscwo",
"ipauniqueid": "rsc",
"krbcanonicalname": "rscwo",
"krbextradata": "rscwo",
"krblastfailedauth": "rscwo",
"krbcanonicalname": "rsc",
"krbextradata": "rsc",
"krblastfailedauth": "rsc",
"krblastpwdchange": "rscwo",
"krblastsuccessfulauth": "rscwo",
"krbloginfailedcount": "rscwo",
"krblastsuccessfulauth": "rsc",
"krbloginfailedcount": "rsc",
"krbmaxrenewableage": "rscwo",
"krbmaxticketlife": "rscwo",
"krbobjectreferences": "rscwo",
"krbpasswordexpiration": "rscwo",
"krbprincipalaliases": "rscwo",
"krbprincipalexpiration": "rscwo",
"krbpasswordexpiration": "rsc",
"krbprincipalaliases": "rsc",
"krbprincipalexpiration": "rsc",
"krbprincipalkey": "wo",
"krbprincipalname": "rscwo",
"krbprincipaltype": "rscwo",
"krbpwdhistory": "rscwo",
"krbpwdpolicyreference": "rscwo",
"krbticketpolicyreference": "rscwo",
"krbupenabled": "rscwo",
"krbprincipalname": "rsc",
"krbprincipaltype": "rsc",
"krbpwdhistory": "rsc",
"krbpwdpolicyreference": "rsc",
"krbticketflags": "rsc",
"krbticketpolicyreference": "rsc",
"krbupenabled": "rsc",
"l": "rscwo",
"managedby": "rscwo",
"memberof": "rsc",

View File

@ -225,7 +225,7 @@ test("Testing details lifecycle: create, setup, load.", function(){
});
test("Testing _ipa_create_text_input().", function(){
test("Testing create_input().", function() {
var field = ipa_details_field({
'name': "name"
@ -234,7 +234,7 @@ test("Testing _ipa_create_text_input().", function(){
var name = "name";
var value="value";
var rights = 'rscwo'
var input = _ipa_create_text_input.call(field, value, null,rights);
var input = field.create_input(value, null, rights);
ok(input,"input not null");
var text = input.find('input');
@ -245,7 +245,7 @@ test("Testing _ipa_create_text_input().", function(){
same(text[0].type,"text" );
});
test("Testing _ipa_create_text_input() read only .", function(){
test("Testing create_input() read only .", function() {
var field = ipa_details_field({
'name': "name"
@ -254,7 +254,7 @@ test("Testing _ipa_create_text_input() read only .", function(){
var name = "name";
var value="value";
var rights = 'rsc'
var input = _ipa_create_text_input.call(field, value, null,rights);
var input = field.create_input(value, null, rights);
ok(input,"input not null");
var text = input.find('input');

View File

@ -44,6 +44,7 @@ function ipa_widget(spec) {
that.save = spec.save || save;
that.update = spec.update || update;
that.validate_input = spec.validate_input || validate_input;
that.param_info = spec.param_info;
that.__defineGetter__("entity_name", function(){
return that._entity_name;
@ -53,28 +54,26 @@ function ipa_widget(spec) {
that._entity_name = entity_name;
});
var param_info;
/*returns true and clears the error message if the field value passes
the validation pattern. If the field value does not pass validation,
displays the error message and returns false. */
function validate_input(text){
if(!(param_info && param_info.pattern)){
function validate_input(text) {
if (!(that.param_info && that.param_info.pattern)) {
return true;
}
var error_link = that.get_error_link();
if (!error_link){
if (!error_link) {
return true;
}
var regex = new RegExp( param_info.pattern );
var regex = new RegExp( that.param_info.pattern );
//If the field is empty, don't validate
if (!text || text.match(regex) ) {
if ( !text || text.match(regex) ) {
error_link.css('display', 'none');
return true;
}else{
error_link.css('display', 'block');
if ( param_info.pattern_errmsg){
error_link.html(param_info.pattern_errmsg);
if (that.param_info.pattern_errmsg) {
error_link.html(that.param_info.pattern_errmsg);
}
return false;
}
@ -82,9 +81,9 @@ function ipa_widget(spec) {
function init() {
if (that.entity_name && !that.label){
param_info = ipa_get_param_info(that.entity_name, spec.name);
if ((param_info) && (that.label === undefined)){
that.label = param_info.label;
that.param_info = ipa_get_param_info(that.entity_name, that.name);
if ((that.param_info) && (that.label === undefined)){
that.label = that.param_info.label;
}
}
}