FBrowser_wev8.js 13 KB
define(['mUtil', "Component", "mService", "Form", "fieldParseHelper"],function(mUtil, Component, mService, Form) {
	var FBrowser = function(options) {
        var $el, $field, $showText, $hiddenText, $a, expand = false, _browser = {};
		
		Component.super(this, options);
		
		this.type = "FBrowser";
		this.tpl = this.type + "_html";
        this.dataload = true;

		var vm = this.viewModel = {
			form : "",
			field : {
				label : "",//显示名
				name : "", //字段名
				id : "",   //字段id
				value : "",//字段值
				defaultValue: ""
			},
			browser : {
				/*
				 * 字段详细类型(1:人力资源 2:日期 3:会议室联系单 4:部门 5:仓库 6:成本中心 7:客户 8:项目 9:文档 10:入库方式 
				 * 11:出库方式 12:币种 13:资产种类 14:科目-全部 15:科目-明细 16:请求 17:多人力资源 18:多客户 19:时间 20:计划类型 
				 * 21:计划种类 22:报销费用类型 23:资产 24:职务 25:资产组 26:车辆 27:应聘人 28:会议 29:奖惩种类 30:学历 
				 * 31:用工性质 32:培训安排 33:加班类型 34:请假类型 35:业务合同 36:合同性质 37:多文档 38:相关产品 
				 * 161:自定义单选 162:自定义多选 256:自定义树形单选 257:自定义树形多选)
				 * */
				typeid : "",//浏览框类型id
				identifie : "",//自定义浏览框标识,同建模引擎浏览框标识
                modeid: -1,
				haslink: true
			},
			detailtable: {
				isA: false	//是否是明细表字段
			},
			placeholder : "请选择",
			advancedSearch : false,
			required : false,
			readonly : false,
			needWrap : false,
			standalone : true
		};
		
		this.dbValueHasSet = false; //是否已设置表单数据值,调用this.setValueByDB()方法后修改此状态
		
		this.beforeMount = function () {
			//主表或明细新增,并且值为空 但默认值不为空时,使用默认值代替赋值
            Form.utils.setDefaultValue(this.pageid, vm);

			var typeid = vm.browser.typeid;
			//只读时 客户7、项目8、文档9、流程16、多客户18、多文档37、多项目135、多流程152、自定义单选161、自定义多选162、归档流程171打开对应页面
            var hasLinkType = ["7", "8", "9", "16", "18", "37", "135", "152", "161", "162", "171", "256", "257"];
            var diyBrowserType = ["161", "162", "256", "257"];
			var haslink = vm.readonly && hasLinkType.indexOf(typeid+"") != -1;
			if(haslink && diyBrowserType.indexOf(typeid+"") != -1 && (!vm.browser.modeid || vm.browser.modeid < 0 || !vm.browser.haslink)){
			    haslink = false;
            }
			vm.haslink = haslink;
		};
		
		this.mounted = function(){
		    var that = this;
			$el = this.$el;
			$field = $el.find("input[name='fieldname_" + vm.field.name + "']");
			$showText = vm.haslink ? $el.find(".text-haslink") : $el.find(".text");
			$hiddenText = $el.find(".hiddenText");
			$a = $showText.parent();

			//显示隐藏更多
			$el.find(".wev-showall-btn").on("click", function() {
				if(!expand) return;
				$a.toggleClass("showall");
				$(this).toggleClass("transform180",$a.hasClass("showall"));
			});
			
			if(vm.readonly){
				if(!vm.haslink){//文档、多文档、流程、多流程、归档流程
                    $showText.on("click", function() {//只读点击text显示隐藏更多
                        if(!expand) return;
                        $el.find(".wev-showall-btn").triggerHandler('click');
                    });
				}
			}else{
			    //清除
	            $el.find(".wev-clear-btn").on("click", function() {
	                _browser.setValue("", "");
	            });
	            //点击浏览按钮
	            $el.find(".search,.text,.wev-field-tip").on("click", function(e) {
	                var typeid = vm.browser.typeid,
	                    serviceName = "",
	                    params = {
	                        requestParams: {
	                            fieldid: vm.field.id,
	                            viewtype: vm.detailtable.isA ? 1 : 0
	                        },
	                        typeid: typeid,
	                        selectedIds: $field.val(),
	                        success: function (id, text) {
	                            _browser.setValue(id, text);
	                        }
	                    };
					var deptbrowser = ['4', '57', '167', '168', '164', '194', '169', '170'];
					if (typeid == 1 || typeid == 17) {//人力单多选
	                    serviceName = "hrmbrowser";
	                    $.extend(params, { browserType: typeid });
	                } else if (typeid == 256 || typeid == 257) {//树形单多选
	                    serviceName = "treebrowser";
	                    $.extend(params, { browserId: typeid, browserName: vm.browser.identifie });
	                } else if (deptbrowser.indexOf(typeid) > -1) {//4:部门, 57:多部门, 167:分权单部门, 168:分权多部门, 164:分部, 194:多分部, 169:分权单分部, 170:分权多分部
	                    serviceName = "deptbrowser";
	                    $.extend(params, { browserId: typeid});
	                } else if (typeid == 22) {//报销费用类型
	                    serviceName = "fnabrowser";
	                    $.extend(params, { browserId: typeid});
	                } else {//自定义单多选
	                    serviceName = "commonbrowser";
						$.extend(params, { browserId: typeid, browserName: vm.browser.identifie, advancedSearch: vm.advancedSearch, relateParam: _browser.getFormData() || {} });
						vm.advancedSearch && $.extend(params, { timestamp: new Date().valueOf() });
					}
	                
	                mService.show(serviceName, params);
	            });
			}

			mUtil.getOSType() == 'PC' && $(window).off('resize.FBrowser').on('resize.FBrowser',function () {
				_browser.onResetView();
			});

			if(vm.field.needParseSqlValue){
			  //解析默认值,默认值sql
	            return Form.utils.parseDefaultSqlValue(vm.field.defaultValue, this.pageid, function(result){
	                vm.field.value = result;
	                //设置默认值
	                vm.field.value && that.setValue(vm.field.value, true);
	            });
			}else{
			    vm.field.value && that.setValue(vm.field.value, true);
			}
			
		};
		
		this.bindTrigger = function(triggers, isTrigger){
			var $container = this.$container,
				fieldid = vm.field.id;

			if (fieldid && mUtil.isObject(triggers) && triggers["field" + fieldid]) {
				var trigger = triggers["field" + fieldid];
				$field.bind("change", function () {
					Mobile_NS.readyToTrigger(trigger, $field, $container);
				});
				//默认值触发字段联动,主表新建或者是明细表添加数据时触发
				if (vm.field.value && ((vm.form.indexOf("detailtable") == -1 && !$p("billid")) || isTrigger)) {
					Mobile_NS.readyToTrigger(trigger, $field, $container);
				}
			}
		};
		
		this.getData = function(){
			return mUtil.parseJSON("fieldname_" + vm.field.name, $field.val());
		};
		
		this.getShowData = function(){
			var showData = mUtil.parseJSON(vm.field.name + "_showvalue", $showText.html());
			showData[vm.field.name] = $field.val();
			return showData;
		};
		
		this.reset = function(){
			_browser.setValue(vm.field.value, vm.field.showname);
			this.$el.find(".wev-field").removeClass("wev-required-remind");
		};
		
		this.checkRequired = function(){
			var required = vm.required && !$field.val();
			var fieldLabel = vm.field.label || mUtil.getLabel(695, "浏览按钮");

			this.$el.find(".wev-field").toggleClass("wev-required-remind", required);
			
			return required && fieldLabel;
		};
		
		this.setRequired = function (required) {
			vm.required = required;
			this.$el.find(".wev-field").toggleClass("wev-field-required", required);
			!required && this.$el.find(".wev-field").removeClass("wev-required-remind");
		};
		
		this.setValueByDB = function(value){
			this.dbValueHasSet = true;
			if(value || !vm.field.value) {
                vm.field.value = value;
                this.setValue(value, true);
            }
		};
		
		this.setValue = function(value, initialize, callback){
			mUtil.isFunction(initialize) && (callback = initialize);
			
			if(!value) return _browser.setValue("", "", callback);

			var typeid = vm.browser.typeid;
            var splitIndex = value.indexOf(',');
            if(splitIndex != -1 && vm.browser.isSingle){
                value = value.substring(0, splitIndex);
            }
			
			var actionUrl = mUtil.getActionUrl(this.type, { 
				action: "parseValues", 
				values: value, 
				typeid: typeid, 
				identifie: vm.browser.identifie 
			}, this.pageid);

			mUtil.getJSON(actionUrl, function(result){
				var showname = result.data;
				if(initialize){
					vm.field.showname = showname;
				}
				_browser.setValue(value, showname, initialize, callback);
			});
		};
		
		this.text = function(){
			return $showText.text();
		};
		
		_browser.setValue = function(value, showHtml, initialize, callback){
			mUtil.isFunction(initialize) && (callback = initialize);
			
			var isEmpty = !value;

			$showText.html(showHtml);
			if(vm.haslink){
                var formIns = mUtil.getInstance(vm.form),
                    fieldAuthorize = formIns ? formIns.viewModel.fieldAuthorize : {};
                var modeid = vm.browser.modeid;
                var empowStr  = formIns ? formIns.viewModel.empowStr : "";
                if(vm.browser.typeid == 256 || vm.browser.typeid == 257){
					if (vm.browser.modeid) {
						var valueArray = value.split(","), modeid = "";
						Object.getOwnPropertyNames(vm.browser.modeid).forEach(function(key) {
							for(var i = 0; i < valueArray.length; i++){
								var nodeid = valueArray[i].substring(0, valueArray[i].indexOf("_"));
								if(key == nodeid){
									modeid += key + "_" + vm.browser.modeid[key] + ",";
								}
							}
						});
						modeid = modeid.length > 0 ? modeid.substring(0, modeid.length - 1) : "-1";
					}
				}
			    $showText.attr({
                    'data-authorize': fieldAuthorize[vm.field.id] || "",
                    'data-value': value,
                    'data-text': encodeURIComponent(showHtml),
                    'data-typeid': vm.browser.typeid,
                    'data-modeid': modeid,
					'data-typename': vm.browser.identifie,
					'data-empowStr' : empowStr
			    });
            }
			$hiddenText.html(showHtml);
			$el.find(".wev-field-tip").toggle(isEmpty);
			$el.find(".wev-clear-btn").toggle(!isEmpty);
			
			setTimeout(function(){
			    _browser.onResetView();
			},100);
			
			$field.val(value);
			//非初始化的时候赋值才触发change,否则可能导致编辑数据时数据被篡改
			!initialize && $field.triggerHandler("change");
			
			(this.dbValueHasSet || initialize) && mUtil.trigger('dataload', this.pageid, this.id);
			callback && callback.call(this);
		};
		
		_browser.onResetView = function(){
		    var clientWidth = $showText[0].clientWidth,
            scrollWidth = $hiddenText[0].scrollWidth;
            
            if(!vm.readonly){
                clientWidth = clientWidth - 64;
            }
            
            expand = scrollWidth > clientWidth;
            !expand && $a.removeClass("showall");
			$a.parent().toggleClass("wev-expend", expand);
			$el.find(".wev-showall-btn").toggleClass("transform180",$a.hasClass("showall"));
		};
		
		this.onResetView = function(){
            _browser.onResetView();
        };
		
		_browser.getFormMecIDList = function(formid){
			return $("[data-form='" + formid + "']", this.$container).map(function(i, el) {
				return el.id && el.id.replace("NMEC_", "");
			});
	    };
	    
	    _browser.getFormData = function(){
	    	var formid = vm.form, detailformid, formData = {}, getFormFieldData = function(formMecId, detailtable){
	    		var instance = mUtil.getInstance(formMecId),
					resultData = instance.getData();
				var type = instance.type;
				if (type == "FTextarea" || type == "FPhoto" || type == "FSound"){
					return;
				}
				if(!mUtil.isObject(resultData)) return;
	
				for (var key in resultData) {
					var fieldvalue = resultData[key], 
						_key = key.toLowerCase();
					if (_key.indexOf("fieldname_") != -1) {
						if(detailtable){
							_key = _key.replace("fieldname_", "fieldname_"+detailtable+"_");
						}
						formData[_key] = fieldvalue;
					}
				}
	    	};
	    	
	    	if(vm.form.indexOf("detailtable") == 0){
	    		formid = vm.form.replace("detailtable", "");
	    		detailformid = vm.form;
	    	}
	    	_browser.getFormMecIDList(formid).forEach(function(formMecId){
	    		getFormFieldData(formMecId);
	    	});
	    	//明细表
	    	if(detailformid){
	    		var detailFormInstance = mUtil.getInstance(detailformid),
	    			detailtablename = detailFormInstance.viewModel.table.name.toLowerCase();
	    		
	    		_browser.getFormMecIDList(detailformid).forEach(function(formMecId){
	    			getFormFieldData(formMecId, detailtablename);
		    	});
	    	}
	    	return formData;
		};
		
		_browser.setValue = _browser.setValue.bind(this);
		_browser.getFormMecIDList = _browser.getFormMecIDList.bind(this);
    };
    

    return Component.init(FBrowser);
});