当前位置: 代码迷 >> Web前端 >> 项目小结:复杂树状菜单-结点增改删(ZTree)
  详细解决方案

项目小结:复杂树状菜单-结点增改删(ZTree)

热度:291   发布时间:2013-04-02 12:35:26.0
项目总结:复杂树状菜单-结点增改删(ZTree)

<script type="text/javascript">
<!--
   var userGroup;
   var CanAddDeleteComponent;


   var setting = {
//        async: {
//            enable: true,
//            url: '<%= Url.Action("GetTree") %>',
//            autoParam: ["id", "pId", "name=n", "level=lv"],
//            otherParam: { "productId": '1' }
////                otherParam: { "otherParam": "zTreeAsyncTest" },
////            dataFilter: filter
//        },
       view: {
           addHoverDom: addHoverDom,
           removeHoverDom: removeHoverDom,
           selectedMulti: false
       },
//        check: {
//            enable: true
//        },
       edit: {
           enable: true,
           editNameSelectAll: true,
           //showRenameBtn: setRenameBtn,
           showRenameBtn: false,
                showRemoveBtn: setRemoveBtn                
       },
       data: {
           simpleData: {
               enable: true
           }
       },
       callback: {
           beforeDrag: beforeDrag,
           beforeEditName: beforeEditName,
           beforeRemove: beforeRemove,
           beforeRename: beforeRename,
           onRemove: onRemove,
           onRename: onRename
       }
   };


