From d1a448604e32a5f2d62fe52438ab36f316f54444 Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Mon, 18 Aug 2008 23:26:06 +0000 Subject: [PATCH] libs/cbi: Added preliminary UCI list datatype support... for great justice --- libs/cbi/luasrc/cbi.lua | 66 +++++++++++++++++++++++++++- libs/cbi/luasrc/view/cbi/dynlist.htm | 44 +++++++++++++++++++ libs/cbi/luasrc/view/cbi/value.htm | 2 +- 3 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 libs/cbi/luasrc/view/cbi/dynlist.htm 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 +Copyright 2008 Jo-Philipp Wich + +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] +%> + /> + <% if i <= #vals then %> + " alt="<%:cbi_del%>" title="<%:cbi_del%>" src="<%=resource%>/cbi/remove.gif" /> + <% else %> + " alt="<%:cbi_add%>" title="<%:cbi_add%>" src="<%=resource%>/cbi/add.gif" /> + <% end %> + <% if #self.keylist > 0 then -%> + + <% end -%> +
+<% if i <= #vals then %>
+<% 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%> - " 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") %> /> + " 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 -%>