[Cluster-devel] conga/luci/cluster clu_portlet_fetcher cluster ...

rmccabe at sourceware.org rmccabe at sourceware.org
Wed Sep 27 22:24:13 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	rmccabe at sourceware.org	2006-09-27 22:24:11

Modified files:
	luci/cluster   : clu_portlet_fetcher clusterportlet.css 
	                 form-chooser form-macros index_html 
	                 portlet_cluconfig portlet_cluconfig_macro 
	                 resource-form-macros resource_form_handlers.js 
	                 validate_config_fence.js 
	                 validate_config_general.js 
	                 validate_config_multicast.js 
	                 validate_config_qdisk.js 

Log message:
	better javascript form validation and other minor cleanups

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/clu_portlet_fetcher.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/clusterportlet.css.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/form-chooser.diff?cvsroot=cluster&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/form-macros.diff?cvsroot=cluster&r1=1.72&r2=1.73
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/index_html.diff?cvsroot=cluster&r1=1.15&r2=1.16
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/portlet_cluconfig.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/portlet_cluconfig_macro.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/resource-form-macros.diff?cvsroot=cluster&r1=1.16&r2=1.17
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/resource_form_handlers.js.diff?cvsroot=cluster&r1=1.14&r2=1.15
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/validate_config_fence.js.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/validate_config_general.js.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/validate_config_multicast.js.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/validate_config_qdisk.js.diff?cvsroot=cluster&r1=1.2&r2=1.3

--- conga/luci/cluster/clu_portlet_fetcher	2006/06/30 17:00:02	1.1
+++ conga/luci/cluster/clu_portlet_fetcher	2006/09/27 22:24:11	1.2
@@ -7,7 +7,7 @@
 <!-- unchecked_clusystems are all clusters...the check_clusters call filters list through user permissions -->
 <span tal:define="global unchecked_clusystems root/luci/systems/cluster/objectItems"/>
 <span tal:define="global clusystems python:here.check_clusters(request,unchecked_clusystems)"/>
-<div tal:omit-tag="" metal:use-macro="here/portlet_cluconfig/macros/cluchooseportlet" /> 
+<div tal:omit-tag="" metal:use-macro="here/portlet_cluconfig/macros/cluchooseportlet" />
 <span tal:omit-tag="" tal:define="global hasclustername request/clustername |nothing"/>
 <span tal:omit-tag="" tal:condition="hasclustername">
 <div tal:omit-tag="" metal:use-macro="here/portlet_cluconfig/macros/cluconfigportlet" />
--- conga/luci/cluster/clusterportlet.css	2006/07/05 21:00:26	1.2
+++ conga/luci/cluster/clusterportlet.css	2006/09/27 22:24:11	1.3
@@ -11,29 +11,29 @@
     border-collapse: collapse;
     border-spacing: 0;
 }
-                                                                                
+
 #portal-column-one {
     vertical-align: top;
     width: 16em;
 }
-                                                                                
+
 #portal-column-content {
     vertical-align: top;
     margin: 0;
     padding: 0;
 }
-                                                                                
+
 #portal-column-two {
     vertical-align: top;
     width: 16em;
 }
-                                                                                
+
 /* Padding for the columns */
-                                                                                
+
 #portal-column-one .visualPadding {
     padding: 2em 0em 1em 2em;
 }
-                                                                                
+
 #portal-column-two .visualPadding {
     padding: 2em 2em 1em 0em;
 }
@@ -159,7 +159,8 @@
 * html li.cluConfigTreeCurrentItem a:hover {
     height: 1.6em;
 }
-.type-nodecfg, .type-nodes, .type-node, .type-nodelist, 
+
+.type-nodecfg, .type-nodes, .type-node, .type-nodelist,
 .type-nodegrid, .type-nodeadd {
 display: block;
 }
--- conga/luci/cluster/form-chooser	2006/08/16 22:23:46	1.7
+++ conga/luci/cluster/form-chooser	2006/09/27 22:24:11	1.8
@@ -3,14 +3,14 @@
     <title tal:content="template/title">The title</title>
   </head>
   <body>
