diff options
-rw-r--r-- | i18n/english/luasrc/i18n/cbi.en.lua | 3 | ||||
-rw-r--r-- | i18n/english/luasrc/i18n/cbi.en.xml | 3 | ||||
-rw-r--r-- | i18n/german/luasrc/i18n/cbi.de.lua | 3 | ||||
-rw-r--r-- | i18n/german/luasrc/i18n/cbi.de.xml | 3 | ||||
-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 |
9 files changed, 99 insertions, 23 deletions
diff --git a/i18n/english/luasrc/i18n/cbi.en.lua b/i18n/english/luasrc/i18n/cbi.en.lua index 1bba2518c9..6b1168e2e2 100644 --- a/i18n/english/luasrc/i18n/cbi.en.lua +++ b/i18n/english/luasrc/i18n/cbi.en.lua @@ -1,7 +1,10 @@ cbi_add = [[Add entry]] cbi_del = [[Remove entry]] cbi_invalid = [[<strong>Error:</strong> Invalid input value]] +cbi_invalid_section = [[<strong>Error:</strong> Validation failed]] cbi_missing = [[<strong>Error:</strong> This field is mandatory]] +cbi_deperror = [[<strong>Error:</strong> At least one mandatory field has no or an invalid value]] +cbi_reqerror = [[<strong>Error:</strong> A requirement for this option was not met]] cbi_addopt = [[-- Additional Field --]] cbi_optional = [[ (optional)]] cbi_sectempty = [[This section contains no values yet]] diff --git a/i18n/english/luasrc/i18n/cbi.en.xml b/i18n/english/luasrc/i18n/cbi.en.xml index 8e66810793..35599d87e8 100644 --- a/i18n/english/luasrc/i18n/cbi.en.xml +++ b/i18n/english/luasrc/i18n/cbi.en.xml @@ -5,7 +5,10 @@ <i18n:msg xml:id="cbi_add">Add entry</i18n:msg> <i18n:msg xml:id="cbi_del">Remove entry</i18n:msg> <i18n:msg xml:id="cbi_invalid"><strong>Error:</strong> Invalid input value</i18n:msg> +<i18n:msg xml:id="cbi_invalid_section"><strong>Error:</strong> Validation failed</i18n:msg> <i18n:msg xml:id="cbi_missing"><strong>Error:</strong> This field is mandatory</i18n:msg> +<i18n:msg xml:id="cbi_deperror"><strong>Error:</strong> At least one mandatory field has no or an invalid value</i18n:msg> +<i18n:msg xml:id="cbi_reqerror"><strong>Error:</strong> A requirement for this option was not met</i18n:msg> <i18n:msg xml:id="cbi_addopt">-- Additional Field --</i18n:msg> <i18n:msg xml:id="cbi_optional"> (optional)</i18n:msg> <i18n:msg xml:id="cbi_sectempty">This section contains no values yet</i18n:msg> diff --git a/i18n/german/luasrc/i18n/cbi.de.lua b/i18n/german/luasrc/i18n/cbi.de.lua index c59536f3f8..075ed834ab 100644 --- a/i18n/german/luasrc/i18n/cbi.de.lua +++ b/i18n/german/luasrc/i18n/cbi.de.lua @@ -1,7 +1,10 @@ cbi_add = [[Eintrag hinzufügen]] cbi_del = [[Eintrag entfernen]] cbi_invalid = [[Fehler: Ungültige Eingabe]] +cbi_invalid_section = [[<strong>Fehler:</strong> Validierung fehlgeschlagen]] cbi_missing = [[Fehler: Dieses Feld muss ausgefüllt werden]] +cbi_deperror = [[<strong>Fehler:</strong> Mindestens ein benötigtes Feld ist leer oder hat einen ungültigen Wert]] +cbi_reqerror = [[<strong>Fehler:</strong> Nicht erfüllte Abhängigkeit für dieses Feld]] cbi_addopt = [[-- Zusätzliches Feld --]] cbi_sectempty = [[Diese Sektion enthält noch keine Einträge]] cbi_manual = [[-- benutzerdefiniert --]] diff --git a/i18n/german/luasrc/i18n/cbi.de.xml b/i18n/german/luasrc/i18n/cbi.de.xml index b88f6b8f8a..e1ecd2df6d 100644 --- a/i18n/german/luasrc/i18n/cbi.de.xml +++ b/i18n/german/luasrc/i18n/cbi.de.xml @@ -5,7 +5,10 @@ <i18n:msg xml:id="cbi_add">Eintrag hinzufügen</i18n:msg> <i18n:msg xml:id="cbi_del">Eintrag entfernen</i18n:msg> <i18n:msg xml:id="cbi_invalid">Fehler: Ungültige Eingabe</i18n:msg> +<i18n:msg xml:id="cbi_invalid_section"><strong>Fehler:</strong> Validierung fehlgeschlagen</i18n:msg> <i18n:msg xml:id="cbi_missing">Fehler: Dieses Feld muss ausgefüllt werden</i18n:msg> +<i18n:msg xml:id="cbi_deperror"><strong>Fehler:</strong> Mindestens ein benötigtes Feld ist leer oder hat einen ungültigen Wert</i18n:msg> +<i18n:msg xml:id="cbi_reqerror"><strong>Fehler:</strong> Nicht erfüllte Abhängigkeit für dieses Feld</i18n:msg> <i18n:msg xml:id="cbi_addopt">-- Zusätzliches Feld --</i18n:msg> <i18n:msg xml:id="cbi_sectempty">Diese Sektion enthält noch keine Einträge</i18n:msg> <i18n:msg xml:id="cbi_manual">-- benutzerdefiniert --</i18n:msg> diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua index 411aa23870..543c895af4 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 7d1ac4ee68..6ca530657d 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 a01f6bd6c8..8003f53fe5 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 6ed078026e..a557c584fd 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 1d318f7915..c245940d4b 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%>" /> |