433 lines
13 KiB
JavaScript
433 lines
13 KiB
JavaScript
/**
|
||
* bootstable 表单录入插件
|
||
* caratename:雨中磐石(rainrock)
|
||
* caratetime:2014-04-06 21:40:00
|
||
* email:admin@rockoa.com
|
||
* homepage:www.rockoa.com
|
||
*/
|
||
|
||
|
||
(function ($) {
|
||
|
||
function bootsform(element, options){
|
||
var obj = element;
|
||
var can = options;
|
||
var rand = can.rand;
|
||
var me = this;
|
||
this.form = null;
|
||
this.editdata = {};
|
||
this.itemsdata = {};
|
||
|
||
this.init = function(){
|
||
if(rand=='')rand=js.getrand();
|
||
if(!can.window)return;
|
||
can.windowid = 'window_'+rand+'';
|
||
var s = this._create();
|
||
js.tanbody(can.windowid, can.title, can.width, can.height,{bbar:'none',html:s,titlecls:can.saveCls});
|
||
can.render = ''+can.windowid+'_body';
|
||
obj = $('#'+can.render+'');
|
||
this.createafter();
|
||
$('#cancel_'+rand+'').focus();
|
||
};
|
||
this.forminit = function(){
|
||
this.createafter();
|
||
};
|
||
this.createafter = function(){
|
||
this.form = document['form_'+rand+''];
|
||
var saveid = can.saveid;
|
||
if(saveid=='')saveid = 'save_'+rand+'';
|
||
$('#'+saveid+'').click(function(){
|
||
me._save(this, 0);
|
||
});
|
||
$('#cancel_'+rand+'').click(function(){
|
||
me._cancel(this);
|
||
});
|
||
var a = can.items,b=[],i;
|
||
if(can.requiredfields!='')b = can.requiredfields.split(',');
|
||
for(i=0; i<a.length; i++){
|
||
if(a[i].required)b.push(a[i].name);
|
||
}
|
||
for(i=0; i<b.length; i++){
|
||
$(this.form[b[i]]).change(function(){
|
||
me.isValid();
|
||
});
|
||
$(this.form[b[i]]).blur(function(){
|
||
me.isValid();
|
||
});
|
||
}
|
||
if(obj){
|
||
obj.find("button[changeuser]").click(function(){
|
||
me._changeuser($(this));
|
||
return false;
|
||
});
|
||
obj.find("button[changeclear]").click(function(){
|
||
me._changeclear($(this));
|
||
return false;
|
||
});
|
||
obj.find("button[changedate]").click(function(){
|
||
me._changedate($(this));
|
||
return false;
|
||
});
|
||
}
|
||
};
|
||
this._changeuser = function(o){
|
||
var cn = o.attr('changeuser');
|
||
var ssa = this.itemsdata[cn].changeuser;
|
||
if(!ssa)ssa={};
|
||
ssa.nameobj = this.form[cn];
|
||
if(ssa.idname){
|
||
ssa.value = this.getValue(ssa.idname);
|
||
ssa.idobj = this.form[ssa.idname];
|
||
}
|
||
js.getuser(ssa);
|
||
};
|
||
this._changedate = function(o){
|
||
var viev = o.attr('changedate'),atr='',
|
||
inpu = o.attr('inputid');
|
||
var cans = {view:viev,inputid:inpu,initshow:true};
|
||
o.rockdatepicker(cans);
|
||
};
|
||
this._changeclear = function(o){
|
||
var cn = o.attr('changeclear');
|
||
var ssa = this.itemsdata[cn].changeuser;
|
||
if(!ssa)ssa={};
|
||
if(ssa.idname){
|
||
this.setValue(ssa.idname, '');
|
||
}
|
||
this.setValue(cn, '');
|
||
};
|
||
this._create = function(){
|
||
var s = '',a=can.items,i,i1,style='padding:10px';
|
||
if(can.bodyheight!=0)style+=';height:'+can.bodyheight+'px';
|
||
s+='<div align="center" style="'+style+';overflow-y:auto" >';
|
||
s+='<form id="form_'+rand+'" name="form_'+rand+'" autocomplete="off" style="padding:0px;maring:0px">';
|
||
s+='<input name="id" value="0" type="hidden">';
|
||
s+='<table width="'+can.bodywidth+'">';
|
||
for(i=0; i<a.length; i++){
|
||
can.items[i] = js.applyIf(a[i], can.defaultfields);
|
||
a[i] = can.items[i];
|
||
this.itemsdata[a[i].name] = a[i];
|
||
var bl=a[i].blankText,bt='',attr = a[i].attr;
|
||
if(!bl)bl='';if(!attr)attr='';
|
||
if(a[i].required)bt='<font color="red">*</font>';
|
||
if(a[i].readOnly)attr+=' readonly';
|
||
if(a[i].repEmpty)attr+=' onblur="this.value=strreplace(this.value)"';
|
||
if(a[i].type=='number')attr+=' onfocus="js.focusval=this.value" onblur="js.number(this)"';
|
||
var inp = '<input placeholder="'+bl+'" '+attr+' type="'+a[i].type+'" value="'+a[i].value+'" name="'+a[i].name+'" class="form-control">';
|
||
if(a[i].type=='checkbox'){
|
||
if(a[i].checked)attr+=' checked';
|
||
inp = '<label><input name="'+a[i].name+'" '+attr+' value="1" type="checkbox"> '+a[i].labelBox+'</label>';
|
||
}else if(a[i].type=='textarea'){
|
||
inp = '<textarea placeholder="'+bl+'" '+attr+' name="'+a[i].name+'" class="form-control" style="height:'+a[i].height+'px">'+a[i].value+'</textarea>';
|
||
}else if(a[i].type=='select'){
|
||
inp = '<select name="'+a[i].name+'" class="form-control">';
|
||
var sto = a[i].store;
|
||
for(i1=0;i1<sto.length;i1++){
|
||
inp+='<option value="'+sto[i1][a[i].valuefields]+'">'+sto[i1][a[i].displayfields]+'</option>';
|
||
}
|
||
inp += '</select>';
|
||
}else if(a[i].type=='changeuser'){
|
||
inp = '<div class="input-group"><input placeholder="'+bl+'" readonly class="form-control" name="'+a[i].name+'" >';
|
||
inp+= '<span class="input-group-btn">';
|
||
if(a[i].clearbool)inp+= '<button class="btn btn-default" changeclear="'+a[i].name+'" type="button"><i class="icon-remove"></i></button>';
|
||
inp+= '<button class="btn btn-default" changeuser="'+a[i].name+'" type="button"><i class="icon-search"></i></button>';
|
||
inp+= '</span></div>';
|
||
}else if(a[i].type=='date'){
|
||
inp = '<div class="input-group"><input readonly class="form-control" id="'+a[i].name+'-'+rand+'-inputid" name="'+a[i].name+'" >';
|
||
inp+= '<span class="input-group-btn">';
|
||
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>';
|
||
inp+= '</span></div>';
|
||
}else if(a[i].type=='html'){
|
||
inp = a[i].html;
|
||
}
|
||
if(a[i].type == 'hidden'){
|
||
s+='<tr><td></td><td>'+inp+'</td></tr>';
|
||
}else{
|
||
s+='<tr na="'+a[i].name+'">';
|
||
s+='<td align="'+can.labelAlign+'" style="padding-right:5px" width="'+can.labelWidth+'">'+bt+''+a[i].labelText+'</td>';
|
||
s+='<td style="padding:5px" align="left">'+inp+'</td>'
|
||
s+='</tr>';
|
||
}
|
||
}
|
||
s+='</table>';
|
||
s+='</form>';
|
||
s+='</div>';
|
||
s+='<div style="padding:8px 10px;background:rgba(0,0,0,0.05);line-height:30px" align="right"><span id="msgview_'+rand+'"></span> ';
|
||
s+=' <button type="button" class="btn btn-'+can.saveCls+'" disabled id="save_'+rand+'"><i class="icon-save"></i> '+can.saveText+'</button>';
|
||
if(can.cancelbtn)s+=' <button type="button" class="btn btn-default" id="cancel_'+rand+'"><i class="icon-remove"></i> 取消</button>';
|
||
s+='</div>';
|
||
return s;
|
||
};
|
||
this.setVisited=function(na, bo){
|
||
var o = obj.find("tr[na='"+na+"']");
|
||
if(bo){o.show();}else{o.hide();}
|
||
};
|
||
this.isValid = function(){
|
||
var bo= false,o;
|
||
var a = can.items,s='';
|
||
for(i=0; i<a.length; i++){
|
||
if(a[i].required){
|
||
if(isempt(this.getValue(a[i].name))){
|
||
bo = true;
|
||
s = a[i].tipText;
|
||
if(!s)s=''+a[i].labelText+'不能为空';
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if(!bo && can.requiredfields!=''){
|
||
a = can.requiredfields.split(',');
|
||
for(i=0; i<a.length; i++){
|
||
if(isempt(this.getValue(a[i]))){
|
||
bo = true;
|
||
s = '*是必填的';
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
o = get('save_'+rand+'');
|
||
if(o){
|
||
o.disabled=bo;
|
||
o.title=s;
|
||
}
|
||
this.isValidText = s;
|
||
return bo;
|
||
};
|
||
|
||
this._cancel = function(o1){
|
||
if(can.windowid!='')js.tanclose(can.windowid);
|
||
};
|
||
this.close = function(){
|
||
this._cancel();
|
||
};
|
||
this.save = function(o1){
|
||
this._save(o1, 1);
|
||
};
|
||
this.signature= function(da, url){
|
||
var time = parseInt(js.now('time')*0.001);
|
||
var siaa = ''+NOWURL+''+url+''+da.tablename_postabc+''+time+'_'+adminid+'';
|
||
var sign = md5(siaa);
|
||
da.sys_signature= sign;
|
||
da.sys_timeature= time;
|
||
return da;
|
||
};
|
||
this._save = function(o1, lx){
|
||
if(this.isValid()){
|
||
this.setmsg(this.isValidText);
|
||
return;
|
||
}
|
||
var data = this.getValues(),ac,ebo=false,s,i;
|
||
var fids = can.submitfields.split(',');
|
||
for(i=0;i<fids.length;i++){
|
||
ac = fids[i];
|
||
if(data[ac]!=this.editdata[ac]){
|
||
ebo = true;
|
||
break;
|
||
}
|
||
}
|
||
if(!ebo && lx == 0 && can.pdedit){
|
||
//this.setmsg('数据没修改,不用保存','#F92FB6');
|
||
//return;
|
||
};
|
||
s = can.submitcheck(data, me);
|
||
if(typeof(s)=='string' && s){
|
||
this.setmsg(s);
|
||
return;
|
||
}
|
||
this.setmsg('处理中...','#ff6600');
|
||
for(ac in can.params)data[ac]=can.params[ac];
|
||
if(typeof(s)=='object'){
|
||
for(ac in s)data[ac]=s[ac];
|
||
}
|
||
data.tablename_postabc = jm.encrypt(can.tablename);
|
||
data.submitfields_postabc = jm.base64encode(can.submitfields);
|
||
data.aftersaveaction = can.aftersaveaction;
|
||
data.beforesaveaction = can.beforesaveaction;
|
||
data.editrecord_postabc = can.editrecord;
|
||
data.sysmodenumabc = can.modenum;
|
||
o1.disabled = true;
|
||
$.ajax({
|
||
type:'post',
|
||
url:can.url,
|
||
data:this.signature(data, can.url),
|
||
success:function(da){
|
||
var a = js.decode(da);
|
||
if(a.success){
|
||
me.setmsg(a.msg, 'green');
|
||
if(can.autoclose){
|
||
js.msg('success', a.msg);
|
||
me._cancel();
|
||
}
|
||
can.success(a, me);
|
||
}else{
|
||
o1.disabled = false;
|
||
me.setmsg(a.msg);
|
||
if(!a.msg)js.msg('msg', da);
|
||
can.error();
|
||
}
|
||
},
|
||
error:function(e){
|
||
o1.disabled = false;
|
||
me.setmsg('Error:'+e.responseText+'');
|
||
can.error();
|
||
}
|
||
});
|
||
};
|
||
this.getValue = function(na){
|
||
var o = this.form[na];
|
||
if(!o)return '';
|
||
return o.value;
|
||
};
|
||
this.setValue = function(na,val){
|
||
var o = this.form[na];
|
||
if(!o)return;
|
||
o.value = val;
|
||
};
|
||
this.setUrl = function(url){
|
||
can.url = url;
|
||
};
|
||
this.setmsg = function(txt,col){
|
||
if(!col)col='red';
|
||
var msgid = can.msgviewid;
|
||
if(msgid == '')msgid='msgview_'+rand+'';
|
||
$('#'+msgid+'').html(js.getmsg(txt,col));
|
||
};
|
||
this.getValues=function(){
|
||
var da ={},i,ona='',o;
|
||
for(i=0;i<this.form.length;i++){
|
||
o = this.form[i];
|
||
var type = o.type,
|
||
val = o.value,
|
||
na = o.name;
|
||
if(type=='checkbox'){
|
||
val = '0';
|
||
if(o.checked)val='1';
|
||
da[na] = val;
|
||
}else if(type=='radio'){
|
||
if(o.checked)da[na] = val;
|
||
}else{
|
||
da[na] = val;
|
||
}
|
||
if(na.indexOf('[]')>-1){
|
||
if(ona.indexOf(na)<0)ona+=','+na+'';
|
||
}
|
||
}
|
||
if(ona != ''){
|
||
var onas = ona.split(',');
|
||
for(i=1; i<onas.length; i++){
|
||
da[onas[i].replace('[]','')] = js.getchecked(onas[i]);
|
||
}
|
||
}
|
||
return da;
|
||
};
|
||
this.getType = function(na){
|
||
var o = this.form[na];
|
||
if(!o)return '';
|
||
return a.type;
|
||
};
|
||
this.setValues=function(da, otf){
|
||
var na,type,v,o,i,
|
||
fis = can.submitfields.split(',');
|
||
if(otf){
|
||
var otfs = otf.split(',');
|
||
for(i=0; i<otfs.length; i++)fis.push(otfs[i]);
|
||
}
|
||
for(i=0;i<fis.length;i++){
|
||
na = fis[i];
|
||
o = this.form[na];
|
||
if(!o)continue;
|
||
type= o.type;
|
||
v = da[na];
|
||
if(v==null)v='';
|
||
da[na] = v;
|
||
if(type == 'checkbox'){
|
||
o.checked=(v=='1')?true:false;
|
||
}else{
|
||
o.value = v;
|
||
}
|
||
}
|
||
this.setValue('id', da.id);
|
||
this.editdata = da;
|
||
this.isValid();
|
||
};
|
||
this.reset=function(){
|
||
this.form.reset();
|
||
};
|
||
this.getField=function(na){
|
||
return this.form[na];
|
||
};
|
||
this.setTitle = function(tit){
|
||
$('#'+can.windowid+'_title').html(tit);
|
||
};
|
||
|
||
this.load = function(url){
|
||
this.setmsg('加载中...');
|
||
$.get(url, function(da){
|
||
var a = js.decode(da);
|
||
me._loadback(a);
|
||
});
|
||
};
|
||
|
||
this._loadback = function(a){
|
||
can.load(a, this, this.form);
|
||
if(a.data)this.setValues(a.data);
|
||
this.setmsg('');
|
||
can.loadafter(a,this.form);
|
||
};
|
||
|
||
this.setReadOnly = function(na){
|
||
if(na){
|
||
this.getField(na).readOnly = true;
|
||
}else{
|
||
for(var i=0;i<this.form.length;i++){
|
||
this.form[i].readOnly = true;
|
||
}
|
||
}
|
||
};
|
||
this.setDisabled = function(na){
|
||
if(na){
|
||
this.getField(na).disabled = true;
|
||
}else{
|
||
for(var i=0;i<this.form.length;i++){
|
||
this.form[i].disabled = true;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
$.bootsform = function(options){
|
||
var defaultVal = {
|
||
items:[],labelWidth:90,width:500,height:400,
|
||
labelAlign:'right',saveCls:'primary',
|
||
tablename:'', //对应表名
|
||
modenum:'', //对应模块编号
|
||
url:js.getajaxurl('publicsave','index'),
|
||
submitfields:'',autoclose:true,cancelbtn:true,
|
||
params:{},bodywidth:'90%',addCls:'primary',editCls:'info',bodyheight:0,isedit:0,
|
||
render:'',saveText:'确定',window:true,windowid:'',
|
||
editrecord:'false', //是否保存修改记录
|
||
defaultfields:{type:'text',blankText:'',labelText:'',required:false,readOnly:false,labelBox:'',attr:'',value:''},
|
||
success:function(){},loadafter:function(){},
|
||
load:function(){},
|
||
aftersaveaction:'', //保存后处理方法
|
||
beforesaveaction:'', //保存前处理方法
|
||
requiredfields:'',
|
||
error:function(){},saveid:'',msgviewid:'',rand:'',
|
||
pdedit:true,
|
||
submitcheck:function(){return ''}
|
||
};
|
||
var can = $.extend({}, defaultVal, options);
|
||
if(can.isedit==0){
|
||
can.saveCls = can.addCls;
|
||
can.title = '<i class="icon-plus"></i> 新增 '+can.title+'';
|
||
}
|
||
if(can.isedit==1){
|
||
can.saveCls = can.editCls;
|
||
can.title = '<i class="icon-edit"></i> 编辑 '+can.title+'';
|
||
}
|
||
var clsa = new bootsform(false, can);
|
||
clsa.init();
|
||
return clsa;
|
||
};
|
||
})(jQuery); |