* luci/libs/cbi: improved error integration with uvl
authorJo-Philipp Wich <jow@openwrt.org>
Fri, 5 Sep 2008 23:21:37 +0000 (23:21 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Fri, 5 Sep 2008 23:21:37 +0000 (23:21 +0000)
libs/cbi/luasrc/cbi.lua
libs/cbi/luasrc/view/cbi/cell_valuefooter.htm
libs/cbi/luasrc/view/cbi/cell_valueheader.htm
libs/cbi/luasrc/view/cbi/full_valuefooter.htm
libs/cbi/luasrc/view/cbi/full_valueheader.htm
libs/cbi/luasrc/view/cbi/tblsection.htm
libs/cbi/luasrc/view/cbi/tsection.htm
libs/cbi/luasrc/view/cbi/ucisection.htm

index ac8d8b5..7cde3c9 100644 (file)
@@ -56,13 +56,14 @@ function load(cbimap, ...)
        assert(func, err)
 
        luci.i18n.loadc("cbi")
        assert(func, err)
 
        luci.i18n.loadc("cbi")
+       luci.i18n.loadc("uvl")
 
        local env = {
                translate=i18n.translate,
                translatef=i18n.translatef,
                arg={...}
        }
 
        local env = {
                translate=i18n.translate,
                translatef=i18n.translatef,
                arg={...}
        }
-       
+
        setfenv(func, setmetatable(env, {__index =
                function(tbl, key)
                        return rawget(tbl, key) or _M[key] or _G[key]
        setfenv(func, setmetatable(env, {__index =
                function(tbl, key)
                        return rawget(tbl, key) or _M[key] or _G[key]
@@ -86,26 +87,51 @@ local function _uvl_validate_section(node, name)
        luci.uvl.STRICT_UNKNOWN_OPTIONS = false
        luci.uvl.STRICT_UNKNOWN_SECTIONS = false
 
        luci.uvl.STRICT_UNKNOWN_OPTIONS = false
        luci.uvl.STRICT_UNKNOWN_SECTIONS = false
 
+       local function tag_fields(e)
+               if e.option and node.fields[e.option] then
+                       node.fields[e.option].error = e
+               elseif e.childs then
+                       for _, c in ipairs(e.childs) do tag_fields(c) end
+               end
+       end
+
+       local function tag_section(e)
+               local s = { }
+               for _, c in ipairs(e.childs) do
+                       if c.childs and not c:is(luci.uvl.errors.ERR_DEPENDENCY) then
+                               table.insert( s, c.childs[1]:string() )
+                       else
+                               table.insert( s, c:string() )
+                       end
+               end
+               if #s > 0 then node.error = s end
+       end
+
        local stat, err = node.map.validator:validate_section(node.config, name, co)
        if err then
                node.map.save = false
        local stat, err = node.map.validator:validate_section(node.config, name, co)
        if err then
                node.map.save = false
+
+               tag_fields(err)
+               tag_section(err)
+--[[
                if err:is(luci.uvl.errors.ERR_DEPENDENCY) then
                if err:is(luci.uvl.errors.ERR_DEPENDENCY) then
-                       node.tag_deperror[name] = true
+                       node.tag_deperror[name] = err:string()
                else
                else
-                       node.tag_invalid[name] = true
+                       node.tag_invalid[name] = err:string()
                end
                for i, v in ipairs(err.childs) do
                        if v.option and node.fields[v.option] then
                                if v:is(luci.uvl.errors.ERR_DEPENDENCY) then
                end
                for i, v in ipairs(err.childs) do
                        if v.option and node.fields[v.option] then
                                if v:is(luci.uvl.errors.ERR_DEPENDENCY) then
-                                       node.fields[v.option].tag_reqerror[name] = true
+                                       node.fields[v.option].tag_deperror[name] = v:string()
                                elseif v:is(luci.uvl.errors.ERR_OPT_REQUIRED) then
                                elseif v:is(luci.uvl.errors.ERR_OPT_REQUIRED) then
-                                       node.fields[v.option].tag_missing[name] = true
-                                       node.tag_deperror[name] = true
+                                       node.fields[v.option].tag_missing[name] = v:string()
+                                       node.tag_reqerror[name] = v:string()
                                elseif v:is(luci.uvl.errors.ERR_OPTION) then
                                elseif v:is(luci.uvl.errors.ERR_OPTION) then
-                                       node.fields[v.option].tag_invalid[name] = true
+                                       node.fields[v.option].tag_invalid[name] = v:string()
                                end
                        end
                end
                                end
                        end
                end
+]]
        end
 
 end
        end
 
 end
@@ -213,7 +239,7 @@ function Map.__init__(self, config, ...)
 
        self.validator = luci.uvl.UVL()
        self.scheme = self.validator:get_scheme(self.config)
 
        self.validator = luci.uvl.UVL()
        self.scheme = self.validator:get_scheme(self.config)
-       
+
 end
 
 function Map.get_scheme(self, sectiontype, option)
 end
 
 function Map.get_scheme(self, sectiontype, option)
@@ -243,14 +269,14 @@ function Map.parse(self, ...)
                        for i, config in ipairs(self.parsechain) do
                                self.uci:commit(config)
                                self.uci:apply(config)
                        for i, config in ipairs(self.parsechain) do
                                self.uci:commit(config)
                                self.uci:apply(config)
-       
+
                                -- Refresh data because commit changes section names
                                self.uci:load(config)
                        end
                                -- Refresh data because commit changes section names
                                self.uci:load(config)
                        end
-       
+
                        -- Reparse sections
                        Node.parse(self, ...)
                        -- Reparse sections
                        Node.parse(self, ...)
-       
+
                end
                for i, config in ipairs(self.parsechain) do
                        self.uci:unload(config)
                end
                for i, config in ipairs(self.parsechain) do
                        self.uci:unload(config)
@@ -616,7 +642,7 @@ NamedSection = class(AbstractSection)
 function NamedSection.__init__(self, map, section, stype, ...)
        AbstractSection.__init__(self, map, stype, ...)
        Node._i18n(self, map.config, section, nil, ...)
 function NamedSection.__init__(self, map, section, stype, ...)
        AbstractSection.__init__(self, map, stype, ...)
        Node._i18n(self, map.config, section, nil, ...)
-       
+
        -- Defaults
        self.addremove = false
 
        -- Defaults
        self.addremove = false
 
@@ -655,7 +681,7 @@ function NamedSection.parse(self)
                AbstractSection.parse_dynamic(self, s)
                if luci.http.formvalue("cbi.submit") then
                        Node.parse(self, s)
                AbstractSection.parse_dynamic(self, s)
                if luci.http.formvalue("cbi.submit") then
                        Node.parse(self, s)
-                       
+
                        if not self.override_scheme and self.map.scheme then
                                _uvl_validate_section(self, s)
                        end
                        if not self.override_scheme and self.map.scheme then
                                _uvl_validate_section(self, s)
                        end
@@ -730,7 +756,7 @@ function TypedSection.parse(self)
                AbstractSection.parse_dynamic(self, k)
                if luci.http.formvalue("cbi.submit") then
                        Node.parse(self, k)
                AbstractSection.parse_dynamic(self, k)
                if luci.http.formvalue("cbi.submit") then
                        Node.parse(self, k)
-                       
+
                        if not self.override_scheme and self.map.scheme then
                                _uvl_validate_section(self, k)
                        end
                        if not self.override_scheme and self.map.scheme then
                                _uvl_validate_section(self, k)
                        end
index 6ca5306..6dd5667 100644 (file)
@@ -12,16 +12,6 @@ You may obtain a copy of the License at
 $Id$
 
 -%>
 $Id$
 
 -%>
-
-       <% if self.tag_error[section] then -%>
-               <div class="cbi-error"><%=self.tag_error[section]%></div>
-       <%- elseif self.tag_reqerror[section] then -%>
-               <div class="cbi-error"><%:cbi_reqerror%></div>
-       <%- elseif self.tag_invalid[section] then -%>
-               <div class="cbi-error"><%:cbi_invalid%></div>
-       <%- elseif self.tag_missing[section] then -%>
-               <div class="cbi-error"><%:cbi_missing%></div>
-       <%- end %>
 </td>
 
 <% if #self.deps > 0 then -%>
 </td>
 
 <% if #self.deps > 0 then -%>
index ecfeee6..9a065a3 100644 (file)
@@ -13,4 +13,4 @@ $Id$
 
 -%>
 
 
 -%>
 
-<td class="cbi-value-field" id="cbi-<%=self.config.."-"..section.."-"..self.option%>">
+<td class="cbi-value-field<% if self.error then %> cbi-value-error<% end %>" id="cbi-<%=self.config.."-"..section.."-"..self.option%>">
index 8003f53..e42043e 100644 (file)
@@ -25,17 +25,6 @@ $Id$
        <%- if self.title and #self.title > 0 then -%>
        </div>
        <%- end -%>
        <%- if self.title and #self.title > 0 then -%>
        </div>
        <%- end -%>
-
-       <% if self.tag_error[section] then -%>
-               <div class="cbi-error"><%=self.tag_error[section]%></div>
-       <%- elseif self.tag_reqerror[section] then -%>
-               <div class="cbi-error"><%:cbi_reqerror%></div>
-       <%- elseif self.tag_invalid[section] then -%>
-               <div class="cbi-error"><%:cbi_invalid%></div>
-       <%- elseif self.tag_missing[section] then -%>
-               <div class="cbi-error"><%:cbi_missing%></div>
-       <%- end %>
-
 </div>
 
 <% if #self.deps > 0 then -%>
 </div>
 
 <% if #self.deps > 0 then -%>
index ddc256d..fed2412 100644 (file)
@@ -13,7 +13,7 @@ $Id$
 
 -%>
 
 
 -%>
 
-<div class="cbi-value" id="cbi-<%=self.config.."-"..section.."-"..self.option%>">
+<div class="cbi-value<% if self.error then %> cbi-value-error<% end %>" id="cbi-<%=self.config.."-"..section.."-"..self.option%>">
        <%- if self.title and #self.title > 0 then -%>
        <label class="cbi-value-title"<%= attr("for", cbid) %>>
        <%- if self.titleref then -%><a title="<%=self.titledesc or translate('cbi_gorel')%>" class="cbi-title-ref" href="<%=self.titleref%>"><%- end -%>
        <%- if self.title and #self.title > 0 then -%>
        <label class="cbi-value-title"<%= attr("for", cbid) %>>
        <%- if self.titleref then -%><a title="<%=self.titledesc or translate('cbi_gorel')%>" class="cbi-title-ref" href="<%=self.titleref%>"><%- end -%>
index a557c58..5a2b247 100644 (file)
@@ -89,19 +89,6 @@ end
                                        </td>
                                <%- end -%>
                        </tr>
                                        </td>
                                <%- end -%>
                        </tr>
-                       <% if self.tag_deperror[section] or self.tag_invalid[section] or self.tag_error[section] then %>
-                               <tr class="cbi-section-table-row">
-                                       <td colspan="<%=count%>">
-                               <%- if self.tag_deperror[section] then -%>
-                                       <div class="cbi-error"><%:cbi_deperror%></div>
-                               <%- elseif self.tag_invalid[section] then -%>
-                                       <div class="cbi-error"><%:cbi_invalid_section%></div>
-                               <%- elseif self.tag_error[section] then -%>
-                                       <div class="cbi-error"><%=self.tag_error[section]%></div>
-                               <%- end -%>
-                                       </td>
-                               </tr>
-                       <% end %>
                        <%- end -%>
 
                        <%- if isempty then -%>
                        <%- end -%>
 
                        <%- if isempty then -%>
@@ -110,6 +97,13 @@ end
                        </tr>
                        <%- end -%>
                </table>
                        </tr>
                        <%- end -%>
                </table>
+
+               <% if self.error then %>
+                       <div class="cbi-section-error">
+                               <ul><% for _, e in ipairs(self.error) do %><li><%=luci.util.pcdata(e):gsub("\n","<br />")%></li><% end %></ul>
+                       </div>
+               <% end %>
+
                        <%- if self.addremove then -%>
                        <div class="cbi-section-table-row">
                                <td colspan="<%=count%>" class="cbi-section-table-optionals">
                        <%- if self.addremove then -%>
                        <div class="cbi-section-table-row">
                                <td colspan="<%=count%>" class="cbi-section-table-optionals">
@@ -120,10 +114,6 @@ end
                                                        <input type="text" class="cbi-section-create-name" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>" />
                                                        <input class="cbi-button cbi-button-add" type="submit" value="<%:cbi_add%>" title="<%:cbi_add%>" />
                                                <% end %>
                                                        <input type="text" class="cbi-section-create-name" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>" />
                                                        <input class="cbi-button cbi-button-add" type="submit" value="<%:cbi_add%>" title="<%:cbi_add%>" />
                                                <% end %>
-
-                                               <% if self.err_invalid then %>
-                                                       <div class="cbi-error"><%:cbi_invalid%></div>
-                                               <% end %>
                                        </div>
                                </td>
                        </div>
                                        </div>
                                </td>
                        </div>
index a81715b..33d5c8e 100644 (file)
@@ -48,10 +48,6 @@ $Id$
                                <input type="text" class="cbi-section-create-name" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>" />
                                <input type="submit" class="cbi-button cbi-button-add" value="<%:cbi_add%>" />
                        <%- end %>
                                <input type="text" class="cbi-section-create-name" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>" />
                                <input type="submit" class="cbi-button cbi-button-add" value="<%:cbi_add%>" />
                        <%- end %>
-
-                       <% if self.err_invalid then -%>
-                               <div class="cbi-error"><%:cbi_invalid%></div>
-                       <%- end %>
                </div>
        <%- end %>
 </fieldset>
                </div>
        <%- end %>
 </fieldset>
index e571cb2..feab18e 100644 (file)
@@ -15,12 +15,10 @@ $Id$
 
 <% self:render_children(section, scope or {}) %>
 
 
 <% self:render_children(section, scope or {}) %>
 
-<% if self.tag_deperror[section] then -%>
-       <div class="cbi-error"><%:cbi_deperror%></div>
-<% elseif self.tag_invalid[section] then -%>
-       <div class="cbi-error"><%:cbi_invalid_section%></div>
-<%- elseif self.tag_error[section] then -%>
-       <div class="cbi-error"><%=self.tag_error[section]%></div>
+<% if self.error then -%>
+       <div class="cbi-section-error">
+               <ul><% for _, e in ipairs(self.error) do %><li><%=luci.util.pcdata(e):gsub("\n","<br />")%></li><% end %></ul>
+       </div>
 <%- end %>
 
 <% if self.optionals[section] and #self.optionals[section] > 0 or self.dynamic then %>
 <%- end %>
 
 <% if self.optionals[section] and #self.optionals[section] > 0 or self.dynamic then %>