SeparNumber.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /***
  2. * 支持千分位NumberField
  3. *
  4. * @author yingp
  5. */
  6. Ext.define('erp.view.core.form.SeparNumber', {
  7. extend: 'Ext.form.field.Number',
  8. alias: 'widget.separnumberfield',
  9. initComponent: function(){
  10. var me = this;
  11. me.hideTrigger = true;
  12. me.subTplData = me.subTplData || {};
  13. Ext.apply(me.subTplData, {
  14. suffix : '-separ',
  15. enableSeparator : true
  16. });
  17. me.callParent(arguments);
  18. },
  19. fieldSubTpl: [
  20. '<input id="{id}{suffix}" type="text" style="width: 100%;display: {enableSeparator:this.showTextField};" {inputAttrTpl}',
  21. ' size="1"',
  22. '<tpl if="name"> name="{name}{suffix}"</tpl>',
  23. '<tpl if="value"> value="{value:this.formatValue}"</tpl>',
  24. '<tpl if="placeholder"> placeholder="{placeholder}"</tpl>',
  25. '{%if (values.maxLength !== undefined){%} maxlength="{maxLength}"{%}%}',
  26. '<tpl if="readOnly"> readonly="readonly"</tpl>',
  27. '<tpl if="disabled"> disabled="disabled"</tpl>',
  28. '<tpl if="tabIdx"> tabIndex="{tabIdx}"</tpl>',
  29. '<tpl if="fieldStyle"> style="{fieldStyle}"</tpl>',
  30. ' class="{fieldCls} {typeCls} {editableCls} {inputCls}" autocomplete="off"/>',
  31. '<input id="{id}" type="{type}" style="width: 100%;display: {enableSeparator:this.showNumberField};" ',
  32. '<tpl if="name">name="{name}" </tpl>',
  33. '<tpl if="value"> value="{[Ext.util.Format.htmlEncode(values.value)]}"</tpl>',
  34. '<tpl if="size">size="{size}" </tpl>',
  35. '<tpl if="tabIdx">tabIndex="{tabIdx}" </tpl>',
  36. 'class="{fieldCls} {typeCls}" autocomplete="off" />',
  37. '<div id="{cmpId}-triggerWrap" class="{triggerWrapCls}" role="presentation">',
  38. '{triggerEl}',
  39. '<div class="{clearCls}" role="presentation"></div>',
  40. '</div>',
  41. {
  42. showNumberField : function(e) {
  43. return e === true ? 'none' : 'block';
  44. },
  45. showTextField : function(e) {
  46. return e === true ? 'block' : 'none';
  47. },
  48. formatValue : function(v) {
  49. v = isNaN(v) ? '0' : v;
  50. return Ext.util.Format.number(String(v), "0,000,000.00");
  51. }
  52. }
  53. ],
  54. listeners : {
  55. afterrender : function() {
  56. var me = this, n = me.getInputId(), s = n + me.subTplData.suffix;
  57. me.numberEl = Ext.get(n);
  58. me.textEl = Ext.get(s);
  59. var c = Ext.Function.bind(me.changeEditStatus, me);
  60. Ext.EventManager.on(me.numberEl, {
  61. blur : c,
  62. scope : me,
  63. buffer : 100
  64. });
  65. Ext.EventManager.on(me.textEl, {
  66. focus : c,
  67. scope: me,
  68. buffer : 100
  69. });
  70. setTimeout(function(){
  71. if(me.textEl)
  72. me.textEl.dom.value = me.formatValue(me.getValue());
  73. }, 200);
  74. },
  75. change : function() {
  76. if(this.textEl)
  77. this.textEl.dom.value = this.formatValue(this.getValue());
  78. this.setValue(this.numberFormat(this.getValue(), 2));
  79. }
  80. },
  81. changeEditStatus : function(e) {
  82. var me = this;
  83. if (e && e.type == 'focus') {
  84. me.textEl.dom.style.display = 'none';
  85. me.numberEl.dom.style.display = 'block';
  86. me.numberEl.dom.focus();
  87. me.numberEl.dom.select();
  88. } else {
  89. me.numberEl.dom.style.display = 'none';
  90. me.textEl.dom.style.display = 'block';
  91. me.textEl.dom.value = me.formatValue(this.getValue());
  92. }
  93. },
  94. formatValue : function(v) {
  95. v = isNaN(v) ? '0' : v;
  96. return Ext.util.Format.number(String(v), "0,000,000.00");
  97. },
  98. setFieldStyle : function(s) {
  99. var me = this;
  100. me.callParent(arguments);
  101. setTimeout(function(){
  102. if(me.textEl)
  103. me.textEl.setStyle(s);
  104. }, 200);
  105. },
  106. numberFormat:function(a, b) {
  107. if(a < 0){
  108. return Number('-'+Math.round(Math.abs(a)*Math.pow(10,b))/Math.pow(10,b));
  109. } else {
  110. return Math.round(a*Math.pow(10,b))/Math.pow(10,b);
  111. }
  112. }
  113. });