- 
+
   <metal:choose-form metal:define-macro="main-form">
   <span tal:define="global waiting request/specialpagetype |nothing"/>
   <span tal:condition="busywaiting">
     <div metal:use-macro="here/form-macros/macros/busywaitpage"/>
   </span>
   <span tal:condition="not: busywaiting">
-    <span tal:omit-tag="" tal:define="global ptype request/pagetype |nothing"/>  
+    <span tal:omit-tag="" tal:define="global ptype request/pagetype |nothing"/>
     <span tal:omit-tag="" tal:condition="python: not ptype">
      <div metal:use-macro="here/form-macros/macros/entry-form"/>
     </span>
--- conga/luci/cluster/form-macros	2006/09/26 20:57:09	1.72
+++ conga/luci/cluster/form-macros	2006/09/27 22:24:11	1.73
@@ -738,7 +738,7 @@
 					<input name="password" type="password" autocomplete="off">
 				</td>
 			</tr>
-		</table> 
+		</table>
 		<input type="hidden" name="fence_type" value="wti" />
 	</div>
 
@@ -762,7 +762,7 @@
 					<input name="password" type="password" autocomplete="off">
 				</td>
 			</tr>
-		</table> 
+		</table>
 		<input type="hidden" name="fence_type" value="ilo" />
 	</div>
 
@@ -785,7 +785,7 @@
 				<td>
 					<input name="password" type="password" autocomplete="off">
 				</td>
-		</table> 
+		</table>
 		<input type="hidden" name="fence_type" value="drac" />
 	</div>
 
@@ -809,7 +809,7 @@
 					<input name="password" type="password" autocomplete="off">
 				</td>
 			</tr>
-		</table> 
+		</table>
 		<input type="hidden" name="fence_type" value="rsa" />
 	</div>
 
@@ -837,7 +837,7 @@
 				<td>Auth Type</td>
 				<td><input name="auth_type" type="text"></td>
 			</tr>
-		</table> 
+		</table>
 		<input type="hidden" name="fence_type" value="ipmilan" />
 	</div>
 </div>
@@ -1301,7 +1301,7 @@
 	<h2>Add a Service</h2>
 
 	<div id="resskel" class="invisible">
-		<tal:block metal:use-macro="here/resource-form-macros/macros/service-compose-macro" /> 
+		<tal:block metal:use-macro="here/resource-form-macros/macros/service-compose-macro" />
 	</div>
 
 	<div class="service_comp_list">
@@ -1464,7 +1464,7 @@
 	<h2>Service Composition</h2>
 
 	<div id="resskel" class="invisible">
-		<tal:block metal:use-macro="here/resource-form-macros/macros/service-compose-macro" /> 
+		<tal:block metal:use-macro="here/resource-form-macros/macros/service-compose-macro" />
 	</div>
 
 	<div class="service_comp_list" tal:attributes="id sinfo/root_uuid">
--- conga/luci/cluster/index_html	2006/09/26 19:47:32	1.15
+++ conga/luci/cluster/index_html	2006/09/27 22:24:11	1.16
@@ -11,8 +11,8 @@
    <head metal:use-macro="here/header/macros/html_header">
 
 
-                    
-  
+
+
 
      <metal:fillbase fill-slot="base">
       <metal:baseslot define-slot="base">
@@ -39,12 +39,12 @@
       <span tal:define="global firsttime request/busyfirst |nothing"/>
       <span tal:condition="firsttime">
        <span tal:define="global busywaiting python:True"/>
-        <meta http-equiv="refresh" content="" tal:attributes="content isBusy/refreshurl"/> 
+        <meta http-equiv="refresh" content="" tal:attributes="content isBusy/refreshurl"/>
       </span>
       <span tal:define="global busy isBusy/busy |nothing"/>
        <span tal:condition="busy">
         <span tal:define="global busywaiting python:True"/>
