Namespace.register("U.CD.RT"); //注册右边个人项目栏js。把右边的树的js全部搬到这个地方。 /// U.CD.RT.Init = function () { } //-------------------------------------------------------------右边树目录的创建---------------------------------------------------------------- //当获取用户数据后装载用户的右边树节点。第一个参数是后台返回数据,第二个参数为当前选择的项目,如果没有这个参数,则默认显示第一个项目 U.CD.RT.LUDataAsyn = function (r) { U.CD.LO.OpenZY(); //打开资源管理器 // 清除全局加载对象 var _ld = r.context[0]; (_ld) && (_ld.parentNode.removeChild(_ld)); var i, _pnum = 0; if (r.value == "" || r.value == "null") { //添加改用户的基本信息,后台会判断是否为合法用户,用在后台传递认证的方式已经解决。 //U.ACD.Request(U.CD.AjaxUrl, ([type, userid, node.ID, node.Deep, Guid.newGuid(), input.value]), U.CD.RT.CP_OKAsyn, ([""])); U.UF.UI.Confirm("没取到该用户数据,确认重新获取!", [U.CD.U.LUData, ([US.userInfo])], ""); return; } //这个要注释。这是基本数据结构,他的合理性牵涉到前台所有代码的规范性。 //var _u = eval("(" + r.value + ")"); //由于r.value带了双引号,必须按照这种方式进行转换。比较奇特。 var _u = r.value; //由于r.value带了双引号,必须按照这种方式进行转换。比较奇特。 U.CD.U.CUser = U.CD.U.AUsers[_u.UserID] = _u; //集合加数组功能。//添加进用户集合中。同时赋予当前操作用户。 var L = _u.TNode[0].TNode; //这要注释。TNode代表用户项目目录的标识。第一个TNode代表了根目录。第二个TNode代表了根目录的所有孩子节点。 //右边树目录区域,上面为资源管理器,下边为树目录。 var _mdiv = $("#UCD_RTree")[0]; _mdiv.innerHTML = ""; //清空以前用户数据。 //设置资源管理器样式 var _zygl = $$("div", { "className": "UCD_RT_Root" }, _mdiv); //资源管理器 //var _gl = $$("div", { "className": "UCD_RT_Root_TJ" }, _zygl); //for (i = 0; i < L.length; i++) { if (!L[i].IsDelete) _pnum++; } //统计项目个数 // $$("div", { "className": "UCD_RT_Root_TJ_NR", "innerHTML": "共有" + _pnum + "个项目" }, _gl); var _zyx = $$("div", { "className": "UCD_RT_Root_TJ_X", "onclick": [[U.CD.LO.CloseZY]] }, _zygl); $$("img", { "src": "images/u_X.png" }, _zyx); var _zy = $$("div", { "className": "UCD_RT_Root_ZY" }, _zygl); $$("div", { "className": "UCD_RT_Root_Z", "innerHTML": "资源管理器" }, _zy); //如果用户已经登录,才能有创建项目按钮 if (U.CD.U.IsUSelf()) $$("div", { "className": "UCD_RT_Root_C", "innerHTML": "创建项目", "onclick": [[U.CD.RT.CProject, ([_u.UserID, _u.TNode[0]])]] }, _zy); //创建项目按钮 //如果是查看其它人的资料,需要屏蔽树的操作菜单,屏蔽掉保存按钮,屏蔽掉用户登录。关闭示例项目 if (!U.CD.U.IsUSelf()) U.CD.Url.ForbUser(); ///清理掉以前项目的所有数据。 //如果传递了项目id,则选中该项目,否则,选取第一个项目。 ///装载现有项目的数据。实现选中当前项目和当前文件的功能。 //因为有些节点被删除了,IsDelete=true。不能作为第一个节点。按道理数据库就不应该筛选出来,以后再搞!!!! var _cp = r.context[1], _sel, _cso; //定义当前选中的节点, //此处需要清空数组,那么清空数组功能需要放在UC去实现。参考1473上面贴出的文章。 //if (_cp) { for (i = 0; i < L.length; i++) { if (L[i].ID == _cp) { _sel = L[i]; L = []; L.push(_sel); break; } } } // else { for (i = 0; i < L.length; i++) { if (!L[i].IsDelete) { _sel = L[i]; break; } } } //创建树的总面板。 var TreeDiv = $$("div", { "id": "UCD_RT_Tree" }, _mdiv) for (i = 0; i < L.length; i++) { U.CD.RT.F_L_Node(L[i], _u.UserID, TreeDiv); U.CD.SL.SelPro(L[i], _u.UserID); //发布项目 } //遍历每个节点。 //生成右边树结构。 var _ffile = U.Json(L).FindOne({ "ID": _cp }, "TNode"); if (_ffile) { if (_ffile.Type == "folder") { _ffile = _ffile.TNode[0]; } _ffile.Content = unescape(_ffile.Content); U.CD.R.LoadFC(_ffile); } if (_ffile && _ffile.Name) document.title = _ffile.Name; //设置网页标题 //指定当前项目和文件 //if (!_sel) return; //如果找不到项目,则返回 //_cso = TreeDiv.getElementsByTagName("div")["UCD_Tree" + _sel.ID]; //找到树节点。 //if (_sel) U.CD.RT.SM(_cso, _u.UserID, _sel); //如果有子项目,展开第一个项目。 //选中第一个文件节点。也要循环判断是否删除了。晕,以后一定后台解决此问题。 // var _ffile = null; // for (i = 0; i < _sel.TNode.length; i++) { if (!_sel.TNode[i].IsDelete && _sel.TNode[i].Type == "file") { _ffile = _sel.TNode[i]; break; } } // if (_ffile) { _ffile.Content = unescape(_ffile.Content); U.CD.R.LoadFC(_ffile); } // if (_ffile && _ffile.Name) document.title = _ffile.Name; //设置网页标题 } //不知道什么原因,有可能mongodb,mysql不稳定,有时候取不到数据,此函数刷新页面,重新获取数据 U.CD.RT.LUDReload = function () { U.CD.Init(); } //右边子元素 U.CD.RT.CLV = function (L, UDOD, UUID) { var _UDFD = document.createDocumentFragment(); for (var i = 0; i < L.length; i++) { U.CD.RT.F_L_Node(L[i], UUID, _UDFD); //遍历每个节点。 } UDOD.appendChild(_UDFD); } //每个节点的信息。,参数1为单个节点node,参数2为用户id,参数3为所有节点的文档碎片。 U.CD.RT.F_L_Node = function (node, UUID, _UDFD) { var _UDIC, _UDTD, UDSD, _UDA; if (node.IsDelete) return; //不列出已经删除的节点。 if (node.Deep == "2") { _UDIC = "UCD_RT_ProIcon"; } //项目图标。 else { _UDIC = "UCD_RT_FolderIcon"; } //文件夹图标。 if (node.Type == "file") { if (U.UP.IsImg(node.Name)) _UDIC = "UCD_RT_USTreeAlbumIcon"; else _UDIC = "UCD_RT_FileIcon"; } //文件图标 _UDTD = $$("div", { "className": "UCD_RT_USTreecontainA", "onclick": [[U.UF.EV.stopBubble], [U.CD.RT.DBC, ([node.ID])]] }, _UDFD); _UDSD = $$("div", { "className": "UCD_RT_USTTitle", "id": "UCD_Tree" + node.ID, "onclick": [U.CD.RT.SM, (["retElement", UUID, node])] }, _UDTD); $$("div", { "className": "UCD_RT_DiskGE UCD_RT_I_D_E UCD_RT_USTreesign" }, _UDSD); _UDA = $$("a", { "className": "UCD_RT_USTreeusestudiodisktreeA", "title": node.Name }, _UDSD); $$("i", { "className": "UCD_RT_TreeIcon " + _UDIC }, _UDA); $$("span", { "innerHTML": node.Name }, _UDA); if (U.CD.U.IsUSelf()) /*U.CD.RT.F_OP(_UDSD, UUID, node);*/ //如果用户已经登录、增加一个增删查改功能 $$("i", { "className": "UCD_RT_TreeIcon " + _UDIC }, _UDA); $$("span", { "innerHTML": node.Name }, _UDA); U.CD.RT.F_OP(_UDSD, UUID, node); } //文件夹和文件操作面板 U.CD.RT.F_OP = function (_UDTD, userid, node) { var _ZSCG = $$("div", { "className": "UCD_RT_ZSCG" }, _UDTD); var _c = $$("div", { "className": "UCD_RT_ZSCG_T", "title": "发布项目!", "innerHTML": "✿", "onclick": [[U.UF.EV.stopBubble], [U.CD.RT.Panel, (["retElement", userid, node])]] }, _ZSCG); //统一设置面板 } //伸展树形目录。 U.CD.RT.SM = function (SO, UUID, node) { if (node.Type == "folder") { U.CD.U.CUser.CurrentSO = SO.parentNode; U.CD.U.CUser.CurrentNode = node; } //记录当前单击文件夹节点 var _pre = U.CD.U.CUser.PreClickNode; if (_pre) _pre.style.backgroundColor = "White"; //清除上次单击节点的样式。 if (node.Type == "file") { node.Content = unescape(node.Content); U.CD.R.LoadFC(node); return; } //如果单击的是文件,打开文件。 var _UDOB = $("div", SO)[0]; //获取点击目录里的a标签 修改里的样式和获取id var _L = $("div", SO.parentNode).length - 3; //获取张开的孩子,增加一个功能就要修改这里,,要有统一处理方案。 var _CT = "UCD_RT_DiskGE UCD_RT_I_D_E UCD_RT_USTreesign"; //伸张的样式 if (_L > 1) { SO.parentNode.removeChild(SO.parentNode.lastChild); } //未伸展 else {//伸展 //var _VA = U.CD.U.CUser.TNode.Select({ "ID": UDID })[0].TNode; //选取需要展示的数据。 U.Entity还需要继续改写。。。 var _VA = node.TNode; //获取节点的子节点,选取需要展示的数据。 U.Entity还需要继续改写。。。 if (_VA != null) { U.CD.RT.LV(_VA, SO.parentNode, UUID); _CT = "UCD_RT_DiskGE UCD_RT_I_D_S UCD_RT_USTreesign"; } //展开所有的子目录 } _UDOB.className = _CT; //伸缩的杨思 U.CD.RT.VM(SO, UUID, node); //改变单击的样式 } //这里是说明右边的树形栏视图 U.CD.RT.LV = function (L, UDD, UUID) { var _UDOD = $$("div", { "style": { "marginLeft": "10px"} }, UDD); U.CD.RT.CLV(L, _UDOD, UUID); } //单击菜单时的效果 伸缩时候的点击元素效果 U.CD.RT.VM = function (SO, userid, node) { //if (US.Disk.diskfileTree[1][5]) { $(US.Disk.diskfileTree[1][5]); US.Disk.diskfileTree[1][5].style.border = "0"; US.Disk.diskfileTree[1][5].style.backgroundColor = ""; } //删除上次点击左边菜单变化的a标签 SO.style.backgroundColor = "#dee6ef"; //颜色变化 U.CD.U.CUser.PreClickNode = SO; //把变化的对象放入 下次点击清理 //记录当前选中节点,以便新建文件时使用,其他地方也可以使用。此处需要找孩子节点才方便,否则,需要修改程序。 //if (node.Deep == 2) { U.CD.U.CUser.CurrentSO = SO.parentNode; U.CD.U.CUser.CurrentNode = node; }//为啥要深度等于2? } U.CD.RT.DBC = function () { } //-----------------------------------------------------------新建一个项目,或者文件夹。--------------------------------------------------- //新建控制面板。 U.CD.RT.Panel = function (SO, userid, node) { var _UDUP = $("#UCD_RT_FUP")[0], _UDUT = $("#UCD_RT_FUPCT")[0]; //获取命令窗口 var _NR = $("#UCD_RT_FUPCC")[0]; _NR.innerHTML = ""; //获取内容窗口 node.Name = SO.parentNode.parentNode.getElementsByTagName('span')[0].innerHTML; _UDUT.innerHTML = "当前目录:" + node.Name + ""; //如果是文件夹或者项目则创建相应菜单,否则是文件,创建相应菜单。 if (node.Type == "folder") { //暂时做到这样,以后再加图标,美化界面 $$("div", { "className": "UCD_RT_Com", "innerHTML": "新建子文件夹", "onclick": [[U.UF.EV.stopBubble], [U.CD.RT.CP_CF, ([SO, userid, node])]] }, _NR); //新建文件夹 $$("div", { "className": "UCD_RT_Com", "innerHTML": "修改文件夹", "onclick": [[U.UF.EV.stopBubble], [U.CD.RT.CP_M, ([SO, userid, node])]] }, _NR); //修改 $$("div", { "className": "UCD_RT_Com", "innerHTML": "删除文件夹", "onclick": [[U.UF.EV.stopBubble], [U.CD.RT.CP_DF, ([SO, userid, node])]] }, _NR); //删除 $$("div", { "className": "UCD_RT_Com", "innerHTML": "新建文件", "onclick": [[U.UF.EV.stopBubble], [U.CD.RT.CP_NF, ([SO, userid, node])]] }, _NR); //新建文件 var _up = $$("div", { "className": "UCD_RT_Com UCD_RT_TreeIcon", "innerHTML": "上传照片" }, _NR); //上传图片 $$("input", { "id": "UCD_RT_Com_Up", "name": "UCD_RT_Com_Up", "type": "file", "multiple": "true", "accept": "image/gif,image/jpeg,image/png", "onchange": [[U.CD.O.TreeUPFile, (["retElement"])]] }, _up); if (node.Deep == 2) $$("div", { "className": "UCD_RT_Com", "innerHTML": "发布项目和作业", "onclick": [[U.UF.EV.stopBubble], [U.CD.SL.Publish, ([SO, userid, node])]] }, _NR); //上传图片 } else { $$("div", { "className": "UCD_RT_Com", "innerHTML": "修改文件名", "onclick": [[U.UF.EV.stopBubble], [U.CD.RT.CP_M, ([SO, userid, node])]] }, _NR); //修改文件名 $$("div", { "className": "UCD_RT_Com", "innerHTML": "删除文件", "onclick": [[U.UF.EV.stopBubble], [U.CD.RT.CP_DF, ([SO, userid, node])]] }, _NR); //删除文件 } if (_UDUP.style.display == "none") { U.D.PopupWindow(_UDUP); } //onclick直接响应 } //创建一个项目,从根节点创建,SO代表根节点。userid用户id,node是节点信息 U.CD.RT.CProject = function (userid, node) { //使用统一的创建对话框,减少代码量,传递不同的回调处理函数。js太智能。 U.CD.RT.NDialog("创建新项目", U.CD.RT.CP_OK, ([$("#UCD_RT_Tree")[0], userid, node, "Add_Folder"])); } //新建一个文件夹,从子节点创建 U.CD.RT.CP_CF = function (SO, userid, node) { U.CD.RT.NDialog("新建文件夹", U.CD.RT.CP_OK, ([SO, userid, node, "Add_Folder"])); } //新建一个文件。 U.CD.RT.CP_NF = function (SO, userid, node) { U.CD.RT.NDialog("新建文件,请自己添加扩展名!", U.CD.RT.CP_OK, ([SO, userid, node, "Add_File"])); } U.CD.RT.Display = function () { $("#UCD_RT_FUP")[0].style.display = "none"; } //新建项目或者文件夹或者修改公用弹出对话框函数。//参数1为Title,参数2为异步回调函数,参数3为异步函数参数数组。 U.CD.RT.NDialog = function (T, C, P) { var _UFFD = $$("div", { "className": "UCD_TR_CP" }); //调用主项目对话框,并构建一个显示用的Div。 $$("div", { "className": "UCD_TR_CP_T", "innerHTML": "您操作的当前目录为:" + P[2].Name + "" }, _UFFD); //项目名称输入input $$("div", { "className": "UCD_TR_CP_MS", "innerHTML": "请输入名称:" }, _UFFD); //项目名称输入input var _p = $$("input", { "className": "UCD_RT_CP_Input" }, _UFFD); P.push(_p); //追加input为参数数组。居然后面函数参数的能自动拆分此数组? //创建项目一定是在根元素下面。 // var _CUM = new U.UF.UI.Dialog(T, { "width": "350px" }, null, U.M.apply(_UFFD, [[C, P]]), _UFFD); //js太智能了,可以自由拼凑参数! //U.D.PopupWindow(_CUM.Create()); new U.UF.UI.Confirm(T, { "width": "350px", "text-align": "center" }, null, U.M.apply(_UFFD, [[C, P]]), _UFFD); //创建对话框 } //创建项目、文件夹、文件的函数, //参数为SO 为触发事件的页面元素,用户id ,node为父亲节点,input为新节点的input,不能直接传值,type为类型,文件或者目录, U.CD.RT.CP_OK = function (SO, userid, node, type, input, content) { //节点基本信息,名字和id,id由前台生成。 var _fname = input.value, _fid = Guid.newGuid(), _nnode; if (!U.CD.RT.VName(userid, _fname, type)) { U.Alert("名字不符合规范或者存在同名文件!"); return; } //前台添加一个节点,数组中也要添加节点。 if (type == "Add_File") _nnode = { "Name": _fname, "CreateDate": new Date(), "Type": "file", "Content": "", "ID": _fid, "Deep": parseInt(node.Deep) + 1, "IsPublic": true }; else _nnode = { "Name": _fname, "CreateDate": new Date(), "Type": "folder", "ID": _fid, "Deep": parseInt(node.Deep) + 1, "TNode": [], "IsPublic": true }; var L = []; L.push(_nnode); //追加一个节点,传递几个参数就追加几个。这种方式不科学,以后再改。因为硬盘是这样写的。 //如果不是根目录,或者className不是SO本身,需要找到添加子文件夹的父亲元素。 if (node.Deep > 1 && SO.className != "UCD_RT_USTreecontainA") SO = SO.parentNode.parentNode.parentNode; node.TNode.push(_nnode); //同时向前台json中追加数据,没有json树真麻烦啊。。做json树操作是一定的。 if (node.Deep == "1") U.CD.RT.CLV(L, $("#UCD_RT_Tree")[0], userid); //根节点添加孩子节点,不会有margin右移操作 //向前台追加树结点。//如果连续追加多个,会多出很多margin:10px父亲节点,会出问题。 else if (SO.childNodes.length == 2) { U.CD.RT.CLV(L, SO.lastChild, userid); ; } else { U.CD.RT.LV(L, SO, userid); } //记录当前选中节点,以便新建文件时使用,其他地方也可以使用。此处需要找孩子节点才方便,否则,需要修改程序。 if (_nnode.Deep == 2) { U.CD.U.CUser.CurrentSO = SO.lastChild; U.CD.U.CUser.CurrentNode = _nnode; } //后台添加一个节点。传递了用户id,根元素id,根元素深度,新节点guid,新节点名字。 U.ACD.Request(U.CD.AjaxUrl, ([type, userid, node.ID, node.Deep, _nnode.ID, _nnode.Name]), U.CD.RT.CP_OKAsyn, ([""])); } //添加项目异步。是否添加成功或者失败,异步回调函数 U.CD.RT.CP_OKAsyn = function (r) { if (r.value == "false" || r.value == "") { alert("添加失败,点此反馈信息"); return; } //var _node = eval("(" + r.value + ")"); //如果是文件添加成功,则刷新代码页面。 var _node = r.value; //如果是文件添加成功,则刷新代码页面。 //如果是文件夹,则把焦点至于当前文件夹 //更新树节点。否则树和节点不同步。 if (_node.Type == "file") { U.CD.R.LoadFC(_node); //刷新代码和视图,选项卡,换行窗口。 } U.Alert("添加成功"); } //--------------------------------------------------------------------删除功能确认---------------------------------------------------- U.CD.RT.CP_DF = function (SO, userid, node) { //L = L.Select({ "ID": id })[0]; //查找到指定节点。//从数据库删除,通过id如何查找其父亲节点?这是一个问题,U.E.Entity应该能够解决此问题。 U.UF.UI.Confirm("你确定删除 " + node.Name + "分组吗?", [U.CD.RT.CP_D, ([SO, userid, node])], ""); }; //删除功能 U.CD.RT.CP_D = function (SO, userid, node) { //首先前台删除该节点//找到节点位置 SO = SO.parentNode.parentNode.parentNode; SO.parentNode.removeChild(SO); U.ACD.Request(U.CD.AjaxUrl, (["Delete_Folder", userid, "0", node.ID]), U.CD.RT.CP_DAsyn, (["", node])); U.CD.RT.Display(); // U.CD.U.LUData(userid); U.ACD.Request(U.CD.AjaxUrl, (["Select_OneUserByID", US.userInfo.UserId, U.CD.USLang]), U.CD.RT.LUDataAsyn, ([""])); } //删除功能异步函数。 U.CD.RT.CP_DAsyn = function (r) { var node = r.context[1]; if (r.value) { //清理Tab和代码栏目 var _UFUL = $("#UCD_CT_Top_Tab")[0].getElementsByTagName("ul")[0]; //获取Tab栏 // 这里的代码有问题,我直接注释了 //var UFLI = _UFUL.getElementsByTagName("li")["Tab" + node.ID]; //如果找到了节点,关闭节点,否则,直接提示删除。 //if (UFLI) { U.CD.CloseEdit(_UFUL, UFLI, node); U.Alert("删除节点" + node.Name + "成功!", 3); } //else { U.Alert("删除成功", 3); U.CD.RT.CP_CloseTab("Tab" + node.ID); //} } else U.Alert("删除失败", 3); } // 删除对应的选项卡 U.CD.RT.CP_CloseTab = function (tabId) { var tab = $("#" + tabId); if (tab[0]) { // 执行关闭按钮点击事件 tab.Child()[1].click(); } } //----------------------------------------------------------------------修改功能---------------------------------------------------- U.CD.RT.CP_M = function (SO, userid, node) { U.CD.RT.NDialog("修改操作!!!", U.CD.RT.CP_MOK, ([SO, userid, node])); } //修改操作 U.CD.RT.CP_MOK = function (SO, userid, node, input) { var _fname = input.value; //只能传递input,否则是空值。 if (!U.CD.RT.VName(userid, _fname)) { U.Alert("名字不符合规范或者存在同名文件!"); return; } SO.parentNode.parentNode.getElementsByTagName("span")[0].innerHTML = _fname; //修改名称。 // 文件修改的同时修改选项页上打开的文件 if (node.Type == 'file') { var TABNODE = $("#Tab" + node.ID); if (TABNODE[0]) { // 执行关闭按钮点击事件 TABNODE[0].getElementsByClassName("UCD_Bar_Text")[0].innerHTML = _fname; } } U.ACD.Request(U.CD.AjaxUrl, (["Update_Folder", userid, "0", node.ID, _fname]), U.CD.RT.CP_MOKAsyn, ([""])); U.CD.RT.Display(); } U.CD.RT.CP_MOKAsyn = function (r) { if (r.value) { U.Alert("修改成功") } else { U.Alert("修改失败") } } //---------------------------------公用函数-------------------------------------------- //检查名字是否符合规范,在当前文件夹中是否存在同名文件 U.CD.RT.VName = function (userid, _fname, type) { var _ut = U.CD.U.AUsers[userid]; //找到用户在用户集合中的树信息。 //if (type == "Add_File") { if (!U.UF.S.FileName.test(_fname)) return false; } //如果是文件,则匹配文件名。文件名还是允许输入中文,不然新手很不习惯。//else { if (!U.UF.S.ZWFileName.test(_fname)) return; false; //借用了登陆注册的正则表达式,检验名字是否符合规范。 //U.E.Entity需要继续改写,此处要改写,没判断删除的文件夹 //if (_ut.TNode.Select({ "Name": _fname })[0]) return false; if (_$(_ut.TNode).FindOne({ "Name": _fname, "IsDelete": false })) return false; return true; }