mwf.xdesktop.requireapp("process.xform", "textfield", null, false);
/** @class number 数字输入组件。
* @o2cn 数字输入组件
* @example
* //可以在脚本中获取该组件
* //方法1:
* var field = this.form.get("name"); //获取组件
* //方法2
* var field = this.target; //在组件事件脚本中获取
* @extends mwf.xapplication.process.xform.textfield
* @o2category formcomponents
* @o2range {process|cms}
* @hideconstructor
*/
mwf.xapplication.process.xform.number = mwf.appnumber = new class(
/** @lends mwf.xapplication.process.xform.number# */
{
implements: [events],
extends: mwf.apptextfield,
iconstyle: "numbericon",
_loaduserinterface: function(){
if ( this.issectionmergeread() ) { //区段合并显示
this.node.empty();
this.node.set({
"nodeid": this.json.id,
"mwftype": this.json.type
});
switch (this.json.mergetyperead) {
case "amount":
this._loadmergeamountreadnode();
break;
case "average":
this._loadmergeaveragereadnode();
break;
default:
this._loadmergereadnode();
break;
}
}else{
if( this.issectionmergeedit() ){
switch (this.json.mergetypeedit) {
case "amount":
this._loadmergeamounteidtnode();
break;
case "average":
this._loadmergeaverageeditnode();
}
}else{
this._loadnode();
}
if (this.json.compute === "show"){
this._setvalue(this._computevalue());
}else{
this._loadvalue();
}
}
},
_loadmergeamountreadnode: function(){
var data = this.getbusinessdatabyid();
var total = new decimal(0);
for( var key in data ){
total = total.plus(new decimal(data[key] || 0));
}
this.node.set("text", this.formatnumber(total.tostring()));
},
_loadmergeaveragereadnode: function(){
var data = this.getbusinessdatabyid();
var total = new decimal(0);
for( var key in data ){
total = total.plus(new decimal(data[key] || 0));
}
var average = total.div( new decimal(object.keys(data).length) );
this.node.set("text", this.formatnumber(average.tostring()));
},
_loadmergeamounteidtnode: function(){
var data = this.getbusinessdatabyid();
var total = new decimal(0);
for( var key in data ){
total = total.plus(new decimal(data[key] || 0));
}
this._setbusinessdata( total.tonumber() );
this._loadnode();
},
_loadmergeaverageeditnode: function(){
var data = this.getbusinessdatabyid();
var total = new decimal(0);
for( var key in data ){
total = total.plus(new decimal(data[key] || 0));
}
var average = total.div( new decimal(object.keys(data).length) );
this._setbusinessdata( average.tonumber() );
this._loadnode();
},
isempty : function(){
return !this.getdata();
},
/**
* @summary 传入值获取适配最大值和最小值的数值.
* @example
* //如果最大值设置为500,最小值为100
*
* var value = this.form.get('field').getrangevalue( 300 );
* //value为300
*
* var value = this.form.get('field').getrangevalue( 10000 );
* //value为500
*
* var value = this.form.get('field').getrangevalue( 1 );
* //value为100
* @param value {string|nummber}
* @return {number} 获取适配最大值和最小值的数值.
*/
getrangevalue: function( value ){
var v = this.getmax( value );
return this.getmin( v );
},
getmax: function( value ){
if( isnan(value) )return value;
if( typeof( value ) === "string" )value = parsefloat(value);
if( !isnan( this.json.max )){
var max = this.json.max;
if( typeof( max ) === "string" )max = parsefloat(max);
return math.min( max, value );
}else{
return value;
}
},
getmin: function( value ){
if( isnan(value) )return value;
if( typeof( value ) === "string" )value = parsefloat(value);
if( !isnan( this.json.min )){
var min = this.json.min;
if( typeof( min ) === "string" )min = parsefloat(min);
return math.max( min, value );
}else{
return value;
}
},
getinputdata: function( flag ){
var input = this.node.getelement("input");
if (input){
var v = input.get("value");
v = this.unformatnumber( v );
var n = v.tofloat();
n = this.getmax( n );
n = this.getmin( n );
return (isnan(n)) ? (this.json.emptyvalue === "string" ? "" : 0) : n;
}else{
return this._getbusinessdata();
}
},
/**
* @summary 传入文本获取清除逗号的数值
* @example
* var value = this.form.get('field').unformatnumber( "30,000" );
* //value为30000
* @param str{string} 文本
* @return {number} 获取清除逗号的数值.
*/
unformatnumber: function(str){
return str.replace(/,/g, "");
},
/**
* @summary 传入文本或数值根据配置的小数位数和分隔符返回字符串
* @example
* //假设组件的设置为千分位分隔,保留小数两位
*
* var value = this.form.get('field').formatnumber( "30000.123" );
* //value为字符串"30,000.12"
*
* var value = this.form.get('field').formatnumber( 30000.123 );
* //value为字符串"30,000.12"
*
* @param str{string|number}
* @return {number} 根据配置的小数位数和分隔符返回字符串
*/
formatnumber: function(str){
var v = (str || "0").tofloat();
if (v){
if (this.json.decimals && (this.json.decimals!="*")){
var decimals = this.json.decimals.toint();
var p = math.pow(10,decimals);
var f_x = math.round(v*p)/p;
str = f_x.tostring();
if (decimals>0){
var pos_decimal = str.indexof('.');
if (pos_decimal < 0){
pos_decimal = str.length;
str = '.';
}
var decimalstr = (str).substr(pos_decimal 1, (str).length);
while (decimalstr.length < decimals){
str = '0';
decimalstr = 0;
}
}
}
if( this.json.digitstoseparate && parseint(this.json.digitstoseparate) > 1 ){
if( typeof( str ) === "number" )str = str.tostring();
var digits = parseint(this.json.digitstoseparate);
var reg = new regexp( "(\\d{" digits "}\\b)" ,"g");
var arr = str.split(".");
var i = arr[0].split("").reverse().join("")
.replace(reg, "$1,")
.split("").reverse().join("");
str = arr.length > 1 ? ( i "." arr[1] ) : i ;
}
}
return str;
},
validationformat: function(){
if( !this.node.getelement("input") )return true;
var n = this.getinputdata();
if (isnan(n)) {
if( n === "" && this.json.emptyvalue === "string" ){
return true;
}else{
this.notvalidationmode(mwf.xapplication.process.xform.lp.notvalidation_number);
return false;
}
}
return true;
},
// validationformat: function(){
// if( !this.node.getelement("input") )return true;
// var n = this.node.getelement("input").get("value");
// n = this.unformatnumber(n);
// if (isnan(n)) {
// if( n === "" && this.json.emptyvalue === "string" ){
// return true;
// }else{
// this.notvalidationmode(mwf.xapplication.process.xform.lp.notvalidation_number);
// return false;
// }
// }else{
// this.node.getfirst().set("value", this.formatnumber(n));
// }
// return true;
// },
validationconfigitem: function(routename, data){
var flag = (data.status=="all") ? true: (routename == data.decision);
if (flag){
var n = this.getinputdata();
var strn = n.tostring();
if( n === "" && this.json.emptyvalue === "string" )n = 0;
var v = (data.valuetype=="value") ? n : strn.length;
var strv = (data.valuetype=="value") ? strn : strn.length;
switch (data.operateor){
case "isnull":
if (!strv && strv.tostring()!=='0'){
this.notvalidationmode(data.prompt);
return false;
}
break;
case "notnull":
if (strv){
this.notvalidationmode(data.prompt);
return false;
}
break;
case "gt":
if (v>parsefloat(data.value)){
this.notvalidationmode(data.prompt);
return false;
}
break;
case "lt":
if (vdata.value)return data.prompt;
break;
case "lt":
if (v