|
Modified: ofbiz/branches/20120329_portletWidget/framework/widget/dtd/widget-form.xsd
URL: http://svn.apache.org/viewvc/ofbiz/branches/20120329_portletWidget/framework/widget/dtd/widget-form.xsd?rev=1370439&r1=1370438&r2=1370439&view=diff ============================================================================== --- ofbiz/branches/20120329_portletWidget/framework/widget/dtd/widget-form.xsd (original) +++ ofbiz/branches/20120329_portletWidget/framework/widget/dtd/widget-form.xsd Tue Aug 7 19:13:03 2012 @@ -230,6 +230,19 @@ under the License. </xs:annotation> </xs:attribute> --> + <xs:attribute name="validate-link-on-enter" default="false"> + <xs:annotation><xs:documentation>in some case, a single form doest not include a submit button, instead it includes an hypperlink. setting this attribute to true wil result in click on the link when enter button is pressed on any form other input</xs:documentation></xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="validate-link-id" default="submit"> + <xs:annotation><xs:documentation>in some case, a single form doest not include a submit button, instead it includes an hypperlink. setting this attribute to true wil result in click on the link when enter button is pressed on any form other input</xs:documentation></xs:annotation> + </xs:attribute> + </xs:attributeGroup> <xs:element name="alt-target"> <xs:complexType> @@ -383,6 +396,24 @@ under the License. </xs:attribute> <xs:attribute name="area-id" type="xs:string" use="required"/> <xs:attribute name="area-target" type="xs:string" use="required"/> + <!-- + <xs:attribute name="use-when" type="xs:string"> + <xs:annotation><xs:documentation> + Used to specify a condition that must be true to use this field; the condition should be written using the + Java syntax and can operate on values in the form context; conditional fields are evaluated in reverse + order so the last field defined that evaluates to true is the one that is rendered. + </xs:documentation></xs:annotation> + </xs:attribute> + --> + <xs:attribute name="redirect-all-parameter" default="false"> + <xs:annotation><xs:documentation>Usable only for type="submit", use all parameters returned by the submit as parameter for area-target.</xs:documentation></xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> </xs:attributeGroup> <xs:element name="on-event-update-area"> <xs:annotation> @@ -391,6 +422,10 @@ under the License. <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" ref="parameter"/> + <xs:element minOccurs="0" maxOccurs="unbounded" ref="redirect-parameter"> + <xs:annotation><xs:documentation> + Usable only for type="submit", give parameter name returned by the submit to put as parameter for area-target.</xs:documentation></xs:annotation> + </xs:element> </xs:sequence> <xs:attributeGroup ref="attlist.on-form-event-update-area"/> </xs:complexType> @@ -402,6 +437,9 @@ under the License. <xs:complexType> <xs:sequence> <xs:element minOccurs="0" ref="AllFields"/> + <xs:element minOccurs="0" maxOccurs="unbounded" ref="show-portlet"> + <xs:annotation><xs:documentation>it's possible to generate multiple show-portlet with one click.</xs:documentation></xs:annotation> + </xs:element> <xs:element minOccurs="0" maxOccurs="unbounded" ref="on-field-event-update-area"/> </xs:sequence> <xs:attributeGroup ref="attlist.field"/> @@ -929,7 +967,113 @@ under the License. <xs:attribute type="xs:string" name="param-name" use="required"/> <xs:attribute type="xs:string" name="from-field"/> <xs:attribute type="xs:string" name="value"/> + <xs:attribute name="send-if-empty" default="false"> + <xs:annotation><xs:documentation>if true param-name will be included in parameters list even if value is empty or from-field is null </xs:documentation></xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:attributeGroup> + <xs:element name="show-portlet"> + <xs:complexType> + <xs:sequence> + <xs:element minOccurs="0" maxOccurs="unbounded" ref="parameters-form"> + <xs:annotation><xs:documentation>used to give a form name which will used to send all field content as parameters, form-name attribute is optional, if not present current form name is used</xs:documentation></xs:annotation> + </xs:element> + <xs:element minOccurs="0" maxOccurs="unbounded" ref="parameter"/> + </xs:sequence> + <xs:attributeGroup ref="attlist.showPortlet"/> + </xs:complexType> + </xs:element> + <xs:attributeGroup name="attlist.showPortlet"> + <xs:attribute name="also-hidden" default="true"> + <xs:annotation><xs:documentation>If set to true, an hidden form field is also rendered, with the name of the field and its content.</xs:documentation></xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute type="xs:string" name="portlet-id" use="required"> + <xs:annotation><xs:documentation>The portalPortletId which want to show, will pass as parameter to target; can use the ${} syntax to substitute values from the context.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="portal-page-id"> + <xs:annotation><xs:documentation>if a field named portalPageId is present in context it will be used, will be pass as parameter to target if has content otherwise generate a warning message; can use the ${} syntax to substitute values from the context.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="portlet-seq-id"> + <xs:annotation><xs:documentation>if a field named portletSeqId is present in context it will be used, will be pass as parameter to target if has content otherwise generate a warning message; can use the ${} syntax to substitute values from the context.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="target"> + <xs:annotation><xs:documentation>The target uri, default value is refreshPortlet; can use the ${} syntax to substitute values from the context.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="description"> + <xs:annotation><xs:documentation>Specifies the string to display, can use the ${} syntax to insert context values; if empty the value of the field will be printed for a default.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="area-id"> + <xs:annotation><xs:documentation>Area where to show the portlet, default value is "PP_${targetPageId}${targetPortletId}${targetSeqId}", will be pass as parameter to target if has content otherwise generate a warning message;can use the ${} syntax to insert context values; if empty the value of the field will be printed for a default.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="alternate"> + <xs:annotation><xs:documentation>Alternate text if the image is not found at image-location</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="image-title"> + <xs:annotation><xs:documentation>Use as a title for the HTML img tag</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="image-location"/> + <xs:attribute name="request-confirmation" default="false"> + <xs:annotation><xs:documentation>If true then the user is presented with a dialog box, if confirmation-message is empty, use default</xs:documentation></xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="confirmation-message" type="xs:string"><xs:annotation><xs:documentation>The message displayed in confirmation box</xs:documentation></xs:annotation></xs:attribute> + <xs:attribute name="parameters-map" type="xs:string"> + <xs:annotation><xs:documentation>A Map in the context that will be used as additional name/value pairs.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:integer" name="size"> + <xs:annotation><xs:documentation>Specifies the size of the field (as a number of characters), when the text to display exceed the given size it is truncated and add the complete text as a hint</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="collapse-screenlet"> + <xs:annotation><xs:documentation>Specifies the name of screenlet to collapse, can use the ${} syntax to insert context values, if value is empty nothing will be done</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute name="mark-selected" default="false"> + <xs:annotation><xs:documentation>If true, when user click a selected css is apply to the line to show the selected line; only one line can be selected, a click on a second line unselected the first before select the new one.</xs:documentation></xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute type="xs:string" name="parameters-form"> + <xs:annotation><xs:documentation>Specifies the name of a form, all field of it will be put as parameters, can use the ${} syntax to insert context values, if value is empty nothing will be done</xs:documentation></xs:annotation> + </xs:attribute> </xs:attributeGroup> + <xs:element name="redirect-parameter"> + <xs:complexType> + <xs:attribute type="xs:string" name="param-name" use="required"/> + <xs:attribute name="send-if-empty" default="false"> + <xs:annotation><xs:documentation>if true param-name will be included in parameters list even if value is empty or from-field is null </xs:documentation></xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:complexType> + </xs:element> + <xs:element name="parameters-form"> + <xs:complexType> + <xs:attribute type="xs:string" name="form-name"/> + </xs:complexType> + </xs:element> <xs:element name="ignored" substitutionGroup="AllFields"> <xs:complexType/> </xs:element> Modified: ofbiz/branches/20120329_portletWidget/framework/widget/dtd/widget-menu.xsd URL: http://svn.apache.org/viewvc/ofbiz/branches/20120329_portletWidget/framework/widget/dtd/widget-menu.xsd?rev=1370439&r1=1370438&r2=1370439&view=diff ============================================================================== --- ofbiz/branches/20120329_portletWidget/framework/widget/dtd/widget-menu.xsd (original) +++ ofbiz/branches/20120329_portletWidget/framework/widget/dtd/widget-menu.xsd Tue Aug 7 19:13:03 2012 @@ -96,6 +96,7 @@ under the License. <xs:element minOccurs="0" ref="condition"/> <xs:element minOccurs="0" ref="actions"/> <xs:element minOccurs="0" ref="link"/> + <xs:element minOccurs="0" ref="show-portlet"/> <xs:element minOccurs="0" maxOccurs="unbounded" ref="menu-item"/> </xs:sequence> <xs:attributeGroup ref="attlist.menu-item"/> @@ -135,6 +136,7 @@ under the License. </xs:element> <xs:attributeGroup name="attlist.image"> <xs:attribute type="xs:string" name="src"/> + <xs:attribute type="xs:string" name="title"/> <xs:attribute type="xs:string" name="id"/> <xs:attribute type="xs:string" name="style"/> <xs:attribute type="xs:string" name="width"/> @@ -605,4 +607,69 @@ under the License. <xs:attributeGroup name="attlist.if-empty"> <xs:attribute name="field" use="required"/> </xs:attributeGroup> + <xs:element name="show-portlet"> + <xs:complexType> + <xs:sequence> + <xs:element minOccurs="0" maxOccurs="unbounded" ref="parameter"/> + </xs:sequence> + <xs:attributeGroup ref="attlist.showPortlet"/> + </xs:complexType> + </xs:element> + <xs:attributeGroup name="attlist.showPortlet"> + <xs:attribute name="also-hidden" default="true"> + <xs:annotation><xs:documentation>If set to true, an hidden form field is also rendered, with the name of the field and its content.</xs:documentation></xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute type="xs:string" name="portlet-id" use="required"> + <xs:annotation><xs:documentation>The portalPortletId which want to show, will pass as parameter to target; can use the ${} syntax to substitute values from the context.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="portal-page-id"> + <xs:annotation><xs:documentation>if a field named portalPageId is present in context it will be used, will be pass as parameter to target if has content otherwise generate a warning message; can use the ${} syntax to substitute values from the context.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="portlet-seq-id"> + <xs:annotation><xs:documentation>if a field named portletSeqId is present in context it will be used, will be pass as parameter to target if has content otherwise generate a warning message; can use the ${} syntax to substitute values from the context.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="target"> + <xs:annotation><xs:documentation>The target uri, default value is refreshPortlet; can use the ${} syntax to substitute values from the context.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="description"> + <xs:annotation><xs:documentation>Specifies the string to display, can use the ${} syntax to insert context values; if empty the value of the field will be printed for a default.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="area-id"> + <xs:annotation><xs:documentation>Area where to show the portlet, default value is "PP_${targetPageId}${targetPortletId}${targetSeqId}", will be pass as parameter to target if has content otherwise generate a warning message;can use the ${} syntax to insert context values; if empty the value of the field will be printed for a default.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="alternate"> + <xs:annotation><xs:documentation>Alternate text if the image is not found at image-location</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="image-title"> + <xs:annotation><xs:documentation>Use as a title for the HTML img tag</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="image-location"/> + <xs:attribute name="request-confirmation" default="false"> + <xs:annotation><xs:documentation>If true then the user is presented with a dialog box, if confirmation-message is empty, use default</xs:documentation></xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="confirmation-message" type="xs:string"><xs:annotation><xs:documentation>The message displayed in confirmation box</xs:documentation></xs:annotation></xs:attribute> + <xs:attribute name="parameters-map" type="xs:string"> + <xs:annotation><xs:documentation>A Map in the context that will be used as additional name/value pairs.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:integer" name="size"> + <xs:annotation><xs:documentation>Specifies the size of the field (as a number of characters), when the text to display exceed the given size it is truncated and add the complete text as a hint</xs:documentation></xs:annotation> + </xs:attribute> + </xs:attributeGroup> + <xs:element name="parameters-form"> + <xs:complexType> + <xs:attribute type="xs:string" name="form-name"/> + </xs:complexType> + </xs:element> </xs:schema> Modified: ofbiz/branches/20120329_portletWidget/framework/widget/dtd/widget-screen.xsd URL: http://svn.apache.org/viewvc/ofbiz/branches/20120329_portletWidget/framework/widget/dtd/widget-screen.xsd?rev=1370439&r1=1370438&r2=1370439&view=diff ============================================================================== --- ofbiz/branches/20120329_portletWidget/framework/widget/dtd/widget-screen.xsd (original) +++ ofbiz/branches/20120329_portletWidget/framework/widget/dtd/widget-screen.xsd Tue Aug 7 19:13:03 2012 @@ -1124,6 +1124,14 @@ under the License. </xs:restriction> </xs:simpleType> </xs:attribute> + <!-- #Bam# : portletWidget --> + <xs:attribute type="xs:string" name="portalPortletId"> + <xs:annotation><xs:documentation>Retrieve only the attributes for this portalPortlet</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="portletSeqId"> + <xs:annotation><xs:documentation>Specify the portletSeqId of the portalPortlet to look for when retrieving the attributes</xs:documentation></xs:annotation> + </xs:attribute> + <!-- #Eam# : portletWidget --> </xs:attributeGroup> <xs:element name="sub-content" substitutionGroup="AllWidgets"> Modified: ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/ModelWidget.java URL: http://svn.apache.org/viewvc/ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/ModelWidget.java?rev=1370439&r1=1370438&r2=1370439&view=diff ============================================================================== --- ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/ModelWidget.java (original) +++ ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/ModelWidget.java Tue Aug 7 19:13:03 2012 @@ -32,6 +32,35 @@ import org.w3c.dom.Element; @SuppressWarnings("serial") public class ModelWidget implements Serializable { + public interface ShowPortletLink { + public String getImage(Map<String, Object> context); + public String getImageTitle(Map<String, Object> context); + public String getAlternate(Map<String, Object> context); + public String getDescription(Map<String, Object> context); + } + public static class ShowPortletLinkData { + public String imgSrc; + public String imgTitle; + public String alt; + public String description; + } + public interface ShowPortletItem { + public String getPortalPageId(Map<String, Object> context); + public String getPortletId(Map<String, Object> context); + public String getPortletSeqId(Map<String, Object> context); + public String getAreaId(Map<String, Object> context); + public String getTarget(Map<String, Object> context); + public Map<String, String> getParameterMap(Map<String, Object> context); + } + public static class ShowPortletItemData { + public String portalPageId; + public String portletId; + public String portletSeqId; + public String areaId; + public String target; + public Map<String, String> parameterMap; + public StringBuilder params; + } /** * The parameter name used to control widget boundary comments. Currently * set to "widgetVerbose". Modified: ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java URL: http://svn.apache.org/viewvc/ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java?rev=1370439&r1=1370438&r2=1370439&view=diff ============================================================================== --- ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java (original) +++ ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java Tue Aug 7 19:13:03 2012 @@ -387,31 +387,37 @@ public abstract class ModelWidgetAction } public static class Script extends ModelWidgetAction { - protected String location; - protected String method; + protected FlexibleStringExpander scriptLocationExdr; public Script(ModelWidget modelWidget, Element scriptElement) { super (modelWidget, scriptElement); - String scriptLocation = scriptElement.getAttribute("location"); - this.location = WidgetWorker.getScriptLocation(scriptLocation); - this.method = WidgetWorker.getScriptMethodName(scriptLocation); + this.scriptLocationExdr = FlexibleStringExpander.getInstance(scriptElement.getAttribute("location")); } @Override public void runAction(Map<String, Object> context) throws GeneralException { + Locale locale = (Locale) context.get("locale"); + String scriptLocation = this.scriptLocationExdr.expandString(context, locale); + String location = WidgetWorker.getScriptLocation(scriptLocation); + String method = WidgetWorker.getScriptMethodName(scriptLocation); if (location.endsWith(".xml")) { - Map<String, Object> localContext = FastMap.newInstance(); - localContext.putAll(context); DispatchContext ctx = WidgetWorker.getDispatcher(context).getDispatchContext(); - MethodContext methodContext = new MethodContext(ctx, localContext, null); + MethodContext methodContext = new MethodContext(ctx, context); try { SimpleMethod.runSimpleMethod(location, method, methodContext); - context.putAll(methodContext.getResults()); + Map<String, Object> resultContext = methodContext.getEnv("widget"); + if (UtilValidate.isNotEmpty(resultContext)){ + context.putAll(resultContext); + } + Map<String, Object> parametersUp = methodContext.getParameters(); + if (UtilValidate.isNotEmpty(parametersUp)){ + context.put("parameters",parametersUp); + } } catch (MiniLangException e) { throw new GeneralException("Error running simple method at location [" + location + "]", e); } } else { - ScriptUtil.executeScript(this.location, this.method, context); + ScriptUtil.executeScript(location, method, context); } } } Modified: ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/WidgetWorker.java URL: http://svn.apache.org/viewvc/ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/WidgetWorker.java?rev=1370439&r1=1370438&r2=1370439&view=diff ============================================================================== --- ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/WidgetWorker.java (original) +++ ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/WidgetWorker.java Tue Aug 7 19:13:03 2012 @@ -37,6 +37,7 @@ import org.ofbiz.base.util.StringUtil; import org.ofbiz.base.util.UtilDateTime; import org.ofbiz.base.util.UtilGenerics; import org.ofbiz.base.util.UtilHttp; +import org.ofbiz.base.util.UtilURL; import org.ofbiz.base.util.UtilValidate; import org.ofbiz.base.util.collections.FlexibleMapAccessor; import org.ofbiz.base.util.string.FlexibleStringExpander; @@ -45,6 +46,8 @@ import org.ofbiz.service.LocalDispatcher import org.ofbiz.webapp.control.ConfigXMLReader; import org.ofbiz.webapp.control.RequestHandler; import org.ofbiz.webapp.taglib.ContentUrlTag; +import org.ofbiz.widget.ModelWidget.ShowPortletItemData; +import org.ofbiz.widget.ModelWidget.ShowPortletLinkData; import org.ofbiz.widget.form.ModelForm; import org.ofbiz.widget.form.ModelFormField; import org.w3c.dom.Element; @@ -141,6 +144,12 @@ public class WidgetWorker { } } + //#Bam# portletWidget + public static void buildShowPortletUrl(Appendable externalWriter, String target, Map<String, String> parameterMap, + String prefix, boolean fullPath, boolean secure, boolean encode, HttpServletRequest request, HttpServletResponse response, Map<String, Object> context) throws IOException { + } + //#Eam# portletWidget + public static void appendContentUrl(Appendable writer, String location, HttpServletRequest request) throws IOException { StringBuilder buffer = new StringBuilder(); ContentUrlTag.appendContentPrefix(request, buffer); @@ -319,12 +328,14 @@ public class WidgetWorker { public static class Parameter { protected String name; protected FlexibleStringExpander value; + protected FlexibleStringExpander sendIfEmpty; //#Eam# portletWidget protected FlexibleMapAccessor<Object> fromField; public Parameter(Element element) { this.name = element.getAttribute("param-name"); this.value = UtilValidate.isNotEmpty(element.getAttribute("value")) ? FlexibleStringExpander.getInstance(element.getAttribute("value")) : null; this.fromField = UtilValidate.isNotEmpty(element.getAttribute("from-field")) ? FlexibleMapAccessor.getInstance(element.getAttribute("from-field")) : null; + this.sendIfEmpty = UtilValidate.isNotEmpty(element.getAttribute("send-if-empty")) ? FlexibleStringExpander.getInstance(element.getAttribute("send-if-empty")) : null; //#Eam# portletWidget } public Parameter(String paramName, String paramValue, boolean isField) { @@ -389,6 +400,13 @@ public class WidgetWorker { return null; } } + //#Bam# portletWidget + public boolean sendIfEmpty(Map<String, Object> context) { + if (this.sendIfEmpty != null) + return "true".equals(this.sendIfEmpty.expandString(context)); + else return false; + } + //#Eam# portletWidget } public static String determineAutoLinkType(String linkType, String target, String targetType, HttpServletRequest request) { @@ -476,4 +494,115 @@ public class WidgetWorker { Delegator delegator = (Delegator) context.get("delegator"); return delegator; } + //#Bam# portletWidget + /** + * Prepare data for Form and Menu show-portlet + */ + public static ShowPortletLinkData prepareShowPortletLinkData(ModelWidget.ShowPortletLink showPortletLink, Map<String, Object> context) { + ShowPortletLinkData splData = new ShowPortletLinkData(); + splData.imgSrc = showPortletLink.getImage(context); + if (UtilValidate.isEmpty(splData.imgSrc)) { + splData.imgSrc = ""; + } + splData.imgTitle = showPortletLink.getImageTitle(context); + if (UtilValidate.isEmpty(splData.imgTitle)) { + splData.imgTitle = ""; + } + splData.alt = showPortletLink.getAlternate(context); + if (UtilValidate.isEmpty(splData.alt)) { + splData.alt = ""; + } + splData.description = showPortletLink.getDescription(context); + if(UtilValidate.isEmpty(splData.description)) { + splData.description = ""; + } + return splData; + } + public static ShowPortletItemData prepareShowPortletItemsData(ModelWidget.ShowPortletItem showPortletItem, Map<String, Object> context) { + ShowPortletItemData spiData = new ShowPortletItemData(); + spiData.portalPageId = showPortletItem.getPortalPageId(context); + spiData.portletId = showPortletItem.getPortletId(context); + spiData.portletSeqId = showPortletItem.getPortletSeqId(context); + if (UtilValidate.isEmpty(spiData.portalPageId) && context.containsKey("portalPageId")) { + spiData.portalPageId = (String) context.get("portalPageId"); + } + // portletID is mandatory in show-portlet so, if value is null it's a choice + //if (UtilValidate.isEmpty(portletId) && context.containsKey("portalPortletId")) + // portletId = (String) context.get("portalPortletId"); + if (UtilValidate.isEmpty(spiData.portletSeqId) && context.containsKey("portletSeqId")) { + spiData.portletSeqId = (String) context.get("portletSeqId"); + } + spiData.areaId = showPortletItem.getAreaId(context); + if (UtilValidate.isEmpty(spiData.areaId)) { + if (UtilValidate.isNotEmpty(spiData.portalPageId) && UtilValidate.isNotEmpty(spiData.portletId) && UtilValidate.isNotEmpty(spiData.portletSeqId)) { + spiData.areaId = "PP_" + spiData.portalPageId + spiData.portletId + spiData.portletSeqId; + } + else { + //Debug.logWarning("The form [" + modelFormField.getModelForm().getFormLocation() + "#" + modelFormField.getModelForm().getName() +"] has a show-portlet field that should define a target-area or must have target-page-id, target-portlet-id and target-seq_id attributes", module); + } + } + spiData.target = "showPortlet"; + if (UtilValidate.isNotEmpty(showPortletItem.getTarget(context))) { + spiData.target = showPortletItem.getTarget(context); + } + + StringBuilder params = new StringBuilder(); + Map<String, String> parameters = showPortletItem.getParameterMap(context); + for (String key : parameters.keySet()) { + WidgetWorker.addToParams(params, key, parameters.get(key)); + } + + if (UtilValidate.isNotEmpty(spiData.portalPageId)) { + WidgetWorker.addToParams(params, "portalPageId", spiData.portalPageId); + } else { + WidgetWorker.addToParamsIfInContext(params, context, "portalPageId", parameters); + } + + if (UtilValidate.isNotEmpty(spiData.portletId)) { + WidgetWorker.addToParams(params, "portalPortletId", spiData.portletId); + } + + if (UtilValidate.isNotEmpty(spiData.portletSeqId)) { + WidgetWorker.addToParams(params, "portletSeqId", spiData.portletSeqId); + } else { + WidgetWorker.addToParamsIfInContext(params, context, "portletSeqId", parameters); + } + + WidgetWorker.addToParamsIfInContext(params, context, "areaId", parameters); + WidgetWorker.addToParamsIfInContext(params, context, "idDescription", parameters); + spiData.params = params; + return spiData; + } + + /** + * if context.get(key) not empty or context.get(parameters.key) not empty and not already in parameters add key=keyValue in params + * @param params + * @param context + * @param key + * @param parameters + */ + public static void addToParamsIfInContext(StringBuilder params, Map<String, Object> context, String key, Map<String, String> parameters) { + if (parameters.containsKey(key)) return; + + String paramValue = (String) context.get(key); + if (UtilValidate.isEmpty(paramValue)) { + Map<String, Object> contextParameters = UtilGenerics.checkMap(context.get("parameters")); + paramValue = (String) contextParameters.get(key); + } + if (UtilValidate.isNotEmpty(paramValue)) { + if ("idDescription".equals(key)) { + addToParams(params, key, UtilURL.removeBadCharForUrl(paramValue)); + } + else { + addToParams(params, key, paramValue); + } + } + } + public static void addToParams(StringBuilder params, String key, String oneParam) { + if (UtilValidate.isNotEmpty(params)) { + params.append("&"); + } + params.append(key).append("=").append(oneParam); + } + //#Eam# portletWidget } Modified: ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/fo/FoFormRenderer.java URL: http://svn.apache.org/viewvc/ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/fo/FoFormRenderer.java?rev=1370439&r1=1370438&r2=1370439&view=diff ============================================================================== --- ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/fo/FoFormRenderer.java (original) +++ ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/fo/FoFormRenderer.java Tue Aug 7 19:13:03 2012 @@ -48,6 +48,7 @@ import org.ofbiz.widget.form.ModelFormFi import org.ofbiz.widget.form.ModelFormField.RadioField; import org.ofbiz.widget.form.ModelFormField.RangeFindField; import org.ofbiz.widget.form.ModelFormField.ResetField; +import org.ofbiz.widget.form.ModelFormField.ShowPortletLink; import org.ofbiz.widget.form.ModelFormField.SubmitField; import org.ofbiz.widget.form.ModelFormField.TextField; import org.ofbiz.widget.form.ModelFormField.TextFindField; @@ -422,4 +423,7 @@ public class FoFormRenderer extends Html public void renderContainerFindField(Appendable writer, Map<String, Object> context, ContainerField containerField) throws IOException { } + + public void renderShowPortletLink(Appendable writer, Map<String, Object> context, ShowPortletLink showPortletLink) { + } } Modified: ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/FormStringRenderer.java URL: http://svn.apache.org/viewvc/ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/FormStringRenderer.java?rev=1370439&r1=1370438&r2=1370439&view=diff ============================================================================== --- ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/FormStringRenderer.java (original) +++ ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/FormStringRenderer.java Tue Aug 7 19:13:03 2012 @@ -93,4 +93,6 @@ public interface FormStringRenderer { public void renderContainerFindField(Appendable writer, Map<String, Object> context, ModelFormField.ContainerField containerField) throws IOException; public void renderFieldGroupOpen(Appendable writer, Map<String, Object> context, ModelForm.FieldGroup fieldGroup) throws IOException; public void renderFieldGroupClose(Appendable writer, Map<String, Object> context, ModelForm.FieldGroup fieldGroup) throws IOException; +// public void renderShowPortletField(Appendable writer,Map<String, Object> context, ModelFormField.ShowPortletField showPortletField) throws IOException; + public void renderShowPortletLink(Appendable writer,Map<String, Object> context, ModelFormField.ShowPortletLink showPortletLink) throws IOException; } Modified: ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/MacroFormRenderer.java URL: http://svn.apache.org/viewvc/ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/MacroFormRenderer.java?rev=1370439&r1=1370438&r2=1370439&view=diff ============================================================================== --- ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/MacroFormRenderer.java (original) +++ ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/MacroFormRenderer.java Tue Aug 7 19:13:03 2012 @@ -38,7 +38,6 @@ import javax.servlet.http.HttpServletRes import javolution.util.FastList; -import org.apache.commons.lang.StringEscapeUtils; import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.StringUtil; import org.ofbiz.base.util.UtilFormatOut; @@ -54,6 +53,8 @@ import org.ofbiz.webapp.control.RequestH import org.ofbiz.webapp.taglib.ContentUrlTag; import org.ofbiz.widget.ModelWidget; import org.ofbiz.widget.WidgetWorker; +import org.ofbiz.widget.ModelWidget.ShowPortletItemData; +import org.ofbiz.widget.ModelWidget.ShowPortletLinkData; import org.ofbiz.widget.form.ModelFormField.CheckField; import org.ofbiz.widget.form.ModelFormField.ContainerField; import org.ofbiz.widget.form.ModelFormField.DateFindField; @@ -71,6 +72,8 @@ import org.ofbiz.widget.form.ModelFormFi import org.ofbiz.widget.form.ModelFormField.RadioField; import org.ofbiz.widget.form.ModelFormField.RangeFindField; import org.ofbiz.widget.form.ModelFormField.ResetField; +import org.ofbiz.widget.form.ModelFormField.ShowPortletItem; +import org.ofbiz.widget.form.ModelFormField.ShowPortletLink; import org.ofbiz.widget.form.ModelFormField.SubmitField; import org.ofbiz.widget.form.ModelFormField.TextField; import org.ofbiz.widget.form.ModelFormField.TextFindField; @@ -331,6 +334,7 @@ public class MacroFormRenderer implement public void renderTextField(Appendable writer, Map<String, Object> context, TextField textField) throws IOException { ModelFormField modelFormField = textField.getModelFormField(); String name = modelFormField.getParameterName(context); + boolean validateLinkOnEnter = modelFormField.getModelForm().getValidateLinkOnEnter(); // #Eam# validate-form String className = ""; String alert = "false"; String mask = ""; @@ -402,6 +406,18 @@ public class MacroFormRenderer implement sr.append(" clientAutocomplete=\""); sr.append(clientAutocomplete); + // #Bam# validate-form + if (validateLinkOnEnter) { + sr.append("\" validateLinkOnEnter="); + sr.append(Boolean.toString(validateLinkOnEnter)); + sr.append(" validateLinkId=\""); + sr.append(modelFormField.getModelForm().getValidateLinkId()); + } else{ + sr.append("\" validateLinkOnEnter="); + sr.append(Boolean.toString(false)); + sr.append(" validateLinkId=\""); + } + // #Eam# validate-form sr.append("\" ajaxUrl=\""); sr.append(ajaxUrl); sr.append("\" ajaxEnabled="); @@ -1136,8 +1152,14 @@ public class MacroFormRenderer implement boolean ajaxEnabled = (updateAreas != null || UtilValidate.isNotEmpty(backgroundSubmitRefreshTarget)) && this.javaScriptEnabled; String ajaxUrl = ""; + String returnParams = ""; // #Eam# portletWidget if (ajaxEnabled) { + /* #Bam# portletWidget ajaxUrl = createAjaxParamsFromUpdateAreas(updateAreas, null, context); + */ + returnParams = createReturnParamsFromUpdateAreas(updateAreas, context); + ajaxUrl = createAjaxParamsFromUpdateAreas(updateAreas, null, context, UtilValidate.isNotEmpty(returnParams)); + // #Eam# portletWidget } StringWriter sr = new StringWriter(); sr.append("<@renderSubmitField "); @@ -1173,6 +1195,10 @@ public class MacroFormRenderer implement if (ajaxEnabled) { sr.append(ajaxUrl); } + //#Bam# portletWidget + sr.append("\" returnParams =\""); + sr.append(returnParams); + //#Eam# portletWidget sr.append("\" />"); executeMacro(writer, sr.toString()); this.appendTooltip(writer, context, modelFormField); @@ -1746,6 +1772,7 @@ public class MacroFormRenderer implement public void renderTextFindField(Appendable writer, Map<String, Object> context, TextFindField textFindField) throws IOException { ModelFormField modelFormField = textFindField.getModelFormField(); + boolean validateLinkOnEnter = modelFormField.getModelForm().getValidateLinkOnEnter(); // #Eam# validate-form String defaultOption = textFindField.getDefaultOption(); String className = ""; String alert = "false"; @@ -1821,6 +1848,19 @@ public class MacroFormRenderer implement sr.append(maxlength); sr.append("\" autocomplete=\""); sr.append(autocomplete); + // #Bam# validate-form + if (validateLinkOnEnter) { + sr.append("\" validateLinkOnEnter="); + sr.append(Boolean.toString(validateLinkOnEnter)); + sr.append(" validateLinkId=\""); + sr.append(modelFormField.getModelForm().getValidateLinkId()); + } + else { + sr.append("\" validateLinkOnEnter="); + sr.append(Boolean.toString(false)); + sr.append(" validateLinkId=\""); + } + // #Eam# validate-form sr.append("\" titleStyle=\""); sr.append(titleStyle); sr.append("\" hideIgnoreCase="); @@ -2915,6 +2955,12 @@ public class MacroFormRenderer implement * @return Parameter string or empty string if no UpdateArea objects were found */ public String createAjaxParamsFromUpdateAreas(List<ModelForm.UpdateArea> updateAreas, String extraParams, Map<String, ? extends Object> context) { + // #Bam# portletWidget + return createAjaxParamsFromUpdateAreas(updateAreas, extraParams, context, false); + } + + public String createAjaxParamsFromUpdateAreas(List<ModelForm.UpdateArea> updateAreas, String extraParams, Map<String, ? extends Object> context, boolean addReturnParams) { + // #Eam# portletWidget //FIXME copy from HtmlFormRenderer.java if (updateAreas == null) { return ""; @@ -2951,6 +2997,18 @@ public class MacroFormRenderer implement } } } + // #Bam# portletWidget + StringBuilder params = new StringBuilder(); + params.append(ajaxParams); + List<String> addingParams = UtilMisc.toList("portalPageId", "portalPortletId", "portletSeqId", "areaId", "idDescription"); + for (String addingParam : addingParams) { + if (UtilValidate.isNotEmpty(extraParams) && extraParams.contains(addingParam + "=")) { + continue; + } + WidgetWorker.addToParamsIfInContext(params, ctx, addingParam, parameters); + } + ajaxParams = params.toString(); + // #Eam# portletWidget //then add parameters from request. Those parameters could end with an anchor so we must set ajax parameters first if (UtilValidate.isNotEmpty(extraParams)) { if (ajaxParams.length() > 0 && !extraParams.startsWith("&")) { @@ -2961,10 +3019,47 @@ public class MacroFormRenderer implement ajaxUrl += updateArea.getAreaId() + ","; ajaxUrl += this.rh.makeLink(this.request, this.response, UtilHttp.removeQueryStringFromTarget(targetUrl)); ajaxUrl += "," + ajaxParams; + // #Bam# portletWidget + if (addReturnParams) { + if(updateArea.hasRedirParamList()){ + ajaxUrl += ",true"; + } else { + ajaxUrl += ",false"; + } + + } + // #Eam# portletWidget } Locale locale = UtilMisc.ensureLocale(context.get("locale")); return FlexibleStringExpander.expandString(ajaxUrl, context, locale); } + + // #Bam# portletWidget + public String createReturnParamsFromUpdateAreas(List<ModelForm.UpdateArea> updateAreas, Map<String, ? extends Object> context){ + String returnParam = ""; + boolean first = true; + for (ModelForm.UpdateArea updateArea : updateAreas) { + Map<String, Object> ctx = UtilGenerics.checkMap(context); + Map<String, String> redirectParameters = updateArea.getRedirParamList(ctx); + if(UtilValidate.isNotEmpty(redirectParameters)){ + for (String key : redirectParameters.keySet()) { + if(first){ + returnParam += "{'" + key + "' : '" + key + "'"; + first = false; + } + else{ + returnParam += ", '" + key + "' : '" + key + "'"; + } + } + } + } + if (UtilValidate.isNotEmpty(returnParam)) { + returnParam += "}"; + } + return returnParam; + } + // #Eam# portletWidget + /** Extracts parameters from a target URL string, prepares them for an Ajax * JavaScript call. This method is currently set to return a parameter string * suitable for the Prototype.js library. @@ -3118,6 +3213,10 @@ public class MacroFormRenderer implement sr.append(event); sr.append("\" action=\""); sr.append(action); + // #Bam# validate-form + sr.append("\" id=\""); + sr.append(modelFormField.getIdName()); + // #Eam# validate-form sr.append("\" imgSrc=\""); sr.append(imgSrc); sr.append("\" title=\""); @@ -3137,6 +3236,221 @@ public class MacroFormRenderer implement } } + //#Bam# portletWidget + // same as HtmlFormRenderer except when populate StringWriter sr + public void renderShowPortletLink(Appendable writer, Map<String, Object> context, ShowPortletLink showPortletLink) throws IOException { + ModelFormField modelFormField = showPortletLink.getModelFormField(); + String linkStyle = ""; + //prepare show link properties + String id = ""; + + if (UtilValidate.isNotEmpty(modelFormField.getIdName())) { + id = modelFormField.getIdName(); + } + if (UtilValidate.isNotEmpty(context.get("itemIndex"))) { + id = id + "_" + context.get("itemIndex"); + } + String markSelected = showPortletLink.getMarkSelected(context); + String event = ""; + if (UtilValidate.isNotEmpty(modelFormField.getEvent())) { + event = modelFormField.getEvent(); + } + String action = ""; + if (UtilValidate.isNotEmpty(modelFormField.getAction(context))) { + action = modelFormField.getAction(context); + } + String collapseScreenlet = showPortletLink.getCollapseScreenlet(context); + + String formName = modelFormField.getModelForm().getName(); + List<String> areasList = FastList.newInstance(); + List<String> targetList = FastList.newInstance(); + List<String> paramsList = FastList.newInstance(); + List<String> formList = FastList.newInstance(); + List<String> collapseLis = FastList.newInstance(); + + ShowPortletLinkData splData = WidgetWorker.prepareShowPortletLinkData(showPortletLink, context); + + for(ShowPortletItem showPortletItem : showPortletLink.getShowPortletItems()){ + + ShowPortletItemData spiData = WidgetWorker.prepareShowPortletItemsData(showPortletItem, context); + + if (UtilValidate.isEmpty(spiData.areaId) && + (UtilValidate.isEmpty(spiData.portalPageId) || UtilValidate.isEmpty(spiData.portletId) || UtilValidate.isEmpty(spiData.portletSeqId))) { + Debug.logWarning("The form [" + modelFormField.getModelForm().getFormLocation() + "#" + modelFormField.getModelForm().getName() +"] has a show-portlet field that should define a target-area or must have target-page-id, target-portlet-id and target-seq_id attributes", module); + } + + if (UtilValidate.isNotEmpty(modelFormField.getWidgetStyle())) { + linkStyle = modelFormField.getWidgetStyle(); + } + collapseScreenlet = showPortletItem.getCollapseScreenlet(context); + + //check whether the current form field values should be appended to request parameters or not + List<String> appendFormParams = showPortletItem.getFormsToSerialize(); + areasList.add(spiData.areaId); + targetList.add(spiData.target); + paramsList.add(spiData.params.toString()); + String formParamsString = ""; + if(UtilValidate.isNotEmpty(appendFormParams) && appendFormParams.size() > 0){ + formParamsString = appendFormParams.toString(); + if (formParamsString.startsWith("{")) + formParamsString = formParamsString.replace("{", ""); + if (formParamsString.endsWith("}")) + formParamsString = formParamsString.replace("}", ""); + formParamsString = formParamsString.replace(", ", ","); + } + formList.add(formParamsString); + collapseLis.add(collapseScreenlet); + if(showPortletItem.getRequireConfirmation()) { + event = "onclick"; + action = "return confirm('" + showPortletItem.getConfirmationMessage(context) +"')"; + } + } + if (areasList.size() != targetList.size() + || areasList.size() != paramsList.size()) { + Debug.logWarning("The form Field [" + modelFormField.getModelForm().getFormLocation() + "#" + modelFormField.getModelForm().getName() +"] has define a target and arameters list for each area it is going to refresh", module); + } + StringWriter sr = new StringWriter(); + sr.append("<@rerenderRefreshPortlet "); + sr.append("linkStyle=\""); + sr.append(linkStyle); + sr.append("\" event=\""); + sr.append(event); + sr.append("\" action=\""); + sr.append(action); + sr.append("\" areaId=\""); + sr.append(showPortletLink.listToString(areasList)); + sr.append("\" id=\""); + sr.append(id); + sr.append("\" formName=\""); + sr.append(formName); + sr.append("\" imgSrc=\""); + sr.append(splData.imgSrc); + sr.append("\" title=\""); + sr.append(splData.imgTitle); + + sr.append("\" alternate=\""); + sr.append(splData.alt); + sr.append("\" target=\""); + sr.append(showPortletLink.listToString(targetList)); + sr.append("\" appendFormParams=\""); + sr.append(showPortletLink.listToString(formList)); + sr.append("\" description=\""); + sr.append(splData.description); + sr.append("\" params=\""); + sr.append(showPortletLink.listToString(paramsList)); + sr.append("\" collapse=\""); + sr.append(Boolean.valueOf(collapseScreenlet).toString()); + sr.append("\" markSelected=\""); + sr.append(Boolean.valueOf(markSelected).toString()); + sr.append("\" />"); + executeMacro(writer, sr.toString()); + this.appendTooltip(writer, context, modelFormField); + } + //#Eam# portletWidget + // #Bam# portletWidget + public void makeShowPortletString(Appendable writer, String linkStyle, String targetArea, String target, String targetPortletId, Map<String, String> parameterMap, + String description, String collapse, ModelFormField modelFormField, HttpServletRequest request, HttpServletResponse response, Map<String, Object> context) + throws IOException { + + StringBuilder linkUrl = new StringBuilder(); + + String event = ""; + String action = ""; + String parameterKey = ""; + String parameterValue = ""; + String parameterList = ""; + String parameterForm = ""; + String collapseScreenlet = ""; + //String collapseScreenlet = collapse?"true":""; + + if (UtilValidate.isNotEmpty(modelFormField.getEvent()) && UtilValidate.isNotEmpty(modelFormField.getAction(context))) { + event = modelFormField.getEvent(); + action = modelFormField.getAction(context); + } + + Integer size = Integer.valueOf("0"); + + if( UtilValidate.isNotEmpty(description) && size > 0 && description.length() > size) { + description = description.substring(0, size - 8) + "..." + description.substring(description.length() - 5); + } + + if (UtilValidate.isNotEmpty(collapse)) { + collapseScreenlet = collapse; + } + + /* manage parameters-form and parameter */ + + Appendable localWriter = new StringWriter(); + boolean first = true; + if (UtilValidate.isNotEmpty(parameterMap)) { + //parameterForm = modelFormField.getModelForm().getName(); + for (Map.Entry<String, String> parameter: parameterMap.entrySet()) { + if (parameter.getValue() instanceof String) { + parameterKey = parameter.getKey(); + parameterValue = parameter.getValue(); + if(first){ + // targetPortletId is required for show-portlet + parameterList += "{'portalPortletId':'" + targetPortletId + "', '" + parameterKey + "':'" + parameterValue + "'"; + first = false; + } + else{ + parameterList += ", '" + parameterKey + "':'" + parameterValue + "'"; + } + } else { + Object parameterObject = parameter.getValue(); + + // skip null values + if (parameterObject == null){ + parameterForm = modelFormField.getModelForm().getName(); + } + else if (parameterObject instanceof String[]) { + // it's probably a String[], just get the first value + String[] parameterArray = (String[]) parameterObject; + parameterValue = parameterArray[0]; + Debug.logInfo("Found String array value for parameter [" + parameter.getKey() + "], using first value: " + parameterValue, module); + } else { + // not a String, and not a String[], just use toString + parameterValue = parameterObject.toString(); + } + } + } + if(!first){ // this means that we reached the end and the list wasn't void since we read a first element + parameterList += "}"; + } + } else { + linkUrl.append(localWriter.toString()); + } + + StringWriter sr = new StringWriter(); + sr.append("<@makeShowPortletString "); + sr.append("linkStyle=\""); + sr.append(linkStyle==null?"":linkStyle); + sr.append("\" id=\""); + sr.append(modelFormField.getIdName()); + sr.append("\" event=\""); + sr.append(event); + sr.append("\" action=\""); + sr.append(action); + sr.append("\" target=\""); + sr.append(target); + sr.append("\" targetArea=\""); + sr.append(targetArea); + sr.append("\" targetPortletId=\""); + sr.append(targetPortletId); + sr.append("\" description=\""); + sr.append(description); + sr.append("\" parameterForm=\""); + sr.append(parameterForm); + sr.append("\" parameterList=\""); + sr.append(parameterList); + sr.append("\" collapse=\""); + sr.append(collapseScreenlet); + + sr.append("\" />"); + executeMacro(writer, sr.toString()); + } + // #Eam# portletWidget + public void makeHiddenFormLinkAnchor(Appendable writer, String linkStyle, String description, String confirmation , ModelFormField modelFormField, HttpServletRequest request, HttpServletResponse response, Map<String, Object> context) throws IOException { if (UtilValidate.isNotEmpty(description) || UtilValidate.isNotEmpty(request.getAttribute("image"))) { String hiddenFormName = WidgetWorker.makeLinkHiddenFormName(context, modelFormField); Modified: ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/ModelForm.java URL: http://svn.apache.org/viewvc/ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/ModelForm.java?rev=1370439&r1=1370438&r2=1370439&view=diff ============================================================================== --- ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/ModelForm.java (original) +++ ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/ModelForm.java Tue Aug 7 19:13:03 2012 @@ -89,6 +89,7 @@ public class ModelForm extends ModelWidg protected String tooltip; protected String listName; protected String listEntryName; + protected String validateLinkId; // #Eam# validateForm protected FlexibleMapAccessor<Map<String, ? extends Object>> defaultMapName; protected String defaultEntityName; protected String defaultServiceName; @@ -115,6 +116,7 @@ public class ModelForm extends ModelWidg protected boolean separateColumns = false; protected boolean groupColumns = true; protected boolean useRowSubmit = false; + protected boolean validateLinkOnEnter = false; // #Eam# validateForm protected FlexibleStringExpander targetWindowExdr; protected String defaultRequiredFieldStyle; protected String defaultSortFieldStyle; @@ -273,6 +275,7 @@ public class ModelForm extends ModelWidg this.tooltip = parent.tooltip; this.listName = parent.listName; this.listEntryName = parent.listEntryName; + this.validateLinkId = parent.validateLinkId;// #Eam# validateForm this.tooltip = parent.tooltip; this.defaultEntityName = parent.defaultEntityName; this.defaultServiceName = parent.defaultServiceName; @@ -487,6 +490,15 @@ public class ModelForm extends ModelWidg this.rowCountExdr = FlexibleStringExpander.getInstance(formElement.getAttribute("row-count")); } + //#Bam# : validateForm + if (this.validateLinkId == null || formElement.hasAttribute("validate-link-id")) { + this.validateLinkId = formElement.getAttribute("validate-link-id"); + } + if ( formElement.hasAttribute("validate-link-on-enter")) { + this.validateLinkOnEnter = "true".equalsIgnoreCase(formElement.getAttribute("validate-link-on-enter")); + } + //#Eam# : validateForm + //alt-row-styles for (Element altRowStyleElement : UtilXml.childElementList(formElement, "alt-row-style")) { AltRowStyle altRowStyle = new AltRowStyle(altRowStyleElement); @@ -837,7 +849,10 @@ public class ModelForm extends ModelWidg */ public void renderFormString(Appendable writer, Map<String, Object> context, FormStringRenderer formStringRenderer) throws IOException { // increment the paginator, only for list and multi forms + Boolean PAGINATOR_AND_ACTION_DONE = null; // #Eam# screenlet navigationForm if ("list".equals(this.type) || "multi".equals(this.type)) { + Map<String, Object> globalCtx = UtilGenerics.checkMap(context.get("globalContext")); // #Eam# screenlet navigationForm + PAGINATOR_AND_ACTION_DONE = (Boolean) globalCtx.get("NO_PAGINATOR"); // #Eam# screenlet navigationForm WidgetWorker.incrementPaginatorNumber(context); } @@ -850,7 +865,9 @@ public class ModelForm extends ModelWidg context.put("viewIndex", this.getViewIndex(context)); context.put("viewSize", this.getViewSize(context)); - runFormActions(context); + if (UtilValidate.isEmpty(PAGINATOR_AND_ACTION_DONE)) { // #Eam# screenlet navigationForm + runFormActions(context); + } // #Eam# screenlet navigationForm // if this is a list form, don't useRequestParameters if ("list".equals(this.type) || "multi".equals(this.type)) { @@ -1241,7 +1258,11 @@ public class ModelForm extends ModelWidg continue; } + /* #Bam# portletWidget if (fieldInfo.getFieldType() != ModelFormField.FieldInfo.DISPLAY && fieldInfo.getFieldType() != ModelFormField.FieldInfo.DISPLAY_ENTITY && fieldInfo.getFieldType() != ModelFormField.FieldInfo.HYPERLINK) { + */ + if (fieldInfo.getFieldType() != ModelFormField.FieldInfo.DISPLAY && fieldInfo.getFieldType() != ModelFormField.FieldInfo.DISPLAY_ENTITY && fieldInfo.getFieldType() != ModelFormField.FieldInfo.HYPERLINK && fieldInfo.getFieldType() != ModelFormField.FieldInfo.SHOW_PORTLET) { + // #Eam# portletWidget inputFieldFound = true; continue; } @@ -1265,7 +1286,11 @@ public class ModelForm extends ModelWidg } // skip all of the display/hyperlink fields + /* #Bam# portletWidget if (fieldInfo.getFieldType() == ModelFormField.FieldInfo.DISPLAY || fieldInfo.getFieldType() == ModelFormField.FieldInfo.DISPLAY_ENTITY || fieldInfo.getFieldType() == ModelFormField.FieldInfo.HYPERLINK) { + */ + if (fieldInfo.getFieldType() == ModelFormField.FieldInfo.DISPLAY || fieldInfo.getFieldType() == ModelFormField.FieldInfo.DISPLAY_ENTITY || fieldInfo.getFieldType() == ModelFormField.FieldInfo.HYPERLINK || fieldInfo.getFieldType() == ModelFormField.FieldInfo.SHOW_PORTLET) { + // #Eam# portletWidget continue; } @@ -1598,7 +1623,11 @@ public class ModelForm extends ModelWidg continue; } + /* #Bam# portletWidget if (fieldInfo.getFieldType() != ModelFormField.FieldInfo.DISPLAY && fieldInfo.getFieldType() != ModelFormField.FieldInfo.DISPLAY_ENTITY && fieldInfo.getFieldType() != ModelFormField.FieldInfo.HYPERLINK) { + */ + if (fieldInfo.getFieldType() != ModelFormField.FieldInfo.DISPLAY && fieldInfo.getFieldType() != ModelFormField.FieldInfo.DISPLAY_ENTITY && fieldInfo.getFieldType() != ModelFormField.FieldInfo.HYPERLINK && fieldInfo.getFieldType() != ModelFormField.FieldInfo.SHOW_PORTLET) { + // #Eam# portletWidget // okay, now do the form cell break; } @@ -1622,7 +1651,11 @@ public class ModelForm extends ModelWidg } // skip all of the display/hyperlink fields + /* #Bam# portletWidget if (fieldInfo.getFieldType() == ModelFormField.FieldInfo.DISPLAY || fieldInfo.getFieldType() == ModelFormField.FieldInfo.DISPLAY_ENTITY || fieldInfo.getFieldType() == ModelFormField.FieldInfo.HYPERLINK) { + */ + if (fieldInfo.getFieldType() == ModelFormField.FieldInfo.DISPLAY || fieldInfo.getFieldType() == ModelFormField.FieldInfo.DISPLAY_ENTITY || fieldInfo.getFieldType() == ModelFormField.FieldInfo.HYPERLINK || fieldInfo.getFieldType() == ModelFormField.FieldInfo.SHOW_PORTLET) { + // #Bam# portletWidget continue; } @@ -1644,7 +1677,11 @@ public class ModelForm extends ModelWidg } // skip all non-display and non-hyperlink fields + /* #Bam# portletWidget if (fieldInfo.getFieldType() != ModelFormField.FieldInfo.DISPLAY && fieldInfo.getFieldType() != ModelFormField.FieldInfo.DISPLAY_ENTITY && fieldInfo.getFieldType() != ModelFormField.FieldInfo.HYPERLINK) { + */ + if (fieldInfo.getFieldType() != ModelFormField.FieldInfo.DISPLAY && fieldInfo.getFieldType() != ModelFormField.FieldInfo.DISPLAY_ENTITY && fieldInfo.getFieldType() != ModelFormField.FieldInfo.HYPERLINK && fieldInfo.getFieldType() != ModelFormField.FieldInfo.SHOW_PORTLET) { + // #Eam# portletWidget continue; } @@ -2706,6 +2743,16 @@ public class ModelForm extends ModelWidg return this.useRowSubmit; } + //#Bam# : validateForm + public boolean getValidateLinkOnEnter() { + return this.validateLinkOnEnter; + } + + public String getValidateLinkId() { + return this.validateLinkId; + } + //#Eam# : validateForm + public List<ModelFormField> getMultiSubmitFields() { return this.multiSubmitFields; } @@ -2839,6 +2886,7 @@ public class ModelForm extends ModelWidg protected String areaId; protected String areaTarget; List<WidgetWorker.Parameter> parameterList =FastList.newInstance(); + List<WidgetWorker.Parameter> redirParameterList =FastList.newInstance(); // #Eam# portletWidget /** XML constructor. * @param updateAreaElement The <code><on-xxx-update-area></code> * XML element. @@ -2851,6 +2899,12 @@ public class ModelForm extends ModelWidg for (Element parameterElement: parameterElementList) { this.parameterList.add(new WidgetWorker.Parameter(parameterElement)); } + // #Bam# portletWidget + parameterElementList = UtilXml.childElementList(updateAreaElement, "redirect-parameter"); + for (Element parameterElement: parameterElementList) { + this.redirParameterList.add(new WidgetWorker.Parameter(parameterElement)); + } + // #Eam# portletWidget } /** String constructor. * @param areaId The id of the widget element to be updated @@ -2881,6 +2935,25 @@ public class ModelForm extends ModelWidg public Map<String, String> getParameterMap(Map<String, Object> context) { Map<String, String> fullParameterMap = FastMap.newInstance(); for (WidgetWorker.Parameter parameter: this.parameterList) { + // #Bam# portletWidget : add property sendIfEmpty in parameters + String paramValue = parameter.getValue(context); + if (UtilValidate.isNotEmpty(paramValue) || parameter.sendIfEmpty(context)){ + fullParameterMap.put(parameter.getName(), parameter.getValue(context)); + } + // #Eam# portletWidget + } + + return fullParameterMap; + } + // #Bam# portletWidget + public boolean hasRedirParamList() { + return UtilValidate.isNotEmpty(this.redirParameterList); + } + + public Map<String, String> getRedirParamList(Map<String, Object> context) { + Map<String, String> fullParameterMap = FastMap.newInstance(); + for (WidgetWorker.Parameter parameter: this.redirParameterList) { + // #Eam# portletWidget fullParameterMap.put(parameter.getName(), parameter.getValue(context)); } Modified: ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/ModelFormAction.java URL: http://svn.apache.org/viewvc/ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/ModelFormAction.java?rev=1370439&r1=1370438&r2=1370439&view=diff ============================================================================== --- ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/ModelFormAction.java (original) +++ ofbiz/branches/20120329_portletWidget/framework/widget/src/org/ofbiz/widget/form/ModelFormAction.java Tue Aug 7 19:13:03 2012 @@ -273,31 +273,37 @@ public abstract class ModelFormAction { } public static class Script extends ModelFormAction { - protected String location; - protected String method; + protected FlexibleStringExpander scriptLocationExdr; public Script(ModelForm modelForm, Element scriptElement) { super (modelForm, scriptElement); - String scriptLocation = scriptElement.getAttribute("location"); - this.location = WidgetWorker.getScriptLocation(scriptLocation); - this.method = WidgetWorker.getScriptMethodName(scriptLocation); + this.scriptLocationExdr = FlexibleStringExpander.getInstance(scriptElement.getAttribute("location")); } @Override public void runAction(Map<String, Object> context) { + Locale locale = (Locale) context.get("locale"); + String scriptLocation = this.scriptLocationExdr.expandString(context, locale); + String location = WidgetWorker.getScriptLocation(scriptLocation); + String method = WidgetWorker.getScriptMethodName(scriptLocation); if (location.endsWith(".xml")) { - Map<String, Object> localContext = FastMap.newInstance(); - localContext.putAll(context); DispatchContext ctx = this.modelForm.dispatchContext; - MethodContext methodContext = new MethodContext(ctx, localContext, null); + MethodContext methodContext = new MethodContext(ctx, context); try { SimpleMethod.runSimpleMethod(location, method, methodContext); - context.putAll(methodContext.getResults()); + Map<String, Object> resultContext = methodContext.getEnv("widget"); + if (UtilValidate.isNotEmpty(resultContext)){ + context.putAll(resultContext); + } + Map<String, Object> parametersUp = methodContext.getParameters(); + if (UtilValidate.isNotEmpty(parametersUp)){ + context.put("parameters",parametersUp); + } } catch (MiniLangException e) { throw new IllegalArgumentException("Error running simple method at location [" + location + "]", e); } } else { - ScriptUtil.executeScript(this.location, this.method, context); + ScriptUtil.executeScript(location, method, context); } } } |
| Free forum by Nabble | Edit this page |
