/*
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved.
*/
;(function($){
/**
* 下拉复选框控件
*
* @example
* var $root = $('<div>').css({position : 'absolute', top : 5, left : 40}).appendTo('body');
* var editor = new FR.CheckBoxEditor({
* renderEl : $root,
* directEdit : true,
* allowBlank : true,
* widgetUrl : null, //同下拉框
* returnArray : true, //返回值是否以数组形式
* delimiter : ',', //字符串返回值的分隔符
* startSymbol : '', //起始符
* endSymbol : '', //结束符
* fontSize : 14,
* width : 120,
* height : 24,
* maxCount : 10,
* items : [
* {text : "111", value : "aaa"},
* {text : "222", value : "bbb"},
* {text : "333", value : "ccc"},
* {text : "444", value : "ddd"}
* ]
* });
*
* @class FR.CheckBoxEditor
* @extends FR.ComboBoxEditor
*
* @cfg {JSON} options 属性配置
* @cfg {String} [options.delimiter=','] 结果分隔符
* @cfg {String} [options.startSymbol=''] 起始符
* @cfg {String} [options.endSymbol=''] 结束符
*/
FR.CheckBoxEditor = FR.extend(FR.ComboBoxEditor, /**@class FR.CheckBoxEditor*/{
/**
* @private
*/
_defaultConfig: function () {
return $.extend(FR.CheckBoxEditor.superclass._defaultConfig.apply(), {
delimiter: ',',
startSymbol: '',
endSymbol: '',
itemCheckOnClass:'.fr-checkbox-checkon',
itemCheckOffClass:'.fr-checkbox-checkoff'
});
},
/**
* @private
*/
_init: function () {
FR.CheckBoxEditor.superclass._init.apply(this, arguments);
this.$view.addClass('fr-checkbox-list');
this._initCheckBoxContainer();
this.options.delimiter = this.options.delimiter.replace(/\\r/g, "\n");
},
/**
* 初始化子项元素集合
* @private
*/
_initCheckBoxContainer: function () {
if (!this.ck_el_array) {
this.ck_el_array = [];
}
},
/**
* 设置下拉框的内容
* @param {Array} items 内容集合
* @private
*/
_setItems: function (items) {
var records = items || [];
var sH = this.options.sonHeight;
var count = this.options.maxCount || 10;
var th = records.length > count ? (sH + 2) * count : (sH + 2) * records.length;
this.$view.height(th + sH);
this.tH = th + sH;
this.modifyPosition();
var self = this;
this.initControlPane();
this.innerCheckBox = self._createInnerCheckBox();
this.innerCheckBox.on(FR.Events.CLICK, function () {
self.editComp.val("");
if (this.selected()) {
self.doSelectAll();
} else {
self.deSelectAll();
}
self.editComp.focus();
});
this.$view.append(this.$controlPane);
this.ck_el_array = [];
this.addData2View(records);
},
initControlPane : function () {
this.$controlPane = $("<div style='padding-right:20px'>").addClass('fr-checkbox-control');
},
_createInnerCheckBox : function(){
var self = this;
return new FR.CheckBox({
renderEl: $("<div/>").appendTo(self.$controlPane),
text: FR.i18nText("FR-Engine_Choose_All") + "/" + FR.i18nText("FR-Engine_Deselect_All")
});
},
/**
* 将值添加到DOM中
* @param {Array} data 将值添加到dom中
*/
addData2View: function (data) {
var self = this;
var start = this.ck_el_array.length;
for (var i = start, len = start + data.length; i < len; i++) {
var it = data[i - start];
var container = $('<div/>').height(this.options.sonHeight).attr('title', it.getShowValue()).addClass('fr-combo-list-item').appendTo(this.$view);
var checkBox = this._createItemCheckBox(container,it);
if (this.inAllSelectModel === true || $.inArray(it.getShowValue(), self.text) !== -1) {
checkBox.setSelectedWithoutEvent(true);
}
this.ck_el_array[i] = checkBox;
}
if (!this.options.isInited) {
var initArray;
if (typeof this.options.value == 'string') {
initArray = this.options.value.split(this.options.delimiter);
} else if (FR.isArray(this.options.value)) {
initArray = this.options.value;
}
if (!FR.isEmpty(initArray) && !FR.isEmptyArray(initArray)) {
$.each(this.ck_el_array, function (idx, item) {
//bug81322 实际值是1,array后台传过来是string,split之后是"1",这边统一转成字符串比较。
var valuestr = item.options.value + '';
var textstr = item.options.text + '';
if (initArray.indexOf(valuestr) != -1 || initArray.indexOf(textstr) != -1) {
item.changeBoxState(true);
} else if (item.isSelected()) {
item.changeBoxState(false);
}
});
}
this.options.isInited = true;
}
var selectedItems = $(this.options.itemCheckOnClass, this.$view);
if (selectedItems.length == this.ck_el_array.length) {
this.innerCheckBox.selected(true);
}
this.$view.__loadingMoreData__(false);
},
/**
* 生成子项CheckBox
* @param {jQuery} container 容器DOM
* @param {JSON} data 数据对象
* @returns {FR.CheckBox} 复选框控件对象
* @private
*/
_createItemCheckBox: function(container,data){
var self = this;
var checkbox = new FR.CheckBox({
renderEl: $("<div/>").appendTo(container),
text: data.getShowValue(),
value: data.getValue(),
listeners : [{eventName : FR.Events.STATECHANGE, action : function(){
self.editComp.val("");
self.fireEvent(FR.Events.CLICK);
if (!this.isSelected()) {
self.innerCheckBox.setSelected(false);
//有子checkbox被勾掉, 那就不是全选了
if(self.inAllSelectModel){
self.inAllSelectModel = false;
}
}
else {
var selectedItems = $(this.options.itemCheckOnClass, self.$view);
if (selectedItems.length == self.ck_el_array.length) {
self.innerCheckBox.setSelected(true);
}
}
self._refreshComponentValue(this);
self.editComp.focus();
}}]
});
return checkbox;
},
/**
* @private
*/
_doBeforeSearch: function(){
this.searchText = this.editComp.val();
},
/**
* 键盘按键选定一个item后的事件
* @private
*/
_onEnterPressed: function () {
var idx = this._getSelectedIndex();
var focusedCheckBox = this.ck_el_array[idx];
if(focusedCheckBox){
focusedCheckBox.setSelected(!focusedCheckBox.isSelected());
}
this.collapse();
},
/**
* 刷新checkbox
* @param {FR.CheckBox} checkBox checkbox控件对象
* @private
*/
_refreshComponentValue: function (checkBox) {
if(!this.text){
this.text = [];
}
if (checkBox.isSelected()) {
this.text.push(checkBox.getText());
} else {
this.text.remove(checkBox.getText());
}
this._setCompText(this.text);
this.fireEvent(FR.Events.AFTEREDIT);
},
/**
* 调整下拉表生成的位置
*/
modifyPosition: function () {
this.options.offset = {'top': this.element.offset().top, 'left': this.element.offset().left};
this.tW = this.$view.width();
FR.CheckBoxEditor.superclass.modifyPosition.apply(this, arguments);
},
/**
* 添加数值,性能优化
* @returns {*}
*/
data2Add: function () {
if (this.inAllSelectModel === true) {
var data = [];
var records = this.options.data.getRecords();
var loadedDataCount = this.ck_el_array.length;
for (var i = 0, len = records.length; i < this.options.limitData; i++) {
if(i + loadedDataCount >= len){
break;
}
data[i] = records[i + loadedDataCount];
}
return data;
} else {
return this.options.data.appendData();
}
},
/**
* 全选操作
*/
doSelectAll: function () {
var arr = [];
var self = this;
if(this.isFiltering()){
$.each(this.ck_el_array, function (idx, it) {
it.setSelectedWithoutEvent(true);
arr.push(it.getText());
});
}else{
if (!this.allRecords) {
this.inAllSelectModel = true;
var para = this.createDependencePara4Data();
para.parameter.startIndex = 0;
para.parameter.limitIndex = 0;
this.options.data.resetStatus(para);
this.allRecords = this.options.data.executeData();
this.options.data.records = this.allRecords;
}
$.each(self.allRecords, function (idx, record) {
arr.push(record.getShowValue());
});
$.each(this.ck_el_array, function (idx, it) {
it.setSelectedWithoutEvent(true);
});
}
this.text = arr;
this._setCompText(arr);
self.fireEvent(FR.Events.AFTEREDIT);
},
/**
* 反选操作
*/
deSelectAll: function () {
this.text = [];
var self = this;
$.each(this.ck_el_array, function (idx, it) {
it.setSelectedWithoutEvent(false);
});
this.inAllSelectModel = false;
this._setCompText(this.text);
self.fireEvent(FR.Events.AFTEREDIT);
},
/**
* 赋值函数
* @param {String} value 所赋值
* @private
*/
_dealValueWithEvents: function (value) {
var self = this;
var oldValue = this.getValue();
if (value == "") {
this._setCompText([]);
return;
}
var value_array;
if (typeof value === "string") {
if (!this.options.returnArray) {
if (value.startWith(this.options.startSymbol)) {
value = value.substring(this.options.startSymbol.length);
}
if (value.endWith(this.options.endSymbol)) {
value = value.substring(0, value.length - this.options.endSymbol.length);
}
}
value_array = value.split(this.options.delimiter);
} else {
value_array = $.makeArray(value);
}
var records = this.options.data.getRecords();
var inList = false;
if (records.length > 0) {
$.each(value_array, function (idx, v) {
for (var i = 0, len = records.length; i < len; i++) {
if (records[i].getValue() == v) {
value_array[idx] = records[i].getShowValue();
inList = true;
break;
}
}
})
}
if (!FR.equals(this.text, value_array)) {
this.options.need2BuildList = true;
}
this.text = value_array;
this._setCompText(value_array);
if (arguments[1] !== false) {
this.fireEvent(FR.Events.AFTEREDIT, value, oldValue);
}
},
isValueInList: function() {
return true;
},
/**
* 取值函数
* @returns {*} 返回数组或者字符串
*/
getValue: function () {
var self = this;
var text_array = this._getCompText();
if(!this.options.data){
return;
}
var records = this.options.data.getLoadedRecords();
var showValueMap={};
var allValueMap={};
for (var i = 0, len = records.length; i < len; i++) {
showValueMap[records[i].getShowValue()]=records[i].getValue();
}
var dataSource = this.options.data.options.dataSource;
$.each(text_array, function (idx, text) {
var res = null;
if(!self.isEmptyMap(allValueMap)){
res = allValueMap[text];
}else{
res = showValueMap[text];
}
if (res == null && self.isEmptyMap(allValueMap) && dataSource._findAllValue) {
var resss = dataSource._findAllValue();
if(!FR.isEmpty(resss)){
for (var i = 0, len = resss.length; i < len; i++) {
allValueMap[resss[i].text]=resss[i].value;
}
res = allValueMap[text];
}
}
if (res == null && dataSource._findShowValue) {
res = dataSource._findShowValue(text_array[idx], false);
}
if (FR.isEmpty(res)) {
if (self.options.customData) {
text_array[idx] = text;
}
} else {
text_array[idx] = res;
}
});
if (this.options.returnArray) {
return text_array;
}
var resultStr = this.options.startSymbol + text_array.join(this.options.delimiter) + this.options.endSymbol;
return resultStr;
},
isEmptyMap:function(o){
for(var item in o){
if(item){
return false;
}
}
return true;
},
/**
* 获取显示值
* @returns {*} 返回数组或者字符串
*/
getText: function() {
var text_array = this._getCompText();
return this.options.returnArray ? text_array
: this.options.startSymbol + text_array.join(this.options.delimiter) + this.options.endSymbol;
},
/**
* 赋值编辑框内的文本内容
* @param {Array} text 文本内容
* @private
*/
_setCompText: function(text){
this.editComp.val(text.join(this.options.delimiter));
},
/**
* 获取编辑框内的文本内容
* @returns {Array} 返回数组格式的结果
* @private
*/
_getCompText: function() {
return this.editComp.val().split(this.options.delimiter);
},
rebuild: function(items){
this.reset();
FR.CheckBoxEditor.superclass.rebuild.apply(this, arguments);
},
/**
* 重置控件
*/
reset: function () {
this.ck_el_array = [];
this.text = null;
this.setValue('');
this.shouldReBuildList();
this.allRecords = null;
}
});
$.shortcut("combocheckbox", FR.CheckBoxEditor);
})(jQuery);