* Major CBI improvements
authorSteven Barth <steven@midlink.org>
Thu, 27 Mar 2008 23:14:01 +0000 (23:14 +0000)
committerSteven Barth <steven@midlink.org>
Thu, 27 Mar 2008 23:14:01 +0000 (23:14 +0000)
21 files changed:
Makefile
contrib/ffluci.uci
contrib/media/cascade.css
contrib/media/cbi.js [new file with mode: 0644]
contrib/package/ffluci/Makefile
src/ffluci/cbi.lua
src/ffluci/controller/admin/network.lua
src/ffluci/controller/admin/uci.lua
src/ffluci/model/cbi/admin_network/ifaces.lua
src/ffluci/model/cbi/admin_network/ptp.lua [new file with mode: 0644]
src/ffluci/model/cbi/admin_network/vlan.lua
src/ffluci/model/uci.lua
src/ffluci/util.lua
src/ffluci/view/cbi/footer.htm
src/ffluci/view/cbi/fvalue.htm
src/ffluci/view/cbi/header.htm
src/ffluci/view/cbi/lvalue.htm
src/ffluci/view/cbi/mvalue.htm
src/ffluci/view/cbi/nsection.htm
src/ffluci/view/cbi/tsection.htm
src/ffluci/view/cbi/value.htm

index bc765c96829593a53c8b792e9c7cd3630ed383f8..2e986d8cbc5508d2ce5e71c782931401d30b7444 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -20,18 +20,11 @@ all: compile
 dist-compile: compile dist
 dist-source: source dist
 
