Brak opisu

menu.js 6.4KB

    ; spa_define(function() { return $.use(["util", "form", "dict", "spa", "code", "form"], function(util, form, dict, spa, code, form) { var ahref = { an: "href", av: "javascript:;" }; return { modal: function(data) { var root = spa.findInModal(".sys_user_menu"), g_max_menu_code = 1; root.find(".modal-ctrl .icon-times").on("click", function() { spa.closeModal(); }); var treeCnt = root.find(".main .nav"), menuData = data.children, reses = data.reses; hand = code.parseCode(root.find(".info")), editForm = {}; var findByCode = function(c, items) { var ret; for(var i = 0; i < items.length; ++i) { var item = items[i]; if(item.code === c) return item; if(item.children && item.children.length) { ret = findByCode(c, item.children); if(ret) return ret; } } }; var paint = function(ul, items, pc) { items.forEach(function(item) { if(item.code > g_max_menu_code) { g_max_menu_code = item.code; } var li = { tn: "li" }, attrs = li.attrs = [{ an: "class", av: "leaf-item" }]; chs = li.chs = []; ul.chs.push(li); attrs.push({ an: "code", av: item.code }); attrs.push({ an: "pcode", av: pc || "" }); var icon = { tn: "i", attrs: [{ an: "class", av: "icon icon-" + item.icon }] }; chs.push(icon); chs.push({ tn: "a", attrs: [ahref], chs: [item.caption] }); if(item.children && item.children.length) { li.attrs[0].av = "branch-item"; var cul = { tn: "ul", chs: [] }; chs.push(cul); paint(cul, item.children, item.code); } }); }; var refreshTree = function() { var ul = { tn: "ul", chs: [] }; paint(ul, menuData); treeCnt.empty(); util.appendChild(treeCnt[0], ul); hand.empty(); editForm.oc = null; editForm.pc = null; editForm.form = null; }; var findParentArray = function(pc) { if(pc) { var items = findByCode(pc, menuData); return items ? (items.children ? items.children : null) : null; } return menuData; }; var movePrev = function() { if(editForm.oc) { var items = findParentArray(editForm.pc); if(items) { var i = 0; for(; i < items.length; ++i) { if(items[i].code === editForm.oc) { break; } } if(i > 0 && i < items.length) { var item1 = items[i], item0 = items[i - 1]; items.splice(i - 1, 2, item1, item0); refreshTree(); } } } }; var moveNext = function() { if(editForm.oc) { var items = findParentArray(editForm.pc); if(items) { var i = 0; for(; i < items.length; ++i) { if(items[i].code === editForm.oc) { break; } } if(i < (items.length - 1)) { var item1 = items[i], item0 = items[i + 1]; items.splice(i, 2, item0, item1); refreshTree(); } } } }; var deleteItem = function(pc, oc) { if(editForm.oc) { var items = findParentArray(editForm.pc); if(items) { var i = 0; for(; i < items.length; ++i) { if(items[i].code === editForm.oc) { break; } } if(i < items.length) { items.splice(i, 1); refreshTree(); } } } }; var fillEdit = function(pc, di) { if(pc && typeof pc === "string") { pc = parseInt(pc); } hand.val(); editForm.form = form.build(root.find(".info"), { res: { ready: true, items: reses } }); editForm.pc = pc; editForm.oc = di.code; editForm.form.val(di); }; root.on("click", ".nav li", function(evt) { var $this = $(this); if($this.hasClass("branch-item")) { $this.toggleClass("open"); } var di = findByCode(parseInt($this.attr("code")), menuData); if(di) { fillEdit($this.attr("pcode"), di); } evt.stopPropagation(); }); root.on("click", ".opt-newroot", function() { fillEdit("", {}); }); root.on("click", ".opt-new", function() { fillEdit(editForm.oc, {}); }); root.on("click", ".opt-prev", function() { movePrev(); }); root.on("click", ".opt-next", function() { moveNext(); }); root.on("click", ".opt-del", function() { deleteItem(); }); root.on("click", ".opt-ok", function() { if(editForm.form.validate()) { var item = editForm.form.val(); if(editForm.oc) { di = findByCode(editForm.oc, menuData); if(di) { di.caption = item.caption; di.modal = false; if(item.res) { di.res = item.res; di.icon = item.icon || "book"; } else { di.res = null; di.icon = item.icon || "branch"; } refreshTree(); } } else { var items = menuData; if(editForm.pc) { items = findByCode(editForm.pc, menuData); if(items) { if(items.children) { items = items.children; } else { items = items.children = []; } } else { items = menuData; } } ++g_max_menu_code; var di = { code: g_max_menu_code, caption: item.caption, modal: false }; if(item.res) { di.res = item.res; di.icon = item.icon || "book"; } else { di.res = null; di.icon = item.icon || "branch"; } items.push(di); refreshTree(); } } }); var cloneMenu = function(src, dest) { src.forEach(function(item) { var di = {}; di.icon = item.icon; if(item.res) { di.res = item.res; } di.modal = false; di.caption = item.caption; dest.push(di); if(item.children && item.children.length) { var chs = di.children = []; cloneMenu(item.children, chs); } }); } root.find(".opt-save").on("click", function() { var pd = []; cloneMenu(menuData,pd); util.put("../ajax/user/config/menu", pd, function() { spa.closeModal(); if(data.hand) { data.hand(); } }, {}); }); refreshTree(); } }; }); });