You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ha...@apache.org on 2011/03/16 04:39:50 UTC

svn commit: r1082041 - in /ofbiz/trunk: applications/product/src/org/ofbiz/product/category/ applications/product/webapp/catalog/WEB-INF/ applications/product/webapp/catalog/WEB-INF/actions/category/ applications/product/webapp/catalog/category/ applic...

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="<@o...@ofbizContentUrl>"></script>
-<script language="javascript" type="text/javascript" src="<@o...@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": "<@o...@ofbizUrl>", "onClick" : "callDocument('<@o...@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": "<@o...@ofbizUrl>", "onClick" : "callDocument('<@o...@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='<@o...@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" : "<@o...@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



Re: svn commit: r1082041 - in /ofbiz/trunk: applications/product/src/org/ofbiz/product/category/ applications/product/webapp/catalog/WEB-INF/ applications/product/webapp/catalog/WEB-INF/actions/category/ applications/product/webapp/catalog/category/ applic

Posted by Jacques Le Roux <ja...@les7arts.com>.
Right,

I don't see them anymore. It was on FF, maybe my machine (XP just upgraded), forget it (hopefully definitively).

BTW the tree is really better now :o)

Jacques

From: "Hans Bakker" <ma...@antwebsystems.com>
> What is the url? i do not see them?
>
> On Wed, 2011-03-16 at 07:48 +0100, Jacques Le Roux wrote:
>> Hi Hans,
>>
>> I did not have time to review, but could it be the reason we have squares instead of letters on trunk demo (lang=en)?
>>
>> Thanks
>>
>> Jacques
>>
>>
>> hansbak@apache.org wrote:
>> > 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="<@o...@ofbizContentUrl>"></script>
>> > -<script language="javascript" type="text/javascript"
>> > src="<@o...@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":
>> > "<@o...@ofbizUrl>", "onClick" :
>> > "callDocument('<@o...@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":
>> > "<@o...@ofbizUrl>", "onClick" :
>> > "callDocument('<@o...@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='<@o...@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" : "<@o...@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
>>
>>
>
> -- 
> Ofbiz on twitter: http://twitter.com/apache_ofbiz
> Myself on twitter: http://twitter.com/hansbak
> Antwebsystems.com: Quality services for competitive rates.
>



Re: svn commit: r1082041 - in /ofbiz/trunk: applications/product/src/org/ofbiz/product/category/ applications/product/webapp/catalog/WEB-INF/ applications/product/webapp/catalog/WEB-INF/actions/category/ applications/product/webapp/catalog/category/ applic

Posted by Hans Bakker <ma...@antwebsystems.com>.
What is the url? i do not see them?

On Wed, 2011-03-16 at 07:48 +0100, Jacques Le Roux wrote:
> Hi Hans,
> 
> I did not have time to review, but could it be the reason we have squares instead of letters on trunk demo (lang=en)?
> 
> Thanks
> 
> Jacques
> 
> 
> hansbak@apache.org wrote:
> > 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="<@o...@ofbizContentUrl>"></script>
> > -<script language="javascript" type="text/javascript"
> > src="<@o...@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":
> > "<@o...@ofbizUrl>", "onClick" :
> > "callDocument('<@o...@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":
> > "<@o...@ofbizUrl>", "onClick" :
> > "callDocument('<@o...@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='<@o...@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" : "<@o...@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 
> 
> 

-- 
Ofbiz on twitter: http://twitter.com/apache_ofbiz
Myself on twitter: http://twitter.com/hansbak
Antwebsystems.com: Quality services for competitive rates.


Re: svn commit: r1082041 - in /ofbiz/trunk: applications/product/src/org/ofbiz/product/category/ applications/product/webapp/catalog/WEB-INF/ applications/product/webapp/catalog/WEB-INF/actions/category/ applications/product/webapp/catalog/category/ applic

Posted by Jacques Le Roux <ja...@les7arts.com>.
Hi Hans,

I did not have time to review, but could it be the reason we have squares instead of letters on trunk demo (lang=en)?

Thanks

Jacques


hansbak@apache.org wrote:
> 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="<@o...@ofbizContentUrl>"></script>
> -<script language="javascript" type="text/javascript"
> src="<@o...@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":
> "<@o...@ofbizUrl>", "onClick" :
> "callDocument('<@o...@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":
> "<@o...@ofbizUrl>", "onClick" :
> "callDocument('<@o...@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='<@o...@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" : "<@o...@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