[Checkins] SVN: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/
attempting work on attaching events to any widget.
Paul Carduner
paulcarduner at gmail.com
Thu Jun 21 20:50:34 EDT 2007
Log message for revision 76929:
attempting work on attaching events to any 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/jsbutton.py
U Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py
A Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jswidget.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:46:19 UTC (rev 76928)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/README.txt 2007-06-22 00:50:33 UTC (rev 76929)
@@ -36,8 +36,11 @@
These events have javascript handlers which can be dynamically
generated so we will define a handler using a function.
- >>> def simpleHandler():
- ... return 'alert("Some event was called!");'
+ >>> def simpleHandler(form, id):
+ ... return ('alert("Some event was called '
+ ... 'for the element with id %s '
+ ... 'and for the form %s");'
+ ... % (id, form))
Another aspect of javascript events is that they get attached to a
specific dom element using an id. So let us make an imaginary dom
@@ -62,8 +65,9 @@
>>> renderer = zope.component.getMultiAdapter((jsevent.CLICK,
... request), jsinterfaces.IJSEventRenderer)
- >>> renderer.render(simpleHandler, id)
- '$("#form-field-age").bind("click", function(){alert("Some event was called!");});'
+ >>> renderer.render(simpleHandler, id, None)
+ '$("#form-field-age").bind("click", function(){alert("Some event was
+ called for the element with id form-field-age and for the form None");});'
Buttons
@@ -99,11 +103,11 @@
... prefix = 'form'
...
... @jsbutton.handler(IButtons['apply'])
- ... def apply(self):
+ ... def apply(self, id):
... return 'alert("You Clicked the Apply Button!");'
...
... @jsbutton.handler(IButtons['cancel'], event=jsevent.DBLCLICK)
- ... def cancel(self):
+ ... def cancel(self, id):
... return 'alert("You Double Clicked the Cancel Button!");'
Notice that the jsbutton.handler decorator takes the keyword argument
@@ -121,9 +125,9 @@
Action managers are instantiated using the form, request, and
context/content. A special button-action-manager implementation is avaialble
-in the ``jsbutton`` package:
+in the ``z3c.form.button`` package:
- >>> actions = jsbutton.JSButtonActions(form, request, None)
+ >>> actions = button.ButtonActions(form, request, None)
>>> actions.update()
Once the action manager is updated, the buttons should be available as
@@ -140,7 +144,7 @@
>>> apply.__name__
'apply'
>>> apply.__parent__
- <JSButtonActions None>
+ <ButtonActions None>
A button action is also a button widget. The attributes translate as follows:
@@ -219,29 +223,29 @@
>>> import zope.component
>>> zope.component.provideAdapter(factory, name=interfaces.INPUT_MODE)
-Now for the magic. We can attach an event to this widget by adapting
-it to ``IJSEventWidget``.
+Now for the magic. We can attach events to this widget by adapting
+it to ``IJSEventWidget``. First we will create the events we want to
+add to it.
>>> def ageClickHandler():
... return 'alert("This Widget was Clicked!");'
+ >>> def ageDblClickHandler():
+ ... return 'alert("This Widget was Double Clicked!");'
+ >>> events = jsevent.JSEvents(click=ageClickHandler,
+ ... dblclick=ageDblClickHandler)
+ >>> age = zope.component.getMultiAdapter((events, age), jsinterfaces.IJSEventsWidget)
- >>> jsinterfaces.IJSEventWidget(age).addEvent(jsevent.CLICK, ageClickHandler)
-
Now we can update and render this widget.
>>> age.update()
>>> print age.render()
- <input type="text" name="age" value="39" />
-
-If we render the widget in the regular way, nothing is different.
-However, we can render it using the IJSEventWidget adapter to have the
-event attached.
-
- >>> jsinterfaces.IJSEventWidget(age).render()
- <input type="text" id="age" name="age" value="39" />
+ <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>
Rendering Widgets with Attached Events
@@ -305,5 +309,5 @@
>>> jsinterfaces.IJSEventWidgetManager(add.widgets).renderEvents()
<script type="javascript">
$("#form-age").bind("click", function(){alert("The Age was Clicked!");});
- $("#form-gender").bind("dblclick", function(){alert("The Gender was Changed!");});
+ $("#form-gender").bind("change", function(){alert("The Gender was Changed!");});
</script>
Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml 2007-06-22 00:46:19 UTC (rev 76928)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml 2007-06-22 00:50:33 UTC (rev 76929)
@@ -12,4 +12,36 @@
factory=".jsevent.JQueryEventRenderer"
/>
+ <!-- Widget Factory -->
+ <adapter
+ factory=".jswidget.JSEventsWidget"
+ />
+
+ <!-- JavaScript Event Utitilities -->
+ <utility
+ provides="z3c.formjs.interfaces.IJSEvent"
+ name="click"
+ component="z3c.formjs.jsevent.CLICK"
+ />
+
+ <utility
+ provides="z3c.formjs.interfaces.IJSEvent"
+ name="dblclick"
+ component="z3c.formjs.jsevent.DBLCLICK"
+ />
+
+ <utility
+ provides="z3c.formjs.interfaces.IJSEvent"
+ name="changed"
+ component="z3c.formjs.jsevent.CHANGED"
+ />
+
+ <utility
+ provides="z3c.formjs.interfaces.IJSEvent"
+ name="load"
+ component="z3c.formjs.jsevent.LOAD"
+ />
+
+
+
</configure>
Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py 2007-06-22 00:46:19 UTC (rev 76928)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py 2007-06-22 00:50:33 UTC (rev 76929)
@@ -22,9 +22,10 @@
from zope import schema
from z3c.form.interfaces import IButton, IButtonHandler, IManager, IWidget
+from z3c.form.interfaces import ISelectionManager
class IJSEvent(Interface):
- """A marker interface for javascript event objects."""
+ """An interface for javascript event objects."""
name = schema.TextLine(
title=u"Event Name",
@@ -32,6 +33,10 @@
required=True)
+class IJSEvents(ISelectionManager):
+ """Selection manager for javascript event objects."""
+
+
class IJSEventRenderer(Interface):
"""A renderer that produces javascript code for connecting DOM elements
to events.
@@ -47,7 +52,15 @@
code produced by the given handler.
"""
+class IJSEventsWidget(Interface):
+ """Offers a jsEvents attribute."""
+ jsEvents = schema.Field(
+ title=u"JavaScript Events",
+ description=u"The javascript events associated with this widget.",
+ required=True)
+
+
class IJSButton(IButton):
"""A button that just connects to javascript handlers."""
Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.py 2007-06-22 00:46:19 UTC (rev 76928)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.py 2007-06-22 00:50:33 UTC (rev 76929)
@@ -110,11 +110,10 @@
zope.interface.implements(IFieldWidget)
zope.component.adapts(
IJQueryJavaScriptBrowserLayer,
- interfaces.IJSButton,
- zope.interface.Interface)
+ interfaces.IJSButton)
- def __init__(self, request, field, name):
- action.Action.__init__(self, request, field.title, name)
+ def __init__(self, request, field):
+ action.Action.__init__(self, request, field.title)
ButtonWidget.__init__(self, request)
self.field = field
Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py 2007-06-22 00:46:19 UTC (rev 76928)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py 2007-06-22 00:50:33 UTC (rev 76929)
@@ -19,7 +19,7 @@
from zope.interface import implements
from zope.component import adapts
-
+from z3c.form import util
from jquery.layer import IJQueryJavaScriptBrowserLayer
import interfaces
@@ -37,12 +37,26 @@
def __repr__(self):
return '<JSEvent "%s">' % self.name
+
CLICK = JSEvent("click")
DBLCLICK = JSEvent("dblclick")
CHANGED = JSEvent("changed")
LOAD = JSEvent("load")
+class JSEvents(util.SelectionManager):
+ """Selection manager for IJSEvents."""
+
+ implements(interfaces.IJSEvents)
+
+ def __init__(self, *args, **kwargs):
+ super(JSEvents, self).__init__(*args, **kwargs)
+ for kw in kwargs:
+ self._data_keys.append(kw)
+ self._data_values.append(kwargs[kw])
+ self._data[kw] = kwargs[kw]
+
+
class JQueryEventRenderer(object):
"""IJSEventRenderer implementation.
Added: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jswidget.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jswidget.py (rev 0)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jswidget.py 2007-06-22 00:50:33 UTC (rev 76929)
@@ -0,0 +1,13 @@
+import zope.component
+import zope.interface
+from z3c.form.interfaces import IWidget
+import interfaces
+
+ at zope.component.adapter(interfaces.IJSEvents, IWidget)
+ at zope.interface.implementer(interfaces.IJSEventsWidget)
+def JSEventsWidget(events, widget):
+ """Set the events for the widget."""
+ widget.jsEvents = events
+ if not interfaces.IJSEventsWidget.providedBy(widget):
+ zope.interface.alsoProvides(widget, interfaces.IJSEventsWidget)
+ return widget
Property changes on: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jswidget.py
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py 2007-06-22 00:46:19 UTC (rev 76928)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py 2007-06-22 00:50:33 UTC (rev 76929)
@@ -20,12 +20,16 @@
import os.path
import zope.interface
+import zope.component
from zope.publisher.browser import TestRequest
from zope.app.testing import setup
+import z3c.form.interfaces
import jquery.layer
-from z3c.formjs import jsbutton
+from z3c.formjs import jsbutton, jswidget
+from z3c.formjs import interfaces
+from z3c.form.interfaces import IWidget
import browser
class TestRequest(TestRequest):
@@ -36,6 +40,14 @@
def setUp(test):
test.globs = {'root': setup.placefulSetUp(True)}
+ zope.component.provideAdapter(jsbutton.JSButtonAction,
+ (jquery.layer.IJQueryJavaScriptBrowserLayer,
+ interfaces.IJSButton),
+ z3c.form.interfaces.IFieldWidget)
+ zope.component.provideAdapter(jswidget.JSEventsWidget,
+ (interfaces.IJSEvents, IWidget),
+ interfaces.IJSEventsWidget)
+
def tearDown(test):
setup.placefulTearDown()
More information about the Checkins
mailing list