This is an automated email from the ASF dual-hosted git repository. mleila pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git
The following commit(s) were added to refs/heads/trunk by this push: new 9935270fcc Improved: Adds support for textarea placeholder attribute, using a FlexibleStringExpander (OFBIZ-12859) 9935270fcc is described below commit 9935270fcc1c883d4869e79e382df848737b8764 Author: Florian Motteau <florian.mott...@nereide.fr> AuthorDate: Wed Oct 11 10:48:13 2023 +0200 Improved: Adds support for textarea placeholder attribute, using a FlexibleStringExpander (OFBIZ-12859) With this PR we can add a "placeholder" attribute on "textarea" field widget. This attribute can be dynamic (FlexibleStringExpander). Its content is added in a "placeholder" attribute on the HTML textarea (https://developer.mozilla.org/fr/docs/Web/HTML/Element/textarea#placeholder). Thanks: Florian Motteau --- framework/widget/dtd/widget-form.xsd | 7 +++++++ .../apache/ofbiz/widget/model/ModelFormField.java | 20 ++++++++++++++++++++ .../ofbiz/widget/model/XmlWidgetFieldVisitor.java | 1 + .../macro/RenderableFtlFormElementsBuilder.java | 2 ++ .../template/macro/CsvFormMacroLibrary.ftl | 2 +- .../template/macro/FoFormMacroLibrary.ftl | 2 +- .../template/macro/HtmlFormMacroLibrary.ftl | 3 ++- .../template/macro/TextFormMacroLibrary.ftl | 2 +- .../template/macro/XlsFormMacroLibrary.ftl | 2 +- .../template/macro/XmlFormMacroLibrary.ftl | 2 +- 10 files changed, 37 insertions(+), 6 deletions(-) diff --git a/framework/widget/dtd/widget-form.xsd b/framework/widget/dtd/widget-form.xsd index f7e3fa3997..188aeed46a 100644 --- a/framework/widget/dtd/widget-form.xsd +++ b/framework/widget/dtd/widget-form.xsd @@ -1512,6 +1512,13 @@ under the License. table clean html spellcheck |(separator) Default is that all buttons are shown</xs:documentation> </xs:annotation> </xs:attribute> + <xs:attribute type="xs:string" name="placeholder"> + <xs:annotation> + <xs:documentation> + Content of the HTML placeholder attribute (https://developer.mozilla.org/fr/docs/Web/HTML/Element/textarea#placeholder), text to be displayed to the user when textarea is empty. Similar to text input placeholder. + </xs:documentation> + </xs:annotation> + </xs:attribute> </xs:complexType> </xs:element> <xs:element name="text-find" substitutionGroup="AllFields"> diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelFormField.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelFormField.java index aef60ce782..2b1ced540a 100644 --- a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelFormField.java +++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelFormField.java @@ -5074,6 +5074,7 @@ public final class ModelFormField { private final FlexibleStringExpander visualEditorButtons; private final boolean visualEditorEnable; private final Integer maxlength; + private final FlexibleStringExpander placeholder; public TextareaField(Element element, ModelFormField modelFormField) { super(element, modelFormField); @@ -5114,6 +5115,7 @@ public final class ModelFormField { this.maxlength = maxlength; this.visualEditorButtons = FlexibleStringExpander.getInstance(element.getAttribute("visual-editor-buttons")); this.visualEditorEnable = "true".equals(element.getAttribute("visual-editor-enable")); + this.placeholder = FlexibleStringExpander.getInstance(element.getAttribute("placeholder")); } public TextareaField(int fieldSource, ModelFormField modelFormField) { @@ -5125,6 +5127,7 @@ public final class ModelFormField { this.maxlength = null; this.visualEditorButtons = FlexibleStringExpander.getInstance(""); this.visualEditorEnable = false; + this.placeholder = FlexibleStringExpander.getInstance(""); } public TextareaField(ModelFormField modelFormField) { @@ -5140,6 +5143,7 @@ public final class ModelFormField { this.cols = original.cols; this.rows = original.rows; this.maxlength = original.maxlength; + this.placeholder = original.placeholder; } @Override @@ -5229,6 +5233,22 @@ public final class ModelFormField { return readOnly; } + /** + * Returns the placeholder + * @return the placeholder + */ + public FlexibleStringExpander getPlaceholder() { + return this.placeholder; + } + + /** + * Returns the placeholder + * @return the placeholder + */ + public String getPlaceholder(Map<String, Object> context) { + return this.placeholder.expandString(context); + } + @Override public void renderFieldString(Appendable writer, Map<String, Object> context, FormStringRenderer formStringRenderer) throws IOException { diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/XmlWidgetFieldVisitor.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/XmlWidgetFieldVisitor.java index 402e0c877b..143a3b1ce4 100644 --- a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/XmlWidgetFieldVisitor.java +++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/XmlWidgetFieldVisitor.java @@ -312,6 +312,7 @@ public class XmlWidgetFieldVisitor extends XmlAbstractWidgetVisitor implements M visitAttribute("rows", textareaField.getRows()); visitAttribute("visual-editor-buttons", textareaField.getVisualEditorButtons()); visitAttribute("visual-editor-enable", textareaField.getVisualEditorEnable()); + visitAttribute("placeholder", textareaField.getPlaceholder()); writer.append("/></field>"); } 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 f56982c630..8a62d3a5ff 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 @@ -367,6 +367,8 @@ public final class RenderableFtlFormElementsBuilder { builder.intParameter("maxlength", textareaField.getMaxlength()); } + builder.stringParameter("placeholder", textareaField.getPlaceholder(context)); + builder.stringParameter("tabindex", modelFormField.getTabindex()); builder.stringParameter("value", modelFormField.getEntry(context, textareaField.getDefaultValue(context))); diff --git a/themes/common-theme/template/macro/CsvFormMacroLibrary.ftl b/themes/common-theme/template/macro/CsvFormMacroLibrary.ftl index dfb916eddf..406e4ac9ec 100644 --- a/themes/common-theme/template/macro/CsvFormMacroLibrary.ftl +++ b/themes/common-theme/template/macro/CsvFormMacroLibrary.ftl @@ -26,7 +26,7 @@ under the License. <#macro renderTextField name className alert value textSize maxlength id event action disabled clientAutocomplete ajaxUrl ajaxEnabled mask tabindex readonly placeholder="" delegatorName="default"><@renderField value /></#macro> -<#macro renderTextareaField name className alert cols="" rows="" maxlength="" id="" readonly="" value="" visualEditorEnable="" buttons="" tabindex="" language="" disabled=false></#macro> +<#macro renderTextareaField name className alert cols="" rows="" maxlength="" id="" readonly="" value="" visualEditorEnable="" buttons="" tabindex="" language="" disabled=false placeholder=""></#macro> <#macro renderDateTimeField name className timeDropdownParamName defaultDateTimeString localizedIconTitle timeHourName timeMinutesName ampmName compositeType alert=false isTimeType=false isDateType=false amSelected=false pmSelected=false timeDropdown="" classString="" isTwelveHour=false hour1="" hour2="" minutes=0 shortDateInput="" title="" value="" size="" maxlength="" id="" formName="" mask="" event="" action="" step="" timeValues="" tabindex="" disabled=false isXMLHttpRequest=false><@ [...] diff --git a/themes/common-theme/template/macro/FoFormMacroLibrary.ftl b/themes/common-theme/template/macro/FoFormMacroLibrary.ftl index d988b99ebc..f011833d59 100644 --- a/themes/common-theme/template/macro/FoFormMacroLibrary.ftl +++ b/themes/common-theme/template/macro/FoFormMacroLibrary.ftl @@ -53,7 +53,7 @@ under the License. <#macro renderTextField name className alert value textSize maxlength id event action disabled clientAutocomplete ajaxUrl ajaxEnabled mask tabindex readonly placeholder="" delegatorName="default"><@makeBlock className value /></#macro> -<#macro renderTextareaField name className alert cols="" rows="" maxlength="" id="" readonly="" value="" visualEditorEnable="" buttons="" tabindex="" language="" disabled=false><@makeBlock className value /></#macro> +<#macro renderTextareaField name className alert cols="" rows="" maxlength="" id="" readonly="" value="" visualEditorEnable="" buttons="" tabindex="" language="" disabled=false placeholder=""><@makeBlock className value /></#macro> <#macro renderDateTimeField name className timeDropdownParamName defaultDateTimeString localizedIconTitle timeHourName timeMinutesName ampmName compositeType alert=false isTimeType=false isDateType=false amSelected=false pmSelected=false timeDropdown="" classString="" isTwelveHour=false hour1="" hour2="" minutes=0 shortDateInput="" title="" value="" size="" maxlength="" id="" formName="" mask="" event="" action="" step="" timeValues="" tabindex="" disabled=false isXMLHttpRequest=false><@ [...] diff --git a/themes/common-theme/template/macro/HtmlFormMacroLibrary.ftl b/themes/common-theme/template/macro/HtmlFormMacroLibrary.ftl index 2d0fbe3547..667c91e9f5 100644 --- a/themes/common-theme/template/macro/HtmlFormMacroLibrary.ftl +++ b/themes/common-theme/template/macro/HtmlFormMacroLibrary.ftl @@ -69,7 +69,7 @@ under the License. /><#t/> </#macro> -<#macro renderTextareaField name className alert cols="" rows="" maxlength="" id="" readonly="" value="" visualEditorEnable="" buttons="" tabindex="" language="" disabled=false> +<#macro renderTextareaField name className alert cols="" rows="" maxlength="" id="" readonly="" value="" visualEditorEnable="" buttons="" tabindex="" language="" disabled=false placeholder=""> <#if visualEditorEnable?has_content> <#local className = className + " visual-editor"> </#if> @@ -83,6 +83,7 @@ under the License. <#if tabindex?has_content> tabindex="${tabindex}"</#if><#rt/> <#if visualEditorEnable?has_content> data-toolbar="${buttons?default("maxi")}"</#if><#rt/> <#if language?has_content> data-language="${language!"en"}"</#if><#rt/> + <#if placeholder?has_content> placeholder="${placeholder}"</#if><#rt/> ><#t/> <#if value?has_content>${value}</#if><#t/> </textarea><#lt/> diff --git a/themes/common-theme/template/macro/TextFormMacroLibrary.ftl b/themes/common-theme/template/macro/TextFormMacroLibrary.ftl index 8dbe7073a0..bb7370def5 100644 --- a/themes/common-theme/template/macro/TextFormMacroLibrary.ftl +++ b/themes/common-theme/template/macro/TextFormMacroLibrary.ftl @@ -26,7 +26,7 @@ under the License. <#macro renderTextField name className alert value textSize maxlength id event action disabled clientAutocomplete ajaxUrl ajaxEnabled mask tabindex readonly placeholder="" delegatorName="default"><@renderField value /></#macro> -<#macro renderTextareaField name className alert cols="" rows="" maxlength="" id="" readonly="" value="" visualEditorEnable="" buttons="" tabindex="" language="" disabled=false><@renderField value /></#macro> +<#macro renderTextareaField name className alert cols="" rows="" maxlength="" id="" readonly="" value="" visualEditorEnable="" buttons="" tabindex="" language="" disabled=false placeholder=""><@renderField value /></#macro> <#macro renderDateTimeField name className alert title value size maxlength id dateType shortDateInput timeDropdownParamName defaultDateTimeString localizedIconTitle timeDropdown timeHourName classString hour1 hour2 timeMinutesName minutes isTwelveHour ampmName amSelected pmSelected compositeType formName mask="" event="" action="" step="" timeValues="" tabindex="" disabled="" isXMLHttpRequest=""><@renderField value /></#macro> diff --git a/themes/common-theme/template/macro/XlsFormMacroLibrary.ftl b/themes/common-theme/template/macro/XlsFormMacroLibrary.ftl index 04ef9942e9..a7f307c801 100644 --- a/themes/common-theme/template/macro/XlsFormMacroLibrary.ftl +++ b/themes/common-theme/template/macro/XlsFormMacroLibrary.ftl @@ -32,7 +32,7 @@ under the License. <#macro renderTextField name className alert value textSize maxlength id event action disabled clientAutocomplete ajaxUrl ajaxEnabled mask tabindex readonly placeholder="" delegatorName="default"><@renderItemField value "txf" className/></#macro> -<#macro renderTextareaField name className alert cols="" rows="" maxlength="" id="" readonly="" value="" visualEditorEnable="" buttons="" tabindex="" language="" disabled=false></#macro> +<#macro renderTextareaField name className alert cols="" rows="" maxlength="" id="" readonly="" value="" visualEditorEnable="" buttons="" tabindex="" language="" disabled=false placeholder=""></#macro> <#macro renderDateTimeField name className timeDropdownParamName defaultDateTimeString localizedIconTitle timeHourName timeMinutesName ampmName compositeType alert=false isTimeType=false isDateType=false amSelected=false pmSelected=false timeDropdown="" classString="" isTwelveHour=false hour1="" hour2="" minutes=0 shortDateInput="" title="" value="" size="" maxlength="" id="" formName="" mask="" event="" action="" step="" timeValues="" tabindex="" disabled=false isXMLHttpRequest=false> <#if isTimeType ><@renderItemField value "tf" className/> diff --git a/themes/common-theme/template/macro/XmlFormMacroLibrary.ftl b/themes/common-theme/template/macro/XmlFormMacroLibrary.ftl index 0b166cfd1b..04f45ff24e 100644 --- a/themes/common-theme/template/macro/XmlFormMacroLibrary.ftl +++ b/themes/common-theme/template/macro/XmlFormMacroLibrary.ftl @@ -42,7 +42,7 @@ under the License. <#macro renderTextField name className alert value textSize maxlength id event action disabled clientAutocomplete ajaxUrl ajaxEnabled mask tabindex readonly placeholder="" delegatorName="default"><@renderField value/></#macro> -<#macro renderTextareaField name className alert cols="" rows="" maxlength="" id="" readonly="" value="" visualEditorEnable="" buttons="" tabindex="" language="" disabled=false><@renderField value/></#macro> +<#macro renderTextareaField name className alert cols="" rows="" maxlength="" id="" readonly="" value="" visualEditorEnable="" buttons="" tabindex="" language="" disabled=false placeholder=""><@renderField value/></#macro> <#macro renderDateTimeField name className timeDropdownParamName defaultDateTimeString localizedIconTitle timeHourName timeMinutesName ampmName compositeType alert=false isTimeType=false isDateType=false amSelected=false pmSelected=false timeDropdown="" classString="" isTwelveHour=false hour1="" hour2="" minutes=0 shortDateInput="" title="" value="" size="" maxlength="" id="" formName="" mask="" event="" action="" step="" timeValues="" tabindex="" disabled=false isXMLHttpRequest=false><@ [...]