-examples-compile: compile examples
-examples-source: source examples
-
-
 dist:
        cp src/ffluci/controller/* dist/ffluci/controller/ -R
        cp src/ffluci/i18n/* dist/ffluci/i18n/
        cp src/ffluci/view/* dist/ffluci/view/ -R
        cp src/ffluci/model/cbi/* dist/ffluci/model/cbi/ -R
-       
-examples:
-       cp examples/* dist/ -R
 
 compile:
        mkdir -p $(DIRECTORIES)
index ecd72f6ed3fdc75862df1c361a09778a15eba66c..c887b1b33ed38bd0da87c5c6df0fead5c8a1bde9 100644 (file)
@@ -4,13 +4,13 @@ config core main
         
 
 config public contact
-               option nickname -
-               option name             -
-               option mail             -
-               option phone    -
-               option location -
-               option geo              -
-               option note             -
+               option nickname
+               option name
+               option mail
+               option phone
+               option location
+               option geo
+               option note
 
 
 config event uci_oncommit
index b0131dc581d6d5b9abf40b37e6bff10f0c143a85..55d6f76bd11e49d8e2a7290705fd203b2c067602 100644 (file)
@@ -179,27 +179,31 @@ code {
        margin-top: 1em;
 }
 
-.cbi-section-create {
-       margin-bottom: 3em;
+.cbi-section-remove {
+       text-align: right;
 }
 
 .cbi-value-title {
        line-height: 1.75em;
+       width: 15em;
+       font-weight: bold;
 }
 
 .cbi-value-field {
-       margin-left: 10em;
-       text-align: center;
+       text-align: left;
        line-height: 1.75em;
 }
 
-.cbi-value-field input, .cbi-value-field select, .cbi-optionals select, .cbi-optionals input  {
+.cbi-value-field input, .cbi-value-field select,
+.cbi-optionals select, .cbi-optionals input,
+.cbi-section-remove input, .cbi-section-create input  {
        font-size: 0.8em;
 }
 
 .cbi-value-description {
        font-style: italic;
        font-size: 0.8em; 
+       margin-bottom: 0.5em;
 }
 
 .cbi-form-separator {
@@ -211,6 +215,7 @@ code {
        background: #f7f7f7;
        border: 1px solid #d7d7d7;
        overflow: auto;
+       margn-bottom: 0%;
 }
 
 .cbi-section-node h3 {
@@ -220,10 +225,12 @@ code {
 .cbi-error {
        color: red;
        font-weight: bold;
+       font-size: 0.8em;
+       margin-bottom: 0.75em;
 }
 
 .cbi-optionals {
-       margin-top: 2em;
+       margin-top: 1em;
 }
 
 .cbi-optionals option {
diff --git a/contrib/media/cbi.js b/contrib/media/cbi.js
new file mode 100644 (file)
index 0000000..f9e463b
--- /dev/null
@@ -0,0 +1,36 @@
+var cbi_d = {};
+
+function cbi_d_add(field, target, value) {
+       if (!cbi_d[target]) {
+               cbi_d[target] = {};
+       }
+       if (!cbi_d[target][value]) {
+               cbi_d[target][value] = [];
+       }
+       cbi_d[target][value].push(field);
+}
+
+function cbi_d_update(target) {
+       if (!cbi_d[target]) {
+               return;
+       }
+       
+       for (var x in cbi_d[target]) {
+               for (var i=0; i<cbi_d[target][x].length; i++) {                 
+                       document.getElementById(cbi_d[target][x][i]).style.display = "none";
+               }
+       }
+       
+       var t = document.getElementById(target);
+       if (t && t.value && cbi_d[target][t.value]) {
+               for (var i=0; i<cbi_d[target][t.value].length; i++) {                   
+                       document.getElementById(cbi_d[target][t.value][i]).style.display = "block";
+               }
+       }
+}
+
+function cbi_d_init() {
+       for (var x in cbi_d) {
+               cbi_d_update(x);
+       }
+}
\ No newline at end of file
index 677c865ce1eac67eb3394dfc3c5157eadea70584..f57a5da792f94add8790237bf9fae71484a07da4 100644 (file)
@@ -35,6 +35,7 @@ define Package/ffluci/install
        $(INSTALL_DIR) $(1)/usr/lib/lua
        $(INSTALL_DIR) $(1)/www/cgi-bin
        $(INSTALL_DIR) $(1)/www/ffluci
+       $(INSTALL_DIR) $(1)/etc/config
        $(CP) $(PKG_BUILD_DIR)/dist/* $(1)/usr/lib/lua/ -R
        $(CP) $(PKG_BUILD_DIR)/contrib/media $(1)/www/ffluci/ -R
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/contrib/ffluci $(1)/www/cgi-bin
index 22a4019e40ba7345e300ce8690755623185a20d3..844f6c0bb333430cdd037c4508cf50c8bbc768a5 100644 (file)
@@ -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)) 
index f76dce55556c7c6bde766f98f65d47b8e75aa3a2..2774dfdb02276d5894ebac2d3202b5bf02b16c86 100644 (file)
@@ -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
index db70eb6a63ea8781b5628373b7d479c9494e0055..a1eb0d7d72c6c5fd5d1c9562bb22f40fd40a246e 100644 (file)
@@ -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
index f1d808635964290c35887956d891a2ee25fa6c8f..62e72462f877b6f8863c1f113955902c4ec5a860 100644 (file)
@@ -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 (file)
index 0000000..78fcf94
--- /dev/null
@@ -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
index 6a01152109bf8a9f555da64139436a386142f9ad..3186f2d9bb44024c3d48c683d004b8fe7b5c1dba 100644 (file)
@@ -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
index 75d34c5d6d4a8c8a8ebad7eb3e5a3114d9d525a6..6585c66cb4487034685b2bcac23a10c601c339e7 100644 (file)
@@ -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$
 
index f2180e7c00fe42712dde3b5e7c9bea5a121bdb93..85092f065ce75e46fa5b855ec15d4c3b79946afc 100644 (file)
@@ -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
 
index d6e49678ebacc58a6e4906a218a5db5d22a24aa0..0629bd6d6009905e1d407d33191b39e64bdfcb2f 100644 (file)
@@ -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
index 6cf9a8d87c39e0e281ba14f06eb187789492f481..cce116af333dc33dc6f9d8a18830e8a8f8a6456e 100644 (file)
@@ -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
index 2731b6c2f58d56c80fd523625c50fd5e84287d20..e926b209162c7ff5ae2ea69018049060ef5ac36e 100644 (file)
@@ -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" />
index f2a5ff975089ab4894bdb976aaae91ef0bb75c84..943a18886a7949df13491793a9bb16572a3034e3 100644 (file)
@@ -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 %>
 <% 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
index de7bd0c61defa37f3acb595f445a98ecceddf73c..7becb4f48b155dff858acc9bde8aa29c19b6cb29 100644 (file)
@@ -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
index 7615104ad710c4c69644f80d0c98e4ead043e53f..c1f4c8bf3acba3352ef978e78df654aa74418d2e 100644 (file)
@@ -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 %>
index 92050953137f5099fa7a51cf26ac9e7790e2a487..15272f05f6ed22523b7232c6a50b4f30bcf0d01d 100644 (file)
@@ -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">
                                                                <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 %>
index ae4cd0eb59a91b2db62a593511d2e5598fb04d6f..d027bb448959394b787d77efa8e97103594f5c7c 100644 (file)
@@ -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 %>