//    var zNodes = [
// { id: 1, pId: 0, name: "Parent Node 1", open: true },
// { id: 11, pId: 1, name: "2nd Level 1-1", open: true },
//            { id: 111, pId: 11, name: "3nd Level 1-1-1" },
//            { id: 112, pId: 11, name: "3nd Level 1-1-2" },
// { id: 12, pId: 1, name: "2nd Level 1-2" },
//            { id: 121, pId: 12, name: "3nd Level 1-1-1" },
//            { id: 122, pId: 12, name: "3nd Level 1-1-2" },
// { id: 13, pId: 1, name: "2nd Level 1-3" }
// ];


   function filter(treeId, parentNode, childNodes) {
       if (!childNodes) return null;
       for (var i = 0, l = childNodes.length; i < l; i++) {
           childNodes[i].name = childNodes[i].name.replace(/\.n/g, '.');
       }
       return childNodes;
   }


   var log, className = "dark";
   function beforeDrag(treeId, treeNodes) {
       return false;
   }
   function beforeEditName(treeId, treeNode) {
       className = (className === "dark" ? "":"dark");
       showLog("[ "+getTime()+" beforeEditName ]     " + treeNode.name);
       var zTree = $.fn.zTree.getZTreeObj("treeDemo");
       zTree.selectNode(treeNode);
       return confirm("Edit Node -- " + treeNode.name + "?");
   }


   function beforeRemove(treeId, treeNode) {
       className = (className === "dark" ? "" : "dark");
       showLog("[ " + getTime() + " beforeRemove ]     " + treeNode.name);
       var zTree = $.fn.zTree.getZTreeObj("treeDemo");
       zTree.selectNode(treeNode);
       //confirm("Are you sure to DELETE node -- " + treeNode.name + " ?")


       var canDelete;
       $.ajax({
           url: '<%=Url.Action("CanDeleteTreeNode")%>',
           type: 'POST',
           async: false,
           data: { productId: $('#ProductsDropDownList').val(), treenodeId: treeNode.id },
           success: function (data) {
               if (data == "0") {
                   alert("Node is NOT allowed to delete since there is product definition for the node.");
                   canDelete=false;
               } else {
                   canDelete = true;
               }
           }
       });


       return canDelete; 
    }


        function onRemove(e, treeId, treeNode) {
       showLog("[ " + getTime() + " onRemove ]     " + treeNode.name);
   }
   function beforeRename(treeId, treeNode, newName) {
       className = (className === "dark" ? "" : "dark");
       showLog("[ " + getTime() + " beforeRename ]     " + treeNode.name);
       if (newName.length == 0) {
           alert("Name cannot be blank.");
           var zTree = $.fn.zTree.getZTreeObj("treeDemo");
           setTimeout(function () { zTree.editName(treeNode) }, 10);
           return false;
       }
       return true;
   }
   function onRename(e, treeId, treeNode) {
       showLog("[ " + getTime() + " onRename ]     " + treeNode.name);
   }
   function showLog(str) {
       if (!log) log = $("#log");
       log.append("<li class='" + className + "'>" + str + "</li>");
       if (log.children("li").length > 8) {
           log.get(0).removeChild(log.children("li")[0]);
       }
   }
   function getTime() {
       var now = new Date(),
h = now.getHours(),
m = now.getMinutes(),
s = now.getSeconds(),
ms = now.getMilliseconds();
       return (h + ":" + m + ":" + s + " " + ms);
   }


   var newCount = 1;
   function addHoverDom(treeId, treeNode) {
       if (treeNode.level == 1) {
           if (CanAddDeleteComponent == "True") {
               var sObj = $("#" + treeNode.tId + "_span");
               if (treeNode.editNameFlag || $("#addBtn_" + treeNode.id).length > 0) return;
               var addStr = "<span class='button add' id='addBtn_" + treeNode.id
   + "' title='add node' onfocus='this.blur();'></span>";
               sObj.after(addStr);
               var btn = $("#addBtn_" + treeNode.id);
               if (btn) btn.bind("click", function () {
                   //$("#lbl_ParentName").innerText = treeNode.name;
                   $("#MarketsDropDownListNew").attr("value", $("#MarketsDropDownList").val());


                   $("#NewDialog").dialog({
                       resizable: false,
                       width: 500,
                       modal: true,
                       buttons: {
                           "Confirm": function () {


                               if ($("#txt_NewNodeName").val() == "") {
                                   alert("Please input the New Node Name.");
                               } else {
                                   var adddedname = $("#txt_NewNodeName").val();
                                   var newTree = $.fn.zTree.getZTreeObj("treeDemo");


                                   var Nodes = newTree.getNodes();
                                   var act = newTree.transformToArray(Nodes);


                                   for (var i = 0; i < act.length; i++) {


                                       if (act[i].name == adddedname)
                                       { alert('duplicate node name!'); return false; }
                                   }




                                   if ($("#MarketsDropDownListNew").val() != $("#MarketsDropDownList").val() && $("#MarketsDropDownListNew").val() != "General") {


                                       $.ajax({
                                           url: '<%=Url.Action("AddNewComponent")%>',
                                           type: 'POST',
                                           async: false,
                                           data: 'productId=' + $('#ProductsDropDownList').val() + '&marketName=' + $("#MarketsDropDownListNew").val() + '&id=' + RndNum(8) + '&pId=' + treeNode.id + '&name=' + $("#txt_NewNodeName").val() + '&brandname=' + $("#txt_brand").val() + '&productname=' + $("#HiddenTXTProduct").val(),
                                           success: function (data) {
                                               if (data == "fail") {
                                                   alert("Adding component failed!");
                                               }
                                               else if (data == "isnew") {
                                                   alert("Please save first for this is a new brand or product!");
                                               }
                                               else if (data == "exist") {
                                                   alert("The component has already exsited!");
                                               }
                                           }
                                       });


                                   } else {
                                       newCount++;
                                       var zTree = $.fn.zTree.getZTreeObj("treeDemo");
                                       if ($("#chk_OwnProduct").is(':checked')) {
                                           //zTree.addNodes(treeNode, { id: (100 + newCount), pId: treeNode.id, name: $("#txt_NewNodeName").val(), marketName: $("#MarketsDropDownListNew").val() });
                                           zTree.addNodes(treeNode, { id: RndNum(8), pId: treeNode.id, name: GetNodeName($("#txt_NewNodeName").val(), $("#MarketsDropDownListNew").val()), marketName: $("#MarketsDropDownListNew").val() });
                                           //                           zTree.addNodes(treeNode, { id: (100 + newCount), pId: treeNode.id, name: "new node" + (newCount++), marketName: $("#MarketsDropDownListNew").val() });
                                       } else {
                                           zTree.addNodes(treeNode, { id: RndNum(8), pId: treeNode.id, name: $("#txt_NewNodeName").val(), marketName: "General" });
                                       }


                                       $("#txt_NewNodeName").attr("value", '');
                                       //                                       $(this).dialog("close");
                                       //                                       return false;
                                   }
                                   $(this).dialog("close");
                                   return false;
                               }
                           },
                           Cancel: function () {
                               $(this).dialog("close");
                           }
                       }
                   });
               });    
           }       
            }
   };
   function removeHoverDom(treeId, treeNode) {
       $("#addBtn_" + treeNode.id).unbind().remove();
   };
   function selectAll() {
       var zTree = $.fn.zTree.getZTreeObj("treeDemo");
       zTree.setting.edit.editNameSelectAll = $("#selectAll").attr("checked");
   }


   $(document).ready(function () {
       userGroup = $('#HIddenUsergroup').val();
       //$("#CanAddDeleteComponent").attr("value", '<%=ViewBag.AddDeleteLocalComponent %>');
       CanAddDeleteComponent = '<%=ViewBag.AddDeleteLocalComponent %>';
       //        $.fn.zTree.init($("#treeDemo"), setting, zNodes);
       //        $.fn.zTree.init($("#treeDemo"), setting);
       //        $("#selectAll").bind("click", selectAll);
   });


        function setRemoveBtn(treeId, treeNode) {
            //        return !treeNode.isParent;
            var showButton = false;
            if (treeNode.level == 2) {
                showButton = true;
            }else{
                showButton = false;
            }
            //show button for admin
            if (treeNode.level == 2) {
                if (userGroup != "SuperUser" && treeNode.marketName == "General") {
                    showButton = false;
                }


                if (CanAddDeleteComponent != "True") {
                    showButton = false;
                }
            }


            return showButton; 
        }


        function setRenameBtn(treeId, treeNode) {
       //return !treeNode.isParent;
            var showButton = false;
            if (treeNode.level == 2) {
                showButton = true;
            }else{
                showButton = false;
            }
            //show button for admin
            if (treeNode.level == 2) {
                if (userGroup != "SuperUser" && treeNode.marketName == "General") {
                    return false;
                }
            }


            return showButton; 
        }




        function GetNodeRandomId() {
            var date = new Date();
            var times1970 = date.getTime();
            var NodeRandomId = parseInt(date.getDate() + date.getHours() + date.getMinutes() + date.getSeconds());
            return RndNum(4);
        }


        function RndNum(n) {
            var rnd = "";
            for (var i = 0; i < n; i++)
                rnd += Math.floor(Math.random() * 10);
            return rnd;
        }


        function GetNodeName(name, marketname) {
            if (marketname == "General") {
                return name
            }
            return name + '(' + marketname + ')'
        }
