summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSteven Barth <steven@midlink.org>2008-08-18 23:26:06 +0000
committerSteven Barth <steven@midlink.org>2008-08-18 23:26:06 +0000
commitd1a448604e32a5f2d62fe52438ab36f316f54444 (patch)
tree5ddeb079ddcddcd634c3ac570ee036564ba95846
parent70aa9bb855db019e08b6931f916e67c563018a9d (diff)
libs/cbi: Added preliminary UCI list datatype support... for great justice
-rw-r--r--libs/cbi/luasrc/cbi.lua66
-rw-r--r--libs/cbi/luasrc/view/cbi/dynlist.htm44
-rw-r--r--libs/cbi/luasrc/view/cbi/value.htm2
3 files changed, 110 insertions, 2 deletions
diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua
index 9a32dd68d..7a05d8922 100644
--- a/libs/cbi/luasrc/cbi.lua
+++ b/libs/cbi/luasrc/cbi.lua
@@ -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
index 000000000..1368872d9
--- /dev/null
+++ b/libs/cbi/luasrc/view/cbi/dynlist.htm
@@ -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%>
diff --git a/libs/cbi/luasrc/view/cbi/value.htm b/libs/cbi/luasrc/view/cbi/value.htm
index 51c78549c..0dc584146 100644
--- a/libs/cbi/luasrc/view/cbi/value.htm
+++ b/libs/cbi/luasrc/view/cbi/value.htm
@@ -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%>', {