pm_main.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. /**
  2. * Created by Mai on 2017/2/24.
  3. */
  4. var Tree = null, movetoZTree = null, copytoZTree = null;
  5. var ProjTreeSetting = {
  6. columns: [
  7. {
  8. head: '',
  9. data: '',
  10. width: '40',
  11. event: {}
  12. },
  13. {
  14. head: '工程列表',
  15. data: 'name',
  16. width: '78%',
  17. event: {
  18. getText: function (html, node, text) {
  19. html.push((node && node.data && node.data.projType === 'Folder') ? ' ' : '');
  20. html.push('<a ');
  21. if (node && node.data && node.data.projType === 'Tender') {
  22. html.push('href="/main?project=', node.id(), '"');
  23. }
  24. html.push('>', text, '<a>');
  25. },
  26. getIcon: function (html, node) {
  27. if (node.data.projType === 'Folder') {
  28. html.push('<i class ="tree-icon fa fa-folder-open-o"></i>');
  29. } else {
  30. html.push('<span class="poj-icon">└</span>');
  31. }
  32. }
  33. }
  34. },
  35. {
  36. head: '最近使用',
  37. data: 'lastDateTime',
  38. width: '10%',
  39. event: {
  40. getText: function (html, node, text) {
  41. html.push(text ? new Date(text).Format('yyyy-MM-dd') : '');
  42. }
  43. }
  44. },
  45. {
  46. head: '创建日期',
  47. data: 'createDateTime',
  48. width: '10%',
  49. event: {
  50. getText: function (html, node, text) {
  51. html.push(text ? new Date(text).Format('yyyy-MM-dd') : '');
  52. }
  53. }
  54. }
  55. ],
  56. viewEvent: {
  57. beforeSelect: function (node) {
  58. if (node && node.row) {
  59. $('td:eq(0)', node.row).children().remove();
  60. }
  61. },
  62. onSelectNode: function (node) {
  63. // 新建文件夹 是否可见
  64. if (node.data.projType === 'Tender') {
  65. $('#addFolderBtn').hide();
  66. } else {
  67. $('#addFolderBtn').show();
  68. }
  69. // 重命名可见
  70. $('#renameBtn').show();
  71. // 删除可见
  72. $('#delBtn').show();
  73. // 移动到、复制到、共享、协同 是否可见
  74. if (node.data.projType === 'Tender') {
  75. $('#movetoBtn').show();
  76. $('#copytoBtn').show();
  77. $('#shareBtn').show();
  78. $('#cooperateBtn').show();
  79. } else {
  80. $('#movetoBtn').hide();
  81. $('#copytoBtn').hide();
  82. $('#shareBtn').hide();
  83. $('#cooperateBtn').hide();
  84. }
  85. $('td:eq(0)', node.row).append($('<i class="fa fa-sort" data-toggle="tooltip" data-placement="top" title="长安拖动"></i>'));
  86. }
  87. }
  88. }
  89. // 从服务器拉取数据
  90. var LoadProjTree = function () {
  91. var table = $('#ProjTree');
  92. $('thead', table).remove();
  93. $('tbody', table).remove();
  94. GetAllProjectData(function (data) {
  95. Tree = $.fn.treeTable.init(table, ProjTreeSetting, data);
  96. });
  97. };
  98. var GetNeedUpdatePreNode = function (parent, next) {
  99. if (parent && parent.id() !== -1) {
  100. if (next && next.preSibling()) {
  101. return next.preSibling();
  102. } else {
  103. return parent.lastChild();
  104. }
  105. } else {
  106. return null;
  107. }
  108. };
  109. var GetPreNodeUpdateData = function (pre, nid) {
  110. var data = {};
  111. data['updateType'] = 'update';
  112. data['updateData'] = {id: pre.id(), nextId: nid};
  113. return data;
  114. }
  115. // 获取新建项目数据
  116. var GetAddProjUpdateData = function (parent, next, name) {
  117. var datas = [], updateData, pre, newId = Tree.maxNodeId() + 1;
  118. updateData = {};
  119. updateData['updateType'] = 'new';
  120. updateData['updateData'] = {};
  121. updateData['updateData']['id'] = newId;
  122. updateData['updateData']['parentId'] = parent ? parent.id() : -1;
  123. updateData['updateData']['nextId'] = next ? next.id() : -1;
  124. updateData['updateData']['name'] = name;
  125. updateData['updateData']['projType'] = 'Tender';
  126. datas.push(updateData);
  127. return datas;
  128. };
  129. var GetAddFolderProjUpdateData = function (parent, next, folderName1, folderName2, name) {
  130. var datas = [], updateData, folderData1, folderData2, pre, newId = Tree.maxNodeId() + 1;
  131. var addUpdateData = function (parentId, nextId, name, projType) {
  132. var data = {};
  133. data['updateType'] = 'new';
  134. data['updateData'] = {};
  135. data['updateData']['id'] = newId;
  136. data['updateData']['parentId'] = parentId;
  137. data['updateData']['nextId'] = nextId;
  138. data['updateData']['name'] = name;
  139. data['updateData']['projType'] = projType;
  140. newId += 1;
  141. datas.push(data);
  142. return data;
  143. }
  144. folderData1 = addUpdateData(parent.id(), next ? next.id() : -1, folderName1, 'Folder');
  145. folderData2 = addUpdateData(folderData1.updateData.id, -1, folderName2, 'Folder');
  146. addUpdateData(folderData2.updateData.id, -1, name, 'Tender');
  147. return datas;
  148. };
  149. // 获取新建文件夹数据
  150. var GetAddForlderUpdateData = function (parent, next, folderName) {
  151. var datas = [], updateData, pre, newId = Tree.maxNodeId() + 1;
  152. updateData = {};
  153. updateData['updateType'] = 'new';
  154. updateData['updateData'] = {};
  155. updateData['updateData']['id'] = newId;
  156. updateData['updateData']['parentId'] = parent ? parent.id() : -1;
  157. updateData['updateData']['nextId'] = next ? next.id() : -1;
  158. updateData['updateData']['name'] = folderName;
  159. updateData['updateData']['projType'] = 'Folder';
  160. datas.push(updateData);
  161. pre = GetNeedUpdatePreNode(parent, next);
  162. if (pre) {
  163. datas.push(GetPreNodeUpdateData(pre, newId));
  164. }
  165. return datas;
  166. };
  167. var GetNextChangeUpdateData = function (datas, node, next) {
  168. var data = null;
  169. if (node && node.id() !== -1) {
  170. data = {};
  171. data['updateType'] = 'update';
  172. data['updateData'] = {};
  173. data['updateData']['id'] = node.id();
  174. data['updateData']['nextId'] = next ? next.id() : -1;
  175. datas.push(data);
  176. }
  177. return data;
  178. }
  179. var GetFullName = function (node) {
  180. var fullName = [],
  181. cur = node;
  182. while (cur && cur.data) {
  183. fullName.unshift(cur.data.name);
  184. cur = cur.parent;
  185. }
  186. return fullName;
  187. }
  188. var GetDeleteUpdateData = function (node) {
  189. var datas = [], updateData,
  190. pre = node.preSibling(),
  191. deleteNodeData = function (node) {
  192. var data = {};
  193. data['updateType'] = 'delete';
  194. data['updateData'] = {};
  195. data['updateData']['id'] = node.id();
  196. data['updateData']['deleted'] = true;
  197. if (node.data.projType === 'Tender') {
  198. data['updateData']['deleteFullFolder'] = GetFullName(node.parent);
  199. }
  200. return data;
  201. },
  202. addDeleteChildren = function (children) {
  203. children.forEach(function(child){
  204. datas.push(deleteNodeData(child));
  205. addDeleteChildren(child.children);
  206. });
  207. };
  208. if (pre && pre.id() !== -1) {
  209. updateData = {};
  210. updateData['updateType'] = 'update';
  211. updateData['updateData'] = {};
  212. updateData['updateData']['id'] = pre.id();
  213. updateData['updateData']['nextId'] = node ? node.nid() : -1;
  214. datas.push(updateData);
  215. }
  216. datas.push(deleteNodeData(node));
  217. addDeleteChildren(node.children);
  218. return datas;
  219. };
  220. var GetMoveUpdateData = function (node, parent, next) {
  221. var datas = [], updateData;
  222. updateData = GetNextChangeUpdateData(datas, node.preSibling(), node.nextSibling);
  223. if (next) {
  224. updateData = GetNextChangeUpdateData(datas, next.preSibling(), node);
  225. }
  226. updateData = {};
  227. updateData['updateType'] = 'update';
  228. updateData['updateData'] = {};
  229. updateData['updateData']['id'] = node.id();
  230. updateData['updateData']['parentId'] = parent ? parent.id() : -1;
  231. updateData['updateData']['nextId'] = next ? next.id() : -1;
  232. datas.push(updateData);
  233. return datas;
  234. };
  235. var GetCopyUpdateData = function (node, parent, next){
  236. var datas = [], updateData, pre;
  237. updateData = {};
  238. updateData['updateType'] = 'new';
  239. updateData['updateData'] = {};
  240. updateData['updateData']['id'] = node.tree.maxNodeId() + 1;
  241. updateData['updateData']['parentId'] = parent ? parent.id() : -1;
  242. updateData['updateData']['nextId'] = next ? next.id() : -1;
  243. updateData['updateData']['name'] = node.data.name;
  244. updateData['updateData']['projType'] = node.data.projType;
  245. datas.push(updateData);
  246. pre = GetNeedUpdatePreNode(parent, next);
  247. if (pre) {
  248. updateData = {};
  249. updateData['updateType'] = 'update';
  250. updateData['updateData'] = {};
  251. updateData['updateData']['id'] = pre.id();
  252. updateData['updateData']['nextId'] = node.tree.maxNodeId() + 1;
  253. datas.push(updateData);
  254. }
  255. return datas;
  256. }
  257. var ConvertTreeToZtree = function (Tree, zTreeObj, filterNode) {
  258. var setting = {
  259. data: {
  260. simpleData: {
  261. enable:true,
  262. idKey: "id",
  263. pIdKey: "pId",
  264. rootPId: "-1"
  265. }
  266. }},
  267. zTreeData = [],
  268. exportNodesData = function (nodes) {
  269. nodes.forEach(function (node) {
  270. if (node !== filterNode) {
  271. var data = {};
  272. data['id'] = node.data['id'];
  273. data['pId'] = node.pid();// === -1 ? 0 : node.pid();
  274. data['name'] = node.data['name'];
  275. data['isParent'] = node.data.projType === 'Folder';//(node.data.projType === 'Folder' && node.children.length === 0);
  276. data['open'] = node.data.projType === 'Folder';//node.children.length !== 0;
  277. zTreeData.push(data);
  278. exportNodesData(node.children);
  279. }
  280. })
  281. };
  282. exportNodesData(Tree._root.children);
  283. return $.fn.zTree.init(zTreeObj, setting, zTreeData);
  284. };
  285. var GetTargetTreeNode = function (zTreeObj) {
  286. var ztree_selected;
  287. if (zTreeObj && Tree) {
  288. ztree_selected = zTreeObj.getSelectedNodes().length === 0 ? null : zTreeObj.getSelectedNodes()[0];
  289. return ztree_selected ? Tree.findNode(ztree_selected.id) : null;
  290. } else {
  291. return null;
  292. }
  293. };
  294. var AddFolderChildValid = function (node) {
  295. if (node.data.projType === 'Folder') {
  296. if (node.children.length === 0) {
  297. return true;
  298. } else {
  299. return (node.firstChild().data.projType === 'Folder');
  300. }
  301. } else {
  302. return false;
  303. }
  304. };
  305. var AddTenderChildValid = function (node) {
  306. if (node.data.projType === 'Folder') {
  307. if (node.children.length === 0) {
  308. return true;
  309. } else {
  310. return (node.firstChild().data.projType === 'Tender');
  311. }
  312. } else {
  313. return false;
  314. }
  315. };
  316. LoadProjTree();
  317. $('#movetoBtn').hide();
  318. $('#copytoBtn').hide();
  319. $('#shareBtn').hide();
  320. $('#cooperateBtn').hide();
  321. // 新建文件夹
  322. $('#addFolderBtn').click(function () {
  323. if (Tree) {
  324. $('#addFolder').modal('show');
  325. }
  326. });
  327. $('#addFolderOk').click(function () {
  328. var form = $('#addFolder');
  329. var name = $('#folder-name-input').val();
  330. var updateData, parent, next;
  331. if (name) {
  332. if (Tree.selected()) {
  333. if (Tree.selected().children.length === 0 || Tree.selected().firstChild().data.projType === 'Folder') {
  334. parent = Tree.selected();
  335. next = Tree.selected().firstChild();
  336. } else {
  337. parent = Tree.selected().parent;
  338. next = Tree.selected().nextSibling;
  339. }
  340. } else {
  341. parent = Tree._root;
  342. next = Tree.firstNode();
  343. }
  344. updateData = GetAddForlderUpdateData(parent, next, name);
  345. UpdateProjectData(updateData, function(datas){
  346. datas.forEach(function (data) {
  347. if (data.updateType === 'new') {
  348. Tree.addNodeData(data.updateData, parent, next);
  349. }
  350. });
  351. form.modal('hide');
  352. });
  353. }
  354. });
  355. // 新建工程
  356. var AddProj = function () {
  357. var name = $('#tenderName').val(), updateData, parent, next;
  358. if (name !== '') {
  359. // if (Tree.selected()){
  360. // if (Tree.selected().data.projType === 'Tender') {
  361. // parent = Tree.selected().parent;
  362. // next = Tree.selected().next;
  363. // } else {
  364. // if (Tree.selected().firstNode.data.projType === 'Tender') {
  365. // parent = Tree.selected();
  366. // next = Tree.selected().firstNode();
  367. // } else {
  368. // return;
  369. // }
  370. // }
  371. // } else {
  372. // parent = Tree._root();
  373. // next = Tree.firstNode();
  374. // }
  375. updateData = GetAddProjUpdateData(Tree._root, Tree.firstNode(), name);
  376. UpdateProjectData(updateData, function (datas) {
  377. datas.forEach(function (data) {
  378. var parent, next;
  379. if (data.updateType === 'new') {
  380. parent = data.updateData.parentId === -1 ? Tree._root : Tree.findNode(data.updateData.parentId);
  381. next = data.updateData.nextId === -1 ? null : Tree.findNode(data.updateData.nextId);
  382. Tree.addNodeData(data.updateData, parent, next);
  383. }
  384. });
  385. $('#addProj').modal('hide');
  386. });
  387. }
  388. }
  389. var AddFolderProj = function () {
  390. var nameB = $('#buildName').val(), nameX = $('#xiangName').val(), name = $('#tenderName').val(), updateData;
  391. if (nameB !== '' && nameX !== '' && name !== '') {
  392. updateData = GetAddFolderProjUpdateData(Tree._root, Tree.firstNode(), nameB, nameX, name);
  393. UpdateProjectData(updateData, function (datas) {
  394. datas.forEach(function (data) {
  395. var parent, next;
  396. if (data.updateType === 'new') {
  397. parent = data.updateData.parentId === -1 ? Tree._root : Tree.findNode(data.updateData.parentId);
  398. next = data.updateData.nextId === -1 ? null : Tree.findNode(data.updateData.nextId);
  399. Tree.addNodeData(data.updateData, parent, next);
  400. }
  401. });
  402. $('#addProj').modal('hide');
  403. });
  404. }
  405. }
  406. $('#addProjBtn').click(function () {
  407. if (Tree) {
  408. $('#addProj').modal('show');
  409. }
  410. });
  411. $('#addProjOk').click(function () {
  412. var hasFolder = $('#isAddFolder>input').is(':checked');
  413. if (hasFolder) {
  414. AddFolderProj();
  415. } else {
  416. AddProj();
  417. }
  418. });
  419. $('#isAddFolder').change(function () {
  420. if ($('input',this).is(':checked')) {
  421. $('#moreinfo').collapse('show');
  422. } else {
  423. $('#moreinfo').collapse('hide');
  424. }
  425. });
  426. // 重命名
  427. $('#renameBtn').click(function() {
  428. if (Tree && Tree.selected()) {
  429. $('#rename').modal('show');
  430. }
  431. })
  432. $('#rename').on('show.bs.modal', function () {
  433. $('#newName').attr('placeholder', Tree.selected().data.name);
  434. });
  435. $('#renameOk').click(function () {
  436. var select = Tree.selected(),
  437. newName = $('#newName').val(),
  438. form = $('#rename');
  439. if (select && newName !== select.data.name) {
  440. RenameProject(select.id(), newName, function () {
  441. form.modal('hide');
  442. select.data.name = newName;
  443. Tree.refreshNodesDom([select]);
  444. });
  445. } else {
  446. form.modal('hide');
  447. }
  448. });
  449. // 删除
  450. $('#delBtn').click(function() {
  451. if (Tree && Tree.selected()) {
  452. $('#del').modal('show');
  453. }
  454. });
  455. $('#del').on('show.bs.modal', function() {
  456. var hasTenderChild = function (children) {
  457. var i;
  458. for (i = 0; i < children.length; i++) {
  459. if (children[i].children.length === 0) {
  460. if (children[i].data.projType === 'Tender') {
  461. return true;
  462. }
  463. } else if (hasTenderChild(children[i].children)) {
  464. return true;
  465. }
  466. }
  467. return false;
  468. };
  469. if (Tree.selected().children.length == 0) {
  470. $('#tenderHint').show();
  471. $('#tenderHint').text('删除 "' + Tree.selected().data.name +'" ?');
  472. $('#folderHint').hide();
  473. } else {
  474. $('#tenderHint').hide();
  475. $('#folderHint').show();
  476. $('#folderHint').text('删除 "'+ Tree.selected().data.name +'" 以及它包含的子项?');
  477. }
  478. if (hasTenderChild([Tree.selected()])) {
  479. $('#restoreHint').show();
  480. } else {
  481. $('#restoreHint').hide();
  482. }
  483. });
  484. $('#deleteProjOk').click(function () {
  485. var updateData, form = $('#del');
  486. if (Tree) {
  487. updateData = GetDeleteUpdateData(Tree.selected());
  488. UpdateProjectData(updateData, function () {
  489. form.modal('hide');
  490. Tree.removeNode(Tree.selected());
  491. });
  492. }
  493. });
  494. // 移动至
  495. $('#movetoBtn').click(function () {
  496. if (Tree && Tree.selected()) {
  497. $('#moveto').modal('show');
  498. }
  499. });
  500. $('#moveto').on('show.bs.modal', function () {
  501. movetoZTree = ConvertTreeToZtree(Tree, $('#treeDemo'), Tree.selected());
  502. });
  503. $('#movetoOk').click(function () {
  504. var updateData, form = $('#moveto'),
  505. target = GetTargetTreeNode($.fn.zTree.getZTreeObj('treeDemo')),
  506. parent, next, cur = Tree.selected();
  507. if (target) {
  508. if (target.data.projType === 'Tender') {
  509. parent = target.parent;
  510. next = target.nextSibling;
  511. } else {
  512. parent = target;
  513. next = target.firstChild();
  514. }
  515. if (parent !== cur.parent || (next !== cur && next !== cur.nextSibling)){
  516. updateData = GetMoveUpdateData(Tree.selected(), parent, next);
  517. UpdateProjectData(updateData, function (data) {
  518. form.modal('hide');
  519. Tree.move(Tree.selected(), parent, next);
  520. });
  521. } else {
  522. form.modal('hide');
  523. }
  524. } else {
  525. form.modal('hide');
  526. }
  527. })
  528. // 复制到
  529. $('#copytoBtn').click(function () {
  530. if (Tree && Tree.selected()) {
  531. $('#copyto').modal('show');
  532. }
  533. });
  534. $('#copyto').on('show.bs.modal', function () {
  535. copytoZTree = ConvertTreeToZtree(Tree, $('#treeDemo2'));
  536. });
  537. $('#copytoOk').click(function() {
  538. var updateData, form = $('#copyto'),
  539. target = GetTargetTreeNode($.fn.zTree.getZTreeObj('treeDemo2')),
  540. parent, next, cur = Tree.selected();
  541. if (target && (target.data.projType === 'Tender' || target.children.length === 0 || target.firstChild().data.projType === 'Tender')) {
  542. if (target.data.projType === 'Tender') {
  543. parent = target.parent;
  544. next = target.nextSibling;
  545. } else {
  546. parent = target;
  547. next = target.firstChild();
  548. }
  549. if (parent !== cur.parent || (next !== cur && next !== cur.nextSibling)){
  550. updateData = GetCopyUpdateData(Tree.selected(), parent, next);
  551. UpdateProjectData(updateData, function (data) {
  552. form.modal('hide');
  553. data.forEach(function (nodeData) {
  554. if (nodeData.updateType === 'new') {
  555. Tree.addNodeData(nodeData.updateData, parent, next);
  556. }
  557. });
  558. });
  559. } else {
  560. form.modal('hide');
  561. }
  562. } else {
  563. form.modal('hide');
  564. }
  565. });