Ext에서 날짜 구간 선택 구성 요소

10935 단어 구성 요소ext구간
Ext의 응용에서 우리는 날짜 구간에 따라 조회를 하는 데 자주 사용된다. 일반적인 방법은 두 개의 날짜 구성 요소를 써서 레이아웃으로 실현하는 것이다. 나는 이렇게 하는 것이 비록 기능은 실현되었지만 사용자 체험이 좋지 않다고 생각한다. 이것은 다음과 같은 날짜 구간을 작성하여 구성 요소를 선택하는 것과 같다. 코드는 다음과 같다.

/**
 *  
 * @class Ext.form.uxDateAreaField
 * @extends Ext.Container
 */
Ext.form.uxDateAreaField = Ext.extend(Ext.Container,{
	
	single : true,// 
	paramName : [null,null],
	format : 'Y-m-d',// 
	separator : ',',// , 
	allowBlank : true,
	disabled : false,
	blankText : ' ',
	msgTarget : 'qtip',// 
	invalidText : ' ',
	invalidClass : 'x-form-invalid',
	disabledClass : 'x-item-disabled',
	preventMark : false,//true 
	
	//private
	cls : 'x-form-text x-form-field',
	//private
	isFormField : true,
	
	//private
	activeField : null,
	
	initComponent : function(){
		
		Ext.form.uxDateAreaField.superclass.initComponent.call(this);
		
		this.startName = this.single?null:(this.paramName[0] || (this.name + 'Start'));
		this.endName = this.single?null:(this.paramName[1] || (this.name + 'End'));
		
		this.menu = new Ext.menu.DateMenu({
			scope : this,
			handler : function(picker,date){
				if(!Ext.isEmpty(this.activeField)){
					this.activeField.setValue(date.format(this.format));
					var b = this.validateValue();
					if(b && !Ext.isEmpty(this.hiddenField)){
						this.hiddenField.setValue(this.getValue());
					}
				}
			
			}
		});
		
		// 
		this.startField = new Ext.form.TextField({
			style : 'border:none;text-align:center;margin-left:-3px;',
			cls : 'ux-datearea-field',
			name : this.startName,
			disabled : this.disabled,
			listeners : {
				scope : this,
				'focus' : function(field){
					this.activeField = field;
					this.addClass('x-form-focus');
					this.menu.show(field.el, "tl-bl?");
				},
				'blur' : function(){
					this.removeClass('x-form-focus');
					this.validateValue();
				},
				'render' : function(field){
					field.removeClass('x-form-text');
					if(this.single/* || Ext.isEmpty(this.name)*/){
			        	field.el.dom.name = null;
			        }else{
			        	this.remove(this.hiddenField);
			        }
				}
			}
		});
		
		// 
		this.displayField = new Ext.form.DisplayField({
			cls : 'ux-datearea-field',
			style : 'padding-top: 3px;line-height:normal;',
			width : 16,
			value : ' '
		});
		
		this.endField = this.startField.cloneConfig({
			name : this.endName
		});
		
		this.hiddenField = new Ext.form.Hidden({
			ref : 'containerField',
			name : this.name,
			disabled : this.disabled
		});
		
		this.add(this.startField,this.displayField,this.endField,this.hiddenField);
		this.setDisabled(this.disabled);
		this.on('resize',function(){
			this.fixWidth();
			this.el.setStyle({
				'padding-top' : '0px',
				'height' : Ext.isIE?'22px':'21px'
			});
		},this);
	},
	
	disable : function(){
        if(this.rendered){
        	this.addClass(this.disabledClass);
            this.startField.disable();
			this.endField.disable();
        }
        this.disabled = true;
        return this;
    },
    
    enable : function(){
        if(this.rendered){
            this.removeClass(this.disabledClass);
            this.startField.enable();
			this.endField.enable();
        }
        this.disabled = false;
        return this;
    },
	
	//private
	validateValue : function(){
		var startValue = this.startField.getValue();
		var endValue = this.endField.getValue();
		if(!Ext.isEmpty(startValue) && !Ext.isEmpty(endValue)){
			if(startValue > endValue){
				this.markInvalid();
				return false;
			}else{
				this.clearInvalid();
				return true;
			}
		}else if(!this.allowBlank){
			this.markInvalid(this.blankText);
			return false;
		}
		return true;
	},
	
	validate : function(){
        if(!this.disabled){
            return this.validateValue();
        }
        return true;
    },
	
	//private
	fixWidth : function(){
		var calcWidth = (this.el.getComputedWidth() - 24)/2;
		this.startField.setWidth(calcWidth + 3);
		this.endField.setWidth(calcWidth + 3);
	},
	
	//private
	getMessageHandler : function(){
        return Ext.form.MessageTargets[this.msgTarget];
    },
    
    // 
    getValue : function(){
    	var start = this.startField.getValue();
    	var end = this.endField.getValue();
		if(this.single){
			return start + this.separator + end;
		}else{
			return [start,end];
		}
    },
    
    // 
    setValue : function(v){
    	this.value = v;
        if(this.rendered){
            if(Ext.isEmpty(v)){
            	this.startField.setValue('');
	            this.endField.setValue('');
	            if(!this.allowBlank){
	            	this.validateValue();
	            }
            }else{
            	if(Ext.isString(v)){
	            	var valueArray = v.split(this.separator);
	            	this.startField.setValue(valueArray[0]);
	            	this.endField.setValue(valueArray[1]);
	            }
	            if(Ext.isArray(v)){
	            	this.startField.setValue(v[0]);
	            	this.endField.setValue(v[1]);
	            }
	            if(Ext.isObject(v)){
	            	this.startField.setValue(v[this.startName]);
	            	this.endField.setValue(v[this.endName]);
	            }
            }
            this.validateValue();
        }
        return this;
    },
    
    markInvalid : function(msg){
        if (this.rendered && !this.preventMark) {
            msg = msg || this.invalidText;
            var mt = this.getMessageHandler();
            if(mt){
                mt.mark(this, msg);
                this.startField.addClass('ux-dataarea-invalid');
				this.endField.addClass('ux-dataarea-invalid');
				this.displayField.addClass('ux-dataarea-invalid');
            }else if(this.msgTarget){
                this.el.addClass(this.invalidClass);
                this.startField.addClass('ux-dataarea-invalid');
				this.endField.addClass('ux-dataarea-invalid');
				this.displayField.addClass('ux-dataarea-invalid');
                var t = Ext.getDom(this.msgTarget);
                if(t){
                    t.innerHTML = msg;
                    t.style.display = this.msgDisplay;
                }
            }
        }
        
    },
    
    afterRender : function(){
        Ext.form.uxDateAreaField.superclass.afterRender.call(this);
//        this.initEvents();
        this.initValue();
        if(!this.single){
        	this.remove(this.hiddenField);
        }
    },
    
    initValue : function(){
        if(this.value !== undefined){
            this.setValue(this.value);
        }else /*if(!Ext.isEmpty(this.el.dom.value) && this.el.dom.value != this.emptyText)*/{
            this.setValue('');
        }
        this.originalValue = this.getValue();
    },
    
    reset : function(){
        this.setValue(this.originalValue);
        this.clearInvalid();
    },
    
    clearInvalid : function(){
        if (this.rendered && !this.preventMark) {
            this.el.removeClass(this.invalidClass);
            this.startField.removeClass('ux-dataarea-invalid');
			this.endField.removeClass('ux-dataarea-invalid');
			this.displayField.removeClass('ux-dataarea-invalid');
            var mt = this.getMessageHandler();
            if(mt){
                mt.clear(this);
            }else if(this.msgTarget){
                this.el.removeClass(this.invalidClass);
                this.startField.removeClass('ux-dataarea-invalid');
				this.endField.removeClass('ux-dataarea-invalid');
				this.displayField.removeClass('ux-dataarea-invalid');
                var t = Ext.getDom(this.msgTarget);
                if(t){
                    t.innerHTML = '';
                    t.style.display = 'none';
                }
            }
        }
        
    },
    
    getName : function(){
        return this.rendered && this.el.dom.name ? this.el.dom.name : this.name || this.id || '';
    },
    
    getErrorCt : function(){
        return this.el.findParent('.x-form-element', 5, true) ||
            this.el.findParent('.x-form-field-wrap', 5, true);
    },
    
    // Alignment for 'under' target
    alignErrorEl : function(){
        this.errorEl.setWidth(this.getErrorCt().getWidth(true) - 20);
    },

    // Alignment for 'side' target
    alignErrorIcon : function(){
        this.errorIcon.alignTo(this.el, 'tl-tr', [2, 0]);
    }
    
    
});
Ext.reg('dateareafield',Ext.form.uxDateAreaField);

사용할 스타일은 다음과 같습니다.
.ux-datearea-field{
float:left;
background-color: #FFFFFF;
text-align:center;
padding-top: 4px;
background-image: url("../js/ext/resources/images/default/form/text-bg.gif");
}
.ux-dataarea-invalid{
background-color:#fbeced;
background-image: url("");
}
그림 파일은 첨부 파일에 있습니다.
실현된 효과는 첨부된 그림을 참고하세요
설명: 여러분은 구성 요소를 추출하고 이를 바탕으로 확장할 수 있으며 거의 모든 구간 클래스 조회를 실현할 수 있습니다
조작하기 편리하도록 하나의 설정 항목single이 있습니다. 이 설정 항목의 역할은 폼을 제출할 때 하나의 매개 변수를 제출하는지 두 개의 매개 변수를 제출하는지 제어하는 것입니다. 매개 변수를 제출할 때 이 두 날짜의 값은 하나의 구분 문자로 구분되고 두 개의 매개 변수로 제출할 때 다른 구성 요소와 같습니다.

좋은 웹페이지 즐겨찾기