diff options
Diffstat (limited to 'libs')
-rw-r--r-- | libs/cbi/luasrc/cbi.lua | 86 | ||||
-rw-r--r-- | libs/cbi/luasrc/view/cbi/cell_valuefooter.htm | 2 | ||||
-rw-r--r-- | libs/cbi/luasrc/view/cbi/full_valuefooter.htm | 2 | ||||
-rw-r--r-- | libs/cbi/luasrc/view/cbi/tblsection.htm | 13 | ||||
-rw-r--r-- | libs/cbi/luasrc/view/cbi/ucisection.htm | 7 |
5 files changed, 87 insertions, 23 deletions
diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua index 411aa2387..543c895af 100644 --- a/libs/cbi/luasrc/cbi.lua +++ b/libs/cbi/luasrc/cbi.lua @@ -175,12 +175,14 @@ function Map.__init__(self, config, ...) self.parsechain = {self.config} self.template = "cbi/map" self.uci = uci.cursor() + self.save = true if not self.uci:load(self.config) then error("Unable to read UCI data: " .. self.config) end self.validator = luci.uvl.UVL() self.scheme = self.validator:get_scheme(self.config) + end function Map.get_scheme(self, sectiontype, option) @@ -202,24 +204,26 @@ end function Map.parse(self, ...) Node.parse(self, ...) - for i, config in ipairs(self.parsechain) do - self.uci:save(config) - end - if luci.http.formvalue("cbi.apply") then + if self.save then 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) + self.uci:save(config) + end + if luci.http.formvalue("cbi.apply") then + 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 + + -- Reparse sections + Node.parse(self, ...) + + end + for i, config in ipairs(self.parsechain) do + self.uci:unload(config) end - - -- Reparse sections - Node.parse(self, ...) - - end - for i, config in ipairs(self.parsechain) do - self.uci:unload(config) end end @@ -385,6 +389,10 @@ function AbstractSection.__init__(self, map, sectiontype, ...) self.config = map.config self.optionals = {} self.defaults = {} + self.fields = {} + self.tag_error = {} + self.tag_invalid = {} + self.tag_deperror = {} self.optional = true self.addremove = false @@ -413,6 +421,7 @@ function AbstractSection.option(self, class, option, ...) Node._i18n(obj, self.config, self.section or self.sectiontype, option, ...) self:append(obj) + self.fields[option] = obj return obj elseif class == true then error("No valid class was given and autodetection failed.") @@ -576,7 +585,7 @@ NamedSection = class(AbstractSection) function NamedSection.__init__(self, map, section, stype, ...) AbstractSection.__init__(self, map, stype, ...) Node._i18n(self, map.config, section, nil, ...) - + -- Defaults self.addremove = false @@ -597,7 +606,6 @@ function NamedSection.parse(self) local s = self.section local active = self:cfgvalue(s) - if self.addremove then local path = self.config.."."..s if active then -- Remove the section @@ -620,8 +628,23 @@ function NamedSection.parse(self) if not self.override_scheme and self.map.scheme then local co = self.map:get() local stat, err = self.map.validator:validate_section(self.config, s, co) - luci.http.prepare_content("text/html") - luci.util.dumptable(err) + if err then + self.map.save = false + if err.code == luci.uvl.errors.ERR_DEPENDENCY then + self.tag_deperror[s] = true + else + self.tag_invalid[s] = true + end + for i, v in ipairs(err.childs) do + if v.option and self.fields[v.option] then + if v.code == luci.uvl.errors.ERR_DEPENDENCY then + self.fields[v.option].tag_reqerror[s] = true + elseif v.code == luci.uvl.errors.ERR_OPTION then + self.fields[v.option].tag_invalid[s] = true + end + end + end + end end end AbstractSection.parse_optionals(self, s) @@ -719,9 +742,25 @@ function TypedSection.parse(self) Node.parse(self, k) if not self.override_scheme and self.map.scheme then - co = co or self.map:get() - local stat, err = self.map.uvl:validate_section(self.config, k, co) - luci.util.perror(err) + local co = self.map:get() + local stat, err = self.map.validator:validate_section(self.config, k, co) + if err then + self.map.save = false + if err.code == luci.uvl.errors.ERR_DEPENDENCY then + self.tag_deperror[k] = true + else + self.tag_invalid[k] = true + end + for i, v in ipairs(err.childs) do + if v.option and self.fields[v.option] then + if v.code == luci.uvl.errors.ERR_DEPENDENCY then + self.fields[v.option].tag_reqerror[k] = true + elseif v.code == luci.uvl.errors.ERR_OPTION then + self.fields[v.option].tag_invalid[k] = true + end + end + end + end end end AbstractSection.parse_optionals(self, k) @@ -780,6 +819,7 @@ function AbstractValue.__init__(self, map, section, option, ...) self.config = map.config self.tag_invalid = {} self.tag_missing = {} + self.tag_reqerror = {} self.tag_error = {} self.deps = {} self.cast = "string" diff --git a/libs/cbi/luasrc/view/cbi/cell_valuefooter.htm b/libs/cbi/luasrc/view/cbi/cell_valuefooter.htm index 7d1ac4ee6..6ca530657 100644 --- a/libs/cbi/luasrc/view/cbi/cell_valuefooter.htm +++ b/libs/cbi/luasrc/view/cbi/cell_valuefooter.htm @@ -15,6 +15,8 @@ $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 -%> diff --git a/libs/cbi/luasrc/view/cbi/full_valuefooter.htm b/libs/cbi/luasrc/view/cbi/full_valuefooter.htm index a01f6bd6c..8003f53fe 100644 --- a/libs/cbi/luasrc/view/cbi/full_valuefooter.htm +++ b/libs/cbi/luasrc/view/cbi/full_valuefooter.htm @@ -28,6 +28,8 @@ $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 -%> diff --git a/libs/cbi/luasrc/view/cbi/tblsection.htm b/libs/cbi/luasrc/view/cbi/tblsection.htm index 6ed078026..a557c584f 100644 --- a/libs/cbi/luasrc/view/cbi/tblsection.htm +++ b/libs/cbi/luasrc/view/cbi/tblsection.htm @@ -89,6 +89,19 @@ end </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 -%> diff --git a/libs/cbi/luasrc/view/cbi/ucisection.htm b/libs/cbi/luasrc/view/cbi/ucisection.htm index 1d318f791..c245940d4 100644 --- a/libs/cbi/luasrc/view/cbi/ucisection.htm +++ b/libs/cbi/luasrc/view/cbi/ucisection.htm @@ -16,6 +16,13 @@ $Id$ <% self:render_children(section, scope or {}) %> <% if #self.optionals[section] > 0 or self.dynamic then %> + <% 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 %> <div class="cbi-optionals"> <% if self.dynamic then %> <input type="text" name="cbi.opt.<%=self.config%>.<%=section%>" /> |