Log.js 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074
  1. MWF.xDesktop.requireApp("process.Xform", "$Module", null, false);
  2. MWF.xApplication.process.Xform.Log = MWF.APPLog = new Class({
  3. Extends: MWF.APP$Module,
  4. _loadUserInterface: function(){
  5. this.node.empty();
  6. this.node.setStyle("-webkit-user-select", "text");
  7. if (this.form.businessData){
  8. if (this.form.businessData.workLogList){
  9. this.workLog = this.form.businessData.workLogList;
  10. this.loadWorkLog();
  11. }
  12. }
  13. },
  14. loadWorkLog: function(){
  15. if( !this.json.category || this.json.category === "none" ){
  16. if (this.json.mode==="table"){
  17. this.loadWorkLogTable();
  18. }else if (this.json.mode==="text"){
  19. this.loadWorkLogText();
  20. }else if (this.json.mode==="media"){
  21. this.loadWorkLogMedia();
  22. }else{
  23. this.loadWorkLogDefault();
  24. }
  25. }else{
  26. this.loadCategoryList();
  27. if( !this.categoryList.length )return;
  28. this.expandCount = 0;
  29. if( this.json.expand && this.json.expand === "enable" ){
  30. this.expandCount = parseInt( this.json.expandCount );
  31. }
  32. this.table = new Element("table", this.json.tableProperties).inject( this.node );
  33. this.categoryList.each( function( key, idx ){
  34. var list = this.categoryJson[key];
  35. if( list && list.length ){
  36. var tr = new Element("tr").inject( this.table );
  37. if( this.expandCount && (idx + 1) > this.expandCount ){
  38. tr.setStyle("display","none");
  39. }
  40. var text = key;
  41. if( this.json.category === "unit" ){
  42. text = key.split("@")[0];
  43. }
  44. new Element("td", {
  45. styles : this.json.titleTdStyles,
  46. text : text + MWF.xApplication.process.Xform.LP.idea
  47. }).inject( tr );
  48. var td = new Element("td", {
  49. styles : this.json.contentTdStyles
  50. }).inject( tr );
  51. var div = new Element("div",{
  52. styles : this.json.contentDivStyles || {}
  53. }).inject( td );
  54. if (this.json.mode==="table"){
  55. this.loadWorkLogTable( list, div );
  56. }else if (this.json.mode==="text"){
  57. this.loadWorkLogText( list, div );
  58. }else if (this.json.mode==="media"){
  59. this.loadWorkLogMedia( list, div );
  60. }else{
  61. this.loadWorkLogDefault( list, div );
  62. }
  63. this._loadTableStyles();
  64. }
  65. }.bind(this));
  66. if( this.categoryList.length > this.expandCount ){
  67. this.loadExpandCollapseNode();
  68. }
  69. }
  70. },
  71. loadCategoryList : function( ){
  72. var category;
  73. if( this.json.category === "activity" ){
  74. category = "fromActivityName";
  75. this._loadCategoryList( category );
  76. }else if( this.json.category === "unit" ){
  77. category = "unit";
  78. this._loadCategoryLitBySubData( category );
  79. }else if( this.json.category === "activityGroup" ){
  80. category = "fromOpinionGroup";
  81. this._loadCategoryList( category );
  82. }else{
  83. category = this.json.category;
  84. this._loadCategoryList( category );
  85. }
  86. },
  87. isNumber : function( d ){
  88. return parseFloat(d).toString() !== "NaN"
  89. },
  90. _loadCategoryList : function( category ){
  91. this.categoryList = [];
  92. this.categoryJson = {};
  93. if( category === "fromOpinionGroup" ){
  94. this.workLog.sort( function( a, b ){
  95. if( a.fromOpinionGroup && b.fromOpinionGroup ) {
  96. var array1 = a.fromOpinionGroup.split("#");
  97. var array2 = b.fromOpinionGroup.split("#");
  98. for (var i = 0; i < array1.length; i++) {
  99. var value1 = array1[i];
  100. var value2 = array2[i];
  101. if (this.isNumber(value1) && this.isNumber(value2)) {
  102. if (parseFloat(value1) !== parseFloat(value2)) {
  103. return parseFloat(value1) - parseFloat(value2);
  104. }
  105. } else if (!this.isNumber(value1) && !this.isNumber(value2)) {
  106. return Date.parse(a.fromTime) - Date.parse(b.fromTime);
  107. } else {
  108. return this.isNumber(value1) ? -1 : 1;
  109. }
  110. }
  111. return Date.parse(a.fromTime) - Date.parse(b.fromTime);
  112. }else if( a.fromOpinionGroup || b.fromOpinionGroup ){
  113. return a.fromOpinionGroup ? -1 : 1;
  114. }else{
  115. return Date.parse(a.fromTime) - Date.parse(b.fromTime);
  116. }
  117. }.bind(this))
  118. }
  119. this.workLog.each( function(log, idx){
  120. var key;
  121. if( this.json.category === "activityGroup" ){
  122. if( log.fromOpinionGroup ){
  123. var arr = log.fromOpinionGroup.split("#");
  124. key = arr[arr.length-1]
  125. }else{
  126. key = log.fromActivityName;
  127. }
  128. }else{
  129. key = log[category];
  130. }
  131. if( key && this.checkShow(log)){
  132. var flag = false;
  133. for( var i=0; i< log.taskCompletedList.length; i++ ){
  134. var taskCompleted = log.taskCompletedList[i];
  135. flag = this.checkListShow(log, taskCompleted);
  136. if( flag )break;
  137. }
  138. if (!flag && this.json.isTask){
  139. for( var i=0; i< this.json.isTask.length; i++ ){
  140. var task = log.taskList[i];
  141. flag = this.checkListShow(log, task);
  142. if( flag )break;
  143. }
  144. }
  145. if(flag){
  146. if( this.categoryList.indexOf( key ) === -1 ){
  147. this.categoryList.push( key );
  148. }
  149. if( !this.categoryJson[key] )this.categoryJson[key] = [];
  150. this.categoryJson[key].push( log );
  151. }
  152. }
  153. }.bind(this))
  154. },
  155. _loadCategoryLitBySubData : function( category ){
  156. this.categoryList = [];
  157. this.categoryJson = {};
  158. this.workLog.each( function(log, idx){
  159. var key = log[category];
  160. if( this.checkShow(log) ){
  161. var flag = false;
  162. for( var i=0; i< log.taskCompletedList.length; i++ ){
  163. var taskCompleted = log.taskCompletedList[i];
  164. flag = this.checkListShow(log, taskCompleted);
  165. if( flag )break;
  166. }
  167. if (!flag && this.json.isTask){
  168. for( var i=0; i< this.json.isTask.length; i++ ){
  169. var task = log.taskList[i];
  170. flag = this.checkListShow(log, task);
  171. if( flag )break;
  172. }
  173. }
  174. if(flag){
  175. var log_copy = Object.clone(log);
  176. log_copy.taskCompletedList = [];
  177. log_copy.taskList = [];
  178. log_copy.readCompletedList = [];
  179. log_copy.readList = [];
  180. var sub_categoryList = [];
  181. var sub_categoryJson = {};
  182. for( var i=0; i< log.taskCompletedList.length; i++ ){
  183. var d = log.taskCompletedList[i];
  184. var key = d[category];
  185. if( key ){
  186. if( sub_categoryList.indexOf( key ) === -1 ){
  187. sub_categoryList.push( key );
  188. }
  189. if( !sub_categoryJson[key] )sub_categoryJson[key] = Object.clone(log_copy);
  190. sub_categoryJson[key].taskCompletedList.push( d );
  191. }
  192. }
  193. for( var i=0; i< log.taskList.length; i++ ){
  194. var d = log.taskList[i];
  195. var key = d[category];
  196. if( key ){
  197. if( sub_categoryList.indexOf( key ) === -1 ){
  198. sub_categoryList.push( key );
  199. }
  200. if( !sub_categoryJson[key] )sub_categoryJson[key] = Object.clone(log_copy);
  201. sub_categoryJson[key].taskList.push( d );
  202. }
  203. }
  204. for( var i=0; i< log.readCompletedList.length; i++ ){
  205. var d = log.readCompletedList[i];
  206. var key = d[category];
  207. if( key ){
  208. if( sub_categoryList.indexOf( key ) === -1 ){
  209. sub_categoryList.push( key );
  210. }
  211. if( !sub_categoryJson[key] )sub_categoryJson[key] = Object.clone(log_copy);
  212. sub_categoryJson[key].readCompletedList.push( d );
  213. }
  214. }
  215. for( var i=0; i< log.readList.length; i++ ){
  216. var d = log.readList[i];
  217. var key = d[category];
  218. if( key ){
  219. if( sub_categoryList.indexOf( key ) === -1 ){
  220. sub_categoryList.push( key );
  221. }
  222. if( !sub_categoryJson[key] )sub_categoryJson[key] = Object.clone(log_copy);
  223. sub_categoryJson[key].readList.push( d );
  224. }
  225. }
  226. sub_categoryList.each( function(key){
  227. if( this.categoryList.indexOf( key ) === -1 ){
  228. this.categoryList.push( key );
  229. }
  230. }.bind(this));
  231. for( var key in sub_categoryJson ){
  232. if( !this.categoryJson[key] )this.categoryJson[key] = [];
  233. this.categoryJson[key].push( sub_categoryJson[key] );
  234. }
  235. }
  236. }
  237. }.bind(this))
  238. },
  239. _loadTableBorderStyle: function(){
  240. if (this.json.tableStyles.border){
  241. this.table.set("cellspacing", "0");
  242. this.table.setStyles({
  243. "border-top": this.json.tableStyles.border,
  244. "border-left": this.json.tableStyles.border
  245. });
  246. var ths = this.table.getElements("th");
  247. if( ths && ths.length ){
  248. ths.setStyles({
  249. "border-bottom": this.json.tableStyles.border,
  250. "border-right": this.json.tableStyles.border
  251. });
  252. }
  253. var tds = this.table.getElements("td");
  254. if( tds && tds.length ) {
  255. tds.setStyles({
  256. "border-bottom": this.json.tableStyles.border,
  257. "border-right": this.json.tableStyles.border
  258. });
  259. }
  260. }
  261. },
  262. _loadTableStyles: function(){
  263. Object.each(this.json.tableStyles, function(value, key){
  264. var reg = /^border\w*/ig;
  265. if (!key.test(reg)){
  266. this.table.setStyle(key, value);
  267. }
  268. }.bind(this));
  269. this._loadTableBorderStyle();
  270. },
  271. loadExpandCollapseNode : function(){
  272. if( this.json.expand && this.json.expand === "enable" ){
  273. if( this.json.expandHTML ){
  274. this.expandNode = new Element("div",{
  275. "html" : this.json.expandHTML
  276. }).inject( this.node, "bottom" );
  277. this.expandNode.addEvent("click", function(){
  278. if( !this.json.category || this.json.category === "none" ){
  279. }else{
  280. this.table.getElements("tr").setStyle("display","");
  281. this.expandNode.setStyle("display","none");
  282. this.collapseNode.setStyle("display","");
  283. }
  284. }.bind(this))
  285. }
  286. if( this.json.collapseHTML ){
  287. this.collapseNode = new Element("div",{
  288. "html" : this.json.collapseHTML,
  289. "styles" : { "display" : "none" }
  290. }).inject( this.node, "bottom" );
  291. this.collapseNode.addEvent("click", function(){
  292. if( !this.json.category || this.json.category === "none" ){
  293. }else{
  294. var trs = this.table.getElements("tr");
  295. for( var i=0; i<trs.length; i++ ){
  296. if( i >= this.expandCount ){
  297. trs[i].setStyle("display","none");
  298. }
  299. }
  300. this.expandNode.setStyle("display","");
  301. this.collapseNode.setStyle("display","none");
  302. }
  303. }.bind(this))
  304. }
  305. }
  306. },
  307. loadWorkLogMedia: function(list, container){
  308. if( list ){
  309. list.each(function(log, idx){
  310. this.loadWorkLogLine_media(log, idx, container);
  311. }.bind(this));
  312. }else{
  313. this.workLog.each(function(log, idx){
  314. if (this.checkShow(log)) this.loadWorkLogLine_media(log, idx, container);
  315. }.bind(this));
  316. }
  317. },
  318. loadWorkLogLine_media: function(log, idx, container){
  319. if (log.taskCompletedList.length){
  320. log.taskCompletedList.each(function(taskCompleted){
  321. if (this.checkListShow(log, taskCompleted)) this.loadTaskLine_media(taskCompleted, log, container);
  322. }.bind(this));
  323. }
  324. },
  325. loadTaskLine_media: function(task, log, container){
  326. if (task.mediaOpinion){
  327. var mediaIds = task.mediaOpinion.split(",");
  328. var atts = [];
  329. if (this.form.businessData.attachmentList){
  330. this.form.businessData.attachmentList.each(function(att){
  331. if (att.site==="$mediaOpinion"){
  332. if (mediaIds.indexOf(att.id)!==-1) atts.push(att);
  333. }
  334. }.bind(this));
  335. }
  336. if (atts.length) this.loadMediaOpinion_show(atts, task, container);
  337. }
  338. },
  339. loadMediaOpinion_show: function(atts, task, container){
  340. atts.each(function(att){
  341. //if (!att.contentType) att.contentType = "image";
  342. if (att.type){
  343. if (att.type.indexOf("image")!==-1){
  344. this.loadMediaOpinion_image_show(att, task, container);
  345. }else if(att.type.indexOf("video")!==-1){
  346. this.loadMediaOpinion_video_show(att, task, container);
  347. }else if(att.type.indexOf("audio")!==-1){
  348. this.loadMediaOpinion_voice_show(att, task, container);
  349. }else{
  350. this.loadMediaOpinion_voice_show(att, task, container);
  351. }
  352. }
  353. }.bind(this));
  354. },
  355. loadMediaOpinion_image_show: function(att, task, container){
  356. var url = this.getMediaOpinionUrl(att);
  357. var node = new Element("div", {"styles": {"overflow": "hidden"}}).inject( container || this.node);
  358. var textNode = new Element("div", {
  359. "styles": {
  360. "line-height": "28px",
  361. "height": "28px"
  362. },
  363. "text": task.person.substring(0, task.person.indexOf("@"))+"("+task.completedTime+")"
  364. }).inject(node);
  365. //var img = new Element("img", {"src": url, "styles": {"background-color": "#ffffff"}}).inject(node);
  366. //
  367. //var height = 200;
  368. //var width = 300;
  369. //if (layout.mobile){
  370. // var size = img.getSize();
  371. // width = 200;
  372. // height = 200*(size.y/size.x);
  373. //}
  374. //img.setStyles({"width": ""+width+"px", "height": ""+height+"px"});
  375. var imgNode = new Element("div").inject(node);
  376. var width;
  377. if (layout.mobile){
  378. width = 200;
  379. }else{
  380. var pNode = node.getParent();
  381. var offset = imgNode.getPosition( pNode );
  382. //width = Math.min( pNode.getSize().x - offset.x - 2, 800 );
  383. width = pNode.getSize().x - offset.x - 42;
  384. }
  385. var img = new Element("img", {
  386. "src": url,
  387. "styles" : { width : width+"px" }, //最开始限定一下宽度,不要让页面抖动
  388. "events" : {
  389. load : function(ev){
  390. var nh=ev.target.naturalHeight;
  391. var nw = ev.target.naturalWidth;
  392. if( !layout.mobile && ( this.isNumber( this.json.handwritingWidth ) || this.isNumber( this.json.handwritingHeight ) ) ){
  393. var size = this.getImageSize( nw, nh );
  394. img.setStyles(size);
  395. imgNode.setStyles(size);
  396. }else{
  397. var x = Math.min(nw, width);
  398. img.setStyles({"width": ""+ x +"px"}); //最终的宽度
  399. imgNode.setStyles({"width": ""+ x +"px"});
  400. }
  401. }.bind(this)
  402. }
  403. }).inject(imgNode);
  404. // var size = img.getSize();
  405. // var x_y = size.x/size.y;
  406. // if (size.y>260){
  407. // var y = 260;
  408. // var x = 260*x_y;
  409. // img.setStyles({"width": ""+x+"px", "height": ""+y+"px"})
  410. // }
  411. },
  412. isNumber : function( d ){
  413. return parseFloat(d).toString() !== "NaN"
  414. },
  415. getImageSize : function(naturalWidth, naturalHeight ){
  416. var ww = this.json.handwritingWidth;
  417. var wh = this.json.handwritingHeight;
  418. if( this.isNumber(ww) && !this.isNumber(wh) ){
  419. return {
  420. width : Math.min( naturalWidth, parseInt( ww ) ) + "px",
  421. height : "auto"
  422. }
  423. }else if( !this.isNumber(ww) && this.isNumber(wh) ){
  424. return {
  425. width : "auto",
  426. height : Math.min( naturalHeight, parseInt( wh ) ) + "px"
  427. }
  428. }else if( this.isNumber(ww) && this.isNumber(wh) ){
  429. var flag = ( naturalWidth / parseInt(ww) ) > ( naturalHeight / parseInt(wh) );
  430. if( flag ){
  431. return {
  432. width : Math.min( naturalWidth, parseInt( ww ) ) + "px",
  433. height : "auto"
  434. }
  435. }else{
  436. return {
  437. width : "auto",
  438. height : Math.min( naturalHeight, parseInt( wh ) ) + "px"
  439. }
  440. }
  441. }
  442. },
  443. loadMediaOpinion_video_show: function(att, task, container){
  444. },
  445. loadMediaOpinion_voice_show: function(att, task, container){
  446. //var node = new Element("audio").inject(this.node);
  447. var url = this.getMediaOpinionUrl(att);
  448. var div = new Element("div", {"styles": {"overflow": "hidden"}}).inject(container || this.node);
  449. var textNode = new Element("div", {
  450. "styles": {
  451. "line-height": "28px",
  452. "height": "28px"
  453. },
  454. "text": task.person.substring(0, task.person.indexOf("@"))+"("+task.completedTime+")"
  455. }).inject(div);
  456. var node = new Element("audio", {"loop": false, "controls": true}).inject(div);
  457. node.set("src", url);
  458. //this.audioNode.play();
  459. },
  460. loadWorkLogTable: function( list, container ){
  461. if( list ){
  462. list.each(function(log, idx){
  463. this.loadWorkLogLine_table(log, idx, container );
  464. }.bind(this));
  465. }else{
  466. this.workLog.each(function(log, idx){
  467. if (this.checkShow(log)) this.loadWorkLogLine_table(log, idx, container );
  468. }.bind(this));
  469. }
  470. },
  471. loadWorkLogLine_table: function(log, idx, container){
  472. if (!log.readList) log.readList = [];
  473. if (!log.readCompletedList) log.readCompletedList = [];
  474. if (log.taskCompletedList.length || log.readList.length || log.readCompletedList.length || (this.json.isTask && log.taskList.length)){
  475. var logActivityNode = new Element("div", {"styles": this.form.css.logActivityNode}).inject( container || this.node);
  476. var titleNode = new Element("div", {"styles": this.form.css.logActivityTitleNode}).inject(logActivityNode);
  477. var childNode = new Element("div", {"styles": this.form.css.logActivityChildNode}).inject(logActivityNode);
  478. var iconNode = new Element("div", {"styles": this.form.css.logActivityIconNode}).inject(titleNode);
  479. var fromAvtivityNode = new Element("div", {"styles": this.form.css.logActivityFromNode}).inject(titleNode);
  480. var arrowNode = new Element("div", {"styles": this.form.css.logActivityArrowNode}).inject(titleNode);
  481. var arrivedAvtivityNode = new Element("div", {"styles": this.form.css.logActivityArrivedNode}).inject(titleNode);
  482. var timeNode = new Element("div", {"styles": this.form.css.logActivityTimeNode}).inject(titleNode);
  483. if (log.connected){
  484. iconNode.setStyle("background-image", "url("+"/x_component_process_Xform/$Form/"+this.form.options.style+"/icon/ok14.png)");
  485. }else{
  486. iconNode.setStyle("background-image", "url("+"/x_component_process_Xform/$Form/"+this.form.options.style+"/icon/rightRed.png)");
  487. }
  488. fromAvtivityNode.set("html", "<b>"+log.fromActivityName+"</b>");
  489. if (log.arrivedActivityName){
  490. arrowNode.setStyle("background-image", "url("+"/x_component_process_Xform/$Form/"+this.form.options.style+"/icon/right.png)");
  491. arrivedAvtivityNode.set("html", "<b>"+log.arrivedActivityName+"</b>");
  492. timeNode.set("html", "<b>"+MWF.xApplication.process.Xform.LP.begin+": </b>"+log.fromTime+"<br/><b>"+MWF.xApplication.process.Xform.LP.end+": </b>"+log.arrivedTime)
  493. }else{
  494. timeNode.set("html", "<b>"+MWF.xApplication.process.Xform.LP.begin+": </b>"+log.fromTime)
  495. }
  496. if ((idx % 2)===0){
  497. logActivityNode.setStyles(this.form.css.logActivityNode_even);
  498. titleNode.setStyles(this.form.css.logActivityTitleNode_even);
  499. }
  500. var taskTable = new Element("table", {
  501. "styles": this.form.css.logTableTask,
  502. "border": "0",
  503. "cellSpacing": "0",
  504. "cellpadding": "3px",
  505. "width": "100%"
  506. }).inject(childNode);
  507. var tr = taskTable.insertRow(0).setStyles(this.form.css.logTableTaskTitleLine);
  508. var td = tr.insertCell(0).setStyles(this.form.css.logTableTaskTitle);
  509. td.set("text", MWF.xApplication.process.Xform.LP.person);
  510. td = tr.insertCell(1).setStyles(this.form.css.logTableTaskTitle);
  511. td.set("text", MWF.xApplication.process.Xform.LP.department);
  512. td = tr.insertCell(2).setStyles(this.form.css.logTableTaskTitle);
  513. td.set("text", MWF.xApplication.process.Xform.LP.startTime);
  514. td = tr.insertCell(3).setStyles(this.form.css.logTableTaskTitle);
  515. td.set("text", MWF.xApplication.process.Xform.LP.completedTime);
  516. td = tr.insertCell(4).setStyles(this.form.css.logTableTaskTitle);
  517. td.set("text", MWF.xApplication.process.Xform.LP.route);
  518. td = tr.insertCell(5).setStyles(this.form.css.logTableTaskTitle);
  519. td.set("text", MWF.xApplication.process.Xform.LP.opinion);
  520. log.taskCompletedList.each(function(taskCompleted){
  521. if (this.checkListShow(log, taskCompleted)) this.loadTaskLine_table(taskCompleted, taskTable, log, false);
  522. }.bind(this));
  523. if (this.json.isShowRead!==false){
  524. var readNames = [];
  525. var readCompletedNames = [];
  526. if (log.readList && log.readList.length){
  527. log.readList.each(function(read){
  528. readNames.push(MWF.name.cn(read.person));
  529. });
  530. }
  531. if (log.readCompletedList && log.readCompletedList.length){
  532. log.readCompletedList.each(function(read){
  533. readCompletedNames.push(MWF.name.cn(read.person));
  534. });
  535. }
  536. this.loadReadLine_default(readNames, readCompletedNames, childNode);
  537. }
  538. if (this.json.isTask){
  539. log.taskList.each(function(task){
  540. if (this.checkListShow(log, task)) this.loadTaskLine_table(task, taskTable, log, true);
  541. }.bind(this));
  542. }
  543. }
  544. },
  545. loadTaskLine_table: function(task, table, log, isTask){
  546. var style = "logTableTaskLine";
  547. if (isTask) style = "logTableTaskLine_task";
  548. var tr = table.insertRow(table.rows.length);
  549. var td = tr.insertCell(0).setStyles(this.form.css[style]);
  550. td.set("text", task.person.substring(0, task.person.indexOf("@")) || "");
  551. td = tr.insertCell(1).setStyles(this.form.css[style]);
  552. td.set("text", task.unit.substring(0, task.unit.indexOf("@")) || "");
  553. td = tr.insertCell(2).setStyles(this.form.css[style]);
  554. td.set("text", task.startTime || "");
  555. td = tr.insertCell(3).setStyles(this.form.css[style]);
  556. td.set("text", task.completedTime || "");
  557. td = tr.insertCell(4).setStyles(this.form.css[style]);
  558. td.set("text", task.routeName || "");
  559. td = tr.insertCell(5).setStyles(this.form.css[style]);
  560. td.set("html", "<div style='line-height: 28px; float:left'>" + task.opinion || ""+"</div>");
  561. if (task.mediaOpinion){
  562. var mediaIds = task.mediaOpinion.split(",");
  563. var atts = [];
  564. if (this.form.businessData.attachmentList){
  565. this.form.businessData.attachmentList.each(function(att){
  566. if (att.site==="$mediaOpinion"){
  567. if (mediaIds.indexOf(att.id)!==-1) atts.push(att);
  568. }
  569. }.bind(this));
  570. }
  571. if (atts.length) this.loadMediaOpinion(atts, td.getFirst(), "table");
  572. }
  573. },
  574. loadWorkLogText: function(list, container){
  575. this.lineClass = "logTaskNode";
  576. if( list ){
  577. list.each(function(log, idx){
  578. this.loadWorkLogLine_text(log, idx, container);
  579. }.bind(this));
  580. }else{
  581. this.workLog.each(function(log, idx){
  582. if (this.checkShow(log)) this.loadWorkLogLine_text(log, idx, container);
  583. }.bind(this));
  584. }
  585. },
  586. loadWorkLogLine_text: function(log, idx, container){
  587. log.taskCompletedList.each(function(taskCompleted){
  588. if (this.checkListShow(log, taskCompleted)) this.loadTaskLine_text(taskCompleted, container || this.node, log, false);
  589. }.bind(this));
  590. if (this.json.isTask){
  591. log.taskList.each(function(task){
  592. if (this.checkListShow(log, task)) this.loadTaskLine_text(task, container || this.node, log, true);
  593. }.bind(this));
  594. }
  595. },
  596. loadTaskLine_text: function(task, node, log, isTask){
  597. this.loadTaskLine_default(task, node, log, isTask, "0px", false, true);
  598. },
  599. checkShow: function(log){
  600. var flag = true;
  601. if (this.json.filterScript && this.json.filterScript.code){
  602. this.form.Macro.environment.log = log;
  603. this.form.Macro.environment.list = null;
  604. flag = this.form.Macro.exec(this.json.filterScript.code, this);
  605. }else{
  606. if (this.json.filterActivity.length){
  607. filterActivitys = this.json.filterActivity;
  608. flag = (filterActivitys.indexOf(log.fromActivityName)!==-1);
  609. }
  610. if (this.json.filterActivityAlias){
  611. if (this.json.filterActivityAlias.length){
  612. filterActivityAlias = this.json.filterActivityAlias;
  613. flag = ((log.fromActivityAlias) && filterActivityAlias.indexOf(log.fromActivityAlias)!==-1);
  614. }
  615. }
  616. if (this.json.filterPerson.length){
  617. flag = false;
  618. filterPersons = this.json.filterPerson;
  619. var tmpTaskCompletedList = [];
  620. log.taskCompletedList.each(function(taskCompleted){
  621. if ((filterPersons.indexOf(taskCompleted.person)!==-1) || (filterPersons.indexOf(taskCompleted.identity)!==-1)){
  622. tmpTaskCompletedList.push(taskCompleted);
  623. }
  624. }.bind(this));
  625. if (tmpTaskCompletedList.length){
  626. //log.taskCompletedList = [];
  627. //log.taskCompletedList = tmpTaskCompletedList;
  628. flag = true;
  629. }
  630. }
  631. if (this.json.filterRoute.length){
  632. filterRoutes = this.json.filterRoute;
  633. flag = (filterRoutes.indexOf(log.routeName)!==-1);
  634. }
  635. }
  636. return flag;
  637. },
  638. checkListShow: function(log, list){
  639. var flag = true;
  640. if (this.json.filterScript && this.json.filterScript.code){
  641. this.form.Macro.environment.log = log;
  642. this.form.Macro.environment.list = list;
  643. flag = this.form.Macro.exec(this.json.filterScript.code, this);
  644. }else{
  645. if (this.json.filterPerson.length){
  646. flag = ((filterPersons.indexOf(list.person)!==-1)|| (filterPersons.indexOf(list.identity)!==-1));
  647. }
  648. }
  649. return flag;
  650. },
  651. loadWorkLogDefault: function(list, container){
  652. //var text = this.json.textStyle;
  653. if( list ){
  654. list.each(function(log, idx){
  655. this.loadWorkLogLine_default(log, idx, container);
  656. }.bind(this));
  657. }else{
  658. this.workLog.each(function(log, idx){
  659. if (this.checkShow(log)) this.loadWorkLogLine_default(log, idx, container);
  660. }.bind(this));
  661. }
  662. },
  663. loadWorkLogLine_default: function(log, idx, container){
  664. if (!log.readList) log.readList = [];
  665. if (!log.readCompletedList) log.readCompletedList = [];
  666. if (log.taskCompletedList.length || log.readList.length || log.readCompletedList.length || (this.json.isTask && log.taskList.length)) {
  667. var logActivityNode = new Element("div", {"styles": this.form.css.logActivityNode}).inject(container || this.node);
  668. var titleNode = new Element("div", {"styles": this.form.css.logActivityTitleNode}).inject(logActivityNode);
  669. var childNode = new Element("div", {"styles": this.form.css.logActivityChildNode}).inject(logActivityNode);
  670. var iconNode = new Element("div", {"styles": this.form.css.logActivityIconNode}).inject(titleNode);
  671. var fromAvtivityNode = new Element("div", {"styles": this.form.css.logActivityFromNode}).inject(titleNode);
  672. var arrowNode = new Element("div", {"styles": this.form.css.logActivityArrowNode}).inject(titleNode);
  673. var arrivedAvtivityNode = new Element("div", {"styles": this.form.css.logActivityArrivedNode}).inject(titleNode);
  674. var readActionNode = new Element("div", {"styles": this.form.css.logActivityReadActionNode}).inject(titleNode);
  675. var timeNode = new Element("div", {"styles": this.form.css.logActivityTimeNode}).inject(titleNode);
  676. if (log.connected) {
  677. iconNode.setStyle("background-image", "url(/x_component_process_Xform/$Form/" + this.form.options.style + "/icon/ok14.png)");
  678. } else {
  679. iconNode.setStyle("background-image", "url(/x_component_process_Xform/$Form/" + this.form.options.style + "/icon/rightRed.png)");
  680. }
  681. fromAvtivityNode.set("html", "<b>" + log.fromActivityName + "</b>");
  682. if (log.arrivedActivityName) {
  683. arrowNode.setStyle("background-image", "url(/x_component_process_Xform/$Form/" + this.form.options.style + "/icon/right.png)");
  684. arrivedAvtivityNode.set("html", "<b>" + log.arrivedActivityName + "</b>");
  685. timeNode.set("html", "<b>" + MWF.xApplication.process.Xform.LP.begin + ": </b>" + log.fromTime + "<br/><b>" + MWF.xApplication.process.Xform.LP.end + ": </b>" + log.arrivedTime)
  686. } else {
  687. timeNode.set("html", "<b>" + MWF.xApplication.process.Xform.LP.begin + ": </b>" + log.fromTime)
  688. }
  689. // if ((log.readList && log.readList.length) || (log.readCompletedList && log.readCompletedList.length)){
  690. // readActionNode.set("text", MWF.xApplication.process.Xform.LP.worklogRead);
  691. // }
  692. if ((idx % 2) === 0) {
  693. logActivityNode.setStyles(this.form.css.logActivityNode_even);
  694. titleNode.setStyles(this.form.css.logActivityTitleNode_even);
  695. }
  696. log.taskCompletedList.each(function (taskCompleted) {
  697. if (this.checkListShow(log, taskCompleted)) this.loadTaskLine_default(taskCompleted, childNode, log, false);
  698. }.bind(this));
  699. if (this.json.isShowRead!==false){
  700. var readNames = [];
  701. var readCompletedNames = [];
  702. if (log.readList && log.readList.length){
  703. log.readList.each(function(read){
  704. readNames.push(MWF.name.cn(read.person));
  705. });
  706. }
  707. if (log.readCompletedList && log.readCompletedList.length){
  708. log.readCompletedList.each(function(read){
  709. readCompletedNames.push(MWF.name.cn(read.person));
  710. });
  711. }
  712. //if (readCompletedNames.length)
  713. this.loadReadLine_default(readNames, readCompletedNames, childNode);
  714. }
  715. if (this.json.isTask) {
  716. log.taskList.each(function (task) {
  717. if (this.checkListShow(log, task)) this.loadTaskLine_default(task, childNode, log, true);
  718. }.bind(this));
  719. }
  720. }
  721. },
  722. loadReadLine_default: function(readNames, readCompletedNames, node){
  723. var html = "";
  724. var logReadNode = new Element("div", {"styles": this.form.css.logReadTextNode}).inject(node);
  725. if (readNames.length){
  726. var readStrTitle = readNames.join(", ");
  727. var readStr = (readNames.length>20) ? readNames.slice(0,20).join(", ") : readStrTitle;
  728. html = "<span style='color: #0000ff'>"+(this.json.showReadTitle || MWF.xApplication.process.Xform.LP.showReadTitle)+": </span>"+readStr+"<span>&nbsp;&nbsp;&nbsp;&nbsp;</span>";
  729. //var logReadPersonNode = new Element("div", {"styles": this.form.css.logReadTextNode}).inject(logReadNode);
  730. }
  731. if (readCompletedNames.length){
  732. var readCompletedStrTitle = readCompletedNames.join(", ");
  733. var readCompletedStr = (readCompletedNames.length>20) ? readCompletedNames.slice(0,20).join(", ") : readCompletedStrTitle;
  734. html += "<span style='color: #0000ff'>"+(this.json.showReadCompletedTitle || MWF.xApplication.process.Xform.LP.showReadCompletedTitle)+": </span>"+readCompletedStr+"<span>&nbsp;&nbsp;&nbsp;&nbsp;</span>";
  735. }
  736. if (html) logReadNode.set("html", html);
  737. },
  738. loadTaskLine_default: function(task, node, log, isTask, margin, isZebra, nodeStyle){
  739. var style = "logTaskNode";
  740. var textStyle = "logTaskFloatTextNode";
  741. if (nodeStyle){
  742. style = "logTaskTextNode";
  743. textStyle = "logTaskTextNode";
  744. }
  745. var logTaskNode = new Element("div", {"styles": this.form.css[style]}).inject(node);
  746. var iconNode = new Element("div", {"styles": this.form.css.logTaskIconNode}).inject(logTaskNode);
  747. var textNode = new Element("div", {"styles": this.form.css[textStyle]}).inject(logTaskNode);
  748. if (isZebra){
  749. logTaskNode.setStyles(this.form.css[this.lineClass]);
  750. if (this.lineClass === "logTaskNode"){
  751. this.lineClass = "logTaskNode_even";
  752. }else{
  753. this.lineClass = "logTaskNode";
  754. }
  755. }
  756. if (margin) iconNode.setStyle("margin-left", margin);
  757. var left = iconNode.getStyle("margin-left").toInt();
  758. left = left + 28;
  759. var html;
  760. var company = "";
  761. if (!isTask){
  762. company = (task.unitList) ? task.unitList[task.unitList.length-1] : "";
  763. var html = this.json.textStyle;
  764. if (this.json.textStyleScript && this.json.textStyleScript.code){
  765. this.form.Macro.environment.log = log;
  766. this.form.Macro.environment.list = null;
  767. html = this.form.Macro.exec(this.json.textStyleScript.code, this);
  768. }
  769. html = html.replace(/\{person\}/g, task.person.substring(0, task.person.indexOf("@")));
  770. html = html.replace(/\{department\}/g, task.unit.substring(0, task.unit.indexOf("@")));
  771. html = html.replace(/\{route\}/g, task.routeName);
  772. html = html.replace(/\{time\}/g, task.completedTime);
  773. html = html.replace(/\{date\}/g, new Date().parse(task.completedTime).format("%Y-%m-%d"));
  774. html = html.replace(/\{opinion\}/g, task.opinion);
  775. html = html.replace(/\{company\}/g, company.substring(0, company.indexOf("@")));
  776. html = html.replace(/\{startTime\}/g, task.startTime);
  777. html = html.replace(/\{startDate\}/g, new Date().parse(task.startTime).format("%Y-%m-%d"));
  778. html = html.replace(/\{activity\}/g, log.fromActivityName);
  779. html = html.replace(/\{arrivedActivity\}/g, log.arrivedActivityName);
  780. //var html = MWF.xApplication.process.Xform.LP.nextUser + task.person+"("+task.department+")" +", "+
  781. // MWF.xApplication.process.Xform.LP.selectRoute + ": [" + task.routeName + "], " +
  782. // MWF.xApplication.process.Xform.LP.submitAt + ": " + task.completedTime+ ", " +
  783. // MWF.xApplication.process.Xform.LP.idea + ": <font style=\"color: #00F\">" + (task.opinion || "")+"</font>";
  784. textNode.set("html", html);
  785. if (task.mediaOpinion){
  786. var mediaIds = task.mediaOpinion.split(",");
  787. var atts = [];
  788. if (this.form.businessData.attachmentList){
  789. this.form.businessData.attachmentList.each(function(att){
  790. if (att.site==="$mediaOpinion"){
  791. if (mediaIds.indexOf(att.id)!==-1) atts.push(att);
  792. }
  793. }.bind(this));
  794. }
  795. if (atts.length) this.loadMediaOpinion(atts, textNode, "default");
  796. }
  797. }else{
  798. //company = task.unitList[task.unitList.length-1];
  799. html = task.person.substring(0, task.person.indexOf("@"))+"("+task.unit.substring(0, task.unit.indexOf("@"))+")" + MWF.xApplication.process.Xform.LP.processing+", "+
  800. MWF.xApplication.process.Xform.LP.comeTime + ": " + task.startTime;
  801. textNode.set("html", html);
  802. iconNode.setStyle("background-image", "url("+"/x_component_process_Xform/$Form/"+this.form.options.style+"/icon/rightRed.png)");
  803. }
  804. },
  805. loadMediaOpinion: function(atts, node, type){
  806. atts.each(function(att){
  807. if (!att.type) att.type = "image";
  808. if (att.type.indexOf("image")!==-1){
  809. if( type === "table" && !layout.mobile ){
  810. this.loadMediaOpinion_image_tooltip(att, node);
  811. }else{
  812. this.loadMediaOpinion_image(att, node);
  813. }
  814. }else if(att.type.indexOf("video")!==-1){
  815. this.loadMediaOpinion_video(att, node);
  816. }else if(att.type.indexOf("audio")!==-1){
  817. this.loadMediaOpinion_voice(att, node);
  818. }else{
  819. if( type === "table" && !layout.mobile ){
  820. this.loadMediaOpinion_image_tooltip(att, node);
  821. }else{
  822. this.loadMediaOpinion_image(att, node);
  823. }
  824. }
  825. }.bind(this));
  826. },
  827. getMediaOpinionUrl: function(att){
  828. var action = MWF.Actions.get("x_processplatform_assemble_surface");
  829. var url = action.action.actions["getAttachmentStream"].uri;
  830. if (this.form.businessData.workCompleted){
  831. url = action.action.actions["getWorkcompletedAttachmentStream"].uri;
  832. url = url.replace("{id}", att.id);
  833. url = url.replace("{workCompletedId}", this.form.businessData.workCompleted.id);
  834. }else{
  835. url = url.replace("{id}", att.id);
  836. url = url.replace("{workid}", this.form.businessData.work.id);
  837. }
  838. url = action.action.address+url;
  839. return url;
  840. },
  841. loadMediaOpinion_image_tooltip : function(att, node){
  842. var iconNode = new Element("div", {"styles": this.form.css.logMediaIcon}).inject(node.getParent());
  843. iconNode.setStyle("background-image", "url('"+this.form.path+this.form.options.style+"/icon/image.png')");
  844. iconNode.set("title", MWF.xApplication.process.Xform.LP.mediaOpinion_image);
  845. if( !this.MTooltipsLoaded )o2.xDesktop.requireApp("Template", "MTooltips", null, false);
  846. this.MTooltipsLoaded = true;
  847. var tooltip = new MTooltips(this.form.app.content, iconNode, this.form.app, null, {
  848. axis : "y", "delay" : 350,
  849. nodeStyles : {
  850. "max-width" : "800px"
  851. }
  852. });
  853. tooltip.contentNode = new Element("div",{
  854. styles : { width : "100%" , height : "100%" }
  855. });
  856. var img = new Element("img", {
  857. "src": this.getMediaOpinionUrl(att),
  858. "events" : {
  859. load : function(ev){
  860. var nh = ev.target.naturalHeight;
  861. var nw = ev.target.naturalWidth;
  862. if( this.isNumber( this.json.handwritingWidth ) || this.isNumber( this.json.handwritingHeight ) ){
  863. var size = this.getImageSize( nw, nh );
  864. ev.target.setStyles(size);
  865. }else{
  866. var x = Math.min(nw, 800);
  867. ev.target.setStyles({"width": ""+ x +"px"});
  868. }
  869. }.bind(this)
  870. }
  871. }).inject(tooltip.contentNode);
  872. },
  873. loadMediaOpinion_image: function(att, node){
  874. var iconNode = new Element("div", {"styles": this.form.css.logMediaIcon}).inject(node.getParent());
  875. iconNode.setStyle("background-image", "url('"+this.form.path+this.form.options.style+"/icon/image.png')");
  876. iconNode.set("title", MWF.xApplication.process.Xform.LP.mediaOpinion_image);
  877. iconNode.addEvents({
  878. "click": function(e){
  879. if (e.target.mediaOpinionContentNode) return "";
  880. var url = this.getMediaOpinionUrl(att);
  881. // if (this.mediaOpinionContentNode){
  882. // this.mediaOpinionContentNode.destroy();
  883. // this.mediaOpinionContentNode = null;
  884. // }
  885. var imgNode = new Element("div", {"styles": this.form.css.logMediaOpinionContent}).inject(node.getParent(),"after");
  886. if (!layout.mobile) imgNode.setStyle("margin-left", "40px");
  887. //this.mediaOpinionContentNode = imgNode;
  888. e.target.mediaOpinionContentNode = imgNode;
  889. var imgCloseNode = new Element("div", {"styles": this.form.css.logMediaOpinionContentClose}).inject(imgNode);
  890. imgCloseNode.addEvent("click", function(){ imgNode.destroy(); e.target.mediaOpinionContentNode = "";});
  891. var imgAreaNode = new Element("div", {"styles": this.form.css.logMediaOpinionContentArea}).inject(imgNode);
  892. //var height = 260;
  893. //var width = 390;
  894. var width;
  895. if (layout.mobile){
  896. width = node.getParent().getParent().getSize().x-2;
  897. //height = width*2/3;
  898. }else{
  899. var pNode = node.getParent().getParent();
  900. var offset = imgNode.getPosition( pNode );
  901. width = Math.min( pNode.getSize().x - offset.x - 42, 800 );
  902. }
  903. var img = new Element("img", {
  904. "src": url,
  905. "styles" : { width : width+"px" }, //最开始限定一下宽度,不要让页面抖动
  906. "events" : {
  907. load : function(ev){
  908. var nh = ev.target.naturalHeight;
  909. var nw = ev.target.naturalWidth;
  910. if( !layout.mobile && ( this.isNumber( this.json.handwritingWidth ) || this.isNumber( this.json.handwritingHeight ) ) ){
  911. var size = this.getImageSize( nw, nh );
  912. img.setStyles(size);
  913. imgNode.setStyles(size);
  914. }else{
  915. var x = Math.min(nw, width);
  916. img.setStyles({"width": ""+ x +"px"}); //最终的宽度
  917. imgNode.setStyles({"width": ""+ x +"px"});
  918. }
  919. }.bind(this)
  920. }
  921. }).inject(imgAreaNode);
  922. //img.setStyles({"width": ""+width+"px"});
  923. //imgNode.setStyles({"width": ""+width+"px"});
  924. //img.setStyles({"width": ""+width+"px", "height": ""+height+"px"});
  925. //imgNode.setStyles({"width": ""+width+"px", "height": ""+height+"px"});
  926. // var size = img.getSize();
  927. // var x_y = size.x/size.y;
  928. //if (size.y>260){
  929. //}
  930. var p = iconNode.getPosition(this.form.app.content);
  931. var s = iconNode.getSize();
  932. var size = (layout.mobile) ? {"x": width, "y": height}: imgNode.getSize();
  933. var contentSize = this.form.app.content.getSize();
  934. var contentScroll = (layout.mobile) ? document.body.getFirst().getScroll() : {"x": 0, "y": 0};
  935. var y = p.y-size.y;
  936. var x = p.x+s.x/2-size.x/2;
  937. if (x<10) x = 10;
  938. if (x+size.x>contentSize.x-10) x = contentSize.x-size.x-20;
  939. if (y+size.y>contentSize.y-10) y = contentSize.y-size.y-20;
  940. if (y<10) y = 10;
  941. y=y+contentScroll.y;
  942. if (layout.mobile){
  943. x = 0;
  944. }
  945. // imgNode.setStyles({
  946. // "top": ""+y+"px",
  947. // "left": ""+x+"px"
  948. // });
  949. // this.hideMediaOpinionNodeFun = this.hideMediaOpinionNode.bind(this);
  950. // this.form.node.addEvent("mousedown", this.hideMediaOpinionNodeFun);
  951. e.stopPropagation();
  952. }.bind(this)
  953. });
  954. },
  955. hideMediaOpinionNode: function(){
  956. if (this.mediaOpinionContentNode){
  957. this.mediaOpinionContentNode.destroy();
  958. this.mediaOpinionContentNode = null;
  959. }
  960. // if (this.hideMediaOpinionNodeFun) this.form.node.removeEvent("click", this.hideMediaOpinionNodeFun);
  961. },
  962. loadMediaOpinion_video: function(att, node){
  963. var iconNode = new Element("div", {"styles": this.form.css.logMediaIcon}).inject(node.getParent());
  964. iconNode.setStyle("background-image", "url('"+this.form.path+this.form.options.style+"/icon/video.png')");
  965. iconNode.set("title", MWF.xApplication.process.Xform.LP.mediaOpinion_video);
  966. },
  967. loadMediaOpinion_voice: function(att, node){
  968. // this.form.css.logMediaIcon.width = "60px";
  969. // var iconNode = new Element("audio", {
  970. // "styles": this.form.css.logMediaIcon,
  971. // "controls": true,
  972. // "html": "<source src='"+url+"' type='audio/wav'></source>"
  973. // }).inject(node.getParent());
  974. var iconNode = new Element("div", {"styles": this.form.css.logMediaIcon}).inject(node.getParent());
  975. iconNode.setStyle("background-image", "url('"+this.form.path+this.form.options.style+"/icon/voice.png')");
  976. iconNode.set("title", MWF.xApplication.process.Xform.LP.mediaOpinion_voice);
  977. iconNode.addEvents({
  978. "click": function(e){
  979. var url = this.getMediaOpinionUrl(att);
  980. this.audioNode = new Element("audio", {"loop": false});
  981. this.audioNode.set("src", url);
  982. this.audioNode.play();
  983. e.stopPropagation();
  984. }.bind(this)
  985. });
  986. }
  987. });