const NameChange = function (obj) { if (obj.value.length > 100) { obj.classList.add('is-invalid'); } else { obj.classList.remove('is-invalid'); } }; $(document).ready(function() { const projectTreeObj = (function(setting){ const ProjectTree = createDragTree(setting.treeSetting); ProjectTree.loadDatas(setting.source); const TableObj = $(setting.table); const Utils = { getRowTdHtml: function (node, tree) { const html = []; // 名称 html.push(''); if (node.is_folder) { if (node.children.length > 0) { html.push(' ', node.name); } else { html.push(' ', node.name); } } else { html.push(`${tree.isLastSibling(node) ? '└' : '├'}`); html.push('', node.name, ''); } html.push(''); // 概预算标准 if (node.is_folder) { html.push(``); } else { if (node.std_name) { html.push(`${node.std_name}`); } else { html.push(``); } } // 创建时间 if (node.is_folder) { html.push(``); html.push(``); } else { html.push(`${moment(node.create_time).format('YYYY-MM-DD')}`); html.push(`${node.management || ''}`); } // 操作 html.push(``); html.push(''); html.push(''); if (!node.is_folder) html.push(''); html.push(''); return html.join(''); }, getNodeTrHtml: function (node, tree) { const html = []; html.push(``); html.push(Utils.getRowTdHtml(node, tree)); html.push(``); return html.join(''); }, reloadTable: function () { const html = []; for (const node of ProjectTree.nodes) { html.push(Utils.getNodeTrHtml(node, ProjectTree)); } TableObj.html(html.join('')); }, getSelectNode: function() { const selectId = $('tr.table-active').attr('tree_id'); return selectId ? ProjectTree.getItems(selectId) : null; }, getSelectNodeId: function() { const selectId = $('tr.table-active').attr('tree_id'); return selectId || setting.treeSetting.rootId; }, refreshAddButton: function() { const select = this.getSelectNode(); $('[href="#add-folder"]').attr('disabled', select && select.tree_level >= 4); }, refreshTreeTable: function(result) { ProjectTree.loadDatas(result); Utils.reloadTable(); }, refreshRow: function(result) { const refreshData = ProjectTree.loadPostData(result); if (!refreshData.update) return; for (const u of refreshData.update) { $(`tr[tree_id=${u.id}]`).html(Utils.getRowTdHtml(u, ProjectTree)); } }, dropTo: function() { console.log(Utils.dragNode.name, Utils.dropNode.name); if (!Utils.dropNode.is_folder) { toastr.warning('请将文件夹或者项目拖动到目标文件夹下'); return; } const posterity = ProjectTree.getPosterity(Utils.dragNode); const maxLevelFolder = posterity.reduce((prev, cur) => { return cur.is_folder ? Math.max(cur.tree_level, prev) : prev; }, Utils.dragNode.tree_level); const resultMaxLevelFolder = Utils.dropNode.tree_level + maxLevelFolder - Utils.dragNode.tree_level + 1; if (resultMaxLevelFolder > 4) { toastr.warning('文件夹不可超过4层'); return; } postData('/subproj/dragTo', { drag_id: Utils.dragNode.id, drop_id: Utils.dropNode.id }, function (result){ Utils.refreshTreeTable(result); }); delete Utils.dragNode; delete Utils.dropNode; }, }; Utils.reloadTable(); $('body').on('click', 'tr[tree_id]', function() { if ($(this).hasClass('table-active')) { $(this).removeClass('table-active'); } else { $('tr[tree_id].table-active').removeClass('table-active'); $(this).addClass('table-active'); } Utils.refreshAddButton(); }); $('body').on('dragstart', 'tr[tree_id]', function(e) { Utils.dragNode = ProjectTree.getItems(e.target.getAttribute('tree_id')); }); $('body').on('drop', 'tr[tree_id]', function(e) { Utils.dropNode = ProjectTree.getItems(e.currentTarget.getAttribute('tree_id')); Utils.dropTo(); }); $('body').on('dragover', 'tr[tree_id]', function(e) { const parent = ProjectTree.getItems(e.currentTarget.getAttribute('tree_id')); return !parent || !parent.is_folder || parent.tree_level > 3 || parent.id === Utils.dragNode.id; }); $('body').on('click', 'button[name=del]', function(e) { const treeId = $(this).parent().parent().attr('tree_id'); const node = ProjectTree.getItems(treeId); if (node.is_folder) { $('.modal-title', '#del').html('确认删除文件夹'); $('#del-hint').attr('tree_id', treeId).html(`确定删除「${node.name}」及其下所有内容?`) } else { $('.modal-title', '#del').html('确认删除标段'); $('#del-hint').attr('tree_id', treeId).html(`确定删除「${node.name}」?`) } $('#del').modal('show'); }); $('body').on('click', 'button[name=edit]', function(e) { const treeId = $(this).parent().parent().attr('tree_id'); const node = ProjectTree.getItems(treeId); $('#edit-project-name').attr('tree_id', treeId).val(node.name); $('#edit-project').modal('show'); }); $('body').on('click', 'button[name=set-std]', function(e) { const treeId = $(this).parent().parent().attr('tree_id'); const node = ProjectTree.getItems(treeId); if (node.is_folder || node.std_id) return; $('[name=std_id]').attr('tree_id', treeId); $('#set-std').modal('show'); }); $('body').on('click', 'a[name=set-management]', function(e) { const treeId = $(this).parent().parent().attr('tree_id'); const node = ProjectTree.getItems(treeId); if (node.is_folder) return; $('#sm-management').attr('tree_id', treeId); $('#set-management').modal('show'); }); return { ProjectTree, TableObj, ...Utils }; })({ treeSetting: { id: 'id', pid: 'tree_pid', level: 'tree_level', order: 'tree_order', rootId: '-1' }, source: projectList, table: '#projectList', }); $('#add-folder').on('show.bs.modal', function(e) { const select = projectTreeObj.getSelectNode(); if (select) { if (select.is_folder) e.stopPropagation(); $('#folder-hint').html(`在文件夹 [${select.name}] 下新增`).show(); } else { $('#folder-hint').hide(); } $('#folder-name').val(''); }); $('#add-folder-ok').click(function() { const tree_pid = projectTreeObj.getSelectNodeId(); const name = $('#folder-name').val(); if (!name || name.length > 100) return; postData('/subproj/addFolder', { name, is_folder: 1, tree_pid }, function(result) { projectTreeObj.refreshTreeTable(result); $('#add-folder').modal('hide'); }); }); $('#add-project').on('show.bs.modal', function(e) { const select = projectTreeObj.getSelectNode(); if (select) { if (select.is_folder) e.stopPropagation(); $('#project-hint').html(`在文件夹 [${select.name}] 下新增`).show(); } else { $('#project-hint').hide(); } $('#project-name').val(''); }); $('#add-project-ok').click(function() { const tree_pid = projectTreeObj.getSelectNodeId(); const name = $('#project-name').val(); if (!name || name.length > 100) return; postData('/subproj/addProj', { name, is_folder: 1, tree_pid }, function(result) { projectTreeObj.refreshTreeTable(result); $('#add-project').modal('hide'); }); }); $('#del-ok').click(function() { const id = $('#del-hint').attr('tree_id'); postData('/subproj/del', { id }, function(result) { projectTreeObj.refreshTreeTable(result); $('#del').modal('hide'); $('#del-hint').attr('tree_id', ''); }); }); $('#edit-project-ok').click(function() { const nameObj = $('#edit-project-name'); const name = name.val(); if (!name || name.length > 100) return; postData('/subproj/save', { id: nameObj.attr('tree_id'), name }, function(result) { projectTreeObj.refreshRow(result); $('#edit-project').modal('hide'); $('#edit-project-name').attr('tree_id', ''); }); }); $('#set-std-ok').click(function() { const select = $('[name=std_id]:checked'); const id = select.attr('tree_id'); const std_id = parseInt(select.val()); postData('/subproj/save', { id, std_id }, function(result) { projectTreeObj.refreshRow(result); $('#set-std').modal('hide'); $('[name=std_id]').attr('tree_id', ''); }); }); $('#set-management-ok').click(function() { const select = $('#sm-management'); const id = select.attr('tree_id'); const management = select.val(); postData('/subproj/save', { id, management }, function(result) { projectTreeObj.refreshRow(result); $('#set-management').modal('hide'); $('#sm-management').attr('tree_id', ''); }); }); let timer = null; let oldSearchVal = null; $('#member-search').bind('input propertychange', function(e) { oldSearchVal = e.target.value; timer && clearTimeout(timer); timer = setTimeout(() => { const newVal = $('#member-search').val(); let html = ''; if (newVal && newVal === oldSearchVal) { accountList .filter(item => item && (item.name.indexOf(newVal) !== -1 || (item.mobile && item.mobile.indexOf(newVal) !== -1))) .forEach(item => { html += `

${item.name}${item.mobile || ''}

${item.role || ''}
` }); $('.book-list').empty(); $('.book-list').append(html); } else { if (!$('.acc-btn').length) { accountGroup.forEach((group, idx) => { if (!group) return; html += `
${group.groupName}
`; group.groupList.forEach(item => { html += `

${item.name}${item.mobile || ''}

${item.role || ''}
` }); html += '
'; }); $('.book-list').empty(); $('.book-list').append(html); } } }, 400); }); $('.book-list').on('click', 'dt', function () { const idx = $(this).find('.acc-btn').attr('data-groupid') const type = $(this).find('.acc-btn').attr('data-type') if (type === 'hide') { $(this).parent().find(`div[data-toggleid="${idx}"]`).show(() => { $(this).children().find('i').removeClass('fa-plus-square').addClass('fa-minus-square-o') $(this).find('.acc-btn').attr('data-type', 'show') }) } else { $(this).parent().find(`div[data-toggleid="${idx}"]`).hide(() => { $(this).children().find('i').removeClass('fa-minus-square-o').addClass('fa-plus-square') $(this).find('.acc-btn').attr('data-type', 'hide') }) } return false }); let orgMembers, newMembers; const generateMemberHtml = function () { const html = []; for (const mem of newMembers) { html.push(''); html.push(`${mem.name}`); html.push(`${mem.role}`); // 动态投资 const viewBudget = mem.budget_permission.indexOf(permissionConst.budget.view.value) >= 0; html.push(`
`); const editBudget = mem.budget_permission.indexOf(permissionConst.budget.edit.value) >= 0; html.push(`
`); // 电子文档 const fileView = mem.file_permission.indexOf(permissionConst.file.view.value) >= 0; html.push(`
`); const fileUpload = mem.file_permission.indexOf(permissionConst.file.upload.value) >= 0; html.push(`
`); const fileEdit = mem.file_permission.indexOf(permissionConst.file.filing.value) >= 0; html.push(`
`); // 关联标段 const rela = mem.manage_permission.indexOf(permissionConst.manage.rela.value) >= 0; html.push(`
`); html.push(`移除`); html.push(''); } $('#member-list').html(html.join('')); }; $('[data-target="#member"]').click(function(){ const tr = this.parentNode.parentNode; curBudget.id = tr.getAttribute('tree_id'); curBudget.bid = tr.getAttribute('bid'); curBudget.name = tr.getAttribute('bname'); curBudget.rela_tender = tr.getAttribute('rela-tender'); }); $('body').on('click', 'button[name=member]', function(e) { const treeId = $(this).parent().parent().attr('tree_id'); const node = projectTreeObj.ProjectTree.getItems(treeId); if (node.is_folder) return; $('#member-ok').attr('tree_id', treeId); postData('/subproj/member', { id: treeId }, function (result) { orgMembers = result; newMembers = result; generateMemberHtml(); $('#member').modal('show'); }); }); $('dl').on('click', 'dd', function () { const auditorId = parseInt($(this).data('id')); const user = accountList.find(x => { return x.id === auditorId; }); const check = $(`tr[uid=${auditorId}]`, '#member-list'); if (check.length > 0) { toastr.error('请勿重复添加成员'); return; } newMembers.push({ uid: user.id, name: user.name, role: user.role, budget_permission: [], file_permission: [], manage_permission: [], }); generateMemberHtml(); }); $('#member').on('click', 'a[name="del-member"]', function () { const id = parseInt(this.getAttribute('uid')); newMembers.splice(newMembers.findIndex(x => { return x.uid === id}), 1); generateMemberHtml(); }); $('#member-list').on('click', 'input', function () { const id = parseInt(this.getAttribute('uid')); const mem = newMembers.find(x => { return x.uid === id}); const pType = this.getAttribute('ptype'), spType = this.getAttribute('sptype'); if (this.checked) { if (pType === 'budget' && spType === 'view') { mem.budget_permission.push(parseInt(permissionConst.budget.view.value)); } else if (pType === 'budget' && spType === 'edit') { mem.budget_permission.push(parseInt(permissionConst.budget.view.value)); if (mem.budget_permission.indexOf(permissionConst.budget.view.value) < 0) { mem.budget_permission.push(parseInt(permissionConst.budget.edit.value)); $(`#budgetview${id}`)[0].checked = true; } } else if (pType === 'file' && spType === 'view') { mem.file_permission.push(parseInt(permissionConst.file.view.value)); } else if (pType === 'file' && spType === 'upload') { mem.file_permission.push(parseInt(permissionConst.file.upload.value)); if (mem.file_permission.indexOf(permissionConst.file.view.value) < 0) { mem.file_permission.push(parseInt(permissionConst.file.view.value)); $(`#fileview${id}`)[0].checked = true; } } else if (pType === 'file' && spType === 'edit') { mem.file_permission.push(parseInt(permissionConst.file.view.value)); if (mem.file_permission.indexOf(permissionConst.file.view.value) < 0) { mem.file_permission.push(parseInt(permissionConst.file.view.value)); $(`#fileview${id}`)[0].checked = true; } } else if (pType === 'manage' && spType === 'rela') { mem.manage_permission.push(parseInt(permissionConst.manage.rela.value)); } } else { if (pType === 'budget' && spType === 'view') { mem.budget_permission = []; $(`#budgetedit${id}`)[0].checked = false; } else if (pType === 'budget' && spType === 'edit') { mem.budget_permission.splice(mem.budget_permission.indexOf(permissionConst.budget.edit.value), 1); } else if (pType === 'file' && spType === 'view') { mem.file_permission = []; $(`#fileupload${id}`)[0].checked = false; $(`#fileedit${id}`)[0].checked = false; } else if (pType === 'file' && spType === 'upload') { mem.file_permission.splice(mem.file_permission.indexOf(permissionConst.file.upload.value), 1); } else if (pType === 'file' && spType === 'edit') { mem.file_permission.splice(mem.file_permission.indexOf(permissionConst.file.filing.value), 1); } else if (pType === 'manage' && spType === 'rela') { mem.manage_permission = []; } } }); $('#member-ok').click(function(){ const id = this.getAttribute('tree_id'); postData('/subproj/memberSave', {id, member: newMembers}, function () { $('#member').modal('hide'); }) }); });