FDateTime_wev8.js 6.47 KB
define(['mUtil', "Component", "Form"], function (mUtil, Component, Form) {
	var FDateTime = function (options) {
		var _dt = {}, $wevField, $field, $fieldspan, $clearBtn, $clearBtnWrapper;

		Component.super(this, options);

		this.type = "FDateTime";
		this.tpl = this.type + "_html";
        this.dataload = true;

		var vm = this.viewModel = {
			form: "",
			field: {
				label: "",		//显示名
				name: "",		//字段名
				id: "",  		//字段id
				type: "date",	//字段类型
				value: "",		//字段值
				defaultValue: ""
			},
			yearOffest: {//年份偏移
				prev: 100,
				next: 1
			},
			detailtable: {
				isA: false	//是否是明细表字段
			},
			placeholder: "请选择...",
			required: false,
			readonly: false,
			needWrap: false
		};
		
		this.dbValueHasSet = false; //是否已设置表单数据值,调用this.setValueByDB()方法后修改此状态

		this.beforeMount = function () {
			var value = vm.field.value, fieldType = vm.field.type;
			vm.showCleanBtn = !vm.readonly && value;
			vm.dtpicker = fieldType == "date" || fieldType == "time" || fieldType == "datetime";
			
			//主表或明细新增,并且值为空 但默认值不为空时,使用默认值代替赋值
            Form.utils.setDefaultValue(this.pageid, vm);
		};

		this.mounted = function () {
		    var that = this;
			$wevField = this.$el.find(".wev-field");
			$field = this.$el.find("input[name='fieldname_" + vm.field.name + "']");
			$fieldspan = this.$el.find(".wev-field-view-span");
			$clearBtn = this.$el.find(".wev-clear-btn");
			$clearBtnWrapper = $clearBtn.parent();

			if (!vm.readonly) {
				_dt.init();
			}
			
			if(vm.field.needParseSqlValue){
			    //解析默认值,默认值sql
	            return Form.utils.parseDefaultSqlValue(vm.field.defaultValue, this.pageid, function(result){
	                vm.field.value = result;
	                //设置默认值
	                that.setValue(result);
	            });
			}else{
				that.setValue(vm.field.value);
			}
		};

		_dt.init = function () {
			var that = this,
				fieldType = vm.field.type;

			var currYear = (new Date()).getFullYear();
			var pageEvent = require("pageEvent");

			require(["dtpicker"], function () {
				var dtpicker = null;
				var _hidePicker = function () {
					dtpicker && dtpicker.dispose();
				};

				$fieldspan.on("click", function () {
					var _self = this;
					if (!_self.dtPicker) {
						_self.dtPicker = new $.DtPicker({
							value: $field.val(),
							type: fieldType,
							beginYear: currYear - Number(vm.yearOffest.prev),
							endYear: currYear + Number(vm.yearOffest.next),
							close: function () {
								pageEvent.destory("change", _hidePicker);
							}
						});
					}
					_self.dtPicker.show(function (result) {
						that.setValue(result.value);
						_self.dtPicker.dispose();
						_self.dtPicker = null;
						return false;
					});
					dtpicker = _self.dtPicker;
					pageEvent.destory("change", _hidePicker).register("change", _hidePicker);
				});
			});
			
			$field.on("change", function () {
				$clearBtnWrapper.toggleClass("wev-has-value", !!$field.val());
			});
			
			//清除
			$clearBtn.on("click", function () {
				that.setValue("");
			});
		};

		this.getData = function () {
			return mUtil.parseJSON("fieldname_" + vm.field.name, $field.val());
		};

        this.getShowData = function(){
            var showData = mUtil.parseJSON(vm.field.name + "_showvalue", $field.val());
            showData[vm.field.name] = $field.val();
            return showData;
        };

		this.reset = function () {
			this.setValue(vm.field.value);
			$wevField.removeClass("wev-required-remind");
		};

		this.checkRequired = function () {
			var required = vm.required && !$field.val();
			var fieldLabel = vm.field.label || mUtil.getLabel(82281, "日期时间");

			$wevField.toggleClass("wev-required-remind", required);

			return required && fieldLabel;
		};
		
		this.setRequired = function (required) {
			vm.required = required;
			$wevField.toggleClass("wev-field-required", required);
			!required && $wevField.removeClass("wev-required-remind");
		};
		
		this.setValueByDB = function(value){
			this.dbValueHasSet = true;
			if(value || !vm.field.value) {
				//明细表日期时间编辑不需要再次转时区
                (!vm.detailtable.isA && vm.field.type == 'datetime') && (value = _dt.getDateTimeByTimeZone(value));
                vm.field.value = value;
                this.setValue(value);
            }
		};

		this.setValue = function (value) {
			if (vm.readonly) {
				value && $fieldspan.html(value);
			} else {
				$fieldspan[value ? "removeClass" : "addClass"]("wev-field-view-tip").html(value ? value : vm.placeholder);
			}

			$field.val(value||'').triggerHandler("change");
			this.dbValueHasSet && mUtil.trigger('dataload', this.pageid, this.id);
		};
		
		this.bindTrigger = function (triggers, isTrigger) {
			var that = this,
				fieldid = vm.field.id,
				billid = $p("billid");
			
			if (fieldid && mUtil.isObject(triggers) && triggers["field" + fieldid]) {
				var trigger = triggers["field" + fieldid];
				
				$field.bind("change", function () {
					Mobile_NS.readyToTrigger(trigger, $field, that.$container);
				});
				//默认值触发字段联动,主表新建或者是明细表添加数据时触发
				if (vm.field.value && ((vm.form.indexOf("detailtable") == -1 && !$p("billid")) || isTrigger)) {
					Mobile_NS.readyToTrigger(trigger, $field, that.$container);
				}
			}
		};
		
		_dt.getDateTimeByTimeZone = function (dateTime, fromTimeZone, toTimeZone) {
			if(!dateTime) return;
			fromTimeZone = fromTimeZone || window.__meta__.serverTimeZone;
			if(!fromTimeZone) return dateTime;
			var s = new Date(Date.parse(dateTime.replace(/-/g, "/"))).getTime();
			toTimeZone = toTimeZone || new Date().getTimezoneOffset();
			return fromTimeZone == toTimeZone ? dateTime : _dt.formatDate(new Date(s + fromTimeZone * 60 * 1000 - toTimeZone * 60 * 1000));
		};
		
		_dt.formatDate = function (date) {  
		    var y = date.getFullYear();  
		    var m = date.getMonth() + 1;  
		    m = m < 10 ? ('0' + m) : m;  
		    var d = date.getDate();  
		    d = d < 10 ? ('0' + d) : d;  
		    var h = date.getHours();
			h = h < 10 ? ('0' + h) : h;
			var minute = date.getMinutes();
		    minute = minute < 10 ? ('0' + minute) : minute; 
		    var second= date.getSeconds();  
		    second = second < 10 ? ('0' + second) : second;
		    return y + '-' + m + '-' + d + ' '+ h + ':' + minute + ':' + second;  
		}; 
		
		_dt.init = _dt.init.bind(this);
	};

	return Component.init(FDateTime);
});