diff --git a/README.rst b/README.rst index ceab262..453ac93 100644 --- a/README.rst +++ b/README.rst @@ -461,6 +461,40 @@ attribute ``ajaxtarget`` on the received event a convenience is provided.:: bdajax.trigger('contextchanged', '.contextsensitiv', url) +AJAX Forms +---------- + +To process ajax forms, a hidden iframe is used where the form gets triggered to. +The form must be marked with CSS class ``ajax`` in order to be handled by +bdajax. The server side must return a response like so:: + +
+
+ ... +
+
+ + +If ``div`` with id ``ajaxform`` contains markup, it gets rendered to +``#form_selector`` with ``fiddle_mode``. This makes it possible to rerender +forms on validation error or display a success page or similar. Further +bdajax continuation definitions can be given to ``parent.bdajax.continuation``. + +Again, bdajax does not provide any server side implementation, it's up to you +providing this. + + 3rd Party Javascript -------------------- @@ -500,6 +534,12 @@ Contributors Changes ======= +1.4dev +------ + +- Add AJAX form support. + [rnix, 2012-05-04] + 1.3 --- diff --git a/setup.py b/setup.py index 72134bf..3e80b20 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from setuptools import setup, find_packages import sys, os -version = '1.3' +version = '1.4dev' shortdesc = 'Ajax convenience.' longdesc = open(os.path.join(os.path.dirname(__file__), 'README.rst')).read() longdesc += open(os.path.join(os.path.dirname(__file__), 'LICENSE.rst')).read() diff --git a/src/bdajax/bdajax.pt b/src/bdajax/bdajax.pt index f86f122..f391c49 100644 --- a/src/bdajax/bdajax.pt +++ b/src/bdajax/bdajax.pt @@ -18,4 +18,10 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/src/bdajax/resources/bdajax.js b/src/bdajax/resources/bdajax.js index 0318806..995ec78 100644 --- a/src/bdajax/resources/bdajax.js +++ b/src/bdajax/resources/bdajax.js @@ -1,5 +1,5 @@ /* - * bdajax v1.3 + * bdajax v1.4 * * Requires: * - jQuery 1.6.4 @@ -33,6 +33,9 @@ } } }); + // XXX: probably ajax forms get a separate ``ajax:form`` directive + // in markup. + bdajax.bind_ajax_form(context); for (var binder in bdajax.binders) { bdajax.binders[binder](context); } @@ -45,7 +48,7 @@ // That we assume at '/login'. default_403: '/login', - // object for 3rd party binders + // object for hooking up JS binding functions after ajax calls binders: {}, // ajax spinner handling @@ -239,7 +242,11 @@ }, overlay: function(options) { - var elem = $('#ajax-overlay'); + var selector = '#ajax-overlay'; + if (options.selector) { + selector = options.selector; + } + var elem = $(selector); elem.removeData('overlay'); var url, params; if (options.target) { @@ -355,6 +362,25 @@ elem.data('overlay').load(); }, + // bind ajax form handling to all forms providing ajax css class + bind_ajax_form: function(context) { + var ajaxform = $('form.ajax', context); + ajaxform.append(''); + ajaxform.attr('target', 'ajaxformresponse'); + ajaxform.unbind().bind('submit', function(event) { + bdajax.spinner.show(); + }); + }, + + // called by iframe response, renders form (i.e. if validation errors) + render_ajax_form: function(payload, selector, mode) { + if (!payload) { + return; + } + this.spinner.hide(); + this.fiddle(payload, selector, mode); + }, + _dispatching_handler: function(event) { event.preventDefault(); event.stopPropagation();