Source code for gavo.formal.widgets.textareawithselect
from zope.interface import implementer
from twisted.web.template import tags as T
from .. import iformal
from ..util import render_cssid
[docs]@implementer( iformal.IWidget )
class TextAreaWithSelect(object):
"""
A large text entry area that accepts newline characters.
<textarea>...</textarea>
"""
cols = 48
rows = 6
def __init__(self, original, cols=None, rows=None, values=None):
self.original = original
self.values = values
if cols is not None:
self.cols = cols
if rows is not None:
self.rows = rows
def _renderTag(self, request, key, value, readonly):
html = []
tag=T.textarea(name=key, id=render_cssid(key), cols=self.cols, rows=self.rows)[value or '']
if readonly:
tag(class_='readonly', readonly='readonly')
html.append(tag)
if self.values is None:
return html
def renderOptions(request,options):
for value,label in options:
yield T.option(value=value)[label]
selecttrigger = T.select(name='%s__selecttrigger'%key, data=self.values)[ renderOptions ]
# TODO: figure out where to get the form from
form = iformal.IForm( request )
js = T.xml("var x = document.getElementById('%(form)s');x.%(key)s.value += x.%(key)s__selecttrigger.options[x.%(key)s__selecttrigger.options.selectedIndex].value + "\\n";"%{'key':key,'form':form.name})
aonclick = T.a(onclick=js)[ 'add' ]
html.append(T.div(class_="add")[selecttrigger,aonclick])
return html
[docs] def render(self, request, key, args, errors):
if errors:
value = args.get(key, [''])[0]
else:
value = iformal.IStringConvertible(self.original).fromType(args.get(key))
return self._renderTag(request, key, value, False)
[docs] def renderImmutable(self, request, key, args, errors):
value = iformal.IStringConvertible(self.original).fromType(args.get(key))
return self._renderTag(request, key, value, True)
[docs] def processInput(self, request, key, args, default=''):
value = args.get(key, [default])[0].decode("utf-8")
value = iformal.IStringConvertible(self.original).fromType(value)
return self.original.validate(value)