[Checkins] SVN: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/
got rendering of multiple events attached to a single widget
to work for just the widget.
Paul Carduner
paulcarduner at gmail.com
Thu Jun 21 22:07:24 EDT 2007
Log message for revision 76932:
got rendering of multiple events attached to a single widget to work for just the widget.
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/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 00:56:48 UTC (rev 76931)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/README.txt 2007-06-22 02:07:24 UTC (rev 76932)
@@ -20,8 +20,8 @@
<JSEvent "click">
>>> jsevent.DBLCLICK
<JSEvent "dblclick">
- >>> jsevent.CHANGED
- <JSEvent "changed">
+ >>> jsevent.CHANGE
+ <JSEvent "change">
>>> jsevent.LOAD
<JSEvent "load">
@@ -227,9 +227,9 @@
it to ``IJSEventWidget``. First we will create the events we want to
add to it.
- >>> def ageClickHandler():
+ >>> def ageClickHandler(widget, id):
... return 'alert("This Widget was Clicked!");'
- >>> def ageDblClickHandler():
+ >>> def ageDblClickHandler(widget, id):
... return 'alert("This Widget was Double Clicked!");'
>>> events = jsevent.JSEvents(click=ageClickHandler,
... dblclick=ageDblClickHandler)
@@ -239,15 +239,20 @@
>>> age.update()
>>> print age.render()
- <input type="text" name="age" value="39" id="age"/>
- <script type="javascript">
- $('#age').bind("click", function(){alert("This Widget was Clicked!");});
- </script>
- <script type="javascript">
- $('#age').bind("dblclick", function(){alert("This Widget was Double Clicked!");});
- </script>
+ <input type="text" name="age" value="39" id="age" />
+And then render the widget's events.
+ >>> zope.component.provideAdapter(jsevent.JSEventsRenderer)
+ >>> request = TestRequest()
+ >>> renderer = zope.component.getMultiAdapter((events, request),
+ ... jsinterfaces.IJSEventsRenderer)
+ >>> age.id = 'age'
+ >>> print renderer.render(age, None)
+ $("#age").bind("click", function(){alert("This Widget was Clicked!");});
+ $("#age").bind("dblclick", function(){alert("This Widget was Double Clicked!");});
+
+
Rendering Widgets with Attached Events
--------------------------------------
@@ -295,7 +300,7 @@
... def ageClickEvent(self):
... return 'alert("The Age was Clicked!");'
...
- ... @eventHandler('gender', event=jsevent.CHANGED)
+ ... @eventHandler('gender', event=jsevent.CHANGE)
... def genderChangeEvent(self):
... return 'alert("The Gender was Changed!");'
Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml 2007-06-22 00:56:48 UTC (rev 76931)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml 2007-06-22 02:07:24 UTC (rev 76932)
@@ -12,6 +12,10 @@
factory=".jsevent.JQueryEventRenderer"
/>
+ <adapter
+ factory=".jsevent.JSEventsRenderer"
+ />
+
<!-- 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 00:56:48 UTC (rev 76931)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py 2007-06-22 02:07:24 UTC (rev 76932)
@@ -52,6 +52,21 @@
code produced by the given handler.
"""
+class IJSEventsRenderer(Interface):
+ """A renderer that produces javascript code for connecting DOM elements
+ to events.
+ """
+
+ events = schema.Object(
+ title=u"The set of events to be rendered.",
+ schema=IJSEvents,
+ required=True)
+
+ def render(widget, form):
+ """render javascript events on widget.
+ """
+
+
class IJSEventsWidget(Interface):
"""Offers a jsEvents attribute."""
Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py 2007-06-22 00:56:48 UTC (rev 76931)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py 2007-06-22 02:07:24 UTC (rev 76932)
@@ -18,7 +18,8 @@
__docformat__ = "reStructuredText"
from zope.interface import implements
-from zope.component import adapts
+import zope.component
+from zope.publisher.interfaces.browser import IBrowserRequest
from z3c.form import util
from jquery.layer import IJQueryJavaScriptBrowserLayer
@@ -40,7 +41,7 @@
CLICK = JSEvent("click")
DBLCLICK = JSEvent("dblclick")
-CHANGED = JSEvent("changed")
+CHANGE = JSEvent("change")
LOAD = JSEvent("load")
@@ -57,14 +58,35 @@
self._data[kw] = kwargs[kw]
+class JSEventsRenderer(object):
+ """IJSEventsRenderer implementation"""
+ implements(interfaces.IJSEventsRenderer)
+ zope.component.adapts(interfaces.IJSEvents,
+ IBrowserRequest)
+
+ def __init__(self, events, request):
+ self.request = request
+ self.events = events
+
+ def render(self, widget, form):
+ result = ''
+ for eventName, handler in self.events.items():
+ event = zope.component.getUtility(interfaces.IJSEvent, name=eventName)
+ renderer = zope.component.queryMultiAdapter((event, self.request),
+ interfaces.IJSEventRenderer,
+ default=JQueryEventRenderer(event, self.request))
+ result += renderer.render(handler, widget.id, form) + '\n'
+ return result
+
+
class JQueryEventRenderer(object):
"""IJSEventRenderer implementation.
See ``interfaces.IJSEventRenderer``.
"""
implements(interfaces.IJSEventRenderer)
- adapts(interfaces.IJSEvent,
- IJQueryJavaScriptBrowserLayer)
+ zope.component.adapts(interfaces.IJSEvent,
+ IJQueryJavaScriptBrowserLayer)
def __init__(self, event, request):
self.request = request
Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py 2007-06-22 00:56:48 UTC (rev 76931)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py 2007-06-22 02:07:24 UTC (rev 76932)
@@ -26,7 +26,7 @@
import z3c.form.interfaces
import jquery.layer
-from z3c.formjs import jsbutton, jswidget
+from z3c.formjs import jsbutton, jswidget, jsevent
from z3c.formjs import interfaces
from z3c.form.interfaces import IWidget
@@ -44,10 +44,14 @@
(jquery.layer.IJQueryJavaScriptBrowserLayer,
interfaces.IJSButton),
z3c.form.interfaces.IFieldWidget)
-
zope.component.provideAdapter(jswidget.JSEventsWidget,
(interfaces.IJSEvents, IWidget),
interfaces.IJSEventsWidget)
+ ## Event Utilities
+ zope.component.provideUtility(jsevent.CLICK, interfaces.IJSEvent, name='click')
+ zope.component.provideUtility(jsevent.DBLCLICK, interfaces.IJSEvent, name='dblclick')
+ zope.component.provideUtility(jsevent.LOAD, interfaces.IJSEvent, name='load')
+ zope.component.provideUtility(jsevent.CHANGE, interfaces.IJSEvent, name='change')
def tearDown(test):
setup.placefulTearDown()
More information about the Checkins
mailing list