- 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
{
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;
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
-- 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)
-- 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
<%#
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.
<% 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%>
<% 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 %>