Permission.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. /**
  2. * 表单权限。
  3. * @returns {Permission}
  4. */
  5. Permission=function(){
  6. {
  7. this.FieldsPermission=[];
  8. this.SubTablePermission=[];
  9. this.SubTableFilePermission=[];
  10. this.subTableShows=[];
  11. this.Opinion=[];
  12. };
  13. /**
  14. * 获取默认权限对象。
  15. */
  16. this.getDefaultPermission=function(name,memo){
  17. var permission={"title":name,"memo":memo,"read": {"type":"everyone","id":"", "fullname":""},"write":{"type":"everyone","id":"", "fullname":""},"required":{"type":"everyone","id":"", "fullname":""}};
  18. return permission;
  19. };
  20. /**
  21. * 从数据库加载权限,并初始化html表格状态。
  22. * 需要传入tableId,formDefId。
  23. * 如果是新建表单,权限根据表获取。
  24. * 如果是更新表单,权限从表单权限获取。
  25. */
  26. this.loadPermission=function(formKey){
  27. var params={formKey:formKey};
  28. this.load("getPermissionSetting.ht", params);
  29. };
  30. /**
  31. * 从数据库加载权限,并初始化html表格状态。
  32. */
  33. this.loadByNode=function(actDefId, nodeId,formKey,parentActDefId){
  34. var params={actDefId:actDefId,nodeId:nodeId,formKey:formKey,parentActDefId:parentActDefId};
  35. this.load("getPermissionSetting.ht", params);
  36. };
  37. /**
  38. * 从数据库加载权限,并初始化html表格状态。
  39. */
  40. this.loadByActDefId=function(actDefId,formKey,parentActDefId){
  41. var params={actDefId:actDefId,formKey:formKey,parentActDefId:parentActDefId};
  42. this.load("getPermissionSetting.ht", params);
  43. };
  44. this.load=function(url,params){
  45. var _self=this;
  46. $.ligerDialog.waitting("正在加载表单权限,请稍后...");
  47. $.post(url, params,function(data){
  48. $.ligerDialog.closeWaitting();
  49. var fields =data["field"];
  50. var tables =data["table"];
  51. var opinions =data["opinion"];
  52. var tableShows =data["tableShow"];
  53. //字段权限。
  54. if(fields!=undefined && fields!=''){
  55. _self.FieldsPermission=fields;
  56. var fieldHtml=_self.getPermission(_self.FieldsPermission,"field");
  57. $("#fieldPermission").empty();
  58. $("#fieldPermission").append(fieldHtml);
  59. _self.initStatus("fieldPermission");
  60. }
  61. //子表权限
  62. if(tables!=undefined && tables!=''){
  63. _self.SubTablePermission=tables;
  64. _self.setSubTableFilePermission(tables);
  65. var tableHtml=_self.getPermission(_self.SubTablePermission,"subtable");
  66. $("#tablePermission").empty();
  67. $("#tablePermission").append(tableHtml);
  68. for ( var i = 0; i < _self.SubTablePermission.length; i++) { //按子表table的ID区域去初始化控件状态
  69. var tablePermission=_self.SubTablePermission[i];
  70. _self.initStatus("tableId_"+tablePermission.title);
  71. }
  72. }else{
  73. $("#tablePermission").closest( 'table' ).hide();
  74. }
  75. //意见权限。
  76. if(opinions!=undefined && opinions!=''){
  77. _self.Opinion=opinions;
  78. var opinionHtml=_self.getPermission(_self.Opinion,"opinion");
  79. $("#opinionPermission").empty();
  80. $("#opinionPermission").append(opinionHtml);
  81. _self.initStatus("opinionPermission");
  82. }else{
  83. $("#opinionPermission").closest( 'table' ).hide();
  84. }
  85. //子表是否显示。
  86. if(tableShows!=undefined && tableShows!=''){
  87. _self.subTableShows=tableShows;
  88. _self.initSubTableCheck(_self.subTableShows);
  89. }
  90. });
  91. _self.handChange();
  92. _self.handClick();
  93. };
  94. /**
  95. * 加载完权限后,修改子表是否显示的复选框。
  96. */
  97. this.initSubTableCheck=function(tableShows){
  98. for(var i=0;i<tableShows.length;i++){
  99. var objPermission=tableShows[i];
  100. var scope = "#thead_"+objPermission.title;
  101. var objScope=$(scope);
  102. var show = objPermission.show;
  103. if(!show) show = {};
  104. var jsonLen = 0;
  105. for(var obj in show){
  106. jsonLen++;
  107. }
  108. if(jsonLen!=4){
  109. $('input:checkbox[value="addRow"]',objScope).attr("checked",true);
  110. $('input:checkbox[value="addRow"]',objScope).attr("show",'true');
  111. continue;
  112. }
  113. $('input:checkbox[name^="checkbox_"]',objScope).each(function(){ //设置objPermission.showr的值为当前选中项
  114. var self = $(this);
  115. var value = self.val();
  116. var val=show[value]=="true";
  117. self.attr("checked",val);
  118. });
  119. }
  120. };
  121. /**
  122. * 加载完权限表格后,修改控件的状态。
  123. */
  124. this.initStatus=function(id){
  125. var _self=this;
  126. $("tr","#"+id).each(function(){
  127. var trObj=$(this);
  128. //取得下拉框
  129. var selReadObj=$("select.r_select",trObj);
  130. var selWriteObj=$("select.w_select",trObj);
  131. var selRequiredObj=$("select.b_select",trObj);
  132. //值为user,everyone,none,role,orgMgr,pos等。
  133. //查看下拉框
  134. var rPermissonType=selReadObj.attr("permissonType");
  135. var wPermissonType=selWriteObj.attr("permissonType");
  136. var bPermissonType=selRequiredObj.attr("permissonType");
  137. //初始化下拉框选中。
  138. selReadObj.val(rPermissonType);
  139. selWriteObj.val(wPermissonType);
  140. selRequiredObj.val(bPermissonType);
  141. //是否显示选中的人员或岗位等信息。
  142. var spanReadObj=$("span[name='r_span']",trObj);
  143. var spanWriteObj=$("span[name='w_span']",trObj);
  144. var spanRequiredObj=$("span[name='b_span']",trObj);
  145. //初始化是否显示选择人员
  146. _self.showSpan(rPermissonType,spanReadObj);
  147. _self.showSpan(wPermissonType,spanWriteObj);
  148. _self.showSpan(bPermissonType,spanRequiredObj);
  149. });
  150. };
  151. /**
  152. * 处理下拉框change事件。
  153. */
  154. this.handChange=function(){
  155. var _self=this;
  156. $("#fieldPermission,#tablePermission,#opinionPermission").delegate("select.r_select,select.w_select,select.b_select","change",function(){
  157. var obj=$(this);
  158. var spanObj=obj.next();
  159. //当用户权限类型修改时,同时修改span的显示。
  160. _self.showSpan(obj.val(), spanObj);
  161. var trObj=obj.parents("tr");
  162. var tbodyObj=obj.parents("tbody");
  163. //read,write
  164. //read,write,required
  165. var mode="read";
  166. if(obj.attr("class")=="r_select")
  167. mode ="read";
  168. else if (obj.attr("class")=="w_select")
  169. mode = "write";
  170. else if (obj.attr("class")=="b_select")
  171. mode = "required";
  172. //var mode=(obj.attr("class")=="r_select")?"read":"write";
  173. //获取行在表格中的索引
  174. var idx=tbodyObj.children().index(trObj);
  175. //权限类型(field,subtable,opinion)
  176. var permissionType=trObj.attr("type");
  177. var selType=obj.val();
  178. var txtObj=$("input:text",spanObj);
  179. var idObj=$("input:hidden",spanObj);
  180. txtObj.val("");
  181. idObj.val("");
  182. });
  183. };
  184. /**
  185. * 处理选择人员,岗位,组织,角色点击事件。
  186. */
  187. this.handClick=function(){
  188. var _self=this;
  189. $("#fieldPermission,#tablePermission,#opinionPermission").delegate("a.link-get","click",function(){
  190. var obj=$(this);
  191. var txtObj=obj.prev(); //select 对象的前一个对象
  192. var idObj=txtObj.prev();
  193. var selObj=obj.parent().prev();
  194. var selType=selObj.val();
  195. var callback = function(ids, names) {
  196. var trObj=obj.parents("tr");
  197. var tbodyObj=obj.parents("tbody");
  198. txtObj.val(names);
  199. idObj.val(ids);
  200. };
  201. var ids = idObj.val();
  202. var names = txtObj.val();
  203. switch(selType){
  204. case "user":
  205. UserDialog({
  206. selectUserIds:ids,
  207. selectUserNames:names,
  208. callback : callback
  209. });
  210. break;
  211. case "role":
  212. RoleDialog({
  213. ids:ids,
  214. names:names,
  215. callback : callback
  216. });
  217. break;
  218. case "org":
  219. case "orgMgr":
  220. OrgDialog({
  221. ids:ids,
  222. names:names,
  223. callback : callback
  224. });
  225. break;
  226. case "pos":
  227. PosDialog({
  228. ids:ids,
  229. names:names,
  230. callback : callback
  231. });
  232. break;
  233. case "script":
  234. ScriptDialog({
  235. callback: function(script){
  236. txtObj.val(script);
  237. }
  238. })
  239. break;
  240. }
  241. });
  242. };
  243. /**
  244. * 是否显示选择框
  245. */
  246. this.showSpan=function(permissionType,spanObj){
  247. switch(permissionType){
  248. case "user":
  249. case "role":
  250. case "org":
  251. case "orgMgr":
  252. case "pos":
  253. case "script":
  254. spanObj.show();
  255. break;
  256. case "everyone":
  257. case "none":
  258. spanObj.hide();
  259. break;
  260. }
  261. var fullNameObj=$("textarea",spanObj);
  262. var idObj=$("input",spanObj);
  263. if(permissionType=="script"){
  264. fullNameObj.removeAttr("readonly");
  265. }
  266. else{
  267. fullNameObj.attr("readonly","true");
  268. }
  269. };
  270. /**
  271. * 根据权限集合和权限类型获取权限的html,代码。
  272. */
  273. this.getPermission=function(aryPermission,type){
  274. var sb=new StringBuffer();
  275. if(type=='subtable'){
  276. for(var i=0;i<aryPermission.length;i++){
  277. var tablePermission=aryPermission[i];
  278. var fieldPermission=tablePermission.subField;
  279. var additionalHtml = "";
  280. for(var j=0;j<fieldPermission.length;j++){
  281. additionalHtml += this.getHtml(fieldPermission[j], type);
  282. }
  283. tablePermission.additionalHtml = additionalHtml;
  284. var template = $('#subtableTemplate').text();
  285. var subTableHtml = easyTemplate(template,tablePermission);
  286. sb.append(subTableHtml);
  287. }
  288. }else{
  289. for(var i=0;i<aryPermission.length;i++){
  290. var str=this.getHtml(aryPermission[i], type);
  291. sb.append(str);
  292. }
  293. }
  294. return sb.toString();
  295. };
  296. /**
  297. * 由子表权限解析并获取子表字段的权限并放入subTableFilePermission。
  298. */
  299. this.setSubTableFilePermission=function(tables){
  300. //将字表的字段权限入到_self.SubTableFilePermission数组
  301. for(var i=0;i<tables.length;i++){
  302. var tablePermission=tables[i];
  303. var fieldPermission=tablePermission.subField;
  304. for(var j=0;j<fieldPermission.length;j++){
  305. var objPermission=fieldPermission[j];
  306. this.SubTableFilePermission.push(objPermission);
  307. }
  308. }
  309. };
  310. /**
  311. * 根据权限对象和权限类型(字段,子表,意见)获取一行的显示。
  312. */
  313. this.getHtml=function(permission,type){
  314. var tdTemplate = $('#tdTemplate').html();
  315. var tdData = {right:'r' ,permission:permission}; // 只读模板
  316. var readHtml = easyTemplate(tdTemplate.replaceAll('#rightName', 'read'),tdData).toString();
  317. tdData.right = 'w'; // 编辑模板
  318. var writeHtml = easyTemplate(tdTemplate.replaceAll('#rightName', 'write'),tdData).toString();
  319. tdData.right = 'b'; // 必填模板
  320. var requiredHtml = easyTemplate(tdTemplate.replaceAll('#rightName', 'required'),tdData).toString();
  321. var data = {"permission":permission, "type":type, "requiredHtml":requiredHtml,
  322. "readHtml":readHtml, "writeHtml":writeHtml};
  323. var fieldTemplate = $('#fieldPermissionTemplate').text();
  324. if(permission.controlType == 12 && permission.menuRight){//office控件
  325. //将obj转为字符串
  326. permission.menuRight = JSON2.stringify(permission.menuRight).replaceAll("\"", "'");
  327. }
  328. var fieldHtml = easyTemplate(fieldTemplate, data).toString();
  329. return fieldHtml;
  330. };
  331. /**
  332. * 获取权限的json字符串。
  333. */
  334. this.getPermissionJson=function(){
  335. var fieldJson={field:this.FieldsPermission,subtable:this.SubTableFilePermission,opinion:this.Opinion,subTableShows:this.subTableShows};
  336. var jsonStr=JSON2.stringify(fieldJson);
  337. return jsonStr;
  338. };
  339. /**
  340. * 重新设置权限。
  341. */
  342. this.setAllPermission=function(){
  343. this.readPermission(this.FieldsPermission,"field");
  344. this.readPermission(this.SubTablePermission,"subtable");
  345. this.readPermission(this.Opinion,"opinion");
  346. };
  347. //用区域分段读取权限
  348. this.readPermission=function(aryPermission,type){
  349. if(type=='field'){
  350. this.FieldsPermission = this.readPermissionByObj("#fieldPermission",type);
  351. }else if(type=='subtable'){
  352. var tables = aryPermission; //多个子表
  353. //每个子表是否显示数组:
  354. this.subTableShows = this.readTablePermission(tables,type);
  355. for(var i=0;i<tables.length;i++){
  356. var tablePermission=tables[i];
  357. //子表每子段的数据内容:
  358. var id = "#tableId_"+tablePermission.title
  359. var arry = this.readPermissionByObj(id,type);
  360. if(i==0){
  361. this.SubTableFilePermission = arry; //添加第一个子表时,将覆盖原来的数据
  362. }else{
  363. for(var j=0;j<arry.length;j++){
  364. this.SubTableFilePermission.push(arry[j]) //其它的子表的数据则直接在的数组追加 (或者合并)
  365. }
  366. }
  367. }
  368. }else{
  369. this.Opinion = this.readPermissionByObj("#opinionPermission",type);
  370. }
  371. };
  372. //读取每一个字段的权限,并放入对应的数组里面
  373. this.readPermissionByObj=function(scope,type){
  374. var objScope=$(scope);
  375. var aryPermission = []; // 赋值为一个空数组
  376. $("tr",objScope).each(function(index){
  377. var trObj=$(this);
  378. var tableName=trObj.attr("tableName");
  379. var memo=$(".mySpan",trObj).text();
  380. var rSelectObj=$(".r_select",trObj);
  381. var rSpanObj=$("[name=r_span]",trObj);
  382. var rId=$("input:hidden",rSpanObj).val();
  383. var rFullName=$("textarea",rSpanObj).val();
  384. var wSelectObj=$(".w_select",trObj);
  385. var wSpanObj=$("[name=w_span]",trObj);
  386. var wId=$("input:hidden",wSpanObj).val();
  387. var wFullName=$("textarea",wSpanObj).val();
  388. var bSelectObj=$(".b_select",trObj);
  389. var bSpanObj=$("[name=b_span]",trObj);
  390. var bId=$("input:hidden",bSpanObj).val();
  391. var bFullName=$("textarea",bSpanObj).val();
  392. var rpostInput = $("[name=rpost]",trObj);
  393. var rpost = false;
  394. if(rpostInput.length>0){
  395. rpost = rpostInput.is(":checked");
  396. }
  397. //读取office控件的菜单设置
  398. var controlType = trObj.attr("controlType");
  399. var menuRight = "";
  400. if(controlType==12){
  401. menuRight = $("a.officeMenu",trObj).attr("menuRight");
  402. }
  403. var fieldName=rSelectObj.attr("name");
  404. var permission={
  405. "title":fieldName,"memo":memo,"tableName":tableName,
  406. "read": {"type": rSelectObj.val() ,"id":rId, "fullname":rFullName},
  407. "write":{"type":wSelectObj.val(),"id":wId, "fullname":wFullName},
  408. "required":{"type":bSelectObj.val(),"id":bId, "fullname":bFullName},
  409. "rpost":rpost,"controlType":controlType
  410. };
  411. //添加入控件菜单权限
  412. if(typeof(menuRight)!=undefined&&menuRight!=''&&menuRight!='undefined'){
  413. permission.menuRight = menuRight;
  414. }
  415. aryPermission.push(permission);
  416. });
  417. return aryPermission;
  418. };
  419. //读取每个子表的(radio)是否显示的选择,并放入对应的数组里面;
  420. this.readTablePermission=function(tables,type){
  421. var aryPermission = []; // 赋值为一个空数组
  422. for ( var cn = 0; cn < tables.length; cn++) {
  423. var table=tables[cn];
  424. var scope = "#thead_"+table.title;
  425. var objScope=$(scope);
  426. var show = {};
  427. $('input:checkbox[name^="checkbox_"]',objScope).each(function(){
  428. var value = $(this).val();
  429. var val=$(this).attr('checked')=="checked"?"true":"false";
  430. show[value] = val;
  431. });
  432. var permission={
  433. "title":table.title,"memo":table.memo,
  434. "tableName":table.tableName,"show":show
  435. };
  436. aryPermission.push(permission);
  437. }
  438. return aryPermission;
  439. }
  440. };
  441. //OFFICE控件菜单选择
  442. function selectOfficeMenu(obj){
  443. if(!obj){
  444. return;
  445. }
  446. var conf = {};
  447. var menuRight = $(obj).attr("menuRight");
  448. if(typeof(menuRight)!=undefined&&menuRight!=''&&menuRight!='undefined'){
  449. conf = eval("("+menuRight+")");
  450. }
  451. var url=__ctx + '/platform/form/bpmFormDef/selectOfficeMenu.ht';
  452. url=url.getNewUrl();
  453. /*KILLDIALOG*/
  454. DialogUtil.open({
  455. height:350,
  456. width :450,
  457. title : 'OFFICE控件菜单选择',
  458. url: url,
  459. isResize: true,
  460. //自定义参数
  461. conf: conf,
  462. sucCall:function(rtn){
  463. if(rtn){
  464. var jsonStr = JSON2.stringify(rtn);
  465. $(obj).attr("menuRight",jsonStr);
  466. }
  467. }
  468. });
  469. }
  470. function changeCheckbox(obj){
  471. var chkObj= $(obj)
  472. var isChecked = chkObj.attr('checked')=="checked";
  473. var v=chkObj.val();
  474. if(isChecked){
  475. //为隐藏
  476. if(v=="y"){
  477. $(obj).siblings("input:checkbox").attr('checked', false);
  478. }
  479. else{
  480. if(v=="b"){
  481. $(obj).siblings("input:checkbox[value='addRow']").attr('checked', true);
  482. }
  483. $(obj).siblings("input:checkbox[value='y']").attr('checked', false);
  484. }
  485. }
  486. else{
  487. if(v=="y"){
  488. $(obj).siblings("input:checkbox").attr('checked', true);
  489. $(obj).siblings("input:checkbox[value='b']").attr('checked', false);
  490. }
  491. }
  492. }