This is an automated email from the ASF dual-hosted git repository. danwatford pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git
commit a4157641e3571aa49d2eed303d70a5edc7dea649 Author: Daniel Watford <dan...@watfordconsulting.com> AuthorDate: Tue Oct 4 09:40:59 2022 +0100 Improved: MacroFormRenderer refactoring of textarea fields (OFBIZ-12125) Part of the OFBIZ-11456 MacroFormRenderer refactoring effort. Rather than MacroFormRenderer producing and evaulating FTL strings, it now uses RenderableFtlElementsBuilder to create RenderableFtlMacroCall objects which are then passed to an FtlWriter for evaluation. --- .../widget/renderer/macro/MacroFormRenderer.java | 85 +--------------------- .../macro/RenderableFtlFormElementsBuilder.java | 70 ++++++++++++++++++ .../macro/renderable/RenderableFtlMacroCall.java | 4 + .../renderer/macro/MacroFormRendererTest.java | 18 ++--- .../RenderableFtlFormElementsBuilderTest.java | 51 +++++++++++++ 5 files changed, 134 insertions(+), 94 deletions(-) diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java index bc995cdd00..89d917edd9 100644 --- a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java +++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRenderer.java @@ -245,88 +245,9 @@ public final class MacroFormRenderer implements FormStringRenderer { @Override public void renderTextareaField(Appendable writer, Map<String, Object> context, TextareaField textareaField) { - ModelFormField modelFormField = textareaField.getModelFormField(); - String name = modelFormField.getParameterName(context); - String cols = Integer.toString(textareaField.getCols()); - String rows = Integer.toString(textareaField.getRows()); - String id = modelFormField.getCurrentContainerId(context); - String className = ""; - String alert = "false"; - if (UtilValidate.isNotEmpty(modelFormField.getWidgetStyle())) { - className = modelFormField.getWidgetStyle(); - if (modelFormField.shouldBeRed(context)) { - alert = "true"; - } - } - //check for required field style on single forms - if (shouldApplyRequiredField(modelFormField)) { - String requiredStyle = modelFormField.getRequiredFieldStyle(); - if (UtilValidate.isEmpty(requiredStyle)) { - requiredStyle = "required"; - } - if (UtilValidate.isEmpty(className)) { - className = requiredStyle; - } else { - className = requiredStyle + " " + className; - } - } - String visualEditorEnable = ""; - String buttons = ""; - if (textareaField.getVisualEditorEnable()) { - visualEditorEnable = "true"; - buttons = textareaField.getVisualEditorButtons(context); - if (UtilValidate.isEmpty(buttons)) { - buttons = "maxi"; - } - } - String readonly = ""; - if (textareaField.isReadOnly()) { - readonly = "readonly"; - } - Map<String, Object> userLogin = UtilGenerics.cast(context.get("userLogin")); - String language = "en"; - if (userLogin != null) { - language = UtilValidate.isEmpty((String) userLogin.get("lastLocale")) ? "en" : (String) userLogin.get("lastLocale"); - } - String maxlength = ""; - if (textareaField.getMaxlength() != null) { - maxlength = Integer.toString(textareaField.getMaxlength()); - } - String tabindex = modelFormField.getTabindex(); - String value = modelFormField.getEntry(context, textareaField.getDefaultValue(context)); - boolean disabled = modelFormField.getDisabled(context); - StringWriter sr = new StringWriter(); - sr.append("<@renderTextareaField "); - sr.append("name=\""); - sr.append(name); - sr.append("\" className=\""); - sr.append(className); - sr.append("\" alert=\""); - sr.append(alert); - sr.append("\" value=\""); - sr.append(value); - sr.append("\" cols=\""); - sr.append(cols); - sr.append("\" rows=\""); - sr.append(rows); - sr.append("\" maxlength=\""); - sr.append(maxlength); - sr.append("\" id=\""); - sr.append(id); - sr.append("\" readonly=\""); - sr.append(readonly); - sr.append("\" visualEditorEnable=\""); - sr.append(visualEditorEnable); - sr.append("\" language=\""); - sr.append(language); - sr.append("\" buttons=\""); - sr.append(buttons); - sr.append("\" tabindex=\""); - sr.append(tabindex); - sr.append("\" disabled="); - sr.append(Boolean.toString(disabled)); - sr.append(" />"); - executeMacro(writer, sr.toString()); + writeFtlElement(writer, renderableFtlFormElementsBuilder.textArea(context, textareaField)); + + final ModelFormField modelFormField = textareaField.getModelFormField(); this.addAsterisks(writer, context, modelFormField); this.appendTooltip(writer, context, modelFormField); } diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilder.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilder.java index 591026be33..8d256c5924 100644 --- a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilder.java +++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilder.java @@ -20,6 +20,7 @@ package org.apache.ofbiz.widget.renderer.macro; import java.io.StringWriter; import java.net.URI; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Locale; @@ -300,6 +301,69 @@ public final class RenderableFtlFormElementsBuilder { .build(); } + public RenderableFtl textArea(final Map<String, Object> context, final ModelFormField.TextareaField textareaField) { + + final ModelFormField modelFormField = textareaField.getModelFormField(); + + final RenderableFtlMacroCallBuilder builder = RenderableFtlMacroCall.builder() + .name("renderTextareaField") + .stringParameter("name", modelFormField.getParameterName(context)); + + builder.intParameter("cols", textareaField.getCols()); + builder.intParameter("rows", textareaField.getRows()); + + builder.stringParameter("id", modelFormField.getCurrentContainerId(context)); + + builder.stringParameter("alert", "false"); + + ArrayList<String> classNames = new ArrayList<>(); + if (UtilValidate.isNotEmpty(modelFormField.getWidgetStyle())) { + classNames.add(modelFormField.getWidgetStyle()); + if (modelFormField.shouldBeRed(context)) { + builder.stringParameter("alert", "true"); + } + } + + if (shouldApplyRequiredField(modelFormField)) { + String requiredStyle = modelFormField.getRequiredFieldStyle(); + if (UtilValidate.isEmpty(requiredStyle)) { + requiredStyle = "required"; + } + classNames.add(requiredStyle); + } + builder.stringParameter("className", String.join(" ", classNames)); + + if (textareaField.getVisualEditorEnable()) { + builder.booleanParameter("visualEditorEnable", true); + + String buttons = textareaField.getVisualEditorButtons(context); + builder.stringParameter("buttons", UtilValidate.isEmpty(buttons) ? "maxi" : buttons); + } + + if (textareaField.isReadOnly()) { + builder.stringParameter("readonly", "readonly"); + } + + Map<String, Object> userLogin = UtilGenerics.cast(context.get("userLogin")); + String language = "en"; + if (userLogin != null) { + language = UtilValidate.isEmpty((String) userLogin.get("lastLocale")) ? "en" : (String) userLogin.get("lastLocale"); + } + builder.stringParameter("language", language); + + if (textareaField.getMaxlength() != null) { + builder.intParameter("maxlength", textareaField.getMaxlength()); + } + + builder.stringParameter("tabindex", modelFormField.getTabindex()); + + builder.stringParameter("value", modelFormField.getEntry(context, textareaField.getDefaultValue(context))); + + builder.booleanParameter("disabled", modelFormField.getDisabled(context)); + + return builder.build(); + } + public RenderableFtl makeHyperlinkString(final ModelFormField.SubHyperlink subHyperlink, final Map<String, Object> context) { if (subHyperlink == null || !subHyperlink.shouldUse(context)) { @@ -633,6 +697,12 @@ public final class RenderableFtlFormElementsBuilder { return wholeFormContext; } + private boolean shouldApplyRequiredField(ModelFormField modelFormField) { + return ("single".equals(modelFormField.getModelForm().getType()) + || "upload".equals(modelFormField.getModelForm().getType())) + && modelFormField.getRequiredField(); + } + /** * Extracts parameters from a target URL string, prepares them for an Ajax * JavaScript call. This method is currently set to return a parameter string diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/renderable/RenderableFtlMacroCall.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/renderable/RenderableFtlMacroCall.java index b82070f023..7ef5674724 100644 --- a/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/renderable/RenderableFtlMacroCall.java +++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/renderable/RenderableFtlMacroCall.java @@ -69,6 +69,10 @@ public final class RenderableFtlMacroCall implements RenderableFtl { return parameter(parameterName, parameterValue); } + public RenderableFtlMacroCallBuilder intParameter(final String parameterName, final int parameterValue) { + return parameter(parameterName, parameterValue); + } + public RenderableFtlMacroCallBuilder booleanParameter(final String parameterName, final boolean parameterValue) { return parameter(parameterName, parameterValue); } diff --git a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java index 03daf5ddf9..eb5b3e244e 100644 --- a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java +++ b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/MacroFormRendererTest.java @@ -225,23 +225,17 @@ public class MacroFormRendererTest { public void textAreaMacroRendered(@Mocked ModelFormField.TextareaField textareaField) throws IOException { new Expectations() { { - modelFormField.getEntry(withNotNull(), anyString); - result = "TEXTAREAVALUE"; - - textareaField.getCols(); - result = 11; - - textareaField.getRows(); - result = 22; + renderableFtlFormElementsBuilder.textArea(withNotNull(), textareaField); + result = genericMacroCall; } }; + genericTooltipRenderedExpectation(textareaField); + macroFormRenderer.renderTextareaField(appendable, ImmutableMap.of(), textareaField); - assertAndGetMacroString("renderTextareaField", ImmutableMap.of( - "value", "TEXTAREAVALUE", - "cols", "11", - "rows", "22")); + genericSingleMacroRenderedVerification(); + genericTooltipRenderedVerification(); } @Test diff --git a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilderTest.java b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilderTest.java index 67e9bb9cb1..03f05ccd85 100644 --- a/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilderTest.java +++ b/framework/widget/src/test/java/org/apache/ofbiz/widget/renderer/macro/RenderableFtlFormElementsBuilderTest.java @@ -236,6 +236,57 @@ public class RenderableFtlFormElementsBuilderTest { + "areaId2,http://host.domain/target2,"))); } + @Test + public void textareaFieldSetsIdValueLengthAndSize(@Mocked final ModelFormField.TextareaField textareaField) { + final int maxLength = 142; + final int cols = 80; + final int rows = 5; + new Expectations() { + { + modelFormField.getCurrentContainerId(withNotNull()); + result = "CurrentTextareaId"; + + modelFormField.getEntry(withNotNull(), anyString); + result = "TEXTAREAVALUE"; + + textareaField.getMaxlength(); + result = maxLength; + + textareaField.getCols(); + result = cols; + + textareaField.getRows(); + result = rows; + } + }; + + final HashMap<String, Object> context = new HashMap<>(); + + final RenderableFtl renderableFtl = renderableFtlFormElementsBuilder.textArea(context, textareaField); + assertThat(renderableFtl, MacroCallMatcher.hasNameAndParameters("renderTextareaField", + MacroCallParameterMatcher.hasNameAndStringValue("id", "CurrentTextareaId"), + MacroCallParameterMatcher.hasNameAndStringValue("value", "TEXTAREAVALUE"), + MacroCallParameterMatcher.hasNameAndIntegerValue("cols", cols), + MacroCallParameterMatcher.hasNameAndIntegerValue("rows", rows), + MacroCallParameterMatcher.hasNameAndIntegerValue("maxlength", maxLength))); + } + + @Test + public void textareaFieldSetsDisabledParameters(@Mocked final ModelFormField.TextareaField textareaField) { + new Expectations() { + { + modelFormField.getDisabled(withNotNull()); + result = true; + } + }; + + final HashMap<String, Object> context = new HashMap<>(); + + final RenderableFtl renderableFtl = renderableFtlFormElementsBuilder.textArea(context, textareaField); + assertThat(renderableFtl, MacroCallMatcher.hasNameAndParameters("renderTextareaField", + MacroCallParameterMatcher.hasNameAndBooleanValue("disabled", true))); + } + @Test public void fieldGroupOpenRendersCollapsibleAreaId(@Mocked final ModelForm.FieldGroup fieldGroup) { new Expectations() {