/*
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved.
*/
;
(function ($) {
/**
* 复选按钮组。一系列的复选按钮组成的控件,可以选择其中的零个或者多个。
*
* @example
* var editor = new FR.CheckBoxGroup({
* renderEl : 'body',
* width : 200,
* height : 100,
* columnsInRow : 1,
* mode : 'local',
* items : [
* {text : 'apple', value : '1'},
* {text : 'orange', value : '2'},
* {text : 'banana', value : '3'}
* ]
* });
*
* @class FR.CheckBoxGroup
* @extends FR.ToggleButtonGroup
*
* @cfg {JSON} options 配置属性
* @cfg {Boolean} [options.adaptive=false] 是否自使用宽度换行,如果为true,将自动计算每行放置多少个子控件
* @cfg {Number} [options.columnsInRow=0] 每行包含子控件的个数,0表示只有一行,全部子控件都在这一行里面
* @cfg {String} [options.delimiter=','] 返回值的分隔符,当控件返回多个值是,以指定的分隔符将每个值连接起来
* @cfg {String} [options.startSymbol=''] 返回值的起始补充符,默认为空
* @cfg {String} [options.endSymbol=''] 返回值的结束补充符,默认为空
*/
FR.CheckBoxGroup = FR.extend(FR.ToggleButtonGroup, {
lbox_class: 'fr-group-box',
sbox_class: 'fr-group-span',
_defaultConfig: function () {
return $.extend(FR.CheckBoxGroup.superclass._defaultConfig.apply(), {
delimiter: ',',
startSymbol: '',
endSymbol: '',
adaptive:false
});
},
_init: function () {
FR.CheckBoxGroup.superclass._init.apply(this, arguments);
},
changeAllState: function (state) {
if (this.buttonArray) {
for (var i = 0, len = this.buttonArray.length; i < len; i++) {
this.buttonArray[i].setSelected(state);
}
}
},
_setItems: function (items) {
var records = items || [];
var self = this;
if(self.buttonArray){
self.buttonArray.clear();
}
$.each(records, function (idx, it) {
if (self.options.adaptive) {
var outter = $("<span></span>")
.addClass(self.sbox_class)
.appendTo(self.$container);
} else {
var outter = $("<span/>").addClass(self.sbox_class);
var gridElement = {
column: idx % self.gridConfig.columns,
row: Math.floor(idx / self.gridConfig.columns),
el: outter
};
self.gridConfig.items.push(gridElement);
}
self.buttonArray[idx] = new FR.CheckBox({
renderEl: $("<div/>").appendTo(outter),
disabled: self.options.disabled,
text: it.getShowValue(),
fieldValue: it.getValue(),
sessionID: self.options.sessionID,
widgetName: self.options.widgetName,
fontSize: self.options.fontSize
});
self.buttonArray[idx].on(FR.Events.BEFORESTATECHANGE,
function () {
self.fireEvent(FR.Events.BEFORESTATECHANGE);
});
self.buttonArray[idx].on(FR.Events.STATECHANGE, function () {
self.fireEvent(FR.Events.STATECHANGE, idx, this
.selected());
if (self.options.chooseAll) {
var selectedItems = self.getSelectedItems();
var checkonCount = selectedItems.length ;
if (checkonCount === self.buttonArray.length) {
self.innerCheckBox.setSelectedWithoutEvent(true);
} else {
self.innerCheckBox.setSelectedWithoutEvent(false);
}
}
self.fireEvent(FR.Events.AFTEREDIT);
});
});
this._checkChooseAll();
},
initItemBox:function(idx, it,outter){
return new FR.CheckBox({
renderEl: $("<div/>").appendTo(outter),
disabled: this.options.disabled,
text: it.getShowValue(),
fieldValue: it.getValue(),
sessionID: this.options.sessionID,
widgetName: this.options.widgetName,
fontSize: this.options.fontSize
});
},
getSelectedItems:function(){
return $('.fr-checkbox-checkon', this.$container);
},
doResize: function (give) {
FR.ToggleButtonGroup.superclass.doResize.call(this, give);
this._checkTable();
},
_checkChooseAll: function () {
if (!this.options.adaptive) {
this.grid = new FR.GridLayout(this.gridConfig);
this.grid.element.doLayout();
this._checkTable();
}
if (this.options.chooseAll) {
var el;
var self = this;
if (this.options.adaptive) {
var parent = this.options.form ? this.element : this.element
.parent();
this.options.form
|| this.element.height(parseInt(parent.height()) - 19);//这边高度应该是整个全选div的高度加留白的高度
el = $("<span/>").addClass(this.sbox_class).appendTo(parent);
} else {
el = $("<span/>").addClass(this.sbox_class);
var count = this.buttonArray.length;
var gridElement = {
column: count % this.gridConfig.columns,
row: Math.floor(count / this.gridConfig.columns),
el: el
};
this.gridConfig.items.push(gridElement)
}
this.innerCheckBox = new FR.CheckBox({
renderEl: el,
disabled: self.options.disabled,
text: FR.i18nText('FR-Engine_Choose_All'),
fontSize: self.options.fontSize
});
this.innerCheckBox.on(FR.Events.STATECHANGE, function () {
self.changeAllState(self.innerCheckBox.isSelected());
});
}
if (!this.options.adaptive) {
this.grid = new FR.GridLayout(this.gridConfig);
this.grid.element.doLayout();
this._checkTable();
}
},
getValue: function () {
return this.getTV(false);
},
getText: function () {
return this.getTV(true);
},
getTV: function (getText) {
var self = this;
var valueArray = [];
var noSelectedObject = this.options.noSelected;
$.each(self.buttonArray, function (idx, it) {
if (noSelectedObject) {
if (it.selected()) {
var re = self.options.data.getRecord(idx);
valueArray[idx] = getText ? re.getShowValue() : re.getValue();
} else {
valueArray[idx] = noSelectedObject;
}
} else if (it.selected()) {
var rec = self.options.data.getRecord(idx);
valueArray[valueArray.length] = getText ? rec.getShowValue() : rec.getValue();
}
});
if (this.options.returnArray) {
return valueArray;
}
var resultStr = this.options.startSymbol
+ valueArray.join(this.options.delimiter)
+ this.options.endSymbol;
return resultStr;
},
_dealValueWithEvents: function (value) {
var self = this;
var argument = arguments[1];
var setValueFunc = function () {
if (self.isBoxBuild !== true) {
return;
}
clearInterval(sh);
var oldValue = self.getValue();
if (typeof value === "string") {
var value_array = value.split(self.options.delimiter);
} else {
var value_array = $.makeArray(value);
}
if (!self.options.returnArray) {
value = value + "";
value_array = value.substring(
self.options.startSymbol.length,
value.length - self.options.endSymbol.length)
.split(self.options.delimiter);
}
for (var i = 0; i < self.buttonArray.length; i++) {
self.buttonArray[i].setSelectedWithoutEvent(false);
}
$.each(value_array, function (idx, v) {
for (var i = 0, len = self.buttonArray.length; i < len; i++) {
if (self.buttonArray[i].options.fieldValue == v) {
self.buttonArray[i]
.setSelectedWithoutEvent(true);
break;
}
}
})
if (argument !== false) {
self.fireEvent(FR.Events.CHANGE, value, oldValue);
}
}
if (this.isBoxBuild === true) {
setValueFunc();
return;
}
var sh = setInterval(setValueFunc, 100);
}
});
$.shortcut("checkboxgroup", FR.CheckBoxGroup);
})(jQuery);