-        <meta http-equiv="refresh" content="" tal:attributes="content isBusy/refreshurl"/> 
+        <meta http-equiv="refresh" content="" tal:attributes="content isBusy/refreshurl"/>
         <span tal:define="ri_agent python:here.getRicciAgent(request/clustername)">
         <span tal:define="resmap python:here.getClusterOS(ri_agent);
                           global isVirtualized resmap/isVirtualized;
@@ -59,7 +59,7 @@
 
     <metal:cssslot fill-slot="css_slot">
       <tal:comment replace="nothing"> A slot where you can insert CSS in the header from a template </tal:comment>
-    
+
   <style type="text/css"><!-- @import url(./clusterportlet.css); --></style>
   <style type="text/css"><!-- @import url(/luci/homebase/luci_homebase.css); --></style>
       <metal:cssslot define-slot="css_slot" />
@@ -101,7 +101,7 @@
 				alert('Can\'t find element with id = ' + container_id);
 				return (-1);
 			}
-                                                                                
+
 			var child_element = document.getElementById(element_id);
 			if (!child_element) {
 				alert('Can\'t find element with id = ' + element_id);
@@ -157,7 +157,7 @@
     <!-- <div tal:define="global hascluster request/clustername |nothing"/>  -->
     <span tal:condition="hascluster">
     <span tal:define="global ricci_agent python:here.getRicciAgentForCluster(request)"/>
-    <div tal:omit-tag="" tal:define="global modelb python:here.getmodelbuilder(ricci_agent)" />  
+    <div tal:omit-tag="" tal:define="global modelb python:here.getmodelbuilder(ricci_agent)" />
     </span>
       <table id="portal-columns">
         <tbody>
@@ -184,14 +184,14 @@
                 <div id="content"
                      metal:define-macro="content">
 
-  
+
 
                   <div class="documentContent" id="region-content">
 
                     <a name="documentContent"></a>
 
                     <metal:bodytext metal:define-slot="main" tal:content="nothing">
-                
+
                       Page body text
                     </metal:bodytext>
                 <span tal:omit-tag="" tal:define="global cname request/clustername |nothing"/>
@@ -202,7 +202,7 @@
 					<h1 tal:content="string:${cname}"></h1>
 				</span>
 
- 
+
              <metal:main-form-content use-macro="here/form-chooser/macros/main-form">
                 <h1>Future Site of Forms</h1>
              </metal:main-form-content>
--- conga/luci/cluster/portlet_cluconfig	2006/06/30 17:00:02	1.1
+++ conga/luci/cluster/portlet_cluconfig	2006/09/27 22:24:11	1.2
@@ -4,17 +4,17 @@
 <body>
 
 
-<div metal:define-macro="cluchooseportlet"   
+<div metal:define-macro="cluchooseportlet"
        tal:omit-tag=""
        tal:define="global data python:here.createCluChooser(request, clusystems)">
-       
+
 <dl class="portlet" id="portlet-cluconfig-tree">
     <dt class="portletHeader">
         <a href="#">
           Clusters
         </a>
     </dt>
-    
+
     <dd class="portletItemSingle">
         <ul class="portletCluConfigTree cluConfigTreeLevel0">
 
@@ -33,14 +33,14 @@
 <div metal:define-macro="cluconfigportlet"
        tal:omit-tag=""
        tal:define="global data python:here.createCluConfigTree(request, modelb)">
-       
+
 <dl class="portlet" id="portlet-cluconfig-tree">
     <dt class="portletHeader">
         <a href="#" tal:attributes="href python:here.getClusterURL(request,modelb)">
-          <div tal:omit-tag="" tal:content="python: here.getClusterAlias(modelb)" /> 
+          <div tal:omit-tag="" tal:content="python: here.getClusterAlias(modelb)" />
         </a>
     </dt>
-    
+
     <dd class="portletItemSingle">
         <ul class="portletCluConfigTree cluConfigTreeLevel0">
 
--- conga/luci/cluster/portlet_cluconfig_macro	2006/06/30 17:00:02	1.1
+++ conga/luci/cluster/portlet_cluconfig_macro	2006/09/27 22:24:11	1.2
@@ -8,7 +8,7 @@
                 cur_item item/currentItem;"
     tal:condition="python: (cur_item or parent_shows_children or children)">
 
-   <tal:level define="item_type_class python: 'type-' + item['cfg_type'];"> 
+   <tal:level define="item_type_class python: 'type-' + item['cfg_type'];">
     <div tal:attributes="class item_type_class">
         <a tal:condition="cur_item"
            tal:attributes="href item/absolute_url;
--- conga/luci/cluster/resource-form-macros	2006/09/23 04:04:08	1.16
+++ conga/luci/cluster/resource-form-macros	2006/09/27 22:24:11	1.17
@@ -43,7 +43,7 @@
 			global rescInf python: here.getResourcesInfo(modelb, request);
 			global msg python: here.appendModel(request, modelb)" />
 
-	<table class="systemsTable" border="0" cellspacing="0">
+	<table class="systemsTable">
 		<thead class="systemsTable">
 			<tr class="systemsTable">
 				<th class="systemsTable" width="100">Resource Name</th>
@@ -250,7 +250,7 @@
 		tal:define="
 			global msg python: here.appendModel(request, modelb);
 			global res python: here.getResourceInfo(modelb, request);
-			global type python: res['tag_name']">
+			global type python: 'tag_name' in res and res['tag_name'] or ''">
 
 		<h2>Configure <span tal:replace="python: res['name']" /></h2>
 
@@ -403,7 +403,7 @@
 		tal:attributes="
 			action processURL | nothing;
 			name res/parent_uuid | nothing">
-		
+
 	<input name="pagetype" type="hidden" value="35" />
 
 	<input name="global" type="hidden"
--- conga/luci/cluster/resource_form_handlers.js	2006/09/26 19:47:32	1.14
+++ conga/luci/cluster/resource_form_handlers.js	2006/09/27 22:24:11	1.15
@@ -81,27 +81,42 @@
 function validate_ip(form) {
 	var errors = new Array();
 
-	if (!form.ip_address || str_is_blank(form.ip_address.value))
-		errors.push('You did not give an IP address.');
-	return (errors);
+	if (!form.ip_address || str_is_blank(form.ip_address.value)) {
+		errors.push('No IP address was given.');
+		set_form_error(form.ip_address);
+		return (errors);
+	}
 
 	var ipstr =	form.ip_address.value;
-	if (!isValidHost(ipstr))
+	if (!isValidHost(ipstr)) {
 		errors.push('\"' + ipstr + '\" is an invalid IP address.');
+		set_form_error(form.ip_address);
+	} else
+		clr_form_error(form.ip_address);
+
 	return (errors);
 }
 
 function validate_nfs_mount(form) {
 	var errors = new Array();
 
-	if (!form.mountpoint || str_is_blank(form.mounpoint.value))
+	if (!form.mountpoint || str_is_blank(form.mounpoint.value)) {
 		errors.push('No mount point was given.');
+		set_form_error(form.mountpoint);
+	} else
+		clr_form_error(form.mountpoint);
 
 	if (!form.host || str_is_blank(form.host.value))
 		errors.push('No NFS server host was given.');
+		set_form_error(form.host);
+	} else
+		clr_form_error(form.host);
 
-	if (!form.exportpath || str_is_blank(form.exportpath.value))
+	if (!form.exportpath || str_is_blank(form.exportpath.value)) {
 		errors.push('No NFS export path was given.');
+		set_form_error(form.exportpath);
+	} else
+		clr_form_error(form.exportpath);
 	return (errors);
 }
 
