You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Martin Makundi (JIRA)" <ji...@apache.org> on 2012/09/02 12:51:08 UTC
[jira] [Commented] (WICKET-3422) Simplified visibility control of
Enclosures in Ajax requests
[ https://issues.apache.org/jira/browse/WICKET-3422?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13446913#comment-13446913 ]
Martin Makundi commented on WICKET-3422:
----------------------------------------
See fix https://issues.apache.org/jira/browse/WICKET-3947
> Simplified visibility control of Enclosures in Ajax requests
> ------------------------------------------------------------
>
> Key: WICKET-3422
> URL: https://issues.apache.org/jira/browse/WICKET-3422
> Project: Wicket
> Issue Type: New Feature
> Components: wicket
> Affects Versions: 1.4.15
> Reporter: Joonas Hämäläinen
> Assignee: Juergen Donnerstag
> Labels: Ajax, AjaxRequestTarget, Enclosure, Visibility
> Fix For: 1.4.17
>
> Attachments: InlineAndAjaxifiedEnclosures_patch_R2.txt, InlineAndAjaxifiedEnclosures_R3.patch, wicket-3422.patch
>
>
> [Patch updated on 3/9/2011]
> Problem:
> -------------
> The amount of boilerplate code needed to create partitions of a web page that take their
> visibility setting from a controlling component in Ajax requests.
> "Changing the visibility of a child component in Ajax callback method will not affect the entire
> enclosure but just the child component itself. This is because only the child component is added
> to the AjaxRequestTarget."
> - https://cwiki.apache.org/WICKET/wickets-xhtml-tags.html
> Solution:
> -------------
> 1. InlineEnclosure tags, implemented as an attribute that can be attached to an arbitrary html tag.
> Works just like a regular Enclosure, but is Ajax ready.
> 2. When handling Ajax requests, InlineEnclosures that are controlled by Components already in the Ajax
> request target are automatically added to the Ajax request target.
> Example:
> ------------
> Below we have an ajax link: 'toggleLink' that is used to
> toggle the visibility of the component 'label1'. Since the
> label1 component happens to be the controlling child component
> of the enclosure, the visibility of the whole enclosure is toggled
> at the same time.
> Html:
> -------
> <a href="#" wicket:id="toggleLink">Toggle visibility</a>
> <div wicket:enclosure="controllingChild">
> The visibility of this text is also toggled.
> <div wicket:id="controllingChild">Test</div>
> </div>
> Here we have the 'inline' Enclosure tag:
> <div wicket:enclosure="controllingChild">
> Notice that no boilerplate code for this is necessary on the
> Java side. The tag can be an arbitrary html tag (but cannot
> simultaneously be another wicket tag, like WebMarkupContainer).
> If it does not yet have a wicket id (as in this example), a
> page-unique id will be generated for it (ex. inlineEnclosure-1).
> The handling of the child id attribute is identical to the handling
> of child id:s in traditional Wicket Enclosure tags.
> On Java side we only need to introduce the child object and some kind
> of control for the toggling of the visibility of the child object.
> Here an ajax link is used. When user clicks the link, the visibility
> of the entire Enclosure is toggled. Developer must also remember to
> set the outputmarkupId=true for the label, as usual for Ajaxified code.
> Nothing else is needed, the patch handles everything from here.
> Java:
> -------
> private Label label1 = new Label("controllingChild", "Test Label 1");
> private AjaxLink<Void> toggleLink;
> public MinimalAjaxEnclosurePage()
> {
> toggleLink = new AjaxLink<Void>("toggleLink"){
> @Override
> public void onClick(AjaxRequestTarget target)
> {
> label1.setVisible(!label1.isVisible());
> target.addComponent(label1);
> }
>
> };
> add(toggleLink);
> label1.setOutputMarkupId(true);
> add(label1);
> }
> Testing:
> ------------
> The patch can be tested with the new unit tests in
> src/test/java/org/apache/wicket/markup/html/internal
> - InlineEnclosureTest has tests for rendering of Inline enclosures in various situations:
> - chooses the correct child, whether or not child id is set
> - reuses existing wicket:id
> - works when nested with other inline Enclosures or traditional Wicket Enclosure tags
> - AjaxEnclosureTest has tests for toggling visibility of Inline enclosures by toggling
> the visibility of their controllers in Ajax requests:
> - only the correct child controls the enclosure, even when child id is not set
> - works with nested inline enclosures
> - TogglePageTests has tests for toggling visibility in ajax/non ajax situations, and where
> there are more than one targets in one ajax request
> Changes to Wicket code:
> -----------------------------------
> - InlineEnclosureHandler:
> - Recognizes inline enclosures by their attribute (wicket:enclosure) and gives them
> a session-unique id. The id is also written directly to the underlying Xml-tag.
> - EnclosureResolver:
> - recognizes an inline Enclosure tag and creates an InlineEnclosure instance for it
> - Enclosure:
> - getEnclosureParent() visibility changed to protected, to enable access from extending
> InlineEnclosure class.
> - InlineEnclosure:
> - implements onAfterRenderChildren, notifying child objects stored in the onComponentTagBody phase
> - new method: updateVisibility(), used in Ajax calls to update the visibility of the enclosure with the
> visibility of it's controlling child object
> - new method: getChildId(), used in Ajax calls to get the child's id so it can be compared to the id of components
> added to the Ajax target
> - MarkupParser:
> - Appended InlineEnclosureHandler to the list of filters.
> - MarkupContainer
> - prevented removing InlineEnclosures at the time of detach.
> - WebApplication:
> - newAjaxRequestTarget: Adds a new listener: AjaxEnclosureListener
> - AjaxEnclosureListener (new class) (implementing AjaxRequestTarget.IListener)
> - onBeforeRespond: searches the Page for those InlineEnclosures that have their
> child controllers added to Ajax Request target, and adds them to the target as well.
> - Also sets these values to the found InlineEnclosures to help with ajax updates:
> - setOutputMarkupPlaceholderTag=true
> - setMarkupId=[id generated in InlineEnclosureHandler]
> - New tests:
> - src/test/java/org/apache/wicket/markup/html/internal:
> - AjaxEnclosurePage_*.html / .java : test pages for AjaxEnclosureTests.java
> - InlineEnclosurePage_*.html / .java : test pages for InlineEnclosureTest.java
> - SimplePanel2.html / .java : test page for InlineEnclosureTest.java
> - InlineEnclosurePanelPage.html / .java : test page for InlineEnclosureTest.java
> - FullReloadPage.html / .java, : test pages for TogglePageTests.java
> InlineEnclosureAjaxPage.html / .java
> InlineEnclosureWithAdditionalAjaxTargetPage.html / .java
> TraditionalEnclosureAjaxPage.html /.java
> - DefaultMarkupCacheKeyProvider: (Fixed a bug?)
> - Added a missing dot prefixing the file-extension.
> - Not directly related to the issue, but many wicket unit tests were failing without this change.
>
> Thanks for support:
> --------------------------
> Martin Makundi
> Igor Vaynberg
> Jeremy Thomerson
> Juergen Donnerstag
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira