* 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 bc765c9..2e986d8 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -20,18 +20,11 @@ all: compile
 dist-compile: compile dist
 dist-source: source dist
 
 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
 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)
 
 compile:
        mkdir -p $(DIRECTORIES)
index ecd72f6..c887b1b 100644 (file)
@@ -4,13 +4,13 @@ config core main
         
 
 config public contact
         
 
 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
 
 
 config event uci_oncommit
index b0131dc..55d6f76 100644 (file)
@@ -179,27 +179,31 @@ code {
        margin-top: 1em;
 }
 
        margin-top: 1em;
 }
 
-.cbi-section-create {
-       margin-bottom: 3em;
+.cbi-section-remove {
+       text-align: right;
 }
 
 .cbi-value-title {
        line-height: 1.75em;
 }
 
 .cbi-value-title {
        line-height: 1.75em;
+       width: 15em;
+       font-weight: bold;
 }
 
 .cbi-value-field {
 }
 
 .cbi-value-field {
-       margin-left: 10em;
-       text-align: center;
+       text-align: left;
        line-height: 1.75em;
 }
 
        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; 
        font-size: 0.8em;
 }
 
 .cbi-value-description {
        font-style: italic;
        font-size: 0.8em; 
+       margin-bottom: 0.5em;
 }
 
 .cbi-form-separator {
 }
 
 .cbi-form-separator {
@@ -211,6 +215,7 @@ code {
        background: #f7f7f7;
        border: 1px solid #d7d7d7;
        overflow: auto;
        background: #f7f7f7;
        border: 1px solid #d7d7d7;
        overflow: auto;
+       margn-bottom: 0%;
 }
 
 .cbi-section-node h3 {
 }
 
 .cbi-section-node h3 {
@@ -220,10 +225,12 @@ code {
 .cbi-error {
        color: red;
        font-weight: bold;
 .cbi-error {
        color: red;
        font-weight: bold;
+       font-size: 0.8em;
+       margin-bottom: 0.75em;
 }
 
 .cbi-optionals {
 }
 
 .cbi-optionals {
-       margin-top: 2em;
+       margin-top: 1em;
 }
 
 .cbi-optionals option {
 }
 
 .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 677c865..f57a5da 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)/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
        $(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 22a4019..844f6c0 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
        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)
                                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
 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"
 ]]--
 TypedSection = class(AbstractSection)
 
 function TypedSection.__init__(self, ...)
        AbstractSection.__init__(self, ...)
        self.template  = "cbi/tsection"
+       self.deps = {}
+       self.excludes = {}
        
        self.anonymous   = false
        
        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)
 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
 
        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
 function TypedSection.parse(self)
        if self.addremove then
                -- Create
@@ -368,10 +389,17 @@ function TypedSection.parse(self)
                        end
                else            
                        if name then
                        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 not name then
                                        self.err_invalid = true
                                end             
+                               
                                if name and name:len() > 0 then
                                        self:create(name)
                                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
                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
                                        self:remove(k)
                                end
                        end
@@ -404,20 +432,37 @@ function TypedSection.render_children(self, section)
        end
 end
 
        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
                        end
                end
+               
+               if not stat then
+                       return nil
+               end
        end
        end
-       return sections 
+       
+       return self:validate(section)
 end
 
 
 end
 
 
+-- Dummy validate function
+function TypedSection.validate(self, section)
+       return section
+end
+
 
 --[[
 AbstractValue - An abstract Value Type
 
 --[[
 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.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
 
        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
 -- 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)
 
 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
                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)
        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
                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
 
        end
 end
 
@@ -488,8 +538,8 @@ function AbstractValue.cfgvalue(self, section)
 end
 
 -- Validate the form value
 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
 end
 
 -- Write to UCI
@@ -529,7 +579,7 @@ function Value.validate(self, val)
                val = nil
        end
        
                val = nil
        end
        
-       return ffluci.util.validate(val, self.valid, self.isnumber, self.isinteger)
+       return ffluci.util.validate(val, self.isnumber, self.isinteger)
 end
 
 
 end
 
 
@@ -585,7 +635,7 @@ function ListValue.__init__(self, ...)
        self.widget = "select"
 end
 
        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)) 
        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
 
        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)) 
        val = val or key
        table.insert(self.keylist, tostring(key))
        table.insert(self.vallist, tostring(val)) 
