summaryrefslogtreecommitdiffhomepage
path: root/libs/cbi
diff options
context:
space:
mode:
authorSteven Barth <steven@midlink.org>2008-08-09 14:14:04 +0000
committerSteven Barth <steven@midlink.org>2008-08-09 14:14:04 +0000
commitbdb4bbde130ba4cfb86746dde2905fc12b94175f (patch)
treea71d55bfc51b603f2c87b8727a896027436f3fd5 /libs/cbi
parentb71825db91b3d99417693dd004178ff926edc887 (diff)
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
Diffstat (limited to 'libs/cbi')
-rw-r--r--libs/cbi/luasrc/cbi.lua92
-rw-r--r--libs/cbi/luasrc/view/cbi/full_valuefooter.htm3
-rw-r--r--libs/cbi/luasrc/view/cbi/simpleform.htm46
3 files changed, 135 insertions, 6 deletions
diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua
index 4b4bf39059..0ec2ff815d 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 8924beccdf..a7b56e2944 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 -%>
<div class="cbi-error"><%:cbi_invalid%></div>
<%- end %>
+ <% if self.tag_missing[section] then -%>
+ <div class="cbi-error"><%:cbi_missing%></div>
+ <%- end %>
</div>
<% 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 0000000000..38df61b5f9
--- /dev/null
+++ b/libs/cbi/luasrc/view/cbi/simpleform.htm
@@ -0,0 +1,46 @@
+<%#
+LuCI - Lua Configuration Interface
+Copyright 2008 Steven Barth <steven@midlink.org>
+Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
+
+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$
+
+-%>
+
+<form method="post" action="<%=luci.http.getenv("REQUEST_URI")%>">
+ <div>
+ <script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+ <input type="hidden" name="cbi.submit" value="1" />
+ <input type="submit" value="<%:save%>" class="hidden" />
+ </div>
+ <div class="cbi-map" id="cbi-<%=self.config%>">
+ <h1><%=self.title%></h1>
+ <div class="cbi-map-descr"><%=self.description%></div>
+ <fieldset class="cbi-section">
+ <div class="cbi-section-node">
+ <% self:render_children(1, scope or {}) %>
+ </div>
+ <br />
+ </fieldset>
+ <br />
+ </div>
+ <div>
+<%- if self.submit ~= false then %>
+ <input type="submit" value="
+ <%- if not self.submit then -%><%-:submit-%><%-else-%><%=self.submit%><%end%>
+ " />
+<% end %>
+<%- if self.reset ~= false then %>
+ <input type="reset" value="
+ <%- if not self.reset then -%><%-:reset-%><%-else-%><%=self.reset%><%end%>
+ " />
+<% end %>
+ <script type="text/javascript">cbi_d_init();</script>
+ </div>
+</form>