Module: check_mk
Branch: master
Commit: a66cf554b862e9afc8b89db968ccff23e12d0179
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=a66cf554b862e9…
Author: Mathias Kettner <mk(a)mathias-kettner.de>
Date: Sun Mar 17 22:56:27 2013 +0100
ValueSpec TextAreaUnicode support keyboard codes
---
web/htdocs/forms.py | 14 +++++++++---
web/htdocs/js/search.js | 2 +-
web/htdocs/valuespec.py | 48 +++++++++++++++++++++++++++++++++++++++++++++++
web/htdocs/wato.py | 27 ++++++++++++++-----------
4 files changed, 74 insertions(+), 17 deletions(-)
diff --git a/web/htdocs/forms.py b/web/htdocs/forms.py
index 1cee46a..ffe451d 100644
--- a/web/htdocs/forms.py
+++ b/web/htdocs/forms.py
@@ -41,7 +41,9 @@ def get_input(valuespec, varprefix):
return value
-def edit_dictionary(entries, value, focus=None, hover_help=True, validate=None,
buttontext = None, title = None):
+def edit_dictionary(entries, value, focus=None, hover_help=True,
+ validate=None, buttontext=None, title=None,
+ buttons = None):
new_value = value.copy()
if html.var("filled_in") == "form" and html.check_transaction():
messages = []
@@ -82,9 +84,13 @@ def edit_dictionary(entries, value, focus=None, hover_help=True,
validate=None,
first = False
end()
- if buttontext == None:
- buttontext = _("Save")
- html.button("save", buttontext)
+ if buttons:
+ for name, title, icon in buttons:
+ html.button(name, title)
+ else:
+ if buttontext == None:
+ buttontext = _("Save")
+ html.button("save", buttontext)
html.hidden_fields()
html.end_form()
diff --git a/web/htdocs/js/search.js b/web/htdocs/js/search.js
index 06f1273..741e250 100644
--- a/web/htdocs/js/search.js
+++ b/web/htdocs/js/search.js
@@ -37,7 +37,7 @@ function mkSearchAddField(field, targetFrame) {
}
oField.onkeydown = function(e) { if (!e) e = window.event; return
mkSearchKeyDown(e, oField); }
- oField.onkeyup = function(e) { if (!e) e = window.event; return
mkSearchKeyUp(e, oField);}
+ oField.onkeyup = function(e) { if (!e) e = window.event; return
mkSearchKeyUp(e, oField); }
oField.onclick = function(e) { mkSearchClose(); return true; }
// On doubleclick toggle the list
diff --git a/web/htdocs/valuespec.py b/web/htdocs/valuespec.py
index a114846..cd2cc11 100644
--- a/web/htdocs/valuespec.py
+++ b/web/htdocs/valuespec.py
@@ -502,12 +502,19 @@ class HTTPUrl(TextAscii):
(self._target and 'target="%s" ' % self._target or
""),
url, text)
+RETURN = 13
+SHIFT = 16
+CTRL = 17
+ALT = 18
+BACKSPACE = 8
class TextAreaUnicode(TextUnicode):
def __init__(self, **kwargs):
TextUnicode.__init__(self, **kwargs)
self._cols = kwargs.get("cols", 60)
self._rows = kwargs.get("rows", 20) # Allowed: "auto" ->
Auto resizing
+ self._minrows = kwargs.get("minrows", 0) # Minimum number of initial
rows when "auto"
+ self._submit_keys = kwargs.get("submit_keys", [])
def value_to_text(self, value):
return "<pre class=ve_textarea>%s</pre>" % value
@@ -521,11 +528,52 @@ class TextAreaUnicode(TextUnicode):
rows = len(html.var(varprefix).splitlines())
else:
rows = len(value.splitlines())
+ rows = max(rows, self._minrows)
else:
attrs = {}
rows = self._rows
+ if self._submit_keys:
+ attrs['id'] = "textarea_%s" % varprefix
+ commit_code = ""
+ for keylist, code in self._submit_keys:
+ commit_code += " textarea_%s_trysubmit(e, %r, %s);\n" % (
+ varprefix, keylist, repr(code))
+
+ html.final_javascript("""
+textarea_text_keys = [];
+function textarea_%s_keydown(e) {
+ if (!e) e = window.event;
+ var keyCode = e.which || e.keyCode;
+ textarea_%s_keys.push(keyCode);
+%s}
+function textarea_%s_keyup(e) {
+ if (!e) e = window.event;
+ var keyCode = e.which || e.keyCode;
+ for (var i in textarea_%s_keys) {
+ if (textarea_%s_keys[i] == keyCode) {
+ textarea_%s_keys.splice(i, 1);
+ break;
+ }
+ }
+}
+function textarea_%s_trysubmit(e, keylist, code) {
+ for (var i in keylist) {
+ if (textarea_%s_keys.indexOf(keylist[i]) < 0) {
+ return;
+ }
+ }
+ if (e.stopPropagation)
+ e.stopPropagation();
+ e.cancelBubble = true;
+ eval(code);
+}
+var t = document.getElementById("textarea_%s");
+t.onkeydown = function(e) { return textarea_%s_keydown(e); }
+t.onkeyup = function(e) { return textarea_%s_keyup(e); }
+""" % ((varprefix, varprefix, commit_code) + (varprefix,)*9))
html.text_area(varprefix, value, rows=rows, cols=self._cols, attrs = attrs)
+
# Overridded because we do not want to strip() here and remove '\r'
def from_html_vars(self, varprefix):
return html.var_utf8(varprefix, "").replace('\r', '')
diff --git a/web/htdocs/wato.py b/web/htdocs/wato.py
index 8dd325a..d819da5 100644
--- a/web/htdocs/wato.py
+++ b/web/htdocs/wato.py
@@ -8329,22 +8329,25 @@ def filter_hidden_users(users):
return users
-# Dropdown for choosing a multisite user
-class UserSelection(ElementSelection):
- def __init__(self, **kwargs):
- ElementSelection.__init__(self, **kwargs)
- self._none = kwargs.get("none")
-
- def get_elements(self):
+def generate_wato_users_elements_function(none_value):
+ def get_wato_users(nv):
users = filter_hidden_users(userdb.load_users())
- elements = dict([ (name, "%s - %s" % (name, us.get("alias",
name))) for (name, us) in users.items() ])
- if self._none:
- elements[None] = self._none
+ elements = [ (name, "%s - %s" % (name, us.get("alias",
name))) for (name, us) in users.items() ]
+ if nv != None:
+ elements = [ (None, none_value) ] + elements
return elements
+ return lambda: get_wato_users(none_value)
+
+# Dropdown for choosing a multisite user
+class UserSelection(DropdownChoice):
+ def __init__(self, **kwargs):
+ kwargs["choices"] =
generate_wato_users_elements_function(kwargs.get("none"))
+ DropdownChoice.__init__(self, **kwargs)
def value_to_text(self, value):
- self.load_elements()
- return self._elements.get(value, value).split(" - ")[-1]
+ text = DropdownChoice.value_to_text(self, value)
+ return text.split(" - ")[-1]
+
#.
# .-Roles----------------------------------------------------------------.