From: Steven Barth Date: Sat, 9 Aug 2008 14:14:04 +0000 (+0000) Subject: libs/cbi: Major Improvements X-Git-Tag: 0.8.0~485 X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=commitdiff_plain;h=bdb4bbde130ba4cfb86746dde2905fc12b94175f libs/cbi: Major Improvements Added initial support for non-UCI-based forms (luci.cbi.SimpleForm) Minor API improvements Now correctly tagging "empty mandatory field" errors --- diff --git a/i18n/english/luasrc/i18n/cbi.en.lua b/i18n/english/luasrc/i18n/cbi.en.lua index 012d7c5f6..9c84a8950 100644 --- a/i18n/english/luasrc/i18n/cbi.en.lua +++ b/i18n/english/luasrc/i18n/cbi.en.lua @@ -1,6 +1,7 @@ cbi_add = "Add entry" cbi_del = "Remove entry" cbi_invalid = "Error: Invalid input value" +cbi_missing = "Error: This field is mandatory" cbi_addopt = "-- Additional Field --" cbi_optional = " (optional)" cbi_sectempty = "This section contains no values yet" diff --git a/i18n/english/luasrc/i18n/default.en.lua b/i18n/english/luasrc/i18n/default.en.lua index 8f472d9c1..89b7c6321 100644 --- a/i18n/english/luasrc/i18n/default.en.lua +++ b/i18n/english/luasrc/i18n/default.en.lua @@ -89,6 +89,7 @@ settings = "Settings" start = "Start" static = "static" statistics = "Statistics" +submit = "Submit" syslog = "System Log" system = "System" diff --git a/i18n/german/luasrc/i18n/cbi.de.lua b/i18n/german/luasrc/i18n/cbi.de.lua index f2ed5ecd2..8b3265061 100644 --- a/i18n/german/luasrc/i18n/cbi.de.lua +++ b/i18n/german/luasrc/i18n/cbi.de.lua @@ -1,6 +1,7 @@ cbi_add = "Eintrag hinzufügen" cbi_del = "Eintrag entfernen" -cbi_invalid = "Error: Ungültige Eingabe" +cbi_invalid = "Fehler: Ungültige Eingabe" +cbi_missing = "Fehler: Dieses Feld muss ausgefüllt werden" 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/default.de.lua b/i18n/german/luasrc/i18n/default.de.lua index 554975c6b..08ef89e69 100644 --- a/i18n/german/luasrc/i18n/default.de.lua +++ b/i18n/german/luasrc/i18n/default.de.lua @@ -90,6 +90,7 @@ settings = "Einstellungen" start = "Start" static = "statisch" statistics = "Statistiken" +submit = "Absenden" syslog = "Systemprotokoll" system = "System" diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua index 4b4bf3905..0ec2ff815 100644 --- a/libs/cbi/luasrc/cbi.lua +++ b/libs/cbi/luasrc/cbi.lua @@ -35,6 +35,9 @@ local uci = luci.model.uci local class = luci.util.class local instanceof = luci.util.instanceof +FORM_NODATA = 0 +FORM_VALID = 1 +FORM_INVALID = -1 -- Loads a CBI map from given file, creating an environment and returns it function load(cbimap, ...) @@ -61,7 +64,7 @@ function load(cbimap, ...) local maps = {func()} for i, map in ipairs(maps) do - if not instanceof(map, Map) then + if not instanceof(map, Node) then error("CBI map returns no valid map object!") return nil end @@ -232,6 +235,68 @@ end --[[ +SimpleForm - A Simple non-UCI form +]]-- +SimpleForm = class(Node) + +function SimpleForm.__init__(self, config, title, description, data) + Node.__init__(self, title, description) + self.config = config + self.data = data or {} + self.template = "cbi/simpleform" + self.dorender = true +end + +function SimpleForm.parse(self, ...) + Node.parse(self, 1, ...) + + local valid = true + for i, v in ipairs(self.children) do + valid = valid and not v.tag_missing[1] and not v.tag_invalid[1] + end + + local state = + not luci.http.formvalue("cbi.submit") and 0 + or valid and 1 + or -1 + + self.dorender = self:handle(state) +end + +function SimpleForm.render(self, ...) + if self.dorender then + Node.render(self, ...) + end +end + +-- Creates a child section +function SimpleForm.field(self, class, ...) + if instanceof(class, AbstractValue) then + local obj = class(self, ...) + self:append(obj) + return obj + else + error("class must be a descendent of AbstractValue") + end +end + +function SimpleForm.set(self, section, option, value) + self.data[option] = value +end + + +function SimpleForm.del(self, section, option) + self.data[option] = nil +end + + +function SimpleForm.get(self, section, option) + return self.data[option] +end + + + +--[[ AbstractSection ]]-- AbstractSection = class(Node) @@ -534,12 +599,13 @@ function AbstractValue.__init__(self, map, option, ...) self.map = map self.config = map.config self.tag_invalid = {} + self.tag_missing = {} self.deps = {} - self.rmempty = false - self.default = nil - self.size = nil - self.optional = false + self.rmempty = false + self.default = nil + self.size = nil + self.optional = false end -- Add a dependencie to another section field @@ -559,11 +625,20 @@ function AbstractValue.formvalue(self, section) return luci.http.formvalue(key) end +function AbstractValue.additional(self, value) + self.optional = value +end + +function AbstractValue.mandatory(self, value) + self.rmempty = not value +end + function AbstractValue.parse(self, section) local fvalue = self:formvalue(section) + local cvalue = self:cfgvalue(section) if fvalue and fvalue ~= "" then -- If we have a form value, write it to UCI - fvalue = self:validate(fvalue) + fvalue = self:transform(self:validate(fvalue)) if not fvalue then self.tag_invalid[section] = true end @@ -573,6 +648,8 @@ function AbstractValue.parse(self, section) else -- Unset the UCI or error if self.rmempty or self.optional then self:remove(section) + elseif not fvalue or fvalue ~= cvalue then + self.tag_missing[section] = true end end end @@ -618,6 +695,9 @@ function AbstractValue.validate(self, value) return value end +AbstractValue.transform = AbstractValue.validate + + -- Write to UCI function AbstractValue.write(self, section, value) return self.map:set(section, self.option, value) diff --git a/libs/cbi/luasrc/view/cbi/full_valuefooter.htm b/libs/cbi/luasrc/view/cbi/full_valuefooter.htm index 8924beccd..a7b56e294 100644 --- a/libs/cbi/luasrc/view/cbi/full_valuefooter.htm +++ b/libs/cbi/luasrc/view/cbi/full_valuefooter.htm @@ -21,6 +21,9 @@ $Id$ <% if self.tag_invalid[section] then -%>
<%:cbi_invalid%>
<%- end %> + <% if self.tag_missing[section] then -%> +
<%:cbi_missing%>
+ <%- end %> <% if #self.deps > 0 then -%> diff --git a/libs/cbi/luasrc/view/cbi/simpleform.htm b/libs/cbi/luasrc/view/cbi/simpleform.htm new file mode 100644 index 000000000..38df61b5f --- /dev/null +++ b/libs/cbi/luasrc/view/cbi/simpleform.htm @@ -0,0 +1,46 @@ +<%# +LuCI - Lua Configuration Interface +Copyright 2008 Steven Barth +Copyright 2008 Jo-Philipp Wich + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +$Id$ + +-%> + +
"> +
+ + + +
+
+

<%=self.title%>

+
<%=self.description%>
+
+
+ <% self:render_children(1, scope or {}) %> +
+
+
+
+
+
+<%- if self.submit ~= false then %> + +<% end %> +<%- if self.reset ~= false then %> + +<% end %> + +
+
diff --git a/libs/web/luasrc/dispatcher.lua b/libs/web/luasrc/dispatcher.lua index 9ba74c49c..d9917c2a8 100644 --- a/libs/web/luasrc/dispatcher.lua +++ b/libs/web/luasrc/dispatcher.lua @@ -461,3 +461,32 @@ function cbi(model) luci.template.render("cbi/footer") end end + +--- Create a CBI form model dispatching target. +-- @param model CBI form model tpo be rendered +function form(model) + require("luci.cbi") + require("luci.template") + + return function(...) + local stat, maps = luci.util.copcall(luci.cbi.load, model, ...) + if not stat then + error500(maps) + return true + end + + for i, res in ipairs(maps) do + local stat, err = luci.util.copcall(res.parse, res) + if not stat then + error500(err) + return true + end + end + + luci.template.render("header") + for i, res in ipairs(maps) do + res:render() + end + luci.template.render("footer") + end +end