* CBI updates
authorSteven Barth <steven@midlink.org>
Thu, 20 Mar 2008 20:33:43 +0000 (20:33 +0000)
committerSteven Barth <steven@midlink.org>
Thu, 20 Mar 2008 20:33:43 +0000 (20:33 +0000)
src/ffluci/cbi.lua
src/ffluci/http.lua
src/ffluci/view/cbi/lvalue.htm [new file with mode: 0644]
src/ffluci/view/cbi/map.htm
src/ffluci/view/cbi/nsection.htm
src/ffluci/view/cbi/tsection.htm
src/ffluci/view/cbi/value.htm [new file with mode: 0644]

index a346dd7072f02439fa1800578e20ea7ce5ddb696..149c1d70fae4b071079cb2ad5c78fd1601d28fcc 100644 (file)
@@ -27,6 +27,8 @@ limitations under the License.
 module("ffluci.cbi", package.seeall)
 require("ffluci.template")
 require("ffluci.util")
 module("ffluci.cbi", package.seeall)
 require("ffluci.template")
 require("ffluci.util")
+require("ffluci.http")
+require("ffluci.model.uci")
 local Template = ffluci.template.Template
 local class = ffluci.util.class
 local instanceof = ffluci.util.instanceof
 local Template = ffluci.template.Template
 local class = ffluci.util.class
 local instanceof = ffluci.util.instanceof
@@ -46,8 +48,14 @@ function Node.append(self, obj)
        table.insert(self.children, obj)
 end
 
        table.insert(self.children, obj)
 end
 
+function Node.parse(self)
+       for k, child in ipairs(self.children) do
+               child:parse()
+       end
+end
+
 function Node.render(self)
 function Node.render(self)
-       ffluci.template.render(self.template, self)
+       ffluci.template.render(self.template)
 end
 
 
 end
 
 
@@ -64,15 +72,20 @@ end
 
 function Map.section(self, class, ...)
        if instanceof(class, AbstractSection) then
 
 function Map.section(self, class, ...)
        if instanceof(class, AbstractSection) then
-               local obj = class(...)
-               obj.map = self.config
-               table.insert(self.children, obj)
+               local obj  = class(...)
+               obj.map    = self
+               obj.config = self.config
+               self:append(obj)
                return obj
        else
                error("class must be a descendent of AbstractSection")
        end
 end
 
                return obj
        else
                error("class must be a descendent of AbstractSection")
        end
 end
 