@@ -113,55 +128,85 @@
 function validate_nfs_client(form) {
 	var errors = new Array();
 
-	if (!form.target || str_is_blank(form.target.value))
+	if (!form.target || str_is_blank(form.target.value)) {
 		errors.push('No NFS client target was given.');
+		set_form_err(form.target);
+	} else
+		clr_form_err(form.target);
 	return (errors);
 }
 
 function validate_filesystem(form) {
 	var errors = new Array();
 
-	if (!form.fsTypeSelect || str_is_blank(form.fsTypeSelect.value))
+	if (!form.fsTypeSelect || str_is_blank(form.fsTypeSelect.value)) {
 		errors.push('No file system type was given.');
+		set_form_err(form.fsTypeSelect);
+	} else
+		clr_form_err(form.fsTypeSelect);
 
-	if (!form.mountpoint || str_is_blank(form.mountpoint.value))
+	if (!form.mountpoint || str_is_blank(form.mountpoint.value)) {
 		errors.push('No file system mount point was given.');
+		set_form_err(form.mountpoint);
+	} else
+		clr_form_err(form.mountpoint);
 
-	if (!form.device || str_is_blank(form.device.value))
+	if (!form.device || str_is_blank(form.device.value)) {
 		errors.push('No device containing the file system was given.');
+		set_form_err(form.device);
+	} else
+		clr_form_err(form.device);
 
-	if (!form.fsid || str_is_blank(form.fsid.value))
+	if (!form.fsid || str_is_blank(form.fsid.value)) {
 		errors.push('No file system ID was given.');
+		set_form_err(form.fsid);
+	} else
+		clr_form_err(form.fsid);
 	return (errors);
 }
 
 function validate_gfs(form) {
 	var errors = new Array();
 
-	if (!form.mountpoint || str_is_blank(form.mountpoint.value))
+	if (!form.mountpoint || str_is_blank(form.mountpoint.value)) {
 		errors.push('No file system mount point was given.');
+		set_form_err(form.mountpoint);
+	} else
+		clr_form_err(form.mountpoint);
 
-	if (!form.device || str_is_blank(form.device.value))
+	if (!form.device || str_is_blank(form.device.value)) {
 		errors.push('No device containing file system was given.');
+		set_form_err(form.device);
+	} else
+		clr_form_err(form.device);
 
-	if (!form.fsid || str_is_blank(form.fsid.value))
+	if (!form.fsid || str_is_blank(form.fsid.value)) {
 		errors.push('No file system ID was given.');
+		set_form_err(form.fsid);
+	} else
+		clr_form_err(form.fsid);
 	return (errors);
 }
 
 function validate_script(form) {
 	var errors = new Array();
 
-	if (!form.file || str_is_blank(form.file.value))
+	if (!form.file || str_is_blank(form.file.value)) {
 		errors.push('No path to the script file was given.');
+		set_form_err(form.file);
+	} else
+		clr_form_err(form.file);
 	return (errors);
 }
 
 function validate_samba(form) {
 	var errors = new Array();
 
-	if (!form.workgroup || str_is_blank(form.workgroup.value))
+	if (!form.workgroup || str_is_blank(form.workgroup.value)) {
 		errors.push('No workgroup was given');
+		set_form_err(form.workgroup);
+	} else
+		clr_form_err(form.workgroup);
 	return (errors);
 }
 
