diff options
author | Steven Barth <steven@midlink.org> | 2008-08-18 23:26:06 +0000 |
---|---|---|
committer | Steven Barth <steven@midlink.org> | 2008-08-18 23:26:06 +0000 |
commit | d1a448604e32a5f2d62fe52438ab36f316f54444 (patch) | |
tree | 5ddeb079ddcddcd634c3ac570ee036564ba95846 | |
parent | 70aa9bb855db019e08b6931f916e67c563018a9d (diff) |
libs/cbi: Added preliminary UCI list datatype support... for great justice
-rw-r--r-- | libs/cbi/luasrc/cbi.lua | 66 | ||||
-rw-r--r-- | libs/cbi/luasrc/view/cbi/dynlist.htm | 44 | ||||
-rw-r--r-- | libs/cbi/luasrc/view/cbi/value.htm | 2 |
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%>', { |