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