@@ -182,8 +227,11 @@
 
 	var errors = valfn(form);
 	if (form.type.value != 'ip') {
-		if (!form.resourceName || str_is_blank(form.resourceName.value))
+		if (!form.resourceName || str_is_blank(form.resourceName.value)) {
 			errors.push('No resource name was given.')
+			set_form_err(form.resourceName);
+		} else
+			clr_form_err(form.resourceName);
 	}
 
 	if (error_dialog(errors))
@@ -239,7 +287,7 @@
 	var ielem = node.getElementsByTagName('input');
 	if (!ielem)
 		return (null);
-	
+
 	var new_uuid = null;
 	if (!uuid)
 		new_uuid = uuid_list.pop();
--- conga/luci/cluster/validate_config_fence.js	2006/08/17 16:22:41	1.1
+++ conga/luci/cluster/validate_config_fence.js	2006/09/27 22:24:11	1.2
@@ -3,16 +3,23 @@
 
 	if (!form)
 		return (-1);
-
-	if (!form.post_fail_delay || str_is_blank(form.post_fail_delay.value))
+	if (!form.post_fail_delay || str_is_blank(form.post_fail_delay.value)) {
 		errors.push('No post fail delay value was given.');
-	else if (!is_valid_int(form.post_fail_delay.value, 0, null))
+		set_form_err(form.post_fail_delay);
+	} else if (!is_valid_int(form.post_fail_delay.value, 0, null))
 		errors.push('The post fail delay must be a non-negative integer value.');
