Form fragments and radio buttons

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Form fragments and radio buttons

Adriaan Joubert-3
Hi,

I had an issue with triggering a form fragment with a radio button. I
came up with the following solution, and thought I'd share and ask for
comments - perhaps it is possible to come up with something that can
be included in Tapestry.

The .tml looks as follows:

        <t:form t:id="create">
                <t:radiogroup t:id="createAction" value="action"
                        encoder="actionEncoder">
                        <t:radio t:id="copy" t:mixins="radiotriggerfragment"
                                fragment="copyfragment" />
                        <t:label for="copy" />
                        <t:radio t:id="new" />
                        <t:label for="new" />
                </t:radiogroup>

                <t:formfragment t:id="copyfragment" visible="true">
                        This is the copy form fragment
                </t:formfragment>
        </t:form>

This required the following mixin (mostly a copy of TriggerFragment.java):

/**
 * Deal with using a radio button to make a form fragment visible/invisible
 */
public class RadioTriggerFragment {

        /** The container for this mixin */
        @InjectContainer
        private Field container_;

        /**
         * The {@link org.apache.tapestry.corelib.components.FormFragment} instance
         * to make dynamically visible or hidden.
         */
        @Parameter(name = "fragment", required = true, defaultPrefix = "component")
        private ClientElement fragment_;

        /** Page render support to get unique client side ids and generate links */
        @Environmental
        private PageRenderSupport renderSupport_;

        /** The heartbeat */
        @Environmental
        private Heartbeat heartbeat_;

        /**
         * Render the javascript call to deal with the radio button check/uncheck
         */
        void beginRender() {
                Runnable r = new Runnable() {
                        @SuppressWarnings("synthetic-access")
                        public void run() {
                                renderSupport_.addScript(
                                                "aplLinkRadioButtonToFormFragment('%s', '%s');",
                                                container_.getClientId(), fragment_.getClientId());
                        }
                };

                // Defer generating the script to ensure that the FormFragment has
                // rendered
                // and generated its client id.

                heartbeat_.defer(r);
        }
}

and the following bit of javascript:

function aplLinkRadioButtonToFormFragment(radio, form) {
        radio = $(radio);
        // Get the name on this radio button
        var allRadios = radio.form[radio.name];
        for (var i=0; i<allRadios.length; i++)
  allRadios[i].observe("click", function() {
                        $(form).formFragment.setVisible(radio.checked);
  });
}

There does not seem to be a different way but to listen for events on
all radio buttons in a radio group.

Cheers,

Adriaan

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: Form fragments and radio buttons

Howard Lewis Ship
This was fixed recently:

https://issues.apache.org/jira/browse/TAPESTRY-2261


On Fri, Apr 4, 2008 at 2:55 AM, Adriaan Joubert <[hidden email]> wrote:

> Hi,
>
>  I had an issue with triggering a form fragment with a radio button. I
>  came up with the following solution, and thought I'd share and ask for
>  comments - perhaps it is possible to come up with something that can
>  be included in Tapestry.
>
>  The .tml looks as follows:
>
>         <t:form t:id="create">
>                 <t:radiogroup t:id="createAction" value="action"
>                         encoder="actionEncoder">
>                         <t:radio t:id="copy" t:mixins="radiotriggerfragment"
>                                 fragment="copyfragment" />
>                         <t:label for="copy" />
>                         <t:radio t:id="new" />
>                         <t:label for="new" />
>                 </t:radiogroup>
>
>                 <t:formfragment t:id="copyfragment" visible="true">
>                         This is the copy form fragment
>                 </t:formfragment>
>         </t:form>
>
>  This required the following mixin (mostly a copy of TriggerFragment.java):
>
>  /**
>   * Deal with using a radio button to make a form fragment visible/invisible
>   */
>  public class RadioTriggerFragment {
>
>         /** The container for this mixin */
>         @InjectContainer
>         private Field container_;
>
>         /**
>          * The {@link org.apache.tapestry.corelib.components.FormFragment} instance
>          * to make dynamically visible or hidden.
>          */
>         @Parameter(name = "fragment", required = true, defaultPrefix = "component")
>         private ClientElement fragment_;
>
>         /** Page render support to get unique client side ids and generate links */
>         @Environmental
>         private PageRenderSupport renderSupport_;
>
>         /** The heartbeat */
>         @Environmental
>         private Heartbeat heartbeat_;
>
>         /**
>          * Render the javascript call to deal with the radio button check/uncheck
>          */
>         void beginRender() {
>                 Runnable r = new Runnable() {
>                         @SuppressWarnings("synthetic-access")
>                         public void run() {
>                                 renderSupport_.addScript(
>                                                 "aplLinkRadioButtonToFormFragment('%s', '%s');",
>                                                 container_.getClientId(), fragment_.getClientId());
>                         }
>                 };
>
>                 // Defer generating the script to ensure that the FormFragment has
>                 // rendered
>                 // and generated its client id.
>
>                 heartbeat_.defer(r);
>         }
>  }
>
>  and the following bit of javascript:
>
>  function aplLinkRadioButtonToFormFragment(radio, form) {
>         radio = $(radio);
>         // Get the name on this radio button
>         var allRadios = radio.form[radio.name];
>         for (var i=0; i<allRadios.length; i++)
>                 allRadios[i].observe("click", function() {
>                         $(form).formFragment.setVisible(radio.checked);
>                 });
>  }
>
>  There does not seem to be a different way but to listen for events on
>  all radio buttons in a radio group.
>
>  Cheers,
>
>  Adriaan
>
>  ---------------------------------------------------------------------
>  To unsubscribe, e-mail: [hidden email]
>  For additional commands, e-mail: [hidden email]
>
>



--
Howard M. Lewis Ship

Creator Apache Tapestry and Apache HiveMind

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]