项目总结:复杂树状菜单-结点增改删(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",
                 });
             }
 
 
         }
 
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号