diff --git a/tailbone/forms2/core.py b/tailbone/forms2/core.py index 3242be52..cee0d4d8 100644 --- a/tailbone/forms2/core.py +++ b/tailbone/forms2/core.py @@ -35,7 +35,7 @@ from sqlalchemy import orm from sqlalchemy.ext.associationproxy import AssociationProxy, ASSOCIATION_PROXY from rattail.time import localtime -from rattail.util import prettify, pretty_boolean, pretty_hours +from rattail.util import prettify, pretty_boolean, pretty_hours, pretty_quantity import colander import deform @@ -472,6 +472,8 @@ class Form(object): self.set_widget(key, dfwidget.CheckboxWidget()) elif type_ == 'currency': self.set_renderer(key, self.render_currency) + elif type_ == 'quantity': + self.set_renderer(key, self.render_quantity) elif type_ == 'enum': self.set_renderer(key, self.render_enum) elif type_ == 'codeblock': @@ -552,6 +554,7 @@ class Form(object): # create form form = deform.Form(schema, **kwargs) + form.tailbone_form = self # set readonly widget where applicable for field in self.readonly_fields: @@ -627,6 +630,12 @@ class Form(object): return "(${:0,.2f})".format(0 - value) return "${:0,.2f}".format(value) + def render_quantity(self, obj, field): + value = self.obtain_value(obj, field) + if value is None: + return "" + return pretty_quantity(value) + def render_enum(self, record, field_name): value = self.obtain_value(record, field_name) if value is None: diff --git a/tailbone/forms2/widgets.py b/tailbone/forms2/widgets.py index a8d8018e..d314a0f0 100644 --- a/tailbone/forms2/widgets.py +++ b/tailbone/forms2/widgets.py @@ -41,7 +41,9 @@ class ReadonlyWidget(dfwidget.HiddenWidget): def serialize(self, field, cstruct, **kw): if cstruct in (colander.null, None): cstruct = '' - return HTML.tag('span', cstruct) + tags.hidden(field.name, value=cstruct, id=field.oid) + # TODO: is this hacky? + text = field.parent.tailbone_form.render_field_value(field.name) + return HTML.tag('span', text) + tags.hidden(field.name, value=cstruct, id=field.oid) class JQueryDateWidget(dfwidget.DateInputWidget): @@ -93,6 +95,8 @@ class JQueryAutocompleteWidget(dfwidget.AutocompleteInputWidget): requirements = None field_display = "" service_url = None + cleared_callback = None + selected_callback = None default_options = ( ('autoFocus', True), @@ -117,6 +121,8 @@ class JQueryAutocompleteWidget(dfwidget.AutocompleteInputWidget): kw['options'] = json.dumps(options) kw['field_display'] = self.field_display + kw['cleared_callback'] = self.cleared_callback + kw['selected_callback'] = self.selected_callback tmpl_values = self.get_template_values(field, cstruct, kw) template = readonly and self.readonly_template or self.template return field.renderer(template, **tmpl_values) diff --git a/tailbone/templates/deform/autocomplete_jquery.pt b/tailbone/templates/deform/autocomplete_jquery.pt index 59208355..7231fae3 100644 --- a/tailbone/templates/deform/autocomplete_jquery.pt +++ b/tailbone/templates/deform/autocomplete_jquery.pt @@ -39,6 +39,8 @@ $('#' + oid + '-display span:first').text(ui.item.label); $('#' + oid + '-textbox').hide(); $('#' + oid + '-display').show(); + $('#' + oid + '-textbox').trigger('autocompletevalueselected', + [ui.item.value, ui.item.label]); return false; }); @@ -50,12 +52,35 @@ show(); focus(); } + $('#' + oid + '-textbox').trigger('autocompletevaluecleared'); }); } ); + + + +