Author: bibryam
Date: Mon Oct 6 12:29:40 2008 New Revision: 702236 URL: http://svn.apache.org/viewvc?rev=702236&view=rev Log: Applied the patch from JIRA Issue # List-Multi form column sorting". Thanks to Bruno Busco for helping and patience. As this is my first commit to framework, I'd really appreciate if you could review this commit. Modified: ofbiz/trunk/framework/example/widget/example/ExampleForms.xml ofbiz/trunk/framework/images/webapp/images/maincss.css ofbiz/trunk/framework/widget/dtd/widget-form.xsd ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java Modified: ofbiz/trunk/framework/example/widget/example/ExampleForms.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/example/widget/example/ExampleForms.xml?rev=702236&r1=702235&r2=702236&view=diff ============================================================================== --- ofbiz/trunk/framework/example/widget/example/ExampleForms.xml (original) +++ ofbiz/trunk/framework/example/widget/example/ExampleForms.xml Mon Oct 6 12:29:40 2008 @@ -49,15 +49,16 @@ <service service-name="performFind" result-map-name="result" result-map-list-name="listIt"> <field-map field-name="inputFields" env-name="exampleCtx"/> <field-map field-name="entityName" value="Example"/> + <field-map field-name="orderBy" env-name="parameters.sortField"/> </service> </actions> <field name="exampleId" title="${uiLabelMap.ExampleExampleId}" widget-style="buttontext"> <hyperlink also-hidden="false" description="${exampleId}" target="EditExample?exampleId=${exampleId}"/> </field> - <field name="exampleName" title="${uiLabelMap.CommonName}"><display/></field> + <field name="exampleName" title="${uiLabelMap.CommonName}" sort-field="true"><display/></field> <field name="exampleTypeId" title="${uiLabelMap.CommonType}"><display-entity entity-name="ExampleType"/></field> <field name="statusId" title="${uiLabelMap.CommonStatus}"><display-entity entity-name="StatusItem"/></field> - <field name="description" title="${uiLabelMap.CommonDescription}"><display/></field> + <field name="description" title="${uiLabelMap.CommonDescription}" sort-field="true"><display/></field> </form> <!-- Typically, this extended form wouldn't be necessary. The parent form (ListExamples) would Modified: ofbiz/trunk/framework/images/webapp/images/maincss.css URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/maincss.css?rev=702236&r1=702235&r2=702236&view=diff ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/maincss.css (original) +++ ofbiz/trunk/framework/images/webapp/images/maincss.css Mon Oct 6 12:29:40 2008 @@ -1501,6 +1501,23 @@ text-align: left; } +/* ===== Sort field style ===== */ +.basic-table .header-row-2 th .sort-order-asc, +.basic-table .header-row-2 td .sort-order-asc{ +background: url(/images/arrow-gr-up.png) no-repeat right; +padding-right: 20px; +} +.basic-table .header-row-2 th .sort-order-desc, +.basic-table .header-row-2 td .sort-order-desc{ +background: url(/images/arrow-gr-dw.png) no-repeat right; +padding-right: 20px; +} +.basic-table .header-row-2 th .sort-order, +.basic-table .header-row-2 td .sort-order{ +background: url(/images/arrow-gr.png) no-repeat right; +padding-right: 20px; +} + /* ===== Table decorator - Hover bar ===== */ .hover-bar tr:hover { Modified: ofbiz/trunk/framework/widget/dtd/widget-form.xsd URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/dtd/widget-form.xsd?rev=702236&r1=702235&r2=702236&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/dtd/widget-form.xsd (original) +++ ofbiz/trunk/framework/widget/dtd/widget-form.xsd Mon Oct 6 12:29:40 2008 @@ -101,6 +101,15 @@ <xs:attribute type="xs:string" name="default-widget-style"/> <xs:attribute type="xs:string" name="default-tooltip-style"/> <xs:attribute type="xs:string" name="default-required-field-style"/> + <xs:attribute type="xs:string" name="default-sort-field-style"> + <xs:annotation><xs:documentation>CSS style to used for form sort fields. Defaults to "sort-order".</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="default-sort-field-asc-style"> + <xs:annotation><xs:documentation>CSS style to used for form sort fields. Defaults to "sort-order-asc".</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="default-sort-field-desc-style"> + <xs:annotation><xs:documentation>CSS style to used for form sort fields. Defaults to "sort-order-desc".</xs:documentation></xs:annotation> + </xs:attribute> <xs:attribute name="paginate" default="true"> <xs:simpleType> <xs:restriction base="xs:token"> @@ -446,6 +455,23 @@ <xs:attribute type="xs:string" name="required-field-style"> <xs:annotation><xs:documentation>The name of a style (like a CSS class) to apply to the title of this field if required. Will default to form's default-required-field-style. If field is required, but required-field-style is empty, an '*' will be placed to the right of text, textarea and password fields.</xs:documentation></xs:annotation> </xs:attribute> + <xs:attribute name="sort-field" default="false"> + <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="sort-field-style"> + <xs:annotation><xs:documentation>The name of a style (like a CSS class) to apply to the sort field link. Will default to form's default-sort-field-style.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="sort-field-asc-style"> + <xs:annotation><xs:documentation>The name of a style (like a CSS class) to apply to the sort field link ordered ascending. Will default to form's default-sort-field-asc-style.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="sort-field-desc-style"> + <xs:annotation><xs:documentation>The name of a style (like a CSS class) to apply to the sort field link ordered descending. Will default to form's default-sort-field-desc-style.</xs:documentation></xs:annotation> + </xs:attribute> </xs:attributeGroup> <!-- ================== FIELD TYPES ==================== --> Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java?rev=702236&r1=702235&r2=702236&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java Mon Oct 6 12:29:40 2008 @@ -115,6 +115,9 @@ protected boolean useRowSubmit = false; protected FlexibleStringExpander targetWindowExdr; protected String defaultRequiredFieldStyle; + protected String defaultSortFieldStyle; + protected String defaultSortFieldAscStyle; + protected String defaultSortFieldDescStyle; protected String oddRowStyle; protected String evenRowStyle; protected String defaultTableStyle; @@ -176,6 +179,11 @@ public static String DEFAULT_PAG_NEXT_STYLE = "nav-next"; public static String DEFAULT_PAG_LAST_STYLE = "nav-last"; + /** Sort field default styles. */ + public static String DEFAULT_SORT_FIELD_STYLE = "sort-order"; + public static String DEFAULT_SORT_FIELD_ASC_STYLE = "sort-order-asc"; + public static String DEFAULT_SORT_FIELD_DESC_STYLE = "sort-order-desc"; + protected List<ModelFormAction> actions; protected List<ModelFormAction> rowActions; protected FlexibleStringExpander rowCountExdr; @@ -387,6 +395,15 @@ if (this.defaultRequiredFieldStyle == null || formElement.hasAttribute("default-required-field-style")) { this.defaultRequiredFieldStyle = formElement.getAttribute("default-required-field-style"); } + if (this.defaultSortFieldStyle == null || formElement.hasAttribute("default-sort-field-style")) { + this.defaultSortFieldStyle = formElement.getAttribute("default-sort-field-style"); + } + if (this.defaultSortFieldAscStyle == null || formElement.hasAttribute("default-sort-field-asc-style")) { + this.defaultSortFieldAscStyle = formElement.getAttribute("default-sort-field-asc-style"); + } + if (this.defaultSortFieldDescStyle == null || formElement.hasAttribute("default-sort-field-desc-style")) { + this.defaultSortFieldDescStyle = formElement.getAttribute("default-sort-field-desc-style"); + } // pagination settings if (this.paginateTarget == null || formElement.hasAttribute("paginate-target")) { @@ -1794,6 +1811,18 @@ public String getDefaultRequiredFieldStyle() { return this.defaultRequiredFieldStyle; } + + public String getDefaultSortFieldStyle() { + return (UtilValidate.isEmpty(this.defaultSortFieldStyle) ? DEFAULT_SORT_FIELD_STYLE : this.defaultSortFieldStyle); + } + + public String getDefaultSortFieldAscStyle() { + return (UtilValidate.isEmpty(this.defaultSortFieldAscStyle) ? DEFAULT_SORT_FIELD_ASC_STYLE : this.defaultSortFieldAscStyle); + } + + public String getDefaultSortFieldDescStyle() { + return (UtilValidate.isEmpty(this.defaultSortFieldDescStyle) ? DEFAULT_SORT_FIELD_DESC_STYLE : this.defaultSortFieldDescStyle); + } /** @@ -2589,6 +2618,25 @@ return inbetweenList; } + public String getSortField(Map<String, Object> context) { + String field = "sortField"; + String value = null; + + try { + value = (String)context.get(field); + if (value == null) { + Map parameters = (Map) context.get("parameters"); + if (parameters != null) { + value = (String)parameters.get(field); + } + } + } catch (Exception e) { + Debug.logWarning(e, "Error getting sortField: " + e.toString(), module); + } + + return value; + } + /* Returns the list of ModelForm.UpdateArea objects. */ public List<UpdateArea> getOnSubmitUpdateAreas() { Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java?rev=702236&r1=702235&r2=702236&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java Mon Oct 6 12:29:40 2008 @@ -92,6 +92,9 @@ protected String widgetStyle; protected String tooltipStyle; protected String requiredFieldStyle; + protected String sortFieldStyle; + protected String sortFieldAscStyle; + protected String sortFieldDescStyle; protected Integer position = null; protected String redWhen; protected String event; @@ -102,6 +105,7 @@ protected String idName; protected boolean separateColumn = false; protected Boolean requiredField = null; + protected Boolean sortField = null; protected String headerLink; protected String headerLinkStyle; @@ -135,6 +139,9 @@ this.widgetStyle = fieldElement.getAttribute("widget-style"); this.tooltipStyle = fieldElement.getAttribute("tooltip-style"); this.requiredFieldStyle = fieldElement.getAttribute("required-field-style"); + this.sortFieldStyle = fieldElement.getAttribute("sort-field-style"); + this.sortFieldAscStyle = fieldElement.getAttribute("sort-field-asc-style"); + this.sortFieldDescStyle = fieldElement.getAttribute("sort-field-desc-style"); this.redWhen = fieldElement.getAttribute("red-when"); this.event = fieldElement.getAttribute("event"); this.setAction(fieldElement.hasAttribute("action")? fieldElement.getAttribute("action"): null); @@ -144,6 +151,7 @@ if (sepColumns != null && sepColumns.equalsIgnoreCase("true")) separateColumn = true; this.requiredField = fieldElement.hasAttribute("required-field") ? "true".equals(fieldElement.getAttribute("required-field")) : null; + this.sortField = fieldElement.hasAttribute("sort-field") ? "true".equals(fieldElement.getAttribute("sort-field")) : null; this.headerLink = fieldElement.getAttribute("header-link"); this.headerLinkStyle = fieldElement.getAttribute("header-link-style"); @@ -271,7 +279,8 @@ this.tooltip = overrideFormField.tooltip; if (overrideFormField.requiredField != null) this.requiredField = overrideFormField.requiredField; - + if (overrideFormField.sortField != null) + this.sortField = overrideFormField.sortField; if (UtilValidate.isNotEmpty(overrideFormField.titleAreaStyle)) this.titleAreaStyle = overrideFormField.titleAreaStyle; if (UtilValidate.isNotEmpty(overrideFormField.widgetAreaStyle)) @@ -1070,6 +1079,27 @@ return this.modelForm.getDefaultRequiredFieldStyle(); } } + + public String getSortFieldStyle() { + if (UtilValidate.isNotEmpty(this.sortFieldStyle)) { + return this.sortFieldStyle; + } + return this.modelForm.getDefaultSortFieldStyle(); + } + + public String getSortFieldStyleAsc() { + if (UtilValidate.isNotEmpty(this.sortFieldAscStyle)) { + return this.sortFieldAscStyle; + } + return this.modelForm.getDefaultSortFieldAscStyle(); + } + + public String getSortFieldStyleDesc() { + if (UtilValidate.isNotEmpty(this.sortFieldDescStyle)) { + return this.sortFieldDescStyle; + } + return this.modelForm.getDefaultSortFieldDescStyle(); + } /** * @return @@ -1378,6 +1408,20 @@ } /** + * @return + */ + public boolean isSortField() { + return this.sortField != null ? this.sortField.booleanValue() : false; + } + + /** + * @param boolean + */ + public void setSortField(boolean sort) { + this.sortField = Boolean.valueOf(sort); + } + + /** * @param ModelForm */ public void setModelForm(ModelForm modelForm) { Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java?rev=702236&r1=702235&r2=702236&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java Mon Oct 6 12:29:40 2008 @@ -2416,6 +2416,85 @@ appendWhitespace(writer); } + public void renderSortField(Appendable writer, Map<String, Object> context, ModelFormField modelFormField, String titleText) throws IOException { + boolean ajaxEnabled = false; + ModelForm modelForm = modelFormField.getModelForm(); + List<ModelForm.UpdateArea> updateAreas = modelForm.getOnPaginateUpdateAreas(); + String targetService = modelForm.getPaginateTarget(context); + if (this.javaScriptEnabled) { + if (UtilValidate.isNotEmpty(updateAreas)) { + ajaxEnabled = true; + } + } + if (targetService == null) { + targetService = "${targetService}"; + } + if (UtilValidate.isEmpty(targetService) && updateAreas == null) { + Debug.logWarning("Cannot sort because TargetService is empty for the form: " + modelForm.getName(), module); + return; + } + + String str = (String) context.get("_QBESTRING_"); + String oldSortField = modelForm.getSortField(context); + String sortFieldStyle = modelFormField.getSortFieldStyle(); + + // if the entry-name is defined use this instead of field name + String coulumnField = modelFormField.getEntryName(); + if (UtilValidate.isEmpty(coulumnField)) { + coulumnField = modelFormField.getFieldName(); + } + + // switch beetween asc/desc order + String newSortField = coulumnField; + if (UtilValidate.isNotEmpty(oldSortField)) { + if (oldSortField.equals(coulumnField)) { + newSortField = "-" + coulumnField; + sortFieldStyle = modelFormField.getSortFieldStyleDesc(); + } else if (oldSortField.equals("-" + coulumnField)) { + newSortField = coulumnField; + sortFieldStyle = modelFormField.getSortFieldStyleAsc(); + } + } + + // strip sortField param from the query string + HashSet<String> paramName = new HashSet<String>(); + paramName.add("sortField"); + String queryString = UtilHttp.stripNamedParamsFromQueryString(str, paramName); + String urlPath = UtilHttp.removeQueryStringFromTarget(targetService); + String prepLinkText = UtilHttp.getQueryStringFromTarget(targetService); + if (prepLinkText == null) { + prepLinkText = ""; + } + if (prepLinkText.indexOf("?") < 0) { + prepLinkText += "?"; + } else if (!prepLinkText.endsWith("?")) { + prepLinkText += "&"; + } + if (!UtilValidate.isEmpty(queryString) && !queryString.equals("null")) { + prepLinkText += queryString + "&"; + } + prepLinkText += "sortField" + "=" + newSortField; + if (ajaxEnabled) { + prepLinkText = prepLinkText.replace("?", ""); + prepLinkText = prepLinkText.replace("&", "&"); + } + + writer.append("<a"); + if (UtilValidate.isNotEmpty(sortFieldStyle)) { + writer.append(" class=\""); + writer.append(sortFieldStyle); + writer.append("\""); + } + + writer.append(" href=\""); + if (ajaxEnabled) { + writer.append("javascript:ajaxUpdateAreas('" + createAjaxParamsFromUpdateAreas(updateAreas, prepLinkText, context) + "')"); + } else { + writer.append(rh.makeLink(this.request, this.response, urlPath + prepLinkText)); + } + writer.append("\">" + titleText + "</a>"); + } + /* (non-Javadoc) * @see org.ofbiz.widget.form.FormStringRenderer#renderFileField(java.io.Writer, java.util.Map, org.ofbiz.widget.form.ModelFormField.FileField) */ @@ -2679,6 +2758,8 @@ targetType="plain"; } makeHyperlinkString(writer, modelFormField.getHeaderLinkStyle(), targetType, targetBuffer.toString(), titleText, null, null, null); + } else if (modelFormField.isSortField()) { + renderSortField (writer, context, modelFormField, titleText); } else if (modelFormField.isRowSubmit()) { if (UtilValidate.isNotEmpty(titleText)) writer.append(titleText + "<br/>"); writer.append("<input type=\"checkbox\" name=\"selectAll\" value=\"Y\" onclick=\"javascript:toggleAll(this, '"); |
Free forum by Nabble | Edit this page |