Author: hansbak
Date: Wed Mar 16 03:39:49 2011 New Revision: 1082041 URL: http://svn.apache.org/viewvc?rev=1082041&view=rev Log: a new version of the category tree, will now display in IE and blankscreen mostly gone....not perfect yet, we will probably make the left column about 50% wider in the next version Added: ofbiz/trunk/framework/images/webapp/images/catalog/categorytree.css (with props) Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryServices.java ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/actions/category/CategoryTree.groovy ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml ofbiz/trunk/applications/product/webapp/catalog/category/CategoryTree.ftl ofbiz/trunk/applications/product/widget/catalog/CommonScreens.xml Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryServices.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryServices.java?rev=1082041&r1=1082040&r2=1082041&view=diff ============================================================================== --- ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryServices.java (original) +++ ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryServices.java Wed Mar 16 03:39:49 2011 @@ -18,14 +18,22 @@ *******************************************************************************/ package org.ofbiz.product.category; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.io.Writer; import java.sql.Timestamp; import java.util.List; import java.util.Locale; import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import javolution.util.FastList; import javolution.util.FastMap; +import net.sf.json.JSONObject; + import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.UtilDateTime; import org.ofbiz.base.util.UtilGenerics; @@ -391,4 +399,116 @@ public class CategoryServices { if (productCategoryMembers != null) result.put("productCategoryMembers", productCategoryMembers); return result; } + + // Please note : the structure of map in this function is according to the JSON data map of the jsTree + @SuppressWarnings("unchecked") + public static void getChildCategoryTree(HttpServletRequest request, HttpServletResponse response){ + Delegator delegator = (Delegator) request.getAttribute("delegator"); + String productCategoryId = request.getParameter("productCategoryId"); + String isCatalog = request.getParameter("isCatalog"); + String entityName = null; + String primaryKeyName = null; + + if (isCatalog.equals("true")) { + entityName = "ProdCatalog"; + primaryKeyName = "prodCatalogId"; + } else { + entityName = "ProductCategory"; + primaryKeyName = "productCategoryId"; + } + + List categoryList = FastList.newInstance(); + List<GenericValue> childOfCats; + + try { + GenericValue category = delegator.findByPrimaryKey(entityName ,UtilMisc.toMap(primaryKeyName, productCategoryId)); + if (UtilValidate.isNotEmpty(category)) { + if (isCatalog.equals("true")) { + CategoryWorker.getRelatedCategories(request, "ChildCatalogList", CatalogWorker.getCatalogTopCategoryId(request, productCategoryId), true); + childOfCats = (List<GenericValue>) request.getAttribute("ChildCatalogList"); + } else { + childOfCats = delegator.findByAnd("ProductCategoryRollup", UtilMisc.toMap( + "parentProductCategoryId", productCategoryId )); + } + if (UtilValidate.isNotEmpty(childOfCats)) { + for (GenericValue childOfCat : childOfCats ) { + + Object catId = null; + String catNameField = null; + + catId = childOfCat.get("productCategoryId"); + catNameField = "CATEGORY_NAME"; + + Map josonMap = FastMap.newInstance(); + List<GenericValue> childList = null; + + // Get the child list of chosen category + childList = delegator.findByAnd("ProductCategoryRollup", UtilMisc.toMap( + "parentProductCategoryId", catId)); + + // Get the chosen category information for the categoryContentWrapper + GenericValue cate = delegator.findByPrimaryKey("ProductCategory" ,UtilMisc.toMap("productCategoryId",catId)); + + // If chosen category's child exists, then put the arrow before category icon + if (UtilValidate.isNotEmpty(childList)) { + josonMap.put("state", "closed"); + } + Map dataMap = FastMap.newInstance(); + Map dataAttrMap = FastMap.newInstance(); + CategoryContentWrapper categoryContentWrapper = new CategoryContentWrapper(cate, request); + + if (UtilValidate.isNotEmpty(categoryContentWrapper.get(catNameField))) { + dataMap.put("title", categoryContentWrapper.get(catNameField)+"["+catId+"]"); + } else { + dataMap.put("title", catId); + } + dataAttrMap.put("onClick","window.location.href='EditCategory?productCategoryId="+catId+"'; return false;"); + + dataMap.put("attr", dataAttrMap); + josonMap.put("data", dataMap); + Map attrMap = FastMap.newInstance(); + attrMap.put("id", catId); + attrMap.put("isCatalog", false); + attrMap.put("rel", "CATEGORY"); + josonMap.put("attr",attrMap); + + categoryList.add(josonMap); + } + toJsonObjectList(categoryList,response); + } + } + } catch (GenericEntityException e) { + e.printStackTrace(); + } + } + + @SuppressWarnings("unchecked") + public static void toJsonObjectList(List attrList, HttpServletResponse response){ + String jsonStr = "["; + for (Object attrMap : attrList) { + JSONObject json = JSONObject.fromObject(attrMap); + jsonStr = jsonStr + json.toString() + ','; + } + jsonStr = jsonStr + "{ } ]"; + if (UtilValidate.isEmpty(jsonStr)) { + Debug.logError("JSON Object was empty; fatal error!",module); + } + // set the X-JSON content type + response.setContentType("application/json"); + // jsonStr.length is not reliable for unicode characters + try { + response.setContentLength(jsonStr.getBytes("UTF8").length); + } catch (UnsupportedEncodingException e) { + Debug.logError("Problems with Json encoding",module); + } + // return the JSON String + Writer out; + try { + out = response.getWriter(); + out.write(jsonStr); + out.flush(); + } catch (IOException e) { + Debug.logError("Unable to get response writer",module); + } + } } Modified: ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/actions/category/CategoryTree.groovy URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/actions/category/CategoryTree.groovy?rev=1082041&r1=1082040&r2=1082041&view=diff ============================================================================== --- ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/actions/category/CategoryTree.groovy (original) +++ ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/actions/category/CategoryTree.groovy Wed Mar 16 03:39:49 2011 @@ -17,56 +17,103 @@ * under the License. */ +/* + * This script is also referenced by the ecommerce's screens and + * should not contain order component's specific code. + */ +import org.ofbiz.entity.util.EntityUtil; import org.ofbiz.base.util.*; import org.ofbiz.product.catalog.*; import org.ofbiz.product.category.*; -import org.ofbiz.entity.GenericValue; import javolution.util.FastMap; import javolution.util.FastList; -import org.ofbiz.base.util.UtilMisc; -import org.ofbiz.base.util.UtilValidate; -import org.ofbiz.entity.GenericValue; -import org.ofbiz.entity.util.EntityUtil; -import javax.servlet.http.HttpSession; +import javolution.util.FastList.*; +import org.ofbiz.entity.*; +import java.util.List; + +// Put the result of CategoryWorker.getRelatedCategories into the fillTree function as attribute. +// The fillTree function will return the complete list of category of given catalog. +// PLEASE NOTE : The structure of the complete list of fillTree function is according to the JSON_DATA plugin of the jsTree. + +List fillTree(rootCat) { + if (rootCat) { + rootCat.sort{ it.productCategoryId } + def listTree = FastList.newInstance(); + for (root in rootCat) { + preCatChilds = delegator.findByAnd("ProductCategoryRollup", ["parentProductCategoryId": root.productCategoryId]); + catChilds = EntityUtil.getRelated("CurrentProductCategory",preCatChilds); + def childList = FastList.newInstance(); + def rootMap = FastMap.newInstance(); + category = delegator.findByPrimaryKey("ProductCategory", ["productCategoryId": root.productCategoryId]); + categoryContentWrapper = new CategoryContentWrapper(category, request); + context.title = categoryContentWrapper.CATEGORY_NAME; + categoryDescription = categoryContentWrapper.DESCRIPTION; + + if (categoryContentWrapper.CATEGORY_NAME) { + rootMap["categoryName"] = categoryContentWrapper.CATEGORY_NAME; + } else { + rootMap["categoryName"] = root.categoryName; + } + if (categoryContentWrapper.DESCRIPTION) { + rootMap["categoryDescription"] = categoryContentWrapper.DESCRIPTION; + } else { + rootMap["categoryDescription"] = root.description; + } + rootMap["productCategoryId"] = root.productCategoryId; + rootMap["child"] = catChilds; + rootMap["isCatalog"] = false; + listTree.add(rootMap); + + } + return listTree; + } +} + +completedTree = FastList.newInstance(); -prodCatalogList = FastList.newInstance(); +// Get the Catalogs prodCatalogs = delegator.findByAnd("ProdCatalog"); + if (prodCatalogs.size() > 0) { for (i = 0; i < prodCatalogs.size(); i++) { prodCatalogMap = FastMap.newInstance(); prodCatalog = prodCatalogs[i]; prodCatalogId = prodCatalog.getString("prodCatalogId"); - prodCatalogMap.put("prodCatalogId", prodCatalogId); - prodCatalogMap.put("catalogName", prodCatalog.getString("catalogName")); - prodCatalogMap.put("catalogName", prodCatalog.getString("catalogName")); - - //root category list of the catalog - prodCategoryList = CatalogWorker.getProdCatalogCategories(request, prodCatalogId, null); - rootCategoryList = FastList.newInstance(); - if (prodCategoryList.size() > 0) { - for (j = 0; j < prodCategoryList.size(); j++) { - prodCategory = prodCategoryList[j]; - rootCategory = delegator.findByPrimaryKey("ProductCategory", ["productCategoryId" : prodCategory.getString("productCategoryId")]); - rootCategoryList.add(rootCategory); - } - } - - if (rootCategoryList) { - prodCatalogMap.put("rootCategoryList", rootCategoryList); - prodCatalogList.add(prodCatalogMap); + prodCatalogMap.put("productCategoryId", prodCatalogId); + prodCatalogMap.put("categoryName", prodCatalog.getString("catalogName")); + prodCatalogMap.put("isCatalog", true); + + CategoryWorker.getRelatedCategories(request, "CatalogList_"+i, CatalogWorker.getCatalogTopCategoryId(request, prodCatalogId), true); + categoryList = null; + categoryList = request.getAttribute("CatalogList_"+i); + prodCatalogTree = FastList.newInstance(); + + if (categoryList) { + prodCatalogTree = fillTree(categoryList); + prodCatalogMap.put("child", prodCatalogTree); + completedTree.add(prodCatalogMap); } } } +// The complete tree list for the category tree +context.completedTree = completedTree; -context.prodCatalogList = prodCatalogList; - -openTree = false; +stillInCatalogManager = true; productCategoryId = null; +prodCatalogId = null; +showProductCategoryId = null; + +// Reset tree condition check. Are we still in the Catalog Manager ?. If not , then reset the tree. if ((parameters.productCategoryId != null) || (parameters.showProductCategoryId != null)) { - openTree = true; - productCategoryId = (parameters.productCategoryId != null) ? parameters.productCategoryId : parameters.showProductCategoryId; + stillInCatalogManager = false; + productCategoryId = parameters.productCategoryId; + showProductCategoryId = parameters.showProductCategoryId; +} else if (parameters.prodCatalogId != null) { + stillInCatalogManager = false; + prodCatalogId = parameters.prodCatalogId; } - -context.openTree = openTree; +context.stillInCatalogManager = stillInCatalogManager; context.productCategoryId = productCategoryId; +context.prodCatalogId = prodCatalogId; +context.showProductCategoryId = showProductCategoryId; Modified: ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml?rev=1082041&r1=1082040&r2=1082041&view=diff ============================================================================== --- ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml (original) +++ ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml Wed Mar 16 03:39:49 2011 @@ -3076,6 +3076,12 @@ under the License. <response name="error" type="view" value="EditProductPromoContent"/> </request-map> + <request-map uri="getChild"> + <security auth="false" https="true"/> + <event type="java" path="org.ofbiz.product.category.CategoryServices" invoke="getChildCategoryTree"/> + <response name="success" type="none"/> + </request-map> + <!-- View Mappings --> <view-map name="main" type="screen" page="component://product/widget/catalog/CommonScreens.xml#main"/> Modified: ofbiz/trunk/applications/product/webapp/catalog/category/CategoryTree.ftl URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/catalog/category/CategoryTree.ftl?rev=1082041&r1=1082040&r2=1082041&view=diff ============================================================================== --- ofbiz/trunk/applications/product/webapp/catalog/category/CategoryTree.ftl (original) +++ ofbiz/trunk/applications/product/webapp/catalog/category/CategoryTree.ftl Wed Mar 16 03:39:49 2011 @@ -16,66 +16,31 @@ KIND, either express or implied. See th specific language governing permissions and limitations under the License. --> -<script language="javascript" type="text/javascript" src="<@ofbizContentUrl>/images/jquery/ui/development-bundle/external/jquery.cookie.js</@ofbizContentUrl>"></script> -<script language="javascript" type="text/javascript" src="<@ofbizContentUrl>/images/jquery/plugins/jsTree/jquery.jstree.js</@ofbizContentUrl>"></script> -<script type="application/javascript"> -<#-- some labels are not unescaped in the JSON object so we have to do this manuely --> +<script type="text/javascript"> +<#-- some labels are not unescaped in the JSON object so we have to do this manualy --> function unescapeHtmlText(text) { return jQuery('<div />').html(text).text() } - -createTree(); + +jQuery(window).load(createTree()); <#-- creating the JSON Data --> var rawdata = [ - <#if (prodCatalogList?has_content)> - <@fillCatalogTree prodCatalogs = prodCatalogList/> - </#if> - - <#macro fillCatalogTree prodCatalogs> - <#if (prodCatalogs?has_content)> - <#list prodCatalogs as catalog> - <#assign catalogId = catalog.prodCatalogId/> - <#if !catalogName?has_content> - - </#if> - <#assign categoryList = catalog.rootCategoryList/> - { - <#if catalogId?has_content> - "data": {"title" : unescapeHtmlText("<#if catalog.catalogName?has_content>${catalog.catalogName}<#else>${catalogId}</#if> <#if catalog.catalogName?has_content>[${catalogId}]</#if>"), "attr": {"href": "<@ofbizUrl>/EditProdCatalog?prodCatalogId=${catalogId}</@ofbizUrl>", "onClick" : "callDocument('<@ofbizUrl>/EditProdCatalog?prodCatalogId=${catalogId}</@ofbizUrl>');"}}, - "attr": {"id" : "${catalogId}", "rel" : "root"}, - - </#if> - <#if categoryList?has_content> - "children": [ - <@fillCategoryTree childCategoryList = categoryList/> - ] - </#if> - <#if catalog_has_next> - }, - <#else> - } - </#if> - </#list> - </#if> - </#macro> + <#if (completedTree?has_content)> + <@fillTree rootCat = completedTree/> + </#if> - <#macro fillCategoryTree childCategoryList> - <#if childCategoryList?has_content> - <#list childCategoryList as childCategory> + <#macro fillTree rootCat> + <#if (rootCat?has_content)> + <#list rootCat as root> { - <#local productCategoryId = childCategory.productCategoryId/> - <#local childCategorys = Static["org.ofbiz.product.category.CategoryWorker"].getRelatedCategoriesRet(request, "childCategoryList", productCategoryId, true)> - "data": {"title" : unescapeHtmlText("<#if childCategory.categoryName?has_content>${childCategory.categoryName}<#else>${productCategoryId}</#if> <#if childCategory.categoryName?has_content>[${productCategoryId}]</#if>"), "attr": {"href": "<@ofbizUrl>/EditCategory?productCategoryId=${productCategoryId}</@ofbizUrl>", "onClick" : "callDocument('<@ofbizUrl>/EditCategory?productCategoryId=${productCategoryId}</@ofbizUrl>');"}}, - "attr": {"id" : "${productCategoryId}", "rel" : "CATEGORY"}, - - <#if childCategoryList?has_content> - "children": [ - <@fillCategoryTree childCategoryList = childCategorys/> - ] + "data": {"title" : unescapeHtmlText("<#if root.categoryName?exists>${root.categoryName?js_string} [${root.productCategoryId}]<#else>${root.productCategoryId?js_string}</#if>"), "attr": {"onClick" : "window.location.href='<@ofbizUrl>/EditProdCatalog?prodCatalogId=${root.productCategoryId}</@ofbizUrl>'; return false;"}}, + "attr": {"id" : "${root.productCategoryId}", "rel" : "root", "isCatalog" : "${root.isCatalog?string}"} + <#if root.child?exists> + ,"state" : "closed" </#if> - <#if childCategory_has_next> + <#if root_has_next> }, <#else> } @@ -84,33 +49,39 @@ var rawdata = [ </#if> </#macro> ]; - - <#-------------------------------------------------------------------------------------create Tree--> + <#-- create Tree--> function createTree() { jQuery(function () { - <#if !openTree> + <#-- reset the tree when user browsing out of scope of catalog manager --> + <#if stillInCatalogManager> $.cookie('jstree_select', null); $.cookie('jstree_open', null); <#else> - $.cookie("jstree_select", "${productCategoryId}"); + <#-- Coloring the category when type the product categoryId manualy at the url bar --> + $.cookie('jstree_select', "<#if productCategoryId?exists>${productCategoryId}<#elseif prodCatalogId?exists>${prodCatalogId}<#elseif showProductCategoryId?exists>${showProductCategoryId}</#if>"); </#if> jQuery("#tree").jstree({ - "plugins" : [ "themes", "json_data", "cookies", "ui", "types"], + "plugins" : [ "themes", "json_data","ui" ,"cookies", "types"], "json_data" : { - "data" : rawdata + "data" : rawdata, + "ajax" : { "url" : "<@ofbizUrl>getChild</@ofbizUrl>", "type" : "POST", + "data" : function (n) { + return { + "isCatalog" : n.attr ? n.attr("isCatalog").replace("node_","") : 1 , + "productCategoryId" : n.attr ? n.attr("id").replace("node_","") : 1 + }; + } + } }, "themes" : { "icons" : true }, - "cookies" : { - "save_opened" : false - }, "types" : { "valid_children" : [ "root" ], "types" : { "CATEGORY" : { - "icon" : { + "icon" : { "image" : "/images/jquery/plugins/jsTree/themes/apple/d.png", "position" : "10px40px" } @@ -118,27 +89,8 @@ var rawdata = [ } } }); - }); - - } - - function callDocument(url) { - $(location).attr('href', url); } - </script> <div id="tree"></div> -<style type="text/css"> - .jstree-default a - { - white-space:normal !important; - height: auto; - } - .jstree-default .jstree-leaf > ins - { - background-position:-36px 0; - vertical-align: top; - } -</style> Modified: ofbiz/trunk/applications/product/widget/catalog/CommonScreens.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/widget/catalog/CommonScreens.xml?rev=1082041&r1=1082040&r2=1082041&view=diff ============================================================================== --- ofbiz/trunk/applications/product/widget/catalog/CommonScreens.xml (original) +++ ofbiz/trunk/applications/product/widget/catalog/CommonScreens.xml Wed Mar 16 03:39:49 2011 @@ -41,6 +41,10 @@ under the License. <set field="applicationMenuName" value="CatalogAppBar" global="true"/> <set field="applicationMenuLocation" value="component://product/widget/catalog/CatalogMenus.xml" global="true"/> <set field="applicationTitle" value="${uiLabelMap.ProductCatalogManagerApplication}" global="true"/> + <set field="layoutSettings.javaScripts[+0]" value="/images/jquery/ui/development-bundle/external/jquery.cookie.js" global="true"/> + <set field="layoutSettings.javaScripts[+0]" value="/images/jquery/plugins/jsTree/jquery.jstree.js" global="true"/> + <set field="layoutSettings.javaScripts[+0]" value="/images/jquery/jquery-1.4.2.min.js" global="true"/> + <set field="layoutSettings.styleSheets[+0]" value="/images/catalog/categorytree.css" global="true"/> </actions> <widgets> <include-screen name="ApplicationDecorator" location="component://commonext/widget/CommonScreens.xml"/> @@ -343,7 +347,6 @@ under the License. <screen name="categorytree"> <section> <actions> - <set field="layoutSettings.javaScripts[+0]" value="/images/jquery/jquery-1.4.2.min.js" global="true"/> <script location="component://product/webapp/catalog/WEB-INF/actions/category/CategoryTree.groovy"></script> </actions> <widgets> Added: ofbiz/trunk/framework/images/webapp/images/catalog/categorytree.css URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/catalog/categorytree.css?rev=1082041&view=auto ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/catalog/categorytree.css (added) +++ ofbiz/trunk/framework/images/webapp/images/catalog/categorytree.css Wed Mar 16 03:39:49 2011 @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* THE CUSTOM CSS FOR AJUST THE CATEGORY TREE */ +.jstree-default a { +white-space:normal !important; +height: auto; +} +.jstree-default .jstree-leaf > ins { +background-position:-36px 0; +vertical-align: top; +} Propchange: ofbiz/trunk/framework/images/webapp/images/catalog/categorytree.css ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/catalog/categorytree.css ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/catalog/categorytree.css ------------------------------------------------------------------------------ svn:mime-type = text/css |
Free forum by Nabble | Edit this page |