gljClassTree.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. /**
  2. * Created by Zhong on 2018/1/16.
  3. */
  4. let gljClassTreeObj = {
  5. cache: null,//ref to tree.items
  6. tree: null,
  7. controller: null,
  8. workBook: null,
  9. sheet: null,
  10. updateType: {new: 'new', update: 'update'},
  11. insertBtn: $('#tree_Insert'),
  12. removeBtn: $('#tree_remove'),
  13. upLevelBtn: $('#tree_upLevel'),
  14. downLevelBtn: $('#tree_downLevel'),
  15. downMoveBtn: $('#tree_downMove'),
  16. upMoveBtn: $('#tree_upMove'),
  17. setting: {
  18. sheet: {
  19. cols:[
  20. {
  21. head: {
  22. titleNames: ['名称'],
  23. spanCols: [1],
  24. spanRows: [2],
  25. vAlign: [1, 1],
  26. hAlign: [1, 1],
  27. font: 'Arial'
  28. },
  29. data: {
  30. field: 'Name',
  31. vAlign: 1,
  32. hAlign: 0,
  33. font: 'Arial'
  34. },
  35. width: 400
  36. }
  37. ],
  38. headRows: 1,
  39. headRowHeight: [30],
  40. emptyRows: 0,
  41. treeCol: 0
  42. },
  43. tree: {
  44. id: 'ID',
  45. pid: 'ParentID',
  46. nid: 'NextSiblingID',
  47. rootId: -1
  48. },
  49. options: {
  50. tabStripVisible: false,
  51. allowCopyPasteExcelStyle : false,
  52. allowExtendPasteRange: false,
  53. allowUserDragDrop : false,
  54. allowUserDragFill: false,
  55. scrollbarMaxAlign : true
  56. }
  57. },
  58. isDef: function (v) {
  59. return v !== undefined && v !== null;
  60. },
  61. isFunc: function (v) {
  62. return this.isDef(v) && typeof v === 'function';
  63. },
  64. //sheet things
  65. setOptions: function (workbook, opts) {
  66. for(let opt in opts){
  67. workbook.options[opt] = opts[opt];
  68. }
  69. },
  70. renderFunc: function (sheet, func) {
  71. sheet.suspendPaint();
  72. sheet.suspendEvent();
  73. if(this.isFunc(func)){
  74. func();
  75. }
  76. sheet.resumePaint();
  77. sheet.resumeEvent();
  78. },
  79. buildSheet: function () {
  80. if(!this.isDef(this.workBook)){
  81. this.workBook = new GC.Spread.Sheets.Workbook($('#gljClassSpread')[0], {sheetCount: 1});
  82. this.sheet = this.workBook.getActiveSheet();
  83. this.setOptions(this.workBook, this.setting.options);
  84. this.sheet.options.clipBoardOptions = GC.Spread.Sheets.ClipboardPasteOptions.values;
  85. this.bindEvents(this.sheet);
  86. }
  87. },
  88. bindEvents: function (sheet) {
  89. let me = gljClassTreeObj;
  90. const Events = GC.Spread.Sheets.Events;
  91. sheet.bind(Events.SelectionChanged, me.onSelectionChanged);
  92. sheet.bind(Events.EditEnded, me.onEditEnded);
  93. sheet.bind(Events.ClipboardPasted, me.onClipboardPasted);
  94. },
  95. onSelectionChanged: function (sender, info) {
  96. let me = gljClassTreeObj;
  97. if(info.oldSelections.length === 0 && info.newSelections.length > 0 || info.oldSelections[0].row !== info.newSelections[0].row){
  98. let row = info.newSelections[0].row;
  99. let node = me.cache[row];
  100. me.initSelection(node);
  101. }
  102. else {
  103. me.refreshBtn(null);
  104. }
  105. },
  106. onEditEnded: function (sender, args) {
  107. let me = gljClassTreeObj;
  108. let postData = [];
  109. let v = me.isDef(args.editingText) ? args.editingText.toString().trim() : '';
  110. let node = me.cache[args.row];
  111. if(me.isDef(node) && node.data.Name !== v){
  112. let updateObj = me.getUpdateObj(me.updateType.update, node.getID(), null, null, v, null);
  113. postData.push(updateObj);
  114. //ajax
  115. //update
  116. me.gljClassTreeAjax(postData, function (rstData) {
  117. node.data.Name = v;
  118. }, function () {
  119. args.sheet.setValue(args.row, args.col, node.data.Name ? node.data.Name : '');
  120. });
  121. }
  122. },
  123. onClipboardPasted: function (sender, info) {
  124. let me = gljClassTreeObj;
  125. let items = sheetCommonObj.analyzePasteData({header: [{dataCode: 'Name'}]}, info);
  126. let postData = [];
  127. let frontData = [];
  128. for(let i = 0, len = items.length; i < len; i++){
  129. let row = info.cellRange.row + i;
  130. let node = me.cache[row];
  131. if(me.isDef(node) && me.isDef(items[i].Name) && node.data.Name !== items[i].Name){
  132. let updateObj = me.getUpdateObj(me.updateType.update, node.getID(), null, null, items[i].Name, null);
  133. postData.push(updateObj);
  134. frontData.push({row: row, Name: items[i].Name});
  135. node.data.Name = items[i].Name;
  136. }
  137. }
  138. if(postData.length > 0){
  139. //ajax
  140. me.gljClassTreeAjax(postData, function (rstData) {
  141. for(let i = 0, len = frontData.length; i < len; i++){
  142. let node = me.cache[frontData[i]['row']];
  143. if(me.isDef(node)){
  144. node.data.Name = frontData[i]['Name'];
  145. }
  146. }
  147. }, function () {
  148. for(let i = 0, len = frontData.length; i < len; i++){
  149. let node = me.cache[frontData[i]['row']];
  150. me.sheet.setValue(frontData[i]['row'], 0, me.isDef(node) ? node.data.Name : '');
  151. }
  152. });
  153. }
  154. },
  155. getGljClassTree: function (gljLibId, callback) {
  156. let me = gljClassTreeObj;
  157. let re = repositoryGljObj;
  158. let url = 'api/getGljTree';
  159. let postData = {gljLibId: gljLibId};
  160. let sucFunc = function (rstData) {
  161. zTreeHelper.createTree(rstData, componentSetting, "componentTree", componentOprObj);
  162. let rootNode = componentOprObj.treeObj.getNodes()[0];
  163. if(rootNode && rootNode.isParent && rootNode.isFirstNode){
  164. componentOprObj.rootNode = rootNode;
  165. }
  166. if (rstData && rstData.length > 0) {
  167. me.gljCurTypeId = rstData[0].ID;
  168. }
  169. //init
  170. me.buildSheet();
  171. me.initTree(rstData);
  172. me.cache = me.tree.items;
  173. re.updateParentNodeIds(me.cache, re);
  174. me.bindBtn();
  175. me.initController(me.tree, me.sheet, me.setting.sheet);
  176. me.controller.showTreeData();
  177. me.sheet.setFormatter(-1, 0, '@');
  178. me.initSelection(me.tree.selected);
  179. if(callback){
  180. callback();
  181. }
  182. };
  183. let errFunc = function () {
  184. };
  185. CommonAjax.post(url, postData, sucFunc, errFunc);
  186. },
  187. initTree: function (datas) {
  188. this.tree = idTree.createNew(this.setting.tree);
  189. this.tree.loadDatas(datas);
  190. this.tree.selected = this.tree.items.length > 0 ? this.tree.items[0] : null;
  191. },
  192. initController: function (tree, sheet, setting) {
  193. this.controller = TREE_SHEET_CONTROLLER.createNew(tree, sheet, setting);
  194. },
  195. refreshBtn: function (selected) {
  196. let me = this;
  197. me.insertBtn.removeClass('disabled');
  198. me.removeBtn.removeClass('disabled');
  199. me.upLevelBtn.removeClass('disabled');
  200. me.downLevelBtn.removeClass('disabled');
  201. me.downMoveBtn.removeClass('disabled');
  202. me.upMoveBtn.removeClass('disabled');
  203. if(!me.isDef(selected)){
  204. me.removeBtn.addClass('disabled');
  205. me.upLevelBtn.addClass('disabled');
  206. me.downLevelBtn.addClass('disabled');
  207. me.downMoveBtn.addClass('disabled');
  208. me.upMoveBtn.addClass('disabled');
  209. }
  210. else {
  211. if(!me.isDef(selected.preSibling)){
  212. me.downLevelBtn.addClass('disabled');
  213. me.upMoveBtn.addClass('disabled');
  214. }
  215. if(!me.isDef(selected.nextSibling)){
  216. me.downMoveBtn.addClass('disabled');
  217. }
  218. if(!me.isDef(selected.parent)){
  219. me.upLevelBtn.addClass('disabled');
  220. }
  221. }
  222. },
  223. bindBtn: function () {
  224. let me = this;
  225. me.insertBtn.click(function () {
  226. me.insert();
  227. });
  228. me.removeBtn.click(function () {
  229. me.remove(me.tree.selected);
  230. });
  231. me.upLevelBtn.click(function () {
  232. me.upLevel(me.tree.selected);
  233. });
  234. me.downLevelBtn.click(function () {
  235. me.downLevel(me.tree.selected);
  236. });
  237. me.downMoveBtn.click(function () {
  238. me.downMove(me.tree.selected);
  239. });
  240. me.upMoveBtn.click(function () {
  241. me.upMove(me.tree.selected);
  242. });
  243. },
  244. insert: function () {
  245. let me = this;
  246. let re = repositoryGljObj;
  247. me.insertBtn.addClass('disabled');
  248. let postData = [];
  249. let newID = me.tree.newNodeID();
  250. if(!me.isDef(newID)){
  251. return;
  252. }
  253. let selected = me.tree.selected;
  254. let insertObj = me.getUpdateObj(me.updateType.new, newID, -1, -1, '', null);
  255. if(me.isDef(selected)) {
  256. let updateObj = me.getUpdateObj(me.updateType.update, selected.getID(), newID, null, null, null);
  257. postData.push(updateObj);
  258. insertObj.updateData.ParentID = selected.getParentID();
  259. if(me.isDef(selected.nextSibling)){
  260. insertObj.updateData.NextSiblingID = selected.getNextSiblingID();
  261. }
  262. }
  263. postData.push(insertObj);
  264. if(postData.length > 0){
  265. //ajax
  266. me.gljClassTreeAjax(postData, function (rstData) {
  267. me.controller.insert();
  268. me.refreshBtn(me.tree.selected);
  269. //fresh tools
  270. me.initTools(me.tree.selected);
  271. re.updateParentNodeIds(me.cache, re);
  272. });
  273. }
  274. },
  275. remove: function (selected) {
  276. let me = this;
  277. let re = repositoryGljObj;
  278. me.removeBtn.addClass('disabled');
  279. let postData = [], IDs = [];
  280. if(!selected){
  281. return;
  282. }
  283. getDelIds(selected);
  284. function getDelIds(node){
  285. if(me.isDef(node)){
  286. IDs.push(node.getID());
  287. if(node.children.length > 0){
  288. for(let i = 0, len = node.children.length; i < len; i++){
  289. getDelIds(node.children[i]);
  290. }
  291. }
  292. }
  293. }
  294. if(me.isDef(selected.preSibling)){
  295. let updateObj = me.getUpdateObj(me.updateType.update, selected.preSibling.getID(), selected.getNextSiblingID(), null, null, null);
  296. postData.push(updateObj);
  297. }
  298. if(IDs.length > 0){
  299. for(let i = 0, len = IDs.length; i < len; i++){
  300. let delObj = me.getUpdateObj(me.updateType.update, IDs[i], null, null, null, true);
  301. postData.push(delObj);
  302. }
  303. }
  304. if(postData.length > 0){
  305. //ajax
  306. me.gljClassTreeAjax(postData, function (rstData) {
  307. me.controller.delete();
  308. me.refreshBtn(me.tree.selected);
  309. me.initTools(me.tree.selected);
  310. re.updateParentNodeIds(me.cache, re);
  311. });
  312. }
  313. },
  314. upLevel: function (selected) {
  315. let me = this;
  316. let re = repositoryGljObj;
  317. me.upLevelBtn.addClass('disabled');
  318. let postData = [];
  319. if(!me.isDef(selected)){
  320. return;
  321. }
  322. if(!me.isDef(selected.parent)){
  323. return;
  324. }
  325. if(me.isDef(selected.preSibling)){
  326. let updateObj = me.getUpdateObj(me.updateType.update, selected.preSibling.getID(), -1, null, null, null);
  327. postData.push(updateObj);
  328. }
  329. let updateObj = me.getUpdateObj(me.updateType.update, selected.getID(), selected.parent.getNextSiblingID(), selected.parent.getParentID(), null, null);
  330. postData.push(updateObj);
  331. let updateParent = me.getUpdateObj(me.updateType.update, selected.getParentID(), selected.getID(), null, null, null);
  332. postData.push(updateParent);
  333. let nextIDs = [];
  334. getNext(selected);
  335. function getNext(node){
  336. if(me.isDef(node.nextSibling)){
  337. nextIDs.push(node.getNextSiblingID());
  338. getNext(node.nextSibling);
  339. }
  340. }
  341. for(let i = 0, len = nextIDs.length; i < len; i++){
  342. postData.push(me.getUpdateObj(me.updateType.update, nextIDs[i], null, selected.getID(), null, null));
  343. }
  344. if(postData.length > 0){
  345. //ajax
  346. me.gljClassTreeAjax(postData, function (rstData) {
  347. me.controller.upLevel();
  348. me.refreshBtn(me.tree.selected);
  349. re.updateParentNodeIds(me.cache, re);
  350. });
  351. }
  352. },
  353. downLevel: function (selected) {
  354. let me = this;
  355. let re = repositoryGljObj;
  356. me.downLevelBtn.addClass('disabled');
  357. let postData = [];
  358. if(!me.isDef(selected)){
  359. return;
  360. }
  361. if(!me.isDef(selected.preSibling)){
  362. return;
  363. }
  364. let updatePre = me.getUpdateObj(me.updateType.update, selected.preSibling.getID(), selected.getNextSiblingID(), null, null, null);
  365. postData.push(updatePre);
  366. if(selected.preSibling.children.length > 0){
  367. let updateObj = me.getUpdateObj(me.updateType.update, selected.preSibling.children[selected.preSibling.children.length - 1].getID(), selected.getID(), null, null, null);
  368. postData.push(updateObj);
  369. }
  370. let updateObj = me.getUpdateObj(me.updateType.update, selected.getID(), -1, selected.preSibling.getID(), null, null);
  371. postData.push(updateObj);
  372. if(postData.length > 0){
  373. //ajax
  374. me.gljClassTreeAjax(postData, function (rstData) {
  375. me.controller.downLevel();
  376. me.refreshBtn(me.tree.selected);
  377. re.updateParentNodeIds(me.cache, re);
  378. });
  379. }
  380. },
  381. upMove: function (selected) {
  382. let me = this;
  383. me.upMoveBtn.addClass('disabled');
  384. let postData = [];
  385. if(!me.isDef(selected)){
  386. return;
  387. }
  388. if(!me.isDef(selected.preSibling)){
  389. return;
  390. }
  391. let updateObj = me.getUpdateObj(me.updateType.update, selected.getID(), selected.preSibling.getID(), null, null, null);
  392. postData.push(updateObj);
  393. let updatePre = me.getUpdateObj(me.updateType.update, selected.preSibling.getID(), selected.getNextSiblingID(), null, null, null);
  394. postData.push(updatePre);
  395. if(me.isDef(selected.preSibling.preSibling)){
  396. let updatePrepre = me.getUpdateObj(me.updateType.update, selected.preSibling.preSibling.getID(), selected.getID(), null, null, null);
  397. postData.push(updatePrepre);
  398. }
  399. if(postData.length > 0){
  400. //ajax
  401. me.gljClassTreeAjax(postData, function (rstData) {
  402. me.controller.upMove();
  403. me.refreshBtn(me.tree.selected);
  404. });
  405. }
  406. },
  407. downMove: function (selected) {
  408. let me = this;
  409. me.downMoveBtn.addClass('disabled');
  410. let postData = [];
  411. if(!me.isDef(selected)){
  412. return;
  413. }
  414. if(!me.isDef(selected.nextSibling)){
  415. return;
  416. }
  417. if(me.isDef(selected.preSibling)){
  418. let updatePre = me.getUpdateObj(me.updateType.update, selected.preSibling.getID(), selected.getNextSiblingID(), null, null, null);
  419. postData.push(updatePre);
  420. }
  421. let updateObj = me.getUpdateObj(me.updateType.update, selected.getID(), selected.nextSibling.getNextSiblingID(), null, null, null);
  422. postData.push(updateObj);
  423. let updateNext = me.getUpdateObj(me.updateType.update, selected.getNextSiblingID(), selected.getID(), null, null, null);
  424. postData.push(updateNext);
  425. if(postData.length > 0){
  426. //ajax
  427. me.gljClassTreeAjax(postData, function (rstData) {
  428. me.controller.downMove();
  429. me.refreshBtn(me.tree.selected);
  430. });
  431. }
  432. },
  433. getUpdateObj: function (updateType, id, nid, pid, name, deleted) {
  434. let updateObj = Object.create(null);
  435. updateObj.updateType = '';
  436. updateObj.updateData = Object.create(null);
  437. updateObj.updateData.repositoryId = pageOprObj.gljLibId;
  438. if(this.isDef(updateType)){
  439. updateObj.updateType = updateType;
  440. }
  441. if(this.isDef(id)){
  442. updateObj.updateData.ID = id;
  443. }
  444. if(this.isDef(nid)){
  445. updateObj.updateData.NextSiblingID = nid;
  446. }
  447. if(this.isDef(pid)){
  448. updateObj.updateData.ParentID = pid;
  449. }
  450. if(this.isDef(name)){
  451. updateObj.updateData.Name = name;
  452. }
  453. if(this.isDef(deleted)){
  454. updateObj.updateData.deleted = true;
  455. }
  456. return updateObj;
  457. },
  458. gljClassTreeAjax: function (postData, scFunc, errFunc) {
  459. CommonAjax.post('api/updateNodes', {updateData: postData, lastOpr: userAccount}, scFunc, errFunc);
  460. },
  461. //模仿默认点击
  462. initSelection: function (node) {
  463. let me = this,
  464. re = repositoryGljObj,
  465. that = gljComponentOprObj;
  466. if(!re.isDef(node)){
  467. return;
  468. }
  469. me.refreshBtn(node);
  470. let gljTypeId = node.data.ID;
  471. re.gljCurTypeId = node.data.ID;
  472. re.addGljObj = null;
  473. sheetCommonObj.cleanSheet(that.workBook.getSheet(0), that.setting, 10);
  474. if (re.parentNodeIds["_pNodeId_" + gljTypeId]) {
  475. re.currentOprParent = 1;
  476. re.currentCache = re.getParentCache(re.parentNodeIds["_pNodeId_" + gljTypeId]);
  477. re.workBook.getSheet(0).setRowCount(re.currentCache.length);
  478. } else {
  479. re.currentOprParent = 0;
  480. re.currentCache = re.getCache();
  481. }
  482. re.showGljItems(re.currentCache, gljTypeId);
  483. me.workBook.focus(true);
  484. }
  485. }