MindView.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. MWF.xApplication.Report = MWF.xApplication.Report || {};
  2. MWF.xDesktop.requireApp("Template", "MDomItem", null, false);
  3. MWF.xDesktop.requireApp("Template", "Explorer", null, false);
  4. MWF.xDesktop.requireApp("Template", "MSelector", null, false);
  5. MWF.require("MWF.widget.Identity", null,false);
  6. MWF.xApplication.Report.MindView = new Class({
  7. Extends: MWF.widget.Common,
  8. Implements: [Options, Events],
  9. options: {
  10. "style": "default"
  11. },
  12. initialize: function (node, app, actions, options) {
  13. this.setOptions(options);
  14. this.app = app;
  15. this.lp = app.lp.keyWorkList;
  16. this.path = "/x_component_Report/$MindView/";
  17. this.loadCss();
  18. this.actions = actions;
  19. this.node = $(node);
  20. },
  21. loadCss: function () {
  22. this.cssPath = this.path + this.options.style + "/css.wcss";
  23. this._loadCss();
  24. },
  25. load: function () {
  26. this.createMiddleContent();
  27. //this.app.addEvent("resize", function(){
  28. // this.resizeContent();
  29. //}.bind(this));
  30. },
  31. reload:function(year){
  32. this.currentYear = year;
  33. this.createMiddleContent();
  34. },
  35. createMiddleContent : function(){
  36. this.node.empty();
  37. this.middleContent = new Element("div.middleContent",{"styles":this.css.middleContent}).inject(this.node);
  38. this.viewNode = new Element("div.viewNode" ).inject(this.node);
  39. this.createNavi();
  40. },
  41. createNavi: function(){
  42. this.naviContent = new Element("div.naviContent",{"styles":this.css.naviContent}).inject(this.middleContent);
  43. this.naviRightContent = new Element("div.naviRightContent",{"styles":this.css.naviRightContent}).inject(this.middleContent);
  44. this.keyWorkNavi = new Element("div.naviNode",{
  45. "styles":this.css.naviNode,
  46. "text" : "按公司工作重点"
  47. }).inject(this.naviContent).addEvent("click", function() {
  48. this.departmentNavi.setStyles( this.css.naviNode );
  49. this.keyWorkNavi.setStyles( this.css.naviNode_current );
  50. this.toKeyWorkView();
  51. }.bind(this));
  52. this.departmentNavi = new Element("div.naviNode",{
  53. "styles":this.css.naviNode,
  54. "text" : "按责任部门"
  55. }).inject(this.naviContent).addEvent("click", function() {
  56. this.departmentNavi.setStyles( this.css.naviNode_current );
  57. this.keyWorkNavi.setStyles( this.css.naviNode );
  58. this.toDepartmentView();
  59. }.bind(this));
  60. this.keyWorkNavi.click();
  61. },
  62. toDepartmentView : function(){
  63. if(this.view)this.view.destroy();
  64. this.view = new MWF.xApplication.Report.MindView.DepartmentView(this.naviRightContent, this.viewNode, this);
  65. this.view.load();
  66. },
  67. toKeyWorkView : function(){
  68. if(this.view)this.view.destroy();
  69. this.view = new MWF.xApplication.Report.MindView.KeyWorkView(this.naviRightContent, this.viewNode, this);
  70. this.view.load();
  71. },
  72. destroy : function(){
  73. if(this.view){
  74. this.view.destroy();
  75. }
  76. this.node.empty();
  77. }
  78. });
  79. MWF.xApplication.Report.MindView.DepartmentView = new Class({
  80. initialize: function (actionNode, viewNode, explorer) {
  81. this.explorer = explorer;
  82. this.app = explorer.app;
  83. this.lp = explorer.lp;
  84. this.css = explorer.css;
  85. this.actions = explorer.actions;
  86. this.actionNode = actionNode;
  87. this.viewNode = viewNode;
  88. },
  89. load: function () {
  90. this.resizeContentFun = this.resizeContent.bind(this);
  91. this.createYearContent(
  92. this.resizeContentFun
  93. );
  94. this.app.addEvent("resize", this.resizeContentFun);
  95. },
  96. createYearContent:function(callback){
  97. this.yearContentList = new Element("div.yearContentList",{"styles":this.css.yearContentList}).inject(this.actionNode);
  98. this.app.strategyActions.listYearHasMeasure(function(json){
  99. if(json.type=="success"){
  100. if(json.data && json.data.valueList){
  101. this.yearList = json.data.valueList;
  102. this.yearList.each(function(d,i){
  103. if(i<3){
  104. new Element("div.year",{
  105. "styles":this.css.year,
  106. "value":d,
  107. "name":d,
  108. "text":d
  109. }).inject(this.yearContentList).
  110. addEvents({
  111. "click":function(){
  112. this.changeYearSelected(d);
  113. this.openList(d)
  114. }.bind(this)
  115. })
  116. }
  117. }.bind(this));
  118. if(this.yearList.length>3){
  119. new Element("div.yearMore",{"styles":this.css.year,"id":"yearMore"}).inject(this.yearContentList).
  120. setStyles({"width":"30px"}).set({"text":"..."}).
  121. addEvents({
  122. "click":function(){
  123. this.expandYears()
  124. }.bind(this)
  125. })
  126. }
  127. if(this.currentYear){
  128. if(this.yearContentList.getElements("div[name='"+this.currentYear+"']").length>0){
  129. this.yearContentList.getElements("div[name='"+this.currentYear+"']")[0].click();
  130. }
  131. }else{
  132. if(this.yearContentList.getElements("div").length>0){
  133. this.yearContentList.getElements("div")[0].click();
  134. }
  135. }
  136. if(callback)callback()
  137. }
  138. }
  139. }.bind(this));
  140. },
  141. expandYears:function(){
  142. this.yearContentList.getElementById("yearMore").destroy();
  143. this.yearList.each(function(d,i){
  144. if(i>2){
  145. new Element("div.year",{
  146. "styles":this.css.year,
  147. "value":d,
  148. "name":d,
  149. "text":d
  150. }).inject(this.yearContentList).
  151. addEvents({
  152. "click":function(){
  153. this.changeYearSelected(d);
  154. this.openList(d)
  155. }.bind(this)
  156. })
  157. }
  158. }.bind(this));
  159. this.expend();
  160. this.yearContentList.addEvents({
  161. mouseenter : function(){
  162. this.expend();
  163. }.bind(this),
  164. mouseleave: function(){
  165. this.collapse();
  166. }.bind(this)
  167. })
  168. },
  169. expend: function(){
  170. this.actionNode.setStyles({
  171. "position" : "relative"
  172. });
  173. this.yearContentList.setStyles({
  174. "padding-bottom" : "15px",
  175. "height" : this.yearContentList.getScrollSize().y + "px",
  176. "position" : "absolute",
  177. "top" : "0px",
  178. "left" : "0px",
  179. "box-shadow": "0 0 8px 0 rgba(0,0,0,0.25)",
  180. "overflow" : "visible"
  181. });
  182. },
  183. collapse: function(){
  184. this.actionNode.setStyles({
  185. "position" : "static"
  186. //"overflow" : "hidden"
  187. });
  188. this.yearContentList.setStyles({
  189. "padding-bottom" : "0px",
  190. "height" : "60px",
  191. "position" : "static",
  192. "box-shadow": "none",
  193. "overflow" : "hidden"
  194. });
  195. },
  196. openList:function(v){
  197. this.currentYear = v;
  198. this.createViewContent();
  199. this.resizeContent();
  200. },
  201. changeYearSelected:function(str){
  202. this.yearContentList.getElements("div").each(function(d){
  203. if(d.get("text") == str){
  204. d.setStyles({"background-color":"#4990E2","color":"#FFFFFF"})
  205. }else{
  206. d.setStyles({"background-color":"","color":"#666666"})
  207. }
  208. }.bind(this))
  209. },
  210. //视图
  211. createViewContent:function(searchObj){
  212. var _self = this;
  213. if( this.view )this.view.destroy();
  214. if(this.viewContent)this.viewContent.destroy();
  215. this.viewContent = new Element("div.viewContent",{"styles":this.css.viewContent}).inject(this.viewNode);
  216. this.viewContentList = new Element("div.departmentContentList",{"styles":this.css.departmentContentList}).inject(this.viewContent);
  217. this.app.strategyActions.listMeasureDepartmentByYear( this.currentYear, function( json ){
  218. if( json.data && json.data.valueList ){
  219. json.data.valueList.each( function( v ){
  220. var div = new Element("div", {
  221. text : v.split("@")[0],
  222. styles : this.css.departmentNode
  223. }).inject( this.viewContentList );
  224. div.addEvents({
  225. mouseover : function(){
  226. this.node.setStyles(_self.css.departmentNode_over)
  227. }.bind({ node : div }),
  228. mouseout : function(){
  229. this.node.setStyles(_self.css.departmentNode )
  230. }.bind({ node : div }),
  231. click : function(){
  232. _self.openMind( this.department );
  233. }.bind({ department : v })
  234. })
  235. }.bind(this))
  236. }
  237. }.bind(this));
  238. this.resizeContent();
  239. },
  240. openMind: function( department ){
  241. var appId = "ReportMinder"+department;
  242. if (this.app.desktop.apps[appId]){
  243. this.app.desktop.apps[appId].setCurrent();
  244. }else {
  245. this.app.desktop.openApplication(null, "ReportMinder", {
  246. "mindType" : "department",
  247. "department" : department,
  248. "year" : this.currentYear,
  249. "appId": appId
  250. });
  251. }
  252. },
  253. resizeContent : function(){
  254. var size = this.explorer.node.getSize();
  255. if(this.yearContentList.getElements("div").length>0){
  256. this.yearContentList.setStyles({
  257. "width" : (size.x - 260 )+"px"
  258. });
  259. if( !this.app.inContainer ){
  260. this.viewContent.setStyles({
  261. "height":(size.y-this.actionNode.getHeight() - 50 )+"px"
  262. });
  263. this.viewContentList.setStyles({
  264. "height":(this.viewContent.getHeight()-20)+"px",
  265. "width":(this.viewContent.getWidth-40)+"px"
  266. });
  267. }
  268. }
  269. },
  270. destroy: function(){
  271. this.app.removeEvent("resize", this.resizeContentFun );
  272. this.actionNode.empty();
  273. this.viewNode.empty();
  274. }
  275. });
  276. MWF.xApplication.Report.MindView.KeyWorkView = new Class({
  277. initialize: function (actionNode, viewNode, explorer) {
  278. this.explorer = explorer;
  279. this.app = explorer.app;
  280. this.lp = explorer.lp;
  281. this.css = explorer.css;
  282. this.actions = explorer.actions;
  283. this.actionNode = actionNode;
  284. this.viewNode = viewNode;
  285. },
  286. load: function () {
  287. this.resizeContentFun = this.resizeContent.bind(this);
  288. this.createYearContent(
  289. this.resizeContentFun
  290. );
  291. this.app.addEvent("resize", this.resizeContentFun );
  292. },
  293. createYearContent:function(callback){
  294. this.yearContentList = new Element("div.yearContentList",{"styles":this.css.yearContentList}).inject(this.actionNode);
  295. this.app.strategyActions.getKeyWorkListYear(function(json){
  296. if(json.type=="success"){
  297. if(json.data && json.data.valueList){
  298. this.yearList = json.data.valueList;
  299. this.yearList.each(function(d,i){
  300. if(i<3){
  301. new Element("div.year",{
  302. "styles":this.css.year,
  303. "value":d,
  304. "name":d,
  305. "text":d
  306. }).inject(this.yearContentList).
  307. addEvents({
  308. "click":function(){
  309. this.changeYearSelected(d);
  310. this.openList(d)
  311. }.bind(this)
  312. })
  313. }
  314. }.bind(this));
  315. if(this.yearList.length>3){
  316. new Element("div.yearMore",{"styles":this.css.year,"id":"yearMore"}).inject(this.yearContentList).
  317. setStyles({"width":"30px"}).set({"text":"..."}).
  318. addEvents({
  319. "click":function(){
  320. this.expandYears()
  321. }.bind(this)
  322. })
  323. }
  324. if(this.currentYear){
  325. if(this.yearContentList.getElements("div[name='"+this.currentYear+"']").length>0){
  326. this.yearContentList.getElements("div[name='"+this.currentYear+"']")[0].click();
  327. }
  328. }else{
  329. if(this.yearContentList.getElements("div").length>0){
  330. this.yearContentList.getElements("div")[0].click();
  331. }
  332. }
  333. if(callback)callback()
  334. }
  335. }
  336. }.bind(this));
  337. },
  338. expandYears:function(){
  339. this.yearContentList.getElementById("yearMore").destroy();
  340. this.yearList.each(function(d,i){
  341. if(i>2){
  342. new Element("div.year",{
  343. "styles":this.css.year,
  344. "value":d,
  345. "name":d,
  346. "text":d
  347. }).inject(this.yearContentList).
  348. addEvents({
  349. "click":function(){
  350. this.changeYearSelected(d);
  351. this.openList(d)
  352. }.bind(this)
  353. })
  354. }
  355. }.bind(this));
  356. this.expend();
  357. this.yearContentList.addEvents({
  358. mouseenter : function(){
  359. this.expend();
  360. }.bind(this),
  361. mouseleave: function(){
  362. this.collapse();
  363. }.bind(this)
  364. })
  365. },
  366. expend: function(){
  367. this.actionNode.setStyles({
  368. "position" : "relative"
  369. });
  370. this.yearContentList.setStyles({
  371. "padding-bottom" : "15px",
  372. "height" : this.yearContentList.getScrollSize().y + "px",
  373. "position" : "absolute",
  374. "top" : "0px",
  375. "left" : "0px",
  376. "box-shadow": "0 0 8px 0 rgba(0,0,0,0.25)",
  377. "overflow" : "visible"
  378. });
  379. },
  380. collapse: function(){
  381. this.actionNode.setStyles({
  382. "position" : "static"
  383. //"overflow" : "hidden"
  384. });
  385. this.yearContentList.setStyles({
  386. "padding-bottom" : "0px",
  387. "height" : "60px",
  388. "position" : "static",
  389. "box-shadow": "none",
  390. "overflow" : "hidden"
  391. });
  392. },
  393. openList:function(v){
  394. this.currentYear = v;
  395. this.createSearch();
  396. this.createViewContent();
  397. this.resizeContent();
  398. },
  399. changeYearSelected:function(str){
  400. this.yearContentList.getElements("div").each(function(d){
  401. if(d.get("text") == str){
  402. d.setStyles({"background-color":"#4990E2","color":"#FFFFFF"})
  403. }else{
  404. d.setStyles({"background-color":"","color":"#666666"})
  405. }
  406. }.bind(this))
  407. },
  408. createSearch:function(){
  409. if(this.searchContent) this.searchContent.destroy();
  410. this.searchContent = new Element("div.searchContent",{"styles":this.css.searchContent}).inject(this.actionNode);
  411. this.searchBar = new Element("div.searchBar",{"styles":this.css.searchBar}).inject(this.searchContent);
  412. this.searchIn = new Element("input.searchIn",{
  413. "styles":this.css.searchIn,
  414. "placeholder":this.lp.defaultSearchIn
  415. }).inject(this.searchBar).
  416. addEvents({
  417. "keydown":function(e){
  418. if(this.searchIn.get("value")!="" && e.event.keyCode=="13"){
  419. this.searchReset.setStyles({"display":""});
  420. this.createViewContent({"strategydeploytitle":this.searchIn.get("value")});
  421. }
  422. }.bind(this)
  423. });
  424. this.searchImg = new Element("div.searchImg",{"styles":this.css.searchImg}).inject(this.searchBar);
  425. this.searchImg.addEvents({
  426. "click":function(){
  427. if(this.searchIn.get("value")!=""){
  428. this.searchReset.setStyles({"display":""});
  429. this.createViewContent({"strategydeploytitle":this.searchIn.get("value")})
  430. }
  431. }.bind(this)
  432. });
  433. this.searchReset = new Element("div.searchReset",{"styles":this.css.searchReset}).inject(this.searchBar).
  434. addEvents({
  435. "click":function(){
  436. this.searchIn.set("value","");
  437. this.searchReset.setStyles({"display":"none"});
  438. this.createViewContent();
  439. }.bind(this)
  440. });
  441. this.searchDeptBar = new Element("div.searchDeptBar",{"styles":this.css.searchDeptBar}).inject(this.searchContent);
  442. //this.searchDeptLabel = new Element("div.searchDeptBar",{
  443. // "styles":this.css.searchDeptLabel,
  444. // "text":this.lp.deptList
  445. //}).inject(this.searchDeptBar);
  446. //部门列表
  447. this.searchDeptList = new Element("div.searchDeptList",{"styles":this.css.searchDeptList}).inject(this.searchDeptBar);
  448. var selector = new MWF.xApplication.Report.MindView.DepartmentSelect(this.searchDeptList, {
  449. "currentYear" : this.currentYear,
  450. "onSelectItem" : function( itemNode, itemData ){
  451. this.createViewContent( itemData.value ? { "deptlist":[itemData.value]} : {})
  452. }.bind(this)
  453. } , this.app );
  454. selector.load();
  455. },
  456. //视图
  457. createViewContent:function(searchObj){
  458. if( this.view )this.view.destroy();
  459. if(this.viewContent)this.viewContent.destroy();
  460. this.viewContent = new Element("div.viewContent",{"styles":this.css.viewContent}).inject(this.viewNode);
  461. this.viewContentList = new Element("div.viewContentList",{"styles":this.css.viewContentList}).inject(this.viewContent);
  462. this.filter = {
  463. "strategydeployyear":this.currentYear,
  464. "ordersymbol":"ASC"
  465. };
  466. for(var item in searchObj){
  467. if(searchObj[item]!=this.app.lp.defaultSelect){
  468. this.filter[item] = searchObj[item];
  469. }
  470. }
  471. var templateUrl = this.explorer.path + "KeyWork.json";
  472. this.view = new MWF.xApplication.Report.MindView.View(this.viewContentList, this.app,
  473. {lp : this.lp.view, css : this.css, actions : this.actions},
  474. { templateUrl : templateUrl, filterData:this.filter, year : this.currentYear }
  475. );
  476. this.view.load();
  477. this.resizeContent();
  478. //this.viewContentList.getElementById("tabList").getElementsByTagName("tr").
  479. // addEvents({
  480. // "move":function(e){
  481. // alert(1)
  482. // }.bind(this)
  483. // })
  484. },
  485. resizeContent : function(){
  486. var size = this.explorer.node.getSize();
  487. if(this.yearContentList.getElements("div").length>0){
  488. var searchContentSize = this.searchContent.getSize();
  489. //var viewContentSize = this.viewContent.getSize();
  490. //this.searchBar.setStyles({"width":(searchContentSize.x - this.searchDeptBar.getWidth()-100)+"px"});
  491. this.yearContentList.setStyles({
  492. "width" : (size.x - 570 - 260 )+"px"
  493. });
  494. if( !this.app.inContainer ){
  495. this.viewContent.setStyles({
  496. "height":(size.y-this.actionNode.getHeight() - 50 )+"px"
  497. });
  498. this.viewContentList.setStyles({
  499. "height":(this.viewContent.getHeight()-20)+"px",
  500. "width":(this.viewContent.getWidth-40)+"px"
  501. });
  502. }
  503. }
  504. },
  505. destroy: function(){
  506. if( this.view ){
  507. this.view.destroy()
  508. }
  509. this.app.removeEvent("resize", this.resizeContentFun );
  510. this.actionNode.empty();
  511. this.viewNode.empty();
  512. }
  513. });
  514. MWF.xApplication.Report.MindView.View = new Class({
  515. Extends: MWF.xApplication.Template.Explorer.ComplexView,
  516. Implements: [Options, Events],
  517. options : {
  518. "scrollEnable" : true,
  519. "scrollType" : "window"
  520. },
  521. _createDocument: function(data){
  522. return new MWF.xApplication.Report.MindView.Document(this.viewNode, data, this.explorer, this);
  523. },
  524. _getCurrentPageData: function(callback, count){
  525. //var category = this.options.category;
  526. if (!count)count = 100;
  527. var id = (this.items.length) ? this.items[this.items.length - 1].data.id : "(0)";
  528. //if(id=="(0)")this.app.createShade();
  529. var filter = this.options.filterData || {};
  530. //filter.maxCharacterNumber = "-1";
  531. this.app.strategyActions.getKeyWorkListNext(id,count,filter,function(json){
  532. if (callback)callback(json);
  533. //this.app.destroyShade();
  534. }.bind(this));
  535. },
  536. _removeDocument: function(documentData){
  537. },
  538. _create: function(){
  539. },
  540. _openDocument: function( documentData ){
  541. var appId = "ReportMinder"+documentData.id;
  542. if (this.app.desktop.apps[appId]){
  543. this.app.desktop.apps[appId].setCurrent();
  544. }else {
  545. this.app.desktop.openApplication(null, "ReportMinder", {
  546. "id" : documentData.id,
  547. "year" : this.options.year,
  548. "appId": appId
  549. });
  550. }
  551. },
  552. _queryCreateViewNode: function(){
  553. },
  554. _postCreateViewNode: function( ){
  555. },
  556. _queryCreateViewHead:function(){
  557. },
  558. _postCreateViewHead: function( headNode ){
  559. },
  560. destroyScroll: function(){
  561. if( this.scrollContainerFun ){
  562. var scrollNode = this.app.scrollNode ? this.app.scrollNode : this.container;
  563. scrollNode.removeEvent("scroll", this.scrollContainerFun );
  564. this.scrollContainerFun = null;
  565. }
  566. },
  567. setScroll: function(){
  568. var scrollNode = this.app.scrollNode ? this.app.scrollNode : this.container;
  569. scrollNode.setStyle("overflow","auto");
  570. this.scrollContainerFun = function(){
  571. if( !this.options.pagingEnable ){
  572. var scrollSize = scrollNode.getScrollSize();
  573. var clientSize = scrollNode.getSize();
  574. var scrollHeight = scrollSize.y - clientSize.y;
  575. if (scrollNode.scrollTop + 150 > scrollHeight ) {
  576. if (! this.isItemsLoaded) this.loadElementList();
  577. }
  578. }
  579. }.bind(this);
  580. scrollNode.addEvent("scroll", this.scrollContainerFun )
  581. }
  582. });
  583. MWF.xApplication.Report.MindView.Document = new Class({
  584. Extends: MWF.xApplication.Template.Explorer.ComplexDocument,
  585. _postCreateDocumentNode: function( itemNode, itemData ){
  586. }
  587. });
  588. MWF.xApplication.Report.MindView.DepartmentSelect = new Class({
  589. Extends: MSelector,
  590. options : {
  591. "style": "default",
  592. "width": "230px",
  593. "height": "30px",
  594. "defaultOptionLp" : "请选择部门列表",
  595. "textField" : "text",
  596. "valueField" : "value",
  597. "currentYear" : ""
  598. },
  599. _selectItem : function( itemNode, itemData ){
  600. },
  601. _loadData : function( callback ){
  602. this.app.strategyActions.getKeyWorkDepartmentByYear(this.options.currentYear,function(json){
  603. if(json.type=="success" && json.data.valueList){
  604. var arr = [];
  605. json.data.valueList.each( function(v){
  606. arr.push({
  607. text : v.split("@")[0],
  608. value : v
  609. })
  610. });
  611. if(callback)callback( arr );
  612. }
  613. }.bind(this));
  614. }
  615. });