libs/cbi: Added value function to luci.cbi.Value to create Comboboxes
This commit is contained in:
parent
513e1cbba9
commit
084db952ce
5 changed files with 101 additions and 11 deletions
|
@ -4,3 +4,5 @@ cbi_invalid = "Error: Invalid input value"
|
||||||
cbi_addopt = "-- Additional Field --"
|
cbi_addopt = "-- Additional Field --"
|
||||||
cbi_optional = " (optional)"
|
cbi_optional = " (optional)"
|
||||||
cbi_sectempty = "This section contains no values yet"
|
cbi_sectempty = "This section contains no values yet"
|
||||||
|
cbi_manual = "-- manual --"
|
||||||
|
cbi_select = "-- Please choose --"
|
||||||
|
|
|
@ -3,3 +3,5 @@ cbi_del = "Eintrag entfernen"
|
||||||
cbi_invalid = "Error: Ungültige Eingabe"
|
cbi_invalid = "Error: Ungültige Eingabe"
|
||||||
cbi_addopt = "-- Zusätzliches Feld --"
|
cbi_addopt = "-- Zusätzliches Feld --"
|
||||||
cbi_sectempty = "Diese Sektion enthält noch keine Einträge"
|
cbi_sectempty = "Diese Sektion enthält noch keine Einträge"
|
||||||
|
cbi_manual = "-- manuell --"
|
||||||
|
cbi_select = "-- Bitte auswählen --"
|
|
@ -36,3 +36,76 @@ function cbi_d_init() {
|
||||||
cbi_d_update(x);
|
cbi_d_update(x);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function cbi_bind(obj, type, callback, mode) {
|
||||||
|
if (typeof mode == "undefined") {
|
||||||
|
mode = false;
|
||||||
|
}
|
||||||
|
if (!obj.addEventListener) {
|
||||||
|
ieCallback = function(){
|
||||||
|
var e = window.event;
|
||||||
|
if (!e.target && e.srcElement) {
|
||||||
|
e.target = e.srcElement;
|
||||||
|
};
|
||||||
|
e.target['_eCB' + type + callback] = callback;
|
||||||
|
e.target['_eCB' + type + callback](e);
|
||||||
|
e.target['_eCB' + type + callback] = null;
|
||||||
|
};
|
||||||
|
obj.attachEvent('on' + type, ieCallback);
|
||||||
|
} else {
|
||||||
|
obj.addEventListener(type, callback, mode);
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
function cbi_combobox(id, values, def, man) {
|
||||||
|
var obj = document.getElementById(id)
|
||||||
|
if (obj.value == "" || values[obj.value]) {
|
||||||
|
var sel = document.createElement("select")
|
||||||
|
obj.parentNode.appendChild(sel)
|
||||||
|
|
||||||
|
if (obj.value == "") {
|
||||||
|
var optdef = document.createElement("option")
|
||||||
|
optdef.value = ""
|
||||||
|
optdef.appendChild(document.createTextNode(def))
|
||||||
|
sel.appendChild(optdef)
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i in values) {
|
||||||
|
var opt = document.createElement("option")
|
||||||
|
opt.value = i
|
||||||
|
|
||||||
|
if (obj.value == i) {
|
||||||
|
opt.selected = "selected"
|
||||||
|
}
|
||||||
|
|
||||||
|
opt.appendChild(document.createTextNode(values[i]))
|
||||||
|
sel.appendChild(opt)
|
||||||
|
}
|
||||||
|
|
||||||
|
var optman = document.createElement("option")
|
||||||
|
optman.value = ""
|
||||||
|
optman.appendChild(document.createTextNode(man))
|
||||||
|
sel.appendChild(optman)
|
||||||
|
|
||||||
|
obj.style.display = "none"
|
||||||
|
|
||||||
|
cbi_bind(sel, "change", function() {
|
||||||
|
obj.value = sel.options[sel.selectedIndex].value
|
||||||
|
|
||||||
|
if (sel.selectedIndex == sel.options.length - 1) {
|
||||||
|
obj.style.display = "inline"
|
||||||
|
sel.parentNode.removeChild(sel)
|
||||||
|
obj.focus()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function cbi_combobox_init(id, values, def, man) {
|
||||||
|
var obj = document.getElementById(id)
|
||||||
|
cbi_bind(obj, "change", function() {
|
||||||
|
cbi_combobox(id, values, def, man)
|
||||||
|
})
|
||||||
|
cbi_combobox(id, values, def, man)
|
||||||
|
}
|
|
@ -595,7 +595,10 @@ function AbstractValue.render(self, s, scope)
|
||||||
if cond then
|
if cond then
|
||||||
return string.format(
|
return string.format(
|
||||||
' %s="%s"', tostring(key),
|
' %s="%s"', tostring(key),
|
||||||
tostring( val or scope[key] or self[key] or "" )
|
tostring( val
|
||||||
|
or scope[key]
|
||||||
|
or (type(self[key]) ~= "function" and self[key])
|
||||||
|
or "" )
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
return ''
|
return ''
|
||||||
|
@ -642,17 +645,14 @@ Value = class(AbstractValue)
|
||||||
function Value.__init__(self, ...)
|
function Value.__init__(self, ...)
|
||||||
AbstractValue.__init__(self, ...)
|
AbstractValue.__init__(self, ...)
|
||||||
self.template = "cbi/value"
|
self.template = "cbi/value"
|
||||||
|
self.keylist = {}
|
||||||
self.maxlength = nil
|
self.vallist = {}
|
||||||
end
|
end
|
||||||
|
|
||||||
-- This validation is a bit more complex
|
function Value.value(self, key, val)
|
||||||
function Value.validate(self, val)
|
val = val or key
|
||||||
if self.maxlength and tostring(val):len() > self.maxlength then
|
table.insert(self.keylist, tostring(key))
|
||||||
val = nil
|
table.insert(self.vallist, tostring(val))
|
||||||
end
|
|
||||||
|
|
||||||
return val
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,4 +14,17 @@ $Id$
|
||||||
-%>
|
-%>
|
||||||
<%+cbi/valueheader%>
|
<%+cbi/valueheader%>
|
||||||
<input type="text" onchange="cbi_d_update(this.id)"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self:cfgvalue(section)) .. ifattr(self.size, "size") .. ifattr(self.maxlength, "maxlength") %> />
|
<input type="text" onchange="cbi_d_update(this.id)"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self:cfgvalue(section)) .. ifattr(self.size, "size") .. ifattr(self.maxlength, "maxlength") %> />
|
||||||
|
<% if #self.keylist > 0 then -%>
|
||||||
|
<script type="text/javascript">
|
||||||
|
cbi_combobox_init('<%=cbid%>', {
|
||||||
|
<%-
|
||||||
|
for i, k in ipairs(self.keylist) do
|
||||||
|
-%>
|
||||||
|
<%-=string.format("%q", k) .. ":" .. string.format("%q", self.vallist[i])-%>,
|
||||||
|
<%-
|
||||||
|
end
|
||||||
|
-%>
|
||||||
|
}, '<%:cbi_select%>', '<%:cbi_manual%>');
|
||||||
|
</script>
|
||||||
|
<% end -%>
|
||||||
<%+cbi/valuefooter%>
|
<%+cbi/valuefooter%>
|
||||||
|
|
Loading…
Reference in a new issue