Attachment.js 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
  1. MWF.xDesktop.requireApp("process.Xform", "$Module", null, false);
  2. MWF.require("MWF.widget.AttachmentController", null, false);
  3. MWF.xApplication.process.Xform.AttachmentController = new Class({
  4. Extends: MWF.widget.ATTER,
  5. "options": {
  6. "officeFiles": ["doc","docx","dotx","dot","xls","xlsx","xlsm","xlt","xltx","pptx","ppt","pot","potx","potm","pdf"],
  7. },
  8. checkDeleteAction: function(){
  9. if (this.options.readonly){
  10. this.setActionDisabled(this.deleteAction);
  11. this.setActionDisabled(this.min_deleteAction);
  12. return false;
  13. }
  14. if (this.options.isDeleteOption=="y"){
  15. if (this.selectedAttachments.length){
  16. var user = layout.session.user.distinguishedName;
  17. var flag = true;
  18. if (this.options.isDeleteOption==="o"){
  19. for (var i=0; i<this.selectedAttachments.length; i++){
  20. if (!this.selectedAttachments[i].data.control.allowEdit && this.selectedAttachments[i].data.person!==user){
  21. flag = false;
  22. break;
  23. }
  24. if (this.selectedAttachments[i].data.person!==layout.desktop.session.user.distinguishedName){
  25. flag = false;
  26. break;
  27. }
  28. }
  29. }else if (this.options.isDeleteOption==="a"){
  30. for (var i=0; i<this.selectedAttachments.length; i++){
  31. if (!this.selectedAttachments[i].data.control.allowEdit && this.selectedAttachments[i].data.person!==user){
  32. flag = false;
  33. break;
  34. }
  35. if (this.selectedAttachments[i].data.activity!==this.module.form.businessData.activity.id){
  36. flag = false;
  37. break;
  38. }
  39. }
  40. }else if (this.options.isDeleteOption==="ao"){
  41. for (var i=0; i<this.selectedAttachments.length; i++){
  42. if (!this.selectedAttachments[i].data.control.allowEdit && this.selectedAttachments[i].data.person!==user){
  43. flag = false;
  44. break;
  45. }
  46. if ((this.selectedAttachments[i].data.activity!==this.module.form.businessData.activity.id) || (this.selectedAttachments[i].data.person!==layout.desktop.session.user.distinguishedName)){
  47. flag = false;
  48. break;
  49. }
  50. }
  51. }else{
  52. for (var i=0; i<this.selectedAttachments.length; i++){
  53. if (!this.selectedAttachments[i].data.control.allowEdit && this.selectedAttachments[i].data.person!==user){
  54. flag = false;
  55. break;
  56. }
  57. }
  58. }
  59. if (flag){
  60. this.setActionEnabled(this.deleteAction);
  61. this.setActionEnabled(this.min_deleteAction);
  62. }else{
  63. this.setActionDisabled(this.deleteAction);
  64. this.setActionDisabled(this.min_deleteAction);
  65. }
  66. }else{
  67. this.setActionDisabled(this.deleteAction);
  68. this.setActionDisabled(this.min_deleteAction);
  69. }
  70. }else{
  71. // if (!this.options.isDelete){
  72. this.setActionDisabled(this.deleteAction);
  73. this.setActionDisabled(this.min_deleteAction);
  74. // }else{
  75. // if (this.selectedAttachments.length){
  76. // this.setActionEnabled(this.deleteAction);
  77. // this.setActionEnabled(this.min_deleteAction);
  78. // }else{
  79. // this.setActionDisabled(this.deleteAction);
  80. // this.setActionDisabled(this.min_deleteAction);
  81. // }
  82. // }
  83. }
  84. },
  85. openInOfficeControl: function(att, office){
  86. if (office){
  87. if (!office.openedAttachment || office.openedAttachment.id!==att.id){
  88. office.save();
  89. if (this.module.form.businessData.workCompleted){
  90. MWF.Actions.get("x_processplatform_assemble_surface").getAttachmentWorkcompletedUrl(att.id, this.module.form.businessData.workCompleted.id, function(url){
  91. office.openedAttachment = {"id": att.id, "site": this.module.json.name, "name": att.name};
  92. office.officeOCX.BeginOpenFromURL(url, true, this.readonly);
  93. }.bind(this));
  94. }else{
  95. MWF.Actions.get("x_processplatform_assemble_surface").getAttachmentUrl(att.id, this.module.form.businessData.work.id, function(url){
  96. office.openedAttachment = {"id": att.id, "site": this.module.json.name, "name": att.name};
  97. office.officeOCX.BeginOpenFromURL(url, true, this.readonly);
  98. }.bind(this));
  99. }
  100. }
  101. }
  102. },
  103. checkReplaceAction: function(){
  104. debugger;
  105. if (this.options.readonly){
  106. this.setActionDisabled(this.replaceAction);
  107. this.setActionDisabled(this.min_replaceAction);
  108. return false;
  109. }
  110. if (this.options.isReplaceOption=="y") {
  111. if (this.selectedAttachments.length && this.selectedAttachments.length===1){
  112. var user = layout.session.user.distinguishedName;
  113. var flag;
  114. if (this.options.isReplaceOption==="o"){
  115. flag = this.selectedAttachments[0].data.person === layout.desktop.session.user.distinguishedName;
  116. }
  117. if (this.options.isReplaceOption==="a"){
  118. flag = this.selectedAttachments[0].data.activity===this.module.form.businessData.activity.id;
  119. }
  120. if (this.options.isReplaceOption==="ao"){
  121. flag = (this.selectedAttachments[0].data.person === layout.desktop.session.user.distinguishedName && this.selectedAttachments[0].data.activity===this.module.form.businessData.activity.id);
  122. }
  123. if (!this.selectedAttachments[0].data.control.allowEdit && this.selectedAttachments[0].data.person!==user){
  124. flag = false;
  125. }else{
  126. flag = true;
  127. }
  128. if (flag) {
  129. this.setActionEnabled(this.replaceAction);
  130. this.setActionEnabled(this.min_replaceAction);
  131. }else{
  132. this.setActionDisabled(this.replaceAction);
  133. this.setActionDisabled(this.min_replaceAction);
  134. }
  135. } else {
  136. this.setActionDisabled(this.replaceAction);
  137. this.setActionDisabled(this.min_replaceAction);
  138. }
  139. }else{
  140. // if (!this.options.isReplace){
  141. this.setActionDisabled(this.replaceAction);
  142. this.setActionDisabled(this.min_replaceAction);
  143. // }else{
  144. // if (this.selectedAttachments.length && this.selectedAttachments.length===1){
  145. // this.setActionEnabled(this.replaceAction);
  146. // this.setActionEnabled(this.min_replaceAction);
  147. // }else{
  148. // this.setActionDisabled(this.replaceAction);
  149. // this.setActionDisabled(this.min_replaceAction);
  150. // }
  151. // }
  152. }
  153. },
  154. replaceAttachment: function(e, node){
  155. var att = this.selectedAttachments[0].data;
  156. if (this.module.json.isOpenInOffice && this.module.json.officeControlName && (this.options.officeFiles.indexOf(att.extension)!==-1)){
  157. var office = this.module.form.all[this.module.json.officeControlName];
  158. if (office){
  159. if (this.min_closeOfficeAction) this.setActionEnabled(this.min_closeOfficeAction);
  160. if (this.closeOfficeAction) this.setActionEnabled(this.closeOfficeAction);
  161. this.openInOfficeControl(att, office);
  162. }else{
  163. if (this.selectedAttachments.length && this.selectedAttachments.length==1){
  164. if (this.module) this.module.replaceAttachment(e, node, this.selectedAttachments[0]);
  165. }
  166. }
  167. }else{
  168. if (this.selectedAttachments.length && this.selectedAttachments.length==1){
  169. if (this.module) this.module.replaceAttachment(e, node, this.selectedAttachments[0]);
  170. }
  171. }
  172. },
  173. createTopNode: function(){
  174. if (this.options.title){
  175. if (!this.titleNode) this.titleNode = new Element("div", {"styles": this.css.titleNode, "text": this.options.title}).inject(this.node);
  176. }
  177. this.topNode = new Element("div", {"styles": this.css.topNode}).inject(this.node);
  178. this.createEditGroupActions();
  179. this.createReadGroupActions();
  180. this.createListGroupActions();
  181. if (this.module.json.isOpenInOffice && this.module.json.officeControlName) this.createOfficeGroupActions();
  182. this.createConfigGroupActions();
  183. this.createViewGroupActions();
  184. },
  185. checkActions: function(){
  186. // if (this.options.readonly){
  187. // this.setReadonly();
  188. // }else{
  189. this.checkUploadAction();
  190. this.checkDeleteAction();
  191. this.checkReplaceAction();
  192. //this.checkOfficeAction();
  193. this.checkDownloadAction();
  194. this.checkSizeAction();
  195. this.checkConfigAction();
  196. this.checkListStyleAction();
  197. // }
  198. },
  199. checkConfigAction: function(){
  200. if (this.options.readonly){
  201. this.setActionDisabled(this.configAction);
  202. this.setActionDisabled(this.checkTextAction);
  203. return false;
  204. }
  205. if (this.selectedAttachments.length){
  206. var flag = true;
  207. var user = layout.session.user.distinguishedName;
  208. for (var i=0; i<this.selectedAttachments.length; i++){
  209. if ((!this.selectedAttachments[i].data.control.allowControl || !this.selectedAttachments[i].data.control.allowEdit) && this.selectedAttachments[i].data.person!==user){
  210. flag = false;
  211. break;
  212. }
  213. }
  214. if (flag){
  215. this.setActionEnabled(this.configAction);
  216. }else{
  217. this.setActionDisabled(this.configAction);
  218. }
  219. //this.setActionEnabled(this.min_deleteAction);
  220. }else{
  221. this.setActionDisabled(this.configAction);
  222. //this.setActionDisabled(this.min_deleteAction);
  223. }
  224. this.setActionDisabled(this.checkTextAction);
  225. if (this.selectedAttachments.length && this.selectedAttachments.length===1){
  226. var att = this.selectedAttachments[0];
  227. if (this.options.images.indexOf(att.data.extension.toLowerCase())!==-1){
  228. this.setActionEnabled(this.checkTextAction);
  229. }
  230. }
  231. },
  232. createConfigGroupActions: function(){
  233. this.configActionBoxNode = new Element("div", {"styles": this.css.actionsBoxNode}).inject(this.topNode);
  234. this.configActionsGroupNode = new Element("div", {"styles": this.css.actionsGroupNode}).inject(this.configActionBoxNode);
  235. this.configAction = this.createAction(this.configActionsGroupNode, "config", MWF.LP.widget.configAttachment, function(e, node){
  236. this.configAttachment(e, node);
  237. }.bind(this));
  238. this.createSeparate(this.configActionsGroupNode);
  239. this.checkTextAction = this.createAction(this.configActionsGroupNode, "check", MWF.LP.widget.checkOcrText, function(e, node){
  240. this.checkImageTex(e, node);
  241. }.bind(this));
  242. if (this.configAction) this.setActionDisabled(this.configAction);
  243. if (this.checkTextAction) this.setActionDisabled(this.checkTextAction);
  244. },
  245. createOfficeGroupActions: function(){
  246. this.officeActionBoxNode = new Element("div", {"styles": this.css.actionsBoxNode}).inject(this.topNode);
  247. this.officeActionsGroupNode = new Element("div", {"styles": this.css.actionsGroupNode}).inject(this.officeActionBoxNode);
  248. this.closeOfficeAction = this.createAction(this.officeActionsGroupNode, "closeOffice", MWF.LP.widget.closeOffice, function(e, node){
  249. this.closeAttachmentOffice(e, node);
  250. }.bind(this));
  251. if (this.closeOfficeAction) this.setActionDisabled(this.closeOfficeAction);
  252. },
  253. loadMinActions: function(){
  254. this.min_uploadAction = this.createAction(this.minActionAreaNode, "upload", MWF.LP.widget.upload, function(e, node){
  255. this.uploadAttachment(e, node);
  256. }.bind(this));
  257. this.min_deleteAction = this.createAction(this.minActionAreaNode, "delete", MWF.LP.widget["delete"], function(e, node){
  258. this.deleteAttachment(e, node);
  259. }.bind(this));
  260. this.min_replaceAction = this.createAction(this.minActionAreaNode, "replace", MWF.LP.widget.replace, function(e, node){
  261. this.replaceAttachment(e, node);
  262. }.bind(this));
  263. this.min_downloadAction = this.createAction(this.minActionAreaNode, "download", MWF.LP.widget.download, function(e, node){
  264. this.downloadAttachment(e, node);
  265. }.bind(this));
  266. if (this.module.json.isOpenInOffice && this.module.json.officeControlName){
  267. this.min_closeOfficeAction = this.createAction(this.minActionAreaNode, "closeOffice", MWF.LP.widget.closeOffice, function(e, node){
  268. this.closeAttachmentOffice(e, node);
  269. }.bind(this));
  270. if (this.min_closeOfficeAction) this.setActionDisabled(this.closeOfficeAction);
  271. }
  272. this.createSeparate(this.minActionAreaNode);
  273. this.sizeAction = this.createAction(this.minActionAreaNode, "max", MWF.LP.widget.min, function(){
  274. this.changeControllerSize();
  275. }.bind(this));
  276. },
  277. closeAttachmentOffice: function(){
  278. var office = this.module.form.all[this.module.json.officeControlName];
  279. if (office){
  280. office.openFile();
  281. if (this.min_closeOfficeAction) this.setActionDisabled(this.min_closeOfficeAction);
  282. if (this.closeOfficeAction) this.setActionDisabled(this.closeOfficeAction);
  283. }
  284. },
  285. configAttachment: function(){
  286. //this.fireEvent("delete", [attachment.data]);
  287. var lp = MWF.xApplication.process.Xform.LP;
  288. var css = this.module.form.css;
  289. var node = new Element("div", {"styles": css.attachmentPermissionNode}).inject(this.node);
  290. var attNames = new Element("div", {"styles": css.attachmentPermissionNamesNode}).inject(node);
  291. var attNamesTitle = new Element("div", {"styles": css.attachmentPermissionNamesTitleNode, "text": lp.attachmentPermissionInfo}).inject(attNames);
  292. var attNamesArea = new Element("div", {"styles": css.attachmentPermissionNamesAreaNode}).inject(attNames);
  293. if (this.selectedAttachments.length){
  294. this.selectedAttachments.each(function(att){
  295. var attNode = new Element("div", {"styles": css.attachmentPermissionAttNode, "text": att.data.name}).inject(attNamesArea);
  296. }.bind(this));
  297. }
  298. var editArea = new Element("div", {"styles": css.attachmentPermissionEditAreaNode}).inject(node);
  299. var title = new Element("div", {"styles": css.attachmentPermissionTitleNode, "text": lp.attachmentRead}).inject(editArea);
  300. var readInput = new Element("div", {"styles": css.attachmentPermissionInputNode}).inject(editArea);
  301. title = new Element("div", {"styles": css.attachmentPermissionTitleNode, "text": lp.attachmentEdit}).inject(editArea);
  302. var editInput = new Element("div", {"styles": css.attachmentPermissionInputNode}).inject(editArea);
  303. title = new Element("div", {"styles": css.attachmentPermissionTitleNode, "text": lp.attachmentController}).inject(editArea);
  304. var controllerInput = new Element("div", {"styles": css.attachmentPermissionInputNode}).inject(editArea);
  305. var dlg = o2.DL.open({
  306. "title": lp.attachmentPermission,
  307. "isResize": false,
  308. "content": node,
  309. "buttonList": [
  310. {
  311. "text": MWF.LP.process.button.ok,
  312. "action": function(){
  313. this.setAttachmentConfig(readInput, editInput, controllerInput);
  314. dlg.close();
  315. }.bind(this)
  316. },
  317. {
  318. "text": MWF.LP.process.button.cancel,
  319. "action": function(){dlg.close();}
  320. }
  321. ]
  322. });
  323. if (this.selectedAttachments.length===1){
  324. var data = this.selectedAttachments[0].data;
  325. var readUnitList = (data.readUnitList) || [];
  326. var readIdentityList = (data.readIdentityList) || [];
  327. var editUnitList = (data.editUnitList) || [];
  328. var editIdentityList = (data.editIdentityList) || [];
  329. var controllerUnitList = (data.controllerUnitList) || [];
  330. var controllerIdentityList = (data.controllerIdentityList) || [];
  331. readInput.setSelectPerson(this.module.form.app.content, {
  332. "types": ["unit", "identity"],
  333. "values": readUnitList.concat(readIdentityList).trim()
  334. });
  335. editInput.setSelectPerson(this.module.form.app.content, {
  336. "types": ["unit", "identity"],
  337. "values": editUnitList.concat(editIdentityList).trim()
  338. });
  339. controllerInput.setSelectPerson(this.module.form.app.content, {
  340. "types": ["unit", "identity"],
  341. "values": controllerUnitList.concat(controllerIdentityList).trim()
  342. });
  343. }else{
  344. readInput.setSelectPerson(this.module.form.app.content, { "types": ["unit", "identity"] });
  345. editInput.setSelectPerson(this.module.form.app.content, { "types": ["unit", "identity"] });
  346. controllerInput.setSelectPerson(this.module.form.app.content, { "types": ["unit", "identity"] });
  347. }
  348. },
  349. setAttachmentConfig: function(readInput, editInput, controllerInput){
  350. if (this.selectedAttachments.length){
  351. var readList = readInput.retrieve("data-value");
  352. var editList = editInput.retrieve("data-value");
  353. var controllerList = controllerInput.retrieve("data-value");
  354. var readUnitList = [];
  355. var readIdentityList = [];
  356. var editUnitList = [];
  357. var editIdentityList = [];
  358. var controllerUnitList = [];
  359. var controllerIdentityList = [];
  360. if (readList){
  361. readList.each(function(v){
  362. var vName = (typeOf(v)==="string") ? v : v.distinguishedName;
  363. var len = vName.length;
  364. var flag = vName.substring(len-1,len);
  365. if (flag==="U") readUnitList.push(vName);
  366. if (flag==="I") readIdentityList.push(vName);
  367. });
  368. }
  369. if (editList){
  370. editList.each(function(v){
  371. var vName = (typeOf(v)==="string") ? v : v.distinguishedName;
  372. var len = vName.length;
  373. var flag = vName.substring(len-1,len);
  374. if (flag==="U") editUnitList.push(vName);
  375. if (flag==="I") editIdentityList.push(vName);
  376. });
  377. }
  378. if (controllerList){
  379. controllerList.each(function(v){
  380. var vName = (typeOf(v)==="string") ? v : v.distinguishedName;
  381. var len = vName.length;
  382. var flag = vName.substring(len-1,len);
  383. if (flag==="U") controllerUnitList.push(vName);
  384. if (flag==="I") controllerIdentityList.push(vName);
  385. });
  386. }
  387. this.selectedAttachments.each(function(att){
  388. att.data.readUnitList = readUnitList;
  389. att.data.readIdentityList = readIdentityList;
  390. att.data.editUnitList = editUnitList;
  391. att.data.editIdentityList = editIdentityList;
  392. att.data.controllerUnitList = controllerUnitList;
  393. att.data.controllerIdentityList = controllerIdentityList;
  394. o2.Actions.get("x_processplatform_assemble_surface").configAttachment(att.data.id, this.module.form.businessData.work.id, att.data);
  395. }.bind(this));
  396. }
  397. },
  398. checkImageTex: function(){
  399. if (this.selectedAttachments.length && this.selectedAttachments.length==1){
  400. var att = this.selectedAttachments[0];
  401. var lp = MWF.xApplication.process.Xform.LP;
  402. var css = this.module.form.css;
  403. var node = new Element("div", {"styles": css.attachmentOCRNode}).inject(this.node);
  404. var previewNode = new Element("div", {"styles": css.attachmentOCRImageAreaNode}).inject(node);
  405. var imgNode = new Element("img", {"styles": css.attachmentOCRImageNode}).inject(previewNode);
  406. o2.Actions.get("x_processplatform_assemble_surface").getAttachmentUrl(att.data.id, this.module.form.businessData.work.id, function(url){
  407. imgNode.set("src", url);
  408. });
  409. var areaNode = new Element("div", {"styles": css.attachmentOCRInputAreaNode}).inject(node);
  410. var inputNode = new Element("textarea", {"styles": css.attachmentOCRInputNode}).inject(areaNode);
  411. var dlg = o2.DL.open({
  412. "title": lp.attachmentOCRTitle,
  413. "isResize": false,
  414. "content": node,
  415. "buttonList": [
  416. {
  417. "text": MWF.LP.process.button.ok,
  418. "action": function(){
  419. this.setAttachmentOCR(inputNode, att);
  420. dlg.close();
  421. }.bind(this)
  422. },
  423. {
  424. "text": MWF.LP.process.button.cancel,
  425. "action": function(){dlg.close();}
  426. }
  427. ]
  428. });
  429. if (att.data.ocr){
  430. inputNode.set("text", att.data.ocr.text || "");
  431. }else{
  432. o2.Actions.get("x_processplatform_assemble_surface").getAttachmentOCR(att.data.id, this.module.form.businessData.work.id, function(json){
  433. att.data.ocr = json.data;
  434. inputNode.set("text", json.data.text || "");
  435. }.bind(this))
  436. }
  437. }
  438. },
  439. setAttachmentOCR: function(inputNode, att){
  440. var data = inputNode.get("text");
  441. if (!att.data.ocr) att.data.ocr = {};
  442. att.data.ocr.text = data;
  443. o2.Actions.get("x_processplatform_assemble_surface").setAttachmentOCR(att.data.id, this.module.form.businessData.work.id, {
  444. "text": data
  445. }, function(){
  446. this.module.form.app.notice("success", lp.attachmentOCR_saved, this.node);
  447. }.bind(this));
  448. }
  449. });
  450. MWF.xApplication.process.Xform.Attachment = MWF.APPAttachment = new Class({
  451. Extends: MWF.APP$Module,
  452. options: {
  453. "moduleEvents": ["upload", "delete", "afterDelete", "load"]
  454. },
  455. initialize: function(node, json, form, options){
  456. this.node = $(node);
  457. this.node.store("module", this);
  458. this.json = json;
  459. this.form = form;
  460. this.field = true;
  461. },
  462. _loadUserInterface: function(){
  463. this.node.empty();
  464. this.loadAttachmentController();
  465. this.fireEvent("load");
  466. },
  467. loadAttachmentController: function(){
  468. //MWF.require("MWF.widget.AttachmentController", function() {
  469. var options = {
  470. "title": "附件区域",
  471. "listStyle": this.json.listStyle || "icon",
  472. "size": this.json.size || "max",
  473. "resize": (this.json.size==="true"),
  474. "attachmentCount": this.json.attachmentCount || 0,
  475. "isUpload": (this.json.isUpload==="y"),
  476. "isDelete": (this.json.isDelete==="y"),
  477. "isReplace": (this.json.isReplace==="y"),
  478. "isDownload": (this.json.isDownload==="y"),
  479. "isSizeChange": (this.json.isSizeChange==="y"),
  480. "readonly": (this.json.readonly==="y"),
  481. "isDeleteOption": this.json.isDelete,
  482. "isReplaceOption": this.json.isReplace
  483. };
  484. if (this.readonly) options.readonly = true;
  485. //this.attachmentController = new MWF.widget.ATTER(this.node, this, options);
  486. this.attachmentController = new MWF.xApplication.process.Xform.AttachmentController(this.node, this, options);
  487. this.attachmentController.load();
  488. this.form.businessData.attachmentList.each(function (att) {
  489. //if (att.site===this.json.id || (this.json.isOpenInOffice && this.json.officeControlName===att.site)) this.attachmentController.addAttachment(att);
  490. if (att.site===this.json.id) this.attachmentController.addAttachment(att);
  491. }.bind(this));
  492. //}.bind(this));
  493. },
  494. _loadEvents: function(editorConfig){
  495. Object.each(this.json.events, function(e, key){
  496. if (e.code){
  497. if (this.options.moduleEvents.indexOf(key)!==-1){
  498. this.addEvent(key, function(event){
  499. return this.form.Macro.fire(e.code, this, event);
  500. }.bind(this));
  501. }else{
  502. this.node.addEvent(key, function(event){
  503. return this.form.Macro.fire(e.code, this, event);
  504. }.bind(this));
  505. }
  506. }
  507. }.bind(this));
  508. },
  509. getData: function(){
  510. return this.attachmentController.getAttachmentNames();
  511. },
  512. createUploadFileNode: function(){
  513. var accept = "*";
  514. if (!this.json.attachmentExtType || (this.json.attachmentExtType.indexOf("other")!=-1 && !this.json.attachmentExtOtherType)){
  515. }else{
  516. accepts = [];
  517. var otherType = this.json.attachmentExtOtherType;
  518. this.json.attachmentExtType.each(function(v){
  519. switch (v) {
  520. case "word":
  521. accepts.push(".doc, .docx, .dot, .dotx");
  522. break;
  523. case "excel":
  524. accepts.push(".xls, .xlsx, .xlsm, .xlt, .xltx");
  525. break;
  526. case "ppt":
  527. accepts.push(".pptx, .ppt, .pot, .potx, .potm");
  528. break;
  529. case "txt":
  530. accepts.push(".txt");
  531. break;
  532. case "pic":
  533. accepts.push(".bmp, .gif, .psd, .jpeg, .jpg");
  534. break;
  535. case "pdf":
  536. accepts.push(".pdf");
  537. break;
  538. case "zip":
  539. accepts.push(".zip, .rar");
  540. break;
  541. case "audio":
  542. accepts.push(".mp3, .wav, .wma, .wmv, .flac, .ape");
  543. break;
  544. case "video":
  545. accepts.push(".avi, .mkv, .mov, .ogg, .mp4, .mpeg");
  546. break;
  547. case "other":
  548. if (this.json.attachmentExtOtherType) accepts.push(this.json.attachmentExtOtherType);
  549. break;
  550. }
  551. });
  552. debugger;
  553. accept = accepts.join(", ");
  554. }
  555. var size = 0;
  556. if (this.json.attachmentSize) size = this.json.attachmentSize.toFloat();
  557. this.attachmentController.doUploadAttachment({"site": this.json.id}, this.form.workAction.action, "uploadAttachment", {"id": this.form.businessData.work.id}, null, function(o){
  558. if (o.id){
  559. this.form.workAction.getAttachment(o.id, this.form.businessData.work.id, function(json){
  560. if (json.data){
  561. if (!json.data.control) json.data.control={};
  562. this.attachmentController.addAttachment(json.data);
  563. }
  564. this.attachmentController.checkActions();
  565. this.fireEvent("upload", [json.data]);
  566. }.bind(this))
  567. }
  568. this.attachmentController.checkActions();
  569. }.bind(this), function(files){
  570. if (files.length){
  571. if ((files.length+this.attachmentController.attachments.length > this.attachmentController.options.attachmentCount) && this.attachmentController.options.attachmentCount>0){
  572. var content = MWF.xApplication.process.Xform.LP.uploadMore;
  573. content = content.replace("{n}", this.attachmentController.options.attachmentCount);
  574. this.form.notice(content, "error");
  575. return false;
  576. }
  577. }
  578. return true;
  579. }.bind(this), true, accept, size);
  580. // this.uploadFileAreaNode = new Element("div");
  581. // var html = "<input name=\"file\" type=\"file\" multiple/>";
  582. // this.uploadFileAreaNode.set("html", html);
  583. //
  584. // this.fileUploadNode = this.uploadFileAreaNode.getFirst();
  585. // this.fileUploadNode.addEvent("change", function(){
  586. //
  587. // var files = this.fileUploadNode.files;
  588. // if (files.length){
  589. // if ((files.length+this.attachmentController.attachments.length > this.attachmentController.options.attachmentCount) && this.attachmentController.options.attachmentCount>0){
  590. // var content = MWF.xApplication.process.Xform.LP.uploadMore;
  591. // content = content.replace("{n}", this.attachmentController.options.attachmentCount);
  592. // this.form.notice(content, "error");
  593. // }else{
  594. // for (var i = 0; i < files.length; i++) {
  595. // var file = files.item(i);
  596. //
  597. // var formData = new FormData();
  598. // formData.append('site', this.json.id);
  599. // formData.append('file', file);
  600. //
  601. // //formData.append('folder', folderId);
  602. //
  603. // this.form.workAction.uploadAttachment(this.form.businessData.work.id ,function(o, text){
  604. // if (o.id){
  605. // this.form.workAction.getAttachment(o.id, this.form.businessData.work.id, function(json){
  606. // if (json.data) this.attachmentController.addAttachment(json.data);
  607. // this.attachmentController.checkActions();
  608. //
  609. // this.fireEvent("upload", [json.data]);
  610. // }.bind(this))
  611. // }
  612. // this.attachmentController.checkActions();
  613. // }.bind(this), null, formData, file);
  614. // }
  615. // }
  616. // }
  617. // }.bind(this));
  618. },
  619. uploadAttachment: function(e, node){
  620. if (window.o2android && window.o2android.uploadAttachment){
  621. window.o2android.uploadAttachment(this.json.id);
  622. }else if(window.webkit && window.webkit.messageHandlers) {
  623. window.webkit.messageHandlers.uploadAttachment.postMessage({"site": this.json.id});
  624. }else{
  625. // if (!this.uploadFileAreaNode){
  626. this.createUploadFileNode();
  627. // }
  628. // this.fileUploadNode.click();
  629. }
  630. },
  631. deleteAttachments: function(e, node, attachments){
  632. var names = [];
  633. attachments.each(function(attachment){
  634. names.push(attachment.data.name);
  635. }.bind(this));
  636. // if ((window.o2 && window.o2.replaceAttachment) || (window.webkit && window.webkit.messageHandlers)){
  637. // if (window.confirm(MWF.xApplication.process.Xform.LP.deleteAttachment+"( "+names.join(", ")+" )")){
  638. // while (attachments.length){
  639. // attachment = attachments.shift();
  640. // this.deleteAttachment(attachment);
  641. // }
  642. // }
  643. // }else {
  644. // var tmpNode = new Element("div", {
  645. // "styles": {
  646. // "background-color": "#0000ff",
  647. // "border-style": "solid",
  648. // "border-color": "#fff",
  649. // "border-width": "1",
  650. // "box-shadow": "0px 0px 20px #999",
  651. // "z-index": "20000",
  652. // "overflow": "hidden",
  653. // "font-size": "14px",
  654. // "height": "160px",
  655. // "padding": "0px",
  656. // "width": "300px",
  657. // "position": "absolute",
  658. // "top": "50px",
  659. // "left": "20px",
  660. // "opacity": 1,
  661. // "border-radius": "5px"
  662. // }
  663. // }).inject(this.form.app.content);
  664. var _self = this;
  665. this.form.confirm("warn", e, MWF.xApplication.process.Xform.LP.deleteAttachmentTitle, MWF.xApplication.process.Xform.LP.deleteAttachment+"( "+names.join(", ")+" )", 300, 120, function(){
  666. while (attachments.length){
  667. var attachment = attachments.shift();
  668. _self.deleteAttachment(attachment);
  669. }
  670. this.close();
  671. }, function(){
  672. this.close();
  673. }, null);
  674. },
  675. deleteAttachment: function(attachment){
  676. this.fireEvent("delete", [attachment.data]);
  677. var id = attachment.data.id;
  678. this.form.workAction.deleteAttachment(attachment.data.id, this.form.businessData.work.id, function(josn){
  679. this.attachmentController.removeAttachment(attachment);
  680. this.attachmentController.checkActions();
  681. if (this.form.officeList){
  682. this.form.officeList.each(function(office){
  683. if (office.openedAttachment){
  684. if (office.openedAttachment.id == id){
  685. office.loadOfficeEdit();
  686. }
  687. }
  688. }.bind(this));
  689. }
  690. this.fireEvent("afterDelete", [attachment.data]);
  691. }.bind(this));
  692. },
  693. replaceAttachment: function(e, node, attachment){
  694. if (window.o2android && window.o2android.replaceAttachment){
  695. window.o2android.replaceAttachment(attachment.data.id, this.json.id);
  696. }else if(window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.replaceAttachment) {
  697. window.webkit.messageHandlers.replaceAttachment.postMessage({"id": attachment.data.id, "site": this.json.id});
  698. }else {
  699. var _self = this;
  700. this.form.confirm("warn", e, MWF.xApplication.process.Xform.LP.replaceAttachmentTitle, MWF.xApplication.process.Xform.LP.replaceAttachment+"( "+attachment.data.name+" )", 350, 120, function(){
  701. _self.replaceAttachmentFile(attachment);
  702. this.close();
  703. }, function(){
  704. this.close();
  705. }, null);
  706. }
  707. },
  708. createReplaceFileNode: function(attachment){
  709. var accept = "*";
  710. if (!this.json.attachmentExtType || this.json.attachmentExtType.indexOf("other")!=-1 && !this.json.attachmentExtOtherType){
  711. }else{
  712. accepts = [];
  713. var otherType = this.json.attachmentExtOtherType;
  714. this.json.attachmentExtType.each(function(v){
  715. switch (v) {
  716. case "word":
  717. accepts.push(".doc, .docx, .dot, .dotx");
  718. break;
  719. case "excel":
  720. accepts.push(".xls, .xlsx, .xlsm, .xlt, .xltx");
  721. break;
  722. case "ppt":
  723. accepts.push(".pptx, .ppt, .pot, .potx, .potm");
  724. break;
  725. case "txt":
  726. accepts.push(".txt");
  727. break;
  728. case "pic":
  729. accepts.push(".bmp, .gif, .psd, .jpeg, .jpg");
  730. break;
  731. case "pdf":
  732. accepts.push(".pdf");
  733. break;
  734. case "zip":
  735. accepts.push(".zip, .rar");
  736. break;
  737. case "audio":
  738. accepts.push(".mp3, .wav, .wma, .wmv, .flac, .ape");
  739. break;
  740. case "video":
  741. accepts.push(".avi, .mkv, .mov, .ogg, .mp4, .mpeg");
  742. break;
  743. case "other":
  744. if (this.json.attachmentExtOtherType) accepts.push(this.json.attachmentExtOtherType);
  745. break;
  746. }
  747. });
  748. accept = accepts.join(", ");
  749. }
  750. var size = 0;
  751. if (this.json.attachmentSize) size = this.json.attachmentSize.toFloat();
  752. this.attachmentController.doUploadAttachment({"site": this.json.id}, this.form.workAction.action, "replaceAttachment",
  753. {"id": attachment.data.id, "workid": this.form.businessData.work.id}, null, function(o){
  754. this.form.workAction.getAttachment(attachment.data.id, this.form.businessData.work.id, function(json){
  755. attachment.data = json.data;
  756. attachment.reload();
  757. this.attachmentController.checkActions();
  758. }.bind(this))
  759. }.bind(this), null, true, accept, size);
  760. // this.replaceFileAreaNode = new Element("div");
  761. // var html = "<input name=\"file\" type=\"file\" multiple/>";
  762. // this.replaceFileAreaNode.set("html", html);
  763. //
  764. // this.fileReplaceNode = this.replaceFileAreaNode.getFirst();
  765. // this.fileReplaceNode.addEvent("change", function(){
  766. //
  767. // var files = this.fileReplaceNode.files;
  768. // if (files.length){
  769. // for (var i = 0; i < files.length; i++) {
  770. // var file = files.item(i);
  771. //
  772. // var formData = new FormData();
  773. // formData.append('file', file);
  774. // // formData.append('site', this.json.id);
  775. //
  776. // this.form.workAction.replaceAttachment(attachment.data.id, this.form.businessData.work.id ,function(o, text){
  777. // this.form.workAction.getAttachment(attachment.data.id, this.form.businessData.work.id, function(json){
  778. // attachment.data = json.data;
  779. // attachment.reload();
  780. // this.attachmentController.checkActions();
  781. // }.bind(this))
  782. // }.bind(this), null, formData, file);
  783. // }
  784. // }
  785. // }.bind(this));
  786. },
  787. replaceAttachmentFile: function(attachment){
  788. //if (!this.replaceFileAreaNode){
  789. this.createReplaceFileNode(attachment);
  790. // }
  791. // this.fileReplaceNode.click();
  792. },
  793. downloadAttachment: function(e, node, attachments){
  794. if (this.form.businessData.work){
  795. attachments.each(function(att){
  796. if (window.o2android && window.o2android.downloadAttachment){
  797. window.o2android.downloadAttachment(att.data.id);
  798. }else if(window.webkit && window.webkit.messageHandlers) {
  799. window.webkit.messageHandlers.downloadAttachment.postMessage({"id": att.data.id, "site": this.json.id});
  800. }else{
  801. this.form.workAction.getAttachmentStream(att.data.id, this.form.businessData.work.id);
  802. }
  803. }.bind(this));
  804. }else{
  805. attachments.each(function(att){
  806. if (window.o2android && window.o2android.downloadAttachment){
  807. window.o2android.downloadAttachment(att.data.id);
  808. }else if(window.webkit && window.webkit.messageHandlers) {
  809. window.webkit.messageHandlers.downloadAttachment.postMessage({"id": att.data.id, "site": this.json.id});
  810. }else{
  811. this.form.workAction.getWorkcompletedAttachmentStream(att.data.id, this.form.businessData.workCompleted.id);
  812. }
  813. }.bind(this));
  814. }
  815. },
  816. openAttachment: function(e, node, attachments){
  817. if (this.form.businessData.work && !this.form.businessData.work.completedTime){
  818. attachments.each(function(att){
  819. if (window.o2android && window.o2android.downloadAttachment){
  820. window.o2android.downloadAttachment(att.data.id);
  821. }else if(window.webkit && window.webkit.messageHandlers) {
  822. window.webkit.messageHandlers.downloadAttachment.postMessage({"id": att.data.id, "site": this.json.id});
  823. }else {
  824. this.form.workAction.getAttachmentData(att.data.id, this.form.businessData.work.id);
  825. }
  826. }.bind(this));
  827. }else{
  828. attachments.each(function(att){
  829. if (window.o2android && window.o2android.downloadAttachment){
  830. window.o2android.downloadAttachment(att.data.id);
  831. }else if(window.webkit && window.webkit.messageHandlers) {
  832. window.webkit.messageHandlers.downloadAttachment.postMessage(att.data.id, this.json.id);
  833. }else {
  834. this.form.workAction.getWorkcompletedAttachmentData(att.data.id, ((this.form.businessData.workCompleted) ? this.form.businessData.workCompleted.id : this.form.businessData.work.id));
  835. }
  836. }.bind(this));
  837. }
  838. //this.downloadAttachment(e, node, attachment);
  839. },
  840. getAttachmentUrl: function(attachment, callback){
  841. if (this.form.businessData.work){
  842. this.form.workAction.getAttachmentUrl(attachment.data.id, this.form.businessData.work.id, callback);
  843. }else{
  844. this.form.workAction.getAttachmentWorkcompletedUrl(attachment.data.id, this.form.businessData.workCompleted.id, callback);
  845. }
  846. },
  847. createErrorNode: function(text){
  848. var node = new Element("div");
  849. var iconNode = new Element("div", {
  850. "styles": {
  851. "width": "20px",
  852. "height": "20px",
  853. "float": "left",
  854. "background": "url("+"/x_component_process_Xform/$Form/default/icon/error.png) center center no-repeat"
  855. }
  856. }).inject(node);
  857. var textNode = new Element("div", {
  858. "styles": {
  859. "line-height": "20px",
  860. "margin-left": "20px",
  861. "color": "red",
  862. "word-break": "keep-all"
  863. },
  864. "text": text
  865. }).inject(node);
  866. return node;
  867. },
  868. notValidationMode: function(text){
  869. if (!this.isNotValidationMode){
  870. this.isNotValidationMode = true;
  871. this.node.store("borderStyle", this.node.getStyles("border-left", "border-right", "border-top", "border-bottom"));
  872. this.node.setStyle("border", "1px solid red");
  873. this.errNode = this.createErrorNode(text).inject(this.node, "after");
  874. this.showNotValidationMode(this.node);
  875. }
  876. },
  877. showNotValidationMode: function(node){
  878. var p = node.getParent("div");
  879. if (p){
  880. if (p.get("MWFtype") == "tab$Content"){
  881. if (p.getParent("div").getStyle("display")=="none"){
  882. var contentAreaNode = p.getParent("div").getParent("div");
  883. var tabAreaNode = contentAreaNode.getPrevious("div");
  884. var idx = contentAreaNode.getChildren().indexOf(p.getParent("div"));
  885. var tabNode = tabAreaNode.getLast().getFirst().getChildren()[idx];
  886. tabNode.click();
  887. p = tabAreaNode.getParent("div");
  888. }
  889. }
  890. this.showNotValidationMode(p);
  891. }
  892. },
  893. validationMode: function(){
  894. if (this.isNotValidationMode){
  895. this.isNotValidationMode = false;
  896. this.node.setStyles(this.node.retrieve("borderStyle"));
  897. if (this.errNode){
  898. this.errNode.destroy();
  899. this.errNode = null;
  900. }
  901. }
  902. },
  903. validationConfigItem: function(routeName, data){
  904. var flag = (data.status=="all") ? true: (routeName == data.decision);
  905. if (flag){
  906. var n = this.getData();
  907. var v = (data.valueType=="value") ? n : n.length;
  908. switch (data.operateor){
  909. case "isnull":
  910. if (!v){
  911. this.notValidationMode(data.prompt);
  912. return false;
  913. }
  914. break;
  915. case "notnull":
  916. if (v){
  917. this.notValidationMode(data.prompt);
  918. return false;
  919. }
  920. break;
  921. case "gt":
  922. if (v>data.value){
  923. this.notValidationMode(data.prompt);
  924. return false;
  925. }
  926. break;
  927. case "lt":
  928. if (v<data.value){
  929. this.notValidationMode(data.prompt);
  930. return false;
  931. }
  932. break;
  933. case "equal":
  934. if (v==data.value){
  935. this.notValidationMode(data.prompt);
  936. return false;
  937. }
  938. break;
  939. case "neq":
  940. if (v!=data.value){
  941. this.notValidationMode(data.prompt);
  942. return false;
  943. }
  944. break;
  945. case "contain":
  946. if (v.indexOf(data.value)!=-1){
  947. this.notValidationMode(data.prompt);
  948. return false;
  949. }
  950. break;
  951. case "notcontain":
  952. if (v.indexOf(data.value)==-1){
  953. this.notValidationMode(data.prompt);
  954. return false;
  955. }
  956. break;
  957. }
  958. }
  959. return true;
  960. },
  961. validationConfig: function(routeName, opinion){
  962. if (this.json.validationConfig){
  963. if (this.json.validationConfig.length){
  964. for (var i=0; i<this.json.validationConfig.length; i++) {
  965. var data = this.json.validationConfig[i];
  966. if (!this.validationConfigItem(routeName, data)) return false;
  967. }
  968. }
  969. return true;
  970. }
  971. return true;
  972. },
  973. validation: function(routeName, opinion){
  974. if (!this.validationConfig(routeName, opinion)) return false;
  975. if (!this.json.validation) return true;
  976. if (!this.json.validation.code) return true;
  977. var flag = this.form.Macro.exec(this.json.validation.code, this);
  978. if (!flag) flag = MWF.xApplication.process.Xform.LP.notValidation;
  979. if (flag.toString()!="true"){
  980. this.notValidationMode(flag);
  981. return false;
  982. }
  983. return true;
  984. }
  985. });