+function Map.read(self)
+       self.ucidata = self.ucidata or ffluci.model.uci.show(self.config)
+       return self.ucidata
+end
 
 --[[
 AbstractSection
 
 --[[
 AbstractSection
@@ -86,9 +99,10 @@ end
 
 function AbstractSection.option(self, class, ...)
        if instanceof(class, AbstractValue) then
 
 function AbstractSection.option(self, class, ...)
        if instanceof(class, AbstractValue) then
-               local obj = class(...)
-               obj.map   = self.map
-               table.insert(self.children, obj)
+               local obj  = class(...)
+               obj.map    = self.map
+               obj.config = self.config
+               self:append(obj)
                return obj
        else
                error("class must be a descendent of AbstractValue")
                return obj
        else
                error("class must be a descendent of AbstractValue")
@@ -137,7 +151,7 @@ end
 --[[
 AbstractValue - An abstract Value Type
        null:           Value can be empty
 --[[
 AbstractValue - An abstract Value Type
        null:           Value can be empty
-       valid:          A function returning nil if invalid
+       valid:          A function returning the value if it is valid otherwise nil 
        depends:        A table of option => value pairs of which one must be true
        default:        The default value
 ]]--
        depends:        A table of option => value pairs of which one must be true
        default:        The default value
 ]]--
@@ -151,7 +165,25 @@ function AbstractValue.__init__(self, option, ...)
        self.depends = nil
        self.default = nil
 end
        self.depends = nil
        self.default = nil
 end
-       
+
+
+function AbstractValue.formvalue(self)
+       local key = "uci."..self.map.config.."."..self.section.."."..self.option
+       return ffluci.http.formvalue(key)
+end
+
+function AbstractValue.ucivalue(self)
+       return self.map.read()[self.section][self.option]
+end
+
+function AbstractValue.validate(self, value)
+       return ffluci.util.validate(value, nil, nil, self.valid)
+end
+
+function AbstractValue.write(self, value)
+       ffluci.model.uci.set(self.config, self.section, self.option, value)
+end
+
 
 --[[
 Value - A one-line value
 
 --[[
 Value - A one-line value
@@ -178,7 +210,7 @@ ListValue = class(AbstractValue)
 
 function ListValue.__init__(self, ...)
        AbstractValue.__init__(self, ...)
 
 function ListValue.__init__(self, ...)
        AbstractValue.__init__(self, ...)
-       self.template  = "cbi/value"
+       self.template  = "cbi/lvalue"
        
        self.list = {}
 end
        
        self.list = {}
 end
index 5e177195e17673915f41706da1bfe1c0fd653fdb..bf94105734e1be14bde4f160f433b6197bffacde 100644 (file)
@@ -54,6 +54,7 @@ function request_redirect(category, module, action)
        redirect(pattern:format(category, module, action))
 end
 
        redirect(pattern:format(category, module, action))
 end
 
+
 -- Gets form value from key
 function formvalue(key, default)
        local c = formvalues()
 -- Gets form value from key
 function formvalue(key, default)
        local c = formvalues()
diff --git a/src/ffluci/view/cbi/lvalue.htm b/src/ffluci/view/cbi/lvalue.htm
new file mode 100644 (file)
index 0000000..b7db0de
--- /dev/null
@@ -0,0 +1,11 @@
+<div class="cbi-lvalue">
+<div class="cbi-lvalue-title"><%=self.title%></div>
+<div class="cbi-lvalue-field">
+<select name="<%=self.map.config.."."..self.section.."."..self.option%>">
+<%for k, v in self.list do%>
+<option value="<%=k%>"><%=v%></option>
+<% end %>
+</select>
+</div>
+<div class="cbi-value-description"><%=self.description%></div>
+</div>
\ No newline at end of file
index 918e455d7504bbe9778af3b804477026a4239e77..e4f493bd09a3af4b85c1060e8810ee1e5b4ccf30 100644 (file)
@@ -1,7 +1,7 @@
-<div class="cbi-map" id="cbi-<%=config%>">
+<div class="cbi-map" id="cbi-<%=self.config%>">
 <form method="post" action="<%=os.getenv("REQUEST_URI")%>">
 <form method="post" action="<%=os.getenv("REQUEST_URI")%>">
-<h1><%=title%></h1>
-<div class="cbi-map-descr"><%=description%></div>
-<% for k, node in ipairs(children) do node:render() end %>
+<h1><%=self.title%></h1>
+<div class="cbi-map-descr"><%=self.description%></div>
+<% for k, node in ipairs(self.children) do node:render() end %>
 </form>
 </div>
 </form>
 </div>
index 4a47c7dad4c785dfede291b0ea46e8f2eb57d0b1..4607a872ccd9d9356f668fdcc0876288e385b3c1 100644 (file)
@@ -1,5 +1,5 @@
-<div class="cbi-nsection" id="cbi-<%=map.config%>-<%=sectiontype%>-<%=section%>">
-<h2><%=title%></h2>
-<div class="cbi-nsection-descr"><%=description%></div>
-<% for k, node in ipairs(children) do node:render() end %>
+<div class="cbi-nsection" id="cbi-<%=self.map.config%>-<%=self.sectiontype%>-<%=self.section%>">
+<h2><%=self.title%></h2>
+<div class="cbi-nsection-descr"><%=self.description%></div>
+<% for k, node in ipairs(self.children) do node:render() end %>
 </div>
 </div>
index 2c25500f8a043c339e2c5d4fb7c70ed7fd98804d..420bfd14a8f816ba2591143087726ce6f0e28127 100644 (file)
@@ -1,6 +1,5 @@
 <%
 <%
-require("ffluci.model.uci")
-local allsections = ffluci.model.uci.show(map)
+local allsections = self.map:read()
 local sections = {}
 for k, v in pairs(allsections) do
        if v[".type"] == sectiontype then
 local sections = {}
 for k, v in pairs(allsections) do
        if v[".type"] == sectiontype then
@@ -8,12 +7,12 @@ for k, v in pairs(allsections) do
        end
 end 
 %>
        end
 end 
 %>
-<div class="cbi-tsection" id="cbi-<%=map%>-<%=sectiontype%>">
-<h2><%=title%></h2>
-<div class="cbi-tsection-descr"><%=description%></div>
+<div class="cbi-tsection" id="cbi-<%=self.map.config%>-<%=self.sectiontype%>">
+<h2><%=self.title%></h2>
+<div class="cbi-tsection-descr"><%=self.description%></div>
 <% for k, v in pairs(sections) do %>
 <% for k, v in pairs(sections) do %>
-<div class="cbi-tsection-node" id="cbi-<%=map%>-<%=k%>">
-<% for k, node in ipairs(children) do
+<div class="cbi-tsection-node" id="cbi-<%=self.map.config%>-<%=k%>">
+<% for k, node in ipairs(self.children) do
        node.section = k
        node:render(k)
 end %>
        node.section = k
        node:render(k)
 end %>
diff --git a/src/ffluci/view/cbi/value.htm b/src/ffluci/view/cbi/value.htm
new file mode 100644 (file)
index 0000000..a39010a
--- /dev/null
@@ -0,0 +1,7 @@
+<div class="cbi-value">
+<div class="cbi-value-title"><%=self.title%></div>
+<div class="cbi-value-field">
+<input type="text" name="<%=self.map.config.."."..self.section.."."..self.option%>" value="<%=self:ucivalue()%>" />
+</div>
+<div class="cbi-value-description"><%=self.description%></div>
+</div>
\ No newline at end of file