[Checkins] SVN: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/ Got events for different widgets to render in a not so pretty way.

Paul Carduner paulcarduner at gmail.com
Fri Jun 22 21:02:11 EDT 2007


Log message for revision 76951:
  Got events for different widgets to render in a not so pretty way.

Changed:
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/README.txt
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.py
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py

-=-
Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/README.txt
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/README.txt	2007-06-22 21:45:40 UTC (rev 76950)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/README.txt	2007-06-23 01:02:03 UTC (rev 76951)
@@ -52,7 +52,7 @@
 have to specify which javascript library we want to use to handle the
 events so as to render the javascript correctly.  This is done using
 browser layers.  The formjs framework implements renderers for
-jquery.  The rendered are registered as adapters as follows.
+jquery.  The renderers are registered as adapters as follows.
 
   >>> import zope.component
   >>> zope.component.provideAdapter(jsevent.JQueryEventRenderer)
@@ -282,37 +282,34 @@
   ...         default=20,
   ...         required=False)
 
-
-  >>> class PersonAddForm(form.AddForm):
+  >>> from z3c.form import field
+  >>> from z3c.form import form
+  >>> class PersonEditForm(form.AddForm):
   ...
   ...     fields = field.Fields(IPerson)
-  ...     prefix = "form"
-  ...     def create(self, data):
-  ...         return Person(**data)
   ...
-  ...     def add(self, object):
-  ...         self.context[object.name] = object
-  ...
-  ...     def nextURL(self):
-  ...         return 'index.html'
-  ...
-  ...     @eventHandler('age')
-  ...     def ageClickEvent(self):
+  ...     def ageClickEvent(self, form, id):
   ...         return 'alert("The Age was Clicked!");'
   ...
-  ...     @eventHandler('gender', event=jsevent.CHANGE)
-  ...     def genderChangeEvent(self):
+  ...     def genderChangeEvent(self, form, id):
   ...         return 'alert("The Gender was Changed!");'
+  ...
+  ...     def updateWidgets(self):
+  ...         super(PersonEditForm, self).updateWidgets()
+  ...         age = zope.component.getMultiAdapter(
+  ...              (jsevent.JSEvents(click=self.ageClickEvent),
+  ...               self.widgets['age']), jsinterfaces.IJSEventsWidget)
+  ...         gender = zope.component.getMultiAdapter(
+  ...              (jsevent.JSEvents(change=self.genderChangeEvent),
+  ...               self.widgets['gender']), jsinterfaces.IJSEventsWidget)
 
-
 Now we can update this form and render the widget event handler.
 
   >>> request = TestRequest()
-  >>> add = PersonAddForm(root, request)
-  >>> add.update()
+  >>> edit = PersonEditForm(root, request)
+  >>> edit.update()
 
-  >>> jsinterfaces.IJSEventWidgetManager(add.widgets).renderEvents()
-  <script type="javascript">
-    $("#form-age").bind("click", function(){alert("The Age was Clicked!");});
-    $("#form-gender").bind("change", function(){alert("The Gender was Changed!");});
-  </script>
+  >>> zope.component.provideAdapter(jsevent.JSFormEventsRenderer)
+  >>> print jsinterfaces.IJSFormEventsRenderer(edit).render()
+  $("#form-widgets-gender").bind("change", function(){alert("The Gender was Changed!");});
+  $("#form-widgets-age").bind("click", function(){alert("The Age was Clicked!");});

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml	2007-06-22 21:45:40 UTC (rev 76950)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml	2007-06-23 01:02:03 UTC (rev 76951)
@@ -16,6 +16,10 @@
       factory=".jsevent.JSEventsRenderer"
       />
 
+  <adapter
+      factory=".jsevent.JSFormEventsRenderer"
+      />
+
   <!-- Widget Factory -->
   <adapter
       factory=".jswidget.JSEventsWidget"

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py	2007-06-22 21:45:40 UTC (rev 76950)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py	2007-06-23 01:02:03 UTC (rev 76951)
@@ -22,7 +22,7 @@
 from zope import schema
 
 from z3c.form.interfaces import IButton, IButtonHandler, IManager, IWidget
-from z3c.form.interfaces import ISelectionManager
+from z3c.form.interfaces import ISelectionManager, IForm
 
 class IJSEvent(Interface):
     """An interface for javascript event objects."""
@@ -67,6 +67,19 @@
         """
 
 
+class IJSFormEventsRenderer(Interface):
+    """A renderer that produces javascript code for connecting DOM
+    elements related to a form to javascript events."""
+
+    form = schema.Object(
+        title=u"The form",
+        schema=IForm,
+        required=True)
+
+    def render():
+        """Render the javascript events."""
+
+
 class IJSEventsWidget(Interface):
     """Offers a jsEvents attribute."""
 

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.py	2007-06-22 21:45:40 UTC (rev 76950)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.py	2007-06-23 01:02:03 UTC (rev 76951)
@@ -84,10 +84,6 @@
         self.event = event
 
     def __call__(self, form, id):
-        ## TODO: Passing None makes the tests work because the handler
-        ## functions take self as the first arg.  Instead of passing
-        ## None, I should be passing the form that the handler is
-        ## defined in - but how do I get this from here?
         return self.func(form, id)
 
     def __repr__(self):

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py	2007-06-22 21:45:40 UTC (rev 76950)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py	2007-06-23 01:02:03 UTC (rev 76951)
@@ -21,6 +21,7 @@
 import zope.component
 from zope.publisher.interfaces.browser import IBrowserRequest
 from z3c.form import util
+from z3c.form.interfaces import IForm
 from jquery.layer import IJQueryJavaScriptBrowserLayer
 
 import interfaces
@@ -79,6 +80,25 @@
         return result
 
 
+class JSFormEventsRenderer(object):
+    """IJSEventsRenderer implementation"""
+    implements(interfaces.IJSFormEventsRenderer)
+    zope.component.adapts(IForm)
+
+    def __init__(self, form):
+        self.form = form
+        self.request = form.request
+
+    def render(self):
+        result = ''
+        for widget in filter(interfaces.IJSEventsWidget.providedBy,
+                             self.form.widgets.values()):
+            renderer = zope.component.getMultiAdapter((widget.jsEvents, self.request),
+                                                     interfaces.IJSEventsRenderer)
+            result += renderer.render(widget, self.form)
+        return result
+
+
 class JQueryEventRenderer(object):
     """IJSEventRenderer implementation.
 

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py	2007-06-22 21:45:40 UTC (rev 76950)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py	2007-06-23 01:02:03 UTC (rev 76951)
@@ -24,6 +24,7 @@
 from zope.publisher.browser import TestRequest
 from zope.app.testing import setup
 import z3c.form.interfaces
+import z3c.form.testing
 
 import jquery.layer
 from z3c.formjs import jsbutton, jswidget, jsevent
@@ -40,6 +41,7 @@
 
 def setUp(test):
     test.globs = {'root': setup.placefulSetUp(True)}
+    z3c.form.testing.setupFormDefaults()
     zope.component.provideAdapter(jsbutton.JSButtonAction,
                                   (jquery.layer.IJQueryJavaScriptBrowserLayer,
                                    interfaces.IJSButton),



More information about the Checkins mailing list