CustomForm.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969
  1. $(function() {
  2. CustomForm = {
  3. onEditCallBack:null,
  4. tables: {},
  5. init : function() {
  6. var self=this;
  7. self.initUI();
  8. self.initComdify();
  9. self.validate();
  10. },
  11. //处理添加和删除按钮。
  12. handButton:function(table,canWrite){
  13. var self=this;
  14. if(!canWrite) {
  15. $(".add",table).addClass("disabled");
  16. $(".del",table).addClass("disabled");
  17. return;
  18. };
  19. $(".add",table).click(function(){
  20. self.add(table);
  21. //TODO
  22. self.initSubQuery();
  23. self.subSelectorInit();
  24. });
  25. table.delegate(".del", "click", function(){
  26. var t = $(this).closest('[formtype]'),
  27. brother = t.next('[formtype]').length?t.next('[formtype]'):t.prev('[formtype]');
  28. t.remove();
  29. if(brother)
  30. FormUtil.InitMathfunction(brother);
  31. });
  32. },
  33. //处理块模式和表内编译模式下千分位
  34. initComdify:function(){
  35. $("div[type='custform']").delegate('[showtype]', 'blur',function (){
  36. CustomForm.delaComdify($(this));
  37. });
  38. },
  39. //处理弹出框模式下千分位
  40. initComdifyForWindow:function(){
  41. $("[formtype='window']").delegate('[showtype]', 'blur',function(){
  42. CustomForm.delaComdify($(this));
  43. });
  44. },
  45. //处理千分位
  46. delaComdify:function(varObj){
  47. var me=$(varObj);
  48. var value = me.val();
  49. var json=null;
  50. try{
  51. var jsonStr=me.attr("showtype");
  52. json=eval('('+jsonStr+')');
  53. }
  54. catch(err){}
  55. if(json!=null){
  56. var coinvalue=json.coinValue;
  57. var iscomdify=json.isShowComdify;
  58. var decimallen=json.decimalValue;
  59. //去除货币标签
  60. if (coinvalue && value.split(coinvalue) != -1) {
  61. var ary = value.split(coinvalue);
  62. value = ary.join("");
  63. }
  64. if (value.indexOf(',') != -1) {
  65. value = $.toNumber(value);
  66. }
  67. if(iscomdify && iscomdify=='1'){
  68. var value = $.comdify(value);
  69. }
  70. // 小数处理
  71. if (decimallen > 0 && value) {
  72. var zeroLen = '';
  73. if (value.indexOf('.') != -1) {
  74. var ary = value.split('.');
  75. var temp = ary[ary.length - 1];
  76. if (temp.length > 0 && temp.length < decimallen) {
  77. for (var i = 0; i < decimallen- temp.length; i++) {
  78. zeroLen = zeroLen + '0';
  79. }
  80. value = value + zeroLen;
  81. }
  82. } else {
  83. for (var i = 0; i < decimallen; i++) {
  84. zeroLen = zeroLen + '0';
  85. }
  86. value = value + '.' + zeroLen;
  87. }
  88. }
  89. //添加货币标签
  90. if (coinvalue && value) {
  91. value = coinvalue + value;
  92. }
  93. }
  94. me.val(value);
  95. },
  96. /**
  97. * 初始化表单界面。
  98. *
  99. * @param parent
  100. */
  101. initUI : function(parent) {
  102. $('input[type="checkbox"]').each(function() {
  103. var value=$(this).val();
  104. var data=$(this).attr('data');
  105. if(!data||data==''||data=='null')return;
  106. var ary=data.split(",");
  107. for(var i=0;i<ary.length;i++){
  108. if(value!=ary[i]) continue;
  109. $(this).attr("checked","checked");
  110. }
  111. });
  112. var filter='input,textarea,.dicComboTree,.dicComboBox,.dicCombo';
  113. if (parent==undefined) {
  114. parent = $('body div[type=custform]');
  115. if(!parent||parent.length==0)parent = $("body");
  116. }else{
  117. //处理初始化附件的bug
  118. AttachMent.init($("div[name='div_attachment_container']",parent));
  119. }
  120. //下拉框默认选中,在下拉框定义一个val属性,使用脚本选中。
  121. $("select[name][val]",parent).each(function(){
  122. var obj=$(this),val= obj.attr("val");
  123. if($.isEmpty(val))
  124. val= obj.val();
  125. obj.val(val);
  126. });
  127. parent.find(filter).each(function() {
  128. if ($(this).is('.dicComboTree,.dicComboBox,.dicCombo')) {
  129. if($(this).closest('[type=append]').length<=0){//是模板的也不用初始化
  130. $(this).htDicCombo();
  131. }
  132. }
  133. //处理默认日期
  134. if ($(this).is('.Wdate[displayDate=1]')){
  135. var me = $(this);
  136. if($.isEmpty(me.val())){
  137. var datefmt = me.attr("datefmt");
  138. var nowDate=new Date().Format(datefmt);
  139. me.val(nowDate);
  140. }
  141. }
  142. });
  143. if (parent.is('form')) {
  144. parent.data('validate', this.getValidate(parent));
  145. } else {
  146. var v = parent.closest('form');
  147. this.valid = this.getValidate(v);
  148. }
  149. $('div[type=subtable]').each(function() {
  150. var subTable=$(this);
  151. CustomForm.handRow('edit',subTable);
  152. });
  153. },
  154. //添加一行数据
  155. //参数,子表区域,在那个地方插入。
  156. add : function(table, beforeElement) {
  157. var self=this;
  158. var right=table.attr('right');
  159. if(right!="w" && right!="b"){
  160. return;
  161. }
  162. //判断是否是使用窗口方式编辑数据。
  163. var frm=table.data('form');
  164. if (frm) {
  165. self.openWin('添加', $(frm), table, beforeElement, function(form, table, beforeElement) {
  166. //校验数据
  167. var v = form.data('validate');
  168. if (!v.valid()) {
  169. return false;
  170. }
  171. var row = $(table.data('row'));
  172. //添加行数据
  173. self.addRow(row, form);
  174. self._add(table, row, beforeElement);
  175. self.handRow('add',table);
  176. return true;
  177. });
  178. //弹窗模式下初始化千分位货币处理函数
  179. self.initComdifyForWindow();
  180. }
  181. //使用的行内编辑。
  182. else {
  183. var row = $(table.data('row'));
  184. this._add(table, row, beforeElement);
  185. row.find('.dicComboBox,.dicComboTree,.dicCombo').each(function() {
  186. $(this).htDicCombo();
  187. });
  188. }
  189. self.handRow('add',table);
  190. },
  191. handRow:function(type,table){
  192. if(typeof(handRowEvent)=="function"){
  193. handRowEvent(type,table);
  194. }
  195. },
  196. //添加一行数据往行数据中添加隐藏域,同时设置显示的数据。
  197. addRow:function(row,form){
  198. form.find('input:text[name],input:hidden[name], textarea[name],select[name]').each(function() {
  199. var name=$(this).attr('name');
  200. var val=$(this).val();
  201. //添加隐藏表单。
  202. row.append($('<input type="hidden"/>').attr('name', name).val(val));
  203. //修改表格的文本显示。
  204. var filter="[fieldName='"+name+"']";
  205. var objTd=$(filter,row);
  206. if(objTd.length>0){
  207. var controltype = $(this).attr('controltype');
  208. if(!$.isEmpty(controltype) && controltype=='attachment'){
  209. AttachMent.insertHtml(objTd,val);
  210. }else if(!$.isEmpty(controltype) && controltype=='select'){
  211. var text = $(this).find("option:selected").text();
  212. objTd.text(text);
  213. }else{
  214. objTd.text(val);
  215. }
  216. }
  217. $(this).val('');
  218. });
  219. //回填checkbox的值。
  220. form.find('input:checkbox,input:radio').each(function() {
  221. var name=$(this).attr('name');
  222. var value=$(this).val();
  223. var filterHidden="input[name='"+ name +"']";
  224. var isChecked=($(this).attr("checked")!=undefined);
  225. var obj=$(filterHidden,row);
  226. var filter="[fieldName='"+name+"']";
  227. var objTd=$(filter,row);
  228. var val=(isChecked)?value:"";
  229. if(obj.length==0){
  230. row.append($('<input type="hidden"/>').attr('name', name).val(val));
  231. }
  232. else{
  233. var existVal = obj.val()=="" ? val : obj.val() ;
  234. if(existVal!="" && val!=""){
  235. existVal += "," +val;
  236. }
  237. obj.val(existVal);
  238. val = existVal;
  239. }
  240. if(objTd.length>0){
  241. objTd.text(val);
  242. }
  243. });
  244. },
  245. _add : function(table, newRow, beforeElement) {
  246. //处理newRow的字段的必填
  247. $("input,textarea,select",newRow).each(function(){
  248. var me=$(this);
  249. //处理默认日期
  250. if (me.is('.Wdate[displayDate=1]') && $.isEmpty(me.val())){
  251. var datefmt = me.attr("datefmt");
  252. var nowDate=new Date().Format(datefmt);
  253. me.val(nowDate);
  254. }
  255. var validRule = me.attr("validate");
  256. if ( validRule != null && 'undefined' != validRule.toLowerCase() && validRule.length>2 ){
  257. var json = eval('(' + validRule + ')');
  258. if(json.required){
  259. me.addClass("validError");
  260. }
  261. }
  262. });
  263. if (beforeElement) {
  264. $(beforeElement).before(newRow);
  265. }
  266. //在最后面加入
  267. else {
  268. table.find('[formtype]:last').after(newRow);
  269. }
  270. //初始化界面
  271. this.initUI(newRow);
  272. //添加右键绑定
  273. this.addBind(newRow, table);
  274. FormUtil.triggerChoice(newRow);
  275. //删除必填样式
  276. if(table.hasClass('validError')){
  277. table.removeClass('validError');
  278. }
  279. },
  280. /**
  281. * 添加行数据的右键事件绑定。
  282. * @param row
  283. * @param table
  284. */
  285. addBind: function(row, table) {
  286. //是否需要编辑菜单项目
  287. //如果该表弹出窗口定义,那么就不需要编辑菜单项目。
  288. var needEdit = (this.tables[table.attr('tableName')].data('form') != null);
  289. var menu = this.getMenu(needEdit);
  290. row.bind("contextmenu", function(e) {
  291. menu.target = e.target;
  292. menu.show({top : e.pageY,left : e.pageX});
  293. return false;
  294. });
  295. },
  296. /**
  297. * 编辑行数据。
  298. * @param table
  299. * @param row
  300. */
  301. edit : function(table, row) {
  302. var self=this;
  303. var tableName = table.attr('tableName');
  304. //获取表单
  305. var form = $(this.tables[tableName].data('form'));
  306. //对表单数据进行初始化
  307. self.initFormData(form,row);
  308. form.data('row', row);
  309. this.openWin('编辑', form, table, null, function(form, table) {
  310. var v = form.data('validate');
  311. var rtn=v.valid();
  312. if(!rtn) return false;
  313. var row = form.data('row');
  314. //对表单进行遍历
  315. self.setRowData(form,row);
  316. return true;
  317. });
  318. },
  319. initFormData:function(form,row){
  320. form.find('input:text,textarea,select,input[type="hidden"]').each(function() {
  321. var name= $(this).attr('name');
  322. var value = row.find('[name="' + name+ '"]').val();
  323. $(this).val(value);
  324. });
  325. form.find('input:checkbox,input:radio').each(function(){
  326. var name=$(this).attr("name");
  327. var chkValue=$(this).val();
  328. var value=row.find('[name="' + name+ '"]').val();
  329. if(value.indexOf(chkValue)!=-1){
  330. $(this).attr("checked","checked");
  331. }
  332. });
  333. },
  334. setRowData:function(form,row){
  335. var self=this;
  336. //对表单进行遍历
  337. form.find('input:text, textarea,input[type="hidden"],select').each(function() {
  338. var name=$(this).attr('name');
  339. var val=$(this).val();
  340. //修改隐藏域的数据值
  341. var objHidden=$("input[name='"+name+"']",row);
  342. objHidden.val(val);
  343. //修改表格的文本显示。
  344. var filter="[fieldName='"+name+"']";
  345. var objTd=$(filter,row);
  346. if(objTd.length<=0) return true;
  347. //处理附件
  348. var controltype = $(this).attr('controltype');
  349. if(!$.isEmpty(controltype) && controltype=='attachment'){
  350. AttachMent.insertHtml(objTd,val);
  351. }else{
  352. objTd.text(val);
  353. }
  354. });
  355. form.find('input:checkbox,input:radio').each(function(){
  356. var name=$(this).attr('name');
  357. var objHidden=$("input[name='"+name+"']",row);
  358. objHidden.val("");
  359. //修改表格的文本显示。
  360. var filter="[fieldName='"+name+"']";
  361. var objTd=$(filter,row);
  362. if(objTd.length>0){
  363. objTd.text("");
  364. }
  365. });
  366. form.find('input:checkbox:checked,input:radio:checked').each(function(){
  367. var name=$(this).attr('name');
  368. var value=$(this).val();
  369. var objHidden=$("input[name='"+name+"']",row);
  370. var filter="[fieldName='"+name+"']";
  371. var objTd=$(filter,row);
  372. var hidValue=objHidden.val();
  373. if(hidValue){
  374. objHidden.val(hidValue +"," +value);
  375. objTd.text(hidValue +"," +value);
  376. } else{
  377. objHidden.val(value);
  378. objTd.text(value);
  379. }
  380. });
  381. },
  382. /**
  383. * 获取验证器。
  384. * @param target 为一个表单。
  385. * @returns
  386. */
  387. getValidate : function(target) {
  388. return target.form({
  389. /**
  390. * 错误消息处理
  391. */
  392. errorPlacement : function(el, msg) {
  393. var element=$(el),corners =['right center','left center'],flipIt= element.parents('span.right').length > 0;
  394. element.addClass('validError');
  395. //添加必填样式
  396. var parentTd = element.closest("td");
  397. if(parentTd){
  398. var formTitle = parentTd.prev("td.formTitle");
  399. if(formTitle){
  400. var span = $("span.red", formTitle);
  401. if(!span || span.length==0){
  402. formTitle.append($("<span class='red'>*</span>"));
  403. }
  404. }
  405. }
  406. if(element.hasClass("myeditor")){
  407. setTimeout(function(){
  408. element = element.next();
  409. element.css("border","1px solid red");
  410. },1000);
  411. }else if(element.hasClass("Wdate")||element.is('textarea')){
  412. element.css("border","1px solid red");
  413. }else if(element.is("select")||element.attr('type')&&(element.attr('type')=='checkbox'||element.attr('type')=='radio')){
  414. var name = element.attr('name');
  415. if(!name)return;
  416. var priElement = $("*[name='"+name+"']",$("span.select_contain_span"));
  417. if(priElement.length>0)return;
  418. element.removeClass('validError');
  419. var errorSpan = $('<span></span>').css({"border":"1px solid red","padding":"1px"}).addClass("select_contain_span");
  420. element.before(errorSpan);
  421. errorSpan.append(element);
  422. }
  423. if(!$(msg).is(':empty')){
  424. element.qtip({
  425. overwrite:false,
  426. content : msg,
  427. position:{
  428. my:corners[flipIt?0:1],
  429. at:corners[flipIt?1:0],
  430. viewport:$(window)
  431. },
  432. show:{
  433. effect: function(offset) {
  434. $(this).slideDown(100);
  435. }
  436. },
  437. hide:{
  438. event:'click mouseleave',
  439. leave: false,
  440. fixed:true,
  441. delay:200
  442. },
  443. style:{
  444. classes:'ui-tooltip-red'
  445. }
  446. });
  447. }else{
  448. element.qtip("destroy");
  449. }
  450. },
  451. /**
  452. * 成错误消息
  453. */
  454. success : function(el) {
  455. var element=$(el);
  456. if(element.hasClass("myeditor")){
  457. element = element.next();
  458. element.css("border","");
  459. }else if(element.hasClass("Wdate")||element.is('textarea')){
  460. element.css("border","1px solid #999");
  461. }else if(element.is("select")||element.attr('type')&&(element.attr('type')=='checkbox'||element.attr('type')=='radio')){
  462. var selectSpan = element.parents("span.select_contain_span");
  463. if(!selectSpan||selectSpan.length==0){
  464. var name = element.attr('name');
  465. if(!name)return;
  466. var priElement = $("*[name='"+name+"']",$("span.select_contain_span"));
  467. if(!priElement||priElement.length==0)return;
  468. var tipSpan = priElement.parents("span.select_contain_span");
  469. var formtype = priElement.parents("[formtype]");
  470. if(formtype&&formtype.length>0){
  471. $("[name='"+name+"']",formtype).each(function(){
  472. $(this).removeClass('validError');
  473. $(this).qtip("destroy");
  474. $(this).unbind('mouseover');
  475. });
  476. }
  477. else{
  478. $("[name='"+name+"']").each(function(){
  479. $(this).removeClass('validError');
  480. $(this).qtip("destroy");
  481. $(this).unbind('mouseover');
  482. });
  483. }
  484. tipSpan.before(priElement);
  485. tipSpan.remove();
  486. }
  487. else{
  488. selectSpan.before(element);
  489. selectSpan.remove();
  490. }
  491. }else if(element.attr('type')=='subtable'){
  492. }
  493. element.removeClass('validError');
  494. element.qtip("destroy");
  495. element.unbind('mouseover');
  496. }
  497. ,rules:com.hotent.form.rule.CustomRules
  498. });
  499. },
  500. validate:function(conf){
  501. return this.valid.valid(conf);
  502. },
  503. //处理有数据格式定义的数据。
  504. handNumberData:function(obj){
  505. var value=$(obj).val();
  506. var showType=$(obj).attr("showtype");
  507. if(!showType) return value;
  508. try{
  509. showType=showType.replaceAll("'","\"");
  510. var json=jQuery.parseJSON(showType);
  511. var coinvalue = json.coinValue;
  512. var isShowComdify = json.isShowComdify;
  513. if (coinvalue != null && coinvalue != '' && value.split(coinvalue) != -1) {
  514. var ary = value.split(coinvalue);
  515. value = ary.join("");
  516. }
  517. if (isShowComdify && value.split(",") != -1) {
  518. var temp = value.split(",");
  519. value = temp.join("");
  520. }
  521. }
  522. catch(err){}
  523. return value;
  524. },
  525. /**
  526. * 获取数据。
  527. * 返回json数据。
  528. */
  529. getData: function() {
  530. var self=this;
  531. // 主表数据
  532. var main = {
  533. fields:{}
  534. };
  535. //取主表的字段。
  536. $("input:text[name^='m:'],input:hidden[name^='m:'],textarea[name^='m:'],select[name^='m:']").each(function() {
  537. var name = $(this).attr('name');
  538. var value=self.handNumberData(this);
  539. main.fields[name.replace(/.*:/, '')] = value;
  540. });
  541. $("textarea[name^='m:'].myeditor").each(function(num) {
  542. var name = $(this).attr('name');
  543. var data=getEditorData(editor[num]);
  544. main.fields[name.replace(/.*:/, '')] =data;
  545. $(this).val(data);
  546. });
  547. //设置单选按钮。
  548. self.setMainRadioData(main.fields);
  549. //设置复选框。
  550. self.setMainCheckBoxData(main.fields);
  551. //子表数据
  552. var sub = [];
  553. $('div[type=subtable][right=w || right=b][show=true||undefined]').each(function() {
  554. var table = {
  555. tableName: $(this).attr('tableName'),
  556. fields: []
  557. };
  558. $(this).find('[formtype]:visible').each(function() {
  559. var row = {};
  560. var objRow=$(this);
  561. $("input:text[name^='s:'],input[type='hidden'][name^='s:'],textarea[name^='s:'],select[name^='s:']",objRow).each(function() {
  562. var name = $(this).attr('name').replace(/.*:/, '');
  563. var value=self.handNumberData(this);
  564. row[name] = value;
  565. });
  566. //设置复选框按钮的数据。
  567. self.setSubCheckBoxData(objRow,row);
  568. //设置单选按钮的数据
  569. self.setSubRadioData(objRow, row);
  570. table.fields.push(row);
  571. });
  572. sub.push(table);
  573. JSON2.stringify(sub);
  574. });
  575. //意见
  576. var opinion = [];
  577. $('textarea[name^=opinion]').each(function() {
  578. opinion.push({
  579. name: $(this).attr('name').split(':')[1],
  580. value: $(this).val()
  581. });
  582. });
  583. var data = {main: main, sub: sub, opinion: opinion};
  584. return JSON2.stringify(data);
  585. },
  586. /**
  587. * 设置子表的radio单选按钮字段。
  588. * @param dataObj
  589. */
  590. setSubRadioData:function(objParent,dataObj){
  591. var operatorObj = $('input:radio', objParent);
  592. this.setRadioData(dataObj, operatorObj);
  593. },
  594. /**
  595. * 设置主表的radio单选按钮字段。
  596. * @param dataObj
  597. */
  598. setMainRadioData:function(dataObj){
  599. var operatorObj = $('input[name^=m]:radio');
  600. this.setRadioData(dataObj, operatorObj);
  601. },
  602. setRadioData:function(dataObj, operatorObj){
  603. $(operatorObj).each(function() {
  604. var name = $(this).attr('name').replace(/.*:/, '');
  605. var value= $(this).val();
  606. if($(this).attr("checked")!=undefined){
  607. dataObj[name]=value;
  608. }
  609. });
  610. },
  611. setCheckBoxData:function(dataObj, operatorObj, checkedObj){
  612. //将所有复选框选址清空。
  613. $(operatorObj).each(function() {
  614. var name = $(this).attr('name').replace(/.*:/, '');
  615. dataObj[name]="";
  616. });
  617. //复选框取值。
  618. $(checkedObj).each(function() {
  619. var name = $(this).attr('name').replace(/.*:/, '');
  620. var value= $(this).val();
  621. if(dataObj[name]==""){
  622. dataObj[name]=value;
  623. } else{
  624. dataObj[name]+="," + value;
  625. }
  626. });
  627. },
  628. /**
  629. * 设置子表复选框的数据
  630. * @param objParent
  631. * @param dataObj
  632. */
  633. setSubCheckBoxData:function(objParent,dataObj){
  634. var operatorObj = $('input:checkbox',objParent);
  635. var checkedObj = $('input:checkbox:checked',objParent);
  636. this.setCheckBoxData(dataObj, operatorObj, checkedObj);
  637. },
  638. setMainCheckBoxData:function(dataObj){
  639. var operatorObj = $('input[name^=m]:checkbox');
  640. var checkedObj = $('input[name^=m]:checkbox:checked');
  641. this.setCheckBoxData(dataObj, operatorObj, checkedObj);
  642. },
  643. /**
  644. * 打开操作数据窗口。
  645. * @param title 窗口标题
  646. * @param form 窗口对象。
  647. * @param table 表
  648. * @param beforeElement
  649. * @param callback 回调函数
  650. */
  651. openWin : function(title, form, table, beforeElement, callback) {
  652. var formProperty=table.data("formProperty");
  653. var width=formProperty.width+20;
  654. var height=formProperty.height+100;
  655. var self=this;
  656. form.data('beforeElement', beforeElement);
  657. var win = $.ligerDialog({target:form,
  658. width:width,
  659. height:height,
  660. title : title,
  661. showMax : true,
  662. showToggle : true,
  663. onClose : true,
  664. showButton : true,
  665. buttons : [ {
  666. text : "确定",
  667. onclick: function (item, dialog) {
  668. var result = callback(form, table, form.data('beforeElement'));
  669. if(!result) return;
  670. if(self.onEditCallBack!=null){
  671. self.onEditCallBack(title);
  672. }
  673. dialog.close();
  674. }
  675. } ]
  676. });
  677. //初始化表单界面
  678. this.initUI(form);
  679. win.show();
  680. },
  681. /**
  682. * 获取右键菜单。
  683. * @param needEdit
  684. * @returns
  685. */
  686. getMenu : function(needEdit) {
  687. var self=this;
  688. //判断菜单是否存在,不存在则新建菜单。
  689. if ((needEdit && this.menuWithEdit) || (!needEdit && this.menu)) {
  690. return needEdit ? this.menuWithEdit : this.menu;
  691. } else {
  692. var menu;
  693. var items = [ {
  694. text : '在前面插入记录',
  695. click : function() {
  696. var row = $(menu.target).closest('[formtype]');
  697. var table = row.closest('div[type=subtable]');
  698. self.add(table, row);
  699. //TODO
  700. self.subSelectorInit();
  701. self.initSubQuery();
  702. self.handRow('add',table);
  703. }
  704. }, {
  705. text : '在后面插入记录',
  706. click : function() {
  707. var row = $(menu.target).closest('[formtype]');
  708. var table = row.closest('div[type=subtable]');
  709. row = row.next('[formtype]:visible');
  710. if (row.length == 0) {
  711. row = null;
  712. }
  713. self.add(table, row);
  714. //TODO
  715. self.subSelectorInit();
  716. self.initSubQuery();
  717. self.handRow('add',table);
  718. }
  719. }, {
  720. line : true
  721. }, {
  722. text : '编辑',
  723. click : function() {
  724. var row = $(menu.target).closest('[formtype]');
  725. var table = row.closest('div[type=subtable]');
  726. self.edit(table, row);
  727. }
  728. }, {
  729. text : '删除此记录',
  730. click : function() {
  731. var t = $(menu.target).closest('[formtype]'),
  732. table = t.closest('div[type=subtable]'),
  733. brother = t.next('[formtype]').length?t.next('[formtype]'):t.prev('[formtype]');
  734. t.remove();
  735. self.handRow('del',table);
  736. if(brother)
  737. FormUtil.InitMathfunction(brother);
  738. }
  739. }, {
  740. line : true
  741. }, {
  742. text : '向上移动',
  743. click : function() {
  744. var t = $(menu.target).closest('[formtype]');
  745. var prev = t.prev('[formtype]:visible');
  746. if (prev.length > 0) {
  747. prev.before(t);
  748. }
  749. var table = t.closest('div[type=subtable]');
  750. self.handRow('add',table);
  751. }
  752. }, {
  753. text : '向下移动',
  754. click : function() {
  755. var t = $(menu.target).closest('[formtype]');
  756. var next = t.next('[formtype]:visible');
  757. if (next.length > 0) {
  758. next.after(t);
  759. }
  760. var table = t.closest('div[type=subtable]');
  761. self.handRow('add',table);
  762. }
  763. } ];
  764. //如果不需要编辑,删除编辑菜单。
  765. if (!needEdit) {
  766. items.splice(3, 1);
  767. }
  768. menu = $.ligerMenu({top : 100,left : 100,width : 130,items : items});
  769. if (needEdit) {
  770. this.menuWithEdit = menu;
  771. }
  772. else{
  773. this.menu = menu;
  774. }
  775. return menu;
  776. }
  777. },
  778. /**
  779. * 从数据库加载子表权限。
  780. */
  781. loadSubTablePermission:function(){
  782. var defId = $(':hidden[name=defId]').val();
  783. var actDefId = $(':hidden[name=actDefId]').val();
  784. var formKey = $(':hidden[name=formKey]').val();
  785. var nodeId = $(':hidden[name=nodeId]').val();
  786. var params={defId:defId,actDefId:actDefId,formKey:formKey,nodeId:nodeId};
  787. var url = "getSubTablePermission.ht";
  788. var map = null;
  789. $.ajaxSetup({async:false}); //修改成同步
  790. $.post(url, params,function(data){
  791. map = data;
  792. });
  793. $.ajaxSetup({async:true}); //改为原来的异步
  794. return map;
  795. },
  796. selectValue:function(select){
  797. var html='';
  798. var query=select.attr("selectquery")
  799. var queryJson;
  800. if(query!=undefined && query!=null ){
  801. query=query.replaceAll("'","\"");
  802. queryJson = JSON2.parse(query);
  803. }else{
  804. queryJson = "";
  805. query = "";
  806. }
  807. var sValue=select.attr("val"); //select中有一个属性是保存选中的值的(初始化时用这个)
  808. if(sValue==undefined || sValue==null && sValue.length<=0){
  809. sValue = "";
  810. }
  811. if(query){
  812. html="<span selectvalue="+sValue+" selectquery="+query+"><lable></lable></span>"
  813. }else{
  814. if(sValue==""){
  815. html=select.find("option:selected").text(); //获取Select选择的Text 选中(不可编辑时或者没有值时,是默认的)
  816. }else{
  817. html += select.find("option[value='"+sValue+"']").text(); //和值相对应的显示
  818. }
  819. }
  820. return html;
  821. },
  822. /**
  823. * 主表的权限补充(必埴)
  824. */
  825. isMainTableRequest:function(){
  826. //主表的附件必埴验证问题
  827. $("div[name=div_attachment_container]").each(function() {
  828. var div_me=$(this);
  829. if(div_me.attr("right")!='b') return true;
  830. $("a.link",div_me).each(function(){
  831. var me=$(this);
  832. var validRule = me.attr("validate");
  833. if ( validRule != null && 'undefined' != validRule.toLowerCase() && validRule.length>2 ){
  834. var json = eval('(' + validRule + ')');
  835. if(!json.required){
  836. var jsonStr = validRule.substring(0, validRule.lastIndexOf('}'));
  837. jsonStr +=",'required':true}"; //加上必填
  838. me.attr("validate",jsonStr);
  839. }
  840. }else{
  841. me.attr("validate","{'required':true}"); //必填
  842. }
  843. });
  844. });
  845. },
  846. //初始化子表级联
  847. initSubQuery:function(){
  848. $("select[selectquery]",$("[type=subtable],[formtype='window']")).each(function(){
  849. var me = $(this);
  850. var selected=me.attr("selectqueryed");
  851. //selectqueryed标识这个子表是否已经执行过了change绑定,存在就是已经绑定了,不存在就是没用被绑定过
  852. if(selected)return true;
  853. var selectquery = me.attr("selectquery");
  854. if (!selectquery)
  855. return true;
  856. selectquery = selectquery.replaceAll("'", "\"");
  857. var queryJson = JSON2.parse(selectquery);
  858. var query = queryJson.query;
  859. for (var i = 0; i < query.length; i++) {
  860. var field;
  861. // isMain是true 就是绑定主表的字段
  862. if (query[i].isMain=="true") {
  863. field = $(".formTable [name$=':" + query[i].trigger + "']");
  864. } else {
  865. field = me.parents('table.listTable,[formtype="window"]').find("[name='" + query[i].trigger + "']");
  866. //添加新一个子表时,执行了多次绑定change事件,把之前的change事件都解绑
  867. field.unbind("change");
  868. }
  869. if (field != "")
  870. QueryUI.change(field, me, queryJson);
  871. }
  872. //添加一个属性,标识已经被绑定过,
  873. me.attr("selectqueryed","selectqueryed");
  874. QueryUI.getvalue(me, queryJson);
  875. });
  876. },
  877. //初始化子表选择器
  878. subSelectorInit:function(){
  879. $('[ctlType="selector"]','.listTable,[formtype="window"]').each(function(){
  880. var me =$(this);
  881. var nameID=me.attr('name')+'ID';
  882. var isHidden=me.siblings("input[name='"+nameID+"']");
  883. //如果存在隐藏域,则是已经添加了
  884. if(isHidden.length!=0) return;
  885. var type = me.attr('class');
  886. //方法在SelectotInit.js
  887. buildSelector(me, type);
  888. });
  889. },
  890. // 验证子表是否必填(至少要有一条记录)
  891. isSubTableRequest:function(){
  892. var result = {success : true}
  893. $('div[right="b"][type="subtable"]').each(function(){
  894. var subtable = $(this);
  895. var listRows = $('tr.listRow', subtable);
  896. if(listRows.length > 1) return true;
  897. var tableDesc = subtable.attr('tabledesc');
  898. result.success = false;
  899. result.errorMsg = tableDesc;
  900. return false;
  901. });
  902. return result;
  903. }
  904. };
  905. //对表单初始化。
  906. CustomForm.init();
  907. });