This is an automated email from the ASF dual-hosted git repository. lukaszlenart pushed a commit to branch WW-5129-dynamic-attributes in repository https://gitbox.apache.org/repos/asf/struts.git
commit 7403de84a1972a608863d15b37b19e49a632d912 Author: Lukasz Lenart <lukaszlen...@apache.org> AuthorDate: Mon Jul 5 07:47:34 2021 +0200 WW-5129 Supports dynamic attributes in second control --- .../resources/template/simple/doubleselect.ftl | 5 ++- .../template/simple/dynamic-attributes.ftl | 24 ++++++++--- .../template/simple/inputtransferselect.ftl | 8 ++-- .../template/simple/optiontransferselect.ftl | 3 ++ ...ributes.ftl => prefixed-dynamic-attributes.ftl} | 16 ++++--- core/src/main/resources/template/simple/select.ftl | 4 +- .../struts2/views/jsp/ui/DoubleSelectTest.java | 11 ++++- .../views/jsp/ui/InputTransferSelectTagTest.java | 32 +++++++++++--- .../views/jsp/ui/OptionTransferSelectTagTest.java | 32 ++++++++++++++ .../apache/struts2/views/jsp/ui/DoubleSelect-5.txt | 39 +++++++++++++++++ .../struts2/views/jsp/ui/inputtransferselect-2.txt | 30 +++++++++++++ .../views/jsp/ui/optiontransferselect-8.txt | 50 ++++++++++++++++++++++ 12 files changed, 228 insertions(+), 26 deletions(-) diff --git a/core/src/main/resources/template/simple/doubleselect.ftl b/core/src/main/resources/template/simple/doubleselect.ftl index 67aafee..039e142 100644 --- a/core/src/main/resources/template/simple/doubleselect.ftl +++ b/core/src/main/resources/template/simple/doubleselect.ftl @@ -18,6 +18,7 @@ * under the License. */ --> +<#global dynamic_attributes_ignore = "second-"/> <#include "/${parameters.templateDir}/simple/select.ftl" /> <#assign startCount = 0/> <#if parameters.headerKey?? && parameters.headerValue??> @@ -60,6 +61,8 @@ <#if parameters.doubleDisabled!false> disabled="disabled"<#rt/> </#if> +<#include "/${parameters.templateDir}/${parameters.expandTheme}/prefixed-dynamic-attributes.ftl" /> +<@prefixedDynamicAttributes prefix="second-"/> > </select> <#if parameters.doubleMultiple!false> @@ -190,4 +193,4 @@ ${parameters.id}Temp.options[0].selected = true; } } -</script> \ No newline at end of file +</script> diff --git a/core/src/main/resources/template/simple/dynamic-attributes.ftl b/core/src/main/resources/template/simple/dynamic-attributes.ftl index 7823159..fe82ac6 100644 --- a/core/src/main/resources/template/simple/dynamic-attributes.ftl +++ b/core/src/main/resources/template/simple/dynamic-attributes.ftl @@ -21,12 +21,24 @@ <#if (parameters.dynamicAttributes?? && parameters.dynamicAttributes?size > 0)><#rt/> <#assign aKeys = parameters.dynamicAttributes.keySet()><#rt/> <#list aKeys as aKey><#rt/> - <#assign keyValue = parameters.dynamicAttributes.get(aKey)/> - <#if keyValue?is_string> - <#assign value = struts.translateVariables(keyValue)!keyValue/> - <#else> - <#assign value = keyValue?string/> - </#if> +<#if dynamic_attributes_ignore??> +<#if !aKey?starts_with(dynamic_attributes_ignore)> +<#assign keyValue = parameters.dynamicAttributes.get(aKey)/> +<#if keyValue?is_string> + <#assign value = struts.translateVariables(keyValue)!keyValue/> +<#else> + <#assign value = keyValue?string/> +</#if> ${aKey}="${value}"<#rt/> +</#if> +<#else> +<#assign keyValue = parameters.dynamicAttributes.get(aKey)/> +<#if keyValue?is_string> + <#assign value = struts.translateVariables(keyValue)!keyValue/> +<#else> + <#assign value = keyValue?string/> +</#if> + ${aKey}="${value}"<#rt/> +</#if> </#list><#rt/> </#if><#rt/> diff --git a/core/src/main/resources/template/simple/inputtransferselect.ftl b/core/src/main/resources/template/simple/inputtransferselect.ftl index a9258dd..7684a09 100644 --- a/core/src/main/resources/template/simple/inputtransferselect.ftl +++ b/core/src/main/resources/template/simple/inputtransferselect.ftl @@ -29,7 +29,6 @@ <label for="leftTitle">${parameters.leftTitle}</label><br /> </#if><#t/> - <input type="text"<#rt/> name="${parameters.name!""}_input"<#rt/> <#if parameters.disabled!false> @@ -55,6 +54,8 @@ </#if> <#include "/${parameters.templateDir}/${parameters.expandTheme}/scripting-events.ftl" /> <#include "/${parameters.templateDir}/${parameters.expandTheme}/common-attributes.ftl" /> +<#include "/${parameters.templateDir}/${parameters.expandTheme}/prefixed-dynamic-attributes.ftl" /> +<@prefixedDynamicAttributes prefix="input-"/> /> @@ -94,9 +95,10 @@ <#if parameters.rightTitle?has_content><#t/> <label for="rightTitle">${parameters.rightTitle}</label><br /> </#if><#t/> +<#global dynamic_attributes_ignore = "input-"/> <#include "/${parameters.templateDir}/simple/select.ftl" /> <#if parameters.allowUpDown!true> -<input type="button" +<input type="button" <#if parameters.headerKey?has_content> onclick="moveOptionDown(document.getElementById('${parameters.id}'), 'key', '${parameters.headerKey}');" <#else> @@ -106,7 +108,7 @@ value="${parameters.downLabel}" </#if> /> -<input type="button" +<input type="button" <#if parameters.headerKey?has_content> onclick="moveOptionUp(document.getElementById('${parameters.id}'), 'key', '${parameters.headerKey}');" <#else> diff --git a/core/src/main/resources/template/simple/optiontransferselect.ftl b/core/src/main/resources/template/simple/optiontransferselect.ftl index e0d00ee..36d4ca3 100644 --- a/core/src/main/resources/template/simple/optiontransferselect.ftl +++ b/core/src/main/resources/template/simple/optiontransferselect.ftl @@ -28,6 +28,7 @@ <#if parameters.leftTitle??><#t/> <label for="leftTitle">${parameters.leftTitle}</label><br /> </#if><#t/> +<#global dynamic_attributes_ignore = "right-"/> <#include "/${parameters.templateDir}/simple/select.ftl" /> <#if parameters.allowUpDownOnLeft!true> <input type="button" @@ -247,6 +248,8 @@ <#if parameters.doubleAccesskey??><#t/> accesskey="<#outputformat 'JavaScript'>${parameters.doubleAccesskey}</#outputformat>" </#if> + <#include "/${parameters.templateDir}/${parameters.expandTheme}/prefixed-dynamic-attributes.ftl" /> + <@prefixedDynamicAttributes prefix="right-"/> > <#if parameters.doubleHeaderKey?? && parameters.doubleHeaderValue??><#t/> <option value="${parameters.doubleHeaderKey}">${parameters.doubleHeaderValue}</option> diff --git a/core/src/main/resources/template/simple/dynamic-attributes.ftl b/core/src/main/resources/template/simple/prefixed-dynamic-attributes.ftl similarity index 77% copy from core/src/main/resources/template/simple/dynamic-attributes.ftl copy to core/src/main/resources/template/simple/prefixed-dynamic-attributes.ftl index 7823159..68f2ea6 100644 --- a/core/src/main/resources/template/simple/dynamic-attributes.ftl +++ b/core/src/main/resources/template/simple/prefixed-dynamic-attributes.ftl @@ -18,15 +18,19 @@ * under the License. */ --> +<#macro prefixedDynamicAttributes prefix> <#if (parameters.dynamicAttributes?? && parameters.dynamicAttributes?size > 0)><#rt/> <#assign aKeys = parameters.dynamicAttributes.keySet()><#rt/> <#list aKeys as aKey><#rt/> - <#assign keyValue = parameters.dynamicAttributes.get(aKey)/> - <#if keyValue?is_string> - <#assign value = struts.translateVariables(keyValue)!keyValue/> - <#else> - <#assign value = keyValue?string/> - </#if> +<#if aKey?starts_with(prefix)> +<#assign keyValue = parameters.dynamicAttributes.get(aKey)/> +<#if keyValue?is_string> + <#assign value = struts.translateVariables(keyValue)!keyValue/> +<#else> + <#assign value = keyValue?string/> +</#if> ${aKey}="${value}"<#rt/> +</#if> </#list><#rt/> </#if><#rt/> +</#macro> diff --git a/core/src/main/resources/template/simple/select.ftl b/core/src/main/resources/template/simple/select.ftl index e096cb7..7e90c80 100644 --- a/core/src/main/resources/template/simple/select.ftl +++ b/core/src/main/resources/template/simple/select.ftl @@ -68,7 +68,7 @@ <#assign itemKeyStr = stack.findString('top')> </#if> <#if parameters.listValueKey??> - <#-- checks the valueStack for the 'valueKey.' The valueKey is then looked-up in the locale file for it's + <#-- checks the valueStack for the 'valueKey.' The valueKey is then looked-up in the locale file for it's localized value. This is then used as a label --> <#assign valueKey = stack.findString(parameters.listValueKey)!'' /> <#if valueKey?has_content> @@ -139,7 +139,7 @@ <#if ( !parameters.id?? && !parameters.name??)> <input type="hidden" id="" name="" value="" <#rt/> </#if> - + <#if parameters.disabled!false> disabled="disabled"<#rt/> </#if> diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/DoubleSelectTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/DoubleSelectTest.java index 536a5d9..7515576 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/ui/DoubleSelectTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/DoubleSelectTest.java @@ -287,6 +287,15 @@ public class DoubleSelectTest extends AbstractUITagTest { verifyGenericProperties(tag, "simple", new String[]{"value"}); } + public void testGenericSimpleWithDynamicAttributes() throws Exception { + DoubleSelectTag tag = new DoubleSelectTag(); + tag.setDynamicAttribute(null, "first-name", "firstName"); + tag.setDynamicAttribute(null, "second-name", "secondName"); + prepareTagGeneric(tag); + verifyGenericProperties(tag, "simple", new String[]{"value"}); + verify(SelectTag.class.getResource("DoubleSelect-5.txt")); + } + public void testGenericXhtml() throws Exception { DoubleSelectTag tag = new DoubleSelectTag(); prepareTagGeneric(tag); @@ -379,4 +388,4 @@ public class DoubleSelectTest extends AbstractUITagTest { return key; } } -} \ No newline at end of file +} diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/InputTransferSelectTagTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/InputTransferSelectTagTest.java index ee60cd8..44ec403 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/ui/InputTransferSelectTagTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/InputTransferSelectTagTest.java @@ -18,19 +18,16 @@ */ package org.apache.struts2.views.jsp.ui; -import org.apache.struts2.views.jsp.AbstractUITagTest; import org.apache.struts2.TestAction; +import org.apache.struts2.views.jsp.AbstractUITagTest; -import java.util.List; import java.util.ArrayList; +import java.util.List; -/** - * - */ public class InputTransferSelectTagTest extends AbstractUITagTest { public void testWithRequired() throws Exception { - List list = new ArrayList(); + List<String> list = new ArrayList<>(); list.add("Item One"); list.add("Item Two"); @@ -47,7 +44,28 @@ public class InputTransferSelectTagTest extends AbstractUITagTest { tag.doStartTag(); tag.doEndTag(); - //System.out.println(writer.toString()); verify(InputTransferSelectTagTest.class.getResource("inputtransferselect-1.txt")); } + + public void testDynamicAttributes() throws Exception { + List<String> list = new ArrayList<>(); + list.add("Item One"); + list.add("Item Two"); + + TestAction testaction = (TestAction) action; + testaction.setCollection(list); + + InputTransferSelectTag tag = new InputTransferSelectTag(); + tag.setPageContext(pageContext); + tag.setDynamicAttribute(null, "input-name", "inputName"); + tag.setDynamicAttribute(null, "collection-name", "collectionName"); + + tag.setName("collection"); + tag.setList("collection"); + + tag.doStartTag(); + tag.doEndTag(); + + verify(InputTransferSelectTagTest.class.getResource("inputtransferselect-2.txt")); + } } diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/OptionTransferSelectTagTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/OptionTransferSelectTagTest.java index d7e8bb1..0aec5a1 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/ui/OptionTransferSelectTagTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/OptionTransferSelectTagTest.java @@ -525,4 +525,36 @@ public class OptionTransferSelectTagTest extends AbstractUITagTest { //System.out.println(writer.toString()); verify(OptionTransferSelectTagTest.class.getResource("optiontransferselect-7.txt")); } + + public void testDynamicAttributes() throws Exception { + List left = new ArrayList(); + left.add("Left1"); + left.add("Left2"); + + List right = new ArrayList(); + right.add("Right1"); + right.add("Right2"); + + TestAction testaction = (TestAction) action; + testaction.setCollection(left); + testaction.setList2(right); + + OptionTransferSelectTag tag = new OptionTransferSelectTag(); + tag.setPageContext(pageContext); + + tag.setName("collection"); + tag.setList("collection"); + + tag.setDoubleName("list2"); + tag.setDoubleList("list2"); + + tag.setDynamicAttribute(null, "left-name", "leftName"); + tag.setDynamicAttribute(null, "right-name", "rightName"); + + tag.doStartTag(); + tag.doEndTag(); + + //System.out.println(writer.toString()); + verify(OptionTransferSelectTagTest.class.getResource("optiontransferselect-8.txt")); + } } diff --git a/core/src/test/resources/org/apache/struts2/views/jsp/ui/DoubleSelect-5.txt b/core/src/test/resources/org/apache/struts2/views/jsp/ui/DoubleSelect-5.txt new file mode 100644 index 0000000..23cf7f2 --- /dev/null +++ b/core/src/test/resources/org/apache/struts2/views/jsp/ui/DoubleSelect-5.txt @@ -0,0 +1,39 @@ +<select name="someName" disabled="disabled" tabindex="99" id="someId" class="cssClass1" style="cssStyle1" + title="someTitle" onclick="onclick1" ondblclick="ondblclick1" onmousedown="onmousedown1" onmouseup="onmouseup1" + onmouseover="onmouseover1" onmousemove="onmousemove1" onmouseout="onmouseout1" onfocus="onfocus1" onblur="onblur1" + onkeypress="onkeypress1" onkeydown="onkeydown1" onkeyup="onkeyup1" onselect="onchange" + onchange="someIdRedirect(this.selectedIndex)" first-name="firstName"> + <option value="BE">Belgium</option> + <option value="FR" selected="selected">France</option> +</select> +<br /> +<select name="region" disabled="disabled" id="region" title="someTitle" second-name="secondName"></select> +<script type="text/javascript"> + var someIdGroup = newArray(2 + 0); + for (var i = 0; i < (2 + 0); i++) { + someIdGroup[i] = []; + } + someIdGroup[0][0] = newOption("Antwerp", "AN"); + someIdGroup[0][1] = newOption("Gent", "GN"); + someIdGroup[0][2] = newOption("Brugge", "BRG"); + someIdGroup[1][0] = newOption("Paris", "PA"); + someIdGroup[1][1] = newOption("Bordeaux", "BOR"); + var someIdTemp = document.inputForm.region; + someIdRedirect(1); + function someIdRedirect(x) { + var selected = false; + for (var m = someIdTemp.options.length - 1; m >= 0; m--) { + someIdTemp.remove(m); + } + for (var i = 0; i < someIdGroup[x].length; i++) { + someIdTemp.options[i] = newOption(someIdGroup[x][i].text, someIdGroup[x][i].value); + if (someIdTemp.options[i].value == 'BOR') { + someIdTemp.options[i].selected = true; + selected = true; + } + } + if ((someIdTemp.options.length > 0) && (!selected)) { + someIdTemp.options[0].selected = true; + } + } +</script> diff --git a/core/src/test/resources/org/apache/struts2/views/jsp/ui/inputtransferselect-2.txt b/core/src/test/resources/org/apache/struts2/views/jsp/ui/inputtransferselect-2.txt new file mode 100644 index 0000000..264fb6b --- /dev/null +++ b/core/src/test/resources/org/apache/struts2/views/jsp/ui/inputtransferselect-2.txt @@ -0,0 +1,30 @@ +<tr> + <td class="tdLabel"></td> + <td class="tdInput"> + <script type="text/javascript" src="/struts/inputtransferselect.js"></script> + <table> + <tr> + <td><input type="text" name="collection_input" id="collection_input" input-name="inputName"/></td> + <td class="tdTransferSelect"> + <input type="button" value="->" + onclick="addOption(document.getElementById('collection_input'),document.getElementById('collection'))" /> + <br /><br /> + <input type="button" value="<-" onclick="removeOptions(document.getElementById('collection'))" /> + <br /><br /> + <input type="button" value="<<--" onclick="removeAllOptions(document.getElementById('collection'))" /> + <br /> + <br /> + </td> + <td> + <select name="collection" size="5" id="collection" multiple="multiple" collection-name="collectionName"> + <option value="ItemOne" selected="selected">ItemOne</option> + <option value="ItemTwo" selected="selected">ItemTwo</option> + </select> + <input type="hidden" id="__multiselect_collection" name="__multiselect_collection" value="" /> + <input type="button" onclick="moveOptionDown(document.getElementById('collection'),'key','');" value="v" /> + <input type="button" onclick="moveOptionUp(document.getElementById('collection'),'key','');" value="^" /> + </td> + </tr> + </table> + </td> +</tr> diff --git a/core/src/test/resources/org/apache/struts2/views/jsp/ui/optiontransferselect-8.txt b/core/src/test/resources/org/apache/struts2/views/jsp/ui/optiontransferselect-8.txt new file mode 100644 index 0000000..06cfd1c --- /dev/null +++ b/core/src/test/resources/org/apache/struts2/views/jsp/ui/optiontransferselect-8.txt @@ -0,0 +1,50 @@ +<tr> + <td class="tdLabel"></td> + <td class="tdInput"> + <script type="text/javascript" src="/struts/optiontransferselect.js"></script> + <table> + <tr> + <td> + <select name="collection" size="15" id="collection" multiple="multiple" left-name="leftName"> + <option value="Left1" selected="selected">Left1</option> + <option value="Left2" selected="selected">Left2</option> + </select> + <input type="hidden" id="__multiselect_collection" name="__multiselect_collection" value="" /> + <input type="button" onclick="moveOptionDown(document.getElementById('collection'),'key',''); " value="v" /> + <input type="button" onclick="moveOptionUp(document.getElementById('collection'),'key',''); " value="^" /> + </td> + <td class="tdTransferSelect"> + <input type="button" value="<-" + onclick="moveSelectedOptions(document.getElementById('list2'),document.getElementById('collection'),false,'');" /> + <br /> + <br /> + <input type="button" value="->" + onclick="moveSelectedOptions(document.getElementById('collection'),document.getElementById('list2'),false,'');" /> + <br /> + <br /> + <input type="button" value="<<--" + onclick="moveAllOptions(document.getElementById('list2'),document.getElementById('collection'),false,'');" /> + <br /> + <br /> + <input type="button" value="-->>" + onclick="moveAllOptions(document.getElementById('collection'),document.getElementById('list2'),false,'');" /> + <br /> + <br /> + <input type="button" value="<*>" + onclick="selectAllOptions(document.getElementById('collection'));selectAllOptions(document.getElementById('list2'));" /> + <br /> + <br /> + </td> + <td> + <select name="list2" size="15" multiple="multiple" id="list2" right-name="rightName"> + <option value="Right1" selected="selected">Right1</option> + <option value="Right2" selected="selected">Right2</option> + </select> + <input type="hidden" id="__multiselect_list2" name="__multiselect_list2" value="" /> + <input type="button" onclick="moveOptionDown(document.getElementById('list2'),'key','');" value="v" /> + <input type="button" onclick="moveOptionUp(document.getElementById('list2'),'key','');" value="^" /> + </td> + </tr> + </table> + </td> +</tr>