libs/cbi: Added preliminary UCI list datatype support... for great justice
authorSteven Barth <steven@midlink.org>
Mon, 18 Aug 2008 23:26:06 +0000 (23:26 +0000)
committerSteven Barth <steven@midlink.org>
Mon, 18 Aug 2008 23:26:06 +0000 (23:26 +0000)
libs/cbi/luasrc/cbi.lua
libs/cbi/luasrc/view/cbi/dynlist.htm [new file with mode: 0644]
libs/cbi/luasrc/view/cbi/value.htm

index 9a32dd68d04ecfbfed3ebfa0b1d579d228a95807..7a05d8922e7de24704b37d733c37d13687dba973 100644 (file)
@@ -367,6 +367,7 @@ function AbstractSection.__init__(self, map, sectiontype, ...)
        self.config = map.config
        self.optionals = {}
        self.defaults = {}
+       self.cast = "string"
 
        self.optional = true
        self.addremove = false
@@ -446,7 +447,16 @@ end
 
 -- Returns the section's UCI table
 function AbstractSection.cfgvalue(self, section)
-       return self.map:get(section)
+       local value = self.map:get(section)
+       if not self.cast or self.cast == type(value) then
+               return value
+       elseif self.cast == "string" then
+               if type(value) == "table" then
+                       return value[1]
+               end
+       elseif self.cast == "table" then
+               return {value}
+       end
 end
 
 -- Removes the section
@@ -989,6 +999,60 @@ function MultiValue.validate(self, val)
        return result
 end
 
+
+StaticList = class(MultiValue)
+
+function StaticList.__init__(self, ...)
+       MultiValue.__init__(self, ...)
+       self.cast = "table"
+       self.valuelist = self.cfgvalue
+end
+
+function StaticList.validate(self, value)
+       value = (type(value) == "table") and value or {value}
+
+       local valid = {}
+       for i, v in ipairs(value) do
+               if luci.util.contains(self.valuelist, v) then
+                       table.insert(valid, v)
+               end
+       end
+       return valid
+end
+
+
+DynamicList = class(AbstractValue)
+
+function DynamicList.__init__(self, ...)
+       AbstractValue.__init__(self, ...)
+       self.template  = "cbi/dynlist"
+       self.cast = "table"
+       
+       self.keylist = {}
+       self.vallist = {}
+end
+
+function DynamicList.value(self, key, val)
+       val = val or key
+       table.insert(self.keylist, tostring(key))
+       table.insert(self.vallist, tostring(val))
+end
+
+function DynamicList.validate(self, value, section)
+       value = (type(value) == "table") and value or {value}
+       
+       local valid = {}
+       for i, v in ipairs(value) do
+               if v and #v > 0 and
+                not luci.http.formvalue("cbi.rle."..section.."."..self.option.."."..i) then
+                       table.insert(valid, v)
+               end
+       end
+       
+       return valid
+end
+
+
 --[[
 TextValue - A multi-line value
        rows:   Rows
diff --git a/libs/cbi/luasrc/view/cbi/dynlist.htm b/libs/cbi/luasrc/view/cbi/dynlist.htm
new file mode 100644 (file)
index 0000000..1368872
--- /dev/null
@@ -0,0 +1,44 @@
+<%#
+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$
+
+-%>
+<%+cbi/valueheader%>
+       local vals = self:cfgvalue(section)
+       for i=1, #vals + 1 do
+               local val = vals[i]
+%>
+       <input onchange="cbi_d_update(this.id)" type="text"<%= attr("id", cbid .. "." .. i) .. attr("name", cbid) .. ifattr(val, "value") .. ifattr(self.size, "size")%> />
+       <% if i <= #vals then %>
+               <input type="image" value="<%:cbi_del%>" name="cbi.rle.<%=section .. "." .. self.option .. "." i%>" alt="<%:cbi_del%>" title="<%:cbi_del%>" src="<%=resource%>/cbi/remove.gif" />
+       <% else %>
+               <input type="image" value="<%:cbi_add%>" name="cbi.ale.<%=section .. "." .. self.option%>" alt="<%:cbi_add%>" title="<%:cbi_add%>" src="<%=resource%>/cbi/add.gif" />
+       <% end %>
+       <% if #self.keylist > 0 then -%>
+               <script type="text/javascript">
+                       cbi_combobox_init('<%=cbid .. "." .. i%>', {
+                       <%-
+                               for i, k in ipairs(self.keylist) do
+                       -%>
+                               <%-=string.format("%q", k) .. ":" .. string.format("%q", self.vallist[i])-%>,
+                       <%-
+                               end
+                       -%>
+                       }, '<%- if not self.rmempty and not self.optional then -%>
+                               <%-:cbi_select-%>
+                       <%- end -%>', '<%:cbi_manual%>');
+               </script>
+       <% end -%>
+       <br />
+<% if i <= #vals then %><br />
+<% end end %>
+<%+cbi/valuefooter%>
index 51c78549ca1b291796c56c70c9e6423ca2876aae..0dc5841469ccf7dbf32b6d3d2d6f252a0ca68ac0 100644 (file)
@@ -13,7 +13,7 @@ $Id$
 
 -%>
 <%+cbi/valueheader%>
-       <input type="<%=self.password and 'password" class="cbi-input-key' or "text"%>" onchange="cbi_d_update(this.id)"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self:cfgvalue(section)) .. ifattr(self.size, "size") .. ifattr(self.maxlength, "maxlength") %> />
+       <input type="<%=self.password and 'password" class="cbi-input-key' or "text"%>" onchange="cbi_d_update(this.id)"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self:cfgvalue(section)) .. ifattr(self.size, "size")%> />
        <% if #self.keylist > 0 then -%>
        <script type="text/javascript">
                cbi_combobox_init('<%=cbid%>', {