[关闭]
@ruoli 2016-08-28T08:15:12.000000Z 字数 2774 阅读 1697

工作流表单中编辑与查看模式控制实现

Activiti


1、功能背景

a.在工作流表单中,输入控件的编辑权限应根据业务要求灵活控制,每个工作流处理环节都可能有自己可输入的字段,页面控制当前环节只允许录入自己可被输入的字段,其他字段应以查看模式展示.
b.在查看待办时可输入和修改自己有权限的字段,但是在查看已办时,则整体表单进入查看模式。

总结,流程表单中的每个字段都有可能被某一个或者个多个环节进行编辑,除了这些授予编辑权限的环节,其他环节都是不可编辑的,总的来说,页面字段的可编辑权限控制的粒度是流程环节。

2、功能设计

基于流程表单中每个可输入控件,搭配流程环节进行控制,可通过 输入控件自定义属性来实现,例如如下:

  1. <input id="name" name="name" data-edit="提出申请,项目经理审批" />
  2. <input id="age" name="age" data-edit="|" />
  3. <input id="subtext" name="subtext" data-edit="*" />

以上代码中,data-edit="提出申请,项目经理审批" 代表 此字段在 提出申请、项目经理审批 这两个环节可被编辑,data-edit="|" 代表在待办状态是可被编辑,data-edit="*" 代表在任意状态都可被编辑。

这样控制,是以最简单灵活的方式去实现,而且便于扩展,看到字段就一眼可以看出他的控制逻辑。

3、功能实现

页面引入base.form.js即可,可根据具体业务逻辑局部修改,代码如下:

  1. var commonJs={
  2. viewForm:function(){
  3. //查看已办状态时(status=finish):所有输入框 切换为 span 状态,操作对象隐藏
  4. //办理待办状态时(status=todo):操作对象 data-edit属性 与 当前环节名称相同时可操作,否则不可操作。
  5. //备注:data-edit 为 可编辑环节, data-edit为空时也可编辑。
  6. var activityName=$("input[name='act.taskName']").val();//当前所在环节
  7. var status=$("input[name='act.status']").val();//当前处理形式
  8. //如果当前环节为空,则代表是第一个录入环节,直接跳过处理。
  9. if(activityName=='' && status!='finish'){
  10. return;
  11. }
  12. //select2
  13. $("select[class*=select2-offscreen]").each(function(){
  14. var ifView=commonJs.ifView(this,activityName,status);
  15. if(ifView){
  16. var name=$(this).attr("name");
  17. var value=$(this).find("option:selected").val();
  18. var text=$(this).find("option:selected").text();
  19. var colBox=$(this).closest("div[class*='col-']");
  20. commonJs.setView(colBox,name,value,text);
  21. }
  22. });
  23. //Input 输入框
  24. $("input[type=text][name],textarea").each(function(){
  25. //
  26. var ifView=commonJs.ifView(this,activityName,status);
  27. if(ifView){
  28. var text=$(this).val();
  29. var colBox=$(this).closest("div[class*='col-']");
  30. commonJs.setView(colBox,$(this).attr("name"),$(this).val(),null);
  31. }
  32. });
  33. //按钮
  34. $("a[class=btn],input[type=button],input[type=submit],button").each(function(){
  35. var ifView=commonJs.ifView(this,activityName,status);
  36. if(ifView){
  37. $(this).remove();
  38. }
  39. });
  40. //其他
  41. $("*[data-edit]").each(function(){
  42. var ifView=commonJs.ifView(this,activityName,status);
  43. if(ifView){
  44. $(this).remove();
  45. }
  46. });
  47. },
  48. //此方法用于判断单个控件是否可被隐藏,判断前提是:activityName不为空
  49. ifView:function(node,activityName,status){
  50. var dataEdit=$(node).attr("data-edit");
  51. if(typeof(dataEdit) != "undefined"
  52. && (
  53. dataEdit=="*" //data-edit=* ,所有环节 都可操作
  54. || (dataEdit=="|" && status=="todo" ) //data-edit=|,待办可操作,已办不可操作
  55. || ($.inArray(activityName, dataEdit.split(','))>=0 && (status=="todo" || status=="edit") ) //data-edit=处理环节名,指定环节名在待办时可操作
  56. )
  57. ){
  58. return false;//可编辑
  59. }else{
  60. return true;//不可编辑
  61. }
  62. },
  63. //此方法用于设置隐藏,并移动隐藏域的位置
  64. setView:function(colBox,name,value,text){
  65. //判断colBox下是否有隐藏文本域,如果有则移动
  66. var hiddenList=colBox.find("input[type=hidden][name]");
  67. colBox.addClass("form-label").children().remove();
  68. hiddenList.each(function(){
  69. colBox.append($(this));
  70. });
  71. colBox.append("<input type='hidden' name='"+name+"' value='"+value+"' /><span>"+(text==null?value==null?'':value:text)+"</span>");
  72. }
  73. }
  74. $(document).ready(function() {
  75. commonJs.viewForm();
  76. }
  77. );
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注