+		set_form_err(form.post_fail_delay);
+	} else
+		clr_form_err(form.post_fail_delay);
 
-	if (!form.post_join_delay || str_is_blank(form.post_join_delay.value))
+	if (!form.post_join_delay || str_is_blank(form.post_join_delay.value)) {
 		errors.push('No post join delay value was given.');
-	else if (!is_valid_int(form.post_join_delay.value, 0, null))
+		set_form_err(form.post_join_delay);
+	} else if (!is_valid_int(form.post_join_delay.value, 0, null)) {
 		errors.push('The post join delay must be a non-negative integer value.');
+		set_form_err(form.post_join_delay);
+	} else
+		clr_form_err(form.post_join_delay);
 
 	if (error_dialog(errors))
 		return (-1);
--- conga/luci/cluster/validate_config_general.js	2006/08/16 23:02:27	1.1
+++ conga/luci/cluster/validate_config_general.js	2006/09/27 22:24:11	1.2
@@ -3,20 +3,26 @@
 	var name = null;
 	var ver = null;
 
-	if (!form.cluname || str_is_blank(form.cluname.value))
+	if (!form.cluname || str_is_blank(form.cluname.value)) {
 		errors.push('You did not specify a cluster name.');
-	else
+		set_form_err(form.cluname);
+	} else {
 		name = form.cluname.value;
+		clr_form_err(form.cluname);
+	}
 
-	if (!form.cfgver || str_is_blank(form.cfgver.value))
+	if (!form.cfgver || str_is_blank(form.cfgver.value)) {
 		errors.push('You did not specify a configuration version.');
+		set_form_err(form.cfgver);
 	else
 		ver = form.cfgver.value;
 
 	if (ver && !is_valid_int(ver, 0, null)) {
 		errors.push('The configuration version must be an integer greater than 0.');
+		set_form_err(form.cfgver);
 		/* TODO: further restrictions? */
-	}
+	} else
+		clr_form_err(form.cfgver);
 
 	if (name) {
 		/* TODO: check this. */;
@@ -27,5 +33,5 @@
 
 	if (confirm('Update general cluster properties?'))
 		form.submit();
-	return (null);
+	return (0);
 }
--- conga/luci/cluster/validate_config_multicast.js	2006/08/17 16:22:41	1.1
+++ conga/luci/cluster/validate_config_multicast.js	2006/09/27 22:24:11	1.2
@@ -22,28 +22,40 @@
 
 	if (!form.mcast) {
 		errors.push('You did not specify how the multicast address should be chosen.');
+		set_form_err(form.mcast[0]);
+		set_form_err(form.mcast[1]);
 		error_dialog(errors);
 		return (-1);
 	}
 
-	var mcast;
+	var mcast = null;
 	if (form.mcast.length > 0 && form.mcast[0].checked)
 		mcast = 0;
 	else if (form.mcast.length > 1 && form.mcast[1].checked)
 		mcast = 1;
-	else
+	else {
 		errors.push('An invalid value was given while specifying how the multicast address should be chosen.');
+		set_form_err(form.mcast[0]);
+		set_form_err(form.mcast[1]);
+	}
 
-	if (error_dialog(errors))
-		return (-1);
+	if (mcast != null) {
+		clr_form_err(form.mcast[0]);
+		clr_form_err(form.mcast[1]);
+		clr_form_err(form.mcast_address);
+	}
 
