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); let tenderTreeShowLevel; 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 if (canEdit) { html.push(``); } else { html.push(``); } } // 创建时间 if (node.is_folder) { html.push(``); html.push(``); } else { html.push(`${moment(node.create_time).format('YYYY-MM-DD')}`); if (canEdit) { html.push(`${node.management || ''}${node.management ? '': ''}`); } else { html.push(`${node.management || ''}`); } } // 操作 html.push(``); if (canEdit) { html.push(''); html.push(''); html.push(''); html.push(''); if (node.is_folder) { if (!node.children || node.children.length === 0) { html.push(''); } } else { const delHint = node.tender_count > 0 ? '请先删除所有标段' : (node.contract_count > 0 ? '请先删除所有合同' : (node.file_count > 0 ? '请先删除所有资料归集文件' : '')); if (delHint) { html.push(``); } else { 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 || !select.is_folder)); if (select && (select.tree_level >= 4 || !select.is_folder)) { $('[href="#add-folder"]').hide(); } else { $('[href="#add-folder"]').show(); } if (select && !select.is_folder) { $('[href="#add-project"]').hide(); } else { $('[href="#add-project"]').show(); } }, refreshTreeTable: function(result) { ProjectTree.loadDatas(result); if (ProjectTree.nodes.length > 0 && $('#no-project').length > 0) window.location.reload(); 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() { if (!Utils.dropNode.is_folder) { toastr.warning('请将文件夹或者项目拖动到目标文件夹下'); return; } const parents = ProjectTree.getAllParents(Utils.dropNode); const existParent = parents.find(x => { return x.id === Utils.dragNode.id; }); if (existParent) { toastr.error('请勿将文件夹移动到子文件夹下'); 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; }, move: function(node, type) { postData('/subproj/move', { id: node.id, type }, function (result) { Utils.refreshTreeTable(result); }); }, expandByLevel: function(level){ ProjectTree.expandByLevel(level); for (const node of ProjectTree.nodes) { const tr = $(`tr[tree_id=${node.id}]`); if (node.expanded) { $('.fold-switch', tr).html(``); } else { $('.fold-switch', tr).html(``); } if (node.visible) { tr.show(); } else { tr.hide(); } } } }; 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) { if (node.children && node.children.length > 0) return; $('.modal-title', '#del').html('确认删除文件夹'); $('#del-hint').attr('tree_id', treeId).html(`确定删除「${node.name}」及其下所有内容?`); $('#del').modal('show'); } else { if (node.tender_count || node.file_count || node.contract_count) return; $('.modal-title', '#del').html('确认删除项目'); $('#del-hint').attr('tree_id', treeId).html(`确定删除「${node.name}」?`); $('#del').modal('show'); } }); $('body').on('click', 'button[name=up]', function (e) { const treeId = $(this).parent().parent().attr('tree_id'); const node = ProjectTree.getItems(treeId); if (!ProjectTree.getPreSiblingNode(node)) { toastr.warning('不可上移'); return; } Utils.move(node, 'up'); }); $('body').on('click', 'button[name=down]', function (e) { const treeId = $(this).parent().parent().attr('tree_id'); const node = ProjectTree.getItems(treeId); if (!ProjectTree.getNextSiblingNode(node)) { toastr.warning('不可下移'); return; } Utils.move(node, 'down'); }); $('body').on('click', 'button[name=top]', function (e) { const treeId = $(this).parent().parent().attr('tree_id'); const node = ProjectTree.getItems(treeId); if (!ProjectTree.getParent(node)) { toastr.warning('已是顶层节点'); return; } Utils.move(node, 'top'); }); $('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); $('#sm-management').val(node.management); if (node.filing_template_id) { const ft = $(`[value=${node.filing_template_id}]`)[0]; if (ft) $('#sm-ft')[0].selectedIndex = Array.prototype.indexOf.call(ft.parentNode.children, ft); } //$('#sm-ft').val(node.filing_template_name); $('#sm-ft').attr('disabled', !!node.management); $('#set-management').modal('show'); }); $('body').on('click', 'a[name=refresh-management]', function(e) { const treeId = $(this).parent().parent().attr('tree_id'); const node = ProjectTree.getItems(treeId); if (node.is_folder) return; postData('/subproj/refresh', { id: treeId }, function(result) { toastr.success(`更新${result.um + result.dm + result.im}条用户权限`); }); }); $('body').on('click', '.fold-switch', function() { const id = this.getAttribute('id'); const node = ProjectTree.getItems(id); ProjectTree.setExpanded(node, !node.expanded); const posterity = ProjectTree.getPosterity(node); if (node.expanded) { $(this).html(``); } else { $(this).html(``); } for (const p of posterity) { if (p.visible) { $(`tr[tree_id=${p.id}]`).show(); } else { $(`tr[tree_id=${p.id}]`).hide(); } } }); const getChildrenLevel = function (node) { let iLevel = node.tree_level || 1; if (node.children && node.children.length > 0) { for (const c of node.children) { iLevel = Math.max(iLevel, getChildrenLevel(c)); } } return iLevel; }; tenderTreeShowLevel = $.cs_showLevel({ selector: '#show-level', levels: [ { type: 'sort', count: 5, visible_count: function () { return ProjectTree.children.map(getChildrenLevel).reduce((x, y) => { return Math.max(x, y); }, 0) - 1; } }, { type: 'last', title: '最底层', visible: function () { const count = ProjectTree.children.map(getChildrenLevel).reduce((x, y) => { return Math.max(x, y); }, 0) - 1; return count > 0; } }, ], showLevel: function (tag) { switch (tag) { case "1": case "2": case "3": case "4": case "5": Utils.expandByLevel(parseInt(tag)); break; case "last": Utils.expandByLevel(20); break; default: return; } } }); tenderTreeShowLevel.initShowLevel(); tenderTreeShowLevel.refreshMenuVisible(); 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 = nameObj.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(); const filingTemplate =$('#sm-ft').val(); postData('/subproj/save', { id, management, filingTemplate }, function(result) { projectTreeObj.refreshRow(result); $('#set-management').modal('hide'); $('#sm-management').attr('tree_id', ''); }); }); });