(function () { /** * 基本的编辑器父类,这是一个抽象类 * @class FR.BaseEditor * @extends FR.Widget * @abstract */ FR.BaseEditor = FR.extend(FR.Widget, { /** * 判断是否支持数据绑定 * @returns {Boolean} 支持数据绑定则返回true,否则返回false */ isSupportDatabinding: function () { return true; }, /** * 加载数据 */ loadData: function () { if (this.options.widgetName) { var value = this.options.form.formData[this.options.widgetName]; if (value) { this.setValue(value, false); } } }, /** * 保存数据绑定的数据 */ store: function () { if (this.options.Databinding) { var name = this.options.Databinding.Name; var key = this.options.Databinding.Key; if (name && key) { var value = this.getValue(); var state = this.options.form.formData.setValue(name, key, value); } } }, getValue: function () { }, setValue: function (value) { // wei : setValue的时候不提示是否输错,在stopCellEditing的时候再提示。 if (!this.isValidate(value)) { return false; } if ((value || value === 0) && this.options.watermark) { this.clearWaterMark(); } if (arguments[1] != undefined) { this._dealValueWithEvents(value, arguments[1]); } else { this._dealValueWithEvents(value, false); } }, _dealValueWithEvents: function (value, shouldFireEvent) { }, dealWithDisplayValue: function (showValue) { }, getText: function () { return this.getValue(); }, setText: function (val) { this.setValue(val); }, clearWaterMark: function () { }, /** * 获取错误提示内容 * @returns {String} 返回错误提示内容 */ getErrorMsg: function () { return this.errorMsg; }, /** * 校验并且设置状态标志 * @param {String} cValue 被校验的值 */ checkValid: function (cValue) { if (this.isValidate(cValue)) { this.validateCss(); return true; } else { this.invalidateCss(); return false; } }, /** * 校验值是否符合控件的值规范 * 这个方法只做两件事:判断是否符合规范;如果不符合的话设置this.errorMsg * 不要在这个方法里设置控件的CSS样式 * @param cValue 将要给控件赋的值 * @returns {boolean} 符合控件的校验要求则返回true,否则返回false */ isValidate: function (cValue) { var allowBlank = this.options.allowBlank !== false; /* daniel: value为0时 value=false*/ var value = cValue != null && cValue != undefined ? cValue : this.getValue(); var regex = this.options.regex; /* daniel: 不要使用value ==""判断空 ""==0*/ // value为null也要加上 if (value == null || value === "" || FR.isEmptyArray(value)) { if (allowBlank) { return true; } else if (FR.equals("illegalvalue", value)) { this.errorMsg = this.options.errorMsg || FR.i18nText("FR-Engine-Not_In_List"); return false; } else { this.errorMsg = this.options.errorMsg || FR.i18nText("FR-Base_NOT_NULL_Des"); return false; } } if (regex) { for (var i = 0, len = FR.BaseEditor.PluginRegex.length; i < len; i++) { var obj = FR.BaseEditor.PluginRegex[i]; if (obj.text === regex) { if (obj.regex(value)) { return true; } else { this.errorMsg = FR.i18nText("FR-Base_Error_Input_Value"); return false; } } } if (typeof regex == 'string') {/* String的时候,构造一个RegExp出来*/ try { regex = new RegExp(regex); } catch (err) { this.errorMsg = "invalid Regular expressions"; return false; } } if (!regex.test(value)) { /* 正则表达式是判断长度的 换行符算两个字符*/ if (!(regex.source.indexOf(".{") > -1 && regex.test(value.replace(/\n/g, "aa")))) { this.errorMsg = FR.i18nText("FR-Base_Error_Input_Value"); return false; } } } return true; }, /** * 初始化数据 * @protected */ initData: function () { if (this.options.data) { return; } if (this.options.widgetUrl) { this.options.data = FR.DataFactory .createJSONData(this.options.widgetUrl, this.options); } else if (this.options.items) { this.options.data = FR.DataFactory .createArrayData(this.options.items, this.options); } }, /** * 数据联动,获取联动数据 * @returns {Object} */ getDependenceObj: function () { var o = this.options; /* carl两手准备,参数界面上是没有扩展的,所以依据dependence来弄。*/ /* 报表主体上有扩展,就需要dependenceMap的映射来得知应该拿扩展后的哪个格子*/ var depO = {}; if (o.dependenceMap) { var self = this; $.each(o.dependenceMap, function (key, item) { if (self.options.form) { /* richer:同FR.FORM中一致,不区分参数名的大小写*/ var val = self.options.form .resolveVariable(item); if (val != "FR.primitive" && val != null) { depO[key.toUpperCase()] = val; } } else if (self.options.write) { /* richer:填报状态的联动*/ item = item.startWith("$") ? item.substring(1) : item; var checkValue; if (contentPane.curLGP.write) { var depWidget = contentPane.curLGP.write.getWidgetByCell(item) || contentPane.curLGP.write.getWidgetByName(item); if (depWidget) { checkValue = depWidget.getValue(); } } if (checkValue == undefined) { /* marro:如果参数是单元格,并且单元格没控件,就把单元格值传过去。*/ var col = FR.cellStr2ColumnRow(item); if (col) { var tdCell = contentPane.curLGP .getTDCell(col); if (tdCell) { checkValue = FR .getCellValue(tdCell); } } } if (checkValue != "FR.primitive" && checkValue != null && checkValue != undefined && checkValue != "") { depO[key.toUpperCase()] = checkValue; } } }); } else if (FR.isArray(o.dependence)) { for (var idx = 0; idx < o.dependence.length; idx++) { var dep = o.dependence[idx]; if (this.options.form) { /* richer:同FR.FORM中一致,不区分参数名的大小写*/ var val = this.options.form.resolveVariable(dep); if (val != "FR.primitive" && val != null) { depO[dep.toUpperCase()] = val; } } else if (this.options.write) { /* richer:填报状态的联动*/ dep = dep.startWith("$") ? dep.substring(1) : dep; var checkValue; if (contentPane.curLGP.write) { var depWidget = contentPane.curLGP.write .getWidgetByCell(dep) || contentPane.curLGP.write .getWidgetByName(dep); if (depWidget) { checkValue = depWidget.getValue(); } } if (!checkValue) { /* marro:如果参数是单元格,并且单元格没控件,就把单元格值传过去。*/ var col = FR.cellStr2ColumnRow(dep); if (col) { var tdCell = contentPane.curLGP .getTDCell(col); if (tdCell) { checkValue = FR.getCellValue(tdCell); } } } if (checkValue != "FR.primitive" && checkValue != null) { depO[dep.toUpperCase()] = checkValue; } } } } return depO; }, /** * 数据联动,生成参数依赖 * @returns {Object} 依赖的参数 */ createDependencePara4Data: function () { return { parameter: { dependence: this.getDependenceObj() } } }, reset: function () { this.setValue(""); } }); /** * 正则表达式控件插件接口 * @type {Array} 正则表达式类型数组 */ FR.BaseEditor.PluginRegex = []; /** * 带有EditComp的控件父类 * 包括FR.TriggerEditor FR.EditComp * @class FR.EditCompBaseEditor * @extends FR.BaseEditor */ FR.EditCompBaseEditor = FR.extend(FR.BaseEditor, { _defaultConfig: function () { return $.extend(FR.EditCompBaseEditor.superclass._defaultConfig.apply(), {}); }, /** * 设置水印 * @param text 水印内容 */ setWaterMark: function (text) { if (text == undefined) { text = this.options.watermark; } FR.$defaultImport('/com/fr/web/core/js/jquery.watermark.js', 'js'); this.editComp.watermark(text, this.options.isEditable); }, /** * 移除水印 */ removeWaterMark: function () { FR.$defaultImport('/com/fr/web/core/js/jquery.watermark.js', 'js'); this.editComp.watermark({ remove: true }); }, /** * 清空水印 */ clearWaterMark: function () { FR.$defaultImport('/com/fr/web/core/js/jquery.watermark.js', 'js'); this.editComp.watermark({ clear: true }); }, /** * 移除不符合规则的提示样式 */ validateCss: function () { this.editComp.removeClass('fr-invalid'); this.editComp.removeAttr('title'); }, /** * 显示不符合规则的提示样式 */ invalidateCss: function () { this.editComp.addClass('fr-invalid'); this.editComp.attr('title', this.getErrorMsg()); } }); /** * 这是一个抽象类,文本(域)/密码控件和数字控件的父类,不能直接使用。 * @class FR.EditComp * @extends FR.BaseEditor * @abstract * * @cfg {JSON} options 属性配置 * @cfg {String} options.cls 样式类 * @cfg {String} options.id 唯一标识符 * @cfg {Number} options.fontSize 字体大小 * @cfg {String} options.text 控件的显示值 * @cfg {String} options.value 控件的实际值 * @cfg {Boolean} [options.disabled=false] 控件是否不可用 * @cfg {Object} [options.watermark=false] 是否有水印,水印内容 * @cfg {String} options.style 其他自定义样式 * @cfg {Boolean} [options.allowBlank=true] 是否允许为空 * @cfg {String} options.regex 填写规则 * @cfg {Boolean} [options.autoVerify=false] 是否开启实时校验 * @cfg {String} options.errorMsg 不符合填写规则的时候的报错信息 */ FR.EditComp = FR.extend(FR.EditCompBaseEditor, /**@class FR.EditComp*/{ /** * 初始的属性配置 * @returns {*} * @private */ _defaultConfig: function () { return $.extend(FR.EditComp.superclass._defaultConfig.apply(), { cls: 'fr-texteditor', width: 120, height: 22, autoVerify: false }); }, /** * 初始化控件 * @private */ _init: function () { FR.EditComp.superclass._init.apply(this, arguments); var self = this; var o = this.options; this.editComp = this._createEditComp(); if (FR.Browser.isIE()) { this.editComp.on('paste', function () { var str = window.clipboardData.getData("Text"); str = str.replace(/\s|\n/g, " "); // replace space or newline //bug79391,复制的时候有原值的话不能直接覆盖 this.value = this.value ? this.value.append(str) : str; return false; }); } this.editComp.appendTo(this.element); if (o.fontSize) { this.editComp.css('font-size', o.fontSize); } this.validateCss(); this.editComp.attr("name", o.widgetName).addClass(o.cls); if (FR.Browser.isIE8()) { this.editComp.css('margin-top', 0); } if (o.text) { this.editComp.attr("value", o.text); } if (o.id) { this.editComp.attr('id', o.id); } if (o.disabled === true) { this.editComp.attr("disabled", "disabled"); } o.width = (o.width > -1) ? o.width : 120; o.height = (o.height > -1) ? o.height : 22; this.doResize(o); //若有style属性,则添加自定义的样式 FR.applyStyles(this.editComp, o.style); this.editComp.focus(function (e) {// 获得焦点的事件 self.editComp.addClass(o.cls + '-focus'); if (!self.options.write) { self.fireEvent(FR.Events.BEFOREEDIT); } }).blur(function (e) {// 失去焦点的事件 self.editComp.removeClass(o.cls + '-focus'); //Sean: options.write为true表示是填报 if (!self.options.write) { self.checkValid(); self.fireEvent(FR.Events.STOPEDIT); } }).keyup(function (e) { if (o.autoVerify) { self.checkValid(); } if (self.isValidateInput(e)) { self.fireEvent(FR.Events.AFTEREDIT, e); } }); this.errorMsg = this.options.errorMsg || '';// james:ERROR Message要记下来 if (o.value != null) { this.setValue(o.value, false); } }, _createEditComp: function () { return $("<input type='text'/>"); }, doResize: function (give) { FR.EditComp.superclass.doResize.call(this, give); this.element.css({ width: give.width, height: give.height }); this.editComp.css("width", $.support.boxModel ? give.width - 8 : give.width); this.editComp.css("height", $.support.boxModel ? give.height - 4 : give.height); // alex:去掉上下边框的高度 //Sean: 水印的生成随resize一起,因为水印字体的大小要适应控件的输入框大小 if (give.watermark) { this.removeWaterMark(); this.setWaterMark(); } }, setEnable: function (arg) { FR.EditComp.superclass.setEnable.apply(this, arguments); if (this.editComp) { // 如果是填报初始化控件时还没有editComp. if (arg === true) { this.editComp.removeAttr("disabled"); } else if (arg === false) { this.editComp.attr("disabled", "disabled") } } }, /** * 选取控件中的文本内容 * @param start 起始字符位置,默认为0 * @param end 结束字符位置,默认为文本长度 */ selectText: function (start, end) { if (!this.editComp.is(":visible")) { // 这里不能保证editComp肯定是可见的。如果不可见下面的方法就会报错 return; } // james:抄的Ext的 var cv = this.editComp.val(); if (cv && cv.length > 0) { start = start === undefined ? 0 : start; end = end === undefined ? cv.length : end; var d = this.editComp[0]; if (d.setSelectionRange) { d.setSelectionRange(start, end); } else if (d.createTextRange) { var range = d.createTextRange(); range.moveStart("character", start); range.moveEnd("character", end - cv.length); range.select(); } } } }); })(jQuery);