libs/cbi:
authorJo-Philipp Wich <jow@openwrt.org>
Tue, 27 Apr 2010 00:27:37 +0000 (00:27 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Tue, 27 Apr 2010 00:27:37 +0000 (00:27 +0000)
- skip client side field validation if corrsponding field was removed due to dependencies
- human readable error strings in uci section summary
- implement field validation for dnyamic lists
- render optional fields when section has tabs

libs/cbi/htdocs/luci-static/resources/cbi.js
libs/cbi/luasrc/cbi.lua
libs/cbi/luasrc/view/cbi/dynlist.htm
libs/cbi/luasrc/view/cbi/ucisection.htm

index 7cdca642d24241f46cdea8a0979b332e8ff1f72f..4af6e58d9b5a234268db37bf62f82bd6e1313aff 100644 (file)
@@ -488,15 +488,19 @@ function cbi_validate_field(cbid, optional, type)
        {
                var validator = function(reset)
                {
-                       field.className = field.className.replace(/ cbi-input-invalid/g, '');
-
-                       // validate value
-                       var value = (field.options) ? field.options[field.options.selectedIndex].value : field.value;
-                       if( !(((value.length == 0) && optional) || vldcb(value)) )
+                       // is not detached
+                       if( field.form )
                        {
-                               // invalid
-                               field.className += ' cbi-input-invalid';
-                               return false;
+                               field.className = field.className.replace(/ cbi-input-invalid/g, '');
+
+                               // validate value
+                               var value = (field.options) ? field.options[field.options.selectedIndex].value : field.value;
+                               if( !(((value.length == 0) && optional) || vldcb(value)) )
+                               {
+                                       // invalid
+                                       field.className += ' cbi-input-invalid';
+                                       return false;
+                               }
                        }
 
                        return true;
index a18d37d605601adab5844341c467772580961ded..cc22229fcad1fc5d39f649a5c02696f41799a795 100644 (file)
@@ -813,7 +813,7 @@ function AbstractSection.parse_optionals(self, section)
 
        local field = self.map:formvalue("cbi.opt."..self.config.."."..section)
        for k,v in ipairs(self.children) do
-               if v.optional and not v:cfgvalue(section) then
+               if v.optional and not v:cfgvalue(section) and not next(self.tabs) then
                        if field == v.option then
                                field = nil
                                self.map.proceed = true
@@ -1290,7 +1290,7 @@ end
 
 -- Render if this value exists or if it is mandatory
 function AbstractValue.render(self, s, scope)
-       if not self.optional or self:cfgvalue(s) or self:formcreated(s) then
+       if not self.optional or next(self.section.tabs) or self:cfgvalue(s) or self:formcreated(s) then
                scope = scope or {}
                scope.section   = s
                scope.cbid      = self:cbid(s)
@@ -1339,12 +1339,20 @@ end
 -- Validate the form value
 function AbstractValue.validate(self, value)
        if self.datatype and value and datatypes[self.datatype] then
-               if datatypes[self.datatype](value) then
-                       return value
+               if type(value) == "table" then
+                       local v
+                       for _, v in ipairs(value) do
+                               if v and #v > 0 and not datatypes[self.datatype](v) then
+                                       return nil
+                               end
+                       end
+               else
+                       if not datatypes[self.datatype](value) then
+                               return nil
+                       end
                end
-       else
-               return value
        end
+       return value
 end
 
 AbstractValue.transform = AbstractValue.validate
index 8e2bda8f9873e66530288c1ae6c81d61c747dbcf..826e2e698edfea9f951bdd6fb22198827a09a351 100644 (file)
@@ -1,7 +1,7 @@
 <%#
 LuCI - Lua Configuration Interface
 Copyright 2008 Steven Barth <steven@midlink.org>
-Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
+Copyright 2008-2010 Jo-Philipp Wich <xm@subsignal.org>
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
@@ -42,4 +42,11 @@ $Id$
        <% end -%>
 <% if i <= #vals then %><br />
 <% end end %>
+<% if self.datatype then -%>
+       <script type="text/javascript">
+               <% for i=1, #vals + 1 do -%>
+               cbi_validate_field('<%=cbid%>.<%=i%>', <%=tostring(self.optional == true or i > #vals)%>, '<%=self.datatype%>');
+               <%- end %>
+       </script>
+<% end -%>
 <%+cbi/valuefooter%>
index b184908b0b8f1f8ea9d928862f15333b974d6635..db32c904390734f8f442e75723f5d6aee1e8ba76 100644 (file)
@@ -31,7 +31,17 @@ $Id$
 
 <% if self.error and self.error[section] then -%>
        <div class="cbi-section-error">
-               <ul><% for _, e in ipairs(self.error[section]) do %><li><%=pcdata(e):gsub("\n","<br />")%></li><% end %></ul>
+               <ul><% for _, e in ipairs(self.error[section]) do -%>
+                       <li>
+                               <%- if e == "invalid" then -%>
+                                       <%:One or more fields contain invalid values!%>
+                               <%- elseif e == "missing" then -%>
+                                       <%:One or more required fields have no value!%>
+                               <%- else -%>
+                                       <%=pcdata(e)%>
+                               <%- end -%>
+                       </li>
+               <%- end %></ul>
        </div>
 <%- end %>