Author: rgielen Date: Mon Aug 13 01:18:07 2007 New Revision: 565265 URL: http://svn.apache.org/viewvc?view=rev&rev=565265 Log: WW-2108: Make <s:tabbedpanel> being able to remember last selected tab using a cookie
Added: struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/views/jsp/ui/TabbedPanelTagTest.java Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/TabbedPanel.java struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/jsp/ui/TabbedPanelTag.java struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/template/simple/tabbedpanel.ftl struts/struts2/branches/STRUTS_2_0_X/core/src/site/resources/tags/tabbedPanel.html struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-1.txt struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-2.txt struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-3.txt Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/TabbedPanel.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/TabbedPanel.java?view=diff&rev=565265&r1=565264&r2=565265 ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/TabbedPanel.java (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/TabbedPanel.java Mon Aug 13 01:18:07 2007 @@ -32,6 +32,11 @@ * <!-- START SNIPPET: javadoc --> * The tabbedpanel widget is primarily an AJAX component, where each tab can either be local content or remote * content (refreshed each time the user selects that tab).</p> + * If the useSelectedTabCookie attribute is set to true, the id of the selected tab is saved in a cookie on activation. + * When coming back to this view, the cookie is read and the tab will be activated again, unless an actual value for the + * selectedTab attribute is specified.</p> + * If you want to use the cookie feature, please be sure that you provide a unique id for your tabbedpanel component, + * since this will also be the identifying name component of the stored cookie.</p> * <!-- END SNIPPET: javadoc --> * * <p/> <b>Examples</b> @@ -67,6 +72,7 @@ protected String closeButton; protected String doLayout ; protected String templateCssPath; + protected String useSelectedTabCookie; public TabbedPanel(ValueStack stack, HttpServletRequest request, HttpServletResponse response) { super(stack, request, response); @@ -92,6 +98,9 @@ } if(templateCssPath != null) addParameter("templateCssPath", findString(templateCssPath)); + if(useSelectedTabCookie != null) { + addParameter("useSelectedTabCookie", findString(useSelectedTabCookie)); + } } public String getDefaultOpenTemplate() { @@ -131,5 +140,12 @@ @StrutsTagAttribute(description="Template css path") public void setTemplateCssPath(String templateCssPath) { this.templateCssPath = templateCssPath; + } + + @StrutsTagAttribute(required = false, defaultValue = "false", description = "If set to true, the id of the last selected " + + "tab will be stored in cookie. If the view is rendered, it will be tried to read this cookie and activate " + + "the corresponding tab on success, unless overridden by the selectedTab attribute. The cookie name is \"Struts2TabbedPanel_selectedTab_\"+id.") + public void setUseSelectedTabCookie( String useSelectedTabCookie ) { + this.useSelectedTabCookie = useSelectedTabCookie; } } Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/jsp/ui/TabbedPanelTag.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/jsp/ui/TabbedPanelTag.java?view=diff&rev=565265&r1=565264&r2=565265 ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/jsp/ui/TabbedPanelTag.java (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/jsp/ui/TabbedPanelTag.java Mon Aug 13 01:18:07 2007 @@ -39,6 +39,7 @@ private String closeButton; private String doLayout; private String templateCssPath; + private String useSelectedTabCookie; public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) { return new TabbedPanel(stack, req, res); @@ -52,6 +53,7 @@ tabbedPanel.setDoLayout(doLayout); tabbedPanel.setLabelposition(labelPosition); tabbedPanel.setTemplateCssPath(templateCssPath); + tabbedPanel.setUseSelectedTabCookie(useSelectedTabCookie); } public void setSelectedTab(String selectedTab) { @@ -68,5 +70,9 @@ public void setTemplateCssPath(String templateCssPath) { this.templateCssPath = templateCssPath; + } + + public void setUseSelectedTabCookie( String useSelectedTabCookie ) { + this.useSelectedTabCookie = useSelectedTabCookie; } } Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/template/simple/tabbedpanel.ftl URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/template/simple/tabbedpanel.ftl?view=diff&rev=565265&r1=565264&r2=565265 ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/template/simple/tabbedpanel.ftl (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/template/simple/tabbedpanel.ftl Mon Aug 13 01:18:07 2007 @@ -24,6 +24,27 @@ dojo.require("dojo.widget.TabContainer"); dojo.require("dojo.widget.LinkPane"); dojo.require("dojo.widget.ContentPane"); + <#if parameters.useSelectedTabCookie?exists && parameters.useSelectedTabCookie=="true"> + dojo.require("dojo.io.cookie"); + dojo.addOnLoad ( + function() { + var tabContainer = dojo.widget.byId("${parameters.escapedId?html}"); + + <#if !(parameters.selectedTab?if_exists != "")> + var selectedTab = dojo.io.cookie.getCookie("Struts2TabbedPanel_selectedTab_${parameters.escapedId?html}"); + if (selectedTab) { + tabContainer.selectChild(selectedTab, tabContainer.correspondingPageButton); + } + + </#if> + dojo.event.connect(tabContainer, "selectChild", + function (evt) { + dojo.io.cookie.setCookie("Struts2TabbedPanel_selectedTab_${parameters.escapedId?html}", evt.widgetId, 1, null, null, null); + } + ) + } + ); + </#if> </script> <div dojoType="TabContainer" Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/site/resources/tags/tabbedPanel.html URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/site/resources/tags/tabbedPanel.html?view=diff&rev=565265&r1=565264&r2=565265 ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/site/resources/tags/tabbedPanel.html (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/site/resources/tags/tabbedPanel.html Mon Aug 13 01:18:07 2007 @@ -324,6 +324,14 @@ <td align="left" valign="top">Set the tooltip configuration</td> </tr> <tr> + <td align="left" valign="top">useSelectedTabCookie</td> + <td align="left" valign="top">false</td> + <td align="left" valign="top">false</td> + <td align="left" valign="top">true</td> + <td align="left" valign="top">String</td> + <td align="left" valign="top">If set to true, the id of the last selected tab will be stored in cookie. If the view is rendered, it will be tried to read this cookie and activate the corresponding tab on success, unless overridden by the selectedTab attribute. The cookie name is "Struts2TabbedPanel_selectedTab_"+id.</td> + </tr> + <tr> <td align="left" valign="top">value</td> <td align="left" valign="top">false</td> <td align="left" valign="top"></td> Added: struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/views/jsp/ui/TabbedPanelTagTest.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/views/jsp/ui/TabbedPanelTagTest.java?view=auto&rev=565265 ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/views/jsp/ui/TabbedPanelTagTest.java (added) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/views/jsp/ui/TabbedPanelTagTest.java Mon Aug 13 01:18:07 2007 @@ -0,0 +1,68 @@ +/* + * $Id$ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.struts2.views.jsp.ui; + +import org.apache.struts2.views.jsp.AbstractUITagTest; + +/** + * TabbedPanelTagTest. + */ +public class TabbedPanelTagTest extends AbstractUITagTest { + + public void testSimple() throws Exception { + TabbedPanelTag tag = new TabbedPanelTag(); + tag.setPageContext(pageContext); + + tag.doStartTag(); + tag.doEndTag(); + + verify(TabbedPanelTag.class.getResource("TabbedPanel-1.txt")); + + } + + public void testCookieCodeAvailable() throws Exception { + TabbedPanelTag tag = new TabbedPanelTag(); + tag.setPageContext(pageContext); + tag.setId("foo"); + tag.setUseSelectedTabCookie("true"); + + tag.doStartTag(); + tag.doEndTag(); + + verify(TabbedPanelTag.class.getResource("TabbedPanel-2.txt")); + + } + + public void testCookieCodeAvailableWithOverriddenSelectedTab() throws Exception { + TabbedPanelTag tag = new TabbedPanelTag(); + tag.setPageContext(pageContext); + tag.setId("foo"); + tag.setUseSelectedTabCookie("true"); + tag.setSelectedTab("bar"); + + tag.doStartTag(); + tag.doEndTag(); + + verify(TabbedPanelTag.class.getResource("TabbedPanel-3.txt")); + + } + +} Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-1.txt URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-1.txt?view=diff&rev=565265&r1=565264&r2=565265 ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-1.txt (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-1.txt Mon Aug 13 01:18:07 2007 @@ -1,12 +1,9 @@ <script type="text/javascript"> - dojo.require("dojo.widget.TabContainer"); - dojo.require("dojo.widget.LinkPane"); - dojo.require("dojo.widget.ContentPane"); +dojo.require("dojo.widget.TabContainer"); +dojo.require("dojo.widget.LinkPane"); +dojo.require("dojo.widget.ContentPane"); </script> <div - dojoType="TabContainer" - selectedTab="a" - labelPosition="b" - closeButton="c" - doLayout="true"> -</div> \ No newline at end of file + dojoType="TabContainer" + doLayout="false"> +</div> Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-2.txt URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-2.txt?view=diff&rev=565265&r1=565264&r2=565265 ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-2.txt (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-2.txt Mon Aug 13 01:18:07 2007 @@ -1,9 +1,19 @@ <script type="text/javascript"> - dojo.require("dojo.widget.TabContainer"); - dojo.require("dojo.widget.LinkPane"); - dojo.require("dojo.widget.ContentPane"); +dojo.require("dojo.widget.TabContainer"); +dojo.require("dojo.widget.LinkPane"); +dojo.require("dojo.widget.ContentPane"); +dojo.require("dojo.io.cookie"); +dojo.addOnLoad(function(){ + var tabContainer=dojo.widget.byId("foo"); + var selectedTab=dojo.io.cookie.getCookie("Struts2TabbedPanel_selectedTab_foo"); + if( selectedTab ){ + tabContainer.selectChild(selectedTab,tabContainer.correspondingPageButton); + } + dojo.event.connect(tabContainer,"selectChild",function(evt){ + dojo.io.cookie.setCookie("Struts2TabbedPanel_selectedTab_foo",evt.widgetId,1,null,null,null); + } + ) +}); </script> -<div - dojoType="TabContainer" - doLayout="false"> +<div dojoType="TabContainer" id="foo" doLayout="false"> </div> Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-3.txt URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-3.txt?view=diff&rev=565265&r1=565264&r2=565265 ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-3.txt (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/test/resources/org/apache/struts2/views/jsp/ui/TabbedPanel-3.txt Mon Aug 13 01:18:07 2007 @@ -1,10 +1,15 @@ <script type="text/javascript"> - dojo.require("dojo.widget.TabContainer"); - dojo.require("dojo.widget.LinkPane"); - dojo.require("dojo.widget.ContentPane"); +dojo.require("dojo.widget.TabContainer"); +dojo.require("dojo.widget.LinkPane"); +dojo.require("dojo.widget.ContentPane"); +dojo.require("dojo.io.cookie"); +dojo.addOnLoad(function(){ + var tabContainer=dojo.widget.byId("foo"); + dojo.event.connect(tabContainer,"selectChild",function(evt){ + dojo.io.cookie.setCookie("Struts2TabbedPanel_selectedTab_foo",evt.widgetId,1,null,null,null); + } + ) +}); </script> -<div - dojoType="TabContainer" - labelPosition="right-h" - doLayout="true"> +<div dojoType="TabContainer" id="foo" selectedTab="bar" doLayout="false"> </div>