Changeset 240


Ignore:
Timestamp:
Mar 5, 2010, 5:26:05 PM (9 years ago)
Author:
duh
Message:
  • added ajaxOnChange parameter support for <wizard:...> elements. ajaxOnChange now performs an ajaxSubmit to the current form. Usefull for handeling select changes and dynamic forms. When using the ajaxOnChange attribute you can also add the 'url', 'update' and 'afterSuccess' parameters. In your webflow the action is triggered that you put in the ajaxOnChange argument.
  • example:

<wizard:templateElement name="template" description="Template" value="${study?.template}" entity="${dbnp.studycapturing.Subject}" ajaxOnChange="switchTemplate" url="[controller:'wizard',action:'pages']" update="[success:'wizardPage',failure:'wizardError']" afterSuccess="onWizardPage()" >

The template to use for this study

</wizard:templateElement>

Will submit on change, triggering the 'switchTemplate' action in your current webflow:

on("switchTemplate") {

println params

}.to "study"

Location:
trunk/grails-app
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/controllers/dbnp/studycapturing/WizardController.groovy

    r238 r240  
    7171                }
    7272
    73                 // select the templates to use for this study
    74                 templates {
    75                         render(view: "_templates")
    76                         onRender {
    77                                 flow.page = 1
    78                         }
    79                         on("next") {
    80                                 // if we don't have a study, instantiate a study with dummy values
    81                                 if (!flow.study) {
    82                                         flow.study = new Study(
    83                                                 title: "my study",
    84                                                 code: "",
    85                                                 ecCode: "",
    86                                                 researchQuestion: "",
    87                                                 description: "",
    88                                                 startDate: new Date()
    89                                         )
    90                                 }
    91 
    92                                 // assign template to study
    93                                 flow.study.template = Template.findByName(params.get('template'));
    94 
    95                                 // validate study
    96                                 if (flow.study.validate()) {
    97                                         success()
    98                                 } else {
    99                                         // validation failed, feedback errors
    100                                         flash.errors = new LinkedHashMap()
    101                                         this.appendErrors(flow.study, flash.errors)
    102                                         error()
    103                                 }
    104                         }.to "study"
    105                 }
    106 
    10773                // create or modify a study
    10874                start {
     
    12490                                flow.page = 2
    12591                        }
     92                        on("switchTemplate") {
     93                                println "switching template..."
     94                                println params
     95                                this.handleStudy(flow, flash, params)
     96                        }.to "study"
    12697                        on("previous") {
    12798                                flash.errors = new LinkedHashMap()
  • trunk/grails-app/taglib/dbnp/studycapturing/WizardTagLib.groovy

    r238 r240  
    112112
    113113        /**
     114         * generate a ajax submit JavaScript
     115         * @see WizardTagLib::ajaxFlowRedirect
     116         * @see WizardTagLib::baseElement (ajaxSubmitOnChange)
     117         */
     118        def ajaxSubmitJs = { attrs, body ->
     119                // define AJAX provider
     120                setProvider([library: ajaxProvider])
     121
     122                // got a function name?
     123                def functionName = attrs.remove('functionName')
     124                if (functionName && !attrs.get('name')) {
     125                        attrs.name = functionName
     126                }
     127
     128                // generate an ajax button
     129                def button = this.ajaxButton(attrs, body)
     130
     131                // strip the button part to only leave the Ajax call
     132                button = button.replaceFirst(/<[^\"]*\"jQuery.ajax/,'jQuery.ajax')
     133                button = button.replaceFirst(/return false.*/,'')
     134
     135                // change form if a form attribute is present
     136                if (attrs.get('form')) {
     137                        button = button.replaceFirst(/this\.form/,
     138                                "\\\$('" + attrs.get('form') + "')"
     139                        )
     140                }
     141
     142                out << button
     143        }
     144
     145        /**
    114146         * generate ajax webflow redirect javascript
    115147         *
     
    130162         * update = the divs to update upon success or error
    131163         *
     164         * OR: to generate a JavaScript function you can call yourself, use 'functionName' instead of 'name'
     165         *
    132166         * Example initial webflow action to work with this javascript:
    133167         * ...
     
    145179         */
    146180        def ajaxFlowRedirect = { attrs, body ->
    147                 // define AJAX provider
    148                 setProvider([library: ajaxProvider])
    149 
    150                 // generate an ajax button
    151                 def button = this.ajaxButton(attrs, body)
    152 
    153                 // strip the button part to only leave the Ajax call
    154                 button = button.replaceFirst(/<[^\"]*\"jQuery.ajax/,'jQuery.ajax')
    155                 button = button.replaceFirst(/return false.*/,'')
    156 
    157                 // change form if a form attribute is present
    158                 if (attrs.get('form')) {
    159                         button = button.replaceFirst(/this\.form/,
    160                                 "\\\$('" + attrs.get('form') + "')"
    161                         )
    162                 }
    163 
    164181                // generate javascript
    165                 out << '<script language="JavaScript">'
     182                out << '<script type="text/javascript">'
    166183                out << '$(document).ready(function() {'
    167                 out << button
     184                out << ajaxSubmitJs(attrs, body)
    168185                out << '});'
    169186                out << '</script>'
     
    199216                def addExampleElement = attrs.remove('addExampleElement')
    200217                def addExample2Element  = attrs.remove('addExample2Element')
     218
     219                // got an ajax onchange action?
     220                def ajaxOnChange = attrs.remove('ajaxOnChange')
     221                if (ajaxOnChange) {
     222                        if (!attrs.onChange) attrs.onChange = ''
     223
     224                        // add onChange AjaxSubmit javascript
     225                        attrs.onChange += ajaxSubmitJs(
     226                                [
     227                                        functionName: ajaxOnChange,
     228                                        url: attrs.get('url'),
     229                                        update: attrs.get('update'),
     230                                        afterSuccess: attrs.get('afterSuccess')
     231                                ],
     232                                ''
     233                        )
     234                }
    201235
    202236                // execute inputElement call
  • trunk/grails-app/views/wizard/pages/_study.gsp

    r238 r240  
    2121        </span>
    2222       
    23         <wizard:templateElement name="template" description="Template" value="${study?.template}" entity="${dbnp.studycapturing.Study}">
     23        <wizard:templateElement name="template" description="Template" value="${study?.template}" entity="${dbnp.studycapturing.Subject}" ajaxOnChange="switchTemplate" url="[controller:'wizard',action:'pages']" update="[success:'wizardPage',failure:'wizardError']" afterSuccess="onWizardPage()" >
    2424                The template to use for this study
    2525        </wizard:templateElement>
Note: See TracChangeset for help on using the changeset viewer.