jquery-bootsform.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. /**
  2. * bootstable 表单录入插件
  3. * caratename:雨中磐石(rainrock)
  4. * caratetime:2014-04-06 21:40:00
  5. * email:admin@rockoa.com
  6. * homepage:www.rockoa.com
  7. */
  8. (function ($) {
  9. function bootsform(element, options){
  10. var obj = element;
  11. var can = options;
  12. var rand = can.rand;
  13. var me = this;
  14. this.form = null;
  15. this.editdata = {};
  16. this.itemsdata = {};
  17. this.init = function(){
  18. if(rand=='')rand=js.getrand();
  19. if(!can.window)return;
  20. can.windowid = 'window_'+rand+'';
  21. var s = this._create();
  22. js.tanbody(can.windowid, can.title, can.width, can.height,{bbar:'none',html:s,titlecls:can.saveCls});
  23. can.render = ''+can.windowid+'_body';
  24. obj = $('#'+can.render+'');
  25. this.createafter();
  26. $('#cancel_'+rand+'').focus();
  27. };
  28. this.forminit = function(){
  29. this.createafter();
  30. };
  31. this.createafter = function(){
  32. this.form = document['form_'+rand+''];
  33. var saveid = can.saveid;
  34. if(saveid=='')saveid = 'save_'+rand+'';
  35. $('#'+saveid+'').click(function(){
  36. me._save(this, 0);
  37. });
  38. $('#cancel_'+rand+'').click(function(){
  39. me._cancel(this);
  40. });
  41. var a = can.items,b=[],i;
  42. if(can.requiredfields!='')b = can.requiredfields.split(',');
  43. for(i=0; i<a.length; i++){
  44. if(a[i].required)b.push(a[i].name);
  45. }
  46. for(i=0; i<b.length; i++){
  47. $(this.form[b[i]]).change(function(){
  48. me.isValid();
  49. });
  50. $(this.form[b[i]]).blur(function(){
  51. me.isValid();
  52. });
  53. }
  54. if(obj){
  55. obj.find("button[changeuser]").click(function(){
  56. me._changeuser($(this));
  57. return false;
  58. });
  59. obj.find("button[changeclear]").click(function(){
  60. me._changeclear($(this));
  61. return false;
  62. });
  63. obj.find("button[changedate]").click(function(){
  64. me._changedate($(this));
  65. return false;
  66. });
  67. }
  68. };
  69. this._changeuser = function(o){
  70. var cn = o.attr('changeuser');
  71. var ssa = this.itemsdata[cn].changeuser;
  72. if(!ssa)ssa={};
  73. ssa.nameobj = this.form[cn];
  74. if(ssa.idname){
  75. ssa.value = this.getValue(ssa.idname);
  76. ssa.idobj = this.form[ssa.idname];
  77. }
  78. js.getuser(ssa);
  79. };
  80. this._changedate = function(o){
  81. var viev = o.attr('changedate'),atr='',
  82. inpu = o.attr('inputid');
  83. var cans = {view:viev,inputid:inpu,initshow:true};
  84. o.rockdatepicker(cans);
  85. };
  86. this._changeclear = function(o){
  87. var cn = o.attr('changeclear');
  88. var ssa = this.itemsdata[cn].changeuser;
  89. if(!ssa)ssa={};
  90. if(ssa.idname){
  91. this.setValue(ssa.idname, '');
  92. }
  93. this.setValue(cn, '');
  94. };
  95. this._create = function(){
  96. var s = '',a=can.items,i,i1,style='padding:10px';
  97. if(can.bodyheight!=0)style+=';height:'+can.bodyheight+'px';
  98. s+='<div align="center" style="'+style+';overflow-y:auto" >';
  99. s+='<form id="form_'+rand+'" name="form_'+rand+'" style="padding:0px;maring:0px">';
  100. s+='<input name="id" value="0" type="hidden">';
  101. s+='<table width="'+can.bodywidth+'">';
  102. for(i=0; i<a.length; i++){
  103. can.items[i] = js.applyIf(a[i], can.defaultfields);
  104. a[i] = can.items[i];
  105. this.itemsdata[a[i].name] = a[i];
  106. var bl=a[i].blankText,bt='',attr = a[i].attr;
  107. if(!bl)bl='';if(!attr)attr='';
  108. if(a[i].required)bt='<font color="red">*</font>';
  109. if(a[i].readOnly)attr+=' readonly';
  110. if(a[i].repEmpty)attr+=' onblur="this.value=strreplace(this.value)"';
  111. if(a[i].type=='number')attr+=' onfocus="js.focusval=this.value" onblur="js.number(this)"';
  112. var inp = '<input placeholder="'+bl+'" '+attr+' type="'+a[i].type+'" value="'+a[i].value+'" name="'+a[i].name+'" class="form-control">';
  113. if(a[i].type=='checkbox'){
  114. if(a[i].checked)attr+=' checked';
  115. inp = '<label><input name="'+a[i].name+'" '+attr+' value="1" type="checkbox"> '+a[i].labelBox+'</label>';
  116. }else if(a[i].type=='textarea'){
  117. inp = '<textarea placeholder="'+bl+'" '+attr+' name="'+a[i].name+'" class="form-control" style="height:'+a[i].height+'px">'+a[i].value+'</textarea>';
  118. }else if(a[i].type=='select'){
  119. inp = '<select name="'+a[i].name+'" class="form-control">';
  120. var sto = a[i].store;
  121. for(i1=0;i1<sto.length;i1++){
  122. inp+='<option value="'+sto[i1][a[i].valuefields]+'">'+sto[i1][a[i].displayfields]+'</option>';
  123. }
  124. inp += '</select>';
  125. }else if(a[i].type=='changeuser'){
  126. inp = '<div class="input-group"><input placeholder="'+bl+'" readonly class="form-control" name="'+a[i].name+'" >';
  127. inp+= '<span class="input-group-btn">';
  128. if(a[i].clearbool)inp+= '<button class="btn btn-default" changeclear="'+a[i].name+'" type="button"><i class="icon-remove"></i></button>';
  129. inp+= '<button class="btn btn-default" changeuser="'+a[i].name+'" type="button"><i class="icon-search"></i></button>';
  130. inp+= '</span></div>';
  131. }else if(a[i].type=='date'){
  132. inp = '<div class="input-group"><input readonly class="form-control" id="'+a[i].name+'-'+rand+'-inputid" name="'+a[i].name+'" >';
  133. inp+= '<span class="input-group-btn">';
  134. inp+= '<button class="btn btn-default" '+attr+' changedate="'+a[i].view+'" inputid="'+a[i].name+'-'+rand+'-inputid" type="button"><i class="icon-calendar"></i></button>';
  135. inp+= '</span></div>';
  136. }else if(a[i].type=='html'){
  137. inp = a[i].html;
  138. }
  139. if(a[i].type == 'hidden'){
  140. s+='<tr><td></td><td>'+inp+'</td></tr>';
  141. }else{
  142. s+='<tr na="'+a[i].name+'">';
  143. s+='<td align="'+can.labelAlign+'" style="padding-right:5px" width="'+can.labelWidth+'">'+bt+''+a[i].labelText+'</td>';
  144. s+='<td style="padding:5px" align="left">'+inp+'</td>'
  145. s+='</tr>';
  146. }
  147. }
  148. s+='</table>';
  149. s+='</form>';
  150. s+='</div>';
  151. s+='<div style="padding:8px 10px;background:#eeeeee;line-height:30px" align="right"><span id="msgview_'+rand+'"></span>&nbsp;';
  152. s+=' <button type="button" class="btn btn-'+can.saveCls+'" disabled id="save_'+rand+'"><i class="icon-save"></i>&nbsp;'+can.saveText+'</button>';
  153. if(can.cancelbtn)s+='&nbsp; <button type="button" class="btn btn-default" id="cancel_'+rand+'"><i class="icon-remove"></i>&nbsp;取消</button>';
  154. s+='</div>';
  155. return s;
  156. };
  157. this.setVisited=function(na, bo){
  158. var o = obj.find("tr[na='"+na+"']");
  159. if(bo){o.show();}else{o.hide();}
  160. };
  161. this.isValid = function(){
  162. var bo= false,o;
  163. var a = can.items,s='';
  164. for(i=0; i<a.length; i++){
  165. if(a[i].required){
  166. if(isempt(this.getValue(a[i].name))){
  167. bo = true;
  168. s = a[i].tipText;
  169. if(!s)s=''+a[i].labelText+'不能为空';
  170. break;
  171. }
  172. }
  173. }
  174. if(!bo && can.requiredfields!=''){
  175. a = can.requiredfields.split(',');
  176. for(i=0; i<a.length; i++){
  177. if(isempt(this.getValue(a[i]))){
  178. bo = true;
  179. s = '*是必填的';
  180. break;
  181. }
  182. }
  183. }
  184. o = get('save_'+rand+'');
  185. if(o){
  186. o.disabled=bo;
  187. o.title=s;
  188. }
  189. this.isValidText = s;
  190. return bo;
  191. };
  192. this._cancel = function(o1){
  193. if(can.windowid!='')js.tanclose(can.windowid);
  194. };
  195. this.close = function(){
  196. this._cancel();
  197. };
  198. this.save = function(o1){
  199. this._save(o1, 1);
  200. };
  201. this.signature= function(da, url){
  202. var time = parseInt(js.now('time')*0.001);
  203. var siaa = ''+NOWURL+''+url+''+da.tablename_postabc+''+time+'_'+adminid+'';
  204. var sign = md5(siaa);
  205. da.sys_signature= sign;
  206. da.sys_timeature= time;
  207. return da;
  208. };
  209. this._save = function(o1, lx){
  210. if(this.isValid()){
  211. this.setmsg(this.isValidText);
  212. return;
  213. }
  214. var data = this.getValues(),ac,ebo=false,s,i;
  215. var fids = can.submitfields.split(',');
  216. for(i=0;i<fids.length;i++){
  217. ac = fids[i];
  218. if(data[ac]!=this.editdata[ac]){
  219. ebo = true;
  220. break;
  221. }
  222. }
  223. if(!ebo && lx == 0 && can.pdedit){
  224. //this.setmsg('数据没修改,不用保存','#F92FB6');
  225. //return;
  226. };
  227. s = can.submitcheck(data, me);
  228. if(typeof(s)=='string' && s){
  229. this.setmsg(s);
  230. return;
  231. }
  232. this.setmsg('处理中...','#ff6600');
  233. for(ac in can.params)data[ac]=can.params[ac];
  234. if(typeof(s)=='object'){
  235. for(ac in s)data[ac]=s[ac];
  236. }
  237. data.tablename_postabc = jm.encrypt(can.tablename);
  238. data.submitfields_postabc = jm.base64encode(can.submitfields);
  239. data.aftersaveaction = can.aftersaveaction;
  240. data.beforesaveaction = can.beforesaveaction;
  241. data.editrecord_postabc = can.editrecord;
  242. data.sysmodenumabc = can.modenum;
  243. o1.disabled = true;
  244. $.ajax({
  245. type:'post',
  246. url:can.url,
  247. data:this.signature(data, can.url),
  248. success:function(da){
  249. var a = js.decode(da);
  250. if(a.success){
  251. me.setmsg(a.msg, 'green');
  252. if(can.autoclose){
  253. js.msg('success', a.msg);
  254. me._cancel();
  255. }
  256. can.success(a, me);
  257. }else{
  258. o1.disabled = false;
  259. me.setmsg(a.msg);
  260. if(!a.msg)js.msg('msg', da);
  261. can.error();
  262. }
  263. },
  264. error:function(e){
  265. o1.disabled = false;
  266. me.setmsg('Error:'+e.responseText+'');
  267. can.error();
  268. }
  269. });
  270. };
  271. this.getValue = function(na){
  272. var o = this.form[na];
  273. if(!o)return '';
  274. return o.value;
  275. };
  276. this.setValue = function(na,val){
  277. var o = this.form[na];
  278. if(!o)return;
  279. o.value = val;
  280. };
  281. this.setUrl = function(url){
  282. can.url = url;
  283. };
  284. this.setmsg = function(txt,col){
  285. if(!col)col='red';
  286. var msgid = can.msgviewid;
  287. if(msgid == '')msgid='msgview_'+rand+'';
  288. $('#'+msgid+'').html(js.getmsg(txt,col));
  289. };
  290. this.getValues=function(){
  291. var da ={},i,ona='',o;
  292. for(i=0;i<this.form.length;i++){
  293. o = this.form[i];
  294. var type = o.type,
  295. val = o.value,
  296. na = o.name;
  297. if(type=='checkbox'){
  298. val = '0';
  299. if(o.checked)val='1';
  300. da[na] = val;
  301. }else if(type=='radio'){
  302. if(o.checked)da[na] = val;
  303. }else{
  304. da[na] = val;
  305. }
  306. if(na.indexOf('[]')>-1){
  307. if(ona.indexOf(na)<0)ona+=','+na+'';
  308. }
  309. }
  310. if(ona != ''){
  311. var onas = ona.split(',');
  312. for(i=1; i<onas.length; i++){
  313. da[onas[i].replace('[]','')] = js.getchecked(onas[i]);
  314. }
  315. }
  316. return da;
  317. };
  318. this.getType = function(na){
  319. var o = this.form[na];
  320. if(!o)return '';
  321. return a.type;
  322. };
  323. this.setValues=function(da, otf){
  324. var na,type,v,o,i,
  325. fis = can.submitfields.split(',');
  326. if(otf){
  327. var otfs = otf.split(',');
  328. for(i=0; i<otfs.length; i++)fis.push(otfs[i]);
  329. }
  330. for(i=0;i<fis.length;i++){
  331. na = fis[i];
  332. o = this.form[na];
  333. if(!o)continue;
  334. type= o.type;
  335. v = da[na];
  336. if(v==null)v='';
  337. da[na] = v;
  338. if(type == 'checkbox'){
  339. o.checked=(v=='1')?true:false;
  340. }else{
  341. o.value = v;
  342. }
  343. }
  344. this.setValue('id', da.id);
  345. this.editdata = da;
  346. this.isValid();
  347. };
  348. this.reset=function(){
  349. this.form.reset();
  350. };
  351. this.getField=function(na){
  352. return this.form[na];
  353. };
  354. this.setTitle = function(tit){
  355. $('#'+can.windowid+'_title').html(tit);
  356. };
  357. this.load = function(url){
  358. this.setmsg('加载中...');
  359. $.get(url, function(da){
  360. var a = js.decode(da);
  361. me._loadback(a);
  362. });
  363. };
  364. this._loadback = function(a){
  365. can.load(a, this, this.form);
  366. if(a.data)this.setValues(a.data);
  367. this.setmsg('');
  368. can.loadafter(a,this.form);
  369. };
  370. this.setReadOnly = function(na){
  371. if(na){
  372. this.getField(na).readOnly = true;
  373. }else{
  374. for(var i=0;i<this.form.length;i++){
  375. this.form[i].readOnly = true;
  376. }
  377. }
  378. };
  379. this.setDisabled = function(na){
  380. if(na){
  381. this.getField(na).disabled = true;
  382. }else{
  383. for(var i=0;i<this.form.length;i++){
  384. this.form[i].disabled = true;
  385. }
  386. }
  387. }
  388. };
  389. $.bootsform = function(options){
  390. var defaultVal = {
  391. items:[],labelWidth:90,width:500,height:400,
  392. labelAlign:'right',saveCls:'primary',
  393. tablename:'', //对应表名
  394. modenum:'', //对应模块编号
  395. url:js.getajaxurl('publicsave','index'),
  396. submitfields:'',autoclose:true,cancelbtn:true,
  397. params:{},bodywidth:'90%',addCls:'primary',editCls:'info',bodyheight:0,isedit:0,
  398. render:'',saveText:'确定',window:true,windowid:'',
  399. editrecord:'false', //是否保存修改记录
  400. defaultfields:{type:'text',blankText:'',labelText:'',required:false,readOnly:false,labelBox:'',attr:'',value:''},
  401. success:function(){},loadafter:function(){},
  402. load:function(){},
  403. aftersaveaction:'', //保存后处理方法
  404. beforesaveaction:'', //保存前处理方法
  405. requiredfields:'',
  406. error:function(){},saveid:'',msgviewid:'',rand:'',
  407. pdedit:true,
  408. submitcheck:function(){return ''}
  409. };
  410. var can = $.extend({}, defaultVal, options);
  411. if(can.isedit==0){
  412. can.saveCls = can.addCls;
  413. can.title = '<i class="icon-plus"></i> 新增 '+can.title+'';
  414. }
  415. if(can.isedit==1){
  416. can.saveCls = can.editCls;
  417. can.title = '<i class="icon-edit"></i> 编辑 '+can.title+'';
  418. }
  419. var clsa = new bootsform(false, can);
  420. clsa.init();
  421. return clsa;
  422. };
  423. })(jQuery);