summaryrefslogtreecommitdiffhomepage
path: root/src/ffluci
diff options
context:
space:
mode:
authorSteven Barth <steven@midlink.org>2008-03-27 23:14:01 +0000
committerSteven Barth <steven@midlink.org>2008-03-27 23:14:01 +0000
commit077db659bbcb7cee6bbc4c4dbaed9776261190a0 (patch)
tree0128ec76baf8112f2dd6538e0c5a9448cdf7d91a /src/ffluci
parent3f1064b91949741af53eb1d198e228f768abaea8 (diff)
* Major CBI improvements
Diffstat (limited to 'src/ffluci')
-rw-r--r--src/ffluci/cbi.lua116
-rw-r--r--src/ffluci/controller/admin/network.lua3
-rw-r--r--src/ffluci/controller/admin/uci.lua4
-rw-r--r--src/ffluci/model/cbi/admin_network/ifaces.lua31
-rw-r--r--src/ffluci/model/cbi/admin_network/ptp.lua31
-rw-r--r--src/ffluci/model/cbi/admin_network/vlan.lua6
-rw-r--r--src/ffluci/model/uci.lua3
-rw-r--r--src/ffluci/util.lua11
-rw-r--r--src/ffluci/view/cbi/footer.htm1
-rw-r--r--src/ffluci/view/cbi/fvalue.htm17
-rw-r--r--src/ffluci/view/cbi/header.htm1
-rw-r--r--src/ffluci/view/cbi/lvalue.htm13
-rw-r--r--src/ffluci/view/cbi/mvalue.htm15
-rw-r--r--src/ffluci/view/cbi/nsection.htm15
-rw-r--r--src/ffluci/view/cbi/tsection.htm19
-rw-r--r--src/ffluci/view/cbi/value.htm13
16 files changed, 203 insertions, 96 deletions
diff --git a/src/ffluci/cbi.lua b/src/ffluci/cbi.lua
index 22a4019e4..844f6c0bb 100644
--- a/src/ffluci/cbi.lua
+++ b/src/ffluci/cbi.lua
@@ -218,7 +218,6 @@ function AbstractSection.parse_optionals(self, section)
for k,v in ipairs(self.children) do
if v.optional and not v:cfgvalue(section) then
if field == v.option then
- self.map:set(section, field, v.default)
field = nil
else
table.insert(self.optionals[section], v)
@@ -328,18 +327,30 @@ end
TypedSection - A (set of) configuration section(s) defined by the type
addremove: Defines whether the user can add/remove sections of this type
anonymous: Allow creating anonymous sections
- valid: a list of names or a validation function for creating sections
- scope: a list of names or a validation function for editing sections
+ validate: a validation function returning nil if the section is invalid
]]--
TypedSection = class(AbstractSection)
function TypedSection.__init__(self, ...)
AbstractSection.__init__(self, ...)
self.template = "cbi/tsection"
+ self.deps = {}
+ self.excludes = {}
self.anonymous = false
- self.valid = nil
- self.scope = nil
+end
+
+-- Return all matching UCI sections for this TypedSection
+function TypedSection.cfgsections(self)
+ local sections = {}
+ for k, v in pairs(self.map:get()) do
+ if v[".type"] == self.sectiontype then
+ if self:checkscope(k) then
+ sections[k] = v
+ end
+ end
+ end
+ return sections
end
-- Creates a new section of this type with the given name (or anonymous)
@@ -357,6 +368,16 @@ function TypedSection.create(self, name)
end
end
+-- Limits scope to sections that have certain option => value pairs
+function TypedSection.depends(self, option, value)
+ table.insert(self.deps, {option=option, value=value})
+end
+
+-- Excludes several sections by name
+function TypedSection.exclude(self, field)
+ self.excludes[field] = true
+end
+
function TypedSection.parse(self)
if self.addremove then
-- Create
@@ -368,10 +389,17 @@ function TypedSection.parse(self)
end
else
if name then
- name = ffluci.util.validate(name, self.valid)
+ -- Ignore if it already exists
+ if self:cfgvalue(name) then
+ name = nil;
+ end
+
+ name = self:checkscope(name)
+
if not name then
self.err_invalid = true
end
+
if name and name:len() > 0 then
self:create(name)
end
@@ -383,7 +411,7 @@ function TypedSection.parse(self)
name = ffluci.http.formvalue(crval)
if type(name) == "table" then
for k,v in pairs(name) do
- if ffluci.util.validate(k, self.valid) then
+ if self:cfgvalue(k) and self:checkscope(k) then
self:remove(k)
end
end
@@ -404,20 +432,37 @@ function TypedSection.render_children(self, section)
end
end
--- Return all matching UCI sections for this TypedSection
-function TypedSection.cfgsections(self)
- local sections = {}
- for k, v in pairs(self.map:get()) do
- if v[".type"] == self.sectiontype then
- if ffluci.util.validate(k, self.scope) then
- sections[k] = v
+-- Verifies scope of sections
+function TypedSection.checkscope(self, section)
+ -- Check if we are not excluded
+ if self.excludes[section] then
+ return nil
+ end
+
+ -- Check if at least one dependency is met
+ if #self.deps > 0 and self:cfgvalue(section) then
+ local stat = false
+
+ for k, v in ipairs(self.deps) do
+ if self:cfgvalue(section)[v.option] == v.value then
+ stat = true
end
end
+
+ if not stat then
+ return nil
+ end
end
- return sections
+
+ return self:validate(section)
end
+-- Dummy validate function
+function TypedSection.validate(self, section)
+ return section
+end
+
--[[
AbstractValue - An abstract Value Type
@@ -437,14 +482,25 @@ function AbstractValue.__init__(self, map, option, ...)
self.map = map
self.config = map.config
self.tag_invalid = {}
+ self.deps = {}
- self.valid = nil
- self.depends = nil
- self.default = " "
+ self.rmempty = false
+ self.default = nil
self.size = nil
self.optional = false
end
+-- Add a dependencie to another section field
+function AbstractValue.depends(self, field, value)
+ table.insert(self.deps, {field=field, value=value})
+end
+
+-- Return whether this object should be created
+function AbstractValue.formcreated(self, section)
+ local key = "cbi.opt."..self.config.."."..section
+ return (ffluci.http.formvalue(key) == self.option)
+end
+
-- Returns the formvalue for this object
function AbstractValue.formvalue(self, section)
local key = "cbid."..self.map.config.."."..section.."."..self.option
@@ -453,12 +509,8 @@ end
function AbstractValue.parse(self, section)
local fvalue = self:formvalue(section)
- if fvalue == "" then
- fvalue = nil
- end
-
- if fvalue then -- If we have a form value, validate it and write it to UCI
+ if fvalue and fvalue ~= "" then -- If we have a form value, write it to UCI
fvalue = self:validate(fvalue)
if not fvalue then
self.tag_invalid[section] = true
@@ -469,16 +521,14 @@ function AbstractValue.parse(self, section)
elseif ffluci.http.formvalue("cbi.submit") then -- Unset the UCI or error
if self.rmempty or self.optional then
self:remove(section)
- else
- self.tag_invalid[section] = true
end
end
end
-- Render if this value exists or if it is mandatory
-function AbstractValue.render(self, section)
- if not self.optional or self:cfgvalue(section) then
- ffluci.template.render(self.template, {self=self, section=section})
+function AbstractValue.render(self, s)
+ if not self.optional or self:cfgvalue(s) or self:formcreated(s) then
+ ffluci.template.render(self.template, {self=self, section=s})
end
end
@@ -488,8 +538,8 @@ function AbstractValue.cfgvalue(self, section)
end
-- Validate the form value
-function AbstractValue.validate(self, val)
- return ffluci.util.validate(val, self.valid)
+function AbstractValue.validate(self, value)
+ return value
end
-- Write to UCI
@@ -529,7 +579,7 @@ function Value.validate(self, val)
val = nil
end
- return ffluci.util.validate(val, self.valid, self.isnumber, self.isinteger)
+ return ffluci.util.validate(val, self.isnumber, self.isinteger)
end
@@ -585,7 +635,7 @@ function ListValue.__init__(self, ...)
self.widget = "select"
end
-function ListValue.add_value(self, key, val)
+function ListValue.value(self, key, val)
val = val or key
table.insert(self.keylist, tostring(key))
table.insert(self.vallist, tostring(val))
@@ -618,7 +668,7 @@ function MultiValue.__init__(self, ...)
self.delimiter = " "
end
-function MultiValue.add_value(self, key, val)
+function MultiValue.value(self, key, val)
val = val or key
table.insert(self.keylist, tostring(key))
table.insert(self.vallist, tostring(val))
diff --git a/src/ffluci/controller/admin/network.lua b/src/ffluci/controller/admin/network.lua
index f76dce555..2774dfdb0 100644
--- a/src/ffluci/controller/admin/network.lua
+++ b/src/ffluci/controller/admin/network.lua
@@ -5,6 +5,7 @@ menu = {
order = 20,
entries = {
{action = "vlan", descr = "VLAN"},
- {action = "ifaces", descr = "Schnittstellen"}
+ {action = "ifaces", descr = "Schnittstellen"},
+ {action = "ptp", descr = "PPPoE / PPTP"},
}
} \ No newline at end of file
diff --git a/src/ffluci/controller/admin/uci.lua b/src/ffluci/controller/admin/uci.lua
index db70eb6a6..a1eb0d7d7 100644
--- a/src/ffluci/controller/admin/uci.lua
+++ b/src/ffluci/controller/admin/uci.lua
@@ -10,7 +10,7 @@ function action_apply()
-- Collect files to be applied
for i, line in ipairs(ffluci.util.split(changes)) do
- local r = line:match("^[^.]+")
+ local r = line:match("^-?([^.]+)")
if r then
apply[r] = true
end
@@ -41,7 +41,7 @@ function action_revert()
-- Collect files to be reverted
for i, line in ipairs(ffluci.util.split(changes)) do
- local r = line:match("^[^.]+")
+ local r = line:match("^-?([^.]+)")
if r then
revert[r] = true
end
diff --git a/src/ffluci/model/cbi/admin_network/ifaces.lua b/src/ffluci/model/cbi/admin_network/ifaces.lua
index f1d808635..62e72462f 100644
--- a/src/ffluci/model/cbi/admin_network/ifaces.lua
+++ b/src/ffluci/model/cbi/admin_network/ifaces.lua
@@ -1,15 +1,32 @@
+-- ToDo: Translate, Add descriptions and help texts
m = Map("network", "Schnittstellen")
s = m:section(TypedSection, "interface")
s.addremove = true
+s:exclude("loopback")
+s:depends("proto", "static")
+s:depends("proto", "dhcp")
p = s:option(ListValue, "proto", "Protokoll")
-p:add_value("static", "statisch")
-p:add_value("dhcp", "DHCP")
-s:option(Value, "ipaddr", "IP-Adresse").optional = 1
-s:option(Value, "netmask", "Netzmaske").optional = 1
-s:option(Value, "gateway", "Gateway").optional = 1
-s:option(Value, "dns", "DNS").optional = 1
-s:option(Value, "mtu", "MTU").optional = 1
+p:value("static", "statisch")
+p:value("dhcp", "DHCP")
+
+s:option(Value, "ifname", "Schnittstelle")
+
+s:option(Value, "ipaddr", "IP-Adresse")
+
+s:option(Value, "netmask", "Netzmaske"):depends("proto", "static")
+
+gw = s:option(Value, "gateway", "Gateway")
+gw:depends("proto", "static")
+gw.rmempty = true
+
+dns = s:option(Value, "dns", "DNS-Server")
+dns:depends("proto", "static")
+dns.optional = true
+
+mtu = s:option(Value, "mtu", "MTU")
+mtu.optional = true
+mtu.isinteger = true
return m \ No newline at end of file
diff --git a/src/ffluci/model/cbi/admin_network/ptp.lua b/src/ffluci/model/cbi/admin_network/ptp.lua
new file mode 100644
index 000000000..78fcf94b9
--- /dev/null
+++ b/src/ffluci/model/cbi/admin_network/ptp.lua
@@ -0,0 +1,31 @@
+-- ToDo: Translate, Add descriptions and help texts
+m = Map("network", "Punkt-zu-Punkt Verbindungen")
+
+s = m:section(TypedSection, "interface")
+s.addremove = true
+s:depends("proto", "pppoe")
+s:depends("proto", "pptp")
+
+p = s:option(ListValue, "proto", "Protokoll")
+p:value("pppoe", "PPPoE")
+p:value("pptp", "PPTP")
+p.default = "pppoe"
+
+s:option(Value, "ifname", "Schnittstelle")
+
+s:option(Value, "username", "Benutzername")
+s:option(Value, "password", "Passwort")
+
+s:option(Value, "keepalive", "Keep-Alive").optional = true
+
+s:option(Value, "demand", "Dial on Demand (idle time)").optional = true
+
+srv = s:option(Value, "server", "PPTP-Server")
+srv:depends("proto", "pptp")
+srv.optional = true
+
+mtu = s:option(Value, "mtu", "MTU")
+mtu.optional = true
+mtu.isinteger = true
+
+return m \ No newline at end of file
diff --git a/src/ffluci/model/cbi/admin_network/vlan.lua b/src/ffluci/model/cbi/admin_network/vlan.lua
index 6a0115210..3186f2d9b 100644
--- a/src/ffluci/model/cbi/admin_network/vlan.lua
+++ b/src/ffluci/model/cbi/admin_network/vlan.lua
@@ -1,12 +1,10 @@
+-- ToDo: Autodetect things, maybe use MultiValue instead, Translate, Add descriptions
m = Map("network", "VLAN", "Konfguriert den Switch des Routers.")
s = m:section(TypedSection, "switch")
--- ToDo: Autodetect things, maybe use MultiValue instead
for i = 0, 15 do
- local c = s:option(Value, "vlan"..i, "vlan"..i)
- c.default = "5"
- c.optional = true
+ s:option(Value, "vlan"..i, "vlan"..i).optional = true
end
return m \ No newline at end of file
diff --git a/src/ffluci/model/uci.lua b/src/ffluci/model/uci.lua
index 75d34c5d6..6585c66cb 100644
--- a/src/ffluci/model/uci.lua
+++ b/src/ffluci/model/uci.lua
@@ -7,6 +7,9 @@ is comparable to the syntax of the uci application
Any return value of false or nil can be interpreted as an error
+
+ToDo: Reimplement in Lua
+
FileId:
$Id$
diff --git a/src/ffluci/util.lua b/src/ffluci/util.lua
index f2180e7c0..85092f065 100644
--- a/src/ffluci/util.lua
+++ b/src/ffluci/util.lua
@@ -203,7 +203,7 @@ end
-- Validates a variable
-function validate(value, valid, cast_number, cast_int)
+function validate(value, cast_number, cast_int)
if cast_number or cast_int then
value = tonumber(value)
end
@@ -212,15 +212,6 @@ function validate(value, valid, cast_number, cast_int)
value = nil
end
-
- if type(valid) == "function" then
- value = valid(value)
- elseif type(valid) == "table" then
- if not contains(valid, value) then
- value = nil
- end
- end
-
return value
end
diff --git a/src/ffluci/view/cbi/footer.htm b/src/ffluci/view/cbi/footer.htm
index d6e49678e..0629bd6d6 100644
--- a/src/ffluci/view/cbi/footer.htm
+++ b/src/ffluci/view/cbi/footer.htm
@@ -1,4 +1,5 @@
<input type="submit" value="<%:save Speichern%>" />
<input type="reset" value="<%:reset Zurücksetzen%>" />
+ <script type="text/javascript">cbi_d_init();</script>
</form>
<%+footer%> \ No newline at end of file
diff --git a/src/ffluci/view/cbi/fvalue.htm b/src/ffluci/view/cbi/fvalue.htm
index 6cf9a8d87..cce116af3 100644
--- a/src/ffluci/view/cbi/fvalue.htm
+++ b/src/ffluci/view/cbi/fvalue.htm
@@ -1,10 +1,11 @@
- <div class="cbi-value">
- <div class="left">
- <div class="cbi-value-title"><%=self.title%></div>
- <div class="cbi-value-description"><%=self.description%></div>
- </div>
+ <div class="cbi-value" id="cbi-<%=self.config.."-"..section.."-"..self.option%>">
+ <div class="cbi-value-title left"><%=self.title%></div>
<div class="cbi-value-field">
- <input type="checkbox" name="cbid.<%=self.config.."."..section.."."..self.option%>"<% if self:cfgvalue(section) == self.enabled then %> checked="checked"<% end %> value="1" />
+ <input onchange="cbi_d_update(this.id)" type="checkbox" id="cbid.<%=self.config.."."..section.."."..self.option%>" name="cbid.<%=self.config.."."..section.."."..self.option%>"<% if self:cfgvalue(section) == self.enabled then %> checked="checked"<% end %> value="1" />
+ <div class="cbi-value-description inline"><%=self.description%></div>
</div>
- <div class="clear"></div>
- </div> \ No newline at end of file
+ </div>
+ <% if #self.deps > 0 then %><script type="text/javascript">
+ <% for j, d in ipairs(self.deps) do %>cbi_d_add("cbi-<%=self.config.."-"..section.."-"..self.option%>", "cbid.<%=self.config.."."..section.."."..d.field%>", "<%=d.value%>");
+ <% end %>
+ </script><% end %> \ No newline at end of file
diff --git a/src/ffluci/view/cbi/header.htm b/src/ffluci/view/cbi/header.htm
index 2731b6c2f..e926b2091 100644
--- a/src/ffluci/view/cbi/header.htm
+++ b/src/ffluci/view/cbi/header.htm
@@ -1,4 +1,5 @@
<%+header%>
<form method="post" action="<%=os.getenv("REQUEST_URI")%>">
+ <script type="text/javascript" src="<%=media%>/cbi.js"></script>
<input type="hidden" name="cbi.submit" value="1" />
<input type="submit" value="<%:cbi_save Speichern%>" class="hidden" />
diff --git a/src/ffluci/view/cbi/lvalue.htm b/src/ffluci/view/cbi/lvalue.htm
index f2a5ff975..943a18886 100644
--- a/src/ffluci/view/cbi/lvalue.htm
+++ b/src/ffluci/view/cbi/lvalue.htm
@@ -1,9 +1,8 @@
- <div class="cbi-value">
+ <div class="cbi-value" id="cbi-<%=self.config.."-"..section.."-"..self.option%>">
<div class="cbi-value-title left"><%=self.title%></div>
- <div class="cbi-value-description right"><%=self.description%></div>
<div class="cbi-value-field">
<% if self.widget == "select" then %>
- <select name="cbid.<%=self.config.."."..section.."."..self.option%>"<% if self.size then %> size="<%=self.size%>"<% end %>>
+ <select onchange="cbi_d_update(this.id)" id="cbid.<%=self.config.."."..section.."."..self.option%>" name="cbid.<%=self.config.."."..section.."."..self.option%>"<% if self.size then %> size="<%=self.size%>"<% end %>>
<%for i, key in pairs(self.keylist) do%>
<option<% if self:cfgvalue(section) == key then %> selected="selected"<% end %> value="<%=key%>"><%=self.vallist[i]%></option>
<% end %>
@@ -16,6 +15,10 @@
<% if c == self.size then c = 0 %><br />
<% end end %>
<% end %>
+ <div class="cbi-value-description inline"><%=self.description%></div>
</div>
- <div class="clear"></div>
- </div> \ No newline at end of file
+ </div>
+ <% if #self.deps > 0 then %><script type="text/javascript">
+ <% for j, d in ipairs(self.deps) do %>cbi_d_add("cbi-<%=self.config.."-"..section.."-"..self.option%>", "cbid.<%=self.config.."."..section.."."..d.field%>", "<%=d.value%>");
+ <% end %>
+ </script><% end %> \ No newline at end of file
diff --git a/src/ffluci/view/cbi/mvalue.htm b/src/ffluci/view/cbi/mvalue.htm
index de7bd0c61..7becb4f48 100644
--- a/src/ffluci/view/cbi/mvalue.htm
+++ b/src/ffluci/view/cbi/mvalue.htm
@@ -1,11 +1,8 @@
<%
local v = self:valuelist(section)
%>
- <div class="cbi-value">
- <div class="left">
- <div class="cbi-value-title"><%=self.title%></div>
- <div class="cbi-value-description"><%=self.description%></div>
- </div>
+ <div class="cbi-value" id="cbi-<%=self.config.."-"..section.."-"..self.option%>">
+ <div class="cbi-value-title left"><%=self.title%></div>
<div class="cbi-value-field">
<% if self.widget == "select" then %>
<select multiple="multiple" name="cbid.<%=self.config.."."..section.."."..self.option%>[]"<% if self.size then %> size="<%=self.size%>"<% end %>>
@@ -21,6 +18,10 @@ local v = self:valuelist(section)
<% if c == self.size then c = 0 %><br />
<% end end %>
<% end %>
+ <div class="cbi-value-description inline"><%=self.description%></div>
</div>
- <div class="clear"></div>
- </div> \ No newline at end of file
+ </div>
+ <% if #self.deps > 0 then %><script type="text/javascript">
+ <% for j, d in ipairs(self.deps) do %>cbi_d_add("cbi-<%=self.config.."-"..section.."-"..self.option%>", "cbid.<%=self.config.."."..section.."."..d.field%>", "<%=d.value%>");
+ <% end %>
+ </script><% end %> \ No newline at end of file
diff --git a/src/ffluci/view/cbi/nsection.htm b/src/ffluci/view/cbi/nsection.htm
index 7615104ad..c1f4c8bf3 100644
--- a/src/ffluci/view/cbi/nsection.htm
+++ b/src/ffluci/view/cbi/nsection.htm
@@ -2,27 +2,30 @@
<div class="cbi-section" id="cbi-<%=self.config%>-<%=self.section%>">
<h2><%=self.title%></h2>
<div class="cbi-section-descr"><%=self.description%></div>
+ <% if self.addremove then %><div class="cbi-section-remove">
+ <input type="submit" name="cbi.rns.<%=self.config%>.<%=self.section%>" value="<%:cbi_del Eintrag entfernen%>" />
+ </div><% end %>
<fieldset class="cbi-section-node">
<% self:render_children(self.section) %>
<% if #self.optionals[self.section] > 0 or self.dynamic then %>
<div class="cbi-optionals">
+ <input type="submit" value="<%:cbi_addopt Feld hinzufügen%>" />
<% if self.dynamic then %>
<input type="text" name="cbi.opt.<%=self.config%>.<%=self.section%>" />
<% else %>
<select name="cbi.opt.<%=self.config%>.<%=self.section%>">
<option><%:cbi_selopt *** Zusätzliche Parameter ***%></option>
<% for key, val in pairs(self.optionals[self.section]) do %>
- <option value="<%=val.option%>"><%=val.title%></option>
+ <option id="cbi-<%=self.config.."-"..self.section.."-"..val.option%>" value="<%=val.option%>"><%=val.title%></option>
+ <% if #val.deps > 0 then %><script type="text/javascript">
+ <% for j, d in ipairs(val.deps) do %>cbi_d_add("cbi-<%=self.config.."-"..self.section.."-"..val.option%>", "cbid.<%=self.config.."."..self.section.."."..d.field%>", "<%=d.value%>");
+ <% end %>
+ </script><% end %>
<% end %>
</select>
<% end %>
- <input type="submit" value="<%:cbi_addopt Feld hinzufügen%>" />
</div>
<% end %>
- <br />
- <% if self.addremove then %>
- <input type="submit" name="cbi.rns.<%=self.config%>.<%=self.section%>" value="<%:cbi_del Eintrag entfernen%>" />
- <% end %>
</fieldset>
</div>
<% elseif self.addremove then %>
diff --git a/src/ffluci/view/cbi/tsection.htm b/src/ffluci/view/cbi/tsection.htm
index 920509531..15272f05f 100644
--- a/src/ffluci/view/cbi/tsection.htm
+++ b/src/ffluci/view/cbi/tsection.htm
@@ -2,8 +2,11 @@
<h2><%=self.title%></h2>
<div class="cbi-section-descr"><%=self.description%></div>
<% for k, v in pairs(self:cfgsections()) do%>
- <fieldset class="cbi-section-node" id="cbi-<%=self.config%>-<%=k%>">
+ <% if self.addremove then %><div class="cbi-section-remove right">
+ <input type="submit" name="cbi.rts.<%=self.config%>.<%=k%>" value="<%:cbi_del Eintrag entfernen%>" />
+ </div><% end %>
<% if not self.anonymous then %><h3><%=k%></h3><% end %>
+ <fieldset class="cbi-section-node" id="cbi-<%=self.config%>-<%=k%>">
<% self:render_children(k) %>
<% if #self.optionals[k] > 0 or self.dynamic then %>
<div class="cbi-optionals">
@@ -11,19 +14,19 @@
<input type="text" name="cbi.opt.<%=self.config%>.<%=k%>" />
<% else %>
<select name="cbi.opt.<%=self.config%>.<%=k%>">
- <option><%:cbi_selopt *** Zusätzliche Parameter ***%></option>
+ <option><%:cbi_addopt -- Feld --%></option>
<% for key, val in pairs(self.optionals[k]) do %>
- <option value="<%=val.option%>"><%=val.title%></option>
+ <option id="cbi-<%=self.config.."-"..k.."-"..val.option%>" value="<%=val.option%>"><%=val.title%></option>
+ <% if #val.deps > 0 then %><script type="text/javascript">
+ <% for j, d in ipairs(val.deps) do %>cbi_d_add("cbi-<%=self.config.."-"..k.."-"..val.option%>", "cbid.<%=self.config.."."..k.."."..d.field%>", "<%=d.value%>");
+ <% end %>
+ </script><% end %>
<% end %>
</select>
<% end %>
- <input type="submit" value="<%:cbi_addopt Feld hinzufügen%>" />
+ <input type="submit" value="<%:add hinzufügen%>" />
</div>
<% end %>
- <br />
- <% if self.addremove then %>
- <input type="submit" name="cbi.rts.<%=self.config%>.<%=k%>" value="<%:cbi_del Eintrag entfernen%>" />
- <% end %>
</fieldset>
<br />
<% end %>
diff --git a/src/ffluci/view/cbi/value.htm b/src/ffluci/view/cbi/value.htm
index ae4cd0eb5..d027bb448 100644
--- a/src/ffluci/view/cbi/value.htm
+++ b/src/ffluci/view/cbi/value.htm
@@ -1,9 +1,12 @@
- <div class="cbi-value">
+ <div class="cbi-value clear" id="cbi-<%=self.config.."-"..section.."-"..self.option%>">
<div class="cbi-value-title left"><%=self.title%></div>
- <div class="cbi-value-description right"><%=self.description%></div>
<div class="cbi-value-field">
- <input type="text" <% if self.size then %>size="<%=self.size%>" <% end %><% if self.maxlength then %>maxlength="<%=self.maxlength%>" <% end %>name="cbid.<%=self.config.."."..section.."."..self.option%>" value="<%=(self:cfgvalue(section) or "")%>" />
+ <input type="text" onchange="cbi_d_update(this.id)" <% if self.size then %>size="<%=self.size%>" <% end %><% if self.maxlength then %>maxlength="<%=self.maxlength%>" <% end %>name="cbid.<%=self.config.."."..section.."."..self.option%>" value="<%=(self:cfgvalue(section) or "")%>" />
+ <div class="cbi-value-description inline"><%=self.description%></div>
</div>
- <div class="clear"></div>
<% if self.tag_invalid[section] then %><div class="cbi-error"><%:cbi_invalid Fehler: Ungültige Eingabe%></div><% end %>
- </div> \ No newline at end of file
+ </div>
+ <% if #self.deps > 0 then %><script type="text/javascript">
+ <% for j, d in ipairs(self.deps) do %>cbi_d_add("cbi-<%=self.config.."-"..section.."-"..self.option%>", "cbid.<%=self.config.."."..section.."."..d.field%>", "<%=d.value%>");
+ <% end %>
+ </script><% end %>