index f76dce5..2774dfd 100644 (file)
@@ -5,6 +5,7 @@ menu = {
        order   = 20,
        entries = {
                {action = "vlan", descr = "VLAN"},
        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
        }
 }
\ No newline at end of file
index db70eb6..a1eb0d7 100644 (file)
@@ -10,7 +10,7 @@ function action_apply()
                
                -- Collect files to be applied
                for i, line in ipairs(ffluci.util.split(changes)) do
                
                -- 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
                        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
                
                -- 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
                        if r then
                                revert[r] = true
                        end
index f1d8086..62e7246 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
 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 = 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
 
 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 6a01152..3186f2d 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")
 
 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
 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
 end
 
 return m
\ No newline at end of file
index 75d34c5..6585c66 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
 
 
 Any return value of false or nil can be interpreted as an error
 
+
+ToDo: Reimplement in Lua
+
 FileId:
 $Id$
 
 FileId:
 $Id$
 
index f2180e7..85092f0 100644 (file)
@@ -203,7 +203,7 @@ end
 
 
 -- Validates a variable
 
 
 -- 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
        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
        
                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
 
        return value
 end
 
index d6e4967..0629bd6 100644 (file)
@@ -1,4 +1,5 @@
                        <input type="submit" value="<%:save Speichern%>" />
                        <input type="reset" value="<%:reset Zurücksetzen%>" />
                        <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
                </form>
 <%+footer%>
\ No newline at end of file
index 6cf9a8d..cce116a 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">
                                                        <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>
-                                                       <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 2731b6c..e926b20 100644 (file)
@@ -1,4 +1,5 @@
 <%+header%>
                <form method="post" action="<%=os.getenv("REQUEST_URI")%>">
 <%+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" />
                        <input type="hidden" name="cbi.submit" value="1" />
                        <input type="submit" value="<%:cbi_save Speichern%>" class="hidden" />
index f2a5ff9..943a188 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-title left"><%=self.title%></div>
-                                                       <div class="cbi-value-description right"><%=self.description%></div>
                                                        <div class="cbi-value-field">
 <% if self.widget == "select" then %>
                                                        <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 %>
 <%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 %>
 <% if c == self.size then c = 0 %><br />
 <% end end %>
 <% end %>
+                                                               <div class="cbi-value-description inline"><%=self.description%></div>
                                                        </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 de7bd0c..7becb4f 100644 (file)
@@ -1,11 +1,8 @@
 <%
 local v = self:valuelist(section)      
 %>
 <%
 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 %>>
                                                        <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 %>
 <% if c == self.size then c = 0 %><br />
 <% end end %>
 <% end %>
+                                                               <div class="cbi-value-description inline"><%=self.description%></div>
                                                        </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 7615104..c1f4c8b 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>
                                <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">
                                        <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 %>
                                                <% 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 %>
                                                        <% end %>
                                                        </select>
                                                <% end %>
-                                                       <input type="submit" value="<%:cbi_addopt Feld hinzufügen%>" />
                                                </div>
                                        <% end %>
                                                </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 %>
                                        </fieldset>
                                </div>
 <% elseif self.addremove then %>
index 9205095..15272f0 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%>
                                        <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 %>
                                                <% 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">
 <% 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%>">
                                                                <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 %>
                                                                <% 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 %>
                                                                <% end %>
                                                                </select>
                                                        <% end %>
-                                                               <input type="submit" value="<%:cbi_addopt Feld hinzufügen%>" />
+                                                               <input type="submit" value="<%:add hinzufügen%>" />
                                                        </div>
                                                <% end %>
                                                        </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 %>
                                        </fieldset>
                                        <br />
 <% end %>
index ae4cd0e..d027bb4 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-title left"><%=self.title%></div>
-                                                       <div class="cbi-value-description right"><%=self.description%></div>
                                                        <div class="cbi-value-field">
                                                        <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>
-                                                       <div class="clear"></div>
                                                        <% if self.tag_invalid[section] then %><div class="cbi-error"><%:cbi_invalid Fehler: Ungültige Eingabe%></div><% end %>
                                                        <% 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 %>