TablePermission.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. //<script type="text/javascript" src="${ctx}/js/hotent/platform/form/TablePermission.js"></script>
  2. var TablePermission = {
  3. init : function(){
  4. TablePermission.handleMainTableRequest();
  5. if(typeof permission !="undefined"){
  6. TablePermission.handleSubTable(permission);
  7. }
  8. TablePermission.handlePerTag();//处理表单中的权限控制字段
  9. },
  10. /**
  11. * 主表的权限补充(必埴)
  12. *
  13. */
  14. handleMainTableRequest:function(){
  15. //主表的附件必埴验证问题
  16. $("div[name=div_attachment_container]").each(function() {
  17. var div_me=$(this);
  18. if(div_me.attr("right")!='b') return true;
  19. $("a.link",div_me).each(function(){
  20. var me=$(this);
  21. var validRule = me.attr("validate");
  22. if ( validRule != null && 'undefined' != validRule.toLowerCase() && validRule.length>2 ){
  23. var json = eval('(' + validRule + ')');
  24. if(!json.required){
  25. var jsonStr = validRule.substring(0, validRule.lastIndexOf('}'));
  26. jsonStr +=",'required':true}"; //加上必填
  27. me.attr("validate",jsonStr);
  28. }
  29. }else{
  30. me.attr("validate","{'required':true}"); //必填
  31. }
  32. });
  33. });
  34. },
  35. /**
  36. * 开始处理子表权限
  37. * 这里简单说一下当前我们权限整个过程
  38. * 首先在展示表单时会读取表单中保存的template,然后利用freemaker来将其跟数据结合
  39. * 主表字段在这次结合时会连同权限一起解析出来,而子表字段只会解析出数据并不会处理权限,而是交给页面的js来处理
  40. * (ps:俺已经试过在freemaker也处理掉子表字段的权限,但确实繁琐和艰难,有意者可以自行尝试-。-)
  41. *
  42. * permission: 参数拼装可以参考BpmFormHandlerService.java中的obtainHtml
  43. */
  44. handleSubTable : function(permission){
  45. var subFieldJson =permission["subFieldJson"];//子表新版本字段权限
  46. var subTableShow =permission["subTableShow"];
  47. $('div[type=subtable]').each(function() {
  48. //子表
  49. var table = $(this);
  50. var tableName = table.attr('tableName').toLowerCase();
  51. table.attr('tableName',tableName);
  52. table.attr('right','w');//子表非隐藏状态,则需要给编辑或必填权限才能显示
  53. //是否 只读 编辑 隐藏 决定子表的权限
  54. for(var key in subTableShow){
  55. var tableShow=subTableShow[key];
  56. if(tableName!=key.toLowerCase()) continue;
  57. TablePermission.handleSubTableShow(table,tableShow);
  58. }
  59. //处理子表字段权限
  60. for(var key in subFieldJson){
  61. var json=subFieldJson[key];
  62. if(tableName!=key.toLowerCase()) continue;
  63. for(var k in json){
  64. TablePermission.handleSubTableField(table,k,json[k],key);
  65. }
  66. }
  67. });
  68. },
  69. /**
  70. * 解析一个子表show权限
  71. * @param tableShow
  72. * @returns
  73. */
  74. handleSubTableShow : function(table,show){
  75. if(show['y']== 'true'){//隐藏的话下面的操作就没必要了
  76. table.attr('show','false');
  77. table.attr('right','y'); //子表编辑功能
  78. table.remove();
  79. return;
  80. }else{
  81. table.attr('show','true'); //子表表单可见
  82. }
  83. if(show['b']== 'true'){//必填
  84. table.attr('right','b'); //子表编辑功能或者必填
  85. }
  86. var removeItemCount=0;
  87. var menu = CustomForm.tables[table.attr("tablename")].menu;
  88. if(!menu) return;
  89. if(show['addRow']== 'false'){//不可新增
  90. $("a.link",table).remove();//去除所有a.link的按钮
  91. $("a.extend",table).each(function(){ // 导入导出按钮的特殊处理
  92. var extend=$(this);
  93. if(typeof extend.attr("importexcel") != "undefined"
  94. ||typeof extend.attr("exportexcel") != "undefined"){
  95. extend.remove();
  96. }
  97. });
  98. var items=[];
  99. for(var i=0,itemIndex=1;i<menu.options.items.length;i++){
  100. var item=menu.options.items[i];
  101. if(!item.text){
  102. continue;
  103. }
  104. if(item.text.indexOf("插入记录")!=-1){
  105. menu.removeItem(itemIndex);
  106. removeItemCount++;
  107. }
  108. itemIndex++;
  109. }
  110. }
  111. if(show['del']== 'false'){//不可删除
  112. var items=[];
  113. for(var i=0,itemIndex=1;i<menu.options.items.length;i++){
  114. var item=menu.options.items[i];
  115. if(!item.text){
  116. continue;
  117. }
  118. if(item.text.indexOf("删除")!=-1){
  119. menu.removeItem(itemIndex);
  120. removeItemCount++;
  121. }
  122. itemIndex++;
  123. }
  124. }
  125. if(menu.menuItemCount==removeItemCount){
  126. delete menu;
  127. $(table).find('[formType="newrow"]').each(function() {
  128. $(this).unbind("contextmenu");
  129. });
  130. }
  131. },
  132. /**
  133. * 解析一个子表字段的权限
  134. */
  135. handleSubTableField :function(table,fieldName,right,tableName){
  136. var name = "s:"+tableName+":"+fieldName;//字段在HTML的真实NAME
  137. if(right==""){//没有权限
  138. table.find("[name='"+name+"']").each(function(){
  139. $(this).closest("td").html("");
  140. });
  141. }
  142. if(right=="r"){//只读
  143. //处理超链接
  144. $("a.link",table).each(function(){ //只读时,历遍超链接
  145. var link=$(this);
  146. if(name==link.attr('name')||name==link.attr('field')){
  147. link.remove(); //只读时,删除(可能会有多个一样的,要删除所以不能用return false break)
  148. }
  149. });
  150. //处理自定义按钮对话框的权限问题(这里只是处理字表上的)
  151. $("a.extend",table).each(function(){//只读时,历遍超链接中自定义对话框的按钮
  152. var extend=$(this);
  153. var permissionName = extend.attr('permissionName');
  154. if(permissionName){
  155. var filedName = "s:"+tableName+":"+permissionName;
  156. if(filedName==name){
  157. extend.remove(); //只读时,删除(可能会有多个一样的)
  158. }
  159. return true;
  160. }
  161. var jsonStr = extend.attr('eventbtn');
  162. if(jsonStr != null && 'undefined' != jsonStr.toLowerCase() && jsonStr.length>2 ){
  163. var jsonObjArray = eval('(' + jsonStr + ')');
  164. for(var j =0,jsonObj;jsonObj=jsonObjArray[j++];){
  165. var fileds = jsonObj.fields;
  166. for ( var i = 0; i < fileds.length; i++) {
  167. var targetArr = fileds[i].target;
  168. for ( var k = 0,target;target=targetArr[k++];){
  169. var filed =target.split("-")[1];
  170. var filedName = "s:"+tableName+":"+filed;
  171. if(filedName==name){
  172. extend.remove(); //只读时,删除(可能会有多个一样的)
  173. break;
  174. }
  175. }
  176. }
  177. }
  178. }
  179. });
  180. //处理其它
  181. $("input:visible,textarea:visible,select:visible",table).each(function(){
  182. var me=$(this);
  183. if(name.toLowerCase()!=me.attr('name').toLowerCase()) return true; //即是 continue;
  184. me.attr("right",right);
  185. var isSelect=me.is("select");
  186. var isTextarea=me.is("textarea");
  187. var isCheckboxOrRadio = false; //单选或者复选
  188. var type = me.attr("type"); //标签种类
  189. if(type=="checkbox"||type=="radio"){
  190. isCheckboxOrRadio = true;
  191. }
  192. var val ='';
  193. var validRule = me.attr("validate");
  194. if ( validRule && 'undefined' != validRule.toLowerCase() ){
  195. var json = eval('(' + validRule + ')');
  196. if(json.isWebSign){
  197. var lablename = me.attr("lablename");
  198. if(isSelect){
  199. val = '<input name="'+name+'" lablename="'+lablename+'" type="hidden" validate="{\'isWebSign\':true}" value="'+me.attr("val")+'" />';
  200. }else if(isTextarea){
  201. val = '<textarea name="'+name+'" lablename="'+lablename+'" class="hidden" validate="{\'isWebSign\':true}" >'+me.val()+'</textarea>'
  202. }else{
  203. val = '<input name="'+name+'" lablename="'+lablename+'" type="hidden" validate="{\'isWebSign\':true}" value="'+me.val()+'" />';
  204. }
  205. }
  206. }
  207. if(isSelect){
  208. val += CustomForm.selectValue(me);
  209. me.before(val);
  210. me.remove();
  211. }else if(isCheckboxOrRadio){
  212. me.attr("disabled","disabled");
  213. }else{
  214. val += me.val();
  215. var refid=me.attr("refid");
  216. if(typeof(refid)!=undefined && refid!=null&&refid!=''){
  217. var refids=me.prev("input[name='"+refid+"']").val();
  218. var linkType=me.attr("linktype");
  219. var tempval="<div>";
  220. var nametemp = new Array();
  221. var str = me.val();
  222. if(typeof(str)!=undefined && str!=null&&str!=''){
  223. nametemp = str.split(",");
  224. }
  225. if(refids){
  226. var id=refids.split(",");
  227. for(var i=0;i<id.length; i++){
  228. // 先去掉浮标背景
  229. //tempval+="<span class='backgrounddiv'><a refid='"+id[i]+"' href='#' linktype='"+linkType+"' style='text-decoration:none'>"+nametemp[i]+"</a> </span>";
  230. tempval+="<span>"+nametemp[i]+"</span>";
  231. }
  232. }else{
  233. for(var i=0;i<nametemp.length; i++){
  234. //tempval+="<span class='backgrounddiv'>"+nametemp[i]+"</span>";
  235. tempval+="<span>"+nametemp[i]+"</span>";
  236. }
  237. }
  238. tempval+="</div>";
  239. val = tempval;
  240. }
  241. //替换 /n 为<br/>
  242. if(val) val = val.replace(/\n/g,"<br/>");
  243. me.before(val);
  244. me.remove();
  245. }
  246. });
  247. }
  248. if(right=="b"){
  249. $("input:visible,textarea:visible,select:visible,a:visible",table).each(function(){
  250. var me=$(this);
  251. me.attr("right",right);
  252. var isSelect=me.is("a"); //这个一般情况是子表的附件上传功能的 链接必填问题
  253. var objName = "";
  254. if(isSelect){
  255. objName = me.attr('field');
  256. }else{
  257. objName = me.attr('name');
  258. }
  259. if(name!=objName) return true;
  260. var validRule = me.attr("validate");
  261. if ( validRule != null && 'undefined' != validRule.toLowerCase() && validRule.length>2 ){
  262. var json = eval('(' + validRule + ')');
  263. if(!json.required){
  264. var jsonStr = validRule.substring(0, validRule.lastIndexOf('}'));
  265. jsonStr +=",\'required\':true}"; //加上必填
  266. me.attr("validate",jsonStr);
  267. }
  268. }else{
  269. me.attr("validate","{\'required\':true}"); //必填
  270. }
  271. });
  272. }
  273. },
  274. handlePerTag : function(){
  275. $("[permission]").each(function(){
  276. var expr = $(this).attr("permission");
  277. try{
  278. var b = eval(expr);
  279. if(!b){
  280. $(this).remove();
  281. }
  282. }catch(e){
  283. }
  284. });
  285. //另外处理一下子表row
  286. $('div[type=subtable]').each(function() {
  287. var row=$($(this).data("row"));
  288. row.find("[permission]").each(function(){
  289. var expr = $(this).attr("permission");
  290. try{
  291. var b = eval(expr);
  292. if(!b){
  293. $(this).remove();
  294. }
  295. }catch(e){
  296. }
  297. });
  298. $(this).data("row",row[0].outerHTML);
  299. });
  300. }
  301. }