//-->
</script>
<script type="text/javascript">
        $("#SaveTree").click(function () {


            //var IsNewProduct = false;
            if ($('#txt_brand').val() == "") {
                alert("Please enter brand for the product.");
                return false;
            }


            if ($("#txt_product").val() == "") {
                alert("Please enter product for the brand.");
                return false;
            }


            var newTree = $.fn.zTree.getZTreeObj("treeDemo");
            if (newTree==null) {
                alert("Please click New first.");
                return false;
            }
            var Nodes = newTree.getNodes();
            var act = newTree.transformToArray(Nodes);


            var postdata = new Array();


            for (var i = 0; i < act.length; i++) {
                if (!act[i].pId && typeof (act[i].pId) != "undefined") {
                    act[i].pId = 0;
                }


                postdata[i] = { id: act[i].id, pId: act[i].pId, name: act[i].name, level: act[i].level, marketName: act[i].marketName };
            }


            var postData = $.toJSON(postdata);
            $("#HiddenTreeInfo_Json").attr("value", postData);


            //            $.ajax({
            //                url: '<%= Url.Action("SaveTree") %>',
            //                type: 'POST',
            //                //                dataType: 'json',
            //                data: 'TreeNodes=' + postData,
            //                success: function (data) {
            //                    alert(data.Msg);
            //                }
            //            });


            $(document.forms[0]).ajaxSubmit({
                url: '<%= Url.Action("SaveTree")%>',
                success: function (data) {
                    alert(data.Msg);
                    if (data.Result == "1") {
                        $(document.forms[0]).submit();
                    }
                }
            });
        });
