From b850af0e399e3a0ffee40d1bf97534fac8feb098 Mon Sep 17 00:00:00 2001 From: David Bau Date: Wed, 23 Mar 2022 20:59:20 -0400 Subject: [PATCH] Add textarea. --- baukit/labwidget.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/baukit/labwidget.py b/baukit/labwidget.py index 03620b9..c08f976 100644 --- a/baukit/labwidget.py +++ b/baukit/labwidget.py @@ -648,6 +648,37 @@ class Numberbox(Widget): return show.emit_tag('input', self.std_attrs(), type='numeric', value=self.value, size=self.size) +class Textarea(Widget): + def __init__(self, value='', style=None, **kwargs): + super().__init__(style=defaulted(style, display='inline-block'), **kwargs) + # databinding is defined using Property objects. + self.value = Property(value) + + def widget_js(self): + # Both "model" and "element" objects are defined within the scope + # where the js is run. "element" looks for the element with id + # self.view_id(); if widget_html is overridden, this id should be used. + return minify(''' + element.value = model.get('value'); + element.addEventListener('keydown', (e) => { + if (e.code == 'Enter') { + model.set('value', element.value); + } + }); + element.addEventListener('blur', (e) => { + model.set('value', element.value); + }); + model.on('value', (ev) => { + element.value = model.get('value'); + }); + ''') + + def widget_html(self): + out = [] + with show.enter_tag('textarea', self.std_attrs(), out=out): + out.append(html.escape(self.value)) + return ''.join(out) + class Range(Widget): def __init__(self, value=50, min=0, max=100, step=1, **kwargs): super().__init__(**kwargs)