diff --git a/edbob/pyramid/forms/formalchemy/__init__.py b/edbob/pyramid/forms/formalchemy/__init__.py index 6ab93d5..9789988 100644 --- a/edbob/pyramid/forms/formalchemy/__init__.py +++ b/edbob/pyramid/forms/formalchemy/__init__.py @@ -36,8 +36,11 @@ from webhelpers.html.tags import literal import formalchemy from formalchemy.validators import accepts_none +import edbob from edbob.lib import pretty +from edbob.pyramid import Session from edbob.time import localize +from edbob.util import requires_impl from edbob.pyramid.forms.formalchemy.fieldset import * from edbob.pyramid.forms.formalchemy.fields import * @@ -65,6 +68,50 @@ engine = TemplateEngine() formalchemy.config.engine = engine +class AlchemyForm(edbob.Object): + """ + Form to contain a :class:`formalchemy.FieldSet` instance. + """ + + create_label = "Create" + update_label = "Update" + + allow_successive_creates = False + + def __init__(self, request, fieldset, **kwargs): + edbob.Object.__init__(self, **kwargs) + self.request = request + self.fieldset = fieldset + + def _get_readonly(self): + return self.fieldset.readonly + + def _set_readonly(self, val): + self.fieldset.readonly = val + + readonly = property(_get_readonly, _set_readonly) + + @property + def successive_create_label(self): + return "%s and continue" % self.create_label + + def render(self, **kwargs): + kwargs['form'] = self + if self.readonly: + template = '/forms/form_readonly.mako' + else: + template = '/forms/form.mako' + return render(template, kwargs) + + def save(self): + self.fieldset.sync() + Session.flush() + + def validate(self): + self.fieldset.rebind(data=self.request.params) + return self.fieldset.validate() + + class ChildGridField(formalchemy.Field): """ Convenience class for including a child grid within a fieldset as a diff --git a/edbob/pyramid/forms/formalchemy/renderers.py b/edbob/pyramid/forms/formalchemy/renderers.py index 783d323..263f728 100644 --- a/edbob/pyramid/forms/formalchemy/renderers.py +++ b/edbob/pyramid/forms/formalchemy/renderers.py @@ -35,7 +35,7 @@ __all__ = ['AutocompleteFieldRenderer', 'EnumFieldRenderer', 'YesNoFieldRenderer'] -def AutocompleteFieldRenderer(service_url, width='300px'): +def AutocompleteFieldRenderer(service_url, field_value=None, field_display=None, width='300px'): """ Autocomplete renderer. """ @@ -46,10 +46,14 @@ def AutocompleteFieldRenderer(service_url, width='300px'): def focus_name(self): return self.name + '-textbox' + @property + def needs_focus(self): + return not bool(self.value or field_value) + def render(self, **kwargs): kwargs.setdefault('field_name', self.name) - kwargs.setdefault('field_value', self.value) - kwargs.setdefault('field_display', self.raw_value) + kwargs.setdefault('field_value', self.value or field_value) + kwargs.setdefault('field_display', self.raw_value or field_display) kwargs.setdefault('service_url', service_url) kwargs.setdefault('width', width) return render('/forms/field_autocomplete.mako', kwargs) diff --git a/edbob/pyramid/grids/alchemy.py b/edbob/pyramid/grids/alchemy.py index be84d0a..eb3b7d7 100644 --- a/edbob/pyramid/grids/alchemy.py +++ b/edbob/pyramid/grids/alchemy.py @@ -52,10 +52,17 @@ class AlchemyGrid(Grid): self._formalchemy_grid = formalchemy.Grid( cls, instances, session=Session(), request=request) self._formalchemy_grid.prettify = prettify + self.noclick_fields = [] def __getattr__(self, attr): return getattr(self._formalchemy_grid, attr) + def cell_class(self, field): + classes = [field.name] + if field.name in self.noclick_fields: + classes.append('noclick') + return ' '.join(classes) + def checkbox(self, row): return tags.checkbox('check-'+row.uuid) diff --git a/edbob/pyramid/static/css/forms.css b/edbob/pyramid/static/css/forms.css index 5843669..086f882 100644 --- a/edbob/pyramid/static/css/forms.css +++ b/edbob/pyramid/static/css/forms.css @@ -1,4 +1,13 @@ +/****************************** + * Form Wrapper + ******************************/ + +div.form-wrapper { + overflow: auto; +} + + /****************************** * Context Menu ******************************/ @@ -19,7 +28,6 @@ div.form, div.fieldset-form, div.fieldset { float: left; - margin-left: 50px; margin-top: 10px; } diff --git a/edbob/pyramid/static/css/grids.css b/edbob/pyramid/static/css/grids.css index 209c55f..9ceeb0c 100644 --- a/edbob/pyramid/static/css/grids.css +++ b/edbob/pyramid/static/css/grids.css @@ -105,6 +105,7 @@ div.grid table tbody td.delete { background-position: center; cursor: pointer; min-width: 18px; + width: 18px; } div.grid table tbody tr.hovering { @@ -121,6 +122,10 @@ div.grid table.checkable tbody tr { cursor: pointer; } +div.grid.clickable table tbody tr td.noclick { + cursor: default; +} + /* div.grid table.selectable tbody tr.selected, */ /* div.grid table.checkable tbody tr.selected { */ /* background-color: #666666; */ diff --git a/edbob/pyramid/templates/edbob/crud.mako b/edbob/pyramid/templates/edbob/crud.mako index c874825..885dba3 100644 --- a/edbob/pyramid/templates/edbob/crud.mako +++ b/edbob/pyramid/templates/edbob/crud.mako @@ -1,15 +1,5 @@ -<%inherit file="/base.mako" /> +<%inherit file="/form.mako" /> -<%def name="title()">${(fieldset.crud_title+' : '+fieldset.get_display_text() if fieldset.edit else 'New '+fieldset.crud_title) if crud else ''|n}%def> +<%def name="title()">${"New "+form.pretty_name if form.creating else form.pretty_name+' : '+str(form.fieldset.model)}%def> -<%def name="context_menu_items()">%def> - -