123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496 |
- 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 (v<parseFloat(data.value)){
- this.notValidationMode(data.prompt);
- return false;
- }
- break;
- case "equal":
- if (v==parseFloat(data.value)){
- this.notValidationMode(data.prompt);
- return false;
- }
- break;
- case "neq":
- if (v!=parseFloat(data.value)){
- this.notValidationMode(data.prompt);
- return false;
- }
- break;
- case "contain":
- if (strV.toString().indexOf(data.value)!=-1){
- this.notValidationMode(data.prompt);
- return false;
- }
- break;
- case "notcontain":
- if (strV.toString().indexOf(data.value)==-1){
- this.notValidationMode(data.prompt);
- return false;
- }
- break;
- }
- }
- return true;
- },
- validationConfig: function(routeName, opinion){
- if (this.json.validationConfig){
- if (this.json.validationConfig.length){
- for (var i=0; i<this.json.validationConfig.length; i++) {
- var data = this.json.validationConfig[i];
- if (!this.validationConfigItem(routeName, data)) return false;
- }
- }
- return true;
- }
- return true;
- },
- _resetNodeEdit: function(){
- var input = new Element("input", {
- "styles": {
- "background": "transparent",
- "width": "100%",
- "border": "0px"
- }
- });
- var node = new Element("div", {"styles": {
- "overflow": "hidden",
- "position": "relative",
- "margin-right": "20px",
- "padding-right": "4px"
- }}).inject(this.node, "after");
- input.inject(node);
- this.node.destroy();
- this.node = node;
- },
- _loadNodeEdit: function(){
- debugger;
- if (!this.json.preprocessing) this._resetNodeEdit();
- var input = this.node.getFirst();
- if( !input && this.nodeHtml ){
- this.node.set("html", this.nodeHtml);
- input = this.node.getFirst();
- }
- input.set(this.json.properties);
- this.node.set({
- "id": this.json.id,
- "MWFType": this.json.type,
- "events": {
- "click": this.clickSelect.bind(this)
- }
- });
- if (this.json.showIcon!='no' && !this.form.json.hideModuleIcon) {
- this.iconNode = new Element("div", {
- "styles": this.form.css[this.iconStyle]
- }).inject(this.node, "before");
- }else if( this.form.json.nodeStyleWithhideModuleIcon ){
- this.node.setStyles(this.form.json.nodeStyleWithhideModuleIcon)
- }
- this.node.getFirst().addEvent("change", function(){
- this.validationMode();
- if (this.validation()) {
- var value = this.getInputData("change");
- this._setBusinessData(value);
- this.node.getFirst().set("value", this.formatNumber( value.toString() ));
- this.fireEvent("change");
- }
- }.bind(this));
- this.node.getFirst().addEvent("blur", function(){
- this.validation();
- }.bind(this));
- this.node.getFirst().addEvent("keyup", function(){
- this.validationMode();
- }.bind(this));
- },
- _computeValue: function(value){
- if( this.json.defaultValue && this.json.defaultValue.code){
- return this.form.Macro.exec(this.json.defaultValue.code, this)
- }else{
- if(value){
- return value;
- }else{
- return this.json.emptyValue === "string" ? "" : "0";
- }
- }
- },
- __setData: function(data, fireChange){
- var old = this.getInputData();
- this._setBusinessData(data);
- if (this.node.getFirst()){
- this.node.getFirst().set("value", this.formatNumber(data));
- this.checkDescription();
- this.validationMode();
- }else{
- this.node.set("text", this.formatNumber(data));
- }
- if (fireChange && old!==data) this.fireEvent("change");
- this.moduleValueAG = null;
- },
- resetData: function(){
- var value = this.moduleValueAG || this._getBusinessData();
- if (!value) value = this._computeValue();
- this.setData(value || "");
- },
- getValue: function(){
- if (this.moduleValueAG) return this.moduleValueAG;
- var value = this._getBusinessData();
- if( this.json.emptyValue === "string" ){
- if( value === "" || typeOf(value)==="null" )value = this._computeValue();
- }else{
- if( value === "" || value === 0 || typeOf(value)==="null" )value = this._computeValue();
- }
- if( ( value === "" || typeOf(value)==="null" ) && this.json.emptyValue === "string"){
- return "";
- }else{
- value = this.formatNumber(value);
- return value || "0";
- }
- },
- __setValue: function(value){
- var v = typeOf( value ) === "string" ? this.unformatNumber( value ) : value;
- v = this.isNumber( v ) ? parseFloat( v ) : v;
- this._setBusinessData(v);
- var val = value;
- if( this.json.emptyValue === "string" ){
- if( typeOf(v)==="null" )val = "";
- if( v === 0 )val = "0";
- }else{
- if( v === 0 || v === "" || typeOf(v)==="null" )val = "0";
- }
- if (this.node.getFirst()) this.node.getFirst().set("value", value || val);
- if (this.isReadonly()) this.node.set("text", value || val);
- this.moduleValueAG = null;
- this.fieldModuleLoaded = true;
- return value;
- },
- isNumber : function( d ){
- return parseFloat(d).toString() !== "NaN";
- },
- validationConfigItemExcel: function(data){
- if (data.status=="all"){
- 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')return data.prompt;
- break;
- case "notnull":
- if (strV)return data.prompt;
- break;
- case "gt":
- if (v>data.value)return data.prompt;
- break;
- case "lt":
- if (v<data.value)return data.prompt;
- break;
- case "equal":
- if (v==data.value)return data.prompt;
- break;
- case "neq":
- if (v!=data.value)return data.prompt;
- break;
- case "contain":
- if (strV.toString().indexOf(data.value)!=-1)return data.prompt;
- break;
- case "notcontain":
- if (strV.toString().indexOf(data.value)==-1)return data.prompt;
- break;
- }
- }
- return true;
- }
- });
|