summaryrefslogtreecommitdiffhomepage
path: root/libs/cbi
diff options
context:
space:
mode:
Diffstat (limited to 'libs/cbi')
-rw-r--r--libs/cbi/htdocs/luci-static/resources/cbi.js73
-rw-r--r--libs/cbi/luasrc/cbi.lua20
-rw-r--r--libs/cbi/luasrc/view/cbi/value.htm13
3 files changed, 96 insertions, 10 deletions
diff --git a/libs/cbi/htdocs/luci-static/resources/cbi.js b/libs/cbi/htdocs/luci-static/resources/cbi.js
index 3abc3a9f52..38e27d8f43 100644
--- a/libs/cbi/htdocs/luci-static/resources/cbi.js
+++ b/libs/cbi/htdocs/luci-static/resources/cbi.js
@@ -35,4 +35,77 @@ function cbi_d_init() {
for (var x in cbi_d) {
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)
} \ No newline at end of file
diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua
index fe99f0246b..8c8f68b24a 100644
--- a/libs/cbi/luasrc/cbi.lua
+++ b/libs/cbi/luasrc/cbi.lua
@@ -595,7 +595,10 @@ function AbstractValue.render(self, s, scope)
if cond then
return string.format(
' %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
return ''
@@ -642,17 +645,14 @@ Value = class(AbstractValue)
function Value.__init__(self, ...)
AbstractValue.__init__(self, ...)
self.template = "cbi/value"
-
- self.maxlength = nil
+ self.keylist = {}
+ self.vallist = {}
end
--- This validation is a bit more complex
-function Value.validate(self, val)
- if self.maxlength and tostring(val):len() > self.maxlength then
- val = nil
- end
-
- return val
+function Value.value(self, key, val)
+ val = val or key
+ table.insert(self.keylist, tostring(key))
+ table.insert(self.vallist, tostring(val))
end
diff --git a/libs/cbi/luasrc/view/cbi/value.htm b/libs/cbi/luasrc/view/cbi/value.htm
index 5a7339d835..4d473bf5e6 100644
--- a/libs/cbi/luasrc/view/cbi/value.htm
+++ b/libs/cbi/luasrc/view/cbi/value.htm
@@ -14,4 +14,17 @@ $Id$
-%>
<%+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") %> />
+ <% 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%>