-	if (mcast) {
-		if (!form.mcast_address || str_is_blank(form.mcast_address.value))
+	if (mcast == 1) {
+		if (!form.mcast_address || str_is_blank(form.mcast_address.value)) {
 			errors.push('No multicast address was given.');
-		else {
+			set_form_err(form.mcast_address);
+		} else {
 			var err = isValidHost(form.mcast_address.value);
-			if (err)
+			if (err) {
 				errors.push(err);
+				set_form_err(form.mcast_address);
+			}
+			clr_form_err(form.mcast_address);
 		}
 	}
 
--- conga/luci/cluster/validate_config_qdisk.js	2006/09/06 22:13:33	1.2
+++ conga/luci/cluster/validate_config_qdisk.js	2006/09/27 22:24:11	1.3
@@ -71,6 +71,7 @@
 
 function check_heuristic(hnum, form) {
 	var errors = new Array();
+	var blank = 0;
 
 	if (hnum < 0)
 		errors.push('An invalid heuristic number was given: ' + hnum);
@@ -83,41 +84,64 @@
 	var hstr = 'heuristic' + hnum;
 
 	var hname = document.getElementById(hstr + ':hname');
-	if (!hname || str_is_blank(hname.value))
+	if (!hname || str_is_blank(hname.value)) {
+		++blank;
 		errors.push('No name was given for heuristic ' + (hnum + 1));
-	else
+		set_form_err(hname);
+	} else {
+		/* XXX sanity check the name */
 		hname = hname.value;
+		clr_form_err(hname);
+	}
 
 	var hpath = document.getElementById(hstr + ':hpath');
-	if (!hpath || str_is_blank(hpath.value))
+	if (!hpath || str_is_blank(hpath.value)) {
+		++blank;
 		errors.push('No path was given for heuristic ' + (hnum + 1));
-	else
+		set_form_err(hpath);
+	} else {
+		/* XXX sanity check the path */
 		hpath = hpath.value;
+		clr_form_err(hpath);
+	}
 
 	var hint = document.getElementById(hstr + ':hinterval');
-	if (!hint || str_is_blank(hint.value))
+	if (!hint || str_is_blank(hint.value)) {
+		++blank;
 		errors.push('No interval was given for heuristic ' + (hnum + 1));
-	else
+		set_form_err(hint);
+	} else {
 		hint = hint.value;
+		if (!is_valid_int(hint, 1, null)) {
+			errors.push('Heuristic interval values must be greater than 0.');
+			set_form_err(hint);
+		} else
+			clr_form_err(hint);
+	}
 
 	var hscore = document.getElementById(hstr + ':hscore');
-	if (!hscore || str_is_blank(hscore.value))
+	if (!hscore || str_is_blank(hscore.value)) {
+		++blank;
 		errors.push('No score was given for heuristic ' + (hnum + 1));
-	else
+		set_form_err(hscore);
+	} else {
 		hscore = hscore.value;
+		if (!is_valid_int(hscore, 0, null)) {
+			errors.push('Heuristic score values must be 0 or greater.');
+			set_form_err(hscore);
+		} else
+			clr_form_err(hscore);
+	}
 
-	if (errors.length == 4) {
+	if (blank == 4) {
 		/* The entry is blank -- ignore it. */
+		clr_form_err(hname);
+		clr_form_err(hpath);
+		clr_form_err(hint);
+		clr_form_err(hscore);
 		return (null);
 	}
 
-	/* TODO: hname, hpath */
-	if (hint && !is_valid_int(hint, 1, null))
-		errors.push('Heuristic interval values must be integers greater than 0.');
-
-	if (hscore && !is_valid_int(hscore, null, null))
-		errors.push('Heuristic score values must be integers.');
-
 	if (errors.length > 0)
 		return (errors);
 
@@ -126,7 +150,10 @@
 
 function validate_form(form) {
 	var errors = new Array();
+
 	if (!form || !form.quorumd) {
+		set_form_err(form.quorumd[0]);
+		set_form_err(form.quorumd[1]);
 		errors.push('You did not specify whether or not to use a quorum partition.');
 		return (error_dialog(errors));
 	}
@@ -138,50 +165,77 @@
 		qpart = 1;
 	else {
 		errors.push('You submitted an invalid value while specifying whether or not to use a quorum partition.');
+		set_form_err(form.quorumd[0]);
+		set_form_err(form.quorumd[1]);
 		return (error_dialog(errors));
 	}
 
+	if (qpart != null) {
+		clr_form_err(form.quorumd[0]);
+		clr_form_err(form.quorumd[1]);
+	}
+
 	if (qpart) {
-		if (!form.interval || str_is_blank(form.interval.value))
+		if (!form.interval || str_is_blank(form.interval.value)) {
 			errors.push('No interval setting was given.');
-		else {
-			if (!is_valid_int(form.interval.value, 1, null))
+			set_form_err(form.interval);
+		} else {
+			if (!is_valid_int(form.interval.value, 1, null)) {
 				errors.push('Interval values must be integers greater than 0.');
+				set_form_err(form.interval);
+			} else
+				clr_form_err(form.interval);
 		}
 
-		if (!form.votes || str_is_blank(form.votes.value))
+		if (!form.votes || str_is_blank(form.votes.value)) {
 			errors.push('No votes setting was given.');
-		else {
-			if (!is_valid_int(form.votes.value, null, null))
-				errors.push('Votes values must be integers.');
+			set_form_err(form.votes);
+		} else {
+			if (!is_valid_int(form.votes.value, 1, null)) {
+				errors.push('Votes values must be greater than 0.');
+				set_form_err(form.votes);
+			} else
+				clr_form_err(form.votes);
 		}
 
-		if (!form.tko || str_is_blank(form.tko.value))
+		if (!form.tko || str_is_blank(form.tko.value)) {
 			errors.push('No TKO setting was given.');
-		else {
-			if (!is_valid_int(form.tko.value, null, null))
-				errors.push('TKO values must be integers.');
+			set_form_err(form.tko);
+		} else {
+			if (!is_valid_int(form.tko.value, 1, null)) {
+				errors.push('TKO values must be greater than 0.');
+				set_form_err(form.tko);
+			} else
+				clr_form_err(form.tko);
 		}
 
-		if (!form.min_score || str_is_blank(form.min_score.value))
+		if (!form.min_score || str_is_blank(form.min_score.value)) {
 			errors.push('No minimum score setting was given.');
-		else {
-			if (!is_valid_int(form.min_score.value, null, null))
-				errors.push('Minimum score values must be integers.');
+			set_form_err(form.min_score);
+		} else {
+			if (!is_valid_int(form.min_score.value, 1, null)) {
+				errors.push('Minimum score values must be greater than 0.');
+				set_form_err(form.min_score);
+			} else
+				clr_form_err(form.min_score);
 		}
 
-		if (!form.device || str_is_blank(form.device.value))
+		if (!form.device || str_is_blank(form.device.value)) {
 			errors.push('No device setting was given.');
-		else {
+			set_form_err(form.device);
+		} else {
 			/* TODO: check this */
 			var device = form.device.value;
+			clr_form_err(form.device);
 		}
 
-		if (!form.label || str_is_blank(form.label.value))
+		if (!form.label || str_is_blank(form.label.value)) {
 			errors.push('No label setting was given.');
-		else {
+			set_form_err(form.label);
+		} else {
 			/* TODO: check this */
 			var label = form.device.label;
+			clr_form_err(form.label);
 		}
 
 		var hnum = document.getElementById('num_heuristics');
@@ -195,11 +249,10 @@
 					errors = errors.concat(err);
 			}
 		}
-
-		if (error_dialog(errors))
-			return (-1);
 	}
 
+	if (error_dialog(errors))
+		return (-1);
 	if (confirm('Update quorum partition properties?'))
 		form.submit()
 }




More information about the Cluster-devel mailing list