UNPKG

popbean-react

Version:

let me think about something,comming soon...

254 lines (251 loc) 8.23 kB
/* */ function buildField(item,colcount){//将一个field构建成一个字符串 var ret = ''; if(item['type'] == 'memo'){ ret = '<div className="form-group col-xs-12">'; ret += '<label htmlFor="'+item.code+'">'+item.label+'</label>'; ret += '<textarea type="text" className="form-control" id="'+item.code+'" placeholder="'+item.tip+'" rows="3" valueLink={this.linkState("data.'+item.code+'")}'; console.log('item[readOnly]',item['readOnly']); if(item['readonly'] || item['readonly'] == 'true'){ ret += ' readOnly'; } ret += '></textarea></div>'; }else if(item['type'] == 'date'){ ret = '<div className="form-group col-xs-'+ (12/colcount) +'">'; ret += '<label htmlFor="'+item.code+'">'+item.label+'</label>'; ret += '<DatePicker '; ret += 'key="'+item.code+'" '; ret += 'dateFormat="YYYY-MM-DD" '; ret += 'className="form-control" '; ret += 'id="'+item.code+'"'; ret += 'selected={this.state.data.'+item.code+'}'; ret += 'onChange={datechange_bus["'+item.code+'"]}'; if(item['readonly'] || item['readonly'] == 'true'){ ret += ' readOnly'; } ret += '/></div>'; }else if(item['type'] == 'ref'){//引用数据 ret = buildRefField(item,colcount); }else if(item['type'] == 'stat'){ ret = buildStatField(item,colcount); }else if(item['type'] == 'bool'){ ret = buildBoolField(item,colcount); }else { ret = '<div className="form-group col-xs-'+(12/colcount)+'">'; ret += '<label htmlFor="'+item.code+'">'+item.label+'</label>'; ret += '<input type="text" className="form-control" id="'+item['code']+'" placeholder="'+item.tip+'" valueLink={this.linkState("data.'+item.code+'")}'; if(item['readonly'] || item['readonly'] == 'true'){ ret += ' readOnly'; } ret += '/></div>'; } ret += '\n'; return ret; } function buildBoolField(item,colcount){ var ret = '<div className="form-group col-xs-'+(12/colcount)+'">'; ret += '<label for="'+item.code+'">'+item.label+'</label>'; ret += '<div className="checkbox">'; ret += '<label>'; ret += '<input type="checkbox" checkedLink={this.linkState("data.'+item.code+'")}'; if(item['readonly'] || item['readonly'] == 'true'){ ret += ' readOnly'; } ret += '></input>'+item.tip; ret += '</label>'; ret += '</div>'; ret += '</div>'; return ret; } /* 构建stat的显示 */ function buildStatField(item,colcount){//值域超过3项就占领一行 var range = item['rangeset'];//rangeset:value1:label1@value2:label2@value3:label3:default var pairs = range.split('@'); // var colspan = pairs.length >3?12:6;//如果需要支持,就要从split哪里下手,而不仅仅是这里 var ret = '<div className="form-group col-xs-'+(12/colcount)+'">';//需要根据值域范围来搞 ret += '<label for="'+item.code+'">'+item.label+'</label>'; ret += '<div className="radio">'; pairs.map(function(pair){ var array = pair.split(':');//对于默认值的问题,交给后端解决,而不是前端 var tmp = '<label className="radio-inline">'; tmp += '<input type="radio" checkedLink={this.radioLink("data.'+item.code+'","'+array[0]+'")}'; if(item['readonly'] || item['readonly'] == 'true'){ ret += ' readOnly'; } tmp += '/>'+array[1]; tmp += '</label>'; ret += tmp; }); ret += '</div>'; ret += '</div>'; return ret; } function buildRefField(item,colcount){ var ret = '<div className="form-group col-xs-'+(12/colcount)+'">';//需要根据值域范围来搞 ret += '<label for="'+item.code+'">'+item.label+'</label>'; ret += '<ReactSelect name="'+item.code+'"'; ret += ' value={this.state.data.'+item.code+'}'; if( (typeof item.range) == 'string'){//异步模式 ret += ' asyncOptions={reffetch_bus["'+item.code+'"]}'; }else{ // ret += ' options={ref_range["'+item.code+'"]}'; item.range; } ret += 'onChange={refchange_bus["'+item.code+'"]}'; if(item['readonly'] || item['readonly'] == 'true'){ ret += ' readOnly'; } ret += '/>'; ret +='</div>'; return ret; } function layout(fields,start,end,col_count){//将指定区段的属性放到数组中 var ret = []; if(start == end){//独立成行的情况 var part = '<div className="row">'+'\n'; part += buildField(fields[start],col_count); part +='</div>'+'\n'; ret.push(part);//做一个group就行 return ret; } var rows = Math.ceil((end-start+1)/col_count); for(var i=0;i<rows;i++){//初始化 ret[i] = '<div className="row">'+'\n'; for(var ii=0;ii<col_count;ii++){ if((i*col_count+ii+1)<=(end-start+1)){//如果超出了范围就滚蛋 ret[i] += buildField(fields[i*col_count+ii],col_count)+'\n'; } } ret[i] += '</div>'+'\n'; } /* var current_col = 0;//所在组 for(var i=start;i<=end;i++){ if(current_col > (col_count-1)){ current_col = 0;//复位 } for(var ii=0;ii<col_count;ii++){ var tmp = (i+1)%(ii+1); current_col ++; if(tmp == 0){ ret[ii] += buildField(fields[i],col_count)+'\n'; break; } } } for(var i=0;i<rows;i++){//初始化 ret[i] += '</div>'+'\n'; }*/ return ret; } function split(fields){//将数据分组 var ret = []; var start = 0; for(var i = 0,len=fields.length;i<len;i++){ if(fields[i]['type'] == 'memo'){ if(start != i){//说明就是 ret.push({start:start,end:i-1}); start = i+1;//将 }else{ start=i; } ret.push({start:i,end:i});//将当前这个memo也加进去 } } if(start != (fields.length-1)){ ret.push({start:start,end:(fields.length-1)}); } return ret; } function filter(model,scope){//复制出来一份 var ret = {}; for(var key in model){//很毛坯的拷贝一个对象 ret[key] = model[key]; } //将需要显示的内容识别出来 var fields = []; ret.fields.map(function(item){ if(item.scope == 'both' || item.scope == scope){ fields.push(item); } }); model.fields = fields; return model; } var Builder = { }; function clone(obj){ var ret = {}; for(var key in obj){//很毛坯的拷贝一个对象 ret[key] = obj[key]; } return ret; } module.exports = Builder; module.exports ={ build:function(colcount,fields){//根据输入的字符串来搞 //col_count应该[1,3] var ret = '<div>'; var array = split(fields); for(var i=0,len=array.length;i<len;i++){ var tmp_array = layout(fields,array[i]['start'],array[i]['end'],colcount); tmp_array.map(function(item){ ret += item; }); } ret += '</div>'; return ret; }, filter:function(model,scope){//过滤属性;适用于search-box的获取 var ret = clone(model); //将需要显示的内容识别出来 var fields = []; ret.fields.map(function(item){ if(item.scope == 'both' || item.scope == scope){ fields.push(item); } }); ret.fields = fields; return ret; }, filterByStage:function(fields,stage){//按照card和list两种状态来过滤? //将需要显示的内容识别出来 var ret = []; fields.map(function(item){ if(item['visible'] =='false' || item['visible'] == false){ //不显示就算了 }else{ if(item['show'+stage] == 'true' || item['show'+stage] == true){ var inst ; if(stage =='list'){ inst = { name:item['code'], title:item['label'] }; inst[stage+'pos'] = item[stage+'pos']; }else{ inst = item; } ret.push(inst); } } }); // ret = ret.sort(function(a,b){ return parseInt(a[stage+'pos']||0)-parseInt(b[stage+'pos']||0); }); // return ret; }, sort:function(model,sortkey){//指定排序 var ret = clone(model); ret.fields = ret.fields.sort(function(a,b){ return parseInt(a[sortkey])-parseInt(b[sortkey]); }); return ret; } };