</script>

        [HttpPost]
        public JsonResult SaveTree(ComponentIndexModel model, string TreeNodes)
        {


            try
            {
                string brandname = model.TXTbrand;
                int productId;


                ComponentManageProxy component = new ComponentManageProxy();
                IBrandRepository<BrandRow> _BrandRepository = new BrandRepository<BrandRow>();
                BrandRow row = _BrandRepository.GetBrandByName(brandname);


                if (row == null)
                {


                    row = new BrandRow();


                    row.BrandName = brandname;


                    row.UniqueID = Guid.NewGuid();
                    row.BrandType = model.ProductType ? 1 : 0;


                    _BrandRepository.AddBrand(row);


                }




                ProductRepository<ProductRow> _ProductRepository = new ProductRepository<ProductRow>();


                if (model.hidden_product != null)
                {
                    ProductRow _row = _ProductRepository.GetProductByName(model.hidden_product);
                    if (_row == null)
                    {
                        _row = new ProductRow();
                        _row.UniqueID = Guid.NewGuid();
                        _row.ProductName = model.hidden_product;
                        _row.ComponentTreeID = Guid.NewGuid();
                        _row.BrandName = brandname;
                        _ProductRepository.AddProduct(_row);
                        _row = _ProductRepository.GetProductByUniqueID(_row.UniqueID);


                        productId = _row.ID;
                    }
                    else
                    {
                        //productId = int.Parse(model.Product);
                        productId = _row.ID;
                        if (productId.ToString() != model.Product)
                        {
                            return Json(new
                            {
                                Msg = "The product is already exsit.",
                                Result = "2",
                            });
                        }
                    }
                }
                else
                {
                    productId = int.Parse(model.Product);
                }


                //component.DeleteTree(productId);


                ProductManage Producttarget = new ProductManage(_ProductRepository);
                ProductRow _Product = _ProductRepository.GetProductByID(productId);
                //component.GetAllComponentNodes(_Product.ComponentTreeID);


                IComponentRepository<ComponentRowwithMultipleLCA> _ComponentBackupRepo = new ComponentRepository<ComponentRowwithMultipleLCA>();
                IComponentTreeNodeRepository<ComponentTree> _NodeBackupRepo = new ComponentTreeNodeRepository<ComponentTree>();
                IComponentTreeNodeCompoundRepository<ComponentTreeCompound> _TreeBackupRepo = new ComponentTreeCompoundRepository<ComponentTreeCompound>();




                IList<ComponentTreeCompound> _TreeBackupList = _TreeBackupRepo.GetAllComponentNodes(_Product.ComponentTreeID);
                JavaScriptSerializer jss = new JavaScriptSerializer();
                List<array> nodelist = new List<array>();
                IList<ComponentTreeCompound> _MarketSpecificNodeList;
                if (model.Market == "General") _MarketSpecificNodeList = _TreeBackupList.Where(x => (x.Level == 3 && x.MarketName != "General" && (x.Name != null && x.Name != String.Empty))).ToList();
                else _MarketSpecificNodeList = _TreeBackupList.Where(x => (x.Level == 3 && (x.MarketName != "General" && x.MarketName != model.Market && (x.Name != null && x.Name != String.Empty)))).ToList();


                //nodelist = jss.Deserialize(TreeNodes, typeof(List<array>)) as List<array>;
                nodelist = jss.Deserialize(model.TreeInfo_Json, typeof(List<array>)) as List<array>;


                foreach (var node in nodelist)
                {


                    if (_TreeBackupList.Count == 0)
                    {
                        //if (node.level == 2)
                        //{
                        //inserttodb()
                        ComponentRowwithMultipleLCA componentRow = new ComponentRowwithMultipleLCA();


                        componentRow.UniqueID = Guid.NewGuid();
                        componentRow.AssignedID = node.id;
                        componentRow.ComponentName = GetNameWithoutMarket(node.name);
                        componentRow.MarketName = (node.marketName == null || node.marketName == "") ? "General" : node.marketName;
                        if (node.level == 0) { componentRow.Description = "root"; }


                        //component.AddComponentTreeNode(componentRow, _ParentUniqueID, _RootID, level);
                        component.AddCompoment(componentRow, productId, node.pId, node.level + 1);
                    }
                    else
                    {
                        if (node.level != 2)
                        {
                            if (node.level == 1)
                            {


                                IList<ComponentTreeCompound> _nodeEnum = _MarketSpecificNodeList.Where(i => (i.PId == node.id && i.RootID == _Product.ComponentTreeID)).ToList();
                                foreach (ComponentTreeCompound o in _nodeEnum)
                                {
                                    ComponentTreeCompound obj1 = o;
                                    //UpdateModel;
                                    ComponentRowwithMultipleLCA __row = _ComponentBackupRepo.FindComponentByUniqueID(obj1.UniqueID);
                                    __row.ComponentName = node.name;
                                    //_ComponentBackupRepo.UpdateComponent(__row);
                                    _MarketSpecificNodeList.Remove(obj1);
                                    ComponentTreeCompound _MarketSpecificnode = _TreeBackupList.First(i => (i.Sid == obj1.Sid && i.RootID == _Product.ComponentTreeID));
                                    _TreeBackupList.Remove(_MarketSpecificnode);


                                }
                            }
                            ComponentTreeCompound _node = _TreeBackupList.First(i => (i.Sid == node.id && i.RootID == _Product.ComponentTreeID));
                            _TreeBackupList.Remove(_node);
                        }
                        if (node.level == 2)
                        {
                            IList<ComponentTreeCompound> _nodeEnum = _TreeBackupList.Where(i => (i.Sid == node.id && i.RootID == _Product.ComponentTreeID)).ToList();
                            if (_nodeEnum.Count >= 1)
                            {
                                ComponentTreeCompound obj1 = _nodeEnum.First();
                                //UpdateModel;
                                ComponentRowwithMultipleLCA __row = _ComponentBackupRepo.FindComponentByUniqueID(obj1.UniqueID);
                                __row.ComponentName = node.name;
                                //_ComponentBackupRepo.UpdateComponent(__row);
                                _TreeBackupList.Remove(obj1);
                            }


                            else
                            {
                                ComponentRowwithMultipleLCA componentRow = new ComponentRowwithMultipleLCA();


                                componentRow.UniqueID = Guid.NewGuid();
                                componentRow.AssignedID = node.id;
                                componentRow.ComponentName = GetNameWithoutMarket(node.name);
                                componentRow.MarketName = (node.marketName == null || node.marketName == "") ? "General" : node.marketName;
                                if (node.level == 0) { componentRow.Description = "root"; }


                                component.AddCompoment(componentRow, productId, node.pId, node.level + 1);
                            }
                        }
                    }




                }








                foreach (ComponentTreeCompound ob in _TreeBackupList)
                {
                    //delete
                    _NodeBackupRepo.DeleteComponentTreeNodeByComponentUniqueID(ob.TreeNodeUniqueID);
                    _ComponentBackupRepo.DeleteComponent(ob.UniqueID);


                }


                return Json(new
                {
                    Msg = "The hierachy definition was saved.",
                    Result = "1",
                });
            }
            catch (Exception e)
            {
                return Json(new
                {
                    Msg = "The hierachy definition was saved unsucessful. " + e.Message,
                    Result = "0",
                });
            }


        }